NMF/0000755000176200001440000000000014661662462010707 5ustar liggesusersNMF/.Rinstignore0000644000176200001440000000002714333176413013202 0ustar liggesusersvignettes/cleveref.sty NMF/MD50000644000176200001440000002562314661662462011227 0ustar liggesusersd322e6049bd10355b0d96a871cbe5234 *DESCRIPTION ea3c50bbac49c16471651fc2e11e6611 *NAMESPACE b02d69ebe418c9ce62a38e8f7536c395 *NEWS b20e71f0c5f3f3a4e6fc1cfe6a2c91fa *R/Bioc-layer.R faa4fa1fa2ebdd0a0f0926657f4b669a *R/NMF-class.R cb92fbe2ad8ed07d3b6988790361cf89 *R/NMFOffset-class.R 56c06d6a59b72229d6fed8139b5917e1 *R/NMFSeed-class.R 36e24a9ffb5579333275679be5c2f379 *R/NMFSet-class.R 0b026fe9389466c7a387be01aac7372d *R/NMFStrategy-class.R b2710b639ac2f35ae198dbd8d355ad85 *R/NMFStrategyFunction-class.R 0cd21650efeda64af838976dc308efaa *R/NMFStrategyIterative-class.R 1422a9ee1b421e7f017c095ce01a7dc8 *R/NMFfit-class.R d4a9ccb2a64df0fcc003732b22087b29 *R/NMFns-class.R 454395374f9d4ddd59ec15bc8b87a5aa *R/NMFplots.R 06ce7f9fb62284b85f8faea26cd9bc08 *R/NMFstd-class.R 614a1964d186c571fb4738d5a3209be1 *R/aheatmap.R 2215efb3fafbbae155830aed6b0b3ae1 *R/algorithmic.R a32198001f1261b466ef18d434d9e91d *R/algorithms-base.R 015a5cef7738322d66ae1f280225f9e6 *R/algorithms-lnmf.R 6600c764faf7481013e0d6481fc25151 *R/algorithms-lsnmf.R ff9c9ac7006e8ef914ddb1d883316cbb *R/algorithms-pe-nmf.R c7345e2125689ff69487338672fead40 *R/algorithms-siNMF.R c56788dd91ab749e374a031566915509 *R/algorithms-snmf.R eca172be180d1e51dec38a7aaab54bee *R/atracks.R 317dd9cf0773e7221161a0d01dc70384 *R/colorcode.R 5a05ccb96bc2571128469c481725c207 *R/data.R d5c1883b5350a8285e19c2772ceb50d8 *R/extractFeatures.R 8c3302dcde34a1119b0d895938be87dc *R/fixed-terms.R 1f90bca8a7b53737476d0956b55502ab *R/grid.R 5cf50ed45523796cab2a7a9533fd6981 *R/heatmaps.R 42922f37ef295baaa4b7fa79c08c8197 *R/nmf-package.R 82c70f30bec2c07cf1ab4ae6b06e05af *R/nmf.R cf458865933fdc20ae922ec6a7951cf3 *R/nmfModel.R bcdc289d001c19141c0b1e9f5dab8420 *R/options.R 54953d67a8db5505c56279ef6d18bfb6 *R/parallel.R acc6d9b03f2840344a8bca2499023d7b *R/registry-algorithms.R d75a19751507a5792dfd2bab38692474 *R/registry-seed.R 2544245de442422a9c843180d40600a6 *R/registry.R c28c1144175993becd60f5a16156a3e2 *R/rmatrix.R 8a9cda98a8b4ed40738690fd6793af49 *R/rnmf.R 373909c677f0e1db2301f30638145a13 *R/run.R dd767a7d1fde7adfe30b3fee7cf86f5b *R/seed-base.R 1fcf1d8cb6162329731c7dd6d02c8a97 *R/seed-ica.R bcfb74089e84793cd6f41bd374bfd6fa *R/seed-nndsvd.R 71bf9f5ea7e161d5b3604040e37785ad *R/setNMFClass.R 5017945c10bf9b95560568b58c90559a *R/simulation.R 610b78f4f8f21a5a85d97967e4577bc8 *R/tests.R fce304c13565e5b26f0abf34bde1e761 *R/transforms.R 0d7e423aeafeb4265c4bec5540fe6927 *R/utils.R 77bc2b9255b6a8b6044e67e08ec91284 *R/versions.R 920c4ad193eb48edcadb3a67fc99e8db *R/vignetteFunctions.R 225fad30710e0f00d2ab7f37db293ab3 *README.md 551e2ca0a05eff9062c105483449fac4 *TODO 0aa3ea99a8fc91ef4ee5937a6b7cfb76 *build/vignette.rds f8015e2bc710fb0bf869d2fdddf90e73 *data/esGolub.rda 7ee636d67aaf85d2b38c87f512559c1d *demo/00Index 5d230c7b9bd8450e8f3621f0fa2e8fe9 *demo/aheatmap.R 1772a84edd497138e1c2026608d99348 *demo/heatmaps.R 51502b8ceeab50a22383047790cc5ab6 *demo/nmf.R bf17951c06c5437770e8e780d61b23dd *inst/CITATION c4d05e519580e330b6c7693b18650773 *inst/REFERENCES.bib b4f576ad4747ac8e5c2040f7f801092b *inst/doc/NMF-vignette.R a45d2ff3ab24f7d538b720907d09500a *inst/doc/NMF-vignette.Rnw 044e04ec26ee3bed64fb5d99108246b5 *inst/doc/NMF-vignette.pdf be11f75bb179cd92c7875ad58140813f *inst/doc/consensus.pdf b3c02ed25d8acde6c0972f68804fc386 *inst/doc/heatmaps.R adfe35c9248a2d1b0ab0c2da6dcdeadb *inst/doc/heatmaps.Rnw 12116565f8822067a9a8a0a38256a208 *inst/doc/heatmaps.pdf 21a62ee5e50af50c0b22f88d167d068c *inst/scripts/grid.R 2952972c46324b0beb29d6892b7e2e40 *inst/scripts/report.Rmd 8516263e4f349e976433bf4f4a418b1b *man/Frobenius-nmf.Rd 0b24673e2619fd7c3c622f9e7f92666b *man/KL-nmf.Rd e994bb5f22076c0034607b157e8d6b2e *man/NMF-class.Rd 3afb15f1474a46e4086d736a3c871caf *man/NMF-defunct.Rd dc30d7f32eb6954c2e9aa946f8b9df26 *man/NMF-deprecated.Rd c067d1fa1270349d839716420eedd3c5 *man/NMF-package.Rd 06d347a23a138dccfd978daa81ea0e1b *man/NMFList-class.Rd 201bfce1ddf5c18da7ac1bfe67ffb94f *man/NMFOffset-class.Rd 425940f01b128ed86c081405ae146ab0 *man/NMFSeed-class.Rd 895c97e9785c890a0181e953407ad117 *man/NMFStrategy-class.Rd 78a5599bceeaad4bfce2d04ce03c8a21 *man/NMFStrategy.Rd 5c94b9595c875433cb19171da1a62758 *man/NMFStrategyFunction-class.Rd a8510138b04563c2338ca55b1f6170c3 *man/NMFStrategyIterative-class.Rd b6ac2a1255cdaf9eaa4aa881784adee2 *man/NMFfit-class.Rd b45d28a519f4470a137736e70c7afc53 *man/NMFfitX-class.Rd d9a31d45444d62f906d662fc8b265426 *man/NMFfitX.Rd 28ea171d3e0fa853cabb91d2239555fc *man/NMFfitX1-class.Rd 2ba49b04dcaf97140fd89a8bd99b7737 *man/NMFfitXn-class.Rd f874ba9928c02022df7d9c8a2ac5bd4d *man/NMFns-class.Rd 5cbcc1d2fe52babe89342f25e0443f52 *man/NMFstd-class.Rd 78f09d6304dbbaaa447e57eee894daba *man/RNG.Rd 8b66c7ab49c34b0e5df0c652d45d437f *man/SNMF-nmf.Rd 42afa8e2c6f5d7ac5c045174a05bf8d5 *man/Strategy-class.Rd 28877eb83332222d0a67473a16148fbc *man/advanced.Rd 5814fd09c03253630166c202f0f938d0 *man/aggregate.measure.Rd 4fb111a0b55a5731ff84338e85c6cd33 *man/aheatmap.Rd 762c9a6fd51a723065df7becaa801083 *man/algorithm-commaNMFList-method.Rd 154a6705361e6ca6c244d4c921620a01 *man/algorithmic.Rd 9c3697730dd0a7aea87f13af6f726812 *man/assess.Rd 20413d9a4e878340f471a26415386685 *man/atrack.Rd a4855c2e0d6ece887e5e6b7fb27d640c *man/basis-coef-methods.Rd 435ac6f77719a0d9a5a18994c40989c1 *man/basiscor.Rd 1810d6750bc88981b602808d9f673c4a *man/bioc.Rd 182672f1ed5b39098c5127c0d1b96a8f *man/c-commaNMF-method.Rd 84c5ff2ee4546200a404c1968c7e4bd6 *man/canFit.Rd 4a680134ba34c9d60f7cf8448de0175c *man/ccBreaks.Rd 04aa500814501e01f971a9a9e649f7d6 *man/ccPalette.Rd 30b38d0eb549f60d498fea802752f9e8 *man/ccRamp.Rd 6a1bfee48dbafc35f5d583ac255c1e1c *man/ccSpec.Rd 3c3630400842a8205c1698dd2ece18b9 *man/checkErrors.Rd 94b8ec67220a6c9cb58bf5a9d07c21ce *man/cluster_mat.Rd 491d24b685f65bb7aaafb80c3bcf908e *man/connectivity.Rd 079f0bf31cd00add0215f852c2671793 *man/consensus-commaNMFfitX1-method.Rd 4191760c707e50acc9085b946e6972e4 *man/consensus-commaNMFfitXn-method.Rd 1adf8241b895a1da992f6fd39b394d60 *man/consensushc.Rd 00357312e2fb0196a0c380f4134d2f32 *man/cophcor.Rd 656b6a8bfe95f66aa37d808b14427b72 *man/cutdendro.Rd 18de62f7c36df3b79d39e649b5f126c4 *man/deviance.Rd 4d758173653d9a9e4fc6826f10288896 *man/dimnames.Rd d17124d62761eea2293f997a41b3b978 *man/dims.Rd 0eda8c23e3906c11c2894eee60b12e26 *man/dispersion.Rd edcc1d52a2ad50aad945d5d74e65121a *man/dot-fcnnls.Rd 77912793f2bae2c34737e530e881be74 *man/esGolub.Rd 7e7f3275630b6b7cb0783d7abfff2f3e *man/fcnnls.Rd 26389df3557196423682198ca30e4490 *man/fit.Rd c1baa89aba303ba8bd4ef407e184e55c *man/fitted.Rd 06890b1489d4114507541c63b32ec5ed *man/foreach.Rd 4bdd231e0439efdac037a437ebd0fdd9 *man/gfile.Rd fedca5f307d98d0e1f276cf0595e6673 *man/grid.Rd 268ec51b8cf89183b78a2df2c0b6d767 *man/heatmaps.Rd c103f3feaa7e2c4ddb4b5cb2de75356d *man/inplace.Rd d99fb97c10c6181d657415a5e129662f *man/isCRANcheck.Rd 0c0ec93fd25a65ff9df90d5eb3507027 *man/latex.Rd 42c4702adb4bd8432e51b7f0d2aab9be *man/lsNMF-nmf.Rd ad4bea9f6bf8da8c5b8af058d4e70581 *man/lverbose.Rd 83ccd902c78857036785b022791144a5 *man/match_atrack.Rd 17146cceec053543e3ad16d0570d092d *man/nmf-compare.Rd 3f4c11ef58359a39ae43b49a7c7e4c73 *man/nmf.Rd b5a35acf90da3f5d014c3686d234368d *man/nmf.equal.Rd 625896d5746034a531a4d1da377fcb5f *man/nmfAlgorithm.Rd f9cb9d24d68ee319e7593c1d2fee3223 *man/nmfApply.Rd 0ad0ee7ca0345c8bb2ab226df30a1860 *man/nmfCheck.Rd 4952f5420fac8de51c8810e64b845974 *man/nmfEstimateRank.Rd d95047f4bf61f4c7ccaa1e921ba4b522 *man/nmfFormals.Rd 35544ed71b508eead30c64deb154c324 *man/nmfModel.Rd d4898d6e3b1cd1b6b178a60c2d576ee5 *man/nmfObject.Rd 49f4c64242cc5d0c47b94a9c42807ca2 *man/nmfReport.Rd fce06c76bfd398abc1a348d67e7e8c58 *man/nmfSeed.Rd 7780fe2dae233c6ba52e340d797e2a11 *man/nmfWrapper.Rd 6d8709095f7fd4aab928d604ce1e83a0 *man/nmf_update_KL.Rd dd9f2187150114a41180f0e5389341f3 *man/nmf_update_euclidean.Rd c28f918be30a5da8db623facf38eea9f *man/nneg.Rd f481c5f6107309c849530b83206f18f2 *man/nsNMF-nmf.Rd ca58350f90998275f533e264d5ce5942 *man/objective-commaNMFfit-method.Rd 4082dd89c61fd2ae75e274171565642b *man/offset-commaNMFOffset-method.Rd c5c14f3e24e71b81dc726a027234fd77 *man/offset-commaNMFfit-method.Rd 1c7d3394a1b42e3f068ca65c777a4021 *man/offset-nmf.Rd 2cabc5f5cca514186f4a5f2690e34fae *man/options.Rd 6ceade6a531a0e234b6871dd0effb817 *man/parallel.Rd 1b26866d20f593b9a4d791975d0768f2 *man/parse_formula.Rd 2959063b2e6978de03a0bf0d3b314046 *man/plot-commaNMFfit-commamissing-method.Rd 6e450dcc8156f699b0e5d63c598a89d8 *man/predict.Rd ba50766cfcc6748189fcefb9e6f88638 *man/profplot.Rd d8d2498c4b415b41cde4cf9e8049f8a5 *man/purity.Rd 35694f86b6139a3ee2cd3f82a41ad824 *man/randomize.Rd eda7031ec18b67eecbabf5cfa04c054d *man/registry-algorithm.Rd cb7ba12690237f166574749bb707d3f7 *man/residuals.Rd c8aa1d388b52049207fc058e157af5b6 *man/revPalette.Rd 622964f68f0911dff7cf9eede6fac98e *man/rmatrix.Rd a60c1f6ce96fa64299df90f945404827 *man/rnmf.Rd 08b1b09c30f90240167a25a5dc1671ef *man/rss.Rd e589f075ac5a2404fe136375475ab67c *man/runtime-commaNMFList-method.Rd 67dd23b7d9dd5739289857be80513bbc *man/runtime.all-commaNMFfitXn-method.Rd b20c67b061270a8948c14f30c029d266 *man/scale.NMF.Rd 0e9aa7fe953cbc4d0b2cdfdd6a61fabb *man/scores.Rd cdc912746238c2f9c41e83f4701a4f37 *man/seed.Rd 0a372ae7c4ebd520f9a087253bf5f5cc *man/setNMFMethod.Rd d316289400db8ed5f1504aca95681759 *man/setNMFSeed.Rd 571ad68968801bbafe7f2d2e25a22550 *man/setup.Rd 7bb22e6720734f511e803a871fb26e39 *man/show-commaNMF-method.Rd 2d06782ea4c4ad91ac5694f33575e923 *man/show-commaNMFList-method.Rd 13c4118576e5e6767234d6b61f4d9159 *man/show-commaNMFOffset-method.Rd bb3a39862b068259cab8ea954454bcc2 *man/show-commaNMFSeed-method.Rd 84b6af7f192d8e0919bf6a7795645353 *man/show-commaNMFStrategyIterative-method.Rd 515b08c8a685e823723afeb4a1a313c8 *man/show-commaNMFfit-method.Rd f36b652373f4f16f2bb6828c2b5d585f *man/show-commaNMFfitX-method.Rd c1c89600aba522e34a6ba28190f2bd7c *man/show-commaNMFfitX1-method.Rd f14bfc191bb4d6d39684d9ee54a39736 *man/show-commaNMFfitXn-method.Rd becd00d7a3051215763271cd1eb8325e *man/show-commaNMFns-method.Rd 398be317ddaf1e59d8d8bd2bb17ccabb *man/silhouette.NMF.Rd 9e8cf1622e25fed14b84bfcd0521ed35 *man/smoothing.Rd e6a7d35fb160e28931b03173e82cde35 *man/sparseness.Rd 127c40883b9775f0c9a8500378c0efed *man/staticVar.Rd b60bd8e815ca75ea07f7bcec5e2b4d3e *man/stop-NMF.Rd ae4a92d9c449e96cf2f7578d778b4beb *man/subset-NMF.Rd b9fe38868ac0a2210bc1926c3fabd77e *man/syntheticNMF.Rd 4264ddc5ceb09fc3e2edf67a4ffea81e *man/t.NMF.Rd d0a67df32409d5fe6c871f24b2b71c7c *man/terms-internal.Rd b279c6ba4bf77ce4028e6e99ee3b6fb3 *man/terms.Rd 8af3bdb9baf9ace2bff7cf278528808e *man/txtProgressBar.Rd 608427df6c5d9db2129add0bef10d767 *man/types.Rd c1dd149f5e75b70b800565157584fe7a *man/utils.Rd 513c8eb69fc47e2c3f24b242643c37f8 *src/distance.cpp fd3b76f3d83b71d1a94e54f668daecc4 *src/divergence.cpp 3d943efd553a0f82a0a9388daa03a772 *src/euclidean.cpp 7c22b1b500cab25872924e218f1645f5 *src/registerDynamicSymbol.c 683d03b9ef367e9a336a14f646ba8dea *src/utils.cpp a45d2ff3ab24f7d538b720907d09500a *vignettes/NMF-vignette.Rnw e80ff821d37969bdb7ff73081b8f7c53 *vignettes/consensus.pdf adfe35c9248a2d1b0ab0c2da6dcdeadb *vignettes/heatmaps.Rnw d0b6a6b6a5d501ed47120a405f13c012 *vignettes/src/bmc.R NMF/R/0000755000176200001440000000000014560455543011106 5ustar liggesusersNMF/R/versions.R0000644000176200001440000001330414333176413013074 0ustar liggesusers# Tracking/Updating S4 class versions # # Author: Renaud Gaujoux ############################################################################### #' @include utils.R NULL objectUpdater <- local({ .REGISTRY <- list() function(x, version=NULL, fun=NULL, vfun=NULL, verbose=FALSE){ if( missing(x) ) return( .REGISTRY ) if( is.null(version) ){ cl <- class(x) UPDATER <- .REGISTRY[[cl]] vmsg <- 'Class' if( is.character(verbose) ){ vmsg <- paste(verbose, ':', sep='') verbose <- TRUE } if( verbose ) message("# ", vmsg, " '", cl, "' ... ", appendLF=FALSE) if( !isS4(x) ){ if( verbose) message("NO") return(x) } # create new object from old slots newObject <- if( verbose ){ message() updateObjectFromSlots(x, verbose=verbose>1) }else suppressWarnings( updateObjectFromSlots(x, verbose=verbose>1) ) if( is.null(UPDATER) ){ if( verbose) message("AUTO") return(newObject) } # find object version v <- sapply(UPDATER, function(f) f$vfun(x)) v <- which(v) if( !length(v) ){ if( verbose) message("SKIP [version unknown]") return(newObject) } if( length(v) > 1L ){ warning("Object matched multiple version of class '", cl , "' [", paste(names(UPDATER)[v], collapse=", "), "]") if( verbose) message("SKIP [multiple versions]") return(newObject) }else if( verbose) message("UPDATING [", appendLF=FALSE) for(n in names(UPDATER[v[1L]])){ f <- UPDATER[[n]] if( verbose ) message(n, ' -> ', appendLF=FALSE) newObject <- f$fun(x, newObject) } if( verbose ) message("*]") # return updated object return(newObject) } stopifnot( is.character(x) ) if( is.null(version) ){ if( !is.null(fun) || !is.null(vfun) ) stop("Argument `version` is required for defining updater functions for class `", x, "`") return(.REGISTRY[[x]]) } if( is.null(.REGISTRY[[x]]) ) .REGISTRY[[x]] <<- list() # check result is a function stopifnot(is.function(fun)) stopifnot(is.function(vfun)) if( !is.null(.REGISTRY[[x]][[version]]) ) stop("An update for class '", x, "' version ", version, " is already defined") .REGISTRY[[x]][[version]] <<- list(vfun=vfun, fun=fun) # put updaters in order .REGISTRY[[x]] <<- .REGISTRY[[x]][orderVersion(names(.REGISTRY[[x]]))] invisible(.REGISTRY[[x]]) } }) # Taken from BiocGenerics 2.16 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 } # Taken from BiocGenerics 2.16 updateObjectFromSlots <- function (object, objclass = class(object), ..., verbose = FALSE) { updateObject <- nmfObject if (is(object, "environment")) { if (verbose) message("returning original object of class 'environment'") return(object) } classSlots <- slotNames(objclass) if (is.null(classSlots)) { if (verbose) message("definition of '", objclass, "' has no slots; ", "returning original object") return(object) } errf <- function(...) { function(err) { if (verbose) message(..., ":\n ", conditionMessage(err), "\n trying next method...") NULL } } if (verbose) message("updateObjectFromSlots(object = '", class(object), "' class = '", objclass, "')") objectSlots <- getObjectSlots(object) nulls <- sapply(names(objectSlots), function(slt) is.null(slot(object, slt))) objectSlots[nulls] <- NULL joint <- intersect(names(objectSlots), classSlots) toUpdate <- joint[joint != ".Data"] objectSlots[toUpdate] <- lapply(objectSlots[toUpdate], updateObject, ..., verbose = verbose) toDrop <- which(!names(objectSlots) %in% classSlots) if (length(toDrop) > 0L) { warning("dropping slot(s) ", paste(names(objectSlots)[toDrop], collapse = ", "), " from object = '", class(object), "'") objectSlots <- objectSlots[-toDrop] } res <- NULL if (is.null(res)) { if (verbose) message("heuristic updateObjectFromSlots, method 1") res <- tryCatch({ do.call(new, c(objclass, objectSlots[joint])) }, error = errf("'new(\"", objclass, "\", ...)' from slots failed")) } if (is.null(res)) { if (verbose) message("heuristic updateObjectFromSlots, method 2") res <- tryCatch({ obj <- do.call(new, list(objclass)) for (slt in joint) slot(obj, slt) <- updateObject(objectSlots[[slt]], ..., verbose = verbose) obj }, error = errf("failed to add slots to 'new(\"", objclass, "\", ...)'")) } if (is.null(res)) stop("could not updateObject to class '", objclass, "'", "\nconsider defining an 'updateObject' method for class '", class(object), "'") res } #' Updating NMF Objects #' #' This function serves to update an objects created with previous versions of the #' NMF package, which would otherwise be incompatible with the current version, #' due to changes in their S4 class definition. #' #' This function makes use of heuristics to automatically update object slots, #' which have been borrowed from the BiocGenerics package, the function #' \code{updateObjectFromSlots} in particular. #' #' @param object an R object created by the NMF package, e.g., an object of class #' \code{\linkS4class{NMF}} or \code{\linkS4class{NMFfit}}. #' @param verbose logical to toggle verbose messages. #' #' @export #' nmfObject <- function(object, verbose=FALSE){ objectUpdater(object, verbose=verbose) } NMF/R/rnmf.R0000644000176200001440000003254614556664206012210 0ustar liggesusers# Generation of Random NMF Models # # Author: Renaud Gaujoux # Creation: 03 Jul 2012 ############################################################################### #' @include nmfModel.R NULL .rnmf_fixed <- oneoffVariable('none') #' Generates a random NMF model of the same class and rank as another NMF model. #' #' This is the workhorse method that is eventually called by all other methods. #' It generates an NMF model of the same class and rank as \code{x}, compatible with the #' dimensions specified in \code{target}, that can be a single or 2-length #' numeric vector, to specify a square or rectangular target matrix respectively. #' #' The second dimension can also be passed via argument \code{ncol}, so that #' calling \code{rnmf(x, 20, 10, ...)} is equivalent to \code{rnmf(x, c(20, 10), ...)}, #' but easier to write. #' #' The entries are uniformly drawn between \code{0} and \code{max} #' (optionally specified in \code{...}) that defaults to 1. #' #' By default the dimnames of \code{x} are set on the returned NMF model. #' This behaviour is disabled with argument \code{keep.names=FALSE}. #' See \code{\link{nmfModel}}. #' #' @param ncol single numeric value that specifies the number of columns of the #' coefficient matrix. Only used when \code{target} is a single numeric value. #' @param keep.names a logical that indicates if the dimension names of the #' original NMF object \code{x} should be conserved (\code{TRUE}) or discarded #' (\code{FALSE}). #' @param dist specification of the random distribution to use to draw the entries #' of the basis and coefficient matrices. #' It may be specified as: #' \itemize{ #' #' \item a \code{function} which must be a distribution function such as e.g. #' \code{\link{runif}} that is used to draw the entries of both the basis and #' coefficient matrices. It is passed in the \code{dist} argument of #' \code{\link{rmatrix}}. #' #' \item a \code{list} of arguments that are passed internally to \code{\link{rmatrix}}, #' via \code{do.call('rmatrix', dist)}. #' #' \item a \code{character} string that is partially matched to \sQuote{basis} or #' \sQuote{coef}, that specifies which matrix in should be drawn randomly, the #' other remaining as in \code{x} -- unchanged. #' #' \item a \code{list} with elements \sQuote{basis} and/or \sQuote{coef}, which #' specify the \code{dist} argument separately for the basis and coefficient #' matrix respectively. #' #' These elements may be either a distribution function, or a list of arguments that #' are passed internally to \code{\link{rmatrix}}, via #' \code{do.call('rmatrix', dist$basis)} #' or \code{do.call('rmatrix', dist$coef)}. #' } #' #' @inline #' @examples #' #' ## random NMF of same class and rank as another model #' #' x <- nmfModel(3, 10, 5) #' x #' rnmf(x, 20) # square #' rnmf(x, 20, 13) #' rnmf(x, c(20, 13)) #' #' # using another distribution #' rnmf(x, 20, dist=rnorm) #' #' # other than standard model #' y <- rnmf(3, 50, 10, model='NMFns') #' y #' \dontshow{ stopifnot( identical(dim(y), c(50L,10L,3L)) ) } #' \dontshow{ stopifnot( is(y, 'NMFns') ) } #' setMethod('rnmf', signature(x='NMF', target='numeric'), function(x, target, ncol=NULL, keep.names=TRUE, dist=runif){ # store original dimnames if( keep.names ) dn <- dimnames(x) # valid parameter 'target' if( length(target) != 1 && length(target) != 2 ) stop('NMF::rnmf - invalid target dimensions [length must be 1 or 2. Here length = ', length(target) ,']') if( any(is.na(target)) ) stop('NMF::rnmf - invalid target dimensions [NA values in element(s): ', paste(which(is.na(target)), collapse=' and '), ']') # shortcut for symetric case: provide only one dimension if( length(target) == 1L ){ ncol <- if( !is.null(ncol) ){ if( !is.numeric(ncol) || length(ncol) != 1 || is.na(ncol) ) stop("NMF::rnmf - invalid argument `ncol`: must be a single numeric value") ncol }else target target <- c(target, ncol) } # retrieve dimension of the target matrix n <- target[1]; m <- target[2]; # retrieve the factorization rank r <- nbasis(x) ## draw basis and coef matrices # interpret argument dist if( length(dist) == 0L ) dist <- runif if( is.character(dist) ){ dist <- match.arg(dist, c('basis', 'coef')) dist <- setNames(list(runif), dist) } if( is.function(dist) ){ dist <- list(basis = list(x=n, y=r, dist=dist) , coef = list(x=r, y=m, dist=dist)) }else if( is.list(dist) ){ if( !all(names(dist) %in% c('basis', 'coef')) ){ dist <- list(basis=c(list(x=n, y=r), dist) , coef=c(list(x=r, y=m), dist)) }else{ if( !is.null(dist$basis) ) dist$basis <- c(list(x=n, y=r), dist$basis) if( !is.null(dist$coef) ) dist$coef <- c(list(x=r, y=m), dist$coef) } } fixed <- .rnmf_fixed() #Vc# Initialize random matrix: W # NB: this will keep the values of fixed basis terms if( !is.null(dist$basis) && !('basis' %in% fixed) ){ basis(x) <- do.call('rmatrix', dist$basis); } #Vc# Initialize random matrix: H # NB: this will keep the values of fixed coef terms if( !is.null(dist$coef) && !('coef' %in% fixed) ){ coef(x) <- do.call('rmatrix', dist$coef); } # if one needs to keep the names (possibly or reducing/increasing) if( keep.names && !is.null(dn) ) dimnames(x) <- list(dn[[1]][1:n], dn[[2]][1:m], dn[[3]][1:r]) # return the modified object x } ) #' Generates a random NMF model compatible and consistent with a target matrix. #' #' The entries are uniformly drawn between \code{0} and \code{max(target)}. #' It is more or less a shortcut for: #' \samp{ rnmf(x, dim(target), max=max(target), ...)} #' #' It returns an NMF model of the same class as \code{x}. #' #' @param use.dimnames a logical that indicates whether the dimnames of the #' target matrix should be set on the returned NMF model. #' #' @inline #' #' @examples #' # random NMF compatible with a target matrix #' x <- nmfModel(3, 10, 5) #' y <- rmatrix(20, 13) #' rnmf(x, y) # rank of x #' rnmf(2, y) # rank 2 #' setMethod('rnmf', signature(x='ANY', target='matrix'), function(x, target, ..., dist=list(max=max(max(target, na.rm=TRUE), 1)), use.dimnames=TRUE){ # build a random NMF with the dimensions of the target matrix upper-bounded by the target's maximum entry. res <- rnmf(x, dim(target), ..., dist=dist) # compute the upper-bound of the random entries and enforce it if possible no.na <- abs(target[!is.na(target)]) if( length(no.na) > 0 ){ m <- max(no.na) basis(res) <- pmin(basis(res), m) coef(res) <- pmin(coef(res), m) } # set the dimnames from the target matrix if necessary if( use.dimnames ) dimnames(res) <- dimnames(target) # return result res } ) #' Shortcut for \code{rnmf(x, as.matrix(target))}. setMethod('rnmf', signature(x='ANY', target='data.frame'), function(x, target, ...){ rnmf(x, as.matrix(target), ...) } ) #' Generates a random NMF model of the same dimension as another NMF model. #' #' It is a shortcut for \code{rnmf(x, nrow(x), ncol(x), ...)}, which returns #' a random NMF model of the same class and dimensions as \code{x}. #' #' @examples #' ## random NMF from another model #' #' a <- nmfModel(3, 100, 20) #' b <- rnmf(a) #' \dontshow{ stopifnot( !nmf.equal(a,b) ) } #' setMethod('rnmf', signature(x='NMF', target='missing'), function(x, target, ...){ rnmf(x, c(nrow(x),ncol(x)), ...) } ) #' Generates a random NMF model of a given rank, with known basis and/or #' coefficient matrices. #' #' This methods allow to easily generate partially random NMF model, where one #' or both factors are known. #' Although the later case might seems strange, it makes sense for NMF models that #' have fit extra data, other than the basis and coefficient matrices, that #' are drawn by an \code{rnmf} method defined for their own class, which should #' internally call \code{rnmf,NMF,numeric} and let it draw the basis and #' coefficient matrices. #' (e.g. see \code{\linkS4class{NMFOffset}} and \code{\link{rnmf,NMFOffset,numeric-method}}). #' #' Depending on whether arguments \code{W} and/or \code{H} are missing, #' this method interprets \code{x} differently: #' \itemize{ #' #' \item \code{W} provided, \code{H} missing: \code{x} is taken as the number of #' columns that must be drawn to build a random coefficient matrix #' (i.e. the number of columns in the target matrix). #' #' \item \code{W} is missing, \code{H} is provided: \code{x} is taken as the number of #' rows that must be drawn to build a random basis matrix #' (i.e. the number of rows in the target matrix). #' #' \item both \code{W} and \code{H} are provided: \code{x} is taken as the target #' rank of the model to generate. #' \item Having both \code{W} and \code{H} missing produces an error, as the #' dimension of the model cannot be determined in this case. #' } #' #' The matrices \code{W} and \code{H} are reduced if necessary and possible #' to be consistent with this value of the rank, by the internal call to #' \code{\link{nmfModel}}. #' #' All arguments in \code{...} are passed to the function \code{\link{nmfModel}} #' which is used to build an initial NMF model, that is in turn passed to #' \code{rnmf,NMF,numeric} with \code{dist=list(coef=dist)} or #' \code{dist=list(basis=dist)} when suitable. #' The type of NMF model to generate can therefore be specified in argument #' \code{model} (see \code{\link{nmfModel}} for other possible arguments). #' #' The returned NMF model, has a basis matrix equal to \code{W} (if not missing) #' and a coefficient matrix equal to \code{H} (if not missing), or drawn #' according to the specification provided in argument \code{dist} #' (see method \code{rnmf,NMF,numeric} for details on the supported values for \code{dist}). #' #' @examples #' # random NMF model with known basis matrix #' x <- rnmf(5, W=matrix(1:18, 6)) # 6 x 5 model with rank=3 #' basis(x) # fixed #' coef(x) # random #' #' # random NMF model with known coefficient matrix #' x <- rnmf(5, H=matrix(1:18, 3)) # 5 x 6 model with rank=3 #' basis(x) # random #' coef(x) # fixed #' #' # random model other than standard NMF #' x <- rnmf(5, H=matrix(1:18, 3), model='NMFOffset') #' basis(x) # random #' coef(x) # fixed #' offset(x) # random #' setMethod('rnmf', signature(x='numeric', target='missing'), function(x, target, ..., W, H, dist=runif){ # get fixed matrices to restore on exit: # one must enforce honouring the fixed matrices to prevent the call to # rnmf from a sub-class method to change them. of <- .rnmf_fixed() on.exit( .rnmf_fixed(of) ) if( !missing(W) && missing(H) ){ # fixed basis matrix: x = n samples # one must not change the values H .rnmf_fixed('basis') x <- nmfModel(ncol(W), nrow(W), x, W=W, ...) dist <- list(coef=dist) }else if( missing(W) && !missing(H) ){ # fixed coef matrix: x = n features # one must not change the values H .rnmf_fixed('coef') x <- nmfModel(nrow(H), x, ncol(H), H=H, ...) dist <- list(basis=dist) }else if( !missing(W) && !missing(H) ){ # fixed basis and coef: x = rank # one must not change the values of W and H .rnmf_fixed(c('basis', 'coef')) x <- nmfModel(x, nrow(W), ncol(H), W=W, H=H, ...) }else stop("NMF::rnmf - Missing both arguments `W` and/or `H`: at least one of them must be specified.") rnmf(x, dist=dist) } ) #' Generates a random NMF model with known basis and coefficient matrices. #' #' This method is a shortcut for calling \code{rnmf,numeric,missing} with a #' suitable value for \code{x} (the rank), when both factors are known: #' \code{rnmf(min(ncol(W), nrow(H)), ..., W=W, H=H)}. #' #' Arguments \code{W} and \code{H} are required. #' Note that calling this method only makes sense for NMF models that contains #' data to fit other than the basis and coefficient matrices, #' e.g. \code{\linkS4class{NMFOffset}}. #' #' @examples #' #' # random model other than standard NMF #' x <- rnmf(W=matrix(1:18, 6), H=matrix(21:38, 3), model='NMFOffset') #' basis(x) # fixed #' coef(x) # fixed #' offset(x) # random #' setMethod('rnmf', signature(x='missing', target='missing'), function(x, target, ..., W, H){ rnmf(min(ncol(W), nrow(H)), ..., W=W, H=H) } ) #' Generates a random standard NMF model of given dimensions. #' #' This is a shortcut for \code{rnmf(nmfModel(x, target, ncol, ...)), dist=dist)}. #' It generates a standard NMF model compatible with the dimensions passed in #' \code{target}, that can be a single or 2-length numeric vector, to specify #' a square or rectangular target matrix respectively. #' See \code{\link{nmfModel}}. #' #' @inheritParams nmfModel,numeric,numeric-method #' #' @examples #' #' ## random standard NMF of given dimensions #' #' # generate a random NMF model with rank 3 that fits a 100x20 matrix #' rnmf(3, 100, 20) #' \dontshow{ stopifnot( identical(dim(rnmf(3, 100, 20)), c(100L,20L,3L)) ) } #' # generate a random NMF model with rank 3 that fits a 100x100 matrix #' rnmf(3, 100) #' \dontshow{ stopifnot( identical(dim(rnmf(3, 100)), c(100L,100L,3L)) ) } #' setMethod('rnmf', signature(x='numeric', target='numeric'), function(x, target, ncol=NULL, ..., dist=runif){ rnmf(nmfModel(x, target, ncol, ...), dist=dist) } ) #' Generate a random formula-based NMF model, using the method #' \code{\link{nmfModel,formula,ANY-method}}. setMethod('rnmf', signature(x='formula', target='ANY'), function(x, target, ..., dist=runif){ # missing target is NULL if( missing(target) ) target <- NULL rnmf(nmfModel(x, target, ...), dist=dist) } ) NMF/R/NMFStrategyFunction-class.R0000644000176200001440000000465014333176413016204 0ustar liggesusers#' @include NMFStrategy-class.R NULL #' Interface for Single Function NMF Strategies #' #' This class implements the virtual interface \code{\link{NMFStrategy}} for #' NMF algorithms that are implemented by a single workhorse R function. #' #' @slot algorithm a function that implements an NMF algorithm. #' It must have signature \code{(y='matrix', x='NMFfit')}, where \code{y} is the #' target matrix to approximate and \code{x} is the NMF model assumed to be #' seeded with an appropriate initial value -- as it is done internally by #' function \code{\link{nmf}}. #' #' Note that argument names currently do not matter, but it is recommended to #' name them as specified above. #' setClass('NMFStrategyFunction' , representation( algorithm = 'function' # the function that implements the algorithm ) , contains = 'NMFStrategy' ) #' Runs the NMF algorithms implemented by the single R function -- and stored in slot \code{'algorithm'} #' of \code{object}, on the data object \code{y}, using \code{x} as starting point. #' It is equivalent to calling \code{object@@algorithm(y, x, ...)}. #' #' This method is usually not called directly, but only via the function \code{\link{nmf}}, which #' takes care of many other details such as seeding the computation, handling RNG settings, or setting up #' parallelisation. #' #' @rdname NMFStrategy setMethod('run', signature(object='NMFStrategyFunction', y='matrix', x='NMFfit'), function(object, y, x, ...){ if( !is.function(fun <- algorithm(object)) ) stop("NMFStrategyFunction '", name(object), "': algorithm is not defined.") # run the function that defines the algorithm and return the result fun(y, x, ...) } ) #' @export nmfFormals.NMFStrategyFunction <- function(x, ...){ args <- formals(x@algorithm) args[-(1:2)] } #' Returns the single R function that implements the NMF algorithm -- as stored in #' slot \code{algorithm}. setMethod('algorithm', signature(object='NMFStrategyFunction'), function(object){ slot(object, 'algorithm') } ) #setReplaceMethod('algorithm', signature(object='NMFStrategyFunction', value='character'), # function(object, value){ # slot(object, 'algorithm') <- value # object # } #) #' Sets the function that implements the NMF algorithm, stored in slot \code{algorithm}. setReplaceMethod('algorithm', signature(object='NMFStrategyFunction', value='function'), function(object, value){ slot(object, 'algorithm') <- value object } ) NMF/R/NMFSeed-class.R0000644000176200001440000000570014333176413013551 0ustar liggesusers#' @include registry.R #' @include NMFStrategy-class.R NULL #' Base class that defines the interface for NMF seeding methods. #' #' This class implements a simple wrapper strategy object that defines a unified #' interface to seeding methods, that are used to initialise NMF models before #' fitting them with any NMF algorithm. #' #' @slot name character string giving the name of the seeding strategy #' @slot method workhorse function that implements the seeding strategy. #' It must have signature \code{(object="NMF", x="matrix", ...)} and initialise #' the NMF model \code{object} with suitable values for fitting the target #' matrix \code{x}. #' setClass('NMFSeed' , representation( method = 'function' # the method actual definition ) , contains = 'Strategy' ) #' Show method for objects of class \code{NMFSeed} setMethod('show', 'NMFSeed', function(object){ cat('\n") cat("name:\t", name(object), "\n") svalue <- algorithm(object) svalue <- if( is.function(svalue) ) '' else paste("'", svalue,"'", sep='') cat("method:\t", svalue, "\n") return(invisible()) } ) #' Returns the workhorse function of the seeding method described by \code{object}. setMethod('algorithm', signature(object='NMFSeed'), function(object){ slot(object, 'method') } ) #' Sets the workhorse function of the seeding method described by \code{object}. setReplaceMethod('algorithm', signature(object='NMFSeed', value='function'), function(object, value){ slot(object, 'method') <- value validObject(object) object } ) #' \code{NMFSeed} is a constructor method that instantiate #' \code{\linkS4class{NMFSeed}} objects. #' #' @param key access key as a single character string #' @param method specification of the seeding method, as a function that takes #' at least the following arguments: #' \describe{ #' \item{object}{uninitialised/empty NMF model, i.e. that it has 0 rows and #' columns, but has already the rank requested in the call to \code{\link{nmf}} #' or \code{\link{seed}}.} #' \item{x}{target matrix} #' \item{...}{extra arguments} #' } #' #' @export #' @rdname setNMFSeed #' @inline setGeneric('NMFSeed', function(key, method, ...) standardGeneric('NMFSeed') ) #' Default method simply calls \code{\link{new}} with the same arguments. setMethod('NMFSeed', signature(key='character', method='ANY'), function(key, method, ...){ # wrap function method into a new NMFSeed object new('NMFSeed', name=key, method=method, ..., package=topns_name()) } ) #' Creates an \code{NMFSeed} based on a template object (Constructor-Copy), #' in particular it uses the \strong{same} name. setMethod('NMFSeed', signature(key='NMFSeed', method='ANY'), function(key, method, ...){ # do not change the object if single argument if( nargs() == 1L ) return(key) # build an object based on template object new(class(method), key, method=method, ..., package=topns_name()) } ) NMF/R/NMF-class.R0000644000176200001440000026201514560447270012760 0ustar liggesusers#library(R.utils) #' @include utils.R #' @include versions.R #' @include algorithmic.R #' @include aheatmap.R NULL #' Advanced Usage of the Package NMF #' #' The functions documented here provide advanced functionalities useful when #' developing within the framework implemented in the NMF package. #' #' @rdname advanced #' @name advanced-NMF NULL # declare old S3 class 'proc_time' to use it as a slot for class NMF setOldClass('proc_time', prototype=numeric()) ################################ # Class: NMF ################################ #' Generic Interface for Nonnegative Matrix Factorisation Models #' #' The class \code{NMF} is a \emph{virtual class} that defines a common #' interface to handle Nonnegative Matrix Factorization models (NMF models) #' in a generic way. #' Provided a minimum set of generic methods is implemented by concrete #' model classes, these benefit from a whole set of functions and utilities #' to perform common computations and tasks in the context of Nonnegative Matrix #' Factorization. #' #' Class \code{NMF} makes it easy to develop new models that integrate well #' into the general framework implemented by the \emph{NMF} package. #' #' Following a few simple guidelines, new types of NMF models benefit from all the #' functionalities available for the built-in NMF models -- that derive themselves #' from class \code{NMF}. #' See section \emph{Implementing NMF models} below. #' #' See \code{\linkS4class{NMFstd}}, and references and links therein for #' details on the built-in implementations of the standard NMF model and its #' extensions. #' #' @slot misc A list that is used internally to temporarily store algorithm #' parameters during the computation. #' #' @export #' @family NMF-interface #' #' @section Implementing NMF models: #' #' The class \code{NMF} only defines a basic data/low-level interface for NMF models, as #' a collection of generic methods, responsible with data handling, upon which #' relies a comprehensive set of functions, composing a rich higher-level interface. #' #' Actual NMF models are defined as sub-classes that inherits from class #' \code{NMF}, and implement the management of data storage, providing #' definitions for the interface's pure virtual methods. #' #' The minimum requirement to define a new NMF model that integrates into #' the framework of the \emph{NMF} package are the followings: #' #' \itemize{ #' #' \item Define a class that inherits from class \code{NMF} and implements the #' new model, say class \code{myNMF}. #' #' \item Implement the following S4 methods for the new class \code{myNMF}: #' \describe{ #' \item{fitted}{\code{signature(object = "myNMF", value = "matrix")}: #' Must return the estimated target matrix as fitted by the NMF model #' \code{object}. #' } #' \item{basis}{\code{signature(object = "myNMF")}: #' Must return the basis matrix(e.g. the first matrix factor in #' the standard NMF model). #' } #' \item{basis<-}{\code{signature(object = "myNMF", value = "matrix")}: #' Must return \code{object} with the basis matrix set to #' \code{value}. #' } #' \item{coef}{\code{signature(object = "myNMF")}: #' Must return the matrix of mixture coefficients (e.g. the second matrix #' factor in the standard NMF model). #' } #' \item{coef<-}{\code{signature(object = "myNMF", value = "matrix")}: #' Must return \code{object} with the matrix of mixture coefficients set to #' \code{value}. #' } #' } #' #' The \emph{NMF} package provides "pure virtual" definitions of these #' methods for class \code{NMF} (i.e. with signatures \code{(object='NMF', ...)} #' and \code{(object='NMF', value='matrix')}) that throw an error if called, so #' as to force their definition for model classes. #' #' \item Optionally, implement method \code{rnmf}(signature(x="myNMF", target="ANY")). #' This method should call \code{callNextMethod(x=x, target=target, ...)} and #' fill the returned NMF model with its specific data suitable random values. #' } #' #' For concrete examples of NMF models implementations, see class #' \code{\linkS4class{NMFstd}} and its extensions (e.g. classes #' \code{\linkS4class{NMFOffset}} or \code{\linkS4class{NMFns}}). #' #' @section Creating NMF objects: #' Strictly speaking, because class \code{NMF} is virtual, no object of class #' \code{NMF} can be instantiated, only objects from its sub-classes. #' However, those objects are sometimes shortly referred in the documentation and #' vignettes as "\code{NMF} objects" instead of "objects that inherits from #' class \code{NMF}". #' #' For built-in models or for models that inherit from the standard model class #' \code{\linkS4class{NMFstd}}, the factory method \code{nmfModel} enables to easily create #' valid \code{NMF} objects in a variety of common situations. #' See documentation for the the factory method \code{\link{nmfModel}} for #' more details. #' #' @references #' Definition of Nonnegative Matrix Factorization in its modern formulation: \cite{Lee1999} #' #' Historical first definition and algorithms: \cite{Paatero1994} #' #' @family NMF-model Implementations of NMF models #' @seealso #' Main interface to perform NMF in \code{\link{nmf-methods}}. #' #' Built-in NMF models and factory method in \code{\link{nmfModel}}. #' #' Method \code{\link{seed}} to set NMF objects with values suitable to start #' algorithms with. #' #' @examples #' #' # show all the NMF models available (i.e. the classes that inherit from class NMF) #' nmfModels() #' # show all the built-in NMF models available #' nmfModels(builtin.only=TRUE) #' #' # class NMF is a virtual class so cannot be instantiated: #' try( new('NMF') ) #' #' # To instantiate an NMF model, use the factory method nmfModel. see ?nmfModel #' nmfModel() #' nmfModel(3) #' nmfModel(3, model='NMFns') #' setClass('NMF' , representation( misc = 'list' # misceleneaous data used during fitting ) , contains = 'VIRTUAL') #' Fitted Matrix in NMF Models #' #' Computes the estimated target matrix based on a given \emph{NMF} model. #' The estimation depends on the underlying NMF model. #' For example in the standard model \eqn{V \equiv W H}{V ~ W H}, the target matrix is #' estimated by the matrix product \eqn{W H}. #' In other models, the estimate may depend on extra parameters/matrix #' (cf. Non-smooth NMF in \code{\link{NMFns-class}}). #' #' This function is a S4 generic function imported from \link[stats]{fitted} in #' the package \emph{stats}. #' It is implemented as a pure virtual method for objects of class #' \code{NMF}, meaning that concrete NMF models must provide a #' definition for their corresponding class (i.e. sub-classes of #' class \code{NMF}). #' See \code{\linkS4class{NMF}} for more details. #' #' @param object an object that inherit from class \code{NMF} #' @param ... extra arguments to allow extension #' #' @return the target matrix estimate as fitted by the model \code{object} #' @export setGeneric('fitted', package='stats') setMethod('fitted', signature(object='NMF'), function(object, ...){ stop("NMF::fitted is a pure virtual method of interface 'NMF'. It should be overloaded in class '", class(object),"'.") } ) #' Accessing NMF Factors #' #' \code{basis} and \code{basis<-} are S4 generic functions which respectively #' extract and set the matrix of basis components of an NMF model #' (i.e. the first matrix factor). #' #' For example, in the case of the standard NMF model \eqn{V \equiv W H}{V ~ W H}, #' the method \code{basis} will return the matrix \eqn{W}. #' #' \code{basis} and \code{basis<-} are defined for the top #' virtual class \code{\linkS4class{NMF}} only, and rely internally on the low-level #' S4 generics \code{.basis} and \code{.basis<-} respectively that effectively #' extract/set the coefficient data. #' These data are post/pre-processed, e.g., to extract/set only their #' non-fixed terms or check dimension compatibility. #' #' @param object an object from which to extract the factor matrices, typically an #' object of class \code{\linkS4class{NMF}}. #' @param ... extra arguments to allow extension and passed to the low-level #' access functions \code{.coef} and \code{.basis}. #' #' Note that these throw an error if used in replacement functions \code{}. #' #' @rdname basis-coef-methods #' @family NMF-interface #' @export #' setGeneric('basis', function(object, ...) standardGeneric('basis') ) #' Default method returns the value of S3 slot or attribute \code{'basis'}. #' It returns \code{NULL} if none of these are set. #' #' Arguments \code{...} are not used by this method. setMethod('basis', signature(object='ANY'), function(object, ...){ if( is.list(object) && 'basis' %in% names(object) ) object[['basis']] else attr(object, 'basis') } ) #' @param all a logical that indicates whether the complete matrix factor #' should be returned (\code{TRUE}) or only the non-fixed part. #' This is relevant only for formula-based NMF models that include fixed basis or #' coefficient terms. #' setMethod('basis', signature(object='NMF'), function(object, all=TRUE, ...){ if( all || !length(i <- ibterms(object)) ){ # return all coefficients .basis(object, ...) } else { # remove fixed basis .basis(object, ...)[, -i] } } ) #' \code{.basis} and \code{.basis<-} are the low-level S4 generics that simply #' return/set basis component data in an object. #' They are defined so that some common processing may be implemented in #' \code{basis} and \code{basis<-}. #' #' The methods \code{.basis}, \code{.coef} and their replacement versions #' are implemented as pure virtual methods for the interface class #' \code{NMF}, meaning that concrete NMF models must provide a #' definition for their corresponding class (i.e. sub-classes of #' class \code{NMF}). #' See \code{\linkS4class{NMF}} for more details. #' #' @rdname basis-coef-methods #' @export setGeneric('.basis', function(object, ...) standardGeneric('.basis') ) setMethod('.basis', signature(object='NMF'), function(object, ...){ stop("NMF::.basis is a pure virtual method of interface 'NMF'. It should be overloaded in class '", class(object),"'.") } ) #' @export #' @rdname basis-coef-methods setGeneric('basis<-', function(object, ..., value) standardGeneric('basis<-') ) #' Default methods that calls \code{.basis<-} and check the validity of the #' updated object. #' @param use.dimnames logical that indicates if the object's dim names should be #' set using those from the new value, or left unchanged -- after truncating #' them to fit new dimensions if necessary. #' This is useful to only set the entries of a factor. #' setReplaceMethod('basis', signature(object='NMF', value='ANY'), function(object, use.dimnames = TRUE, ..., value){ # error if passed extra arguments if( length(xargs<- list(...)) ){ stop("basis<-,NMF - Unused arguments: ", str_out(xargs, Inf, use.names = TRUE)) } # backup old dimnames to reapply them on exit if( !use.dimnames ) odn <- dimnames(object) nb_old <- nbasis(object) # only set non-fixed terms if( !nbterms(object) ) .basis(object) <- value else{ i <- ibasis(object) .basis(object)[,i] <- value[, i] } # adapt coef if empty if( !hasCoef(object) ){ x <- basis(object) .coef(object) <- rbind(coef(object)[1:min(nb_old, ncol(x)), , drop = FALSE], matrix(NA, max(ncol(x)-nb_old, 0), 0)) # .coef(object) <- coef(object)[1:ncol(x), , drop = FALSE] } # check object validity validObject(object) # update other factor if necessary if( use.dimnames ) basisnames(object) <- colnames(basis(object)) else if( !length(odn) ) dimnames(object) <- NULL else dimnames(object) <- mapply(head, odn, dim(object), SIMPLIFY = FALSE) object } ) #' @param value replacement value #' @rdname basis-coef-methods #' @export setGeneric('.basis<-', function(object, value) standardGeneric('.basis<-') ) setReplaceMethod('.basis', signature(object='NMF', value='matrix'), function(object, value){ stop("NMF::.basis<- is a pure virtual method of interface 'NMF'. It should be overloaded in class '", class(object),"'.") } ) #' @export setGeneric('loadings', package='stats') #' Method loadings for NMF Models #' #' The method \code{loadings} is identical to \code{basis}, but do #' not accept any extra argument. #' #' The method \code{loadings} is provided to standardise the NMF interface #' against the one defined in the \code{\link{stats}} package, #' and emphasises the similarities between NMF and PCA or factorial analysis #' (see \code{\link{loadings}}). #' #' @rdname basis-coef-methods setMethod('loadings', 'NMF', function(x) basis(x) ) #' Get/Set the Coefficient Matrix in NMF Models #' #' \code{coef} and \code{coef<-} respectively extract and set the #' coefficient matrix of an NMF model (i.e. the second matrix factor). #' For example, in the case of the standard NMF model \eqn{V \equiv WH}{V ~ W H}, #' the method \code{coef} will return the matrix \eqn{H}. #' #' \code{coef} and \code{coef<-} are S4 methods defined for the corresponding #' generic functions from package \code{stats} (See \link[stats]{coef}). #' Similarly to \code{basis} and \code{basis<-}, they are defined for the top #' virtual class \code{\linkS4class{NMF}} only, and rely internally on the S4 #' generics \code{.coef} and \code{.coef<-} respectively that effectively #' extract/set the coefficient data. #' These data are post/pre-processed, e.g., to extract/set only their #' non-fixed terms or check dimension compatibility. #' #' @rdname basis-coef-methods #' @export setGeneric('coef', package='stats') setMethod('coef', 'NMF', function(object, all=TRUE, ...){ if( all || !length(i <- icterms(object)) ){ # return all coefficients .coef(object, ...) } else { # remove fixed coefficients .coef(object, ...)[-i, ] } } ) #' \code{.coef} and \code{.coef<-} are low-level S4 generics that simply #' return/set coefficient data in an object, leaving some common processing #' to be performed in \code{coef} and \code{coef<-}. #' #' @rdname basis-coef-methods #' @export setGeneric('.coef', function(object, ...) standardGeneric('.coef')) setMethod('.coef', signature(object='NMF'), function(object, ...){ stop("NMF::.coef is a pure virtual method of interface 'NMF'. It should be overloaded in class '", class(object),"'.") } ) #' @export #' @rdname basis-coef-methods setGeneric('coef<-', function(object, ..., value) standardGeneric('coef<-') ) #' Default methods that calls \code{.coef<-} and check the validity of the #' updated object. setReplaceMethod('coef', signature(object='NMF', value='ANY'), function(object, use.dimnames = TRUE, ..., value){ # error if passed extra arguments if( length(xargs<- list(...)) ){ stop("coef<-,NMF - Unused arguments: ", str_out(xargs, Inf, use.names = TRUE)) } # backup old dimnames to reapply them on exit if( !use.dimnames ) odn <- dimnames(object) nb_old <- nbasis(object) # only set non-fixed terms if( !ncterms(object) ) .coef(object) <- value else{ i <- icoef(object) .coef(object)[i, ] <- value[i, ] } # adapt basis if empty before validation if( !hasBasis(object) ){ x <- coef(object) .basis(object) <- cbind(basis(object)[, 1:min(nb_old, nrow(x)), drop = FALSE], matrix(NA, 0, max(nrow(x)-nb_old, 0))) } # check object validity validObject(object) # update other factor if necessary if( use.dimnames ) basisnames(object) <- rownames(coef(object)) else if( !length(odn) ) dimnames(object) <- NULL else dimnames(object) <- mapply(head, odn, dim(object), SIMPLIFY = FALSE) object } ) #' @export #' @rdname basis-coef-methods setGeneric('.coef<-', function(object, value) standardGeneric('.coef<-') ) setReplaceMethod('.coef', signature(object='NMF', value='matrix'), function(object, value){ stop("NMF::.coef<- is a pure virtual method of interface 'NMF'. It should be overloaded in class '", class(object),"'.") } ) #' @description Methods \code{coefficients} and \code{coefficients<-} are #' simple aliases for methods \code{coef} and \code{coef<-} respectively. #' #' @export #' @rdname basis-coef-methods setGeneric('coefficients', package='stats') #' Alias to \code{coef,NMF}, therefore also pure virtual. setMethod('coefficients', signature(object='NMF'), selectMethod('coef', 'NMF')) #' @description \code{scoef} is similar to \code{coef}, but returns the mixture #' coefficient matrix of an NMF model, with the columns scaled so that they #' sum up to a given value (1 by default). #' #' @param scale scaling factor, which indicates to the value the columns of the #' coefficient matrix should sum up to. #' #' @rdname basis-coef-methods #' @export #' #' @examples #' #' # Scaled coefficient matrix #' x <- rnmf(3, 10, 5) #' scoef(x) #' scoef(x, 100) #' setGeneric('scoef', function(object, ...) standardGeneric('scoef') ) setMethod('scoef', 'NMF', function(object, scale=1){ sweep(coef(object), 2L, colSums(coef(object)) / scale, '/') } ) setMethod('scoef', 'matrix', function(object, scale=1){ sweep(object, 2L, colSums(object) / scale, '/') } ) unit.test(scoef, { x <- rnmf(3, 10, 5) checkIdentical(colSums(scoef(x)), rep(1, nbasis(x)) , "Default call: columns are scaled to sum-up to one") checkIdentical(colSums(scoef(x, 100)), rep(1, nbasis(x)) , "Scale=10: columns are scaled to sum-up to 10") }) #' Rescaling NMF Models #' #' Rescales an NMF model keeping the fitted target matrix identical. #' #' Standard NMF models are identifiable modulo a scaling factor, meaning that the #' basis components and basis profiles can be rescaled without changing the fitted #' values: #' #' \deqn{X = W_1 H_1 = (W_1 D) (D^{-1} H_1) = W_2 H_2}{X = W H = (W D) (D^-1 H)} #' with \eqn{D= \alpha diag(1/\delta_1, \ldots, 1\delta_r)}{D= alpha * diag(1/delta_1, ..., 1/delta_r)} #' #' The default call \code{scale(object)} rescales the basis NMF object so that each #' column of the basis matrix sums up to one. #' #' @param x an NMF object #' @param center either a numeric normalising vector \eqn{\delta}{delta}, or either #' \code{'basis'} or \code{'coef'}, which respectively correspond to using the #' column sums of the basis matrix or the inverse of the row sums of the #' coefficient matrix as a normalising vector. #' If numeric, \code{center} should be a single value or a vector of length the #' rank of the NMF model, i.e. the number of columns in the basis matrix. #' @param scale scaling coefficient applied to \eqn{D}, i.e. the value of \eqn{\alpha}{alpha}, #' or, if \code{center='coef'}, the value of \eqn{1/\alpha}{1/alpha} (see section \emph{Details}). #' #' @return an NMF object #' #' @export #' @examples #' #' # random 3-rank 10x5 NMF model #' x <- rnmf(3, 10, 5) #' #' # rescale based on basis #' colSums(basis(x)) #' colSums(basis(scale(x))) #' #' rx <- scale(x, 'basis', 10) #' colSums(basis(rx)) #' rowSums(coef(rx)) #' #' # rescale based on coef #' rowSums(coef(x)) #' rowSums(coef(scale(x, 'coef'))) #' rx <- scale(x, 'coef', 10) #' rowSums(coef(rx)) #' colSums(basis(rx)) #' #' # fitted target matrix is identical but the factors have been rescaled #' rx <- scale(x, 'basis') #' all.equal(fitted(x), fitted(rx)) #' all.equal(basis(x), basis(rx)) #' scale.NMF <- function(x, center=c('basis', 'coef'), scale=1){ # determine base value if( missing(center) ) center <- match.arg(center) base <- center delta <- if( is.character(base) ){ base <- match.arg(center) if( base == 'basis' ) colSums(basis(x)) else{ scale <- 1/scale 1 / rowSums(coef(x)) } }else if( is.numeric(base) ) base else stop("Invalid base value: should be a numeric or one of " , str_out(c('none', 'basis', 'coef'))) # scale D <- scale/delta # W <- W * D basis(x) <- sweep(basis(x), 2L, D, '*') # H <- D^-1 * H coef(x) <- sweep(coef(x), 1L, D, '/') x } unit.test("scale", { r <- 3 x <- rnmf(r, 10, 5) .lcheck <- function(msg, rx, ref, target){ .msg <- function(...) paste(msg, ':', ...) checkTrue(!identical(basis(x), basis(rx)), .msg("changes basis matrix")) checkTrue(!identical(coef(x), coef(rx)), .msg("changes coef matrix")) checkEqualsNumeric(fitted(x), fitted(rx), .msg("fitted target is identical")) brx <- colSums(basis(rx)) crx <- rowSums(coef(rx)) if( target == 1 ){ checkEquals(brx, ref, .msg("correctly scales basis components")) checkTrue(!all(crx==ref), .msg("does not force scale on coefficient matrix")) }else{ checkTrue(!all(brx==ref), .msg("does not force scale on basis matrix")) checkEquals(crx, ref , .msg("correctly scales rows of coef matrix")) } } .check <- function(msg, ref, ...){ .lcheck(str_c(msg, " + argument center='basis'") , scale(x, center='basis', ...), ref, 1) .lcheck(str_c(msg, " + argument center='coef'") , scale(x, center='coef', ...), ref, 2) } .lcheck("Default call", scale(x), rep(1, r), 1) .check("Missing argument scale", rep(1, r)) .check("Argument scale=10", rep(10, r), scale=10) s <- runif(r) .check("Argument scale=numeric", s, scale=s) }) #' Generating Random NMF Models #' #' Generates NMF models with random values drawn from a uniform distribution. #' It returns an NMF model with basis and mixture coefficient matrices filled #' with random values. #' The main purpose of the function \code{rnmf} is to provide a common #' interface to generate random seeds used by the \code{\link{nmf}} function. #' #' If necessary, extensions of the standard NMF model or custom models must #' define a method "rnmf,,numeric" for initialising their #' specific slots other than the basis and mixture coefficient matrices. #' In order to benefit from the complete built-in interface, the overloading #' methods should call the generic version using function #' \code{\link{callNextMethod}}, prior to set the values of the specific slots. #' See for example the method \code{\link[=rnmf,NMFOffset,numeric-method]{rnmf}} #' defined for \code{\linkS4class{NMFOffset}} models: #' \code{showMethods(rnmf, class='NMFOffset', include=TRUE))}. #' #' For convenience, shortcut methods for working on \code{data.frame} objects #' directly are implemented. #' However, note that conversion of a \code{data.frame} into a \code{matrix} #' object may take some non-negligible time, for large datasets. #' If using this method or other NMF-related methods several times, consider #' converting your data \code{data.frame} object into a matrix once for good, #' when first loaded. #' #' @param x an object that determines the rank, dimension and/or class of the #' generated NMF model, e.g. a numeric value or an object that inherits from class #' \code{\linkS4class{NMF}}. #' See the description of the specific methods for more details on the supported #' types. #' @param target optional specification of target dimensions. #' See section \emph{Methods} for how this parameter is used by the different #' methods. #' @param ... extra arguments to allow extensions and passed to the next method #' eventually down to \code{\link{nmfModel}}, where they are used to initialise #' slots that are specific to the instantiating NMF model. #' #' @return An NMF model, i.e. an object that inherits from class #' \code{\linkS4class{NMF}}. #' #' @export #' @seealso \code{\link{rmatrix}} #' @family NMF-interface setGeneric('rnmf', function(x, target, ...) standardGeneric('rnmf') ) # Define the loading namespace .PKG.NAMESPACE <- packageEnv() #' Testing NMF Objects #' #' @description #' The functions documented here tests different characteristics of NMF objects. #' #' \code{is.nmf} tests if an object is an NMF model or a class that extends #' the class NMF. #' #' @details #' #' \code{is.nmf} tests if \code{object} is the name of a class (if a \code{character} #' string), or inherits from a class, that extends \code{\linkS4class{NMF}}. #' #' @note The function \code{is.nmf} does some extra work with the namespace as #' this function needs to return correct results even when called in \code{.onLoad}. #' See discussion on r-devel: \url{https://stat.ethz.ch/pipermail/r-devel/2011-June/061357.html} #' #' @param x an R object. See section \emph{Details}, for how each function #' uses this argument. #' #' @rdname types #' @export #' #' @examples #' #' # test if an object is an NMF model, i.e. that it implements the NMF interface #' is.nmf(1:4) #' is.nmf( nmfModel(3) ) #' is.nmf( nmf(rmatrix(10, 5), 2) ) #' is.nmf <- function(x){ # load definition for base class NMF clref <- getClass('NMF', .Force=TRUE, where=.PKG.NAMESPACE) is(x, clref) } unit.test(is.nmf,{ checkTrue(!is.nmf(1:4), "on vector: FALSE") checkTrue(!is.nmf(list(1:4)), "on list: FALSE") checkTrue(is.nmf('NMF'), "on 'NMF': TRUE") checkTrue(is.nmf('NMFstd'), "on 'NMFstd': TRUE") checkTrue( is.nmf( nmfModel(3) ), "on empty model: TRUE") checkTrue( is.nmf( rnmf(3, 20, 10) ), "on random model: TRUE") checkTrue( is.nmf( nmf(rmatrix(20,10), 3) ), "on NMFfit object: TRUE") }) isNMFclass <- function(x){ if( is.character(x) ){ # test object is a class that extends NMF # load definition for base class NMF clref <- getClass('NMF', .Force=TRUE, where=.PKG.NAMESPACE) cl <- getClass(x, .Force=TRUE, where=.PKG.NAMESPACE) if( is.null(cl) ) cl <- getClass(x, .Force=TRUE) extends(cl, clref) }else FALSE } ################################ # Taken from Biobase selectSome <- function (obj, maxToShow = 5) { len <- length(obj) if (maxToShow < 3) maxToShow <- 3 if (len > maxToShow) { maxToShow <- maxToShow - 1 bot <- ceiling(maxToShow/2) top <- len - (maxToShow - bot - 1) nms <- obj[c(1:bot, top:len)] c(as.character(nms[1:bot]), "...", as.character(nms[-c(1:bot)])) } else if (is.factor(obj)) as.character(obj) else obj } .showFixedTerms <- function(x, ...){ s <- sapply(x, function(t){ s <- if( is.factor(t) ) selectSome(levels(t), ...) else selectSome(t, ...) s <- str_out(s, Inf, quote=FALSE) if( is.factor(t) ) s <- str_c('<', s, ">") s }) paste(names(s), '=', s) } #' Show method for objects of class \code{NMF} #' @export setMethod('show', 'NMF', function(object) { cat("\n", sep='') cat("features:", nrow(object), "\n") cat("basis/rank:", nbasis(object), "\n") cat("samples:", ncol(object), "\n") # show fixed terms if( (n <- ncterms(object)) ){ cat("fixed coef [", n, "]:\n" , str_c(' ', .showFixedTerms(cterms(object), 4), collapse="\n") , "\n", sep='') } if( (n <- nbterms(object)) ){ cat("fixed basis [", n, "]:\n" , str_c(' ', .showFixedTerms(bterms(object), 4), collapse="\n") , "\n", sep='') } # show the miscellaneous model parameters if( length(object@misc) > 0L ){ cat("miscellaneous:", str_desc(object@misc, exdent=12L), ". (use 'misc(object)')\n") } } ) #' Dimension of NMF Objects #' #' @description #' The methods \code{dim}, \code{nrow}, \code{ncol} and \code{nbasis} return #' the different dimensions associated with an NMF model. #' #' \code{dim} returns all dimensions in a length-3 integer vector: #' the number of row and columns of the estimated target matrix, #' as well as the factorization rank (i.e. the number of basis components). #' #' \code{nrow}, \code{ncol} and \code{nbasis} provide separate access to each #' of these dimensions respectively. #' #' @details #' The NMF package does not implement specific functions \code{nrow} and \code{ncol}, #' but rather the S4 method \code{dim} for objects of class \code{\linkS4class{NMF}}. #' This allows the base methods \code{\link{nrow}} and \code{\link{ncol}} to #' directly work with such objects, to get the number of rows and columns of #' the target matrix estimated by an NMF model. #' #' The function \code{nbasis} is a new S4 generic defined in the package NMF, that #' returns the number of basis components of an object. #' Its default method should work for any object, that has a suitable #' \code{basis} method defined for its class. #' #' @param x an object with suitable \code{basis} and \code{coef} methods, such #' as an object that inherit from \code{\linkS4class{NMF}}. #' @param ... extra arguments to allow extension. #' #' @return a single integer value or, for \code{dim}, a length-3 integer vector, #' e.g. \code{c(2000, 30, 3)} for an \code{NMF} model that fits a 2000 x 30 #' matrix using 3 basis components. #' #' @export #' @rdname dims #' @aliases dim-NMF setGeneric('nbasis', function(x, ...) standardGeneric('nbasis') ) #' Default method which returns the number of columns of the basis matrix extracted #' from \code{x} using a suitable method \code{basis}, or, if the latter is \code{NULL}, #' the value of attributes \code{'nbasis'}. #' #' For NMF models, this also corresponds to the number of rows in the coefficient #' matrix. #' setMethod('nbasis', signature(x='ANY'), function(x, ...) { if( !is.null(n <- ncol(basis(x, ...))) ) n else if( is.list(x) && 'nbasis' %in% names(x) ) x[['nbasis']] else attr(x, 'nbasis') } ) #' method for NMF objects for the base generic \code{\link{dim}}. #' It returns all dimensions in a length-3 integer vector: #' the number of row and columns of the estimated target matrix, #' as well as the factorization rank (i.e. the number of basis components). #' #' @rdname dims #' @export setMethod('dim', signature(x='NMF'), function(x){ c(nrow(basis(x)), ncol(coef(x)), nbasis(x)) } ) #' Dimension names for NMF objects #' #' @description #' The methods \code{dimnames}, \code{rownames}, \code{colnames} and #' \code{basisnames} and their respective replacement form allow to get and set #' the dimension names of the matrix factors in a NMF model. #' #' \code{dimnames} returns all the dimension names in a single list. #' Its replacement form \code{dimnames<-} allows to set all dimension names at once. #' #' \code{rownames}, \code{colnames} and \code{basisnames} provide separate access #' to each of these dimension names respectively. #' Their respective replacement form allow to set each dimension names separately. #' #' @details #' #' The function \code{basisnames} is a new S4 generic defined in the package NMF, #' that returns the names of the basis components of an object. #' Its default method should work for any object, that has a suitable \code{basis} #' method defined for its class. #' #' The method \code{dimnames} is implemented for the base generic \code{\link{dimnames}}, #' which make the base function \code{\link{rownames}} and \code{\link{colnames}} #' work directly. #' #' Overall, these methods behave as their equivalent on \code{matrix} objects. #' The function \code{basisnames<-} ensures that the dimension names are handled #' in a consistent way on both factors, enforcing the names on both matrix factors #' simultaneously. #' #' @param x an object with suitable \code{basis} and \code{coef} methods, such #' as an object that inherit from \code{\linkS4class{NMF}}. #' @param ... extra argument to allow extension. #' #' @export #' @rdname dimnames #' @aliases dimnames-NMF #' #' @examples #' # create a random NMF object #' a <- rnmf(2, 5, 3) #' #' # set dimensions #' dims <- list( features=paste('f', 1:nrow(a), sep='') #' , samples=paste('s', 1:ncol(a), sep='') #' , basis=paste('b', 1:nbasis(a), sep='') ) #' dimnames(a) <- dims #' dimnames(a) #' basis(a) #' coef(a) #' #' # access the dimensions separately #' rownames(a) #' colnames(a) #' basisnames(a) #' #' # set only the first dimension (rows of basis): the other two dimnames are set to NULL #' dimnames(a) <- dims[1] #' dimnames(a) #' basis(a) #' coef(a) #' #' # set only the two first dimensions (rows and columns of basis and coef respectively): #' # the basisnames are set to NULL #' dimnames(a) <- dims[1:2] #' dimnames(a) #' basis(a) #' #' # reset the dimensions #' dimnames(a) <- NULL #' dimnames(a) #' basis(a) #' coef(a) #' #' # set each dimensions separately #' rownames(a) <- paste('X', 1:nrow(a), sep='') # only affect rows of basis #' basis(a) #' #' colnames(a) <- paste('Y', 1:ncol(a), sep='') # only affect columns of coef #' coef(a) #' #' basisnames(a) <- paste('Z', 1:nbasis(a), sep='') # affect both basis and coef matrices #' basis(a) #' coef(a) #' setGeneric('basisnames', function(x, ...) standardGeneric('basisnames') ) #' Default method which returns the column names of the basis matrix extracted from #' \code{x}, using the \code{basis} method. #' #' For NMF objects these also correspond to the row names of the coefficient matrix. #' @rdname dimnames setMethod('basisnames', signature(x='ANY'), function(x) { colnames(basis(x)) } ) #' The generic \code{basisnames<-} simultaneously sets the names of the basis #' components and coefficients of an object, for which suitable \code{basis} #' and \code{coef} methods are defined. #' #' @details #' The function \code{basisnames<-} is a new S4 generic defined in the package NMF, #' that sets the names of the basis components of an object. #' Its default method should work for any object, that has suitable \code{basis<-} #' and \code{coef<-} methods method defined for its class. #' #' @param x an object with suitable \code{basis} and \code{coef} methods, such #' as an object that inherit from \code{\linkS4class{NMF}}. #' @param ... extra argument to allow extension. #' @param value a character vector with the names of the basis components to be set #' @export #' @rdname dimnames setGeneric('basisnames<-', function(x, ..., value) standardGeneric('basisnames<-') ) #' Default method which sets, respectively, the row and the column names of the basis #' matrix and coefficient matrix of \code{x} to \code{value}. #' @export #' @rdname dimnames setReplaceMethod('basisnames', 'ANY', function(x, ..., value) { rownames(.coef(x)) <- value colnames(.basis(x)) <- value x } ) #' Returns the dimension names of the NMF model \code{x}. #' #' It returns either NULL if no dimnames are set on the object, #' or a 3-length list containing the row names of the basis matrix, #' the column names of the mixture coefficient matrix, and the column names of #' the basis matrix (i.e. the names of the basis components). #' #' @rdname dimnames #' @export setMethod('dimnames', 'NMF', function(x){ b <- dimnames(basis(x)) if( is.null(b) ) b <- list(NULL, NULL) c <- dimnames(coef(x)) if( is.null(c) ) c <- list(NULL, NULL) l <- c(b[1],c[2],b[2]) if( all(sapply(l, is.null)) ) NULL else l } ) #' Sets the dimension names of the NMF model \code{x}. #' #' \code{value} can be \code{NULL} which resets all dimension names, or a #' 1, 2 or 3-length list providing names at least for the rows of the basis #' matrix. #' #' The optional second element of \code{value} (NULL if absent) is used to set #' the column names of the coefficient matrix. #' The optional third element of \code{value} (NULL if absent) is used to set #' both the column names of the basis matrix and the row names of the #' coefficient matrix. #' #' @rdname dimnames #' @export setReplaceMethod('dimnames', 'NMF', function(x, value){ if( !is.list(value) && !is.null(value) ) stop("NMF::dimnames - Invalid value: must be a list or NULL.") if( length(value) == 0 ) value <- NULL else if( length(value) == 1 ) value <- c(value, list(NULL, NULL)) else if( length(value) == 2 ) # if only the two first dimensions reset the third one value <- c(value, list(NULL)) else if( length(value)!=3 ) # check length of value stop("NMF::dimnames - invalid argument 'value' [a 2 or 3-length list is expected]") # only set relevant dimensions if( length(w <- which(dim(x) == 0)) ){ value[w] <- sapply(value[w], function(x) NULL, simplify=FALSE) } # set dimnames dimnames(.basis(x)) <- value[c(1,3)] dimnames(.coef(x)) <- value[c(3,2)] # return updated model x } ) #' Sub-setting NMF Objects #' #' This method provides a convenient way of sub-setting objects of class \code{NMF}, #' using a matrix-like syntax. #' #' It allows to consistently subset one or both matrix factors in the NMF model, as well #' as retrieving part of the basis components or part of the mixture coefficients with #' a reduced amount of code. #' #' @details #' The returned value depends on the number of subset index passed and the #' value of argument \code{drop}: #' #' \itemize{ \item No index as in \code{x[]} or \code{x[,]}: the value is the #' object \code{x} unchanged. #' #' \item One single index as in \code{x[i]}: the value is the complete NMF #' model composed of the selected basis components, subset by \code{i}, #' except if argument \code{drop=TRUE}, or if it is missing and \code{i} is of length 1. #' Then only the basis matrix is returned with dropped dimensions: #' \code{x[i, drop=TRUE]} <=> \code{drop(basis(x)[, i])}. #' #' This means for example that \code{x[1L]} is the first basis vector, #' and \code{x[1:3, drop = TRUE]} is the matrix composed of the 3 first basis vectors -- in columns. #' #' Note that in version <= 0.18.3, the call \code{x[i, drop = TRUE.or.FALSE]} was equivalent to #' \code{basis(x)[, i, drop=TRUE.or.FALSE]}. #' #' \item More than one index with \code{drop=FALSE} (default) as in #' \code{x[i,j]}, \code{x[i,]}, \code{x[,j]}, \code{x[i,j,k]}, \code{x[i,,k]}, #' etc...: the value is a \code{NMF} object whose basis and/or mixture #' coefficient matrices have been subset accordingly. The third index \code{k} #' affects simultaneously the columns of the basis matrix AND the rows of the #' mixture coefficient matrix. In this case argument \code{drop} is not used. #' #' \item More than one index with \code{drop=TRUE} and \code{i} xor \code{j} #' missing: the value returned is the matrix that is the more affected by the #' subset index. That is that \code{x[i, , drop=TRUE]} and \code{x[i, , k, #' drop=TRUE]} return the basis matrix subset by \code{[i,]} and \code{[i,k]} #' respectively, while \code{x[, j, drop=TRUE]} and \code{x[, j, k, drop=TRUE]} #' return the mixture coefficient matrix subset by \code{[,j]} and \code{[k,j]} #' respectively. #' #' } #' #' @param i index used to subset on the \strong{rows} of the basis matrix (i.e. #' the features). #' It can be a \code{numeric}, \code{logical}, or \code{character} vector #' (whose elements must match the row names of \code{x}). #' In the case of a \code{logical} vector the entries are recycled if necessary. #' @param j index used to subset on the \strong{columns} of the mixture #' coefficient matrix (i.e. the samples). #' It can be a \code{numeric}, \code{logical}, or \code{character} vector #' (whose elements must match the column names of \code{x}). #' In the case of a \code{logical} vector the entries are recycled if necessary. #' @param ... used to specify a third index to subset on the basis components, #' i.e. on both the columns and rows of the basis matrix and mixture #' coefficient respectively. #' It can be a \code{numeric}, \code{logical}, or \code{character} vector #' (whose elements must match the basis names of \code{x}). #' In the case of a \code{logical} vector the entries are recycled if necessary. #' #' Note that only the first extra subset index is used. #' A warning is thrown if more than one extra argument is passed in \code{...}. #' @param drop single \code{logical} value used to drop the \code{NMF-class} #' wrapping and only return subsets of one of the factor matrices (see \emph{Details}) #' #' @rdname subset-NMF #' @export #' @examples #' # create a dummy NMF object that highlight the different way of subsetting #' a <- nmfModel(W=outer(seq(1,5),10^(0:2)), H=outer(10^(0:2),seq(-1,-10))) #' basisnames(a) <- paste('b', 1:nbasis(a), sep='') #' rownames(a) <- paste('f', 1:nrow(a), sep='') #' colnames(a) <- paste('s', 1:ncol(a), sep='') #' #' # or alternatively: #' # dimnames(a) <- list( features=paste('f', 1:nrow(a), sep='') #' # , samples=paste('s', 1:ncol(a), sep='') #' # , basis=paste('b', 1:nbasis(a)) ) #' #' # look at the resulting NMF object #' a #' basis(a) #' coef(a) #' #' # extract basis components #' a[1] #' a[1, drop=FALSE] # not dropping matrix dimension #' a[2:3] #' #' # subset on the features #' a[1,] #' a[2:4,] #' # dropping the NMF-class wrapping => return subset basis matrix #' a[2:4,, drop=TRUE] #' #' # subset on the samples #' a[,1] #' a[,2:4] #' # dropping the NMF-class wrapping => return subset coef matrix #' a[,2:4, drop=TRUE] #' #' # subset on the basis => subsets simultaneously basis and coef matrix #' a[,,1] #' a[,,2:3] #' a[4:5,,2:3] #' a[4:5,,2:3, drop=TRUE] # return subset basis matrix #' a[,4:5,2:3, drop=TRUE] # return subset coef matrix #' #' # 'drop' has no effect here #' a[,,2:3, drop=TRUE] #' setMethod('[', 'NMF', function (x, i, j, ..., drop = FALSE) { k <- NULL mdrop <- missing(drop) # compute number of arguments: x and drop are always passed Nargs <- nargs() - !mdrop single.arg <- FALSE k.notmissing <- FALSE if( !missing(i) && Nargs < 3L ){ k <- i single.arg <- TRUE } else if( Nargs > 3L ){ dots <- list(...) if( length(dots) != 1 ) warning("NMF::[ - using only the first extra subset index, the remaining ", length(dots)-1," are discarded.") k <- dots[[1]] k.notmissing <- TRUE } # no indice was provided => return the object unchanged if ( missing(i) && missing(j) && !k.notmissing ) { # check if there is other arguments if (length(list(...)) != 0) stop("NMF::[] method - please specify which features, samples or basis to subset. See class?NMF.") # otherwise return the untouched object return(x) } # subset the rows of the basis matrix if ( !missing(i) && !single.arg ) .basis(x) <- basis(x)[i, , drop = FALSE] # subset the columns of mixture coefficient matrix if (!missing(j)) .coef(x) <- coef(x)[, j, drop = FALSE] # subset the basis: columns of basis matrix and row of mixture coefficient matrix if( single.arg || k.notmissing ){ .basis(x) <- basis(x)[, k, drop = FALSE] # return basis only single arg and drop=TRUE if( single.arg && ((mdrop && length(k) == 1L) || drop) ) return( drop(basis(x)) ) .coef(x) <- coef(x)[k, , drop = FALSE] } # if drop is TRUE and only one dimension is missing then return affected matrix if( !single.arg && drop ){ if( missing(i) && !missing(j) ) return( drop(coef(x)) ) else if( missing(j) && !missing(i) ) return( drop(basis(x)) ) } # return subset object return(x) } ) #' The function \code{misc} provides access to miscellaneous data members stored #' in slot \code{misc} (as a \code{list}), which allow extensions of NMF models #' to be implemented, without defining a new S4 class. #' #' @param object an object that inherit from class \code{NMF} #' @param ... extra arguments (not used) #' #' @rdname NMF-class #' @export misc <- function(object, ...){ if( !isS4(object) && is.list(object) ) object[['misc']] else attr(object, 'misc') } #' shortcut for \code{x@@misc[[name, exact=TRUE]]} respectively. #' @rdname NMF-class #' @export setMethod('$', 'NMF', function(x, name){ x@misc[[name, exact=TRUE]]; } ) #' shortcut for \code{x@@misc[[name]] <- value} #' @rdname NMF-class #' @export setReplaceMethod('$', 'NMF', function(x, name, value) { x@misc[[name]] <- value x } ) #' @importFrom utils .DollarNames setGeneric('.DollarNames', package='utils') #' @method .DollarNames NMF #' @export .DollarNames.NMF <- function(x, pattern = "") grep(pattern, names(misc(x)), value=TRUE) #' Auto-completion for \code{\linkS4class{NMF}} objects #' @rdname NMF-class #' @export setMethod('.DollarNames', 'NMF', .DollarNames.NMF) #' \code{is.empty.nmf} tests whether an \code{NMF} object describes an empty NMF model, #' i.e. it contains no data. #' #' @details #' \code{is.empty.nmf} returns \code{TRUE} if the basis and coefficient matrices of #' \code{x} have respectively zero rows and zero columns. #' It returns \code{FALSE} otherwise. #' #' In particular, this means that an empty model can still have a non-zero number #' of basis components, i.e. a factorization rank that is not null. #' This happens, for example, in the case of NMF models created calling the factory method #' \code{\link{nmfModel}} with a value only for the factorization rank. #' #' @param ... extra parameters to allow extension or passed to subsequent calls #' #' @rdname types #' @export #' #' @examples #' #' # empty model #' is.empty.nmf( nmfModel(3) ) #' # non empty models #' is.empty.nmf( nmfModel(3, 10, 0) ) #' is.empty.nmf( rnmf(3, 10, 5) ) #' is.empty.nmf <- function(x, ...){ nrow(x) == 0 && ncol(x) == 0 } #' \code{hasBasis} tests whether an objects contains a basis matrix -- returned by #' a suitable method \code{basis} -- with at least one row. #' #' @rdname types #' @export hasBasis <- function(x) nbasis(x) && nrow(basis(x)) != 0L #' \code{hasBasis} tests whether an objects contains a coefficient matrix #' -- returned by a suitable method \code{coef} -- with at least one column. #' #' @rdname types #' @export hasCoef <- function(x) nbasis(x) && ncol(coef(x)) != 0L #' \code{is.partial.nmf} tests whether an NMF model object contains either an empty #' basis or coefficient matrix. #' It is a shorcut for \code{!hasCoef(x) || !hasBasis(x)}. #' #' @rdname types #' @export is.partial.nmf <- function(x) !hasCoef(x) || !hasBasis(x) #' Returns the target matrix estimate of the NMF model \code{x}, perturbated by #' adding a random matrix generated using the default method of \code{rmatrix}: #' it is a equivalent to \code{fitted(x) + rmatrix(fitted(x), ...)}. #' #' This method can be used to generate random target matrices that depart from #' a known NMF model to a controlled extend. #' This is useful to test the robustness of NMF algorithms to the presence of #' certain types of noise in the data. #' #' @examples #' # generate noisy fitted target from an NMF model (the true model) #' gr <- as.numeric(mapply(rep, 1:3, 3)) #' h <- outer(1:3, gr, '==') + 0 #' x <- rnmf(10, H=h) #' y <- rmatrix(x) #' \dontrun{ #' # show heatmap of the noisy target matrix: block patterns should be clear #' aheatmap(y) #' } #' \dontshow{ stopifnot( identical(dim(y), dim(x)[1:2]) ) } #' #' # test NMF algorithm on noisy data #' # add some noise to the true model (drawn from uniform [0,1]) #' res <- nmf(rmatrix(x), 3) #' summary(res) #' #' # add more noise to the true model (drawn from uniform [0,10]) #' res <- nmf(rmatrix(x, max=10), 3) #' summary(res) #' setMethod('rmatrix', 'NMF', function(x, ...){ a <- fitted(x) a + rmatrix(a, ...) } ) unit.test('rmatrix,NMF',{ x <- nmfModel(3, 20, 5) checTrue(is.matrix(y <- rmatrix(x)), "default call: no error") checkIdentical(dim(y), dim(x)[1:2], "default call: correct dimension") checkTrue( !any(is.na(basis(y))), 'default call: no NAs in basis anymore') checkTrue( !any(is.na(coef(y))), 'default call: no NAs in coef anymore') checkTrue( max( max(abs(basis(y)-basis(x))), max(abs(coef(y)-coef(x))) ) <= 1 , "default call: max difference is <= 1") set.seed(123) y <- rmatrix(x) set.seed(123) ref <- matrix(runif(nrow(x)*ncol(x)), nrow(x)) checkIdentical(ref, y - fitted(x), "default call: add uniform random noise to fitted matrix") set.seed(123) ref <- matrix(rnorm(nrow(x)*ncol(x)), nrow(x)) set.seed(123) y <- rmatrix(x, rnorm) checkIdentical(ref, y - fitted(x), "dist is taken into account: add normal random noise to fitted matrix") set.seed(123) y <- rmatrix(x, dist=rnorm) checkIdentical(ref, y - fitted(x), "dist is taken into account: add normal random noise to fitted matrix") set.seed(123) checTrue(is.matrix(y <- rmatrix(x, max=10)), "call with arg max=10: no error") checkTrue( max( max(abs(basis(y)-basis(x))), max(abs(coef(y)-coef(x))) ) <= 10 , "call with arg max=10: max difference is 10") checkTrue( max( max(abs(basis(y)-basis(x))), max(abs(coef(y)-coef(x))) ) >= 5 , "call with arg max=10: max difference is >= 5") }) ###% Produces different kind of plots. #setGeneric('plot', package='graphics') #setMethod('plot', signature( x='NMF', y='missing'), # function(x, y, type=c('hist', 'heatmap'), ...) # { # # retrieve what to plot # type = match.arg(type) # # # save graphical parameters # oldpar = par(no.readonly=TRUE) # on.exit( {par(oldpar)} ) # reset the graphical parameters on exit # # if( what == 'heatmap' ){ # #basicHM(metaprofiles(x), ...) # heatmap.2(metaprofiles(x), trace='none', ...) # } # else if( what == 'hist' ) hist(x, ...) # # } #) #setGeneric('hist', package='graphics') #setMethod('hist', signature(x='NMF'), # function(x, ref=1, alpha=20, ...) # { # stopifnot( ref >= 1 && ref <= ncol(metagenes(x)) ) # alpha = sprintf("%02d", alpha) #add leading zero to alpha if nessecary # # # save graphical parameters # oldpar = par(no.readonly=TRUE) # on.exit( {par(oldpar)} ) # reset the graphical parameters on exit # # # order genes by decreasing contribution to the reference factor # M = metagenes(x)[order(metagenes(x)[,ref], decreasing=T), ] # # #plot the contributions to the reference factor # par(lwd = 0.5) # x = seq(nrow(M)) # html.colors = apply( col2rgb( seq(ncol(M))+1 ), 2, function(x) paste("#", paste(intToHex(x), collapse=''), alpha, sep='') ) # plot(x=x, y=M[,ref], type='h' # , col=html.colors[ref], ylim=c(min(M), max(M)) # , main='Contribution to metagenes', xlab=paste('Genes ordered based on factor', ref), ylab='Contribution') # # # plot the remaining metagenes # remaining.factor = seq(ncol(M))[seq(ncol(M)) != ref] # sapply(remaining.factor, # function(f){ # lines(x=x, M[,f], type='h', col=html.colors[f]) # } # ) # # #put the legend # legend('top', legend=paste('Factor', seq(ncol(M))), fill=sub("^(#[a-f0-9]{6}).*", "\\1", html.colors, ignore.case=TRUE) ) # # invisible() # } #) ###% Utility function used to sets default elements in a list if they are ###% not already set ###% The default values are given in argument ... .set.list.defaults <- function(input.list, ...){ expand_list(input.list, ..., .exact=FALSE) } ###% Partially match arguments for a given function .match.call.args <- function(x, fun, in.fun=NULL, call=NULL){ stopifnot( is.character(fun) && length(fun) == 1 ) if( length(x) == 0 ) return(x) x.ind <- charmatch(x, args <- formalArgs(getFunction(fun))) sapply(seq(length(x)), function(i){ ind <- x.ind[i] # the argument is not part of the call: keep it unchanged if( is.na(ind) ) return(x[i]) # multiple matches: error if( ind == 0 ){ alt <- paste(grep(paste('^', x[i], sep=''), args, value=TRUE), collapse=', ') stop(if( !is.null(call) ) c(call, ' - '), "Multiple match for argument '", x[i], "' of function '" , if( is.null(in.fun) ) fun else in.fun, "' [use one of: ", alt, "]" , call.=FALSE) } # return the matched full names args[ind] }) } ###% Computes a set of measures usefull to assess the factorization's quality. ###% ###% ###% @param object a \code{NMF} object ###% @return a numeric vector of the measures. ###% #' Assessing and Comparing NMF Models #' #' @description #' The NMF package defines \code{summary} methods for different classes of objects, #' which helps assessing and comparing the quality of NMF models by computing a set #' of quantitative measures, e.g. with respect to their ability to recover known #' classes and/or the original target matrix. #' #' The most useful methods are for classes \code{\linkS4class{NMF}}, \code{\linkS4class{NMFfit}}, #' \code{\linkS4class{NMFfitX}} and \code{\linkS4class{NMFList}}, which compute summary measures #' for, respectively, a single NMF model, a single fit, a multiple-run fit and a list of heterogenous #' fits performed with the function \code{\link{nmf}}. #' #' @details #' Due to the somehow hierarchical structure of the classes mentionned in \emph{Description}, #' their respective \code{summary} methods call each other in chain, each super-class adding some #' extra measures, only relevant for objects of a specific class. #' #' @param object an NMF object. See available methods in section \emph{Methods}. #' @param ... extra arguments passed to the next \code{summary} method. #' #' @export #' @rdname assess #' @aliases summary-NMF #' #' @family assess Assessment measures for NMF models #' setGeneric('summary', package='base') #' Computes summary measures for a single NMF model. #' #' The following measures are computed: #' #' \describe{ #' \item{sparseness}{Sparseness of the factorization computed by the #' function \code{\link{sparseness}}.} #' \item{entropy}{Purity of the clustering, with respect to known classes, #' computed by the function \code{\link{purity}}.} #' \item{entropy}{Entropy of the clustering, with respect to known classes, #' computed by the function \code{\link{entropy}}.} #' \item{RSS}{Residual Sum of Squares computed by the function \code{\link{rss}}.} #' \item{evar}{Explained variance computed by the function \code{\link{evar}}.} #' } #' #' @param class known classes/cluster of samples specified in one of the formats #' that is supported by the functions \code{\link{entropy}} and \code{\link{purity}}. #' @param target target matrix specified in one of the formats supported by the #' functions \code{\link{rss}} and \code{\link{evar}} #' #' @rdname assess #' #' @examples #' #' # random NMF model #' x <- rnmf(3, 20, 12) #' summary(x) #' summary(x, gl(3, 4)) #' summary(x, target=rmatrix(x)) #' summary(x, gl(3,4), target=rmatrix(x)) #' setMethod('summary', signature(object='NMF'), function(object, class, target){ res <- numeric() ## IMPORTANT: if adding a summary measure also add it in the sorting ## schema of method NMFList::summary to allow ordering on it # rank res <- c(res, rank=nbasis(object)) # compute sparseness res <- c(res, sparseness=sparseness(object)) # if class is provided: also computes entropy and purity if( !missing(class) ){ # compute purity res <- c(res, purity=purity(object, class)) # compute entropy res <- c(res, entropy=entropy(object, class)) } # if the target is provided compute the RSS if( !missing(target) ){ RSS <- rss(object, target) res <- c(res, rss=RSS) # explained variance res <- c(res, evar=evar(object, target)) } # compute mean silhouette width siS <- silhouette(object, what = 'samples') siF <- silhouette(object, what = 'features') res <- c(res, silhouette.coef = if( !is_NA(siS) ) summary(siS)$avg.width else NA , silhouette.basis = if( !is_NA(siF) ) summary(siF)$avg.width else NA) # return result return(res) } ) #' Sparseness #' #' Generic function that computes the \emph{sparseness} of an object, as defined #' by \cite{Hoyer2004}. #' The sparseness quantifies how much energy of a vector is packed into only few components. #' #' In \cite{Hoyer2004}, the sparseness is defined for a real vector \eqn{x} as: #' \deqn{Sparseness(x) = \frac{\sqrt{n} - \frac{\sum |x_i|}{\sqrt{\sum x_i^2}}}{\sqrt{n}-1}}{ #' (srqt(n) - ||x||_1 / ||x||_2) / (sqrt(n) - 1)} #' #' , where \eqn{n} is the length of \eqn{x}. #' #' The sparseness is a real number in \eqn{[0,1]}. #' It is equal to 1 if and only if \code{x} contains a single nonzero component, #' and is equal to 0 if and only if all components of \code{x} are equal. #' It interpolates smoothly between these two extreme values. #' The closer to 1 is the sparseness the sparser is the vector. #' #' The basic definition is for a \code{numeric} vector, and is extended for matrices as the #' mean sparseness of its column vectors. #' #' @param x an object whose sparseness is computed. #' @param ... extra arguments to allow extension #' #' @return usually a single numeric value -- in [0,1], or a numeric vector. #' See each method for more details. #' #' @export #' @family assess setGeneric('sparseness', function(x, ...) standardGeneric('sparseness') ) #' Base method that computes the sparseness of a numeric vector. #' #' It returns a single numeric value, computed following the definition #' given in section \emph{Description}. setMethod('sparseness', signature(x='numeric'), function(x){ # get length of x n <- length(x) # compute and return the sparseness ( sqrt(n) - sum(abs(x)) / sqrt(sum(x^2)) ) / (sqrt(n)-1) } ) #' Computes the sparseness of a matrix as the mean sparseness of its column vectors. #' It returns a single numeric value. setMethod('sparseness', signature(x='matrix'), function(x){ # compute the sparseness of each column s <- apply(x, 2, sparseness) # return the mean sparseness mean(s) } ) #' Compute the sparseness of an object of class \code{NMF}, as the sparseness of #' the basis and coefficient matrices computed separately. #' #' It returns the two values in a numeric vector with names \sQuote{basis} and \sQuote{coef}. setMethod('sparseness', signature(x='NMF'), function(x){ # return the sparseness of the basis and coef matrix c(basis=sparseness(basis(x)), coef=sparseness(coef(x))) } ) #' Purity and Entropy of a Clustering #' #' The functions \code{purity} and \code{entropy} respectively compute the purity and the entropy #' of a clustering given \emph{a priori} known classes. #' #' The purity and entropy measure the ability of a clustering method, to recover #' known classes (e.g. one knows the true class labels of each sample), that are #' applicable even when the number of cluster is different from the number of known classes. #' \cite{KimH2007} used these measures to evaluate the performance of their alternate least-squares #' NMF algorithm. #' #' @details #' Suppose we are given \eqn{l} categories, while the clustering method generates #' \eqn{k} clusters. #' #' The purity of the clustering with respect to the known categories is given by: #' \deqn{Purity = \frac{1}{n} \sum_{q=1}^k \max_{1 \leq j \leq l} n_q^j} , #' #' where: #' \itemize{ #' \item \eqn{n} is the total number of samples; #' \item \eqn{n_q^j} is the number of samples in cluster \eqn{q} that belongs to #' original class \eqn{j} (\eqn{1 \leq j \leq l}). #' } #' #' The purity is therefore a real number in \eqn{[0,1]}. #' The larger the purity, the better the clustering performance. #' #' @param x an object that can be interpreted as a factor or can generate such an object, e.g. via #' a suitable method \code{\link{predict}}, which gives the cluster membership for each sample. #' @param y a factor or an object coerced into a factor that gives the true class labels for each sample. #' It may be missing if \code{x} is a contingency table. #' @param ... extra arguments to allow extension, and usually passed to the next method. #' #' @return a single numeric value #' @family assess #' @export #' #' @examples #' # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) #' n <- 50; counts <- c(5, 5, 8); #' V <- syntheticNMF(n, counts) #' cl <- unlist(mapply(rep, 1:3, counts)) #' #' # perform default NMF with rank=2 #' x2 <- nmf(V, 2) #' purity(x2, cl) #' entropy(x2, cl) #' # perform default NMF with rank=2 #' x3 <- nmf(V, 3) #' purity(x3, cl) #' entropy(x3, cl) #' setGeneric('purity', function(x, y, ...) standardGeneric('purity') ) #' Computes the purity directly from the contingency table \code{x} setMethod('purity', signature(x='table', y='missing'), function(x, y){ #for each cluster: compute maximum number of samples common to a class t <- apply(x, 1, max) # average and return the result sum(t) / sum(x) } ) #' Computes the purity on the contingency table of \code{x} and \code{y}, that is #' coerced into a factor if necessary. setMethod('purity', 'factor', function(x, y, ...){ # coerce `y` into a factor if necessary if( !is.factor(y) ) y <- as.factor(y) #compute the purity on the contingency table between clusters and true classes (clusters are in rows) purity(table(x, y), ...) } ) #' Default method that should work for results of clustering algorithms, that have a #' suitable \code{predict} method that returns the cluster membership vector: #' the purity is computed between \code{x} and \code{predict{y}} setMethod('purity', 'ANY', function(x, y, ...){ # compute the purity for the samples clusters defined by the profiles purity(predict(x), y, ...) } ) #' Entropy of a Clustering #' #' @details #' The entropy of the clustering with respect to the known categories is given by: #' \deqn{Entropy = - \frac{1}{n \log_2 l} \sum_{q=1}^k \sum_{j=1}^l n_q^j #' \log_2 \frac{n_q^j}{n_q}}{ #' - 1/(n log2(l) ) sum_q sum_j n(q,j) log2( n(q,j) / n_q )}, #' #' where: #' \itemize{ #' \item \eqn{n} is the total number of samples; #' \item \eqn{n}{n_q} is the total number of samples in cluster \eqn{q} (\eqn{1 \leq q \leq k}); #' \item \eqn{n_q^j}{n(q,j)} is the number of samples in cluster \eqn{q} that belongs to #' original class \eqn{j} (\eqn{1 \leq j \leq l}). #' } #' #' The smaller the entropy, the better the clustering performance. #' @inheritParams purity #' #' @return the entropy (i.e. a single numeric value) #' @family assess #' @rdname purity #' @export #' setGeneric('entropy', function(x, y, ...) standardGeneric('entropy') ) #' Computes the purity directly from the contingency table \code{x}. #' #' This is the workhorse method that is eventually called by all other methods. setMethod('entropy', signature(x='table', y='missing'), function(x, y, ...){ #for each cluster: compute the inner sum t <- apply(x, 1, function(n){ c.size <- sum(n); n %*% ifelse( n!=0, log2(n/c.size), 0)} ) # weight and return the result - sum(t) / ( sum(x) * log2(ncol(x)) ) } ) #' Computes the purity on the contingency table of \code{x} and \code{y}, that is #' coerced into a factor if necessary. setMethod('entropy', 'factor', function(x, y, ...){ # coerce `y` into a factor if necessary if( !is.factor(y) ) y <- as.factor(y) #copmute entropy on contingency table between clusters and true classes (clusters are in rows) entropy(table(x, y)) } ) #' Default method that should work for results of clustering algorithms, that have a #' suitable \code{predict} method that returns the cluster membership vector: #' the purity is computed between \code{x} and \code{predict{y}} setMethod('entropy', 'ANY', function(x, y, ...){ # compute the entropy for the samples clusters defined by the metagenes expression matrix entropy(predict(x), y) } ) ###% Extract the genes that characterize each factor. ###% ###% For each factor the genes are first sorted by decreasing contribution. The first successive ones whose contribution to the factor ###% is greater than their contribution to all other metagenes are selected. ###% ###% @param x the matrix of metagenes. That is a matrix with metagenes in column, genes in row, contain the genes' contribution to each factor ###% @return a list with number of metagenes elements, each being a vector containing the indexes of the characterizing genes #setGeneric('computeContrib', function(x, ...) standardGeneric('computeContrib') ) #setMethod('computeContrib', signature(x='matrix'), # function(x, ...){ # # determine the specific genes for each factor # lapply(1:ncol(x), # function(i){ # g <- x[,i] # #order by decreasing contribution to factor i # index.sort <- order(g, decreasing=TRUE) # # for( k in seq_along(index.sort) ) # { # index <- index.sort[k] # #if the gene contributes more to any other factor then return the genes above it # if( any(x[index,-i] >= g[index]) ) # { # if( k == 1 ) return(NULL) # else return(rownames(x)[index.sort[1:(k-1)]]) # } # } # # # all genes are meeting the criteria # rownames(x) # }) # } #) # #' Apply Function for NMF Objects #' #' The function \code{nmfApply} provides exteneded \code{apply}-like #' functionality for objects of class \code{NMF}. #' It enables to easily apply a function over different margins of #' NMF models. #' #' The function \code{FUN} is applied via a call to \code{\link{apply}} #' or \code{\link{sapply}} according to the value of argument \code{MARGIN} #' as follows: #' #' \describe{ #' \item{MARGIN=1}{ apply \code{FUN} to each \emph{row} of the basis matrix: #' \code{apply(basis(X), 1L, FUN, ...)}.} #' #' \item{MARGIN=2}{ apply \code{FUN} to each \emph{column} of the coefficient matrix: #' \code{apply(coef(X), 2L, FUN, ...)}.} #' #' \item{MARGIN=3}{ apply \code{FUN} to each \emph{pair} of associated basis component #' and basis profile: #' more or less \code{sapply(seq(nbasis(X)), function(i, ...) FUN(basis(X)[,i], coef(X)[i, ], ...), ...)}. #' #' In this case \code{FUN} must be have at least two arguments, to which are passed #' each basis components and basis profiles respectively -- as numeric vectors.} #' #' \item{MARGIN=4}{ apply \code{FUN} to each \emph{column} of the basis matrix, i.e. to each #' basis component: #' \code{apply(basis(X), 2L, FUN, ...)}.} #' #' \item{MARGIN=5}{ apply \code{FUN} to each \emph{row} of the coefficient matrix: #' \code{apply(coef(X), 1L, FUN, ...)}.} #' #' } #' #' #' @param X an object that has suitable \code{\link{basis}} and \code{coef} methods, #' e.g. an NMF model. #' @param MARGIN a single numeric (integer) value that specifies over which margin(s) #' the function \code{FUN} is applied. #' See section \emph{Details} for a list of possible values. #' @param FUN a function to apply over the specified margins. #' @param ... extra arguments passed to \code{FUN} #' @param simplify a logical only used when \code{MARGIN=3}, that indicates if \code{sapply} #' should try to simplify result if possible. #' Since this argument follows \sQuote{...} its name cannot be abbreviated. #' @param USE.NAMES a logical only used when \code{MARGIN=3}, that indicates if \code{sapply} #' should use the names of the basis components to name the results if present. #' Since this argument follows \sQuote{...} its name cannot be abbreviated. #' #' @return a vector or a list. #' See \code{\link[base]{apply}} and \code{\link[base]{sapply}} for more details on #' the output format. #' #' @export #setGeneric('nmfApply', function(object, ...) standardGeneric('nmfApply') ) nmfApply <- function(X, MARGIN, FUN, ..., simplify = TRUE, USE.NAMES = TRUE){ if( MARGIN == 1L ) apply(basis(X), 1L, FUN, ...) else if( MARGIN == 4L ) apply(basis(X), 2L, FUN, ...) else if( MARGIN == 2L ) apply(coef(X), 2L, FUN, ...) else if( MARGIN == 5L ) apply(coef(X), 1L, FUN, ...) else if( MARGIN == 3L ){ b <- basis(X) p <- coef(X) sapply(setNames(seq(nbasis(X), basisnames(X))) , function(i, ...) FUN(b[,i], p[i,], ...) , simplify = simplify, USE.NAMES = USE.NAMES) }else stop("invalid argument 'MARGIN' (expected values are: 1-basis rows, 2-coef columns, 3-(basis columns, coef rows), or 4-basis columns or 5-coef rows)") } ###% Utility function to compute the dominant column for each row for a matrix. .predict.nmf <- function(x, prob=FALSE){ if( !is.matrix(x) ) stop('NMF:::.predict.nmf : only works on matrices') if( !prob ){ #for each column return the (row) index of the maximum return( as.factor(apply(x, 1L, function(v) which.max(abs(v)))) ) } else{ #for each column return the (row) index of the maximum AND the associated probaility res <- apply(x, 1L, function(p){ p <- abs(p) i <- which.max(p) c(i, p[i]/sum(p)) } ) # return the result as a list of two elements return( list(predict=as.factor(res[1,]), prob=res[2,]) ) } } #' Clustering and Prediction #' #' The methods \code{predict} for NMF models return the cluster membership #' of each sample or each feature. #' Currently the classification/prediction of new data is not implemented. #' #' The cluster membership is computed as the index of the dominant basis #' component for each sample (\code{what='samples' or 'columns'}) or each feature #' (\code{what='features' or 'rows'}), based on their corresponding #' entries in the coefficient matrix or basis matrix respectively. #' #' For example, if \code{what='samples'}, then the dominant basis component #' is computed for each column of the coefficient matrix as the row index #' of the maximum within the column. #' #' If argument \code{prob=FALSE} (default), the result is a \code{factor}. #' Otherwise a list with two elements is returned: element \code{predict} #' contains the cluster membership index (as a \code{factor}) and element #' \code{prob} contains the relative contribution of #' the dominant component to each sample (resp. the relative contribution of #' each feature to the dominant basis component): #' #' \itemize{ #' \item Samples: \deqn{p_j = x_{k_0} / \sum_k x_k}{p(j) = x(k0) / sum_k x(k)}, #' for each sample \eqn{1\leq j \leq p}, where \eqn{x_k}{x(k)} is the contribution #' of the \eqn{k}-th basis component to \eqn{j}-th sample (i.e. \code{H[k ,j]}), and #' \eqn{x_{k_0}}{x(k0)} is the maximum of these contributions. #' #' \item Features: \deqn{p_i = y_{k_0} / \sum_k y_k}{p(i) = y(k0) / sum_k y(k)}, #' for each feature \eqn{1\leq i \leq p}, where \eqn{y_k}{y(k)} is the contribution #' of the \eqn{k}-th basis component to \eqn{i}-th feature (i.e. \code{W[i, k]}), and #' \eqn{y_{k_0}}{y(k0)} is the maximum of these contributions. #' #' } #' #' @param object an NMF model #' #' @family stats Methods for the Interface Defined in Package stats #' #' @cite Brunet2004,Pascual-Montano2006 #' @export setGeneric('predict', package='stats') #' Default method for NMF models #' #' @param what a character string that indicates the type of cluster membership should #' be returned: \sQuote{columns} or \sQuote{rows} for clustering the colmuns or the #' rows of the target matrix respectively. #' The values \sQuote{samples} and \sQuote{features} are aliases for \sQuote{colmuns} #' and \sQuote{rows} respectively. #' @param prob logical that indicates if the relative contributions of/to the dominant #' basis component should be computed and returned. See \emph{Details}. #' @param dmatrix logical that indicates if a dissimiliarity matrix should be #' attached to the result. #' This is notably used internally when computing NMF clustering silhouettes. #' #' @examples #' #' # random target matrix #' v <- rmatrix(20, 10) #' # fit an NMF model #' x <- nmf(v, 5) #' #' # predicted column and row clusters #' predict(x) #' predict(x, 'rows') #' #' # with relative contributions of each basis component #' predict(x, prob=TRUE) #' predict(x, 'rows', prob=TRUE) #' setMethod('predict', 'NMF', function(object, what=c('columns', 'rows', 'samples', 'features'), prob=FALSE, dmatrix = FALSE){ # determine which matrix to use for the prediction what <- match.arg(what) x <- if( what %in% c('features', 'rows') ) basis(object, all=FALSE) else t(coef(object, all=FALSE)) # compute the indice of the dominant row for each column res <- .predict.nmf(x, prob) # attach dissimilarity matrix if requested if( dmatrix ){ attr(res, 'dmatrix') <- 1 - cor(t(x)) } return( res ) } ) ####% Compute the dominant column for each row. ####% ####% @param x a matrix containing the mixture coefficients (basis vector in rows, samples in columns) ####% @return a factor of length the number of columns, giving the dominant column for each row ####% @note This function is now deprecated #setGeneric('clusters', function(object, newdata, ...) standardGeneric('clusters') ) ####% Compute the dominant metagene for each sample. ####% ####% @param x a NMF object ####% @return a factor of length the number of samples, giving the dominant metagene for each sample ####% @note This function is now deprecated #setMethod('clusters', signature(object='NMF', newdata='missing'), # function(object, newdata, ...){ # predict(object, ...) # } #) #' Correlations in NMF Models #' #' \code{basiscor} computes the correlation matrix between basis vectors, i.e. #' the \emph{columns} of its basis matrix -- which is the model's first matrix factor. #' #' @details #' Each generic has methods defined for computing correlations between NMF models #' and/or compatible matrices. #' The computation is performed by the base function \code{\link{cor}}. #' #' @param x a matrix or an object with suitable methods \code{\link{basis}} #' or \code{\link{coef}}. #' @param y a matrix or an object with suitable methods \code{\link{basis}} #' or \code{\link{coef}}, and dimensions compatible with \code{x}. #' If missing the correlations are computed between \code{x} and \code{y=x}. #' @param ... extra arguments passed to \code{\link{cor}}. #' #' @export #' @family NMFplots Plotting functions for NMF objects #' #' @examples #' #' # generate two random NMF models #' a <- rnmf(3, 100, 20) #' b <- rnmf(3, 100, 20) #' #' # Compute auto-correlations #' basiscor(a) #' profcor(a) #' # Compute correlations with b #' basiscor(a, b) #' profcor(a, b) #' #' # try to recover the underlying NMF model 'a' from noisy data #' res <- nmf(fitted(a) + rmatrix(a), 3) #' #' # Compute correlations with the true model #' basiscor(a, res) #' profcor(a, res) #' #' # Compute correlations with a random compatible matrix #' W <- rmatrix(basis(a)) #' basiscor(a, W) #' identical(basiscor(a, W), basiscor(W, a)) #' #' H <- rmatrix(coef(a)) #' profcor(a, H) #' identical(profcor(a, H), profcor(H, a)) #' setGeneric('basiscor', function(x, y, ...) standardGeneric('basiscor') ) #' Computes the correlations between the basis vectors of \code{x} and #' the columns of \code{y}. setMethod('basiscor', signature(x='NMF', y='matrix'), function(x, y, ...){ cor(basis(x), y, ...) } ) #' Computes the correlations between the columns of \code{x} #' and the the basis vectors of \code{y}. setMethod('basiscor', signature(x='matrix', y='NMF'), function(x, y, ...){ cor(x, basis(y), ...) } ) #' Computes the correlations between the basis vectors of \code{x} and \code{y}. setMethod('basiscor', signature(x='NMF', y='NMF'), function(x, y, ...){ basiscor(x, basis(y), ...) } ) #' Computes the correlations between the basis vectors of \code{x}. setMethod('basiscor', signature(x='NMF', y='missing'), function(x, y, ...){ basiscor(x, x, ...) } ) #' Correlations of Basis Profiles #' #' \code{profcor} computes the correlation matrix between basis profiles, #' i.e. the \emph{rows} of the coefficient matrix -- which is the model's second #' matrix factor. #' #' @rdname basiscor #' @export #' setGeneric('profcor', function(x, y, ...) standardGeneric('profcor') ) #' Computes the correlations between the basis profiles of \code{x} and #' the rows of \code{y}. setMethod('profcor', signature(x='NMF', y='matrix'), function(x, y, ...){ cor(t(coef(x)), t(y), ...) } ) #' Computes the correlations between the rows of \code{x} and the basis #' profiles of \code{y}. setMethod('profcor', signature(x='matrix', y='NMF'), function(x, y, ...){ cor(t(x), t(coef(y)), ...) } ) #' Computes the correlations between the basis profiles of \code{x} and \code{y}. setMethod('profcor', signature(x='NMF', y='NMF'), function(x, y, ...){ profcor(x, coef(y), ...) } ) #' Computes the correlations between the basis profiles of \code{x}. setMethod('profcor', signature(x='NMF', y='missing'), function(x, y, ...){ profcor(x, x, ...) } ) #' Clustering Connectivity and Consensus Matrices #' #' \code{connectivity} is an S4 generic that computes the connectivity matrix #' based on the clustering of samples obtained from a model's \code{\link{predict}} #' method. #' #' The connectivity matrix of a given partition of a set of samples (e.g. given #' as a cluster membership index) is the matrix \eqn{C} containing only 0 or 1 #' entries such that: #' \deqn{C_{ij} = \left\{\begin{array}{l} #' 1\mbox{ if sample }i\mbox{ belongs to the same cluster as sample }j\\ #' 0\mbox{ otherwise} #' \end{array}\right..}{ #' C_{ij} = 1 if sample i belongs to the same cluster as sample j, 0 otherwise} #' #' @param object an object with a suitable \code{\link{predict}} method. #' @param ... extra arguments to allow extension. #' They are passed to \code{\link{predict}}, except for the \code{vector} and #' \code{factor} methods. #' #' @return a square matrix of dimension the number of samples in the model, full #' of 0s or 1s. #' #' @seealso \code{\link{predict}} #' #' @export #' setGeneric('connectivity', function(object, ...) standardGeneric('connectivity') ) #' Default method which computes the connectivity matrix #' using the result of \code{predict(x, ...)} as cluster membership index. #' #' @examples #' #' # clustering of random data #' h <- hclust(dist(rmatrix(10,20))) #' connectivity(cutree(h, 2)) #' setMethod('connectivity', 'ANY', function(object, ...){ c <- predict(object, ...); outer(c, c, function(x,y) ifelse(x==y, 1,0)); } ) #' Computes the connectivity matrix using \code{x} as cluster membership index. #' #' @examples #' connectivity(gl(2, 4)) #' setMethod('connectivity', 'factor', function(object, ...){ outer(object, object, function(x,y) ifelse(x==y, 1,0)); } ) #' Equivalent to \code{connectivity(as.factor(x))}. setMethod('connectivity', 'numeric', function(object, ...){ connectivity(as.factor(object), ...) } ) #' Computes the connectivity matrix for an NMF model, for which cluster #' membership is given by the most contributing basis component in each sample. #' See \code{\link{predict}}. #' #' @param no.attrib a logical that indicates if attributes containing information #' about the NMF model should be attached to the result (\code{TRUE}) or not #' (\code{FALSE}). #' setMethod('connectivity', 'NMF', function(object, no.attrib=FALSE){ C <- callNextMethod(object=object, what='samples'); if( !no.attrib ){ class(C) <- c(class(C), 'NMF.consensus') attr(C, 'model') <- object attr(C, 'nrun') <- 1 attr(C, 'nbasis') <- nbasis(object) } C } ) # Unit test unit.test(connectivity,{ # build reference matrix n <- 10 ref <- matrix(0, 2*n, 2*n) ref[1:n,1:n] <- 1 ref[(n+1):(2*n),(n+1):(2*n)] <- 1 checkIdentical(connectivity(gl(2, n)), ref, 'Factor') checkIdentical(connectivity(as.numeric(gl(2, n))), ref, 'Vector') # test with NMF model i <- gl(2, n) x <- nmfModel(H=matrix(c(rev(i), i), 2, byrow=TRUE)) checkEquals(connectivity(x), ref, 'NMF model', check.attributes = FALSE) s <- sample.int(2*n) checkEquals(connectivity(x[,s]), ref[s,s], 'NMF model (shuffled)', check.attributes = FALSE) }) #' Residual Sum of Squares and Explained Variance #' #' \code{rss} and \code{evar} are S4 generic functions that respectively computes #' the Residual Sum of Squares (RSS) and explained variance achieved by a model. #' #' @param object an R object with a suitable \code{\link{fitted}}, \code{rss} or #' \code{evar} method. #' @param ... extra arguments to allow extension, e.g. passed to \code{rss} #' in \code{evar} calls. #' #' @return a single numeric value #' @export #' setGeneric('rss', function(object, ...) standardGeneric('rss')) #' Computes the RSS between a target matrix and its estimate \code{object}, #' which must be a matrix of the same dimensions as \code{target}. #' #' The RSS between a target matrix \eqn{V} and its estimate \eqn{v} is computed as: #' \deqn{RSS = \sum_{i,j} (v_{ij} - V_{ij})^2} #' #' Internally, the computation is performed using an optimised C++ implementation, #' that is light in memory usage. #' #' @param target target matrix #' #' @examples #' # RSS bewteeen random matrices #' x <- rmatrix(20,10, max=50) #' y <- rmatrix(20,10, max=50) #' rss(x, y) #' rss(x, x + rmatrix(x, max=0.1)) #' setMethod('rss', 'matrix', function(object, target){ # make sure the target is provided if( missing(target) ) stop("NMF::rss - Argument 'target' is missing and required to compute the residual sum of squares.") # use the expression matrix if necessary if( inherits(target, 'ExpressionSet') ){ # requires Biobase if( !require.quiet("Biobase") ) stop("NMF::rss - The 'Biobase' package is required to extract expression data from 'ExpressionSet' objects [see ?'nmf-bioc']") target <- Biobase::exprs(target) }else if( is.data.frame(target) ) target <- as.matrix(target) # return rss using the optimized C function .rss(object,target) } ) #' Residual sum of square between a given target matrix and a model that has a #' suitable \code{\link{fitted}} method. #' It is equivalent to \code{rss(fitted(object), ...)} #' #' In the context of NMF, \cite{Hutchins2008} used the variation of the RSS #' in combination with the algorithm from \cite{Lee1999} to estimate the #' correct number of basis vectors. #' The optimal rank is chosen where the graph of the RSS first shows an inflexion #' point, i.e. using a screeplot-type criterium. #' See section \emph{Rank estimation} in \code{\link{nmf}}. #' #' Note that this way of estimation may not be suitable for all models. #' Indeed, if the NMF optimisation problem is not based on the Frobenius norm, #' the RSS is not directly linked to the quality of approximation of the NMF model. #' However, it is often the case that it still decreases with the rank. #' #' @examples #' # RSS between an NMF model and a target matrix #' x <- rmatrix(20, 10) #' y <- rnmf(3, x) # random compatible model #' rss(y, x) #' #' # fit a model with nmf(): one should do better #' y2 <- nmf(x, 3) # default minimizes the KL-divergence #' rss(y2, x) #' y2 <- nmf(x, 3, 'lee') # 'lee' minimizes the RSS #' rss(y2, x) #' setMethod('rss', 'ANY', function(object, ...){ rss(fitted(object), ...) } ) unit.test(rss, { x <- rmatrix(20,10, max=50) y <- rmatrix(20,10, max=50) checkIdentical(rss(x, y), sum((x-y)^2), "Random matrices") y <- rnmf(3, x) # random compatible model r1 <- rss(y, x) checkIdentical(r, sum((x-fitted(y))^2), 'NMF model') checkIdentical(rss(y, Biobase::ExpressionSet(x)), sum((x-fitted(y))^2), 'NMF model (ExpressionSet)') y <- nmf(x, 3) r2 <- rss(y, x) checkIdentical(r2, sum((x-fitted(y))^2), 'Fitted NMF model') checkTrue(r2 < r1, 'Fitted NMF model has better RSS') y <- nmf(x, 3, 'lee') checkTrue(rss(y, x) < r2, "Fitted NMF model with 'lee' has better RSS than 'brunet'") }) #' Explained Variance #' #' The explained variance for a target \eqn{V} is computed as: #' \deqn{evar = 1 - \frac{RSS}{\sum_{i,j} v_{ij}^2} }{evar = 1 - RSS/sum v_{ij}^2}, #' #' where RSS is the residual sum of squares. #' #' The explained variance is usefull to compare the performance of different #' models and their ability to accurately reproduce the original target matrix. #' Note, however, that a possible caveat is that some models explicitly aim at #' minimizing the RSS (i.e. maximizing the explained variance), while others do not. #' #' @rdname rss #' @export #' setGeneric('evar', function(object, ...) standardGeneric('evar')) #' Default method for \code{evar}. #' #' It requires a suitable \code{rss} method to be defined #' for \code{object}, as it internally calls \code{rss(object, target, ...)}. setMethod('evar', 'ANY', function(object, target, ...){ # make sure the target is provided if( missing(target) ) stop("NMF::evar - Argument 'target' is missing and required to compute the explained variance.") # use the expression matrix if necessary if( inherits(target, 'ExpressionSet') ){ # requires Biobase if( !require.quiet("Biobase") ) stop("NMF::evar - The 'Biobase' package is required to extract expression data from 'ExpressionSet' objects [see ?'nmf-bioc']") target <- Biobase::exprs(target) } t <- as.numeric(target) 1 - rss(object, target, ...) / sum(t^2) } ) #' Distances and Objective Functions #' #' The NMF package defines methods for the generic \code{deviance} from the package \code{stats}, #' to compute approximation errors between NMF models and matrices, using a variety of #' objective functions. #' #' @return \code{deviance} returns a nonnegative numerical value #' @family stats #' #' @export setGeneric('deviance', package='stats') #' Computes the distance between a matrix and the estimate of an \code{NMF} model. #' #' @param y a matrix compatible with the NMF model \code{object}, i.e. \code{y} #' must have the same dimension as \code{fitted(object)}. #' @param method a character string or a function with signature #' \code{(x="NMF", y="matrix", ...)} that implements a distance measure between #' an NMF model \code{x} and a target matrix \code{y}, i.e. an objective function #' to use to compute the deviance. #' In \code{deviance}, it is passed to \code{nmfDistance} to get the function #' that effectively computes the deviance. #' @param ... extra parameters passed to the objective function. #' #' @family stats #' setMethod('deviance', 'NMF', function(object, y, method=c('', 'KL', 'euclidean'), ...){ fun <- nmfDistance(method) if( is.null(fun) ){ warning('Undefined distance method: distance cannot be computed [returned NA]') return(as.numeric(NA)) } # extract expression data from ExpressionSet objects if( is(y, 'ExpressionSet') ) y <- Biobase::exprs(y) # apply the function and return the result fun(object, y, ...) } ) #' \code{nmfDistance} returns a function that computes the distance between an NMF model and a #' compatible matrix. #' #' @return \code{nmfDistance} returns a function with least two arguments: #' an NMF model and a matrix. #' #' @export #' @rdname deviance nmfDistance <- function(method=c('', 'KL', 'euclidean')){ #message('compute distance') # determinate the distance measure to use if( is.null(method) ) return(NULL) if( is.character(method) ){ errMeth <- try(method <- match.arg(method), silent=TRUE) # if the method is not predefined, try to find a function with the given name if( inherits(errMeth, 'try-error') ){ #TODO: this is not working with local functions if( is.character(method) ){ errFun <- try(fun <- match.fun(method), silent=TRUE) if( inherits(errFun, 'try-error') ) stop("Could not find distance measure '", method, "':\n\t- not a predefined measures -> ", errMeth,"\t- not a function -> ", errFun) } else fun <- method if( !is.function(fun) ) stop('Invalid distance measure: should be a character string or a valid function definition') } else{ # compute and return the distance measure fun <- switch(method, euclidean = function(x, y, ...){ # call optimized C function .rss(y, fitted(x))/2 }, KL = function(x, y, ...){ # call optimized C function .KL(y, fitted(x)) } ) } } else if( is.function(method) ) fun <- method else stop('Invalid distance measure: should be a character string or a valid function definition') # return the distance function fun } #' Testing Equality of NMF Models #' #' The function \code{nmf.equal} tests if two NMF models are the same, i.e. they #' contain -- almost -- identical data: same basis and coefficient matrices, as #' well as same extra parameters. #' #' @details #' \code{nmf.equal} compares two NMF models, and return \code{TRUE} iff they are #' identical acording to the function \code{\link{identical}} when \code{identical=TRUE}, #' or equal up to some tolerance acording to the function \code{\link{all.equal}}. #' This means that all data contained in the objects are compared, which includes #' at least the basis and coefficient matrices, as well as the extra parameters #' stored in slot \sQuote{misc}. #' #' If extra arguments are specified in \code{...}, then the comparison is performed #' using \code{\link{all.equal}}, irrespective of the value of argument \code{identical}. #' #' @param x an NMF model or an object that is associated with an NMF model, e.g. #' the result from a fit with \code{\link{nmf}}. #' @param y an NMF model or an object that is associated with an NMF model, e.g. #' the result from a fit with \code{\link{nmf}}. #' @param identical a logical that indicates if the comparison should be made #' using the function \code{\link{identical}} (\code{TRUE}) or \code{\link{all.equal}} #' (\code{FALSE}). See description for method \code{nmf.equal,NMF,NMF}. #' @param ... extra arguments to allow extension, and passed to subsequent calls #' #' @export #' setGeneric('nmf.equal', function(x, y, ...) standardGeneric('nmf.equal') ) #' Compares two NMF models. #' #' Arguments in \code{...} are used only when \code{identical=FALSE} and are #' passed to \code{all.equal}. setMethod('nmf.equal', signature(x='NMF', y='NMF'), function(x, y, identical=TRUE, ...){ dots <- list(...) if( identical && length(dots) == 0 ) identical(x, y) else all.equal(x, y, ...) } ) # Match and Order Basis Components # # match.basis <- function(object, return.table=FALSE){ # compute the contingency table #pcmap <- predict(object, 'cmap') # build the tree from consensus matrix h <- hclust(as.dist(1-consensus(object)), method='average') # extract membership from the tree cl <- cutree(h, k=nbasis(object)) # change the class indexed to match the order of the consensus clusters cl <- match(cl, unique(cl[h$order])) pcmap <- as.factor(cl) occ <- table(consensus=pcmap, fit=predict(object)) # add names if present # if( !is.null(basisnames(object)) ){ # rownames(occ) <- colnames(occ) <- basisnames(object) # } # for each estimated component look for the maximum agreement T.tmp <- occ res <- rep(0, ncol(T.tmp)) for( i in 1:ncol(T.tmp) ){ # get the row and column index of the maximum over the remaining entries xm <- which.max(T.tmp)-1 jm <- xm %/% nrow(T.tmp) + 1 im <- xm - (jm-1) * nrow(T.tmp) + 1 # assign the estimate row to the inferred reference column stopifnot( res[im]==0 ) res[im] <- jm # erase the assigned estimate row T.tmp[im,] <- NA # erase the assigned reference column T.tmp[,jm] <- NA } # return the mapping as an integer vector res <- as.integer(res) if( return.table ) res <- list(match=res, table=occ) # return result res } NMF/R/heatmaps.R0000644000176200001440000004403114333176413013027 0ustar liggesusers# Heatmap functions # # Author: Renaud Gaujoux ############################################################################### #' @include NMF-class.R #' @include aheatmap.R NULL #' @param object an R object #' @param ... other arguments #' #' @export #' @inline #' @rdname NMF-defunct setGeneric('metaHeatmap', function(object, ...) standardGeneric('metaHeatmap') ) #' Defunct method substituted by \code{\link{aheatmap}}. setMethod('metaHeatmap', signature(object='matrix'), function(object, ...){ local <- function(object, type=c('plain', 'consensus'), class , unit.scaling=c('none', 'row', 'column'), palette="YlOrRd" , rev.palette=FALSE, show.prediction=TRUE, ...){ .Defunct('metaHeatmap', 'NMF', "The S4 method 'metaHeatmap,matrix' is defunct, use 'aheatmap' instead.") # # load libary RColorBrewer # library(RColorBrewer) # # # retreive the graphical parameters and match them to the sub-sequent call to 'heatmap.plus.2' # graphical.params <- list(...) # names(graphical.params) <- .match.call.args(names(graphical.params), 'heatmap.plus.2', in.fun='metaHeatmap', call='NMF::metaHeatmap') # # type <- match.arg(type) # if( type == 'consensus' ){ # # set default graphical parameters for type 'consensus' # graphical.params <- .set.list.defaults(graphical.params # , distfun = function(x){ as.dist(1-x) } # , main='Consensus matrix' # , symm=TRUE # , Rowv=TRUE # , revC=TRUE # ) # # if( missing(palette) ) palette <- 'RdYlBu' # if( missing(rev.palette) ) rev.palette <- TRUE # if( missing(unit.scaling) ) unit.scaling <- 'none' # show.prediction <- FALSE # not used for consensus matrices # } # # # apply unit scaling if necessary # unit.scaling <- match.arg(unit.scaling) # if( unit.scaling == 'column' ) # object <- apply(object, 2, function(x) x/sum(x)) # else if ( unit.scaling == 'row' ) # object <- t(apply(object, 1, function(x) x/sum(x))) # # # check validity of palette # col.palette <- brewer.pal(brewer.pal.info[palette,'maxcolors'],palette) # if( rev.palette ) col.palette <- rev(col.palette) # # # set default graphical parameters (if those are not already set) # graphical.params <- .set.list.defaults(graphical.params # , cexRow=0.8, cexCol=0.8 # , hclustfun = function(m) hclust(m,method="average") # , dendrogram='none' # , col=col.palette # , scale='none', trace="none" # , keysize=1, margins=c(5,10) # ) # # # if a known class is provided, add a side color over the top row # if( !missing(class) ){ # if( !is.factor(class) ) class <- as.factor(class) # class.num <- as.numeric(class) # legend.pal <- palette(rainbow(max(2,nlevels(class))))[1:nlevels(class)] # col.matrix <- matrix(legend.pal[class.num], ncol(object), 1) # # # show association with metagenes # if( show.prediction ){ # # only if there is less than 9 metagenes # # cf. limitation of brewer color palette # if( nrow(object) <= 9 ){ # prediction <- .predict.nmf(object) # prediction.num <- as.numeric(prediction) # pal.pred <- brewer.pal(max(3,nrow(object)),'Set2')[1:nrow(object)] # col.matrix <- cbind(pal.pred[prediction.num], col.matrix) # graphical.params <- .set.list.defaults(graphical.params # , RowSideColors=pal.pred # ) # } # else warning("NMF::metaHeatmap - cannot not show prediction for more than 9 metagenes.") # } # # do that otherwise heatmap.plus complains # if( ncol(col.matrix) < 2 ) # col.matrix <- cbind(col.matrix, col.matrix) # # # add the ColSideColors # graphical.params <- .set.list.defaults(graphical.params # , ColSideColors=col.matrix # ) # } # # # res.heatmap <- do.call('heatmap.plus.2', c(list(object), graphical.params)) # # if( !missing(class) ){ # # order properly the legend boxes # class.num <- as.numeric(class[res.heatmap$colInd]) # # occ <- NA # will store the current number of occurences # class.max.occ <- rep(0, nlevels(class)) # will store the current maximum number of occurences per class # class.start <- rep(NA, nlevels(class)) # will store the current start of the longer stretch per class # last.l <- '' # sapply( seq(length(class.num), 1, -1), # function(i){ # l <- class.num[i] # if(l==last.l){ # occ <<- occ + 1 # }else{ # occ <<- 1 # } # if(occ > class.max.occ[l]){ # class.max.occ[l] <<- occ # class.start[l] <<- i # } # last.l <<- l # } # ) # # class.ord <- order(class.start) # l.names <- levels(class)[class.ord] # l.color <- legend.pal[class.ord] # legend('top', title='Classes' # , legend=l.names, fill=l.color # , horiz=TRUE, bty='n') # } # # # return invisible # invisible(res.heatmap) } local(object, ...) } ) #' Deprecated method that is substituted by \code{\link{coefmap}} and \code{\link{basismap}}. setMethod('metaHeatmap', signature(object='NMF'), function(object, ...){ local <- function(object, what=c('samples', 'features'), filter=FALSE, ...){ what <- match.arg(what) if( what == 'samples' ){ # send deprecated warning .Defunct('coefmap', 'NMF', "Direct use of the S4-Method 'metaHeatmap' for 'NMF' objects is defunct, use 'coefmap' instead.") # call the new function 'coefmap' return( coefmap(object, ...) ) }else if( what == 'features' ){ # send deprecated warning .Defunct('basismap', 'NMF', "Direct use of the S4-Method 'metaHeatmap' for 'NMF' objects is defunct, use 'basismap' instead.") # call the new function 'basismap' return( basismap(object, subsetRow=filter, ...) ) } } local(object, ...) } ) # match an annotation track against list of supported tracks match_named_track <- function(annotation, tracks, msg, optional=FALSE){ idx <- if( is.character(annotation) ){ i <- match(annotation, tracks, nomatch=if(optional) 0L else NA ) if( any(!is.na(i)) ){ if( !optional && any(is.na(i)) ){ stop(msg, "invalid track(s) [", str_out(annotation[is.na(i)]) , "]: should be one of ", str_out(tracks)) } } i }else if( is.list(annotation) ){ sapply(annotation, function(x){ if( isString(x) ) match(x, tracks, nomatch=if(optional) 0L else NA ) else NA }) } if( is.null(idx) ) return() ok <- !is.na(idx) # result # remaining annotations ann <- annotation[!ok] if( length(ann) == 0L ) ann <- NULL # track annotations tr <- unlist(annotation[which(ok)]) idx <- idx[which(ok)] if( is.null(names(annotation)) ) names(tr) <- tr else{ mn <- names(tr) == '' names(tr)[mn] <- tr[mn] } others <- tr[idx==0L] # # list(ann=ann, tracks=tr[idx>0L], others=if(length(others)) others else NULL) list(ann=as.list(ann), tracks=tr) } #' Heatmaps of NMF Factors #' #' The NMF package ships an advanced heatmap engine implemented by the function #' \code{\link{aheatmap}}. #' Some convenience heatmap functions have been implemented for NMF models, #' which redefine default values for some of the arguments of \code{\link{aheatmap}}, #' hence tuning the output specifically for NMF models. #' #' \strong{IMPORTANT:} although they essentially have the same set of arguments, #' their order sometimes differ between them, as well as from \code{\link{aheatmap}}. #' We therefore strongly recommend to use fully named arguments when calling these functions. #' #' @rdname heatmaps #' @name heatmap-NMF #' #' @examples #' #' ## More examples are provided in demo `heatmaps` #' \dontrun{ #' demo(heatmaps) #' } #' ## #' #' # random data with underlying NMF model #' v <- syntheticNMF(20, 3, 10) #' # estimate a model #' x <- nmf(v, 3) #' #' @demo Heatmaps of NMF objects #' #' #' # random data with underlying NMF model #' v <- syntheticNMF(20, 3, 10) #' # estimate a model #' x <- nmf(v, 3) #' NULL #' \code{basimap} draws an annotated heatmap of the basis matrix. #' #' @details #' \code{basimap} default values for the following arguments of \code{\link{aheatmap}}: #' \itemize{ #' \item the color palette; #' \item the scaling specification, which by default scales each #' row separately so that they sum up to one (\code{scale='r1'}); #' \item the column ordering which is disabled; #' \item allowing for passing feature extraction methods in argument #' \code{subsetRow}, that are passed to \code{\link{extractFeatures}}. #' See argument description here and therein. #' \item the addition of a default named annotation track, that shows #' the dominant basis component for each row (i.e. each feature). #' #' This track is specified in argument \code{tracks} (see its argument description). #' By default, a matching column annotation track is also displayed, but may be #' disabled using \code{tracks=':basis'}. #' #' \item a suitable title and extra information like the fitting algorithm, #' when \code{object} is a fitted NMF model. #' } #' #' @param object an object from which is extracted NMF factors or a consensus #' matrix #' @param ... extra arguments passed to \code{\link{aheatmap}}. #' #' @rdname heatmaps #' @inline #' @export #' #' @examples #' #' # show basis matrix #' basismap(x) #' \dontrun{ #' # without the default annotation tracks #' basismap(x, tracks=NA) #' } #' #' @demo #' #' # highligh row only (using custom colors) #' basismap(x, tracks=':basis', annColor=list(basis=1:3)) #' #' ## character annotation vector: ok if it does not contain 'basis' #' # annotate first and second row + automatic special track #' basismap(x, annRow=c('alpha', 'beta')) #' # no special track here #' basismap(x, annRow=c('alpha', 'beta', ':basis'), tracks=NA) #' # with special track `basis` #' basismap(x, annRow=list(c('alpha', 'beta'), ':basis'), tracks=NA) #' # highligh columns only (using custom colors) #' basismap(x, tracks='basis:') #' #' # changing the name of the basis annotation track #' basismap(x, annRow=list(new_name=':basis')) #' setGeneric('basismap', function(object, ...) standardGeneric('basismap') ) #' Plots a heatmap of the basis matrix of the NMF model \code{object}. #' This method also works for fitted NMF models (i.e. \code{NMFfit} objects). #' #' @inheritParams aheatmap #' @param subsetRow Argument that specifies how to filter the rows that #' will appear in the heatmap. #' When \code{FALSE} (default), all rows are used. #' Besides the values supported by argument \code{subsetRow} of #' \code{\link{aheatmap}}, other possible values are: #' #' \itemize{ #' \item \code{TRUE}: only the rows that are basis-specific are used. #' The default selection method is from \cite{KimH2007}. #' This is equivalent to \code{subsetRow='kim'}. #' #' \item a single \code{character} string or numeric value that specifies #' the method to use to select the basis-specific rows, that should appear in the #' heatmap (cf. argument \code{method} for function \code{\link{extractFeatures}}). #' #' Note \code{\link{extractFeatures}} is called with argument \code{nodups=TRUE}, #' so that features that are selected for multiple components only appear once. #' } #' @param tracks Special additional annotation tracks to highlight associations between #' basis components and sample clusters: #' \describe{ #' \item{basis}{matches each row (resp. column) to the most contributing basis component #' in \code{basismap} (resp. \code{coefmap}). #' In \code{basismap} (resp. \code{coefmap}), adding a track \code{':basis'} to #' \code{annCol} (resp. \code{annRow}) makes the column (resp. row) corresponding to #' the component being also highlited using the mathcing colours.} #' } #' @param info if \code{TRUE} then the name of the algorithm that fitted the NMF #' model is displayed at the bottom of the plot, if available. #' Other wise it is passed as is to \code{aheatmap}. #' #' setMethod('basismap', signature(object='NMF'), function(object, color = 'YlOrRd:50' , scale = 'r1' , Rowv=TRUE, Colv=NA, subsetRow=FALSE , annRow=NA, annCol=NA, tracks = 'basis' , main="Basis components", info = FALSE , ...){ # resolve subsetRow if its a single value if( is.atomic(subsetRow) && length(subsetRow) == 1 ){ subsetRow <- if( isFALSE(subsetRow) ) NULL else if( isTRUE(subsetRow) ) # use Kim and Park scoring scheme for filtering extractFeatures(object, format='combine') else if( is.character(subsetRow) || is.numeric(subsetRow) ) # use subsetRow as a filtering method extractFeatures(object, method=subsetRow, format='combine') else stop("NMF::basismap - invalid single value for argument 'subsetRow' [logical, numeric or character expected]") } # extract the basis vector matrix x <- basis(object) # add side information if requested info <- if( isTRUE(info) && isNMFfit(object) ) paste("Method:", algorithm(object)) else if( isFALSE(info) ) NULL else info # process annotation tracks ptracks <- process_tracks(x, tracks, annRow, annCol) annRow <- ptracks$row annCol <- ptracks$col # set special annotation handler specialAnnotation(1L, 'basis', function() predict(object, what='features')) specialAnnotation(2L, 'basis', function() as.factor(1:nbasis(object))) # # call aheatmap on matrix aheatmap(x, color = color, ... , scale = scale, Rowv=Rowv, Colv = Colv, subsetRow = subsetRow , annRow = annRow, annCol = annCol , main = main, info = info) } ) # check if an object contains some value anyValue <- function(x){ length(x) > 0L && !is_NA(x) } grep_track <- function(x){ list( both = grepl("^[^:].*[^:]$", x) | grepl("^:.*:$", x) , row = grepl("^:.*[^:]$", x) , col = grepl("^[^:].*:$", x) ) } # process extra annotation tracks process_tracks <- function(data, tracks, annRow=NA, annCol=NA){ if( anyValue(tracks) ){ # extract choices from caller function formal.args <- formals(sys.function(sys.parent())) choices <- eval(formal.args[[deparse(substitute(tracks))]]) if( isTRUE(tracks) ) tracks <- choices else{ if( !is.character(tracks) ) stop("Special annotation tracks must be specified either as NA, TRUE or a character vector [", class(tracks), "].") # check validity pattern <- "^(:)?([^:]*)(:)?$" basech <- str_match(choices, pattern) basetr <- str_match(tracks, pattern) tr <- basetr[, 3L] # print(basetr) # print(basech) # extend base track name i <- charmatch(tr, basech[,3L]) tr[!is.na(i)] <- basech[i[!is.na(i)],3L] tracks_long <- str_c(basetr[,2L], tr, basetr[,4L]) # extend choices tty_choice <- grep_track(choices) if( any(tty_choice$both) ) choices <- c(choices, str_c(':', choices[tty_choice$both]), str_c(choices[tty_choice$both], ':')) # look for exact match itr <- charmatch(tracks_long, choices) if( length(err <- which(is.na(itr))) ){ stop("Invalid special annotation track name [", str_out(tracks[err], Inf) ,"]. Should partially match one of ", str_out(choices, Inf), '.') } tracks[!is.na(itr)] <- choices[itr] } # print(tracks) } # tty <- grep_track(tracks) # create result object build <- function(x, ann, data, margin){ t <- if( anyValue(x) ) as.list(setNames(str_c(':', sub("(^:)|(:$)","",x)), names(x))) else NA # build annotations atrack(ann, t, .DATA=amargin(data,margin)) } res <- list() res$row <- build(tracks[tty$both | tty$row], annRow, data, 1L) res$col <- build(tracks[tty$both | tty$col], annCol, data, 2L) #str(res) res } #' \code{coefmap} draws an annotated heatmap of the coefficient matrix. #' #' @details #' \code{coefmap} redefines default values for the following arguments of #' \code{\link{aheatmap}}: #' \itemize{ #' \item the color palette; #' \item the scaling specification, which by default scales each #' column separately so that they sum up to one (\code{scale='c1'}); #' \item the row ordering which is disabled; #' \item the addition of a default annotation track, that shows the most #' contributing basis component for each column (i.e. each sample). #' #' This track is specified in argument \code{tracks} (see its argument description). #' By default, a matching row annotation track is also displayed, but can be disabled #' using \code{tracks='basis:'}. #' \item a suitable title and extra information like the fitting algorithm, #' when \code{object} is a fitted NMF model. #' } #' #' @rdname heatmaps #' @inline #' @export #' #' @examples #' #' # coefficient matrix #' coefmap(x) #' \dontrun{ #' # without the default annotation tracks #' coefmap(x, tracks=NA) #' } #' #' @demo #' #' # coefficient matrix #' coefmap(x, annCol=c('alpha', 'beta')) # annotate first and second sample #' coefmap(x, annCol=list('basis', Greek=c('alpha', 'beta'))) # annotate first and second sample + basis annotation #' coefmap(x, annCol=c(new_name='basis')) #' setGeneric('coefmap', function(object, ...) standardGeneric('coefmap') ) #' The default method for NMF objects has special default values for #' some arguments of \code{\link{aheatmap}} (see argument description). setMethod('coefmap', signature(object='NMF'), function(object, color = 'YlOrRd:50' , scale = 'c1' , Rowv = NA, Colv = TRUE , annRow = NA, annCol = NA, tracks='basis' , main="Mixture coefficients", info = FALSE , ...){ # use the mixture coefficient matrix x <- coef(object) # add side information if requested info <- if( isTRUE(info) && isNMFfit(object) ) paste("Method: ", algorithm(object)) else if( isFALSE(info) ) NULL else info # process annotation tracks ptracks <- process_tracks(x, tracks, annRow, annCol) annRow <- ptracks$row annCol <- ptracks$col # set special annotation handler specialAnnotation(1L, 'basis', function() as.factor(1:nbasis(object))) specialAnnotation(2L, 'basis', function() predict(object)) # ## process ordering if( isString(Colv) ){ if( Colv == 'basis' ) Colv <- 'samples' if( Colv == 'samples' ) Colv <- order(as.numeric(predict(object, Colv))) } ## # call aheatmap on matrix aheatmap(x, ..., color = color , scale = scale, Rowv = Rowv, Colv=Colv , annRow=annRow, annCol = annCol , main=main, info = info) } ) NMF/R/NMFStrategyIterative-class.R0000644000176200001440000010555714333241540016355 0ustar liggesusers#' @include NMFStrategy-class.R #' @include NMFfit-class.R NULL # Define union class for generalised function slots, e.g., slot 'NMFStrategyIterative::Stop' setClassUnion('.GfunctionSlotNULL', c('character', 'integer', 'numeric', 'function', 'NULL')) #' Interface for Algorithms: Implementation for Iterative NMF Algorithms #' #' @description #' This class provides a specific implementation for the generic function \code{run} #' -- concretising the virtual interface class \code{\linkS4class{NMFStrategy}}, #' for NMF algorithms that conform to the following iterative schema (starred numbers #' indicate mandatory steps): #' #' \itemize{ #' \item 1. Initialisation #' \item 2*. Update the model at each iteration #' \item 3. Stop if some criterion is satisfied #' \item 4. Wrap up #' } #' #' This schema could possibly apply to all NMF algorithms, since these are essentially optimisation algorithms, #' almost all of which use iterative methods to approximate a solution of the optimisation problem. #' The main advantage is that it allows to implement updates and stopping criterion separately, and combine them #' in different ways. #' In particular, many NMF algorithms are based on multiplicative updates, following the approach from #' \cite{Lee2001}, which are specially suitable to be cast into this simple schema. #' #' @slot onInit optional function that performs some initialisation or pre-processing on #' the model, before starting the iteration loop. #' @slot Update mandatory function that implement the update step, which computes new values for the model, based on its #' previous value. #' It is called at each iteration, until the stopping criterion is met or the maximum number of iteration is #' achieved. #' @slot Stop optional function that implements the stopping criterion. #' It is called \strong{before} each Update step. #' If not provided, the iterations are stopped after a fixed number of updates. #' @slot onReturn optional function that wraps up the result into an NMF object. #' It is called just before returning the #' setClass('NMFStrategyIterative' , representation( onInit = '.functionSlotNULL', Update = '.functionSlot', # update method Stop = '.GfunctionSlotNULL', # method called just after the update onReturn = '.functionSlotNULL' # method called just before returning the resulting NMF object ) , prototype=prototype( onInit = NULL , Update = '' , Stop = NULL , onReturn = NULL ) , contains = 'NMFStrategy' , validity = function(object){ if( is.character(object@Update) && object@Update == '' ) return("Slot 'Update' is required") # check the arguments of methods 'Update' and 'Stop' # (except for the 3 mandatory ones) n.update <- names(formals(object@Update)) # at least 3 arguments for 'Update' if( length(n.update) < 3 ){ return(str_c("Invalid 'Update' method - must have at least 3 arguments: ", "current iteration number [i], ", "target matrix [y], ", "current NMF model iterate [x]")) } n.update <- n.update[-seq(3)] # argument '...' must be present in method 'Update' if( !is.element('...', n.update) ) return("Invalid 'Update' method: must have argument '...' (even if not used)") # at least 3 arguments for 'Stop' if( !is.null(object@Stop) ){ # retrieve the stopping criterion and check its intrinsic validity .stop <- tryCatch( NMFStop(object@Stop, check=TRUE), error = function(e) return(message(e))) # Update and Stop methods cannot have overlapping arguments n.stop <- names(formals(.stop)) overlap <- intersect(n.update, n.stop) overlap <- overlap[which(overlap!='...')] if( length(overlap) > 0 ){ return(str_c("Invalid 'Update' and 'Stop' methods: conflicting arguments ", str_out(overlap, Inf))) } } TRUE } ) #' Show method for objects of class \code{NMFStrategyIterative} #' @export setMethod('show', 'NMFStrategyIterative', function(object){ #cat('') callNextMethod() cat(" \n") # go through the slots s.list <- names(getSlots('NMFStrategyIterative')) s.list <- setdiff(s.list, names(getSlots('NMFStrategy'))) #s.list <- s.list[s.list=='ANY'] # s.list <- c('Update', 'Stop', 'WrapNMF') out <- sapply(s.list, function(sname){ svalue <- slot(object,sname) svalue <- if( is.function(svalue) ) { str_args(svalue, exdent=12) } else if( is.null(svalue) ){ 'none' } else { paste("'", svalue,"'", sep='') } str_c(sname, ": ", svalue) }) cat(str_c(' ', out, collapse='\n'), "\n", sep='') return(invisible()) } ) ###% This class is an auxiliary class that defines the strategy's methods by directly callable functions. setClass('NMFStrategyIterativeX' , contains = 'NMFStrategyIterative' , representation = representation( workspace = 'environment' # workspace to use persistent variables accross methods ) ) ###% Creates a NMFStrategyIterativeX object from a NMFStrategyIterative object. xifyStrategy <- function(strategy, workspace=new.env(emptyenv())){ # do nothing if already executable if( is(strategy, 'NMFStrategyIterativeX') ) return(strategy) # first check the strategy's validity if( is.character(err <- validObject(strategy, test=TRUE)) ){ stop("Invalid strategy definition:\n\t- ", err) } # intanciate the NMFStrategyIterativeX, creating the strategy's workspace strategyX <- new('NMFStrategyIterativeX', strategy, workspace=workspace) # define auxiliary function to preload the 'function' slots in class NMFStrategyIterativeX preload.slot <- function(strategy, sname, default){ # get the content of the slot svalue <- slot(strategy,sname) # if the slot is valid (i.e. it's a non-empty character string), then process the name into a valid function fun <- if( is.null(svalue) && !missing(default) ) default else if( sname == 'Stop' ) NMFStop(svalue) else if( is.character(svalue) && nchar(svalue) > 0 ){ # set the slot with the executable version of the function getFunction(svalue) }else if( is.function(svalue) ) svalue else stop("NMFStrategyIterativeX - could not pre-load slot '", sname, "'") # return the loaded function fun } # preload the function slots slot(strategyX, 'Update') <- preload.slot(strategyX, 'Update') slot(strategyX, 'Stop') <- preload.slot(strategyX, 'Stop', function(strategy, i, target, data, ...){FALSE}) slot(strategyX, 'onReturn') <- preload.slot(strategyX, 'onReturn', identity) # load the objective function objective(strategyX) <- nmfDistance(objective(strategy)) # valid the preloaded object validObject(strategyX) # return the executable strategy strategyX } # #setGeneric('Update', function(object, v, ...) standardGeneric('Update') ) #setMethod('Update', signature(object='NMFStrategyIterative', v='matrix'), function(object, v, ...){ object@data <- object@Update(v, object@data, ...) }) # #setGeneric('Stop', function(object, i) standardGeneric('Stop') ) #setMethod('Stop', signature(object='NMFStrategyIterative', i='integer'), function(object, i){ object@Stop(i, object@data) }) # #setGeneric('WrapNMF', function(object) standardGeneric('WrapNMF') ) #setMethod('WrapNMF', signature(object='NMFStrategyIterative'), function(object){ object@WrapNMF(object@data) }) ###% Hook to initialize built-in iterative methods when the package is loaded ###% Hook to initialize old R version built-in iterative methods #' Get/Set a Static Variable in NMF Algorithms #' #' @description #' This function is used in iterative NMF algorithms to manage variables #' stored in a local workspace, that are accessible to all functions that #' define the iterative schema described in \code{\linkS4class{NMFStrategyIterative}}. #' #' It is specially useful for computing stopping criteria, which often require model data from #' different iterations. #' #' @param name Name of the static variable (as a single character string) #' @param value New value of the static variable #' @param init a logical used when a \code{value} is provided, that specifies #' if the variable should be set to the new value only if it does not exist yet #' (\code{init=TRUE}). #' @return The value of the static variable #' @export staticVar <- local({ .Workspace <- NULL function(name, value, init=FALSE){ # return last workspace if( missing(name) ) return(.Workspace) else if( is.null(name) ){ # reset workspace .Workspace <<- NULL return() } else if( is.environment(name) ){ # setup up static environment nmf.debug('Strategy Workspace', "initialize static workspace: ", capture.output(.Workspace), "=", capture.output(name)) .Workspace <<- name }else if( isString(name) && is.environment(.Workspace) ){ if( missing(value) ){ get(name, envir=.Workspace, inherits=FALSE) }else{ if( !init || !exists(name, envir=.Workspace, inherits=FALSE) ) { if( init ) nmf.debug('Strategy Workspace', "initialize variable '", name, "'") assign(name, value, envir=.Workspace) } # return current value get(name, envir=.Workspace, inherits=FALSE) } }else{ stop("Invalid NMF workspace query: .Workspace=", class(.Workspace), '| name=', name , if( !missing(value) ) paste0(' | value=', class(value))) } } }) #' Runs an NMF iterative algorithm on a target matrix \code{y}. #' #' @param .stop specification of a stopping criterion, that is used instead of the #' one associated to the NMF algorithm. #' It may be specified as: #' \itemize{ #' \item the access key of a registered stopping criterion; #' \item a single integer that specifies the exact number of iterations to perform, which will #' be honoured unless a lower value is explicitly passed in argument \code{maxIter}. #' \item a single numeric value that specifies the stationnarity threshold for the #' objective function, used in with \code{\link{nmf.stop.stationary}}; #' \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, #' where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, #' \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of #' the NMF model. #' } #' @param maxIter maximum number of iterations to perform. #' #' @rdname NMFStrategy setMethod('run', signature(object='NMFStrategyIterative', y='matrix', x='NMFfit'), function(object, y, x, .stop=NULL, maxIter = nmf.getOption('maxIter') %||% 2000L, ...){ method <- object # override the stop method on runtime if( !is.null(.stop) ){ method@Stop <- NMFStop(.stop) # honour maxIter unless .stop is an integer and maxIter is not passed # either directly or from initial call # NB: maxIter may be not missing in the call to run() due to the application # of default arguments from the Strategy within nmf(), in which case one does not # want to honour it, since it is effectively missing in the original call. if( is.integer(.stop) && (missing(maxIter) || !('maxIter' %in% names(x@call))) ) maxIter <- .stop[1] } # debug object in debug mode if( nmf.getOption('debug') ) show(method) #Vc# Define local workspace for static variables # this function can be called in the methods to get/set/initialize # variables that are persistent within the strategy's workspace .Workspace <- new.env() staticVar(.Workspace) on.exit( staticVar(NULL) ) # runtime resolution of the strategy's functions by their names if necessary strategyX = xifyStrategy(method, .Workspace) run(strategyX, y, x, maxIter=maxIter, ...) }) #' @rdname NMFStrategy setMethod('run', signature(object='NMFStrategyIterativeX', y='matrix', x='NMFfit'), function(object, y, x, maxIter, ...){ strategy <- object v <- y seed <- x #V!# NMFStrategyIterativeX::run #Vc# Define workspace accessor function # this function can be called in the methods to get/set/initialize # variables that are persistent within the strategy's workspace # .Workspace <- strategy@workspace # assign('staticVar', function(name, value, init=FALSE){ # if( missing(value) ){ # get(name, envir=.Workspace, inherits=FALSE) # }else{ # if( !init || !exists(name, envir=.Workspace, inherits=FALSE) ) # { # if( init ) nmf.debug('Strategy Workspace', "initialize variable '", name, "'") # assign(name, value, envir=.Workspace) # } # } # } # , envir=.Workspace) #Vc# initialize the strategy # check validity of arguments if possible method.args <- nmfFormals(strategy, runtime=TRUE) internal.args <- method.args$internals expected.args <- method.args$defaults passed.args <- names(list(...)) forbidden.args <- is.element(passed.args, c(internal.args)) if( any(forbidden.args) ){ stop("NMF::run - Update/Stop method : formal argument(s) " , paste( paste("'", passed.args[forbidden.args],"'", sep=''), collapse=', ') , " already set internally.", call.=FALSE) } # !is.element('...', expected.args) && if( any(t <- !pmatch(passed.args, names(expected.args), nomatch=FALSE)) ){ stop("NMF::run - onInit/Update/Stop method for algorithm '", name(strategy),"': unused argument(s) " , paste( paste("'", passed.args[t],"'", sep=''), collapse=', '), call.=FALSE) } # check for required arguments required.args <- sapply(expected.args, function(x){ x <- as.character(x); length(x) == 1 && nchar(x) == 0 } ) required.args <- names(expected.args[required.args]) required.args <- required.args[required.args!='...'] if( any(t <- !pmatch(required.args, passed.args, nomatch=FALSE)) ) stop("NMF::run - Update/Stop method for algorithm '", name(strategy),"': missing required argument(s) " , paste( paste("'", required.args[t],"'", sep=''), collapse=', '), call.=FALSE) #Vc# Start iterations nmfData <- seed # cache verbose level verbose <- verbose(nmfData) # clone the object to allow the updates to work in place if( verbose > 1L ) message("# Cloning NMF model seed ... ", appendLF=FALSE) nmfFit <- clone(fit(nmfData)) if( verbose > 1L ) message("[", C.ptr(fit(nmfData)), " -> ", C.ptr(nmfFit), "]") ## onInit if( is.function(strategy@onInit) ){ if( verbose > 1L ) message("# Step 1 - onInit ... ", appendLF=TRUE) nmfFit <- strategy@onInit(strategy, v, nmfFit, ...) if( verbose > 1L ) message("OK") } ## # pre-load slots updateFun <- strategy@Update stopFun <- strategy@Stop showNIter.step <- 50L showNIter <- verbose && maxIter >= showNIter.step if( showNIter ){ ndIter <- nchar(as.character(maxIter)) itMsg <- paste0('Iterations: %', ndIter, 'i', "/", maxIter) cat(itMsgBck <- sprintf(itMsg, 0)) itMsgBck <- nchar(itMsgBck) } i <- 0L while( TRUE ){ #Vc# Stopping criteria # check convergence (generally do not stop for i=0L, but only initialise static variables stop.signal <- stopFun(strategy, i, v, nmfFit, ...) # if the strategy ask for stopping, then stop the iteration if( stop.signal || i >= maxIter ) break; # increment i i <- i+1L if( showNIter && (i==1L || i %% showNIter.step == 0L) ){ cat(paste0(rep("\r", itMsgBck), sprintf(itMsg, i))) } #Vc# update the matrices nmfFit <- updateFun(i, v, nmfFit, ...) # every now and then track the error if required nmfData <- trackError(nmfData, deviance(strategy, nmfFit, v, ...), niter=i) } if( showNIter ){ ended <- if( stop.signal ) 'converged' else 'stopped' cat("\nDONE (", ended, " at ",i,'/', maxIter," iterations)\n", sep='') } # force to compute last error if not already done nmfData <- trackError(nmfData, deviance(strategy, nmfFit, v, ...), niter=i, force=TRUE) # store the fitted model fit(nmfData) <- nmfFit #Vc# wrap up # let the strategy build the result nmfData <- strategy@onReturn(nmfData) if( !inherits(nmfData, 'NMFfit') ){ stop('NMFStrategyIterative[', name(strategy), ']::onReturn did not return a "NMF" instance [returned: "', class(nmfData), '"]') } # set the number of iterations performed niter(nmfData) <- i #return the result nmf.debug('NMFStrategyIterativeX::run', 'Done') invisible(nmfData) }) #' @export nmfFormals.NMFStrategyIterative <- function(x, runtime=FALSE, ...){ strategy <- xifyStrategy(x) # from run method m <- getMethod('run', signature(object='NMFStrategyIterative', y='matrix', x='NMFfit')) run.args <- allFormals(m)[-(1:3)] # onInit init.args <- if( is.function(strategy@onInit) ) formals(strategy@onInit) # Update update.args <- formals(strategy@Update) # Stop stop.args <- formals(strategy@Stop) # spplit internals and internal.args <- names(c(init.args[1:3], update.args[1:3], stop.args[1:4])) expected.args <- c(init.args[-(1:3)], update.args[-(1:3)], stop.args[-(1:4)]) if( runtime ){ # prepend registered default arguments expected.args <- expand_list(strategy@defaults, expected.args) list(internal=internal.args, defaults=expected.args) }else{ args <- c(run.args, expected.args) # prepend registered default arguments expand_list(strategy@defaults, args) } } ################################################################################################ # INITIALIZATION METHODS ################################################################################################ ################################################################################################ # UPDATE METHODS ################################################################################################ #' NMF Multiplicative Updates for Kullback-Leibler Divergence #' #' Multiplicative updates from \cite{Lee2001} for standard Nonnegative Matrix Factorization #' models \eqn{V \approx W H}, where the distance between the target matrix and its NMF #' estimate is measured by the Kullback-Leibler divergence. #' #' \code{nmf_update.KL.w} and \code{nmf_update.KL.h} compute the updated basis and coefficient #' matrices respectively. #' They use a \emph{C++} implementation which is optimised for speed and memory usage. #' #' @details #' The coefficient matrix (\code{H}) is updated as follows: #' \deqn{ #' H_{kj} \leftarrow H_{kj} \frac{\left( sum_i \frac{W_{ik} V_{ij}}{(WH)_{ij}} \right)}{ sum_i W_{ik} }. #' }{ #' H_kj <- H_kj ( sum_i [ W_ik V_ij / (WH)_ij ] ) / ( sum_i W_ik ) #' } #' #' These updates are used in built-in NMF algorithms \code{\link[=KL-nmf]{KL}} and #' \code{\link[=brunet-nmf]{brunet}}. #' #' @param v target matrix #' @param w current basis matrix #' @param h current coefficient matrix #' @param nbterms number of fixed basis terms #' @param ncterms number of fixed coefficient terms #' @param copy logical that indicates if the update should be made on the original #' matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). #' With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be #' achieved in the case of big matrices. #' However, greater care should be taken due the side effect. #' We recommend that only experienced users use \code{copy=TRUE}. #' #' @return a matrix of the same dimension as the input matrix to update #' (i.e. \code{w} or \code{h}). #' If \code{copy=FALSE}, the returned matrix uses the same memory as the input object. #' #' @author #' Update definitions by \cite{Lee2001}. #' #' C++ optimised implementation by Renaud Gaujoux. #' #' @rdname nmf_update_KL #' @aliases nmf_update.KL #' @export nmf_update.KL.h <- std.divergence.update.h <- function(v, w, h, nbterms=0L, ncterms=0L, copy=TRUE) { .Call("divergence_update_H", v, w, h, nbterms, ncterms, copy, PACKAGE='NMF') } #' \code{nmf_update.KL.w_R} and \code{nmf_update.KL.h_R} implement the same updates #' in \emph{plain R}. #' #' @param wh already computed NMF estimate used to compute the denominator term. #' #' @rdname nmf_update_KL #' @export nmf_update.KL.h_R <- R_std.divergence.update.h <- function(v, w, h, wh=NULL) { # compute WH if necessary if( is.null(wh) ) wh <- w %*% h # divergence-reducing NMF iterations # H_au = H_au ( sum_i [ W_ia V_iu / (WH)_iu ] ) / ( sum_k W_ka ) -> each row of H is divided by a the corresponding colSum of W h * crossprod(w, v / wh) / colSums(w) } #' @details #' The basis matrix (\code{W}) is updated as follows: #' \deqn{ #' W_{ik} \leftarrow W_{ik} \frac{ sum_j [\frac{H_{kj} A_{ij}}{(WH)_{ij}} ] }{sum_j H_{kj} } #' }{ #' W_ik <- W_ik ( sum_u [H_kl A_il / (WH)_il ] ) / ( sum_l H_kl ) #' } #' @rdname nmf_update_KL #' @export nmf_update.KL.w <- std.divergence.update.w <- function(v, w, h, nbterms=0L, ncterms=0L, copy=TRUE) { .Call("divergence_update_W", v, w, h, nbterms, ncterms, copy, PACKAGE='NMF') } #' @rdname nmf_update_KL #' @export nmf_update.KL.w_R <- R_std.divergence.update.w <- function(v, w, h, wh=NULL) { # compute WH if necessary if( is.null(wh) ) wh <- w %*% h # W_ia = W_ia ( sum_u [H_au A_iu / (WH)_iu ] ) / ( sum_v H_av ) -> each column of W is divided by a the corresponding rowSum of H #x2 <- matrix(rep(rowSums(h), nrow(w)), ncol=ncol(w), byrow=TRUE); #w * tcrossprod(v / wh, h) / x2; sweep(w * tcrossprod(v / wh, h), 2L, rowSums(h), "/", check.margin = FALSE) # optimize version? } #' NMF Multiplicative Updates for Euclidean Distance #' #' Multiplicative updates from \cite{Lee2001} for standard Nonnegative Matrix Factorization #' models \eqn{V \approx W H}, where the distance between the target matrix and its NMF #' estimate is measured by the -- euclidean -- Frobenius norm. #' #' \code{nmf_update.euclidean.w} and \code{nmf_update.euclidean.h} compute the updated basis and coefficient #' matrices respectively. #' They use a \emph{C++} implementation which is optimised for speed and memory usage. #' #' @details #' The coefficient matrix (\code{H}) is updated as follows: #' \deqn{ #' H_{kj} \leftarrow \frac{\max(H_{kj} W^T V)_{kj}, \varepsilon) }{(W^T W H)_{kj} + \varepsilon} #' }{ #' H_kj <- max(H_kj (W^T V)_kj, eps) / ( (W^T W H)_kj + eps ) #' } #' #' These updates are used by the built-in NMF algorithms \code{\link[=Frobenius-nmf]{Frobenius}} and #' \code{\link[=lee-nmf]{lee}}. #' #' @inheritParams nmf_update.KL.h #' @param eps small numeric value used to ensure numeric stability, by shifting up #' entries from zero to this fixed value. #' #' @return a matrix of the same dimension as the input matrix to update #' (i.e. \code{w} or \code{h}). #' If \code{copy=FALSE}, the returned matrix uses the same memory as the input object. #' #' @author #' Update definitions by \cite{Lee2001}. #' #' C++ optimised implementation by Renaud Gaujoux. #' #' @rdname nmf_update_euclidean #' @aliases nmf_update.euclidean #' @export nmf_update.euclidean.h <- std.euclidean.update.h <- function(v, w, h, eps=10^-9, nbterms=0L, ncterms=0L, copy=TRUE){ .Call("euclidean_update_H", v, w, h, eps, nbterms, ncterms, copy, PACKAGE='NMF') } #' \code{nmf_update.euclidean.w_R} and \code{nmf_update.euclidean.h_R} implement the same updates #' in \emph{plain R}. #' #' @param wh already computed NMF estimate used to compute the denominator term. #' #' @rdname nmf_update_euclidean #' @export nmf_update.euclidean.h_R <- R_std.euclidean.update.h <- function(v, w, h, wh=NULL, eps=10^-9){ # compute WH if necessary den <- if( is.null(wh) ) crossprod(w) %*% h else{ t(w) %*% wh} # H_au = H_au (W^T V)_au / (W^T W H)_au pmax(h * crossprod(w,v),eps) / (den + eps); } #' @details #' The basis matrix (\code{W}) is updated as follows: #' \deqn{ #' W_ik \leftarrow \frac{\max(W_ik (V H^T)_ik, \varepsilon) }{ (W H H^T)_ik + \varepsilon} #' }{ #' W_ik <- max(W_ik (V H^T)_ik, eps) / ( (W H H^T)_ik + eps ) #' } #' #' @param weight numeric vector of sample weights, e.g., used to normalise samples #' coming from multiple datasets. #' It must be of the same length as the number of samples/columns in \code{v} #' -- and \code{h}. #' #' @rdname nmf_update_euclidean #' @export nmf_update.euclidean.w <- std.euclidean.update.w <- function(v, w, h, eps=10^-9, nbterms=0L, ncterms=0L, weight=NULL, copy=TRUE){ .Call("euclidean_update_W", v, w, h, eps, weight, nbterms, ncterms, copy, PACKAGE='NMF') } #' @rdname nmf_update_euclidean #' @export nmf_update.euclidean.w_R <- R_std.euclidean.update.w <- function(v, w, h, wh=NULL, eps=10^-9){ # compute WH if necessary den <- if( is.null(wh) ) w %*% tcrossprod(h) else{ wh %*% t(h)} # W_ia = W_ia (V H^T)_ia / (W H H^T)_ia and columns are rescaled after each iteration pmax(w * tcrossprod(v, h), eps) / (den + eps); } ################################################################################################ # AFTER-UPDATE METHODS ################################################################################################ #' Stopping Criteria for NMF Iterative Strategies #' #' The function documented here implement stopping/convergence criteria #' commonly used in NMF algorithms. #' #' \code{NMFStop} acts as a factory method that creates stopping criterion functions #' from different types of values, which are subsequently used by #' \code{\linkS4class{NMFStrategyIterative}} objects to determine when to stop their #' iterative process. #' #' @details #' \code{NMFStop} can take the following values: #' \describe{ #' \item{function}{ is returned unchanged, except when it has no arguments, #' in which case it assumed to be a generator, which is immediately called and should return #' a function that implements the actual stopping criterion;} #' \item{integer}{ the value is used to create a stopping criterion that stops at #' that exact number of iterations via \code{nmf.stop.iteration};} #' \item{numeric}{ the value is used to create a stopping criterion that stops when #' at that stationary threshold via \code{nmf.stop.threshold};} #' \item{character}{ must be a single string which must be an access key #' for registered criteria (currently available: \dQuote{connectivity} and \dQuote{stationary}), #' or the name of a function in the global environment or the namespace of the loading package.} #' } #' #' @param s specification of the stopping criterion. #' See section \emph{Details} for the supported formats and how they are processed. #' @param check logical that indicates if the validity of the stopping criterion #' function should be checked before returning it. #' #' @return a function that can be passed to argument \code{.stop} of function #' \code{\link{nmf}}, which is typically used when the algorith is implemented as #' an iterative strategy. #' #' @aliases stop-NMF #' @rdname stop-NMF #' @export NMFStop <- function(s, check=TRUE){ key <- s fun <- if( is.integer(key) ) nmf.stop.iteration(key) else if( is.numeric(key) ) nmf.stop.threshold(key) else if( is.function(key) ) key else if( is.character(key) ){ # update .stop for back compatibility: if( key == 'nmf.stop.consensus') key <- 'connectivity' # first lookup for a `nmf.stop.*` function key2 <- paste('nmf.stop.', key, sep='') e <- packageEnv() sfun <- get(key2) if( is.null(sfun) ) # lookup for the function as such sfun <- get(key) if( is.null(sfun) ) stop("Invalid key ['", key,"']: could not find functions '",key2, "' or '", key, "'") sfun }else if( identical(key, FALSE) ) # create a function that does not stop function(strategy, i, target, data, ...){FALSE} else stop("Invalid key: should be a function, a character string or a single integer/numeric value. See ?NMFStop.") # execute if generator (i.e. no arguments) if( length(formals(fun)) == 0L ) fun <- fun() # check validity if requested if( check ){ n.stop <- names(formals(fun)) if( length(n.stop) < 4 ){ stop("Invalid 'Stop' method - must have at least 4 arguments: ", "NMF strategy object [strategy], ", "current iteration number [i], ", "target matrix [y], ", "current NMF model iterate [x]") } n.stop <- n.stop[-seq(4)] # argument '...' must be present in method 'Stop' if( !is.element('...', n.stop) ) stop("Invalid 'Stop' method: must have argument '...' (even if not used)") } # return function fun } #' \code{nmf.stop.iteration} generates a function that implements the stopping #' criterion that limits the number of iterations to a maximum of \code{n}), #' i.e. that returns \code{TRUE} if \code{i>=n}, \code{FALSE} otherwise. #' #' @param n maximum number of iteration to perform. #' #' @return a function that can be used as a stopping criterion for NMF algorithms #' defined as \code{\linkS4class{NMFStrategyIterative}} objects. #' That is a function with arguments \code{(strategy, i, target, data, ...)} #' that returns \code{TRUE} if the stopping criterion is satisfied -- which in #' turn stops the iterative process, and \code{FALSE} otherwise. #' #' @export #' @family NMFStrategyIterative #' @rdname stop-NMF nmf.stop.iteration <- function(n){ nmf.debug("Using stopping criterion - Fixed number of iterations: ", n) if( !is.numeric(n) ) stop("Invalid argument `n`: must be an integer value") if( length(n) > 1 ) warning("NMF::nmf - Argument `n` [", deparse(substitute(n)), "] has length > 1: only using the first element.") .max <- n[1] function(object, i, y, x, ...) i >= .max } #' \code{nmf.stop.threshold} generates a function that implements the stopping #' criterion that stops when a given stationarity threshold is achieved by #' successive iterations. #' The returned function is identical to \code{nmf.stop.stationary}, but with #' the default threshold set to \code{threshold}. #' #' @param threshold default stationarity threshold #' #' @export #' @rdname stop-NMF nmf.stop.threshold <- function(threshold){ nmf.debug("Using stopping criterion - Stationarity threshold: ", threshold) if( !is.numeric(threshold) ) stop("Invalid argument `threshold`: must be a numeric value") if( length(threshold) > 1 ) warning("NMF::nmf - Argument `threshold` [", deparse(substitute(threshold)), "] has length > 1: only using the first element.") eval(parse(text=paste("function(strategy, i, target, data, stationary.th=", threshold, ", ...){ nmf.stop.stationary(strategy, i, target, data, stationary.th=stationary.th, ...) }"))) } #' \code{nmf.stop.stationary} implements the stopping criterion of stationarity #' of the objective value, which stops when the gradient of the objective function #' is uniformly small over a certain number of iterations. #' #' More precisely, the objective function is computed over \eqn{n} successive iterations (specified #' in argument \code{check.niter}), every \code{check.interval} iterations. #' The criterion stops when the absolute difference between the maximum and the minimum #' objective values over these iterations is lower than a given threshold \eqn{\alpha} #' (specified in \code{stationary.th}): #' #' \deqn{ #' \left| \frac{\max_{i- N_s + 1 \leq k \leq i} D_k - \min_{i - N_s +1 \leq k \leq i} D_k}{n} \right| \leq \alpha, #' }{ #' | [max( D(i- N_s + 1), ..., D(i) ) - min( D(i- N_s + 1), ..., D(i) )] / n | <= alpha #' } #' #' @param object an NMF strategy object #' @param i the current iteration #' @param y the target matrix #' @param x the current NMF model #' @param stationary.th maximum absolute value of the gradient, for the objective #' function to be considered stationary. #' @param check.interval interval (in number of iterations) on which the stopping #' criterion is computed. #' @param check.niter number of successive iteration used to compute the stationnary #' criterion. #' @param ... extra arguments passed to the function \code{\link{objective}}, #' which computes the objective value between \code{x} and \code{y}. #' #' @export #' @rdname stop-NMF nmf.stop.stationary <- local({ # static variable .last.objective.value <- c(-Inf, Inf) .niter <- 0L .store_value <- function(value){ .niter <<- .niter + 1L .last.objective.value <<- c(max(.last.objective.value[1L], value) , min(.last.objective.value[2L], value)) } .reset_value <- function(){ .last.objective.value <<- c(-Inf, Inf) .niter <<- 0L } function(object, i, y, x, stationary.th=.Machine$double.eps, check.interval=5*check.niter, check.niter=10L, ...){ # check validity if( check.interval < check.niter ){ stop("Invalid argument values: `check.interval` must always be greater than `check.niter`") } # initialisation call: compute initial objective value if( i == 0L || (i == 1L && is.null(.last.objective.value)) ){ .reset_value() # give the chance to update once and estimate from a partial model if( is.partial.nmf(x) ) return( FALSE ) # compute initial deviance current.value <- deviance(object, x, y, ...) # check for NaN, i.e. probably infinitely small value (cf. bug reported by Nadine POUKEN SIEWE) if( is.nan(current.value) ) return(TRUE) # store value in static variable for next calls .store_value(current.value) return(FALSE) } # test convergence only every 10 iterations if( .niter==0L && i %% check.interval != 0 ) return( FALSE ); # get last objective value from static variable current.value <- deviance(object, x, y, ...) # check for NaN, i.e. probably infinitely small value (cf. bug reported by Nadine POUKEN SIEWE) if( is.nan(current.value) ) return(TRUE) # update static variables .store_value(current.value) # once values have been computed for check.niter iterations: # check if the difference in the extreme objective values is small enough if( .niter == check.niter+1 ){ crit <- abs(.last.objective.value[1L] - .last.objective.value[2L]) / check.niter if( crit <= stationary.th ){ if( nmf.getOption('verbose') ){ message(crit) } return( TRUE ) } .reset_value() } # do NOT stop FALSE } }) #' \code{nmf.stop.connectivity} implements the stopping criterion that is based #' on the stationarity of the connectivity matrix. #' #' @inheritParams nmf.stop.stationary #' @param stopconv number of iterations intervals over which the connectivity #' matrix must not change for stationarity to be achieved. #' #' @export #' @rdname stop-NMF nmf.stop.connectivity <- local({ # static variables .consold <- NULL .inc <- NULL function(object, i, y, x, stopconv=40, check.interval=10, ...){ if( i == 0L ){ # initialisation call # Initialize consensus variables # => they are static variables within the strategy's workspace so that # they are persistent and available throughout across the calls p <- ncol(x) .consold <<- matrix(0, p, p) .inc <<- 0 return(FALSE) } # test convergence only every 10 iterations if( i %% check.interval != 0 ) return( FALSE ); # retrieve metaprofiles h <- coef(x, all=FALSE) # construct connectivity matrix index <- apply(h, 2, function(x) which.max(x) ) cons <- outer(index, index, function(x,y) ifelse(x==y, 1,0)); changes <- cons != .consold if( !any(changes) ) .inc <<- .inc + 1 # connectivity matrix has not changed: increment the count else{ .consold <<- cons; .inc <<- 0; # else restart counting } # prints number of changing elements #if( verbose(x) ) cat( sprintf('%d ', sum(changes)) ) #cat( sprintf('%d ', sum(changes)) ) # assume convergence is connectivity stops changing if( .inc > stopconv ) return( TRUE ); # do NOT stop FALSE } }) ################################################################################################ # WRAP-UP METHODS ################################################################################################ NMF/R/registry-seed.R0000644000176200001440000000742314333201341014004 0ustar liggesusers# Registry for NMF seeding method # # Author: Renaud Gaujoux ############################################################################### #' @include registry.R #' @include NMFSeed-class.R NULL # create sub-registry for seeding methods .registrySeed <- setPackageRegistry('seed', "NMFSeed" , description = "Initialization methods for NMF algorithms" , entrydesc = 'NMF seeding method') nmfSeedInfo <- function(show=TRUE){ obj <- .registrySeed if( show ) print(obj) invisible(obj) } #' Seeding Strategies for NMF Algorithms #' #' \code{nmfSeed} lists and retrieves NMF seeding methods. #' #' Currently the internal registry contains the following seeding methods, #' which may be specified to the function \code{\link{nmf}} via its argument #' \code{seed} using their access keys: #' #' \describe{ #' \item{random}{ The entries of each factors are drawn from a uniform #' distribution over \eqn{[0, max(x)]}, where $x$ is the target matrix.} #' \item{nndsvd}{ Nonnegative Double Singular Value Decomposition. #' #' The basic algorithm contains no randomization and is based on two SVD processes, #' one approximating the data matrix, the other approximating positive sections #' of the resulting partial SVD factors utilising an algebraic property of #' unit rank matrices. #' #' It is well suited to initialise NMF algorithms with sparse factors. #' Simple practical variants of the algorithm allows to generate dense factors. #' #' \strong{Reference:} \cite{Boutsidis2008}} #' \item{ica}{ Uses the result of an Independent Component Analysis (ICA) #' (from the \code{fastICA} package). #' Only the positive part of the result are used to initialise the factors.} #' \item{none}{ Fixed seed. #' #' This method allows the user to manually provide initial values for #' both matrix factors.} #' } #' #' @param name access key of a seeding method stored in registry. #' If missing, \code{nmfSeed} returns the list of all available seeding methods. #' @param ... extra arguments used for internal calls #' #' @export #' #' @examples #' #' # list all registered seeding methods #' nmfSeed() #' # retrieve one of the methods #' nmfSeed('ica') #' nmfSeed <- function(name=NULL, ...){ nmfGet('seed', name, ...) } #' \code{getNMFSeed} is an alias for \code{nmfSeed}. #' @rdname nmfSeed #' @export getNMFSeed <- nmfSeed #' \code{existsNMFSeed} tells if a given seeding method exists in the registry. #' #' @param exact a logical that indicates if the access key should be matched #' exactly or partially. #' #' @rdname nmfSeed #' @export existsNMFSeed <- function(name, exact=TRUE){ res <- !is.null( getNMFSeed(name, error=FALSE, exact=exact) ) return(res) } # specific register method for registering NMFSeed objects setMethod('nmfRegister', signature(key='NMFSeed', method='missing'), function(key, method, ...){ nmfRegister(name(key), key, ..., regname='seed') } ) #' Registering NMF Seeding Methods #' #' NMF seeding methods are registered via the function \code{setNMFSeed}, which #' stores them as \code{\linkS4class{NMFSeed}} objects in a dedicated registry. #' #' @param ... arguments passed to \code{NMFSeed} and used to initialise slots #' in the \code{\linkS4class{NMFSeed}} object, or to \code{pkgreg_remove} #' @inheritParams setNMFMethod #' #' @export setNMFSeed <- function(..., overwrite=isLoadingNamespace(), verbose=TRUE){ # wrap function method into a new NMFSeed object method <- NMFSeed(...) # register the newly created object res <- nmfRegister(method, overwrite=overwrite, verbose=verbose) } nmfRegisterSeed <- setNMFSeed #' \code{removeNMFSeed} removes an NMF seeding method from the registry. #' #' @param name name of the seeding method. #' #' @export #' @rdname setNMFSeed removeNMFSeed <- function(name, ...){ pkgreg_remove('seed', key=name, ...) } NMF/R/NMFplots.R0000644000176200001440000005107214406057741012735 0ustar liggesusers# Plotting functions for NMF objects # # Author: Renaud Gaujoux # Creation: 16 Aug 2011 ############################################################################### #' @include NMFSet-class.R NULL # Scales a matrix so that its columns sum up to one. sum2one <- function(x){ sweep(x, 2L, colSums(x), '/') } #' @import grDevices corplot <- function(x, y, legend=TRUE, confint=TRUE, scales = 'fixed', ..., add=FALSE){ cols <- rainbow(ncol(x)) # set default arguments gpar <- .set.list.defaults(list(...) , ylab=quote(substitute(y)) , xlab=quote(substitute(x)) , main="Correlation plot" , type='p' , pch=19 , cex=0.8 , col=alphacol(cols, alpha=90)) if( is.null(colnames(x)) ) colnames(x) <- paste("column", 1:ncol(x), sep='_') # draw plot using matplot pfun <- if( add ) matpoints else matplot #do.call(pfun, c(list(x, y), gpar)) # add perfect match line #abline(a=0, b=1) # initialise result res <- list(global=list()) gco <- lm(as.numeric(y) ~ as.numeric(x)) res$global$lm <- gco grsq <- CI.Rsqlm(gco) res$global$cortest <- cor.test( as.numeric(x), as.numeric(y) ) grsq$rho <- res$global$cortest$estimate grsq$alpha <- res$global$lm$coef[2L] # add legend if requested x <- provideDimnames(x, base = list(as.character(1:max(dim(x))))) y <- provideDimnames(y, base = list(as.character(1:max(dim(y))))) ct.labs <- colnames(x) if( legend ){ # separate correlations res$local <- list(lm=list(), cortest=list()) lco <- t(sapply(1:ncol(x), function(i){ co <- lm(y[,i] ~ x[,i]) res$local$lm[[i]] <<- co cotest <- cor.test( as.numeric(x[, i]), as.numeric(y[, i]) ) res$local$cortest[[i]] <<- cotest rsq <- CI.Rsqlm(co) return(round(c(Rsq=rsq$Rsq , confint=rsq$UCL - rsq$Rsq , rho=cotest$estimate , alpha=co$coef[2L]), 2)) # z <- as.numeric(cor.test(x[,i], y[,i])[c('estimate', 'p.value')]) # z[1] <- round.pretty(z[1], 2) # z[2] <- round.pretty(z[2], 3) # z } )) # ct.labs <- sapply(seq_along(ct.labs), function(i){ ci <- if( confint ) str_c(' +/- ', lco[i,2]) else '' bquote(.(sprintf('%s (', colnames(y)[i])) ~ alpha == .(sprintf(' %0.2f | ', lco[i,4])) ~ rho == .(sprintf(' %.02f | ', lco[i,3])) ~ R^2 == .(sprintf(' %0.2f %s)', lco[i,1], ci))) }) } df <- data.frame(x = melt(x), y = melt(y)) df[[5L]] <- factor(df[[5L]], levels = colnames(y)) ct <- colnames(df)[5L] ct.title <- gsub('y.', '', ct, fixed = TRUE) p <- ggplot(df, aes_string(x='x.value', y='y.value' , color = ct)) + geom_point() + xlab(gpar$xlab) + ylab(gpar$ylab) + scale_color_discrete(labels = ct.labs) + stat_smooth(method = lm) + geom_abline(slope = 1, linetype = 3) + facet_grid(paste0('~ ', ct), scales = scales) + labs(color = ct.title) if( legend ){ p <- p + theme(legend.position = 'bottom') + guides(color = guide_legend(ncol = 1)) }else{ p <- p + theme(legend.position = 'none') } p$correlations <- res p } #setMethod('corplot', signature(x='NMFfitXn', y='NMF') # , function(x, y, pch=19, ...){ # # i <- 1 # i0 <- which.best(x) # i2 <- which.best(x, maxAD, y) # .local <- function(f, skip, order, ...){ # # # reorder if necessary # if( !missing(order) && !is.null(order) ) # f <- match.nmf(f, order) # # # skip if needed # if( i == skip ) # return() # # # compute correlations between profiles # co <- diag(cor(t(scoef(f)), t(scoef(y)))) # if( i == 1 ){ # mp <- plot(co, ylim=c(-1,1), xaxt='n', ...) # mtext(side = 1, basisnames(y), at= 1:nbasis(y), line = 1) # } # else # lines(co, ...) # i <<- i+1 # # } # lapply(x, .local, skip=i0, col="#00000010", type='l', ...) # .local(x[[i0]], 0, col="red", type='o', pch=19, ...) # .local(x[[i2]], 0, col="red", type='o', pch=19, lty='dashed', ...) # invisible() # # } #) #' Plotting Expression Profiles #' #' @export profplot <- function(x, ...){ UseMethod('profplot') } #' #' The function \code{profplot} draws plots of the basis profiles, i.e. the rows #' of the coefficient matrix of NMF models. #' A given profile is composed of the contribution of the corresponding #' basis to each sample. #' #' When using NMF for clustering in particular, one looks for strong #' associations between the basis and a priori known groups of samples. #' Plotting the profiles may highlight such patterns. #' #' The function can also be used to compare the profiles from two NMF models or #' mixture coefficient matrices. In this case, it draws a scatter plot of the #' paired profiles. #' #' @param x a matrix or an NMF object from which is extracted the mixture #' coefficient matrix. It is extracted from the best fit if \code{x} is the #' results from multiple NMF runs. #' @param y a matrix or an NMF object from which is extracted the mixture #' coefficient matrix. #' It is extracted from the best fit if \code{y} is the results from multiple NMF runs. #' @param scale specifies how the data should be scaled before plotting. #' If \code{'none'} or \code{NA}, then no scaling is applied and the "raw" data is plotted. #' If \code{TRUE} or \code{'max'} then each row of both matrices #' are normalised with their respective maximum values. #' If \code{'c1'}, then each column of both matrix is scaled into proportions (i.e. to sum up to one). #' Default is \code{'none'}. #' @param match.names a logical that indicates if the profiles in \code{y} #' should be subset and/or re-ordered to match the profile names in \code{x} #' (i.e. the rownames). This is attempted only when both \code{x} and \code{y} #' have names. #' @param legend a logical that specifies whether drawing the legend or not, or #' coordinates specifications passed to argument \code{x} of #' \code{\link{legend}}, that specifies the position of the legend. #' @param confint logical that indicates if confidence intervals for the #' R-squared should be shown in legend. #' @param Colv specifies the way the columns of \code{x} are ordered before #' plotting. It is used only when \code{y} is missing. It can be: \itemize{ #' \item a single numeric value, specifying the index of a row of \code{x}, #' that is used to order the columns by \code{x[, order(x[abs(Colv),])]}. #' Decreasing order is specified with a negative index. \item an integer #' vector directly specifying the order itself, in which case the columns are #' ordered by \code{x[, Colv]} \item a factor used to order the columns by #' \code{x[, order(Colv)]} and as argument \code{annotation} if this latter is #' missing or not \code{NA}. \item any other object with a suitable #' \code{order} method. The columns are by \code{x[, order(Colv)]} } #' @param labels a character vector containing labels for each sample (i.e. #' each column of \code{x}). These are used for labelling the x-axis. #' @param annotation a factor annotating each sample (i.e. each column of #' \code{x}). If not missing, a coloured raw is plotted under the x-axis and #' annotates each sample accordingly. If argument \code{Colv} is a factor, then #' it is used to annotate the plot, unless \code{annotation=NA}. #' @param ... graphical parameters passed to \code{\link{matplot}} or \code{\link{matpoints}}. #' @param add logical that indicates if the plot should be added as points to a previous plot #' #' @seealso \code{\link{profcor}} #' @keywords aplot #' @rdname profplot #' @export #' @examples #' #' # create a random target matrix #' v <- rmatrix(30, 10) #' #' # fit a single NMF model #' res <- nmf(v, 3) #' profplot(res) #' #' # fit a multi-run NMF model #' res2 <- nmf(v, 3, nrun=2) #' # ordering according to first profile #' profplot(res2, Colv=1) # increasing #' #' # draw a profile correlation plot: this show how the basis components are #' # returned in an unpredictable order #' profplot(res, res2) #' #' # looking at all the correlations allow to order the components in a "common" order #' profcor(res, res2) #' profplot.default <- function(x, y, scale=c('none', 'max', 'c1'), match.names=TRUE , legend=TRUE, confint=TRUE , Colv, labels, annotation, ..., add = FALSE){ # initialise result list res <- list() # get extra graphical parameters gpar <- list(...) # plot a correlation plot of y is not missing if( !missing(y) ){ xvar <- deparse(substitute(x)) # extract mixture coefficient from x if( isNMFfit(x) ){ gpar <- .set.list.defaults(gpar , xlab=paste("NMF model", xvar, "- Method:", algorithm(x))) x <- fit(x) } if( is.nmf(x) ){ gpar <- .set.list.defaults(gpar , main="Mixture coefficient profile correlations" , xlab=paste("NMF model", xvar)) x <- coef(x) if( is.null(rownames(x)) ) rownames(x) <- paste("basis", 1:nrow(x), sep='_') }else if( is(x, 'ExpressionSet') ){ x <- Biobase::exprs(x) gpar <- .set.list.defaults(gpar , main="Expression profile correlations" , xlab=paste("ExpressionSet", xvar)) }else{ gpar <- .set.list.defaults(gpar , xlab=paste("Matrix ", xvar)) } # at this stage x must be a matrix if( !is.matrix(x) ) stop("NMF::profplot - Invalid argument `x`: could not extract mixture coefficient matrix") # extract mixture coefficient from y yvar <- deparse(substitute(y)) if( isNMFfit(y) ){ gpar <- .set.list.defaults(gpar , ylab=paste("NMF model", yvar, "- Method:", algorithm(y))) y <- fit(y) } if( is.nmf(y) ){ gpar <- .set.list.defaults(gpar , main="Mixture coefficient profile correlations" , ylab=paste("NMF model", yvar)) y <- coef(y) }else if( is(y, 'ExpressionSet') ){ y <- Biobase::exprs(y) gpar <- .set.list.defaults(gpar , main="Expression profile correlations" , ylab=paste("ExpressionSet", yvar)) }else{ gpar <- .set.list.defaults(gpar , ylab=paste("Matrix ", yvar)) } # at this stage y must be a matrix if( !is.matrix(y) ) stop("NMF::profplot - Invalid argument `y`: could not extract profile matrix") # match names if requested if( match.names && !is.null(rownames(x)) && !is.null(rownames(y)) ){ # match the row in x to the rows in y y.idx <- match(rownames(x), rownames(y), nomatch=0L) x.idx <- which(y.idx!=0L) # subset and reorder if possible if( length(x.idx) > 0L ){ res$y.idx <- y.idx[x.idx] y <- y[y.idx, , drop = FALSE] res$x.idx <- x.idx x <- x[x.idx, , drop = FALSE] } } # scale to proportions if requested if( missing(scale) ) scale <- NULL else if( isTRUE(scale) ) scale <- 'max' else if( isFALSE(scale) ) scale <- 'none' scale <- match.arg(scale) scales <- 'free' if( scale == 'max' ){ gpar <- .set.list.defaults(gpar , xlim=c(0,1), ylim=c(0,1)) # scale x iscale <- (xm <- apply(abs(x), 1L, max)) > 0 x[iscale, ] <- sweep(x[iscale, , drop = FALSE], 1L, xm[iscale], '/') # scale y iscale <- (ym <- apply(abs(y), 1L, max)) > 0 y[iscale, ] <- sweep(y[iscale, , drop = FALSE], 1L, ym[iscale], '/') scales <- 'fixed' } else if( scale == 'c1' ){ gpar <- .set.list.defaults(gpar , xlim=c(0,1), ylim=c(0,1)) x <- sum2one(x) y <- sum2one(y) }else{ Mx <- max(x, y); mx <- min(x, y) # extend default limits by a 0.25 factor Mx <- Mx * 1.25 mx <- mx * 0.75 gpar <- .set.list.defaults(gpar , xlim=c(mx,Mx), ylim=c(mx,Mx)) } gpar <- .set.list.defaults(gpar , main="Profile correlations") # plot the correlation plot p <- do.call(corplot, c(list(x=t(x), y=t(y), scales = scales, legend=legend, confint=confint, add=add), gpar)) p <- expand_list(p, list(idx.map = res)) # return result list return( p ) } # extract mixture coefficient xvar <- deparse(substitute(x)) if( isNMFfit(x) ){ gpar <- .set.list.defaults(gpar, main=paste("Mixture coefficient profiles\nNMF method:", algorithm(x), "- runs:", nrun(x))) x <- fit(x) } if( is.nmf(x) ){ gpar <- .set.list.defaults(gpar, main="Mixture coefficient profiles") x <- coef(x) }else if( is(x, 'ExpressionSet') ){ x <- Biobase::exprs(x) gpar <- .set.list.defaults(gpar, main="Expression profiles") } # at this stage x must be a matrix if( !is.matrix(x) ) stop("NMF::profplot - Invalid argument `x`: could not extract profile matrix") # scale to proportions if requested if( missing(scale) || !isTRUE(scale) ) scale <- FALSE if( scale ){ gpar <- .set.list.defaults(gpar, ylim=c(0,1)) x <- sum2one(x) } # reorder the samples if requested if( missing(labels) ){ labels <- if( !is.null(colnames(x)) ) colnames(x) else 1:ncol(x) } else if( length(labels) != ncol(x) ){ labels <- rep(labels, length.out=ncol(x)) # stop("NMF::profplot - Invalid argument `labels`: length should be equal to the number of columns in ", xvar, " [=", ncol(x),"]") } # check annotation if( !missing(annotation) && length(annotation) != ncol(x) ) stop("NMF::profplot - Invalid argument `annotation`:: length should be equal to the number of columns in ", xvar, " [=", ncol(x),"]") # reorder the columns if requested if( !missing(Colv) && !is_NA(Colv) ){ ord <- if( length(Colv) == 1 ){ if( !is.numeric(Colv) || abs(Colv) > nrow(x) ) stop("NMF::profplot - Invalid singel argument `Colv`: should be an integer between -nrow(x) and nrow(", xvar,") (i.e. [[-", nrow(x),",", nrow(x),"]])") order(x[abs(Colv),], decreasing=Colv<0) }else{ if( length(Colv) != ncol(x) ) stop("NMF::profplot - Invalid length for argument `Colv`: should be of length ncol(", xvar, ") [=", nrow(x),"]") if( is.integer(Colv) && length(setdiff(Colv, 1:ncol(x)))==0 ) Colv else order(Colv) } # use Colv as annotation if not requested otherwise if( missing(annotation) && is.factor(Colv) ) annotation <- Colv # reorder all relevant quantities x <- x[,ord] labels <- labels[ord] if( !missing(annotation) && !is_NA(annotation) ) annotation <- annotation[ord] } # set default arguments cols <- rainbow(nrow(x)) gpar <- .set.list.defaults(gpar , xlab="Samples" , ylab="Mixture coefficient value" , main="Profile plot" , type='o' , lty=1 , pch=19 , cex=0.8 , col=cols) # plot using matplot do.call(matplot, c(list(x=t(x)), gpar, xaxt='n')) # add legend if requested if( !isFALSE(legend) ){ if( isTRUE(legend) ) legend <- 'topleft' # use the rownames for the legend leg <- rownames(x) if( is.null(leg) ) leg <- paste('basis', 1:nrow(x), sep='_') legend(legend, legend=leg, col=gpar$col, lwd=1, pch=gpar$pch) } # axis ticks px <- 1:ncol(x) axis(1, at = px, labels = FALSE) # setup grid-base mixed graphic vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) # clean up on exit on.exit(popViewport(3), add=TRUE) voffset <- 1 # add sample annotation if( !missing(annotation) && !is_NA(annotation) && is.factor(annotation) ){ grid.rect(x = unit(px, "native"), unit(-voffset, "lines") , width = unit(1, 'native'), height = unit(1, "lines") , gp = gpar(fill=alphacol(rainbow(nlevels(annotation))[annotation], 50), col = 'gray')) voffset <- voffset+1 } # add labels if( !is_NA(labels) ){ # setup grid-base mixed graphic #library(gridBase) #vps <- baseViewports() #pushViewport(vps$inner, vps$figure, vps$plot) # add axis adj <- if( is.character(labels) && max(nchar(labels)) >= 7 ) list(just='right', rot=45) else list(just='center', rot=0) grid.text(labels , x = unit(px, "native"), y = unit(-voffset,"lines") , just = adj$just, rot = adj$rot) voffset <- voffset+1 # clean up on exit #popViewport(3) } invisible(nrow(x)) # add xlab #if( nchar(xlab) > 0 ) # grid.text(xlab, x = unit(length(px)/2, "native"), y = unit(-voffset,"lines"), just = 'center') } #setGeneric('profplot', function(x, y, ...) standardGeneric('profplot')) #setMethod('profplot', signature(x='matrix', y='missing') # , function(x, y, ...){ # # gpar <- .set.list.defaults(list(...) # , xlim=c(0,1), ylim=c(0,1) # , main="Profile plot" # , type='b' # , pch=19) # # do.call(matplot, c(gpar, x=t(sum2one(x)), y=t(sum2one(y)))) # } #) #setMethod('profplot', signature(x='matrix', y='matrix') # , function(x, y, scale=FALSE, ...){ # # # x is the reference, y the estimation # if( scale ){ # gpar <- .set.list.defaults(list(...) # , xlim=c(0,1), ylim=c(0,1) # , main="Profile correlation plot") # do.call(corplot, c(gpar, x=t(sum2one(x)), y=t(sum2one(y)))) # }else # corplot(t(x), t(y), ...) # # } #) #setMethod('profplot', signature(x='matrix', y='NMF') # , function(x, y, ...){ # profplot(x, coef(y), ...) # } #) #setMethod('profplot', signature(x='NMF', y='ANY') # , function(x, y, ...){ # profplot(coef(x), y, ...) # } #) #setMethod('profplot', signature(x='matrix', y='NMFfit') # , function(x, y, ...){ # # if( !missing(y) ){ # x is the reference, y the estimation # # # map components to the references # title <- paste("Profile correlation plot - Method:", algorithm(y)) # gpar <- .set.list.defaults(list(...), # list(main=title)) # do.call(profplot, c(gpar, x=x, y=fit(y))) # } # } #) #setMethod('profplot', signature(x='matrix', y='NMFfitXn') # , function(x, y, ...){ # profplot(x, minfit(y), ...) # } #) #setMethod('profplot', signature(x='NMFfitXn', y='ANY') # , function(x, y, ...){ # profplot(minfit(x), y, ...) # } #) #' Silhouette of NMF Clustering #' #' @param x an NMF object, as returned by \code{\link{nmf}}. #' @param what defines the type of clustering the computed silhouettes are #' meant to assess: \code{'samples'} for the clustering of samples #' (i.e. the columns of the target matrix), #' \code{'features'} for the clustering of features (i.e. the rows of the #' target matrix), and \code{'chc'} for the consensus clustering of samples as #' defined by hierarchical clustering dendrogram, \code{'consensus'} for the #' consensus clustering of samples, with clustered ordered as in the #' \strong{default} hierarchical clustering used by #' \code{\link{consensusmap}} when plotting the heatmap of the consensus matrix #' (for multi-run NMF fits). #' That is \code{dist = 1 - consensus(x)}, average linkage and reordering based #' on row means. #' @param order integer indexing vector that can be used to force the silhouette #' order. #' @param ... extra arguments not used. #' #' @seealso \code{\link[NMF]{predict}} #' @export #' @import cluster #' @examples #' #' x <- rmatrix(75, 15, dimnames = list(paste0('a', 1:75), letters[1:15])) #' # NB: using low value for maxIter for the example purpose only #' res <- nmf(x, 4, nrun = 3, maxIter = 20) #' #' # sample clustering from best fit #' plot(silhouette(res)) #' #' # average silhouette are computed in summary measures #' summary(res) #' #' # consensus silhouettes are ordered as on default consensusmap heatmap #' \dontrun{ op <- par(mfrow = c(1,2)) } #' consensusmap(res) #' si <- silhouette(res, what = 'consensus') #' plot(si) #' \dontrun{ par(op) } #' #' # if the order is based on some custom numeric weights #' \dontrun{ op <- par(mfrow = c(1,2)) } #' cm <- consensusmap(res, Rowv = runif(ncol(res))) #' # NB: use reverse order because silhouettes are plotted top-down #' si <- silhouette(res, what = 'consensus', order = rev(cm$rowInd)) #' plot(si) #' \dontrun{ par(op) } #' #' # do the reverse: order the heatmap as a set of silhouettes #' si <- silhouette(res, what = 'features') #' \dontrun{ op <- par(mfrow = c(1,2)) } #' basismap(res, Rowv = si) #' plot(si) #' \dontrun{ par(op) } #' silhouette.NMF <- function(x, what = NULL, order = NULL, ...){ # compute prediction p <- predict(x, what = what, dmatrix = TRUE) # compute silhouette si <- silhouette(as.numeric(p), dmatrix = attr(p, 'dmatrix')) attr(si, 'call') <- match.call(call = sys.call(-1)) if( is_NA(si) ) return(NA) # fix rownames if necessary if( is.null(rownames(si)) ){ rownames(si) <- names(p) if( is.null(rownames(si)) ) rownames(si) <- 1:nrow(si) } if( is.null(order) && !is.null(attr(p, 'iOrd')) ){ # reorder as defined in prediction order <- attr(p, 'iOrd') } # order the silhouette if( !is.null(order) && !is_NA(order) ){ si[1:nrow(si), ] <- si[order, , drop = FALSE] rownames(si) <- rownames(si)[order] attr(si, 'iOrd') <- order attr(si, 'Ordered') <- TRUE } si } #' @export silhouette.NMFfitX <- function(x, ...){ si <- silhouette.NMF(x, ...) attr(si, 'call') <- match.call(call = sys.call(-1)) si } NMF/R/NMFStrategy-class.R0000644000176200001440000003303314333176413014473 0ustar liggesusers# S4 class for NMG algorithms # # Author: Renaud Gaujoux ############################################################################### #' @include algorithmic.R #' @include NMFSet-class.R NULL #' Generic Strategy Class #' #' This class defines a common interface for generic algorithm strategies #' (e.g., \code{\linkS4class{NMFStrategy}}). #' #' @slot name character string giving the name of the algorithm #' @slot package name of the package that defined the strategy. #' @slot defaults default values for some of the algorithm's arguments. #' #' @keywords internal setClass('Strategy' , contains = 'VIRTUAL' , representation = representation( name = 'character' # the strategy name , package = 'character' # the package that defines the strategy , defaults = 'list' ) , prototype = prototype( package = character() , name = character() ) , validity=function(object){ # slot 'name' must be a non-empty character string obj <- name(object) if( !length(obj) || (length(obj)>1L || obj=='') ) return(str_c("Slot 'name' must be a single non-empty character string [", obj, ']')) TRUE } ) #' Accessing Strategy Names #' #' \code{name} and \code{name<-} gets and sets the name associated with an object. #' In the case of \code{Strategy} objects it is the the name of the algorithm. #' #' @param object an R object with a defined \code{name} method #' @param ... extra arguments to allow extension #' @param value replacement value #' #' @export #' @inline #' @rdname Strategy-class setGeneric('name', function(object, ...) standardGeneric('name')) #' Returns the name of an algorithm #' @param all a logical that indicates if all the names associated with a strategy #' should be returned (\code{TRUE}), or only the first (primary) one (\code{FALSE}). setMethod('name', signature(object='Strategy'), function(object, all=FALSE){ n <- slot(object, 'name') if( length(n) && !all ) n[1L] else n } ) #' @export #' @inline #' @rdname Strategy-class setGeneric('name<-', function(object, ..., value) standardGeneric('name<-')) #' Sets the name(s) of an NMF algorithm setReplaceMethod('name', signature(object='Strategy', value='character'), function(object, value){ slot(object, 'name') <- value validObject(object) object } ) defaultArgument <- function(name, object, value, force=FALSE){ # taken from methods::hasArg aname <- as.character(substitute(name)) miss <- eval(substitute(missing(name)), sys.frame(sys.parent())) defaults <- attr(object, 'defaults') if( !miss && !force ) eval(substitute(name), sys.frame(sys.parent())) else if( aname %in% names(defaults) ) defaults[[aname]] else value } #' Virtual Interface for NMF Algorithms #' #' This class partially implements the generic interface defined for general #' algorithms defined in the \pkg{NMF} package (see \code{\link{algorithmic-NMF}}). #' #' @slot objective the objective function associated with the algorithm (Frobenius, Kullback-Leibler, etc...). #' It is either an access key of a registered objective function or a function definition. #' In the latter case, the given function must have the following signature \code{(x="NMF", y="matrix")} #' and return a nonnegative real value. #' #' @slot model a character string giving either the (sub)class name of the NMF-class instance used #' and returned by the strategy, or a function name. #' #' @slot mixed a logical that indicates if the algorithm works on mixed-sign data. #' #' @keywords internal setClass('NMFStrategy' , representation( objective = '.functionSlot' # the objective function used to compute the error (defined by name or function) , model = 'character' # NMF model to use , mixed = 'logical' # can the input data be negative? ) , prototype=prototype(objective='euclidean', model='NMFstd', mixed=FALSE) , validity=function(object){ # slot 'objective' must either be a non-empty character string or a function obj <- objective(object) if( is.character(obj) && obj == '' ) return("Slot 'objective' must either be a non-empty character string or a function definition.") # slot 'model' must be the name of a class that extends class 'NMF' obj <- modelname(object) if( !is.character(obj) ) return("Slot 'model' must be a character vector") if( any(inv <- !sapply(obj, isNMFclass)) ) return(paste("Slot 'model' must contain only names of a class that extends class 'NMF' [failure on class(es) " , paste( paste("'", obj[inv], "'", sep=''), collapse=', ') ,"]" , sep='')) # slot 'mixed' must be a single logical obj <- slot(object, 'mixed') if( length(obj) != 1 ) return( paste("Slot 'mixed' must be a single logical [length=", length(obj), "]", sep='') ) } , contains = c('VIRTUAL', 'Strategy') ) #' @export #' @rdname NMFStrategy-class setMethod('show', 'NMFStrategy', function(object){ cat('\n", sep='') cat(" name: ", name(object), " [", packageSlot(object), "]\n", sep='') svalue <- objective(object) svalue <- if( is.function(svalue) ) str_args(svalue, exdent=10) else paste("'", svalue,"'", sep='') cat(" objective:", svalue, "\n") cat(" model:", modelname(object), "\n") if( length(object@defaults) > 0L ){ cat(" defaults:", str_desc(object@defaults, exdent=10L), "\n") } return(invisible()) } ) # Coerce method for 'NMFStrategy' objects into 'character': give the main name setAs('NMFStrategy', 'character' , def = function(from) name(from) ) #' Factory Method for NMFStrategy Objects #' #' Creates NMFStrategy objects that wraps implementation of NMF algorithms into #' a unified interface. #' #' @param name name/key of an NMF algorithm. #' @param method definition of the algorithm #' @param ... extra arguments passed to \code{\link{new}}. #' #' @export #' @inline setGeneric('NMFStrategy', function(name, method, ...) standardGeneric('NMFStrategy') ) #' Creates an \code{NMFStrategyFunction} object that wraps the function \code{method} #' into a unified interface. #' #' \code{method} must be a function with signature \code{(y="matrix", x="NMFfit", ...)}, #' and return an object of class \code{\linkS4class{NMFfit}}. setMethod('NMFStrategy', signature(name='character', method='function'), function(name, method, ...){ # build a NMFStrategyFunction object on the fly to wrap function 'method' NMFStrategy(name=name, algorithm=method, ...) } ) #' Creates an \code{NMFStrategy} object based on a template object (Constructor-Copy). setMethod('NMFStrategy', signature(name='character', method='NMFStrategy'), function(name, method, ...){ package <- topns_name() # build an NMFStrategy object based on template object strategy <- new(class(method), method, name=name, ..., package=package) # valid the new strategy validObject(strategy) # add trace of inheritance from parent NMF algorithm attr(strategy, 'parent') <- name(method)[1] # return new object strategy } ) #' Creates an \code{NMFStrategy} based on a template object (Constructor-Copy), #' in particular it uses the \strong{same} name. setMethod('NMFStrategy', signature(name='NMFStrategy', method='missing'), function(name, method, ...){ # do not change the object if single argument if( nargs() == 1L ) return(name) # use the name as a key # NB: need special trick to avoid conflict between argument and function mname <- match.fun('name')(name) NMFStrategy(name=mname, method=name, ...) } ) #' Creates an \code{NMFStrategy} based on a registered NMF algorithm that is used #' as a template (Constructor-Copy), in particular it uses the \strong{same} name. #' #' It is a shortcut for \code{NMFStrategy(nmfAlgorithm(method, exact=TRUE), ...)}. setMethod('NMFStrategy', signature(name='missing', method='character'), function(name, method, ...){ NMFStrategy(nmfAlgorithm(method, exact=TRUE), ...) } ) #' Creates an \code{NMFStrategy} based on a template object (Constructor-Copy) #' but using a randomly generated name. setMethod('NMFStrategy', signature(name='NULL', method='NMFStrategy'), function(name, method, ...){ # use the name as a key # NB: need special trick to avoid conflict between argument and function mname <- match.fun('name')(method) mname <- basename(tempfile(str_c(mname, '_'))) NMFStrategy(name=mname, method=method, ...) } ) #' Creates an \code{NMFStrategy} based on a registered NMF algorithm that is used #' as a template. setMethod('NMFStrategy', signature(name='character', method='character'), function(name, method, ...){ NMFStrategy(name=name, method=nmfAlgorithm(method, exact=TRUE), ...) } ) #' Creates an \code{NMFStrategy} based on a registered NMF algorithm (Constructor-Copy) #' using a randomly generated name. #' #' It is a shortcut for \code{NMFStrategy(NULL, nmfAlgorithm(method), ...)}. setMethod('NMFStrategy', signature(name='NULL', method='character'), function(name, method, ...){ NMFStrategy(NULL, method=nmfAlgorithm(method, exact=TRUE), ...) } ) #' Creates an NMFStrategy, determining its type from the extra arguments passed #' in \code{...}: if there is an argument named \code{Update} then an #' \code{NMFStrategyIterative} is created, or if there is an argument #' named \code{algorithm} then an \code{NMFStrategyFunction} is created. #' Calls other than these generates an error. #' setMethod('NMFStrategy', signature(name='character', method='missing'), function(name, method, ...){ package <- topns_name() # check iterative strategy if( hasArg2('Update') ){ # create a new NMFStrategyIterative object new('NMFStrategyIterative', name=name, ..., package=package) }else if( hasArg2('algorithm') ){ new('NMFStrategyFunction', name=name, ..., package=package) }else{ stop('NMFStrategy - Could not infer the type of NMF strategy to instantiate.') } } ) #' Pure virtual method defined for all NMF algorithms to ensure #' that a method \code{run} is defined by sub-classes of \code{NMFStrategy}. #' #' It throws an error if called directly. #' @rdname NMFStrategy setMethod('run', signature(object='NMFStrategy', y='matrix', x='NMFfit'), function(object, y, x, ...){ stop("NMFStrategy::run is a pure virtual method that should be overloaded in class '", class(object),"'.") } ) #' Method to run an NMF algorithm directly starting from a given NMF model. #' @rdname NMFStrategy setMethod('run', signature(object='NMFStrategy', y='matrix', x='NMF'), function(object, y, x, ...){ run(object, y, NMFfit(fit=x, seed='none', method=name(object)), ...) } ) #' Computes the value of the objective function between the estimate \code{x} #' and the target \code{y}. #' #' @param x an NMF model that estimates \code{y}. #' #' @inline setMethod('deviance', 'NMFStrategy', function(object, x, y, ...){ obj.fun <- slot(object, 'objective') # return the distance computed using the strategy's objective function if( !is.function(obj.fun) ) deviance(x, y, method=obj.fun, ...) else # directly compute the objective function obj.fun(x, y, ...) } ) #' Gets the objective function associated with an NMF algorithm. #' #' It is used in \code{\link[=deviance,NMFStrategy-method]{deviance}} #' to compute the objective value for an NMF model with respect to #' a given target matrix. #' #' @export #' @rdname NMFStrategy-class setMethod('objective', 'NMFStrategy', function(object){ slot(object, 'objective') } ) #' Sets the objective function associated with an NMF algorithm, with a character string #' that must be a registered objective function. #' @export #' @rdname NMFStrategy-class setReplaceMethod('objective', signature(object='NMFStrategy', value='character'), function(object, value){ #TODO: test for the existence of objective method slot(object, 'objective') <- value validObject(object) object } ) #' Sets the objective function associated with an NMF algorithm, with a function #' that computes the approximation error between an NMF model and a target matrix. #' @export #' @rdname NMFStrategy-class setReplaceMethod('objective', signature(object='NMFStrategy', value='function'), function(object, value){ slot(object, 'objective') <- value validObject(object) object } ) #' Returns the model(s) that an NMF algorithm can fit. #' #' @examples #' # get the type of model(s) associated with an NMF algorithm #' modelname( nmfAlgorithm('brunet') ) #' modelname( nmfAlgorithm('nsNMF') ) #' modelname( nmfAlgorithm('offset') ) #' setMethod('modelname', signature(object='NMFStrategy'), function(object){ slot(object, 'model') } ) #' \code{is.mixed} tells if an NMF algorithm works on mixed-sign data. #' @export #' @rdname NMFStrategy-class is.mixed <- function(object){ return( slot(object, 'mixed') ) } #' Showing Arguments of NMF Algorithms #' #' This function returns the extra arguments that can be passed #' to a given NMF algorithm in call to \code{\link{nmf}}. #' #' @param x algorithm specification #' @param ... extra argument to allow extension #' #' @export nmfFormals <- function(x, ...){ UseMethod('nmfFormals') } #' @export nmfFormals.character <- function(x, ...){ s <- nmfAlgorithm(x) nmfFormals(s, ...) } #' @export nmfFormals.NMFStrategy <- function(x, ...){ m <- getMethod('run', signature(object='NMFStrategy', y='matrix', x='NMFfit')) args <- allFormals(m) # prepend registered default arguments expand_list(x@defaults, args) } #' \code{nmfArgs} is a shortcut for \code{args(nmfWrapper(x))}, to #' display the arguments of a given NMF algorithm. #' #' @rdname nmfFormals #' @export #' @examples #' #' # show arguments of an NMF algorithm #' nmfArgs('brunet') #' nmfArgs('snmf/r') nmfArgs <- function(x){ args(nmfWrapper(x)) } NMF/R/NMFstd-class.R0000644000176200001440000001756514333176413013477 0ustar liggesusers# Class that implements the standard NMF model # # Author: Renaud Gaujoux \email{renaud@@cbio.uct.ac.za} ############################################################################### #' @include NMF-class.R NULL #' NMF Model - Standard model #' #' This class implements the standard model of Nonnegative Matrix #' Factorization. #' It provides a general structure and generic functions to manage #' factorizations that follow the standard NMF model, as defined by #' \cite{Lee2001}. #' #' Let \eqn{V} be a \eqn{n \times m} non-negative matrix and \eqn{r} a positive #' integer. In its standard form (see references below), a NMF of \eqn{V} is #' commonly defined as a pair of matrices \eqn{(W, H)} such that: #' #' \deqn{V \equiv W H,} #' #' where: #' \itemize{ #' \item \eqn{W} and \eqn{H} are \eqn{n \times r} and \eqn{r #' \times m} matrices respectively with non-negative entries; #' \item \eqn{\equiv} is to be understood with respect to some loss function. #' Common choices of loss functions are based on Frobenius norm or Kullback-Leibler #' divergence. #' } #' #' Integer \eqn{r} is called the \emph{factorization rank}. #' Depending on the context of application of NMF, the columns of \eqn{W} #' and \eqn{H} are given different names: #' \describe{ #' \item{columns of \code{W}}{basis vector, metagenes, factors, source, image basis} #' \item{columns of \code{H}}{mixture coefficients, metagene sample expression profiles, weights} #' \item{rows of \code{H}}{basis profiles, metagene expression profiles} #' } #' #' NMF approaches have been successfully applied to several fields. #' The package NMF was implemented trying to use names as generic as possible #' for objects and methods. #' #' The following terminology is used: #' \describe{ #' \item{samples}{the columns of the target matrix \eqn{V}} #' \item{features}{the rows of the target matrix \eqn{V}} #' \item{basis matrix}{the first matrix factor \eqn{W}} #' \item{basis vectors}{the columns of first matrix factor \eqn{W}} #' \item{mixture matrix}{the second matrix factor \eqn{H}} \item{mixtures #' coefficients}{the columns of second matrix factor \eqn{H}} #' } #' #' However, because the package NMF was primarily implemented to work with gene #' expression microarray data, it also provides a layer to easily and #' intuitively work with objects from the Bioconductor base framework. #' See \link{bioc-NMF} for more details. #' #' @slot W A \code{matrix} that contains the basis matrix, i.e. the \emph{first} #' matrix factor of the factorisation #' @slot H A \code{matrix} that contains the coefficient matrix, i.e. the #' \emph{second} matrix factor of the factorisation #' @slot bterms a \code{data.frame} that contains the primary data that #' define fixed basis terms. See \code{\link{bterms}}. #' @slot ibterms integer vector that contains the indexes of the basis components #' that are fixed, i.e. for which only the coefficient are estimated. #' #' IMPORTANT: This slot is set on construction of an NMF model via #' \code{\link[=nmfModel,formula,ANY-method]{nmfModel}} and is not recommended to #' not be subsequently changed by the end-user. #' @slot cterms a \code{data.frame} that contains the primary data that #' define fixed coefficient terms. See \code{\link{cterms}}. #' @slot icterms integer vector that contains the indexes of the basis components #' that have fixed coefficients, i.e. for which only the basis vectors are estimated. #' #' IMPORTANT: This slot is set on construction of an NMF model via #' \code{\link[=nmfModel,formula,ANY-method]{nmfModel}} and is not recommended to #' not be subsequently changed by the end-user. #' #' @export #' @family NMF-model #' @examples #' # create a completely empty NMFstd object #' new('NMFstd') #' #' # create a NMF object based on one random matrix: the missing matrix is deduced #' # Note this only works when using factory method NMF #' n <- 50; r <- 3; #' w <- rmatrix(n, r) #' nmfModel(W=w) #' #' # create a NMF object based on random (compatible) matrices #' p <- 20 #' h <- rmatrix(r, p) #' nmfModel(W=w, H=h) #' #' # create a NMF object based on incompatible matrices: generate an error #' h <- rmatrix(r+1, p) #' try( new('NMFstd', W=w, H=h) ) #' try( nmfModel(w, h) ) #' #' # Giving target dimensions to the factory method allow for coping with dimension #' # incompatibilty (a warning is thrown in such case) #' nmfModel(r, W=w, H=h) #' setClass('NMFstd' , representation( W = 'matrix' # basis matrix , H = 'matrix' # mixture coefficients matrix , bterms = 'data.frame' # fixed basis terms: nrow(bterms) = nrow(x) , ibterms = 'integer' # index of the fixed basis terms , cterms = 'data.frame' # fixed coef terms: ncol(cterms) = ncol(x) , icterms = 'integer' # index of the fixed coefficient terms ) , prototype = prototype( W = matrix(as.numeric(NA), 0, 0), H = matrix(as.numeric(NA), 0, 0) ) , validity = function(object){ # dimension compatibility: W and H must be compatible for matrix multiplication if( ncol(object@W) != nrow(object@H) ){ return(paste('Dimensions of W and H are not compatible [ncol(W)=', ncol(object@W) , '!= nrow(H)=', nrow(object@H), ']')) } # give a warning if the dimensions look strange: rank greater than the number of samples if( !is.empty.nmf(object) && ncol(object@H) && ncol(object@W) > ncol(object@H) ){ warning(paste('Dimensions of W and H look strange [ncol(W)=', ncol(object@W) , '> ncol(H)=', ncol(object@H), ']')) } # everything went fine: return TRUE return(TRUE) } , contains = 'NMF' ) #' Get the basis matrix in standard NMF models #' #' This function returns slot \code{W} of \code{object}. #' #' @examples #' # random standard NMF model #' x <- rnmf(3, 10, 5) #' basis(x) #' coef(x) #' #' # set matrix factors #' basis(x) <- matrix(1, nrow(x), nbasis(x)) #' coef(x) <- matrix(1, nbasis(x), ncol(x)) #' # set random factors #' basis(x) <- rmatrix(basis(x)) #' coef(x) <- rmatrix(coef(x)) #' #' # incompatible matrices generate an error: #' try( coef(x) <- matrix(1, nbasis(x)-1, nrow(x)) ) #' # but the low-level method allow it #' .coef(x) <- matrix(1, nbasis(x)-1, nrow(x)) #' try( validObject(x) ) #' setMethod('.basis', 'NMFstd', function(object){ object@W } ) #' Set the basis matrix in standard NMF models #' #' This function sets slot \code{W} of \code{object}. setReplaceMethod('.basis', signature(object='NMFstd', value='matrix'), function(object, value){ object@W <- value object } ) #' Get the mixture coefficient matrix in standard NMF models #' #' This function returns slot \code{H} of \code{object}. setMethod('.coef', 'NMFstd', function(object){ object@H } ) #' Set the mixture coefficient matrix in standard NMF models #' #' This function sets slot \code{H} of \code{object}. setReplaceMethod('.coef', signature(object='NMFstd', value='matrix'), function(object, value){ object@H <- value object } ) #' Compute the target matrix estimate in \emph{standard NMF models}. #' #' The estimate matrix is computed as the product of the two matrix slots #' \code{W} and \code{H}: #' \deqn{\hat{V} = W H}{V ~ W H} #' #' @param W a matrix to use in the computation as the basis matrix in place of #' \code{basis(object)}. #' It must be compatible with the coefficient matrix used #' in the computation (i.e. number of columns in \code{W} = number of rows in \code{H}). #' @param H a matrix to use in the computation as the coefficient matrix in place of #' \code{coef(object)}. #' It must be compatible with the basis matrix used #' in the computation (i.e. number of rows in \code{H} = number of columns in \code{W}). #' #' @export #' @inline #' #' @examples #' # random standard NMF model #' x <- rnmf(3, 10, 5) #' all.equal(fitted(x), basis(x) %*% coef(x)) #' #' setMethod('fitted', signature(object='NMFstd'), function(object, W, H, ...){ if( missing(W) ) W <- object@W if( missing(H) ) H <- object@H return(W %*% H) } ) NMF/R/algorithms-pe-nmf.R0000644000176200001440000000367714333176413014571 0ustar liggesusers#' @include registry-algorithms.R NULL ###% NMF Algorithm: Pattern Expression NMF ###% ###% Implements the PE-NMF algorithm from Zhang et al (2008). ###% ###% It is implemented using the iterative schema defined by the ###% NMFStrategyIterative class. ###% The algorithm minimizes the Frobenius norm, with two regularization terms ###% (one for each matrix factor) parametrized by two parameters: ###% ###% min_{W,H} 1/2 ||V - WH||^2 ###% + alpha \sum_{i<>j} W_i^T W_j ###% + beta \sum_{i,j} H_{ij} ###% ###% So there is two parameters: alpha and beta. ###% The updates for the matrix factors are (in R notations): ###% ###% H_{i+1} = H_i ( W_i^T %*% V ) / ( W_i^T %*% W_i %*% H_i + beta) ###% W_{i+1} = W_i ( V %*% H_i^T ) / ( W_i %*% H_i %*% H_i^T + alpha W_i %*% M ) ###% ###% with matrix M is full of one with diagonal zero. ###% ###% @author Renaud Gaujoux ###% @creation 17 Jan 2010 ###% penmf.objective <- function(fit, x, alpha, beta, ...) { w <- .basis(fit) 1/2 * sum( (x - fitted(fit))^2 ) + alpha * ( crossprod(w) - sum(w^2) ) + beta * sum(.coef(fit)) } nmf_update.penmf <- function(i, x, data, alpha, beta, ...){ # retrieve each factor w <- .basis(data); h <- .coef(data); # At the first iteration initialise matrix M if( TRUE || i == 1 ){ r <- ncol(w) M <- matrix(1, nrow=r, ncol=r) - diag(1, r) #staticVar('M', M, init=TRUE) } #else M <- staticVar('M') #precision threshold for numerical stability eps <- 10^-9 # H_{i+1} = H_i ( W_i^T %*% V ) / ( W_i^T %*% W_i %*% H_i + beta) h <- h * crossprod(w, x) / ( crossprod(w) %*% h + beta) # W_{i+1} = W_i ( V %*% H_i^T ) / ( W_i %*% H_i %*% H_i^T + alpha W_i %*% M ) w <- w * tcrossprod(x, h) / ( w %*% tcrossprod(h) + alpha * w %*% M ) #return the modified data .basis(data) <- w; .coef(data) <- h; data } # register PE-NMF nmfAlgorithm.peNMF <- setNMFMethod('pe-nmf', objective = penmf.objective , model='NMFstd' , Update= nmf_update.penmf , Stop='stationary') NMF/R/run.R0000644000176200001440000000411014333176413012023 0ustar liggesusers# Functions produce reports # # Author: Renaud Gaujoux # Created: 23 Jul 2013 ############################################################################### #' Run NMF Methods and Generate a Report #' #' Generates an HTML report from running a set of method on a given #' target matrix, for a set of factorization ranks. #' #' The report is based on an .Rmd document \code{'report.Rmd'} stored in #' the package installation sub-directory \code{scripts/}, and is compiled #' using \pkg{knitr}. #' #' At the beginning of the document, a file named \code{'functions.R'} is #' looked for in the current directory, and sourced if present. #' This enables the definition of custom NMF methods (see \code{\link{setNMFMethod}}) #' or setting global options. #' #' @param x target matrix #' @param rank factorization rank #' @param method list of methods to apply #' @param colClass reference class to assess accuracy #' @param ... extra paramters passed to \code{\link{nmf}} #' @param output output HTML file #' @param template template Rmd file #' #' @return a list with the following elements: #' \item{fits}{the fit(s) for each method and each value of the rank.} #' \item{accuracy}{a data.frame that contains the summary assessment measures, #' for each fit.} #' #' @export #' @examples #' #' \dontrun{ #' #' x <- rmatrix(20, 10) #' gr <- gl(2, 5) #' nmfReport(x, 2:4, method = list('br', 'lee'), colClass = gr, nrun = 5) #' #' } nmfReport <- function(x, rank, method, colClass = NULL, ..., output = NULL, template = NULL){ requireNamespace('knitr') #library(knitr) if( is.null(template) ) template <- system.file('scripts/report.Rmd', package = 'NMF') x <- force(x) rank <- force(rank) method <- force(method) if( isString(method) ) method <- list(method) args <- list(...) nmfRun <- function(x, rank, method, ...){ args <- expand_dots(args) str(args) do.call(nmf, c(list(x, rank, method), args)) } accuracy <- NA res <- NA knitr::knit2html(template) res <- list(fits = res, accuracy = accuracy) saveRDS(res, file = 'report_results.rds') invisible(res) } NMF/R/options.R0000644000176200001440000010444014560453660012725 0ustar liggesusers###% Options management ###% ###% ###% @author Renaud Gaujoux \email{renaud@@cbio.uct.ac.za} ###% setupPackageOptions <- function(..., NAME=NULL, ENVIR=topenv(parent.frame()), RESET = isLoadingNamespace()){ defaults <- .list_or_named_dots(...) # do not write into the Global environment e <- parent.frame() if( missing(ENVIR) && identical(e, .GlobalEnv) ){ ENVIR <- NULL } # get calling package pkg <- packageName(.Global=TRUE) # prefix for the wrapper functions fprefix <- if( is.null(NAME) ) tolower(pkg) else NAME # define name for the option set optname <- pkg if( !is.null(NAME) ) optname <- paste(optname, NAME, sep=':') # create package_options object optobj <- as.package_options(optname, defaults=defaults) # check if options with the same key are not already registered OLD <- getOption(optobj$name) if( !is.null(OLD) && !RESET ) stop("Package specific options '", OLD$name, "' already exist: " , " (", length(OLD$options())," default option(s))") # register the package_options object in global options message(if( is.null(OLD) ) "Setting" else "Resetting" , " package specific options: ", optobj$name , " (", length(optobj$options())," default option(s))") options(setNames(list(optobj), optobj$name)) # (re)load registered package_options object from global options optobj <- getOption(optobj$name) stopifnot( !is.null(optobj) ) # define wrapper functions in the supplied environment if( !is.null(ENVIR) ){ isfun <- unlist(eapply(optobj, is.function)) isfun <- isfun[names(isfun) != 'newOptions'] ifun <- which(isfun) lapply(names(isfun)[ifun], function(x){ f <- get(x, envir=optobj) assign(paste(fprefix, x, sep='.'), f, envir=ENVIR) }) } # return package_options object optobj } .options <- function(..., .DATA){ opts <- if( is.package_options(.DATA) || is.environment(.DATA) ) .DATA$.options else .DATA params <- .list_or_named_dots(...) # return complete option list if no other argument was passed if( is.null(params) ) return(opts) # initialise opts to an empty list if necessary if( is.null(opts) ) opts <- list() stopifnot( is.list(opts) ) # READ ACCESS if ( is.null(names(params)) ){ if( !is.character(c(...)) ) stop('character strings expected for option names') cparams <- c(...) # retrieve options as a list (use sapply to also get non-existing options) res <- sapply(cparams, function(n){ # follow link if necessary opts[[option_symlink_target(n, opts)]] }, simplify=FALSE) return(res) } # WRITE ACCESS old <- sapply(names(params), function(name){ # assign the new value into the options environment val <- params[[name]] old <- opts[[name]] # change value of target if symlink and the new value is not a symlink if( is_option_symlink(old) && !is_option_symlink(val) ) opts[[option_symlink_target(name, opts)]] <<- val else opts[[name]] <<- val # return the option's old value old } , simplify = FALSE ) #old <- old[!sapply(old, is.null)] # update package_options object in place if necessary (NB: it is an environment) if( is.package_options(.DATA) || is.environment(.DATA) ) .DATA$.options <- opts # return old values of the modified options return( invisible(old) ) } .list_or_named_dots <- function(..., named.only=FALSE){ dots <- list(...) if( length(dots) == 0L ) return() params <- dots if( is.null(names(dots)) && length(dots)==1L ){ if ( is.list(dots[[1L]]) ){ params <- dots[[1L]] if( is.null(names(params)) || any(names(params)=='') ) stop("single list argument must only have named elements") } } if( named.only ){ if( is.null(names(params)) || any(names(params)=='') ) stop("all arguments be named") } params } as.package_options <- function(..., defaults=NULL){ args <- .list_or_named_dots(...) x <- if( is.null(names(args)) ) args[[1]] if( !is.null(names(args)) ) defaults <- args if( is.null(x) ) x <- basename(tempfile('')) # early exit if already a package_options object if( is.package_options(x) ){ # new defaults?: clone into a new package_options object if( !missing(defaults) && is.list(defaults) ){ optname <- basename(tempfile(str_c(x$name, '_'))) x <- as.package_options(x$.options, defaults) x$name <- optname } return(x) } # create a package_options object .OPTOBJ <- structure(list2env(list(name=NULL, .options=NULL, .defaults=defaults)) , class='package_options') if( is.character(x) ){ # build name as 'package:*' x <- sub("^package:", '', x) .OPTOBJ$name <- paste('package:', x[1L], sep='') }else if( is.list(x) ){ .OPTOBJ$name <- tempfile('package:') .OPTOBJ$.options <- x }else stop("Invalid argument `x`: must be a character string or a list.") # define options() .OPTOBJ$options <- function(...){ # call .options on package_options object .options(..., .DATA=.OPTOBJ) } # define getOption .OPTOBJ$getOption <- function (x, default = NULL) { # use local specific function options() options <- .OPTOBJ$options if (missing(default)) return(options(x)[[1L]]) if (x %in% names(options())) options(x)[[1L]] else default } # define newOption .OPTOBJ$newOptions <- function(...){ defs <- .list_or_named_dots(..., named.only=TRUE) lapply(seq_along(defs), function(i){ name <- names(defs)[i] value <- defs[[i]] # check defaults in_opts <- name %in% names(.OPTOBJ$.defaults) && !identical(.OPTOBJ$.defaults[[name]], value) if( in_opts && !isLoadingNamespace() ){ message("Skipping option ", .OPTOBJ$name, "::`", name, "`: already defined with another default value") }else{ if( in_opts ) message("Overwriting option ", .OPTOBJ$name, "::`", name, "` : already defined with another default value") .OPTOBJ$.defaults[[name]] <- value .OPTOBJ$.options[[name]] <- value } }) invisible() } # define resetOptions .OPTOBJ$resetOptions <- function(..., ALL=FALSE){ defaults <- .OPTOBJ$.defaults if( ALL ){ .OPTOBJ$.options <- NULL } if( length(list(...)) > 0L ){ onames <- c(...) if( !is.character(onames) ) stop('character strings expected for resetting option names') defaults <- defaults[names(defaults) %in% onames] if( length(not_default <- onames[!onames %in% names(defaults)]) ){ .OPTOBJ$.options[not_default] <- NULL } } if( length(defaults) ){ .OPTOBJ$options(defaults) } } # define showOptions .OPTOBJ$printOptions <- function() print(.OPTOBJ) # initialise with default options .OPTOBJ$resetOptions() # return pacakge_options object .OPTOBJ } is.package_options <- function(x){ is(x, 'package_options') } option_symlink <- function(x){ if( !is.character(x) ) stop("Symbolic link options must be character strings") structure(x, class='option_symlink') } is_option_symlink <- function(x, opts){ if( missing(opts) ) is(x, 'option_symlink') else is(opts[[x]], 'option_symlink') } option_symlink_target <- function(x, opts){ if( !is.list(opts) ) stop("invalid argument `opts`: must be a list object") n <- 0 track <- NULL while( is_option_symlink(x, opts) ){ if( x %in% track ) stop("cycling symbolic link options: ", str_out(c(track, x), Inf, sep=' -> ')) track <- c(track, x) x <- opts[[x]] n <- n + 1 } x } packageName <- function(envir=packageEnv(), .Global=FALSE, rm.prefix=TRUE){ if( is.null(envir) ) envir <- packageEnv() if( is.character(envir) ){ return( sub("^package:", "", envir) ) } # retrieve package environment e <- envir # try with name from environment nm <- environmentName(e) if( identical(e, .GlobalEnv) && .Global ) return(nm) else if( isNamespace(e) || identical(e, baseenv()) ) return(nm) else if( grepl("^package:", nm) ){# should work for devtools packages if( rm.prefix ) nm <- sub("^package:", "", nm) return(nm) } # try to find the name from the package's environment (namespace) if( exists('.packageName', e) && .packageName != 'datasets' ){ if( .packageName != '' ) return(.packageName) } # get the info from the loadingNamespace info <- getLoadingNamespace(info=TRUE) if( !is.null(info) ) # check whether we are loading the namespace info$pkgname else{# error stop("Could not reliably determine package name [", nm, "]") } } packagePath <- function(..., package=NULL, lib.loc=NULL, check = TRUE){ # try to find the path from the package's environment (namespace) pname <- packageName(package) # check if one is currently loading the namespace path <- NULL if( !is.null(info <- getLoadingNamespace(info=TRUE)) && info$pkgname == pname ){ path <- info$path }else { # try loaded/installed package path <- find.package(package=pname, lib.loc=lib.loc, quiet=TRUE) } # somehow this fails when loading an installed package but is works # when loading a package during the post-install check if( !length(path) || path == '' ){ # get the info from the loadingNamespace if( !is.null(info <- getLoadingNamespace(info=TRUE)) ){ path <- info$path } } # check if the path was found if( !length(path) || !nzchar(path) ){ if( check ) stop("Could not find path to package ", package) return(NULL) } # for development packages: add inst prefix if necessary if( isDevNamespace(pname) ){ # handle special sub-directories of the package's root directory dots <- list(...) Rdirs <- c('data', 'R', 'src', 'exec', 'tests', 'demo' , 'exec', 'libs', 'man', 'help', 'html' , 'Meta') if( length(dots) && !sub("^/?([^/]+).*", "\\1", ..1) %in% Rdirs) path <- file.path(path,'inst') } # add other part of the path file.path(path, ...) } packageEnv <- function(pkg, skip=FALSE, verbose=FALSE){ # return package namespace if( !missing(pkg) && !is.null(pkg) ){ # - if the package is loaded: use asNamespace because as.environment does not # return a correct environment (don't know why) # - as.environment('package:*') will return the correct environment # in dev mode. env <- if( is.environment(pkg) ) topenv(pkg) else if( isLoadingNamespace(pkg) ) getLoadingNamespace(env=TRUE) else if( !is.null(path.package(pkg, quiet=TRUE)) ) asNamespace(pkg) else if( isNamespaceLoaded(pkg) ) asNamespace(pkg) else if( pkg %in% search() ) as.environment(pkg) else as.environment(str_c('package:', pkg)) # dev mode return(env) } envir = parent.frame() # message("parent.frame: ", str_ns(envir)) pkgmakerEnv <- topenv() # message("pkgmaker ns: ", str_ns(pkgmakerEnv)) n <- 1 skipEnv <- pkgmakerEnv while( identical(e <- topenv(envir), skipEnv) && !identical(e, emptyenv()) && !identical(e, .GlobalEnv) ){ if( verbose > 1 ) print(e) n <- n + 1 envir <- parent.frame(n) } if( !skip ){ if( identical(e, .BaseNamespaceEnv) ){ if( verbose ) message("packageEnv - Inferred ", str_ns(skipEnv)) return( skipEnv ) } if( verbose ) message("packageEnv - Detected ", str_ns(e)) return(e) } if( verbose > 1 ) message("Skipping ", str_ns(skipEnv)) # go up one extra namespace skipEnv <- e while( identical(e <- topenv(envir), skipEnv) && !identical(e, emptyenv()) && !identical(e, .GlobalEnv) ){ if( verbose > 1 ) print(e) n <- n + 1 envir <- parent.frame(n) } if( identical(e, .BaseNamespaceEnv) ){ if( verbose ) message("packageEnv - Inferred ", str_ns(skipEnv)) return( skipEnv ) } if( verbose ) message("packageEnv - Detected ", str_ns(e)) return(e) } as_package <- function(x, ..., quiet=FALSE, extract=FALSE){ if( !requireNamespace('devtools', quietly = TRUE) ) stop("Package 'devtools' is required to load development packages") if( is.null(x) ) return( devtools::as.package() ) if( devtools::is.package(x) ) return(x) if( extract && grepl("\\.tar\\.gz$", x) ){ # source file # extract in tempdir tmp <- tempfile(x) on.exit( unlink(tmp, recursive=TRUE) ) pkg <- basename(sub("_[0-9.]+\\.tar\\.gz$", '', x)) desc <- file.path(pkg, 'DESCRIPTION') untar(x, desc, exdir=tmp) return(devtools::as.package(file.path(tmp, pkg))) } else { # check for 'package:*' if( grepl('^package:', x) ){ libs <- .libPaths() pkg <- sub('^package:', '', x) p <- lapply(libs, find.package, package=pkg, quiet=TRUE, verbose=FALSE) p <- unlist(p[sapply(p, length)>0]) if( !length(p) ){ if( !quiet ) stop("Could not find installed package ", pkg) return() } x <- p[1L] } } # try development packages res <- try(devtools::as.package(x), silent=TRUE) if( !is(res, 'try-error') ) return(res) # try loaded or installed packages if( length(res <- find.package(package=x, quiet=TRUE)) ) return(devtools::as.package(res)) if( quiet ) stop("Could not find package ", x) NULL } # internal overload of as.package as.package <- as_package isLoadingNamespace <- function(ns, nodev=FALSE){ if( missing(ns) ) !is.null(getLoadingNamespace(nodev=nodev)) else{ nspkg <- getLoadingNamespace(nodev=nodev, env=is.environment(ns)) if( is.null(nspkg) ) FALSE else identical(nspkg, ns) } } getLoadingNamespace <- function(env=FALSE, info=FALSE, nodev=FALSE){ is.loading <- try(nsInfo <- loadingNamespaceInfo(), silent=TRUE) if( !is(is.loading, 'try-error') ){ if( env ) asNamespace(as.name(nsInfo$pkgname)) else if( info ){ nsInfo$path <- file.path(nsInfo$libname, nsInfo$pkgname) nsInfo }else nsInfo$pkgname }else if( !nodev ){ # devtools namespaces are allowed if( (is_pkgcall('devtools') && (i <- is_funcall(ns_get('devtools::load_all')))) || (is_pkgcall('pkgload') && (i <- is_funcall(ns_get('pkgload::load_all')))) || # for devtools > 1.12 (is_pkgcall('roxygen24') && (i <- is_funcall(ns_get('roxygen24::source_package')))) ){ # find out the package that is currently being loaded by load_all e <- sys.frame(i) pkg <- e[["pkg"]] if( is.null(pkg) ){ # try to load from path if( is.null(path <- e[["path"]]) ) stop("Could not infer loading namespace") pkg <- as_package(path) } # extract namespace if( env ){ if( isDevNamespace(pkg$package) ) asNamespace(pkg$package) else pkg$ns }else if( info ){ list( pkgname = pkg$package , path = pkg$path , libname = dirname(pkg$path) ) }else pkg$package } } else NULL } isDevNamespace <- function(ns){ if( missing(ns) ){ e <- parent.frame() ns <- methods::getPackageName(topenv(e)) } # cannot be true if the namespace is not loaded if( !isNamespaceLoaded(ns) ) return( FALSE ) # get the namespace environment if( isString(ns) ) ns <- asNamespace(ns) # check for the presence of a .__DEVTOOLS__ object exists('.__DEVTOOLS__', where=ns) } ns_get <- function(x, ns = NULL, ...){ if( is.null(ns) ){ ns <- gsub("^([^:]+)::.*", "\\1", x) x <- gsub(".*::([^:]+)$", "\\1", x) } if( !isNamespace(ns) ){ ns <- tryCatch(asNamespace(ns), error = function(e) NULL) if( is.null(ns) ) return() } get0(x, envir = ns, ...) } str_ns <- function(envir=packageEnv()){ if( !is.environment(envir) ) stop("Invalid argument: must be an environment [", class(envir), ']') stringr::str_c(if( isNamespace(envir) ) 'namespace' else 'environment', " '", packageName(envir, rm.prefix=FALSE), "'") } require.quiet <- function(...){utils::capture.output(suppressPackageStartupMessages(suppressMessages(suppressWarnings( res <- withVisible(require(...)))))); if( res$visible ) res$value else invisible(res$value)} pkg_calls <- function(){ n <- sys.nframe() - 1 i <- 1 res <- character() while( i <= n ){ f <- sys.function(i) e <- environment(f) if( !is.null(e) ){ pkg <- methods::getPackageName(e, create=FALSE) if( pkg != '' ) res <- c(res, pkg) } i <- i + 1 } res } is_pkgcall <- function(pkg){ pkg %in% pkg_calls() } is_funcall <- function(fun){ n <- sys.nframe() i <- 1 dg <- digest::digest(fun) while( i <= n ){ f <- sys.function(i) ca <- sys.call(i) # cat(digest(f), dg, getPackageName(environment(f), FALSE), "\n") if( digest::digest(f) == dg ) return(i) i <- i + 1 } FALSE } mkoptions <- function(...){ .DATA <- new.env(parent=emptyenv()) .defaults <- list(...) .DATA$.options <- list(...) function(...){ .options(..., .DATA=.DATA) } } unit.test <- function(x, expr, framework=NULL, envir=parent.frame()){ sid <- as.character(deparse(substitute(x))) hash <- suppressWarnings(digest(x)) # get test environment eTest <- packageTestEnv() # wrap test into a function f <- function(){} environment(f) <- eTest body(f) <- substitute({expr}) if( !grepl('"', sid) ) { lmessage('Creating unit test for object: `', sid, '`') eval(substitute(attr(x, 'test') <- f, list(x=substitute(x), f=f)), envir) }else lmessage('Creating unit test: ', sid) # add the test to the package test environment eTest[[str_c(sid, ':', hash)]] <- list(test=f, name=sid, object=is.name(x)) # return the test function f } packageTestEnv <- function(pkg){ if( !missing(pkg) && !is.null(pkg) ){ e <- packageEnv(pkg) return( e$.packageTest ) } e <- packageEnv() # create test environment if necessary if( is.null(e$.packageTest) ) e$.packageTest <- new.env(parent=e) e$.packageTest } lmessage <- function(level, ..., appendLF=TRUE, sep='', force=FALSE){ getLogger(force=force)$lmessage(level, ..., appendLF=appendLF, sep=sep, force=force) } sVariable <- function(default=NULL){ .val <- default function(value){ if( missing(value) ) .val else{ old <- .val .val <<- value old } } } log_lastLF <- sVariable(list(Inf, TRUE)) .LOG_OPTIONS <- setupPackageOptions(NAME='logger', RESET=TRUE, # should a the next logger be indented autoindent = TRUE ) logger.options <- .LOG_OPTIONS$options logger.getOption <- .LOG_OPTIONS$getOption getLogger <- local({ # store info for top call .topCall <- NULL # list of logger objects .lastLogger <- list() function(..., type='STDOUT', new=TRUE, force=FALSE){ # return NULL logger if not in verbose mode if( !force && !lverbose() ) return( new_logger('NULL') ) # top caller call1 <- sys.call(1) topCall <- callInfo(1L) caller <- callInfo(-1L) # reset all static variables if( !identical(.topCall, topCall) ){ .topCall <<- topCall .lastLogger <<- list() } ## build logger object if( !length(.lastLogger) ){ # new stored for future calls logger <- new_logger(type, ...) logger$caller(caller) .lastLogger[[as.character(caller$nframe)]] <<- logger }else{ # increment indentation autonew <- missing(new) if( new ){ # get new logger object last <- getLogger(new=FALSE) if( !autonew || (!is.null(last$caller()) && last$caller()$nframe < caller$nframe) ){ # instanciate a new logger object only if the current caller is lower in the stack logger <- new_logger(type, ...) logger$caller(caller) # auto indent if last logger is higher in the stack if( !logger.getOption('autoindent') ){ # reset autoindent option on.exit on.exit( logger.options(autoindent=TRUE), add=TRUE) logger$nindent(last$nindent(), add=FALSE) } else if( last$caller()$nframe < caller$nframe ){ logger$nindent(last$nindent() + 1L, add=FALSE) } .lastLogger[[as.character(caller$nframe)]] <<- logger }else logger <- last # add initial new line if the last log message was from a higher logger logger$breaknext(log_lastLF()[[1L]] < caller$nframe) }else{ # get logger for exact frame number if( is.null(logger <- .lastLogger[[as.character(caller$nframe)]]) ){ # get first higher logger i <- which(as.numeric(names(.lastLogger)) <= caller$nframe) # str(.lastLogger) if( length(i) ) logger <- .lastLogger[[tail(i, 1L)]] else logger <- .lastLogger[[1L]] } } } # return logger logger } }) new_logger <- function(type, ..., nindent=0L, indent=' '){ .data <- list( lastLF = TRUE , breaknext = FALSE , cindent = indent , nindent = nindent , indent = rep(indent, nindent) , caller = NULL ) # init logger object .logger <- list() .logger$data <- function(value){ if( missing(value) ) .data else .data <<- value } # init type-specific slots f <- match.fun(paste('new_logger', type, sep='')) .logger <- f(.logger, ...) # get last used appendLF value .logger$lastLF <- function(){ .data$lastLF } # get initial new line flag .logger$breaknext <- function(val){ if( missing(val) ) .data$breaknext else .data$breaknext <<- val } # get caller data .logger$caller <- function(val){ if( missing(val) ) .data$caller else .data$caller <<- val } # get/set indentation .logger$indent <- function(val){ if( missing(val) ) .data$indent else{ if( is.numeric(val) ) return( .logger$nindent(val) ) old <- .data$indent .data$indent <<- val old } } # get/set number of indentation .logger$nindent <- function(val, add=TRUE){ if( missing(val) ) .data$nindent else{ old <- .data$nindent .data$nindent <<- val + if( add ) .data$nindent else 0L if( .data$nindent >= 0L ) .data$indent <<- paste(rep(.data$cindent, .data$nindent), collapse='') old } } # new message with auto-indentation and breakline .logger$message <- function(..., appendLF=TRUE, sep=''){ if( is.null(.logger$write) ) return() msg <- if( .data$breaknext || isTRUE(logger.getOption('breaknext')) ){ logger.options(breaknext=NULL) .data$breaknext <<- FALSE "\n" } # add indentation if on a new line lastLFframe <- log_lastLF() callerFrame <- .logger$caller()$nframe if( .data$lastLF || lastLFframe[[2L]] || (is.finite(lastLFframe[[1L]]) && lastLFframe[[1L]] >= callerFrame) ) msg <- paste(msg, .data$indent, sep='') msg <- paste(msg, paste(..., sep='', collapse=sep), if( appendLF ) "\n", sep='') # store in global variable the frame number if it the line is left open log_lastLF(list(if( !appendLF ) callerFrame else Inf, appendLF)) .data$lastLF <<- appendLF # call logger write function .logger$write(msg) } # log message with specific level .logger$lmessage <- function(level, ..., force=FALSE){ if( force || lverbose() >= level ) .logger$message(...) } # show info about the logger .logger$show <- function(){ cat("\n", sep='') .logger$info() } # wrap into a logger object structure(.logger, class=c(paste('logger', type, sep=''), 'logger')) } # NULL logger new_loggerNULL <- function(.logger, ...){ # write to log .logger$write <- NULL # special info .logger$info <- function(){ cat("Output: NULL\n") } # return logger object .logger } # Logger that writes on the standard output new_loggerSTDOUT <- function(.logger, ...){ # append to log .logger$write <- function(...){ cat(..., sep='') } .logger$info <- function(){ cat("Output: stdout\n") } # return logger object .logger } # Logger that writes on the standard error new_loggerSTDERR <- function(.logger, ...){ # append to log .logger$write <- function(...){ message(..., appendLF=FALSE) } .logger$info <- function(){ cat("Output: stderr\n") } # return logger object .logger } isNamespaceLoaded2 <- isNamespaceLoaded <- function(ns){ if( is.environment(ns) ){ if( !isNamespace(ns) ) return(FALSE) else ns <- getPackageName(ns) } if( isString(ns) ) base::isNamespaceLoaded(ns) else stop("Invalid argument `ns`: only support strings and environments.") } isString <- function(x, y, ignore.case=FALSE){ if( res <- is.character(x) && length(x) == 1L ){ if( !missing(y) ){ if( !isString(y) ) stop("Invalid argument 'y': must be a string itself.") if( ignore.case ) { x <- toupper(x) y <- toupper(y) } res <- x == y } } res } isNumber <- function(x){ is.numeric(x) && length(x) == 1 } isReal <- function(x){ isNumber(x) && !is.integer(x) } is.dir <- function(x) file_test('-d', x) is.file <- function(x) file_test('-f', x) orderVersion <- function(x, ..., decreasing=FALSE){ NAs <- which(is.na(x)) tx <- gsub("[^0-9]+",".", paste('_', x, sep='')) stx <- strsplit(tx, ".", fixed=TRUE) mtx <- max(sapply(stx, length)) tx <- sapply(stx, function(v) paste(sprintf("%06i", c(as.integer(v[-1]),rep(0, mtx-length(v)+1))), collapse='.') ) res <- order(tx, ..., decreasing = decreasing) # put NAs at the end if( length(NAs) ){ res <- c(setdiff(res, NAs), NAs) } res } ExposeAttribute <- function(object, ..., .MODE='rw', .VALUE=FALSE){ # setup exposed arguments args <- list(...) if( length(args) ){ # use the same mode for all attributes if( isString(.MODE) == 1L ) .MODE <- rep(.MODE, length(args)) else if( length(.MODE) != length(args) ){ stop("Argument .MODE must provide an access mode for each argument in `...`.") } if( is.null(names(args)) ) # add names if necessary args <- setNames(args, rep('', length(args))) un <- names(args)=='' if( any(!sapply(args[un], isString)) ) stop("All unnamed argument must be the name of an attribute, i.e. a character string.") # set attributes that have values if requested if( .VALUE ){ sapply(names(args)[!un], function(x){ attr(object, x) <<- args[[x]] }) }else{ # or use the values as access permission .MODE[!un] <- args[!un] } # # store exposed attributes with names as regular expressions eargs <- ifelse(un, args, names(args)) eargs <- as.list(setNames(.MODE, eargs)) # add ereg start-end names(eargs) <- paste('^', names(eargs), '$', sep='') }else{ eargs <- .MODE } # store access rights attr(object, '.ExposeAttribute') <- eargs class(object) <- c(class(object), 'ExposeAttribute') object } alphacol <- function(col, alpha = FALSE){ col <- as.matrix(as.character(as.hexmode(col2rgb(col, alpha)))) if( !is.logical(alpha) ){ if( alpha < 1 ) alpha <- alpha * 255 alpha <- round(alpha) col[4] <- as.character(as.hexmode(alpha)) } apply(col, 2, function(x) paste("#", paste(x, collapse=''), sep='')) } callInfo <- function(n=-1L){ if( n<0L ) n <- n-1 f <- sys.function(n) e <- sys.frame(n) sysn <- if( n<0L ) sys.nframe()-n else n list(fd=digest(f), env=capture.output(e), nframe=sysn) } compile_src <- function(pkg=NULL, load=TRUE){ if( !is.null(pkg) ){ p <- as.package(pkg) path <- p$path }else{ pkg <- packageName() path <- packagePath(lib=NA) # do not look installed packages } owd <- getwd() on.exit(setwd(owd)) # Compile code in /src srcdir <- file.path(path, 'src') message("# Checking '", srcdir, "' ... ", appendLF=FALSE) if( !file.exists(srcdir) ){ message("NO") } else { message("YES") message("## Compiling '",srcdir,"' ##") setwd(srcdir) Sys.setenv(R_PACKAGE_DIR=path) R.SHLIB(pkg, " *.cpp ") message("## DONE") if( load ){ if( existsFunction('load_dll', where='package:devtools') ){ # post 0.8 f <- getFunction('load_dll', where='package:devtools') f(pkg) }else{ # prior 0.8 f <- getFunction('load_c', where='package:devtools') f(pkg) } } } } exitCheck <- function(){ .success <- FALSE function(x){ if( nargs() == 0L ) .success else{ .success <<- TRUE x } } } expand_dots <- function(..., .exclude=NULL){ dotsCall <- as.list(eval(quote(substitute(list(...))), sys.parent())) if( length(dotsCall) >= 1L ) dotsCall <- dotsCall[-1L] # extract defaults from ... arguments defaults <- list(...) if( length(defaults) == 1L && is.null(names(defaults)) ){ defaults <- defaults[[1L]] } if( length(defaults) ){ excl <- names(allFormals(sys.function(sys.parent()))) if( !is.null(.exclude) ) excl <- c(excl, .exclude) defaults <- defaults[!names(defaults) %in% excl] dotsCall <- expand_list(dotsCall, defaults, .exact=FALSE) } # # return expanded dot args dotsCall } hasNames <- function(x, all=FALSE){ nm <- names(x) if( length(x) == 0L ) TRUE else !is.null(nm) && (!all || !is.element('', nm) ) } str_desc <- function(object, exdent=0L){ p <- sapply(object, function(x){ if( is.atomic(x) && length(x) == 1L ) x else paste("<", class(x), ">", sep='') }) str_wrap(str_out(p, NA, use.names=TRUE, quote=FALSE), exdent=exdent) } str_fun <- function(object){ s <- capture.output(args(object)) paste(s[-length(s)], collapse="\n") } try_message <- function(signal = FALSE){ function(expr){ tryCatch(expr, error = function(e){ if( signal ) message(e) else message('Error: ', conditionMessage(e)) invisible() }) } } R.SHLIB <- function(libname, ...){ R.CMD('SHLIB', '-o ', libname, .Platform$dynlib.ext, ...) } R.CMD <- function(cmd, ...){ R.exec('CMD ', cmd, ' ', ...) } R.exec <- function(..., lib.loc=NULL){ cmd <- paste(file.path(R.home('bin'), 'R'), ' ', ..., sep='', collapse='') # add lib path ol <- set_libPaths(lib.loc) on.exit(set_libPaths(ol)) message(cmd) system(cmd, intern=interactive()) } set_libPaths <- function(lib.loc=NULL){ ol <- Sys.getenv('R_LIBS') olib <- .libPaths() res <- list(R_LIBS=ol, .libPaths=olib) if( is_NA(lib.loc) ) return(res) # add lib path if( is.null(lib.loc) ) lib.loc <- .libPaths() if( is.character(lib.loc) ){ # current .libPaths .libPaths(lib.loc) # R_LIBS env variable rlibs <- paste(lib.loc, collapse=.Platform$path.sep) Sys.setenv(R_LIBS=rlibs) }else if( is.list(lib.loc) ){ Sys.setenv(R_LIBS=lib.loc$R_LIBS) .libPaths(lib.loc$.libPaths) } res } #.nmf.Options.Runtime <- character() # define functions nmf.options and nmf.getOptions #' NMF Package Specific Options #' #' @section Available options: #' \describe{ #' #' \item{cores}{Default number of cores to use to perform parallel NMF computations. #' Note that this option is effectively used only if the global option \code{'cores'} is #' not set. #' Moreover, the number of cores can also be set at runtime, in the call to \code{\link{nmf}}, #' via arguments \code{.pbackend} or \code{.options} (see \code{\link{nmf}} for more details).} #' #' \item{default.algorithm}{Default NMF algorithm used by the \code{nmf} function when argument #' \code{method} is missing. #' The value should the key of one of the registered NMF algorithms or a valid specification of an NMF algorithm. #' See \code{?nmfAlgorithm}.} #' #' \item{default.seed}{Default seeding method used by the \code{nmf} function when argument \code{seed} is missing. #' The value should the key of one of the registered seeding methods or a vallid specification of a seeding method. #' See \code{?nmfSeed}.} #' #' \item{track}{Toggle default residual tracking. #' When \code{TRUE}, the \code{nmf} function compute and store the residual track in the result -- if not otherwise specified in argument \code{.options}. #' Note that tracking may significantly slow down the computations.} #' #' \item{track.interval}{Number of iterations between two points in the residual track. #' This option is relevant only when residual tracking is enabled. #' See \code{?nmf}.} #' #' \item{error.track}{this is a symbolic link to option \code{track} for backward compatibility.} #' #' \item{pbackend}{Default loop/parallel foreach backend used by the \code{nmf} function when #' argument \code{.pbackend} is missing. #' Currently the following values are supported: \code{'par'} for multicore, #' \code{'seq'} for sequential, \code{NA} for standard \code{sapply} (i.e. do not use a foreach loop), #' \code{NULL} for using the currently registered foreach backend.} #' #' \item{parallel.backend}{this is a symbolic link to option \code{pbackend} for backward compatibility.} #' #' \item{gc}{Interval/frequency (in number of runs) at which garbage collection is performed.} #' #' \item{verbose}{Default level of verbosity.} #' #' \item{debug}{Toogles debug mode. #' In this mode the console output may be very -- very -- messy, and is aimed at debugging only.} #' #' \item{maxIter}{ Default maximum number of iteration to use (default NULL). #' This option is for internal/technical usage only, to globally speed up examples or tests #' of NMF algorithms. To be used with care at one's own risk... #' It is documented here so that advanced users are aware of its existence, and can avoid possible #' conflict with their own custom options. #' } #' } % end description #' #' #' @rdname options #' @name options-NMF NULL .OPTIONS <- setupPackageOptions( # default algorithm default.algorithm='brunet' # default seeding method , default.seed='random' # track error during NMF updates , error.track = option_symlink('track') # for backward compatibility , track=FALSE # define the tracking interval , track.interval=30 # define garbage collection interval , gc=50 # define default parallel backend , parallel.backend= option_symlink('pbackend') # for backward compatibility , pbackend= if( parallel::detectCores() > 1 ) 'par' else 'seq' # toogle verbosity , verbose=FALSE # toogle debug mode , debug=FALSE , RESET=TRUE) #' \code{nmf.options} sets/get single or multiple options, that are specific #' to the NMF package. #' It behaves in the same way as \code{\link[base]{options}}. #' #' @inheritParams base::options #' @param ... option specifications. For \code{nmf.options} this can be named arguments or #' a single unnamed argument that is a named list (see \code{\link{options}}. #' #' For \code{nmf.resetOptions}, this must be the names of the options to reset. #' #' @export #' @rdname options #' @examples #' #' # show all NMF specific options #' nmf.printOptions() #' #' # get some options #' nmf.getOption('verbose') #' nmf.getOption('pbackend') #' # set new values #' nmf.options(verbose=TRUE) #' nmf.options(pbackend='mc', default.algorithm='lee') #' nmf.printOptions() #' #' # reset to default #' nmf.resetOptions() #' nmf.printOptions() #' nmf.options <- .OPTIONS$options #' \code{nmf.getOption} returns the value of a single option, that is specific #' to the NMF package. #' It behaves in the same way as \code{\link[base]{getOption}}. #' #' @inheritParams base::getOption #' #' @export #' @rdname options nmf.getOption <- .OPTIONS$getOption #' \code{nmf.resetOptions} reset all NMF specific options to their default values. #' #' @param ALL logical that indicates if options that are not part of the default set #' of options should be removed. #' #' @export #' @rdname options nmf.resetOptions <- .OPTIONS$resetOptions #' \code{nmf.printOptions} prints all NMF specific options along with their default values, #' in a relatively compact way. #' @export #' @rdname options nmf.printOptions <- .OPTIONS$printOptions #nmf.options.runtime <- function(){ # nmf.options(.nmf.Options.Runtime) #} # debugging utility nmf.debug <- function(fun, ...){ if( nmf.getOption('debug') ){ call.stack <- sys.calls() n <- length(call.stack) if( is.null(fun) ) fun <- as.character(call.stack[[n-1]]) message('DEBUG::', fun, ' -> ', ...) } return(invisible()) } NMF/R/NMFns-class.R0000644000176200001440000001364114333176413013314 0ustar liggesusers#' @include NMFstd-class.R NULL #' NMF Model - Nonsmooth Nonnegative Matrix Factorization #' #' This class implements the \emph{Nonsmooth Nonnegative Matrix Factorization} #' (nsNMF) model, required by the Nonsmooth NMF algorithm. #' #' The Nonsmooth NMF algorithm is defined by \cite{Pascual-Montano2006} as a #' modification of the standard divergence based NMF algorithm (see section #' Details and references below). It aims at obtaining sparser factor #' matrices, by the introduction of a smoothing matrix. #' #' @details #' The Nonsmooth NMF algorithm is a modification of the standard divergence #' based NMF algorithm (see \code{\linkS4class{NMF}}). #' Given a non-negative \eqn{n \times p}{n x p} matrix \eqn{V} and a #' factorization rank \eqn{r}, it fits the following model: #' #' \deqn{V \equiv W S(\theta) H,}{V ~ W S(theta) H,} #' where: #' \itemize{ #' #' \item \eqn{W} and \eqn{H} are such as in the standard model, i.e. #' non-negative matrices of dimension \eqn{n \times r}{n x r} #' and \eqn{r \times p}{r x p} respectively; #' #' \item \eqn{S} is a \eqn{r \times r} square matrix whose entries depends on #' an extra parameter \eqn{0\leq \theta \leq 1} in the following way: #' \deqn{S = (1-\theta)I + \frac{\theta}{r} 11^T ,} #' where \eqn{I} is the identity matrix and \eqn{1} #' is a vector of ones. #' #' } #' #' The interpretation of S as a smoothing matrix can be explained as follows: #' Let \eqn{X} be a positive, nonzero, vector. Consider the transformed vector #' \eqn{Y = S X}. If \eqn{\theta = 0}, then \eqn{Y = X} and no smoothing on #' \eqn{X} has occurred. However, as \eqn{\theta \to 1}{theta tends to 1}, the #' vector \eqn{Y} tends to the constant vector with all elements almost equal #' to the average of the elements of \eqn{X}. This is the smoothest possible #' vector in the sense of non-sparseness because all entries are equal to the #' same nonzero value, instead of having some values close to zero and others #' clearly nonzero. #' #' @section Creating objects from the Class: #' #' Object of class \code{NMFns} can be created using the standard way with #' operator \code{\link{new}} #' #' However, as for all NMF model classes -- that extend class #' \code{\linkS4class{NMF}}, objects of class \code{NMFns} should be #' created using factory method \code{\link{nmfModel}} : #' #' \code{new('NMFns')} #' #' \code{nmfModel(model='NMFns')} #' #' \code{nmfModel(model='NMFns', W=w, theta=0.3} #' #' See \code{\link{nmfModel}} for more details on how to use the factory #' method. #' #' @section Algorithm: #' #' The Nonsmooth NMF algorithm uses a modified version of the multiplicative #' update equations in Lee & Seung's method for Kullback-Leibler divergence #' minimization. #' The update equations are modified to take into account the -- #' constant -- smoothing matrix. #' The modification reduces to using matrix \eqn{W S} instead of matrix \eqn{W} #' in the update of matrix \eqn{H}, and similarly using matrix \eqn{S H} #' instead of matrix \eqn{H} in the update of matrix \eqn{W}. #' #' After the matrix \eqn{W} has been updated, each of its columns is scaled so #' that it sums up to 1. #' #' @export #' @family NMF-model #' @examples #' #' # create a completely empty NMFns object #' new('NMFns') #' #' # create a NMF object based on random (compatible) matrices #' n <- 50; r <- 3; p <- 20 #' w <- rmatrix(n, r) #' h <- rmatrix(r, p) #' nmfModel(model='NMFns', W=w, H=h) #' #' # apply Nonsmooth NMF algorithm to a random target matrix #' V <- rmatrix(n, p) #' \dontrun{nmf(V, r, 'ns')} #' #' # random nonsmooth NMF model #' rnmf(3, 10, 5, model='NMFns', theta=0.3) #' setClass('NMFns' , representation( theta = 'numeric' # smoothing matrix ) , contains = 'NMFstd' , prototype = prototype( theta = 0.5 ) , validity = function(object){ if( object@theta < 0 || object@theta > 1 ) return(paste("Invalid value for theta (",object@theta,"): must be between 0 and 1", sep='')) TRUE } ) #' Show method for objects of class \code{NMFns} #' @export setMethod('show', 'NMFns', function(object) { callNextMethod() cat("theta:", object@theta, "\n") } ) #' Compute estimate for an NMFns object, according to the Nonsmooth NMF model #' (cf. \code{\link{NMFns-class}}). #' #' Extra arguments in \code{...} are passed to method \code{smoothing}, and are #' typically used to pass a value for \code{theta}, which is used to compute #' the smoothing matrix instead of the one stored in \code{object}. #' #' @param S smoothing matrix to use instead of \code{smoothing(object)} #' It must be a square matrix compatible with the basis and coefficient matrices #' used in the computation. #' @inline #' setMethod('fitted', signature(object='NMFns'), function(object, W, H, S, ...){ if( missing(W) ) W <- object@W if( missing(H) ) H <- object@H if( missing(S) ) S <- smoothing(object, ...) W %*% (S %*% H) } ) #' Smoothing Matrix in Nonsmooth NMF Models #' #' The function \code{smoothing} builds a smoothing matrix for using in Nonsmooth #' NMF models. #' #' For a \eqn{r}-rank NMF, the smoothing matrix of parameter \eqn{\theta} is #' built as follows: #' \deqn{S = (1-\theta)I + \frac{\theta}{r} 11^T ,} #' where \eqn{I} is the identity matrix and \eqn{1} is a vector of ones #' (cf. \code{\link{NMFns-class}} for more details). #' #' @param x a object of class \code{NMFns}. #' @param theta the smoothing parameter (numeric) between 0 and 1. #' @param ... extra arguments to allow extension (not used) #' #' @return if \code{x} estimates a \eqn{r}-rank NMF, #' then the result is a \eqn{r \times r} square matrix. #' @export #' #' @examples #' x <- nmfModel(3, model='NMFns') #' smoothing(x) #' smoothing(x, 0.1) #' smoothing <- function(x, theta=x@theta, ...){ # check validity of theta if( theta < 0 || theta > 1 ) stop("Invalid smoothing parameter theta [",theta,"]: theta must be susch that 0 <= theta <=1") diag(1-theta, nbasis(x)) + theta / nbasis(x) } NMF/R/Bioc-layer.R0000644000176200001440000002265114560455532013223 0ustar liggesusers# Layer for Bioconductor # # - define methods with signature for use within Bioconductor # - define alias methods for use in the context of microarray analysis (metagenes, metaprofiles, ...) # # Author: Renaud Gaujoux \email{renaud@@cbio.uct.ac.za} ############################################################################### #' @include NMF-class.R #' @include transforms.R NULL #' Specific NMF Layer for Bioconductor #' #' The package NMF provides an optional layer for working with common objects #' and functions defined in the Bioconductor platform. #' #' It provides: #' \itemize{ #' \item computation functions that support \code{ExpressionSet} objects as #' inputs. #' \item aliases and methods for generic functions defined and widely used by #' Bioconductor base packages. #' \item specialised visualisation methods that adapt the titles and legend #' using bioinformatics terminology. #' \item functions to link the results with annotations, etc... #' } #' #' @rdname bioc #' @name bioc-NMF #' #' @aliases nmf,ExpressionSet,ANY,ANY-method #' @aliases nmf,matrix,ExpressionSet,ANY-method #' #' @aliases seed,ExpressionSet,ANY,ANY-method #' #' @aliases run,NMFStrategy,ExpressionSet,ANY-method #' #' @aliases nmfModel,ExpressionSet,ANY-method #' @aliases nmfModel,ANY,ExpressionSet-method #' #' @aliases rnmf,ANY,ExpressionSet-method #' #' @aliases nneg,ExpressionSet-method #' @aliases rposneg,ExpressionSet-method #' #' @aliases .atrack,ExpressionSet-method #' #' @aliases sampleNames,NMF-method #' @aliases sampleNames<-,NMF,ANY-method #' @aliases sampleNames,NMFfitX-method #' @aliases featureNames,NMF-method #' @aliases featureNames<-,NMF-method #' @aliases featureNames,NMFfitX-method #' #' @aliases nmeta #' @aliases metagenes metagenes<- #' @aliases metaprofiles metaprofiles<- #' #' @exportPattern ^featureNames #' @exportPattern ^sampleNames #' @exportPattern ^metagenes #' @exportPattern ^metaprofiles #' @exportPattern ^nmeta NULL # add extra package Biobase #setPackageExtra('install.packages', 'Biobase', pkgs='Biobase') if(!requireNamespace("Biobase")) BiocManager::install("Biobase") .onLoad.nmf.bioc <- function(){ if( require.quiet('Biobase') ){ # load Biobase package requireNamespace('Biobase') #library(Biobase) #' Performs NMF on an ExpressionSet: the target matrix is the expression matrix \code{exprs(x)}. #' @rdname bioc setMethod('nmf', signature(x='ExpressionSet', rank='ANY', method='ANY'), function(x, rank, method, ...) { # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL if( missing(rank) ) rank <- NULL # apply NMF to the gene expression matrix nmf(Biobase::exprs(x), rank, method, ...) } ) #' Fits an NMF model partially seeding the computation with a given #' ExpressionSet object passed in \code{rank}. #' #' This method provides a shortcut for \code{nmf(x, exprs(rank), method, ...)}. #' #' @examples #' # partially seed with an ExpressionSet (requires package Biobase) #' \dontrun{ #' if(requireNamespace("Biobase")) BiocManager::install("Biobase"){ #' data(esGolub) #' nmf(esGolub, esGolub[,1:3]) #' } #' } #' setMethod('nmf', signature(x='matrix', rank='ExpressionSet', method='ANY'), function(x, rank, method, ...){ # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL nmf(x, Biobase::exprs(rank), method, ...) } ) #' Seeds an NMF model directly on an ExpressionSet object. #' This method provides a shortcut for \code{seed(exprs(x), model, method, ...)}. #' #' @examples #' # run on an ExpressionSet (requires package Biobase) #' \dontrun{ #' if(requireNamespace("Biobase")) BiocManager::install("Biobase"){ #' data(esGolub) #' nmf(esGolub, 3) #' } #' } #' setMethod('seed', signature(x='ExpressionSet', model='ANY', method='ANY'), function(x, model, method, ...) { # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL if( missing(model) ) model <- NULL # apply NMF to the gene expression matrix seed(Biobase::exprs(x), model, method, ...) } ) #' Runs an NMF algorithm on the expression matrix of an \code{ExpressionSet} object. setMethod('run', signature(object='NMFStrategy', y='ExpressionSet', x='ANY'), function(object, y, x, ...){ run(object, Biobase::exprs(y), x, ...) } ) ###% Method 'nmfModel' for 'ExpressionSet' target objects: ###% -> use the expression matrix of 'target' as the target matrix setMethod('nmfModel', signature(rank='ANY', target='ExpressionSet'), function(rank, target, ...){ if( missing(rank) ) rank <- NULL # call nmfModel on the expression matrix nmfModel(rank, Biobase::exprs(target), ...) } ) setMethod('nmfModel', signature(rank='ExpressionSet', target='ANY'), function(rank, target, ...){ if( missing(target) ) target <- NULL # call nmfModel on the expression matrix nmfModel(Biobase::exprs(rank), target, ...) } ) ###% Method 'rnmf' for 'ExpressionSet' target objects: ###% -> use the expression matrix of 'target' as the target matrix ###% setMethod('rnmf', signature(x='ANY', target='ExpressionSet'), function(x, target, ...){ rnmf(x, Biobase::exprs(target), ...) } ) ###% The method for an \code{ExpressionSet} object returns the data.frame that ###% contains the phenotypic data (i.e. \code{pData(object)}) setMethod('.atrack', 'ExpressionSet', function(object, data=NULL, ...){ if( is.null(data) ) data <- t(Biobase::exprs(object)) .atrack(Biobase::pData(object), data=data, ...) } ) #' Apply \code{nneg} to the expression matrix of an \code{\link{ExpressionSet}} #' object (i.e. \code{exprs(object)}). #' All extra arguments in \code{...} are passed to the method \code{nneg,matrix}. #' #' @examples #' #' E <- Biobase::ExpressionSet(x) #' nnE <- nneg(e) #' exprs(nnE) #' setMethod('nneg', 'ExpressionSet' , function(object, ...){ Biobase::exprs(object) <- nneg(Biobase::exprs(object), ...) object } ) #' Apply \code{rposneg} to the expression matrix of an \code{\link{ExpressionSet}} #' object (i.e. \code{exprs(object)}). #' #' @examples #' #' E <- Biobase::ExpressionSet(x) #' nnE <- posneg(E) #' E2 <- rposneg(nnE) #' all.equal(E, E2) #' setMethod('rposneg', 'ExpressionSet' , function(object, ...){ Biobase::exprs(object) <- rposneg(Biobase::exprs(object), ...) object } ) ###% Annotate the genes specific to each cluster. ###% ###% This function uses the \code{annaffy} package to generate an HTML table from the probe identifiers. # setGeneric('annotate', function(x, annotation, ...) standardGeneric('annotate') ) # setMethod('annotate', signature(x='factor', annotation='character'), # function(x, annotation, filename='NMF genes', outdir='.', name='Cluster specific genes', ...) # { # library(annaffy) # anncols<-aaf.handler()[c(1:3, 6:13)] # # # add html suffix to filename if necessary # if( length(grep("\\.html$", filename)) == 0 ) filename <- paste(filename, 'html', sep='.') # # # for each cluster annotate the genes set # print(head(x)) # by(names(x), x, function(g){ # print(head(g)) # if( length(g) == 0 ) return() # g <- as.character(g) # anntable <- aafTableAnn(g, annotation, anncols) # # generate HTML output # saveHTML(anntable, file.path(outdir,filename), title=paste(name, '[top', nrow(anntable),']')) # }, simplify=FALSE) # # # return nothing # invisible() # } # ) # # setMethod('annotate', signature(x='NMF', annotation='character'), # function(x, annotation, ...) # { # s <- extractFeatures(x) # class <- .predict.nmf(t(s)) # annotate(class, annotation=annotation, ...) # } # ) ## Assign BioConductor aliases ###% number of metagenes nmeta <- nbasis ###% get/set methods of basis matrix metagenes <- basis `metagenes<-` <- `basis<-` ###% get/set methods of mixture coefficients matrix metaprofiles <- coef `metaprofiles<-` <- `coef<-` ###% Get/Set methods for rows/columns names of the basis and mixture matrices # using the Biobase definition standard generics setGeneric('featureNames', package='Biobase') setGeneric('featureNames<-', package='Biobase') setMethod('featureNames', 'NMF', function(object){ rownames(object) } ) setReplaceMethod('featureNames', 'NMF', function(object, value){ rownames(object) <- value object } ) ###% For NMFfitX objects: returns the featureNames of the best fit ###% There is no replace method for NMFfitX objects setMethod('featureNames', 'NMFfitX', function(object){ rownames(fit(object)) } ) setGeneric('sampleNames', package='Biobase') setGeneric('sampleNames<-', package='Biobase') setMethod('sampleNames', 'NMF', function(object){ colnames(object) } ) setReplaceMethod('sampleNames', 'NMF', function(object, value){ colnames(object) <- value object } ) ###% For NMFfitX objects: returns the sampleNames of the best fit ###% There is no replace method for NMFfitX objects setMethod('sampleNames', 'NMFfitX', function(object){ colnames(fit(object)) } ) # # Export layer-specific methods [only if one is loading a namespace] # # NB: Only for R < 3.0.0 # if( pkgmaker::testRversion("2.15.3", -1L) ){ # ns <- pkgmaker::addNamespaceExport(c("nmeta" # ,"featureNames", "featureNames<-" # ,"sampleNames", "sampleNames<-" # ,"metagenes", "metagenes<-" # ,"metaprofiles", "metaprofiles<-")) # } # return TRUE TRUE } } NMF/R/seed-ica.R0000644000176200001440000000245314333176413012701 0ustar liggesusers#' @include registry-seed.R NULL ###% Seeding method: Absolute Independent Component Analysis ###% ###% @author Renaud Gaujoux ###% @creation 17 Jul 2009 ###% Seeding method for Nonnegative Matrix Factorization (NMF) algorithms. ###% ###% @param object An instance of class \code{NMF} to seed ###% @param x The target matrix ###% @param method The method parameter passed to \code{fastICA}. Can either be 'R' or 'C' and ###% tells which implementation of fastICA to use (R code or C code). ###% @param ... extra parameters passed to \code{fastICA} ###% ###% @return an updated version of \code{object}, where the matrix slots \code{W} and \code{H} ###% are set to the positive part of the IC of \code{x}. ###% posICA <- function(object, x, ica.method=c('C', 'R'), ...){ # perform ICA using the fastICA package if( !require.quiet('fastICA') ) stop("Seeding method 'ica' requires package `fastICA` to be installed") requireNamespace('fastICA') ica.method <- match.arg(ica.method) res <- fastICA::fastICA(x, nbasis(object), method=ica.method, ...) # update the 'NMF' object .basis(object) <- pmax(res$S, .Machine$double.eps ); .coef(object) <- pmax(res$A, .Machine$double.eps ); # return the updated object invisible(object) } # Register positive ICA setNMFSeed('ica', posICA, overwrite=TRUE) NMF/R/nmfModel.R0000644000176200001440000006777514333176413013012 0ustar liggesusers# Factory/Constructor Methods for NMF models # # Author: Renaud Gaujoux # Creation: 03 Jul 2012 ############################################################################### #' @include NMFstd-class.R #' @include NMFns-class.R #' @include NMFOffset-class.R NULL #' Factory Methods NMF Models #' #' \code{nmfModel} is a S4 generic function which provides a convenient way to #' build NMF models. #' It implements a unified interface for creating \code{NMF} objects from any #' NMF models, which is designed to resolve potential dimensions inconsistencies. #' #' All \code{nmfModel} methods return an object that inherits from class \code{NMF}, #' that is suitable for seeding NMF algorithms via arguments \code{rank} or #' \code{seed} of the \code{\link{nmf}} method, in which case the factorisation #' rank is implicitly set by the number of basis components in the seeding #' model (see \code{\link{nmf}}). #' #' For convenience, shortcut methods and internal conversions for working on #' \code{data.frame} objects directly are implemented. #' However, note that conversion of a \code{data.frame} into a \code{matrix} #' object may take some non-negligible time, for large datasets. #' If using this method or other NMF-related methods several times, consider #' converting your data \code{data.frame} object into a matrix once for good, #' when first loaded. #' #' @param rank specification of the target factorization rank #' (i.e. the number of components). #' @param target an object that specifies the dimension of the estimated target matrix. #' @param ... extra arguments to allow extension, that are passed down to the #' workhorse method \code{nmfModel,numeric.numeric}, where they are used to #' initialise slots specific to the instantiating NMF model class. #' #' @return an object that inherits from class \code{\linkS4class{NMF}}. #' @family NMF-interface #' @export #' @inline setGeneric('nmfModel', function(rank, target=0L, ...) standardGeneric('nmfModel')) #' Main factory method for NMF models #' #' This method is the workhorse method that is eventually called by all other methods. #' See section \emph{Main factory method} for more details. #' #' @param ncol a numeric value that specifies the number #' of columns of the target matrix, fitted the NMF model. #' It is used only if not missing and when argument \code{target} is a single #' numeric value. #' @param model the class of the object to be created. #' It must be a valid class name that inherits from class \code{NMF}. #' Default is the standard NMF model \code{\linkS4class{NMFstd}}. #' @param W value for the basis matrix. #' \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}. #' @param H value for the mixture coefficient matrix #' \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}. #' @param force.dim logical that indicates whether the method should try #' lowering the rank or shrinking dimensions of the input matrices to #' make them compatible #' @param order.basis logical that indicates whether the basis components should #' reorder the rows of the mixture coefficient matrix to match the order of the #' basis components, based on their respective names. It is only used if the #' basis and coefficient matrices have common unique column and row names #' respectively. #' #' @section Main factory method: #' The main factory engine of NMF models is implemented by the method with #' signature \code{numeric, numeric}. #' Other factory methods provide convenient ways of creating NMF models from e.g. a #' given target matrix or known basis/coef matrices (see section \emph{Other Factory Methods}). #' #' This method creates an object of class \code{model}, using the extra #' arguments in \code{...} to initialise slots that are specific to the given model. #' #' All NMF models implement get/set methods to access the matrix factors #' (see \code{\link{basis}}), which are called to initialise them from arguments #' \code{W} and \code{H}. #' These argument names derive from the definition of all built-in models that #' inherit derive from class \code{\linkS4class{NMFstd}}, which has two slots, #' \var{W} and \var{H}, to hold the two factors -- following the notations used #' in \cite{Lee1999}. #' #' If argument \code{target} is missing, the method creates a standard NMF #' model of dimension 0x\code{rank}x0. #' That is that the basis and mixture coefficient matrices, \var{W} and \var{H}, #' have dimension 0x\code{rank} and \code{rank}x0 respectively. #' #' If target dimensions are also provided in argument \code{target} as a #' 2-length vector, then the method creates an \code{NMF} object compatible to #' fit a target matrix of dimension \code{target[1]}x\code{target[2]}. #' That is that the basis and mixture coefficient matrices, \var{W} and \var{H}, #' have dimension \code{target[1]}x\code{rank} and \code{rank}x\code{target[2]} #' respectively. #' The target dimensions can also be specified using both arguments \code{target} #' and \code{ncol} to define the number of rows and the number of columns of the #' target matrix respectively. #' If no other argument is provided, these matrices are filled with NAs. #' #' If arguments \code{W} and/or \code{H} are provided, the method creates a NMF #' model where the basis and mixture coefficient matrices, \var{W} and \var{H}, #' are initialised using the values of \code{W} and/or \code{H}. #' #' The dimensions given by \code{target}, \code{W} and \code{H}, must be compatible. #' However if \code{force.dim=TRUE}, the method will reduce the dimensions to the achieve #' dimension compatibility whenever possible. #' #' When \code{W} and \code{H} are both provided, the \code{NMF} object created is #' suitable to seed a NMF algorithm in a call to the \code{\link{nmf}} method. #' Note that in this case the factorisation rank is implicitly set by the number #' of basis components in the seed. #' #' @examples #' #' # data #' n <- 20; r <- 3; p <- 10 #' V <- rmatrix(n, p) # some target matrix #' #' # create a r-ranked NMF model with a given target dimensions n x p as a 2-length vector #' nmfModel(r, c(n,p)) # directly #' nmfModel(r, dim(V)) # or from an existing matrix <=> nmfModel(r, V) #' # or alternatively passing each dimension separately #' nmfModel(r, n, p) #' #' # trying to create a NMF object based on incompatible matrices generates an error #' w <- rmatrix(n, r) #' h <- rmatrix(r+1, p) #' try( new('NMFstd', W=w, H=h) ) #' try( nmfModel(w, h) ) #' try( nmfModel(r+1, W=w, H=h) ) #' # The factory method can be force the model to match some target dimensions #' # but warnings are thrown #' nmfModel(r, W=w, H=h) #' nmfModel(r, n-1, W=w, H=h) #' setMethod('nmfModel', signature(rank='numeric', target='numeric'), function(rank, target, ncol=NULL, model='NMFstd', W, H, ..., force.dim=TRUE, order.basis=TRUE){ if( is.null(model) ) model <- 'NMFstd' # check validity of the provided class if( !isClass(model) ) stop("nmfModel - Invalid model name: class '", model,"' is not defined.") if( !extends(model, 'NMF') ) stop("nmfModel - Invalid model name: class '", model,"' does not extend class 'NMF'.") # check the validity of the target if( length(target) == 0 ) stop('nmfModel - Invalid dimensions: `target` must be at least of length 1') if( length(target) > 2 ) stop('nmfModel - Invalid dimensions: `target` must be at most of length 2') if( !missing(ncol) && !is.null(ncol) && (!is.vector(ncol) || length(ncol) > 1 || !is.numeric(ncol) || ncol<0 ) ) stop('nmfModel - Invalid dimensions: `ncol` must be a single nonnegative integer') # compute the target dimension target <- as.integer(target) n <- target[1] m <- if( length(target) == 2 ) target[2] else if( !missing(ncol) && !is.null(ncol) ) ncol else if( !missing(H) ) ncol(H) else n if( n < 0 ) stop("nmfModel - Invalid target number of rows: nonnegative value expected") if( m < 0 ) stop("nmfModel - Invalid target number of columns: nonnegative value expected") # force rank to be an integer r <- as.integer(rank) # check the validity of the rank if( length(r) != 1 ) stop("Invalid argument 'rank': single numeric expected") if( r < 0 ) stop("nmfModel - Invalid argument 'rank': nonnegative value expected") # do not allow dimension incompatibility if required if( !force.dim && !missing(W) && !missing(H) && ncol(W) != nrow(H) ){ stop('nmfModel - Invalid number of columns in the basis matrix [', ncol(W), ']: ' , 'it should match the number of rows in the mixture coefficient matrix [', nrow(H), ']') } # build dummy compatible W and H if necessary W.was.missing <- FALSE if( missing(W) ){ W <- matrix(as.numeric(NA), n, r) W.was.missing <- TRUE } else{ if( is.vector(W) ) # convert numerical vectors into a matrix W <- matrix(W, n, r) else if( is.data.frame(W) ) # convert data.frame into matrix W <- as.matrix(W) if( r == 0 ) r <- ncol(W) else if( r < ncol(W) ){ if( !force.dim ){ stop('nmfModel - Invalid number of columns in the basis matrix [', ncol(W), ']: ', 'it should match the factorization rank [', r, ']') } warning("Objective rank is [",r,"] lower than the number of columns in W [",ncol(W),"]: " , "only the first ", r," columns of W will be used") W <- W[,1:r, drop=FALSE] } else if( r > ncol(W) ){ stop("nmfModel - Objective rank [",r,"] is greater than the number of columns in W [",ncol(W),"]") } # resolve consistency with target if( n == 0 ) n <- nrow(W) else if( n < nrow(W) ){ if( !force.dim ){ stop('nmfModel - Invalid number of rows in the basis matrix [', nrow(W), ']: ' , 'it should match the target number of rows [', n, ']') } warning("nmfModel - Number of rows in target is lower than the number of rows in W [",nrow(W),"]: ", "only the first ", n," rows of W will be used") W <- W[1:n, , drop=FALSE] } else if( n > nrow(W) ){ stop("nmfModel - Number of rows in target [",n,"] is greater than the number of rows in W [",nrow(W),"]") } } if( missing(H) ) H <- matrix(as.numeric(NA), ncol(W), m) else{ # convert numerical vectors into a matrix if( is.vector(H) ) H <- matrix(H, r, m) else if( is.data.frame(H) ) # convert data.frame into matrix H <- as.matrix(H) if( r == 0 ) r <- nrow(H) else if( r < nrow(H) ){ if( !force.dim ){ stop('nmfModel - Invalid number of rows in the mixture coefficient matrix [', nrow(H), ']: ' , 'it should match the factorization rank [', r, ']') } warning("nmfModel - Objective rank [",r,"] is lower than the number of rows in H [",nrow(H),"]: " , "only the first ", r," rows of H will be used") H <- H[1:r,, drop=FALSE] } else if( r > nrow(H) ) stop("nmfModel - Objective rank [",r,"] is greater than the number of rows in H [",nrow(H),"]") # force dummy W to be at least compatible with H if( W.was.missing ) W <- matrix(as.numeric(NA), n, r) # resolve consistency with target if( m == 0 ) m <- ncol(H) else if( m < ncol(H) ){ if( !force.dim ){ stop('nmfModel - Invalid number of columns in the mixture coefficient matrix [', ncol(H), ']:' , ' it should match the target number of columns [', m, ']') } warning("nmfModel - Number of columns in target is lower than the number of columns in H [",ncol(H),"]:" , " only the first ", m," columns of H will be used") H <- H[, 1:m, drop=FALSE] } else if( m > ncol(H) ){ stop("nmfModel - Number of columns in target [",m,"]" ," is greater than the number of columns in H [",ncol(H),"]") } } # check validity of matrices W and H (only if one of the target dimension is not null) if( n + m > 0 ){ if( nrow(W) != n ) stop('nmfModel - Invalid number of rows for W: should match number of rows in target [', n, ']') if( ncol(W) != r ) stop('nmfModel - Invalid number of columns for W: should match factorization rank [', r, ']') if( nrow(H) != r ) stop('nmfModel - Invalid number of rows for H: should match factorization rank [', r, ']') if( ncol(H) != m ) stop('nmfModel - Invalid number of columns for H: should match number of columns in target [', m, ']') } # build and return a dummy NMF object nmf.debug('nmfModel', "Instantiate NMF model:", model) res <- new(model, ...) nmf.debug('nmfModel', "Set factors in model:", model) # set the dimnames if possible cW <- !is.null(colnames(W)) rH <- !is.null(rownames(H)) if( cW && !rH )# use colnames of W as basisnames rownames(H) <- colnames(W) else if( !cW && rH )# use rownames of H as basisnames colnames(W) <- rownames(H) else if( cW && rH ){# try to match names or use colnames of W (with a warning) # reorder as in the basis matrix if it makes sense, i.e. if the names are the same if( order.basis && !anyDuplicated(rownames(H)) && length(setdiff(rownames(H), colnames(W)))==0 ){ H <- H[match(rownames(H), colnames(W)),] } else{ rownames(H) <- colnames(W) warning("nmfModel - The rownames of the mixture matrix were set to match the colnames of the basis matrix") } } # set the basis and coef matrices .basis(res) <- W; .coef(res) <- H # check validity validObject(res) # return the model res } ) #' Creates an empty NMF model of a given rank. #' #' This call is equivalent to \code{nmfModel(rank, 0L, ...)}, which #' creates \emph{empty} \code{NMF} object with a basis and mixture coefficient matrix #' of dimension 0 x \code{rank} and \code{rank} x 0 respectively. #' #' @seealso \code{\link{is.empty.nmf}} #' @examples #' ## Empty model of given rank #' nmfModel(3) #' setMethod('nmfModel', signature(rank='numeric', target='missing'), function(rank, target, ...){ nmfModel(rank, 0L, ...) } ) #' Creates an empty NMF model of null rank and a given dimension. #' #' This call is equivalent to \code{nmfModel(0, target, ...)}. #' #' @examples #' nmfModel(target=10) #square #' nmfModel(target=c(10, 5)) #' setMethod('nmfModel', signature(rank='missing', target='ANY'), function(rank, target, ...){ nmfModel(0L, target, ...) } ) #' Creates an empty NMF model of null rank and given dimension. #' #' This call is equivalent to \code{nmfModel(0, target, ...)}, and is meant for #' internal usage only. setMethod('nmfModel', signature(rank='NULL', target='ANY'), function(rank, target, ...){ nmfModel(0L, target, ...) } ) #' Creates an empty NMF model or from existing factors #' #' This method is equivalent to \code{nmfModel(0, 0, ..., force.dim=FALSE)}. #' This means that the dimensions of the NMF model will be taken from the optional #' basis and mixture coefficient arguments \code{W} and \code{H}. #' An error is thrown if their dimensions are not compatible. #' #' Hence, this method may be used to generate an NMF model from existing factor #' matrices, by providing the named arguments \code{W} and/or \code{H}: #' #' \code{nmfModel(W=w)} or \code{nmfModel(H=h)} or \code{nmfModel(W=w, H=h)} #' #' Note that this may be achieved using the more convenient interface is #' provided by the method \code{nmfModel,matrix,matrix} (see its dedicated description). #' #' See the description of the appropriate method below. #' #' @examples #' #' # Build an empty NMF model #' nmfModel() #' #' # create a NMF object based on one random matrix: the missing matrix is deduced #' # Note this only works when using factory method NMF #' n <- 50; r <- 3; #' w <- rmatrix(n, r) #' nmfModel(W=w) #' #' # create a NMF object based on random (compatible) matrices #' p <- 20 #' h <- rmatrix(r, p) #' nmfModel(H=h) #' #' # specifies two compatible matrices #' nmfModel(W=w, H=h) #' # error if not compatible #' try( nmfModel(W=w, H=h[-1,]) ) #' setMethod('nmfModel', signature(rank='missing', target='missing'), function(rank, target, ...){ # build an a priori empty model (extra args may provide the true dimension) # NB: do not allow dimension incompatibilities nmfModel(0L, 0L, ..., force.dim=FALSE) } ) #' Creates an NMF model compatible with a target matrix. #' #' This call is equivalent to \code{nmfModel(rank, dim(target), ...)}. #' That is that the returned NMF object fits a target matrix of the same #' dimension as \code{target}. #' #' Only the dimensions of \code{target} are used to construct the \code{NMF} object. #' The matrix slots are filled with \code{NA} values if these are not specified #' in arguments \code{W} and/or \code{H}. #' However, dimension names are set on the return NMF model if present in #' \code{target} and argument \code{use.names=TRUE}. #' #' @param use.names a logical that indicates whether the dimension names of the #' target matrix should be set on the returned NMF model. #' #' @inline #' @examples #' #' # create a r-ranked NMF model compatible with a given target matrix #' obj <- nmfModel(r, V) #' all(is.na(basis(obj))) #' setMethod('nmfModel', signature(rank='numeric', target='matrix'), function(rank, target, ..., use.names=TRUE){ # build an object compatible with the target's dimensions res <- nmfModel(rank, dim(target), ...) # try to set dimnames if it makes sense: # set on target and not somehow already set on the result if( use.names && !is.null(dimnames(target)) ){ dn <- dimnames(res) if( is.null(dn) ) dn <- list(NULL, NULL, NULL) if( is.null(rownames(res)) && !is.null(rownames(target)) ) dimnames(res) <- c(dimnames(target)[1], dn[2:3]) if( is.null(colnames(res)) && !is.null(colnames(target)) ) dimnames(res) <- c(dimnames(res)[1], dimnames(target)[2], dimnames(res)[3]) } res } ) #' Creates an NMF model based on two existing factors. #' #' This method is equivalent to \code{nmfModel(0, 0, W=rank, H=target..., force.dim=FALSE)}. #' This allows for a natural shortcut for wrapping existing \strong{compatible} #' matrices into NMF models: #' \samp{nmfModel(w, h)} #' #' Note that an error is thrown if their dimensions are not compatible. #' #' @examples #' ## From two existing factors #' #' # allows a convenient call without argument names #' w <- rmatrix(n, 3); h <- rmatrix(3, p) #' nmfModel(w, h) #' #' # Specify the type of NMF model (e.g. 'NMFns' for non-smooth NMF) #' mod <- nmfModel(w, h, model='NMFns') #' mod #' #' # One can use such an NMF model as a seed when fitting a target matrix with nmf() #' V <- rmatrix(mod) #' res <- nmf(V, mod) #' nmf.equal(res, nmf(V, mod)) #' #' # NB: when called only with such a seed, the rank and the NMF algorithm #' # are selected based on the input NMF model. #' # e.g. here rank was 3 and the algorithm "nsNMF" is used, because it is the default #' # algorithm to fit "NMFns" models (See ?nmf). #' setMethod('nmfModel', signature(rank='matrix', target='matrix'), function(rank, target, ...){ # use rank and target as W and H respectively # NB: do not allow dimension incompatibilities nmfModel(0L, 0L, W=rank, H=target, ..., force.dim=FALSE) } ) #' Same as \code{nmfModel('matrix', 'matrix')} but for \code{data.frame} objects, #' which are generally produced by \code{\link{read.delim}}-like functions. #' #' The input \code{data.frame} objects are converted into matrices with #' \code{\link{as.matrix}}. setMethod('nmfModel', signature(rank='data.frame', target='data.frame'), function(rank, target, ...){ nmfModel(as.matrix(rank), as.matrix(target), ...) } ) #' Creates an NMF model with arguments \code{rank} and \code{target} swapped. #' #' This call is equivalent to \code{nmfModel(rank=target, target=rank, ...)}. #' This allows to call the \code{nmfModel} function with arguments \code{rank} #' and \code{target} swapped. #' It exists for convenience: #' \itemize{ #' \item allows typing \code{nmfModel(V)} instead of \code{nmfModel(target=V)} to create #' a model compatible with a given matrix \code{V} (i.e. of dimension \code{nrow(V), 0, ncol(V)}) #' \item one can pass the arguments in any order (the one that comes to the user's mind first) #' and it still works as expected. #' } #' #' @examples #' ## swapped arguments `rank` and `target` #' V <- rmatrix(20, 10) #' nmfModel(V) # equivalent to nmfModel(target=V) #' nmfModel(V, 3) # equivalent to nmfModel(3, V) #' setMethod('nmfModel', signature(rank='matrix', target='ANY'), function(rank, target, ...){ if( missing(target) ) target <- NULL # call nmfModel with swapping the arguments nmfModel(target, rank, ...) } ) #' Simple Parsing of Formula #' #' Formula parser for formula-based NMF models. #' #' @param x formula to parse #' @return a list with the following elements: #' \item{response}{ logical that indicates if the formula has a response term.} #' \item{y}{ name of the response variable.} #' \item{x}{ list of regressor variable names.} #' \item{n}{ number of regressor variables.} #' #' @keywords internal parse_formula <- function(x){ res <- list() # parse formula f <- as.character(x) hasResponse <- length(f) == 3L # response res$response <- hasResponse res$y <- if( hasResponse ) f[2L] # regressors reg <- if( hasResponse ) f[3L] else f[2L] res$x <- strsplit(reg, ' ')[[1]] res$n <- length(res$reg) # as a tring res$string <- paste(res$y, '~', reg, collapse='') res } #' Build a formula-based NMF model, that can incorporate fixed basis or #' coefficient terms. #' #' @param data Optional argument where to look for the variables used in the #' formula. #' @param no.attrib logical that indicate if attributes containing data related #' to the formula should be attached as attributes. #' If \code{FALSE} attributes \code{'target'} and \code{'formula'} contain the #' target matrix, and a list describing each formula part (response, regressors, #' etc.). #' #' @inline #' #' @examples #' #' # empty 3-rank model #' nmfModel(~ 3) #' #' # 3-rank model that fits a given data matrix #' x <- rmatrix(20,10) #' nmfModel(x ~ 3) #' #' # add fixed coefficient term defined by a factor #' gr <- gl(2, 5) #' nmfModel(x ~ 3 + gr) #' #' # add fixed coefficient term defined by a numeric covariate #' nmfModel(x ~ 3 + gr + b, data=list(b=runif(10))) #' #' # 3-rank model that fits a given ExpressionSet (with fixed coef terms) #' e <- Biobase::ExpressionSet(x) #' pData(e) <- data.frame(a=runif(10)) #' nmfModel(e ~ 3 + gr + a) # `a` is looked up in the phenotypic data of x pData(x) #' setMethod('nmfModel', signature(rank='formula', target='ANY'), function(rank, target, ..., data=NULL, no.attrib=FALSE){ # missing target is NULL if( missing(target) ) target <- NULL # data is a model class name (passed from nmf) if( is.character(data) ){ model <- data data <- NULL }else model <- NULL # parse formula f <- parse_formula(rank) enclos <- environment(rank) rank <- 0L if( is.vector(target) && is.numeric(target) ){ rank <- target target <- NULL } # utility function to merge data and pData merge_pdata <- function(x, data){ pd <- pData(x) if( length(pd) ){ if( is.null(data) ) pd else{ cbind(data, pd) } }else data } # determine formula data if( is.null(data) ){ # target data.frame taken as data if a response variable if defined if( is.data.frame(target) && f$response ){ data <- target target <- NULL }else if( is.environment(target) ){ # use target as enclosure enclos <- target target <- NULL } } # determine target matrix: X <- 0L # if a response term is present, lookup target data in other arguments if( f$response ){ X <- eval(parse(text=f$y), enclos) if( is.eset(target) && !identical(X, target) ){ warning("Conflicting response term and target: the ExpressionSet in `target` will only be used for covariates.") data <- merge_pdata(target, data) } } else if( is.null(target) ){ # no response, no target: try ExpressionSet in data if( is.eset(data) ){ X <- exprs(data) } }else{ X <- target } # merge data and pData from ExpressionSet target if( is.eset(X) ){ data <- merge_pdata(X, data) X <- exprs(X) } r <- rank cterms <- bterms <- list() # dimensions are also inferred from the formula n <- if( identical(X, 0L) ) 0L else nrow(X) p <- if( identical(X, 0L) ) 0L else ncol(X) for( v in f$x ){ if( grepl("^[0-9]+$", v) ){ if( rank == 0L ){ # rank not specified in target r <- as.numeric(v) }else{ warning("NMF::nmfModel - Discarding rank specified in the formula [", v,"]:" , " using value specified in target rank instead [", rank, "].") } }else if( grepl("^[+-]$", v) ) next else { val <- eval(parse(text=v), data, enclos) .add_term <- function(v, val, type = NULL){ if( p==0L || length(val) == p || identical(type, 'coef') ){ cterms[[v]] <<- val if( p==0L ) p <<- length(val) }else if( n==0L || length(val) == n || identical(type, 'basis') ){ bterms[[v]] <<- val if( n==0L ) n <<- length(val) }else stop("Invalid", type," term '", v, "' length [", length(val), "]:" , " length must either be the number of target columns [", p, "]" , " or rows [", n, "]") } if( is.null(dim(val)) ) .add_term(v, val) else if( n == 0L || nrow(val) == n ){ lapply(1:ncol(val), function(i){ if( !is.null(cname <- colnames(val)[i]) && nzchar(cname) ) vname <- cname else vname <- paste0(v, i) .add_term(vname, val[, i], type = 'basis') }) }else{ # special handling of data.frames: # -> coef terms are passed as column variables if( is.data.frame(val) && (p == 0L || nrow(val) == p)){ val <- t(val) } if( p == 0L || ncol(val) == p ){ lapply(1:nrow(val), function(i){ if( !is.null(cname <- rownames(val)[i]) && nzchar(cname) ) vname <- cname else vname <- paste0(v, i) .add_term(vname, val[i, ], type = 'coef') }) }else{ stop("Incompatible matrix-like term '", v, "' dimensions [", str_dim(val), "]:" , " number of rows or columns must match the ones of the target matrix [", str_dim(X, dims = c(n, p)) ,"]") } } } } # try to fixup X if possible if( identical(X, 0L) ) X <- c(n, p) # call nmfModel with cterms if( hasArg(model) || is.null(model) ) object <- nmfModel(r, X, ...) else object <- nmfModel(r, X, ..., model=model) # set fixed basis terms if( length(bterms) ){ bterms(object) <- as.data.frame(bterms) } # set fixed coef terms if( length(cterms) ){ cterms(object) <- as.data.frame(cterms) } # valid object validObject(object) # attach formula data if( !no.attrib ){ attr(object, 'target') <- X attr(object, 'formula') <- f } # return object object } ) #' Listing NMF Models #' #' \code{nmfModels} lists all available NMF models currently defined that can be #' used to create NMF objects, i.e. -- more or less -- all S4 classes that #' inherit from class \code{\linkS4class{NMF}}. #' #' @param builtin.only logical that indicates whether only built-in NMF models, #' i.e. defined within the NMF package, should be listed. #' #' @return a list #' #' @export #' @family NMF-interface #' @rdname nmfModel #' @examples #' #' # show all the NMF models available (i.e. the classes that inherit from class NMF) #' nmfModels() #' # show all the built-in NMF models available #' nmfModels(builtin.only=TRUE) #' nmfModels <- function(builtin.only=FALSE){ if( builtin.only ) return( .nmf.Models.Builtin ) # return all subclasses of class 'NMF' (minus class 'NMFfit' and its subclasses) models <- names(methods::getClass('NMF')@subclasses) models.wraps <- c('NMFfit', names(methods::getClass('NMFfit')@subclasses)) return( models[!is.element(models, models.wraps)] ) } ###% Initialization function for NMF models .nmf.Models.Builtin <- NULL .init.nmf.models <- function(){ .nmf.Models.Builtin <<- nmfModels() } NMF/R/grid.R0000644000176200001440000000436114333176413012154 0ustar liggesusers# Grid related functions # # Mainly functions that duplicate grid functions but do not create a new plot # if none is present. # # Author: Renaud Gaujoux # Creation: 04 Jun 2012 ############################################################################### #' @include options.R #' @import grid NULL #' Internal Grid Extension #' #' These functions enable mixing base and grid graphics in \code{\link{aheatmap}}, #' by avoiding calls to the grid internal function \code{'L_gridDirty'}. #' They are not exported (i.e. not tampering core functions) and are only meant for internal #' use within the \pkg{NMF} package. #' #' \code{tryViewport} tries to go down to a viewport in the current tree, #' given its name. #' #' @details #' \code{tryViewport} uses \code{\link[grid]{grid.ls}} and not #' \code{\link{seekViewport}} as the latter would reset the graphic device #' and break the mix grid/base graphic capability. #' #' @param name viewport name #' @param verbose toggle verbosity #' #' @rdname grid #' @keywords internal tryViewport <- function(name, verbose=FALSE){ if( verbose ) message("vp - lookup for ", name) l <- grid.ls(viewports=TRUE, grobs=FALSE, print=FALSE) if( name %in% l$name ){ downViewport(name) } } #' \code{current.vpPath_patched} aims at substituting \code{\link[grid]{current.vpPath}}, #' so that the graphic engine is not reset. #' This is essentially to prevent outputting a blank page at the beginning of PDF #' graphic engines. #' #' @rdname grid current.vpPath_patched <- local({ .current.vpPath <- NULL function(){ f_current.vpPath <- .current.vpPath if( !.use.grid.patch() ) f_current.vpPath <- grid::current.vpPath else if( is.null(f_current.vpPath) ){ # load patch from installed file patch <- source(packagePath('scripts', 'grid.R', package = 'NMF'), local = TRUE) .current.vpPath <<- patch$value f_current.vpPath <- .current.vpPath } # call f_current.vpPath() } }) # Add new option to enable/disable grid patch .OPTIONS$newOptions(grid.patch = FALSE) #' \code{.use.grid.patch} tells if the user enabled patching grid. #' @rdname grid .use.grid.patch <- function(){ !isCHECK() && nmf.getOption('grid.patch') } NMF/R/simulation.R0000644000176200001440000001211214333176413013404 0ustar liggesusers# Functions to simulate NMF data # # Author: Renaud Gaujoux ############################################################################### #' @include utils.R NULL #' Simulating Datasets #' #' The function \code{syntheticNMF} generates random target matrices that follow #' some defined NMF model, and may be used to test NMF algorithms. #' It is designed to designed to produce data with known or clear classes of #' samples. #' #' @param n number of rows of the target matrix. #' @param r specification of the factorization rank. #' It may be a single \code{numeric}, in which case argument \code{p} is required #' and \code{r} groups of samples are generated from a draw from a multinomial #' distribution with equal probabilities, that provides their sizes. #' #' It may also be a numerical vector, which contains the number of samples in #' each class (i.e integers). In this case argument \code{p} is discarded #' and forced to be the sum of \code{r}. #' @param p number of columns of the synthetic target matrix. #' Not used if parameter \code{r} is a vector (see description of argument \code{r}). #' @param offset specification of a common offset to be added to the synthetic target #' matrix, before noisification. #' Its may be a numeric vector of length \code{n}, or a single numeric value that #' is used as the standard deviation of a centred normal distribution from which #' the actual offset values are drawn. #' @param noise a logical that indicate if noise should be added to the #' matrix. #' @param factors a logical that indicates if the NMF factors should be return #' together with the matrix. #' @param seed a single numeric value used to seed the random number generator #' before generating the matrix. #' The state of the RNG is restored on exit. #' #' @return a matrix, or a list if argument \code{factors=TRUE}. #' #' When \code{factors=FALSE}, the result is a matrix object, with the following attributes set: #' \describe{ #' \item{coefficients}{the true underlying coefficient matrix (i.e. \code{H});} #' \item{basis}{the true underlying coefficient matrix (i.e. \code{H});} #' \item{offset}{the offset if any;} #' \item{pData}{a \code{list} with one element \code{'Group'} that contains a factor #' that indicates the true groups of samples, i.e. the most contributing basis component for each sample;} #' \item{fData}{a \code{list} with one element \code{'Group'} that contains a factor #' that indicates the true groups of features, i.e. the basis component #' to which each feature contributes the most.} #' } #' #' Moreover, the result object is an \code{\link{ExposeAttribute}} object, which means that #' relevant attributes are accessible via \code{$}, e.g., \code{res$coefficients}. #' In particular, methods \code{\link{coef}} and \code{\link{basis}} will work as expected #' and return the true underlying coefficient and basis matrices respectively. #' #' @export #' @examples #' #' # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) #' n <- 50 #' counts <- c(5, 5, 8) #' #' # no noise #' V <- syntheticNMF(n, counts, noise=FALSE) #' \dontrun{aheatmap(V)} #' #' # with noise #' V <- syntheticNMF(n, counts) #' \dontrun{aheatmap(V)} #' syntheticNMF <- function(n, r, p, offset=NULL, noise=TRUE, factors=FALSE, seed=NULL){ # set seed if necessary if( !is.null(seed) ){ os <- RNGseed() on.exit( RNGseed(os) ) set.seed(seed) } # internal parameters mu.W <- 1; sd.W <- 1 if( isTRUE(noise) ){ noise <- list(mean=0, sd=1) }else if( isNumber(noise) ){ noise <- list(mean=0, sd=noise) }else if( is.list(noise) ){ stopifnot( length(noise) == 2L ) noise <- setNames(noise, c('mean', 'sd')) }else noise <- FALSE if( length(r) == 1 ){ g <- rmultinom(1, p, rep(1, r)) }else{ # elements of r are the number of samples in each class g <- r p <- sum(r) # total number of samples r <- length(r) # number of class } # generate H H <- matrix(0, r, p) tmp <- 0 for( i in 1:r ){ H[i,(tmp+1):(tmp+g[i])] <- 1 tmp <- tmp+g[i] } if( length(n) == 1 ){ b <- rmultinom(1, n, rep(1, r)) }else{ # elements of n are the number of genes in each class b <- n n <- sum(n) } # generate W W <- matrix(0, n, r) tmp <- 0 for( i in 1:r ){ W[(tmp+1):(tmp+b[i]),i] <- abs(rnorm(b[i], mu.W, sd.W)) tmp <- tmp + b[i] } # build the composite matrix res <- W %*% H # add the offset if necessary if( !is.null(offset) ){ if( length(offset) == 1L ) offset <- rnorm(n, mean=0, sd=offset) stopifnot(length(offset)==n) res <- res + offset } # add some noise if required if( !isFALSE(noise) ) res <- pmax(res + rmatrix(res, dist=rnorm, mean=noise$mean, sd=noise$sd), 0) # return the factors if required pData <- list(Group=factor(unlist(mapply(rep, 1:r, g, SIMPLIFY=FALSE)))) fData <- list(Group=factor(unlist(mapply(rep, 1:r, b, SIMPLIFY=FALSE)))) if( factors ) res <- list(res, W=W, H=H, offset=offset, pData=pData, fData=fData) # wrap results and expose relevant attributes ExposeAttribute(res, coefficients=H, basis=W, offset=offset , pData = pData, fData = fData , .VALUE=TRUE, .MODE='r') } NMF/R/NMFOffset-class.R0000644000176200001440000001145714333176413014125 0ustar liggesusers#' @include NMFstd-class.R NULL #' NMF Model - Nonnegative Matrix Factorization with Offset #' #' This class implements the \emph{Nonnegative Matrix Factorization with #' Offset} model, required by the NMF with Offset algorithm. #' #' The NMF with Offset algorithm is defined by \cite{Badea2008} as a modification #' of the euclidean based NMF algorithm from \code{Lee2001} (see section Details and #' references below). #' It aims at obtaining 'cleaner' factor matrices, by the introduction of an #' offset matrix, explicitly modelling a feature specific baseline #' -- constant across samples. #' #' @section Creating objects from the Class: #' #' Object of class \code{NMFOffset} can be created using the standard way with #' operator \code{\link{new}} #' #' However, as for all NMF model classes -- that extend class #' \code{\linkS4class{NMF}}, objects of class \code{NMFOffset} should be #' created using factory method \code{\link{nmfModel}} : #' #' \code{new('NMFOffset')} #' #' \code{nmfModel(model='NMFOffset')} #' #' \code{nmfModel(model='NMFOffset', W=w, offset=rep(1, nrow(w)))} #' #' See \code{\link{nmfModel}} for more details on how to use the factory #' method. #' #' @export #' @family NMF-model #' @examples #' #' # create a completely empty NMF object #' new('NMFOffset') #' #' # create a NMF object based on random (compatible) matrices #' n <- 50; r <- 3; p <- 20 #' w <- rmatrix(n, r) #' h <- rmatrix(r, p) #' nmfModel(model='NMFOffset', W=w, H=h, offset=rep(0.5, nrow(w))) #' #' # apply Nonsmooth NMF algorithm to a random target matrix #' V <- rmatrix(n, p) #' \dontrun{nmf(V, r, 'offset')} #' #' # random NMF model with offset #' rnmf(3, 10, 5, model='NMFOffset') #' setClass('NMFOffset' , representation( offset = 'numeric' # offset vector ) , contains = 'NMFstd' , prototype=prototype( offset = numeric() ) ) #' Show method for objects of class \code{NMFOffset} #' @export setMethod('show', 'NMFOffset', function(object) { callNextMethod() cat("offset: ") if( length(object@offset) > 0 ){ cat('[', head(object@offset, 5) , if( length(object@offset) > 5 ) "..." else NULL , ']') } else cat('none') cat("\n") } ) #' @section Initialize method: #' The initialize method for \code{NMFOffset} objects tries to correct the initial #' value passed for slot \code{offset}, so that it is consistent with the dimensions #' of the \code{NMF} model: #' it will pad the offset vector with NA values to get the length equal to the #' number of rows in the basis matrix. #' #' @param offset optional numeric vector used to initialise slot \sQuote{offset}. #' #' @rdname NMFOffset-class setMethod("initialize", 'NMFOffset', function(.Object, ..., offset){ .Object <- callNextMethod() # correct the offset slot if possible if( missing(offset) ) offset <- numeric() if( !is.numeric(offset) ) stop("Unvalid value for parameter 'offset': a numeric vector is expected") # force length to be consistent with the factorization's dimension n <- nrow(.Object) if( n > 0 ) .Object@offset <- c( offset, rep(NA, max(0, n - length(offset))) )[1:n] # return the initialized valid object .Object } ) #' @export setGeneric('offset', package='stats') #' Offsets in NMF Models with Offset #' #' The function \code{offset} returns the offset vector from an NMF model #' that has an offset, e.g. an \code{NMFOffset} model. #' @param object an instance of class \code{NMFOffset}. #' setMethod('offset', signature(object='NMFOffset'), function(object){ object@offset } ) #' Computes the target matrix estimate for an NMFOffset object. #' #' The estimate is computed as: #' \deqn{ W H + offset } #' #' @param offset offset vector #' @inline setMethod('fitted', signature(object='NMFOffset'), function(object, W, H, offset=object@offset){ if( missing(W) ) W <- object@W if( missing(H) ) H <- object@H object@W %*% object@H + offset } ) #' Generates a random NMF model with offset, from class \code{NMFOffset}. #' #' The offset values are drawn from a uniform distribution between 0 and #' the maximum entry of the basis and coefficient matrices, which are drawn #' by the next suitable \code{\link{rnmf}} method, which is the workhorse #' method \code{rnmf,NMF,numeric}. #' #' @examples #' #' # random NMF model with offset #' x <- rnmf(2, 3, model='NMFOffset') #' x #' offset(x) #' # from a matrix #' x <- rnmf(2, rmatrix(5,3, max=10), model='NMFOffset') #' offset(x) #' setMethod('rnmf', signature(x='NMFOffset', target='numeric'), function(x, target, ...){ # call the parent's 'rnmf' method to build a standard random NMF factorization res <- callNextMethod() #Vc# Initialize a random offset of length the number of genes res@offset <- runif(nrow(res), min=0, max=max(basis(res), coef(res))); # return the initialized NMFOffset object res }) NMF/R/seed-nndsvd.R0000644000176200001440000000764214333176413013446 0ustar liggesusers#' @include registry-seed.R NULL ###% Seeding method: Nonnegative Double Singular Value Decomposition ###% ###% @author Renaud Gaujoux ###% @creation 17 Jul 2009 ###% Auxliary functions .pos <- function(x){ as.numeric(x>=0) * x } .neg <- function(x){ - as.numeric(x<0) * x } .norm <- function(x){ sqrt(drop(crossprod(x))) } ###% This function implements the NNDSVD algorithm described in Boutsidis (2008) for ###% initializattion of Nonnegative Matrix Factorization Algorithms. ###% ###% @param A the input nonnegative m x n matrix A ###% @param k the rank of the computed factors W,H ###% @param flag indicates the variant of the NNDSVD Algorithm: ###% - flag=0 --> NNDSVD ###% - flag=1 --> NNDSVDa ###% - flag=2 --> NNDSVDar ###% ###% @note This code is a port from the MATLAB code from C. Boutsidis and E. Gallopoulos kindly provided by the authors for research purposes. ###% Original MATLAB code: http://www.cs.rpi.edu/~boutsc/papers/paper1/nndsvd.m ###% ###% @references C. Boutsidis and E. Gallopoulos, ###% SVD-based initialization: A head start for nonnegative matrix factorization, ###% Pattern Recognition, 2007 ###% doi:10.1016/j.patcog.2007.09.010 ###% .nndsvd.wrapper <- function(object, x, densify=c('none', 'average', 'random')){ # match parameter 'densify' densify <- match.arg(densify) flag <- which(densify == c('none', 'average', 'random')) - 1 res <- .nndsvd.internal(x, nbasis(object), flag) # update 'NMF' object .basis(object) <- res$W; .coef(object) <- res$H # return updated object object } ###% Port to R of the MATLAB code from Boutsidis .nndsvd.internal <- function(A, k, flag=0){ #check the input matrix if( any(A<0) ) stop('The input matrix contains negative elements !') #size of input matrix size = dim(A); m <- size[1]; n<- size[2] #the matrices of the factorization W = matrix(0, m, k); H = matrix(0, k, n); #1st SVD --> partial SVD rank-k to the input matrix A. s = svd(A, k, k); U <- s$u; S <- s$d; V <- s$v #------------------------------------------------------- # We also recommend the use of propack for the SVD # 1st SVD --> partial SVD rank-k ( propack ) # OPTIONS.tol = 0.00001; % remove comment to this line # [U,S,X] = LANSVD(A,k,'L',OPTIONS); % remove comment to this line #------------------------------------------------------- #choose the first singular triplet to be nonnegative W[,1] = sqrt(S[1]) * abs(U[,1]); H[1,] = sqrt(S[1]) * abs(t(V[,1])); # second SVD for the other factors (see table 1 in Boutsidis' paper) for( i in seq(2,k) ){ uu = U[,i]; vv = V[,i]; uup = .pos(uu); uun = .neg(uu) ; vvp = .pos(vv); vvn = .neg(vv); n_uup = .norm(uup); n_vvp = .norm(vvp) ; n_uun = .norm(uun) ; n_vvn = .norm(vvn) ; termp = n_uup %*% n_vvp; termn = n_uun %*% n_vvn; if (termp >= termn){ W[,i] = sqrt(S[i] * termp) * uup / n_uup; H[i,] = sqrt(S[i] * termp) * vvp / n_vvp; }else{ W[,i] = sqrt(S[i] * termn) * uun / n_uun; H[i,] = sqrt(S[i] * termn) * vvn / n_vvn; } } #------------------------------------------------------------ #actually these numbers are zeros W[W<0.0000000001] <- 0; H[H<0.0000000001] <- 0; if( flag==1 ){ #NNDSVDa: fill in the zero elements with the average ind1 <- W==0 ; ind2 <- H==0 ; average <- mean(A); W[ind1] <- average; H[ind2] <- average; }else if( flag==2 ){#NNDSVDar: fill in the zero elements with random values in the space :[0:average/100] ind1 <- W==0; ind2 <- H==0; n1 <- sum(ind1); n2 <- sum(ind2); average = mean(A); W[ind1] = (average * runif(n1, min=0, max=1) / 100); H[ind2] = (average * runif(n2, min=0, max=1) / 100); } # return matrices W and H list(W=W, H=H) } ########################################################################### # REGISTRATION ########################################################################### setNMFSeed('nndsvd', .nndsvd.wrapper, overwrite=TRUE) NMF/R/algorithms-lnmf.R0000644000176200001440000000506214333176413014331 0ustar liggesusers# Algorithm for Nonnegative Matrix Factorization: Local NMF (LNMF) # # @author Renaud Gaujoux # @created 21 Jul 2009 #' @include registry-algorithms.R NULL ###% \item{\sQuote{lnmf}}{ Local Nonnegative Matrix Factorization. Based on a ###% regularized Kullback-Leibler divergence, it uses a modified version of ###% Lee and Seung's multiplicative updates. ###% See \emph{Li et al. (2001)}.} ###% Algorithm for Nonnegative Matrix Factorization: Local NMF (LNMF). ###% ###% The local NMF algorithm is minimizes use the following Kullback-Leibler divergence based objective function: ###% $$ ###% \sum_{i=1}^m\sum_{j=1}^n\left(X_{ij} \log\frac{X_{ij}}{(WH)_{ij}} - X_{ij} + (WH)_{ij} + \alpha U_{ij}\right) - \beta \sum_i V_{ij}, ###% $$ ###% where $\alpha, \beta > 0$ are some constants, $U = W^TW$ and $V = HH^T$. ###% ###% TODO: add explaination for each terms (see Wild 2002) ###% ###% @references Learning spatially localized, parts-based representation ###% , S.Z. Li, X.W. Hou, and H.J. Zhang. ###% , In Proceedings of IEEE International Conference on Computer Vision and Pattern Recognition ###% , December 2001 nmf_update_R.lnmf <- function(i, v, data, ...){ # retrieve each factor w <- .basis(data); h <- .coef(data); # update H h <- sqrt( h * crossprod(w, v / (w %*% h)) ) # update W using the standard divergence based update w <- R_std.divergence.update.w(v, w, h, w %*% h) # scale columns of W w <- sweep(w, 2L, colSums(w), "/", check.margin=FALSE) #every 10 iterations: adjust small values to avoid underflow if( i %% 10 == 0 ){ #precision threshold for numerical stability eps <- .Machine$double.eps h[h no refnames either): do nothing if( is.null(reflength) ) return(x) # special handling of character vectors if( is.character(x) && is.null(names(x)) && !is.null(refnames) ){ # if( !any(names(x) %in% refnames) && any(x %in% refnames) ){ if( any(x %in% refnames) ){ vmessage("match_atrack - Annotation track [", str_out(x, 3, use.names=TRUE), "] has some values matching data names: converting into a logical using values as names.") x <- setNames(rep(TRUE, length(x)), x) } } # reorder based on names .hasNames <- FALSE if( !is.null(names(x)) && !is.null(refnames) ){ inref <- names(x) %in% refnames if( !all(inref) ){ vmessage("match_atrack - Annotation track [", str_out(x, 3, use.names=TRUE), "] has partially matching names: subsetting track to match data") x <- x[inref] if( length(x) == 0L ) vmessage("match_atrack - Subset annotation track is empty") }else vmessage("match_atrack - Annotation track [", str_out(x, 3, use.names=TRUE), "] using names as identifiers") .hasNames <- TRUE if( anyDuplicated(names(x)) ){ dups <- duplicated(names(x)) vmessage("match_atrack - Annotation track [", str_out(x, 3, use.names=TRUE), "]: removing duplicated names [", str_out(x[dups], 3, use.names=TRUE),"]") x <- x[!dups] } } lx <- length(x) if( lx > reflength ){ stop("match_atrack - Invalid annotation track [", str_out(x, 3, use.names=TRUE), "]: more elements [", lx, "] than rows in data [", reflength, "].") } if( lx == reflength ){ # reorder if necessary res <- if( !.hasNames ) x else x[match(refnames, names(x))] return(res) } # build similar vector of correct size res <- if( is.factor(x) ) setNames(factor(c(x, rep(NA, reflength-lx)), levels=c(levels(x), NA)), refnames) else setNames(c(x, rep(NA, reflength-lx)), refnames) res[1:lx] <- NA # if not using names if( !.hasNames ){ if( is.integer(x) ) res[x] <- x else res[1:lx] <- x }else{ # put the values of x at the write place res[match(names(x), refnames)] <- x } res } #' The default method converts character or integer vectors into factors. #' Numeric vectors, factors, a single NA or \code{annotationTrack} objects are #' returned unchanged (except from reordering by argument \code{order}). #' Data frames are not changed either, but class 'annotationTrack' is appended #' to their original class set. #' #' @param data object used to extend the annotation track within a given data #' context. #' It is typically a matrix-like object, against which annotation specifications #' are matched using \code{\link{match_atrack}}. #' #' setMethod('.atrack', signature(object='ANY'), function(object, data=NULL, ...){ # recursive on list if( is.list(object) ){ object <- object[!sapply(object, function(x) length(x) == 0 || is_NA(x) )] res <- if( length(object) == 0 ) NULL else{ # convert into a list of tracks sapply(object, .atrack, data=data, ..., simplify=FALSE) } return(res) }else if( is.null(object) || is_NA(object) || is.atrack(object) ) object else{ # extend to match the data object <- match_atrack(object, data) # apply convertion rules for standard classes if( is.logical(object) ) aname(as.factor(ifelse(object, 1, NA)), "Flag") else if( is.integer(object) ){ if( any(wna <- is.na(object)) ) aname(as.factor(ifelse(!wna, 1,NA)), "Flag") else aname(as.numeric(object), "Level") } else if( is.character(object) ) aname(as.factor(object), "Group") else if( is.factor(object) ) aname(object, "Factor") else if( is.numeric(object) ) aname(object, "Variable") else stop("atrack - Invalid annotation item `" , substitute(object) , "`: must be a factor, or a logical, character, numeric or integer vector") } } ) setMethod('.atrack', 'character', function(object, ...){ # check for special escaped track code if( length(i <- atrack_code(object)) ){ if( length(object) == 1L ) object else if( length(i) == length(object) ) as.list(object) else{ # spe <- object[i] # object <- sub("^\\\\:", ":", object[-i]) # t <- callNextMethod() # c(list(t), spe) callNextMethod() } }else{ # object <- sub("^\\\\:", ":", object) callNextMethod() } } ) setMethod('.atrack', 'matrix', function(object, ...) .atrack(as.data.frame(object), ...) ) setMethod('.atrack', 'data.frame', function(object, ...) .atrack(as.list(object), ...) ) # tells if an object is a special annotation track code is_track_code <- function(x) isString(x) && grepl("^[:$]", x) atrack_code <- function(x, value=FALSE){ # check each track item ac <- sapply(x, is_track_code) i <- which(ac) if( !value ) i # return indexes else if( length(i) ) unlist(x[i]) # return values } match_atrack_code <- function(x, table, ...){ # pre-pend ':' table.plain <- sub("^:", '', table) table <- str_c(':', table.plain) # convert into an annotation track if( !is.atrack(x) ) x <- atrack(x, ...) m <- sapply(x, function(x){ if( isString(x) ) charmatch(x, table, nomatch=0L) else 0L }) if( length(i <- which(m!=0L)) ){ if( is.null(names(m)) ) names(m) <- rep('', length(m)) names(m)[i] <- table.plain[m[i]] } m } #' \code{atrack} creates/concatenates \code{annotationTrack} objects #' #' @param order an integer vector that indicates the order of the annotation #' tracks in the result list #' @param enforceNames logical that indicates if missing track names should #' be generated as \code{X} #' @param .SPECIAL an optional list of functions (with no arguments) that are #' called to generate special annotation tracks defined by codes of the form #' \code{':NAME'}. #' e.g., the function \code{link{consensusmap}} defines special tracks #' \code{':basis'} and \code{':consensus'}. #' #' If \code{.SPECIAL=FALSE}, then any special tracks is discarded and a warning #' is thrown. #' #' @param .DATA data used to match and extend annotation specifications. #' It is passed to argument \code{data} of the \code{.atrack} methods, which #' in turn use pass it to \code{\link{match_atrack}}. #' #' @param .CACHE an \code{annotationTrack} object with which the generated #' annotation track should be consistent. #' This argument is more for internal/advanced usage and should not be used #' by the end-user. #' #' @return \code{atrack} returns a list, decorated with class #' \code{'annotationTrack'}, where each element contains the description #' of an annotation track. #' #' @rdname atrack #' @export atrack <- function(..., order = NULL, enforceNames=FALSE, .SPECIAL=NA, .DATA = NULL, .CACHE = NULL){ # cbind object with the other arguments l <- list(...) if( length(l) == 1L && is.atrack(l[[1]]) ) object <- l[[1L]] else if( length(l) > 0 ){ object <- list() #print(l) lapply(seq_along(l), function(i){ x <- l[[i]] if( is_NA(x) || is.null(x) ) return() xa <- .atrack(x, data=.DATA) if( is_NA(xa) || is.null(xa) ) return() n <- names(object) # convert into a list if( !is.list(xa) ) xa <- setNames(list(xa), names(l)[i]) # remove NA and NULL elements if( is.null(xa) || is_NA(xa) ) return() # cbind with previous tracks if( is.null(object) ) object <<- xa else object <<- c(object, xa) }) } # exit now if object is NULL if( is.null(object) ) return() if( !length(object) ) return( annotationTrack() ) # add class 'annotationTrack' if not already there # (needed before calling match_atrack_code) object <- annotationTrack(object) # substitute special tracks if( is.list(.SPECIAL) ){ # str(object) m <- match_atrack_code(object, names(.SPECIAL)) i_spe <- which(m!=0L) if( length(i_spe) ){ # add names where needed if( is.null(names(object)) ) names(object) <- rep('', length(object)) # remove duplicated special tracks if( anyDuplicated(m[i_spe]) ){ # enforce name consistency if necessary g <- split(i_spe, m[i_spe]) sapply(g, function(i){ n <- names(object)[i] if( length(n <- n[n!='']) ) names(object)[i] <<- n[1L] }) # idup <- which(duplicated(m) & m!=0L) object <- object[-idup] m <- m[-idup] i_spe <- which(m!=0L) } # # enforce names consistent with the CACHE if( anyValue(.CACHE) ){ if( !is.atrack(.CACHE) ) stop("Argument .CACHE should be an annotation track object. [", class(.CACHE), ']') i_spe_cache <- atrack_code(.CACHE) if( length(i_spe_cache) ){ .CACHE_SPE <- unlist(.CACHE[i_spe_cache]) if( !is.null(names(.CACHE_SPE)) ){ sapply(i_spe, function(i){ x <- object[[i]] if( names(object)[i] == '' && !is_NA(j <- match(x, .CACHE_SPE)) && names(.CACHE_SPE)[j] != ''){ names(object)[i] <<- names(.CACHE_SPE)[j] } }) } } } # compute value a <- sapply(m[i_spe], function(i) .SPECIAL[[i]](), simplify=FALSE) object[i_spe] <- a # NB: this does not change the names # reset names nm <- names(object)[i_spe] names(object)[i_spe] <- ifelse(nm!='', nm, names(a)) } # remove special tracks if necessary if( length(i <- atrack_code(object)) ){ warning("Discarding unresolved special annotation tracks: " , str_out(unlist(object[i]), use.names=TRUE)) object <- object[-i] } } # generate names if( enforceNames ){ n <- names(object) xnames <- paste('X', 1:length(object), sep='') if( is.null(n) ) names(object) <- xnames else names(object)[n==''] <- xnames[n==''] } # reorder if necessary if( !is.null(order) ){ object <- sapply(object, function(x) x[order], simplify=FALSE) #lapply(seq_along(object), function(i) object[[i]] <<- object[[i]][order]) } #print(object) # return object annotationTrack(object) } #' \code{annotationTrack} is constructor function for \code{annotationTrack} object #' #' @rdname atrack annotationTrack <- function(x = list()){ if( !is.atrack(x) ) class(x) <- c('annotationTrack', if( nargs() ) class(x)) x } #setGeneric('atrack<-', function(object, value) standardGeneric('atrack<-')) #setReplaceMethod('atrack', signature(object='ANY', value='ANY'), # function(object, value){ # # if the annotation track is not NA: convert it into a atrack # # and set the value # if( !is_NA(object) && length(value) > 0 ){ # object <- atrack(object, value) # } # object # } #) #setReplaceMethod('atrack', signature(object='annotationTrack'), # function(object, value, replace = FALSE){ # if( !replace && length(value) > 0 ) atrack(object, value) # else if( replace ) atrack(value) # else object # } #) NMF/R/algorithmic.R0000644000176200001440000001525714333176413013537 0ustar liggesusers# Definition of a generic interface for algorithms # # Author: Renaud Gaujoux ############################################################################### #' Generic Interface for Algorithms #' #' @description #' The functions documented here are S4 generics that define an general interface for #' -- optimisation -- algorithms. #' #' This interface builds upon the broad definition of an algorithm as a workhorse function #' to which is associated auxiliary objects such as an underlying model or an objective function #' that measures the adequation of the model with observed data. #' It aims at complementing the interface provided by the \code{\link{stats}} package. #' #' @section Interface fo NMF algorithms: #' This interface is implemented for NMF algorithms by the classes \code{\link{NMFfit}}, #' \code{\link{NMFfitX}} and \code{\link{NMFStrategy}}, and their respective sub-classes. #' The examples given in this documentation page are mainly based on this implementation. #' #' @param object an object computed using some algorithm, or that describes an algorithm #' itself. #' @param value replacement value #' @param ... extra arguments to allow extension #' #' @name algorithmic-NMF #' @rdname algorithmic NULL #' @details #' \code{algorithm} and \code{algorithm<-} get/set an object that describes the #' algorithm used to compute another object, or with which it is associated. #' It may be a simple character string that gives the algorithm's names, or an object that #' includes the algorithm's definition itself (e.g. an \code{\link{NMFStrategy}} object). #' #' @export #' @rdname algorithmic setGeneric('algorithm', function(object, ...) standardGeneric('algorithm') ) #' @export #' @rdname algorithmic setGeneric('algorithm<-', function(object, ..., value) standardGeneric('algorithm<-') ) #' @details #' \code{seeding} get/set the seeding method used to initialise the computation of an object, #' i.e. usually the function that sets the starting point of an algorithm. #' #' @export #' @rdname algorithmic setGeneric('seeding', function(object, ...) standardGeneric('seeding') ) #' @export #' @rdname algorithmic setGeneric('seeding<-', function(object, ..., value) standardGeneric('seeding<-') ) #' @details #' \code{niter} and \code{niter<-} get/set the number of iterations performed #' to compute an object. #' The function \code{niter<-} would usually be called just before returning the result #' of an algorithm, when putting together data about the fit. #' #' @export #' @rdname algorithmic setGeneric('niter', function(object, ...) standardGeneric('niter')) #' @rdname algorithmic #' @export setGeneric('niter<-', function(object, ..., value) standardGeneric('niter<-')) #' @details #' \code{nrun} returns the number of times the algorithm has been run to compute #' an object. #' Usually this will be 1, but may be be more if the algorithm involves multiple #' starting points. #' #' @export #' @rdname algorithmic setGeneric('nrun', function(object, ...) standardGeneric('nrun') ) #' Default method that returns the value of attribute \sQuote{nrun}. #' #' Such an attribute my be attached to objects to keep track of data about #' the parent fit object (e.g. by method \code{\link{consensus}}), which #' can be used by subsequent function calls such as plot functions #' (e.g. see \code{\link{consensusmap}}). #' This method returns \code{NULL} if no suitable data was found. setMethod('nrun', 'ANY', function(object){ attr(object, 'nrun') } ) #' @details #' \code{objective} and \code{objective<-} get/set the objective function associated #' with an object. #' Some methods for \code{objective} may also compute the objective value with respect to #' some target/observed data. #' #' @export #' @rdname algorithmic setGeneric('objective', function(object, ...) standardGeneric('objective')) #' @export #' @rdname algorithmic setGeneric('objective<-', function(object, ..., value) standardGeneric('objective<-')) #' @details #' \code{runtime} returns the CPU time required to compute an object. #' This would generally be an object of class \code{\link[=proc.time]{proc_time}}. #' #' @export #' @rdname algorithmic setGeneric('runtime', function(object, ...) standardGeneric('runtime') ) #' @details #' \code{runtime.all} returns the CPU time required to compute a collection of #' objects, e.g. a sequence of independent fits. #' #' @export #' @rdname algorithmic setGeneric('runtime.all', function(object, ...) standardGeneric('runtime.all') ) #' @details #' \code{seqtime} returns the sequential CPU time -- that would be -- required #' to compute a collection of objects. #' It would differ from \code{runtime.all} if the computations were performed #' in parallel. #' #' @export #' @rdname algorithmic setGeneric('seqtime', function(object, ...) standardGeneric('seqtime') ) #' @details #' \code{modelname} returns a the type of model associated with an object. #' #' @rdname algorithmic #' @export setGeneric('modelname', function(object, ...) standardGeneric('modelname')) #' Default method which returns the class name(s) of \code{object}. #' This should work for objects representing models on their own. #' #' For NMF objects, this is the type of NMF model, that corresponds to the #' name of the S4 sub-class of \code{\linkS4class{NMF}}, inherited by \code{object}. #' #' @examples #' # get the type of an NMF model #' modelname(nmfModel(3)) #' modelname(nmfModel(3, model='NMFns')) #' modelname(nmfModel(3, model='NMFOffset')) #' setMethod('modelname', 'ANY', function(object) { as.character(class(object)) } ) #' @details #' \code{run} calls the workhorse function that actually implements a strategy/algorithm, #' and run it on some data object. #' #' @param y data object, e.g. a target matrix #' @param x a model object used as a starting point by the algorithm, #' e.g. a non-empty NMF model. #' #' @export #' @rdname algorithmic setGeneric('run', function(object, y, x, ...) standardGeneric('run')) #' @details #' \code{logs} returns the log messages output during the computation of an #' object. #' @export #' @rdname algorithmic setGeneric('logs', function(object, ...) standardGeneric('logs')) #' Default method that returns the value of attribute/slot \code{'logs'} or, if this latter #' does not exists, the value of element \code{'logs'} if \code{object} is a \code{list}. #' It returns \code{NULL} if no logging data was found. setMethod('logs', 'ANY', function(object) { res <- attr(object, 'logs') if( !is.null(res) ) res else if( is.list(object) ) object$logs } ) #' @details #' \code{compare} compares objects obtained from running separate algorithms. #' #' @export #' @rdname algorithmic setGeneric('compare', function(object, ...) standardGeneric('compare') ) NMF/R/vignetteFunctions.R0000644000176200001440000002757014334441220014744 0ustar liggesusers#### Code below is taken over from pkgmaker package #' LaTeX Utilities for Vignettes #' #' \code{latex_preamble} outputs/returns command definition LaTeX commands to #' be put in the preamble of vignettes. #' #' Argument \code{PACKAGE} is not required for \code{latex_preamble}, but must #' be correctly specified to ensure \code{biblatex=TRUE} generates the correct #' bibliography command. #' #' @param R logical that indicate if general R commands should be added #' (e.g. package names, inline R code format commands) #' @param CRAN logical that indicate if general CRAN commands should be added #' (e.g. CRAN package citations) #' @param Bioconductor logical that indicate if general Bioconductor commands #' should be added (e.g. Bioc package citations) #' @param GEO logical that indicate if general GEOmnibus commands should be added #' (e.g. urls to GEO datasets) #' @param ArrayExpress logical that indicate if general ArrayExpress commands #' should be added (e.g. urls to ArrayExpress datasets) #' @param biblatex logical that indicates if a \code{\\bibliography} command #' should be added to include references from the package's REFERENCES.bib file. #' #' @param only a logical that indicates if the only the commands whose #' dedicated argument is not missing should be considered. #' @param file connection where to print. If \code{NULL} the result is returned #' silently. #' #' @import stringr #' @export #' @rdname latex #' @examples #' #' latex_preamble() #' latex_preamble(R=TRUE, only=TRUE) #' latex_preamble(R=FALSE, CRAN=FALSE, GEO=FALSE) #' latex_preamble(GEO=TRUE, only=TRUE) #' latex_preamble <- function(PACKAGE, R=TRUE, CRAN=TRUE, Bioconductor=TRUE , GEO=TRUE, ArrayExpress=TRUE, biblatex=FALSE, only=FALSE, file=''){ cmd <- "%%%% PKGMAKER COMMANDS %%%%%% \\usepackage{xspace} " inc <- function(arg){ e <- parent.frame() (!only || eval(substitute(hasArg(arg), list(arg=substitute(arg))), e)) && arg } if( inc(R) ){ cmd <- c(cmd, "% R \\let\\proglang=\\textit \\let\\code=\\texttt \\providecommand{\\Rcode}{\\code} \\providecommand{\\pkgname}[1]{\\textit{#1}\\xspace} \\providecommand{\\Rpkg}[1]{\\pkgname{#1} package\\xspace} \\providecommand{\\citepkg}[1]{\\cite{#1}} ") } if( inc(CRAN) ){ cmd <- c(cmd, "% CRAN \\providecommand{\\CRANurl}[1]{\\url{https://cran.r-project.org/package=#1}} %% CRANpkg \\makeatletter \\def\\CRANpkg{\\@ifstar\\@CRANpkg\\@@CRANpkg} \\def\\@CRANpkg#1{\\href{https://cran.r-project.org/package=#1}{\\pkgname{#1}}\\footnote{\\CRANurl{#1}}} \\def\\@@CRANpkg#1{\\href{https://cran.r-project.org/package=#1}{\\pkgname{#1}} package\\footnote{\\CRANurl{#1}}} \\makeatother %% citeCRANpkg \\makeatletter \\def\\citeCRANpkg{\\@ifstar\\@citeCRANpkg\\@@citeCRANpkg} \\def\\@citeCRANpkg#1{\\CRANpkg{#1}\\cite*{Rpackage:#1}} \\def\\@@citeCRANpkg#1{\\CRANpkg{#1}~\\cite{Rpackage:#1}} \\makeatother \\providecommand{\\CRANnmf}{\\href{https://cran.r-project.org/package=NMF}{CRAN}} \\providecommand{\\CRANnmfURL}{\\url{https://cran.r-project.org/package=NMF}} ") } if( inc(Bioconductor) ){ cmd <- c(cmd, "% Bioconductor \\providecommand{\\BioCurl}[1]{\\url{http://www.bioconductor.org/packages/release/bioc/html/#1.html}} \\providecommand{\\BioCpkg}[1]{\\href{http://www.bioconductor.org/packages/release/bioc/html/#1.html}{\\pkgname{#1}} package\\footnote{\\BioCurl{#1}}} \\providecommand{\\citeBioCpkg}[1]{\\BioCpkg{#1}~\\cite{Rpackage:#1}} % Bioconductor annotation \\providecommand{\\BioCAnnurl}[1]{\\url{http://www.bioconductor.org/packages/release/data/annotation/html/#1.html}} \\providecommand{\\BioCAnnpkg}[1]{\\href{http://www.bioconductor.org/packages/release/data/annotation/html/#1.html}{\\Rcode{#1}} annotation package\\footnote{\\BioCAnnurl{#1}}} \\providecommand{\\citeBioCAnnpkg}[1]{\\BioCAnnpkg{#1}~\\cite{Rpackage:#1}} ") } if( inc(GEO) ){ cmd <- c(cmd, "% GEO \\providecommand{\\GEOurl}[1]{\\href{http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=#1}{#1}\\xspace} \\providecommand{\\GEOhref}[1]{\\GEOurl{#1}\\footnote{\\url{http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=#1}}} ") } if( inc(ArrayExpress) ) cmd <- c(cmd, "% ArrayExpress \\providecommand{\\ArrayExpressurl}[1]{\\href{http://www.ebi.ac.uk/arrayexpress/experiments/#1}{#1}\\xspace} \\providecommand{\\ArrayExpresshref}[1]{\\ArrayExpressurl{#1}\\footnote{\\url{http://www.ebi.ac.uk/arrayexpress/experiments/#1}}} ") if( biblatex ){ if( missing(PACKAGE) ) stop("Argument `PACKAGE` is required when specifying `biblatex=TRUE`.") cmd <- c(cmd, latex_bibliography(PACKAGE, file=NULL)) } # output or return commands cmd <- c(cmd, "%%%% END: PKGMAKER COMMANDS %%%%%%\n") cmd <- str_c(cmd, collapse="\n") if( !is.null(file) ) cat(cmd, file = file, sep='') else cmd } #' @describeIn latex \code{latex_bibliography} prints or return a LaTeX command that includes a #' package bibliography file if it exists. #' #' @param PACKAGE package name #' #' @export #' latex_bibliography <- function(PACKAGE, file=''){ rpkg.bib <- "%\\bibliography{Rpackages}\n" cmd <- rpkg.bib # get REFERENCES.bib file reffile <- packageReferenceFile(PACKAGE=PACKAGE) if( is.file(reffile) ){ cmd <- paste0(cmd, "\\bibliography{", gsub("\\.bib$", "", reffile), "}\n") } # add post-processing knit hook if( !requireNamespace('knitr', quietly = TRUE) ) stop("Package 'knitr' is required to run latex_bibliography.") knitr::knit_hooks$set(document = function(x){ # write bibfile if necessary if( length(pkgs <- parsePackageCitation(x)) ){ # write bibfile write.pkgbib(gsub("^Rpackage:", '', pkgs), file='Rpackages.bib', prefix='Rpackage:') # uncomment inclusion line x <- gsub("%\\bibliography{Rpackages}", "\\bibliography{Rpackages}", x, fixed = TRUE) } x }) if( !is.null(file) ) cat(cmd, file=file) else cmd } parsePackageCitation <- function(x){ if( length(x) > 1L ) x <- paste(x, collapse = "\n") .parse <- function(x, pattern, idx){ dr <- str_match_all(x, pattern) dr <- dr[sapply(dr, length)>0L] unlist(lapply(dr, '[', , idx)) } # extract package citations: \citeCRANpkg - like x <- gsub(".*[^%]* *\\\\begin\\{document\\}(.*)", "\\1", x) cite <- .parse(x, "\\\\cite((CRAN)|(BioC)|(BioCAnn))?pkg[*]?\\{([^}]*)\\}", 6L) # \cite{Rpackage:pkgname, ...} - like cite2 <- .parse(x, "\\\\(no)?cite[^{ ]*\\{([^}]*)\\}", 3L) if( length(cite2) ){ cite2 <- .parse(cite2, 'Rpackage:([^,} ]+)', 2L) cite <- c(cite, cite2) } # remove Rpackage prefix if( length(cite) ){ cite <- str_trim(unlist(strsplit(cite, ","))) cite <- gsub('^Rpackage:', '', cite) } inc <- character() if( length(cite) > 0L ){ inc <- unique(str_trim(unlist(strsplit(cite, ",")))) } inc } packageReferenceFile <- function(PACKAGE = NULL, check = FALSE){ f <- packagePath('REFERENCES.bib', package = PACKAGE, check = FALSE) if( check && length(f) && nzchar(f) && !file.exists(f) ) return('') f } write.pkgbib <- function(entry=NULL, file="Rpackages.bib", prefix='', append = FALSE, verbose = TRUE) { # special handling of file=NULL: use stdout() if( is.null(file) ){ file <- stdout() verbose <- FALSE } ## use all installed packages if nothing is specified if( is.null(entry) ){ if( verbose ) message("Generating Bibtex entries for all installed packages ", appendLF=FALSE) entry <- unique(installed.packages()[,1]) if( verbose ) message("[", length(entry), "]") } bibs <- if( is(entry, 'bibentry') ) entry else if( is.character(entry) ){ if( length(entry) == 0 ){ if( verbose ) message("Empty package list: nothing to be done.") return(invisible()) } pkgs <- entry bibs <- sapply(pkgs, function(x) try(citation(x)), simplify=FALSE) #bibs <- lapply(pkgs, function(x) try(toBibtex(citation(x)))) n.installed <- length(bibs) ## omit failed citation calls ok <- sapply(bibs, is, 'bibentry') pkgs <- pkgs[ok] bibs <- bibs[ok] n.converted <- sum(ok) ## add bibtex keys to each entry pkgs <- lapply(seq_along(pkgs), function(i){ if(length(bibs[[i]]) > 1) paste(prefix, pkgs[i], c('', 2:length(bibs[[i]])), sep = "") else paste(prefix, pkgs[i], sep='') }) pkgs <- do.call("c", pkgs) bibs <- do.call("c", bibs) # formatting function for bibtex keys: # names with special characters must be enclosed in {}, others not. as.bibkey <- function(x){ i <- grep("[.]", x) if( length(i) > 0 ) x[i] <- paste("{", x[i], "}", sep='') x } #bibs <- mapply(function(b,k){ if( is.null(b$key) ) b$key <- as.bibkey(k); b}, bibs, pkgs, SIMPLIFY=FALSE) bibs <- mapply(function(b,k){ if( is.null(b$key) ) b$key <- k; b}, bibs, pkgs, SIMPLIFY=FALSE) bibs <- do.call("c", bibs) if(verbose) message("Converted ", n.converted, " of ", n.installed, " package citations to BibTeX") bibs } else stop("Invalid argument `entry`: expected a bibentry object or a character vector of package names.") if( length(bibs) == 0 ){ if( verbose ) message("Empty bibentry list: nothing to be done.") return(invisible()) } ## write everything to the .bib file not_anonymous <- !identical(file,'') fh <- if( is.character(file) ){ if( not_anonymous && !grepl("\\.bib$", file) ) # add .bib extension if necessary file <- paste(file, '.bib', sep='') fh <- file(file, open = if(append && not_anonymous) "a+" else "w+" ) if( not_anonymous ) on.exit( if( isOpen(fh) ) close(fh) ) fh } else if( is(file, 'connection') ) file else stop("Invalid argument `file`: expected a filename, NULL, or a connection [", class(file), "]") if( !is(fh, 'connection') ) stop("Invalid connection: ", fh) file.desc <- summary(fh)['description'] if( verbose ) message(if( append ) "Adding " else "Writing ", length(bibs) , " Bibtex entries ... ", appendLF=FALSE) bibs_str <- toBibtex(bibs) # bibs_str <- bibs_str[!grepl("citekey", bibs_str)] writeLines(bibs_str, fh) if(verbose) message("OK\nResults written to file '", file.desc, "'") ## return Bibtex items invisibly if( !not_anonymous ) attr(bibs, 'connection') <- fh invisible(bibs) } hook_try <- function(before, options, envir){ .try_defined <- FALSE # remove hacked version of try if( !before ){ if( .try_defined && exists('try', envir = envir, inherits = FALSE) ){ remove(list = 'try', envir = envir) } .try_defined <<- FALSE return(invisible()) } if( !is.null(options$try) ){ # signal do.signal <- isFALSE(options$try) if( isManualVignette() && isTRUE(options$try) ){ do.signal <- TRUE } # define hacked version of try() .try <- try_message(do.signal) assign('try', .try, envir) .try_defined <<- TRUE } } isManualVignette <- function(){ isTRUE(getOption('R_RUNNING_MANUAL_VIGNETTE')) } chunkOutputHook <- function(name, hook, type = c('output', 'source', 'chunk')){ type <- match.arg(type) function(){ if( !requireNamespace('knitr', quietly = TRUE) ) stop("Package 'knitr' is required to setup knit hook '", name, "'") .hook_bkp <- NULL function(before, options, envir){ # do nothing if the option is not ON if( is.null(options[[name]]) ) return() # set/unset hook if( before ){ # store current hook function if( is.null(.hook_bkp) ) .hook_bkp <<- knitr::knit_hooks$get(type) # define hook wrapper hook_wrapper <- function(x, options){ res <- .hook_bkp(x, options) hook(res, options) } args <- list() args[[type]] <- hook_wrapper do.call(knitr::knit_hooks$set, args) }else{ args <- list() args[[type]] <- .hook_bkp do.call(knitr::knit_hooks$set, args) .hook_bkp <<- NULL } } } } hook_backspace <- chunkOutputHook('backspace', function(x, options){ if( !isTRUE(options$backspace) ) x str_bs(x) } )NMF/R/utils.R0000644000176200001440000007463514335210643012376 0ustar liggesusers#' @include rmatrix.R #' @include nmf-package.R NULL #' Utility Function in the NMF Package #' #' @name utils-NMF #' @rdname utils NULL #' Internal verbosity option #' @param val logical that sets the verbosity level. #' @return the old verbose level #' @keywords internal lverbose <- local({ .val <- 0 function(val){ if( missing(val) ) return(.val) oval <- .val .val <<- val invisible(oval) } }) vmessage <- function(..., appendLF=TRUE) if( lverbose() ) cat(..., if(appendLF) "\n", sep='') nmf_stop <- function(name, ...){ stop("NMF::", name , ' - ', ..., call.=FALSE) } nmf_warning <- function(name, ...){ warning("NMF::", name , ' - ', ..., call.=FALSE) } # or-NULL operator '%||%' <- function(x, y) if( !is.null(x) ) x else y # cat object or class for nice cat/message quick_str <- function(x) if( is.atomic(x) ) x else class(x)[1] # remove all attributes from an object rmAttributes <- function(x){ attributes(x) <- NULL x } #' \code{str_args} formats the arguments of a function using \code{\link{args}}, #' but returns the output as a string. #' #' @param x a function #' @param exdent indentation for extra lines if the output takes more than one line. #' #' @export #' @rdname utils #' #' @examples #' #' args(library) #' str_args(library) #' str_args <- function(x, exdent=10L){ s <- capture.output(print(args(x))) paste(str_trim(s[-length(s)]), collapse=str_c('\n', paste(rep(' ', exdent), collapse=''))) } #' Simple Progress Bar #' #' Creates a simple progress bar with title. #' This function is identical to \code{utils::txtProgressBar} but allow adding #' a title to the progress bar, and can be shared by multiple processes, #' e.g., in multicore or multi-hosts computations. #' #' @inheritParams utils::txtProgressBar #' @param shared specification of a shared directory to use when the progress #' bar is to be used by multiple processes. #' #' @author R Core Team #' @keywords internal txtProgressBar <- function (min = 0, max = 1, initial = 0, char = "=", width = NA, title= if( style == 3 ) ' ', label, style = 1, file = "" , shared = NULL) { if (!identical(file, "") && !(inherits(file, "connection") && isOpen(file))) stop("'file' must be \"\" or an open connection object") if (!style %in% 1L:3L) style <- 1 .val <- initial .killed <- FALSE .nb <- 0L .pc <- -1L nw <- nchar(char, "w") if (is.na(width)) { width <- getOption("width") if (style == 3L) width <- width - 10L width <- trunc(width/nw) } if (max <= min) stop("must have max > min") # setup shared directory .shared <- NULL if( isTRUE(shared) ) shared <- tempdir() if( is.character(shared) ){ .shared <- tempfile('progressbar_', tmpdir=shared[1L]) dir.create(.shared) } # getval <- function(value){ if( value >= max || value <= min || is.null(.shared) || !file.exists(.shared) ){ value }else{ cat('', file=file.path(.shared, paste('_', value, sep=''))) length(list.files(.shared)) } } up1 <- function(value) { if (!is.finite(value) || value < min || value > max) return() # get actual value value <- getval(value) .val <<- value nb <- round(width * (value - min)/(max - min)) if (.nb < nb) { cat(paste(rep.int(char, nb - .nb), collapse = ""), file = file) flush.console() } else if (.nb > nb) { cat("\r", title, paste(rep.int(" ", .nb * nw), collapse = ""), "\r", title, paste(rep.int(char, nb), collapse = ""), sep = "", file = file) flush.console() } .nb <<- nb } up2 <- function(value) { if (!is.finite(value) || value < min || value > max) return() # get actual value value <- getval(value) .val <<- value nb <- round(width * (value - min)/(max - min)) if (.nb <= nb) { cat("\r", title, paste(rep.int(char, nb), collapse = ""), sep = "", file = file) flush.console() } else { cat("\r", title, paste(rep.int(" ", .nb * nw), collapse = ""), "\r", paste(rep.int(char, nb), collapse = ""), sep = "", file = file) flush.console() } .nb <<- nb } up3 <- function(value) { if (!is.finite(value) || value < min || value > max) return() # get actual value value <- getval(value) .val <<- value nb <- round(width * (value - min)/(max - min)) pc <- round(100 * (value - min)/(max - min)) if (nb == .nb && pc == .pc) return() cat(paste(c("\r",title," |", rep.int(" ", nw * width + 6)), collapse = ""), file = file) cat(paste(c("\r",title," |", rep.int(char, nb), rep.int(" ", nw * (width - nb)), sprintf("| %3d%%", pc)), collapse = ""), file = file) flush.console() .nb <<- nb .pc <<- pc } getVal <- function() .val kill <- function(cleanup=TRUE) if (!.killed) { cat("\n", file = file) flush.console() .killed <<- TRUE # do some cleanup if( cleanup ){ # delete shared directory if( !is.null(.shared) && file.exists(.shared) ) unlink(.shared, recursive=TRUE) # } invisible(TRUE) } up <- switch(style, up1, up2, up3) up(initial) structure(list(getVal = getVal, up = up, kill = kill), class = "txtProgressBar") } ###% apply a function to each entry in a matrix matapply <- function(x, FUN, ...){ res <- sapply(x, FUN, ...) matrix(res, nrow(x)) } ###% try to convert a character string into a numeric toNumeric <- function(x){ suppressWarnings( as.numeric(x) ) } ###% Tells one is running in Sweave isSweave <- function() !is.null(sweaveLabel()) sweaveLabel <- function(){ if ((n.parents <- length(sys.parents())) >= 3) { for (i in seq_len(n.parents) - 1) { if ("chunkopts" %in% ls(envir = sys.frame(i))) { chunkopts = get("chunkopts", envir = sys.frame(i)) if (all(c("prefix.string", "label") %in% names(chunkopts))) { img.name = paste(chunkopts$prefix.string, chunkopts$label, sep = "-") return(img.name) break } } } } } sweaveFile <- function(){ label <- sweaveLabel() if( !is.null(label) ) paste(label, '.pdf', sep='') } fixSweaveFigure <- function(filename){ if( missing(filename) ){ filename <- sweaveLabel() if( is.null(filename) ) return() filename <- paste(filename, '.pdf', sep='') } filepath <- normalizePath(filename) tf <- tempfile() system(paste("pdftk", filepath, "cat 2-end output", tf, "; mv -f", tf, filepath)) } ###% 'more' functionality to read data progressively more <- function(x, step.size=10, width=20, header=FALSE, pattern=NULL){ if( !(is.matrix(x) || is.data.frame(x) || is.vector(x) || is.list(x)) ) stop("NMF::more - invalid argument 'x': only 'matrix', 'data.frame', 'vector' and 'list' objects are handled.") one.dim <- is.null(dim(x)) single.char <- FALSE n <- if( is.character(x) && length(x) == 1 ){ cat("\n") single.char <- TRUE nchar(x) } else if( one.dim ){ cat("<", class(x),":", length(x), ">\n") # limit to matching terms if necessary if( !is.null(pattern) ) x[grep(pattern, x)] length(x) }else{ cat("<", class(x),":", nrow(x), "x", ncol(x), ">\n") head.init <- colnames(x) head.on <- TRUE # limit to matching terms if necessary if( !is.null(pattern) ){ idx <- apply(x, 2, grep, pattern=pattern) print(idx) idx <- unique(if( is.list(idx) ) unlist(idx) else as.vector(idx)) x <- x[idx,, drop=FALSE] } nrow(x) } i <- 0 while( i < n ){ # reduce 'step.size' if necessary step.size <- min(step.size, n-i) what2show <- if( single.char ) substr(x, i+1, i+step.size) else if( one.dim ) if( !is.na(width) ) sapply(x[seq(i+1, i+step.size)], function(s) substr(s, 1, width) ) else x[seq(i+1, i+step.size)] else{ w <- x[seq(i+1, i+step.size), , drop=FALSE] if( !is.na(width) ){ w <- apply(w, 2, function(s){ ns <- toNumeric(s) if( !is.na(ns[1]) ) # keep numerical value as is ns else # limit output if required substr(s, 1, width) }) rownames(w) <- rownames(x)[seq(i+1, i+step.size)] } # remove header if not required if( !header && head.on ){ colnames(x) <- sapply(colnames(x), function(c) paste(rep(' ', nchar(c)), collapse='')) head.on <- FALSE } # return the content w } cat( show(what2show) ) i <- i + step.size # early break if necessary if( i >= n ) break # ask user what to to next ans <- scan(what='character', quiet=TRUE, n=1, multi.line=FALSE) # process user command if any (otherwise carry on) if( length(ans) > 0 ){ if( !is.na(s <- toNumeric(ans)) ) # change step size step.size <- s else if( !header && ans %in% c('h', 'head') ){ colnames(x) <- head.init head.on <- TRUE } else if( ans %in% c('q', 'quit') ) # quit break } } invisible() } #' Randomizing Data #' #' \code{randomize} permutates independently the entries in each column #' of a matrix-like object, to produce random data that can be used #' in permutation tests or bootstrap analysis. #' #' In the context of NMF, it may be used to generate random data, whose #' factorization serves as a reference for selecting a factorization rank, #' that does not overfit the data. #' #' @param x data to be permutated. It must be an object suitable to be #' passed to the function \code{\link{apply}}. #' @param ... extra arguments passed to the function \code{\link{sample}}. #' #' @return a matrix #' #' @export #' @examples #' x <- matrix(1:32, 4, 8) #' randomize(x) #' randomize(x) #' randomize <- function(x, ...){ if( is(x, 'ExpressionSet') ) x <- Biobase::exprs(x) # resample the columns apply(x, 2, function(c, ...) sample(c, size=length(c), ...), ...) } ###% Returns the rank-k truncated SVD approximation of x tsvd <- function(x, r, ...){ stopifnot( r > 0 && r <= min(dim(x))) s <- svd(x, nu=r, nv=r, ...) s$d <- s$d[1:r] # return results s } ###% Subset a list leaving only the arguments from a given function .extract.args <- function(x, fun, ...){ fdef <- if( is.character(fun) ) getFunction(fun, ...) else if( is.function(fun) ) fun else stop("invalid argument 'fun': expected function name or definition") if( length(x) == 0 ) return(x) x.ind <- charmatch(if( is.list(x) ) names(x) else x, args <- formalArgs(fdef)) x[!is.na(x.ind)] } ###% Returns the version of the package nmfInfo <- function(command){ pkg <- 'NMF' curWarn <- getOption("warn") on.exit(options(warn = curWarn), add = TRUE) options(warn = -1) desc <- packageDescription(pkg, fields="Version") if (is.na(desc)) stop(paste("Package", pkg, "not found")) desc } ###% Returns TRUE if running under Mac OS X + GUI is.Mac <- function(check.gui=FALSE){ is.mac <- (length(grep("darwin", R.version$platform)) > 0) # return TRUE is running on Mac (adn optionally through GUI) is.mac && (!check.gui || .Platform$GUI == 'AQUA') } ###% Hash a function body (using digest) #' @import digest hash_function <- function(f){ b <- body(f) attributes(b) <- NULL fdef <- paste(c(capture.output(args(f))[1], capture.output(print(b))), collapse="\n") # print(fdef) digest(b) } ###% compare function with copy and with no copy cmp.cp <- function(...){ res <- nmf(..., copy=F) resc <- nmf(..., copy=T) cat("identical: ", identical(fit(res), fit(resc)) , " - all.equal: ", all.equal(fit(res), fit(resc)) , " - diff: ", all.equal(fit(res), fit(resc), tol=0) , "\n" ) invisible(res) } # return the internal pointer address C.ptr <- function(x, rec=FALSE) { attribs <- attributes(x) if( !rec || is.null(attribs) ) .Call("ptr_address", x, PACKAGE='NMF') else c( C.ptr(x), sapply(attribs, C.ptr, rec=TRUE)) } is.same <- function(x, y){ C.ptr(x) == C.ptr(y) } is.eset <- function(x) is(x, 'ExpressionSet') # clone an object clone <- function(x){ .Call('clone_object', x, PACKAGE='NMF') } # deep-clone an object clone2 <- function(x){ if( is.environment(x) ){ y <- Biobase::copyEnv(x) eapply(ls(x, all.names=TRUE), function(n){ if( is.environment(x[[n]]) ){ y[[n]] <<- clone(x[[n]]) if( identical(parent.env(x[[n]]), x) ) parent.env(y[[n]]) <<- y } }) }else{ y <- .Call('clone_object', x, PACKAGE='NMF') if( isS4(x) ){ ## deep copy R object lapply(slotNames(class(y)), function(n){ slot(y, n) <<- clone(slot(x, n)) }) }else if( is.list(x) ){ ## copy list or vector sapply(seq_along(x), function(i){ y[[i]] <<- clone(x[[i]]) }) } } y } #compute RSS with C function .rss <- function(x, y) { .Call("Euclidean_rss", x, y, PACKAGE='NMF') } #compute KL divergence with C function .KL <- function(x, y) { .Call("KL_divergence", x, y, PACKAGE='NMF') } #' Updating Objects In Place #' #' These functions modify objects (mainly matrix objects) in place, i.e. they #' act directly on the C pointer. #' Due to their side-effect, they are not meant to be called by the end-user. #' #' \code{pmax.inplace} is a version of \code{\link{pmax}} that updates its first #' argument. #' #' @param x an object to update in place. #' @param lim lower threshold value #' @param skip indexes to skip #' #' @export #' @rdname inplace #' @keywords internal pmax.inplace <- function(x, lim, skip=NULL){ .Call('ptr_pmax', x, lim, as.integer(skip), PACKAGE='NMF') } # colMin colMin <- function(x){ .Call('colMin', x, PACKAGE='NMF') } # colMax colMax <- function(x){ .Call('colMax', x, PACKAGE='NMF') } #' \code{neq.constraints.inplace} apply unequality constraints in place. #' #' @param constraints constraint specification. #' @param ratio fixed ratio on which the constraint applies. #' @param value fixed value to enforce. #' @param copy a logical that indicates if \code{x} should be updated in place #' or not. #' #' @export #' @rdname inplace neq.constraints.inplace <- function(x, constraints, ratio=NULL, value=NULL, copy=FALSE){ # if requested: clone data as neq.constrains.inplace modify the input data in place if( copy ) x <- clone(x) .Call('ptr_neq_constraints', x, constraints, ratio, value, PACKAGE='NMF') } # Test if an external pointer is nil # Taken from package bigmemory ptr_isnil <- function (address) { if (!inherits(address, "externalptr")) stop("address is not an externalptr.") .Call("ptr_isnil", address, PACKAGE='NMF') } ###% Draw the palette of colors ###% ###% Taken from the examples of colorspace::rainbow_hcl ###% pal <- function(col, h=1, border = "light gray") { n <- length(col) plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, h), axes = FALSE, xlab = "", ylab = "") rect(0:(n-1)/n, 0, 1:n/n, h, col = col, border = border) } ###% Draw the Palette of Colors as a Wheel ###% ###% Taken from the examples of colorspace::rainbow_hcl ###% wheel <- function(col, radius = 1, ...) pie(rep(1, length(col)), col = col, radius = radius, ...) # Define a S4 class to handle function slots given as either a function definition # or a character string that gives the function's name. setClassUnion('.functionSlot', c('character', 'function')) # Define a S4 class to handle function slots given as either a function definition # or a character string that gives the function's name or NULL. setClassUnion('.functionSlotNULL', c('character', 'function', 'NULL')) .validFunctionSlot <- function(slot, allow.empty=FALSE, allow.null=TRUE){ if( is.null(slot) ){ if( !allow.null ) return('NULL value is not allowed') return(TRUE) } if( is.character(slot) ){ if( !allow.empty && slot == '' ) return('character string cannot be empty') if( length(slot) != 1 ) return(paste('character string must be a single value [length =', length(slot), ']', sep='')) } return(TRUE) } ####% Utility function needed in heatmap.plus.2 #invalid <- function (x) #{ # if (missing(x) || is.null(x) || length(x) == 0) # return(TRUE) # if (is.list(x)) # return(all(sapply(x, invalid))) # else if (is.vector(x)) # return(all(is.na(x))) # else return(FALSE) #} # ####% Modification of the function heatmap.2 including a small part of function ####% heatmap.plus to allow extra annotation rows #heatmap.plus.2 <- # function (x, Rowv = TRUE, Colv = if (symm) "Rowv" else TRUE, # distfun = dist, hclustfun = hclust, dendrogram = c("both", # "row", "column", "none"), symm = FALSE, scale = c("none", # "row", "column"), na.rm = TRUE, revC = identical(Colv, # "Rowv"), add.expr, breaks, symbreaks = min(x < 0, na.rm = TRUE) || # scale != "none", col = "heat.colors", colsep, rowsep, # sepcolor = "white", sepwidth = c(0.05, 0.05), cellnote, notecex = 1, # notecol = "cyan", na.color = par("bg"), trace = c("column", # "row", "both", "none"), tracecol = "cyan", hline = median(breaks), # vline = median(breaks), linecol = tracecol, margins = c(5, # 5), ColSideColors, RowSideColors, cexRow = 0.2 + 1/log10(nr), # cexCol = 0.2 + 1/log10(nc), labRow = NULL, labCol = NULL, # key = TRUE, keysize = 1.5, density.info = c("histogram", # "density", "none"), denscol = tracecol, symkey = min(x < # 0, na.rm = TRUE) || symbreaks, densadj = 0.25, main = NULL, # xlab = NULL, ylab = NULL, lmat = NULL, lhei = NULL, lwid = NULL, # ...) #{ # scale01 <- function(x, low = min(x), high = max(x)) { # x <- (x - low)/(high - low) # x # } # retval <- list() # scale <- if (symm && missing(scale)) # "none" # else match.arg(scale) # dendrogram <- match.arg(dendrogram) # trace <- match.arg(trace) # density.info <- match.arg(density.info) # if (length(col) == 1 && is.character(col)) # col <- get(col, mode = "function") # if (!missing(breaks) && (scale != "none")) # warning("Using scale=\"row\" or scale=\"column\" when breaks are", # "specified can produce unpredictable results.", "Please consider using only one or the other.") # if (is.null(Rowv) || is.na(Rowv)) # Rowv <- FALSE # if (is.null(Colv) || is.na(Colv)) # Colv <- FALSE # else if (Colv == "Rowv" && !isTRUE(Rowv)) # Colv <- FALSE # if (length(di <- dim(x)) != 2 || !is.numeric(x)) # stop("`x' must be a numeric matrix") # nr <- di[1] # nc <- di[2] # if (nr <= 1 || nc <= 1) # stop("`x' must have at least 2 rows and 2 columns") # if (!is.numeric(margins) || length(margins) != 2) # stop("`margins' must be a numeric vector of length 2") # if (missing(cellnote)) # cellnote <- matrix("", ncol = ncol(x), nrow = nrow(x)) # if (!inherits(Rowv, "dendrogram")) { # if (((!isTRUE(Rowv)) || (is.null(Rowv))) && (dendrogram %in% # c("both", "row"))) { # if (is.logical(Colv) && (Colv)) # dendrogram <- "column" # else dedrogram <- "none" # warning("Discrepancy: Rowv is FALSE, while dendrogram is `", # dendrogram, "'. Omitting row dendogram.") # } # } # if (!inherits(Colv, "dendrogram")) { # if (((!isTRUE(Colv)) || (is.null(Colv))) && (dendrogram %in% # c("both", "column"))) { # if (is.logical(Rowv) && (Rowv)) # dendrogram <- "row" # else dendrogram <- "none" # warning("Discrepancy: Colv is FALSE, while dendrogram is `", # dendrogram, "'. Omitting column dendogram.") # } # } # if (inherits(Rowv, "dendrogram")) { # ddr <- Rowv # rowInd <- order.dendrogram(ddr) # } # else if (is.integer(Rowv)) { # hcr <- hclustfun(distfun(x)) # ddr <- as.dendrogram(hcr) # ddr <- reorder(ddr, Rowv) # rowInd <- order.dendrogram(ddr) # if (nr != length(rowInd)) # stop("row dendrogram ordering gave index of wrong length") # } # else if (isTRUE(Rowv)) { # Rowv <- rowMeans(x, na.rm = na.rm) # hcr <- hclustfun(distfun(x)) # ddr <- as.dendrogram(hcr) # ddr <- reorder(ddr, Rowv) # rowInd <- order.dendrogram(ddr) # if (nr != length(rowInd)) # stop("row dendrogram ordering gave index of wrong length") # } # else { # rowInd <- nr:1 # } # if (inherits(Colv, "dendrogram")) { # ddc <- Colv # colInd <- order.dendrogram(ddc) # } # else if (identical(Colv, "Rowv")) { # if (nr != nc) # stop("Colv = \"Rowv\" but nrow(x) != ncol(x)") # if (exists("ddr")) { # ddc <- ddr # colInd <- order.dendrogram(ddc) # } # else colInd <- rowInd # } # else if (is.integer(Colv)) { # hcc <- hclustfun(distfun(if (symm) # x # else t(x))) # ddc <- as.dendrogram(hcc) # ddc <- reorder(ddc, Colv) # colInd <- order.dendrogram(ddc) # if (nc != length(colInd)) # stop("column dendrogram ordering gave index of wrong length") # } # else if (isTRUE(Colv)) { # Colv <- colMeans(x, na.rm = na.rm) # hcc <- hclustfun(distfun(if (symm) # x # else t(x))) # ddc <- as.dendrogram(hcc) # ddc <- reorder(ddc, Colv) # colInd <- order.dendrogram(ddc) # if (nc != length(colInd)) # stop("column dendrogram ordering gave index of wrong length") # } # else { # colInd <- 1:nc # } # retval$rowInd <- rowInd # retval$colInd <- colInd # retval$call <- match.call() # x <- x[rowInd, colInd] # x.unscaled <- x # cellnote <- cellnote[rowInd, colInd] # if (is.null(labRow)) # labRow <- if (is.null(rownames(x))) # (1:nr)[rowInd] # else rownames(x) # else labRow <- labRow[rowInd] # if (is.null(labCol)) # labCol <- if (is.null(colnames(x))) # (1:nc)[colInd] # else colnames(x) # else labCol <- labCol[colInd] # if (scale == "row") { # retval$rowMeans <- rm <- rowMeans(x, na.rm = na.rm) # x <- sweep(x, 1, rm) # retval$rowSDs <- sx <- apply(x, 1, sd, na.rm = na.rm) # x <- sweep(x, 1, sx, "/") # } # else if (scale == "column") { # retval$colMeans <- rm <- colMeans(x, na.rm = na.rm) # x <- sweep(x, 2, rm) # retval$colSDs <- sx <- apply(x, 2, sd, na.rm = na.rm) # x <- sweep(x, 2, sx, "/") # } # if (missing(breaks) || is.null(breaks) || length(breaks) < # 1) { # if (missing(col) || is.function(col)) # breaks <- 16 # else breaks <- length(col) + 1 # } # if (length(breaks) == 1) { # if (!symbreaks) # breaks <- seq(min(x, na.rm = na.rm), max(x, na.rm = na.rm), # length = breaks) # else { # extreme <- max(abs(x), na.rm = TRUE) # breaks <- seq(-extreme, extreme, length = breaks) # } # } # nbr <- length(breaks) # ncol <- length(breaks) - 1 # if (class(col) == "function") # col <- col(ncol) # min.breaks <- min(breaks) # max.breaks <- max(breaks) # x[x < min.breaks] <- min.breaks # x[x > max.breaks] <- max.breaks # if (missing(lhei) || is.null(lhei)) # lhei <- c(keysize, 4) # if (missing(lwid) || is.null(lwid)) # lwid <- c(keysize, 4) # if (missing(lmat) || is.null(lmat)) { # lmat <- rbind(4:3, 2:1) # # # hack for adding extra annotations # if (!missing(ColSideColors)) { # if (!is.matrix(ColSideColors)) # stop("'ColSideColors' must be a matrix") # # if (!is.character(ColSideColors) || dim(ColSideColors)[1] != # nc) # stop("'ColSideColors' must be a character vector/matrix with length/ncol = ncol(x)") # lmat <- rbind(lmat[1, ] + 1, c(NA, 1), lmat[2, ] + 1) # lhei <- c(lhei[1], 0.2, lhei[2]) # } # if (!missing(RowSideColors)) { # if (!is.character(RowSideColors) || length(RowSideColors) != # nr) # stop("'RowSideColors' must be a character vector of length nrow(x)") # lmat <- cbind(lmat[, 1] + 1, c(rep(NA, nrow(lmat) - # 1), 1), lmat[, 2] + 1) # lwid <- c(lwid[1], 0.2, lwid[2]) # } # lmat[is.na(lmat)] <- 0 # } # if (length(lhei) != nrow(lmat)) # stop("lhei must have length = nrow(lmat) = ", nrow(lmat)) # if (length(lwid) != ncol(lmat)) # stop("lwid must have length = ncol(lmat) =", ncol(lmat)) # op <- par(no.readonly = TRUE) # on.exit(par(op)) # layout(lmat, widths = lwid, heights = lhei, respect = FALSE) # if (!missing(RowSideColors)) { # par(mar = c(margins[1], 0, 0, 0.5)) # image(rbind(1:nr), col = RowSideColors[rowInd], axes = FALSE) # } # if (!missing(ColSideColors)) { # par(mar = c(0.5, 0, 0, margins[2])) # csc = ColSideColors[colInd, ] # csc.colors = matrix() # csc.names = names(table(csc)) # csc.i = 1 # for (csc.name in csc.names) { # csc.colors[csc.i] = csc.name # csc[csc == csc.name] = csc.i # csc.i = csc.i + 1 # } # csc = matrix(as.numeric(csc), nrow = dim(csc)[1]) # image(csc, col = as.vector(csc.colors), axes = FALSE) # if (length(colnames(ColSideColors)) > 0) { # axis(2, 0:(dim(csc)[2] - 1)/(dim(csc)[2] - 1), colnames(ColSideColors), # las = 2, tick = FALSE, cex.axis= cexRow) # } # } # par(mar = c(margins[1], 0, 0, margins[2])) # if (!symm || scale != "none") { # x <- t(x) # cellnote <- t(cellnote) # } # if (revC) { # iy <- nr:1 # if (exists("ddr")) # ddr <- rev(ddr) # x <- x[, iy] # cellnote <- cellnote[, iy] # } # else iy <- 1:nr # image(1:nc, 1:nr, x, xlim = 0.5 + c(0, nc), ylim = 0.5 + # c(0, nr), axes = FALSE, xlab = "", ylab = "", col = col, # breaks = breaks, ...) # retval$carpet <- x # if (exists("ddr")) # retval$rowDendrogram <- ddr # if (exists("ddc")) # retval$colDendrogram <- ddc # retval$breaks <- breaks # retval$col <- col # if (!invalid(na.color) & any(is.na(x))) { # mmat <- ifelse(is.na(x), 1, NA) # image(1:nc, 1:nr, mmat, axes = FALSE, xlab = "", ylab = "", # col = na.color, add = TRUE) # } # axis(1, 1:nc, labels = labCol, las = 2, line = -0.5, tick = 0, # cex.axis = cexCol) # if (!is.null(xlab)) # mtext(xlab, side = 1, line = margins[1] - 1.25) # axis(4, iy, labels = labRow, las = 2, line = -0.5, tick = 0, # cex.axis = cexRow) # if (!is.null(ylab)) # mtext(ylab, side = 4, line = margins[2] - 1.25) # if (!missing(add.expr)) # eval(substitute(add.expr)) # if (!missing(colsep)) # for (csep in colsep) rect(xleft = csep + 0.5, ybottom = rep(0, # length(csep)), xright = csep + 0.5 + sepwidth[1], # ytop = rep(ncol(x) + 1, csep), lty = 1, lwd = 1, # col = sepcolor, border = sepcolor) # if (!missing(rowsep)) # for (rsep in rowsep) rect(xleft = 0, ybottom = (ncol(x) + # 1 - rsep) - 0.5, xright = nrow(x) + 1, ytop = (ncol(x) + # 1 - rsep) - 0.5 - sepwidth[2], lty = 1, lwd = 1, # col = sepcolor, border = sepcolor) # min.scale <- min(breaks) # max.scale <- max(breaks) # x.scaled <- scale01(t(x), min.scale, max.scale) # if (trace %in% c("both", "column")) { # retval$vline <- vline # vline.vals <- scale01(vline, min.scale, max.scale) # for (i in colInd) { # if (!is.null(vline)) { # abline(v = i - 0.5 + vline.vals, col = linecol, # lty = 2) # } # xv <- rep(i, nrow(x.scaled)) + x.scaled[, i] - 0.5 # xv <- c(xv[1], xv) # yv <- 1:length(xv) - 0.5 # lines(x = xv, y = yv, lwd = 1, col = tracecol, type = "s") # } # } # if (trace %in% c("both", "row")) { # retval$hline <- hline # hline.vals <- scale01(hline, min.scale, max.scale) # for (i in rowInd) { # if (!is.null(hline)) { # abline(h = i + hline, col = linecol, lty = 2) # } # yv <- rep(i, ncol(x.scaled)) + x.scaled[i, ] - 0.5 # yv <- rev(c(yv[1], yv)) # xv <- length(yv):1 - 0.5 # lines(x = xv, y = yv, lwd = 1, col = tracecol, type = "s") # } # } # if (!missing(cellnote)) # text(x = c(row(cellnote)), y = c(col(cellnote)), labels = c(cellnote), # col = notecol, cex = notecex) # par(mar = c(margins[1], 0, 0, 0)) # if (dendrogram %in% c("both", "row")) { # plot(ddr, horiz = TRUE, axes = FALSE, yaxs = "i", leaflab = "none") # } # else plot.new() # par(mar = c(0, 0, if (!is.null(main)) 5 else 0, margins[2])) # if (dendrogram %in% c("both", "column")) { # plot(ddc, axes = FALSE, xaxs = "i", leaflab = "none") # } # else plot.new() # if (!is.null(main)) # title(main, cex.main = 1.5 * op[["cex.main"]]) # if (key) { # par(mar = c(5, 4, 2, 1), cex = 0.75) # tmpbreaks <- breaks # if (symkey) { # max.raw <- max(abs(c(x, breaks)), na.rm = TRUE) # min.raw <- -max.raw # tmpbreaks[1] <- -max(abs(x)) # tmpbreaks[length(tmpbreaks)] <- max(abs(x)) # } # else { # min.raw <- min(x, na.rm = TRUE) # max.raw <- max(x, na.rm = TRUE) # } # z <- seq(min.raw, max.raw, length = length(col)) # image(z = matrix(z, ncol = 1), col = col, breaks = tmpbreaks, # xaxt = "n", yaxt = "n") # par(usr = c(0, 1, 0, 1)) # lv <- pretty(breaks) # xv <- scale01(as.numeric(lv), min.raw, max.raw) # axis(1, at = xv, labels = lv) # if (scale == "row") # mtext(side = 1, "Row Z-Score", line = 2) # else if (scale == "column") # mtext(side = 1, "Column Z-Score", line = 2) # else mtext(side = 1, "Value", line = 2) # if (density.info == "density") { # dens <- density(x, adjust = densadj, na.rm = TRUE) # omit <- dens$x < min(breaks) | dens$x > max(breaks) # dens$x <- dens$x[-omit] # dens$y <- dens$y[-omit] # dens$x <- scale01(dens$x, min.raw, max.raw) # lines(dens$x, dens$y/max(dens$y) * 0.95, col = denscol, # lwd = 1) # axis(2, at = pretty(dens$y)/max(dens$y) * 0.95, pretty(dens$y)) # title("Color Key\nand Density Plot") # par(cex = 0.5) # mtext(side = 2, "Density", line = 2) # } # else if (density.info == "histogram") { # h <- hist(x, plot = FALSE, breaks = breaks) # hx <- scale01(breaks, min.raw, max.raw) # hy <- c(h$counts, h$counts[length(h$counts)]) # lines(hx, hy/max(hy) * 0.95, lwd = 1, type = "s", # col = denscol) # axis(2, at = pretty(hy)/max(hy) * 0.95, pretty(hy)) # title("Color Key\nand Histogram") # par(cex = 0.5) # mtext(side = 2, "Count", line = 2) # } # else title("Color Key") # } # else plot.new() # retval$colorTable <- data.frame(low = retval$breaks[-length(retval$breaks)], # high = retval$breaks[-1], color = retval$col) # invisible(retval) #} # Extracted from the psychometric package (0.1.0) # Copyright Thomas D. Fletcher # Under Gnu GPL2 CI.Rsqlm <- function (obj, level = 0.95) { l <- level rsq <- summary(obj)$r.squared k <- summary(obj)$df[1] - 1 n <- obj$df + k + 1 mat <- CI.Rsq(rsq, n, k, level = l) return(mat) } # Extracted from the psychometric package (0.1.0) # Copyright Thomas D. Fletcher # Under Gnu GPL2 CI.Rsq <- function (rsq, n, k, level = 0.95) { noma <- 1 - level sersq <- sqrt((4 * rsq * (1 - rsq)^2 * (n - k - 1)^2)/((n^2 - 1) * (n + 3))) zs <- -qnorm(noma/2) mez <- zs * sersq lcl <- rsq - mez ucl <- rsq + mez mat <- data.frame(Rsq = rsq, SErsq = sersq, LCL = lcl, UCL = ucl) return(mat) } str_dim <- function(x, dims=dim(x)){ if( !is.null(dims) ) paste0(dims, collapse = ' x ') else length(x) } # Internal override stringr function str_match # # This is to get the previous behaviour on optional groups, because # in stringr >= 1.0.0 absent optional groups get an NA value instead # of an empty string, which in turn breaks some downstream processing. str_match <- function(...){ res <- stringr::str_match(...) # replace NAs by "" for globally matched strings if( length(w <- which(!is.na(res[, 1L]))) ){ res[w, ][is.na(res[w, ])] <- "" } res } NMF/R/transforms.R0000644000176200001440000001711114333176413013422 0ustar liggesusers# Transformation methods for matrix-like and NMF objects # # Author: Renaud Gaujoux # Creation: 19 Jan 2012 ############################################################################### #' @include NMF-class.R NULL #' Transforming from Mixed-sign to Nonnegative Data #' #' \code{nneg} is a generic function to transform a data objects that #' contains negative values into a similar object that only contains #' values that are nonnegative or greater than a given threshold. #' #' @param object The data object to transform #' @param ... extra arguments to allow extension or passed down to \code{nneg,matrix} #' or \code{rposneg,matrix} in subsequent calls. #' #' @return an object of the same class as argument \code{object}. #' @export #' @inline #' @family transforms #' setGeneric('nneg', function(object, ...) standardGeneric('nneg')) #' Transforms a mixed-sign matrix into a nonnegative matrix, optionally apply a #' lower threshold. #' This is the workhorse method, that is eventually called by all other #' methods defined in the \code{\link{NMF}} package. #' #' @param method Name of the transformation method to use, that is partially #' matched against the following possible methods: #' \describe{ #' \item{pmax}{Each entry is constrained to be above threshold \code{threshold}.} #' #' \item{posneg}{The matrix is split into its "positive" and "negative" parts, #' with the entries of each part constrained to be above threshold \code{threshold}. #' The result consists in these two parts stacked in rows (i.e. \code{\link{rbind}}-ed) #' into a single matrix, which has double the number of rows of the input #' matrix \code{object}.} #' #' \item{absolute}{The absolute value of each entry is constrained to be above #' threshold \code{threshold}.} #' #' \item{min}{Global shift by adding the minimum entry to each entry, only if #' it is negative, and then apply threshold. #' } #' #' } #' #' @param threshold Nonnegative lower threshold value (single numeric). #' See argument \code{shit} for details on how the threshold is used and affects #' the result. #' @param shift a logical indicating whether the entries below the threshold #' value \code{threshold} should be forced (shifted) to 0 (default) or to #' the threshold value itself. #' In other words, if \code{shift=TRUE} (default) all entries in #' the result matrix are either 0 or strictly greater than \code{threshold}. #' They are all greater or equal than \code{threshold} otherwise. #' #' @seealso \code{\link{pmax}} #' @examples #' #' # random mixed sign data (normal distribution) #' set.seed(1) #' x <- rmatrix(5,5, rnorm, mean=0, sd=5) #' x #' #' # pmax (default) #' nneg(x) #' # using a threshold #' nneg(x, threshold=2) #' # without shifting the entries lower than threshold #' nneg(x, threshold=2, shift=FALSE) #' #' # posneg: split positive and negative part #' nneg(x, method='posneg') #' nneg(x, method='pos', threshold=2) #' #' # absolute #' nneg(x, method='absolute') #' nneg(x, method='abs', threshold=2) #' #' # min #' nneg(x, method='min') #' nneg(x, method='min', threshold=2) #' setMethod('nneg', 'matrix' , function(object, method=c('pmax', 'posneg', 'absolute', 'min'), threshold=0, shift=TRUE){ # match argument method <- match.arg(method) if( !is.numeric(threshold) || length(threshold) != 1L ) stop("nneg - Invalid threshold value in argument `threshold` [",threshold,"]: must be a single numeric value.") if( threshold < 0 ) stop("nneg - Invalid threshold value in argument `threshold` [",threshold,"]: must be nonnegative.") # 1. Transform if there is any negative entry m <- min(object) if( m < 0 ){ object <- switch(method , pmax = pmax(object, 0) , posneg = rbind(pmax(object, 0), pmax(-object, 0)) , absolute = pmax(abs(object), 0) , min = object - m , stop("NMF::nneg - Unexpected error: unimplemented transformation method '", method, "'.") ) } if( threshold > 0 ){ # 2. Apply threshold if any object <- pmax(object, threshold) # 3. Shifting: entries under threshold if( shift ) object[object<=threshold] <- 0 } # return modified object object } ) #' Apply \code{nneg} to the basis matrix of an \code{\link{NMF}} #' object (i.e. \code{basis(object)}). #' All extra arguments in \code{...} are passed to the method \code{nneg,matrix}. #' #' @examples #' #' # random #' M <- nmfModel(x, rmatrix(ncol(x), 3)) #' nnM <- nneg(M) #' basis(nnM) #' # mixture coefficients are not affected #' identical( coef(M), coef(nnM) ) #' setMethod('nneg', 'NMF', function(object, ...){ basis(object) <- nneg(basis(object), ...) object } ) #' \code{posneg} is a shortcut for \code{nneg(..., method='posneg')}, to split #' mixed-sign data into its positive and negative part. #' See description for method \code{"posneg"}, in \code{\link{nneg}}. #' #' @export #' @rdname nneg #' @examples #' # shortcut for the "posneg" transformation #' posneg(x) #' posneg(x, 2) #' posneg <- function(...) nneg(..., method='posneg') #' Transforming from Nonnegative to Mixed Sign Data #' #' \code{rposneg} performs the "reverse" transformation of the \code{\link{posneg}} function. #' #' @return an object of the same type of \code{object} #' @rdname nneg #' @inline #' setGeneric('rposneg', function(object, ...) standardGeneric('rposneg')) #' @param unstack Logical indicating whether the positive and negative parts #' should be unstacked and combined into a matrix as \code{pos - neg}, which contains #' half the number of rows of \code{object} (default), or left #' stacked as \code{[pos; -neg]}. #' #' @export #' @examples #' #' # random mixed sign data (normal distribution) #' set.seed(1) #' x <- rmatrix(5,5, rnorm, mean=0, sd=5) #' x #' #' # posneg-transform: split positive and negative part #' y <- posneg(x) #' dim(y) #' # posneg-reverse #' z <- rposneg(y) #' identical(x, z) #' rposneg(y, unstack=FALSE) #' #' # But posneg-transformation with a non zero threshold is not reversible #' y1 <- posneg(x, 1) #' identical(rposneg(y1), x) #' setMethod('rposneg', 'matrix' , function(object, unstack=TRUE){ # check that the number of rows is pair if( nrow(object) %% 2 != 0 ) stop("rposneg - Invalid input matrix: must have a pair number of rows [",nrow(object),"].") n2 <- nrow(object) n <- n2/2 if( unstack ) object <- object[1:n,,drop=FALSE] - object[(n+1):n2,,drop=FALSE] else object[(n+1):n2,] <- - object[(n+1):n2,,drop=FALSE] # return modified object object } ) #' Apply \code{rposneg} to the basis matrix of an \code{\link{NMF}} object. #' #' @examples #' #' # random mixed signed NMF model #' M <- nmfModel(rmatrix(10, 3, rnorm), rmatrix(3, 4)) #' # split positive and negative part #' nnM <- posneg(M) #' M2 <- rposneg(nnM) #' identical(M, M2) setMethod('rposneg', 'NMF' , function(object, ...){ basis(object) <- rposneg(basis(object), ...) object } ) #' Transformation NMF Model Objects #' #' \code{t} transpose an NMF model, by transposing and swapping its basis and #' coefficient matrices: \eqn{t([W,H]) = [t(H), t(W)]}. #' #' The function \code{t} is a generic defined in the \pkg{base} package. #' The method \code{t.NMF} defines the trasnformation for the general NMF interface. #' This method may need to be overloaded for NMF models, whose structure requires #' specific handling. #' #' @param x NMF model object. #' #' @family transforms #' @export #' @examples #' #' x <- rnmf(3, 100, 20) #' x #' # transpose #' y <- t(x) #' y #' #' # factors are swapped-transposed #' stopifnot( identical(basis(y), t(coef(x))) ) #' stopifnot( identical(coef(y), t(basis(x))) ) #' t.NMF <- function(x){ # transpose and swap factors w <- t(basis(x)) .basis(x) <- t(coef(x)) .coef(x) <- w # return object x } NMF/R/NMFfit-class.R0000644000176200001440000006302714660664063013467 0ustar liggesusers# Implementation of class NMFfit # # This class manages the result of a single run of a NMF algorithm. # # Author: Renaud Gaujoux ############################################################################### #' @include fixed-terms.R #' @include nmfModel.R NULL #' Base Class for to store Nonnegative Matrix Factorisation results #' #' Base class to handle the results of general \strong{Nonnegative Matrix #' Factorisation} algorithms (NMF). #' #' It provides a general structure and generic functions to manage the results #' of NMF algorithms. It contains a slot with the fitted NMF model (see slot #' \code{fit}) as well as data about the methods and parameters used to compute #' the factorization. #' #' The purpose of this class is to handle in a generic way the results of NMF #' algorithms. Its slot \code{fit} contains the fitted NMF model as an object #' of class \code{\linkS4class{NMF}}. #' #' Other slots contains data about how the factorization has been computed, #' such as the algorithm and seeding method, the computation time, the final #' residuals, etc\dots{} #' #' Class \code{NMFfit} acts as a wrapper class for its slot \code{fit}. It #' inherits from interface class \code{\linkS4class{NMF}} defined for generic #' NMF models. Therefore, all the methods defined by this interface can be #' called directly on objects of class \code{NMFfit}. The calls are simply #' dispatched on slot \code{fit}, i.e. the results are the same as if calling #' the methods directly on slot \code{fit}. #' #' @slot fit An object that inherits from class \code{\linkS4class{NMF}}, and #' contains the fitted NMF model. #' #' NB: class \code{NMF} is a virtual class. The default class for this #' slot is \code{NMFstd}, that implements the standard NMF model. #' #' @slot residuals A \code{numeric} vector that contains the final #' residuals or the residuals track between the target matrix and its NMF #' estimate(s). Default value is \code{numeric()}. #' #' See method \code{\link{residuals}} for details on accessor methods and main #' interface \code{\link{nmf}} for details on how to compute NMF with residuals #' tracking. #' #' @slot method a single \code{character} string that contains the #' name of the algorithm used to fit the model. #' Default value is \code{''}. #' #' @slot seed a single \code{character} string that contains the #' name of the seeding method used to seed the algorithm that fitted the NMF #' model. #' Default value is \code{''}. See \code{\link{nmf}} for more details. #' #' @slot rng an object that contains the RNG settings used for the #' fit. #' Currently the settings are stored as an integer vector, the value of #' \code{\link{.Random.seed}} at the time the object is created. #' It is initialized by the \code{initialized} method. #' See \code{\link[rngtools]{getRNG}} for more details. #' #' @slot distance either a single \code{"character"} string that #' contains the name of the built-in objective function, or a \code{function} #' that measures the residuals between the target matrix and its NMF estimate. #' See \code{\link{objective}} and \code{\link{deviance,NMF-method}}. #' #' @slot parameters a \code{list} that contains the extra parameters #' -- usually specific to the algorithm -- that were used to fit the model. #' #' @slot runtime object of class \code{"proc_time"} that contains #' various measures of the time spent to fit the model. #' See \code{\link[base]{system.time}} #' #' @slot options a \code{list} that contains the options used to #' compute the object. #' #' @slot extra a \code{list} that contains extra miscellaneous data #' for internal usage only. #' For example it can be used to store extra parameters or temporary data, #' without the need to explicitly extend the \code{NMFfit} class. #' Currently built-in algorithms only use this slot to #' store the number of iterations performed to fit the object. #' #' Data that need to be easily accessible by the end-user should rather be set #' using the methods \code{$<-} that sets elements in the \code{list} slot #' \code{misc} -- that is inherited from class \code{\linkS4class{NMF}}. #' #' @slot call stored call to the last \code{nmf} method that generated the #' object. #' #' @export #' @examples #' # run default NMF algorithm on a random matrix #' n <- 50; r <- 3; p <- 20 #' V <- rmatrix(n, p) #' res <- nmf(V, r) #' #' # result class is NMFfit #' class(res) #' isNMFfit(res) #' #' # show result #' res #' #' # compute summary measures #' summary(res, target=V) #' setClass('NMFfit' , representation( fit = 'NMF', # NMF model residuals = 'numeric', # residuals from the target matrix method = 'character', # method used to compute the factorization seed = 'character', # seeding method used to compute the factorization rng = 'ANY', # numerical random seed distance = '.functionSlotNULL', # method used to compute the distance between the target matrix and its NMF estimate parameters = 'list', # method used to compute the factorization runtime = 'proc_time', # running time to perform the NMF options = 'list', # run options extra = 'list' # extra list of results output by the method , call = 'call' # store last call to nmf() ) , prototype = prototype( residuals = numeric(), method = '', seed = '', parameters = list(), extra = list() ) , validity = function(object){ # slot 'objective' must either be a non-empty character string or a function obj <- objective(object) if( is.character(obj) && obj == '') return(paste("Slot 'objective' must either be a non-empty character string or a function definition", sep='')) # everything went fine: return TRUE TRUE } , contains = 'NMF' ) #' The function \code{NMFfit} is a factory method for NMFfit objects, that should #' not need to be called by the user. #' It is used internally by the functions \code{\link{nmf}} and \code{seed} to #' instantiate the starting point of NMF algorithms. #' #' @param fit an NMF model #' @param ... extra argument used to initialise slots in the instantiating #' \code{NMFfit} object. #' @param rng RNG settings specification (typically a suitable value for #' \code{\link{.Random.seed}}). #' #' @rdname NMFfit-class NMFfit <- function(fit=nmfModel(), ..., rng=NULL){ # use current RNG settings if not otherwise provided if( is.null(rng) ) rng <- getRNG() new('NMFfit', fit=fit, ..., rng=rng) } #' Computes and return the estimated target matrix from an NMF model fitted with #' function \code{\link{nmf}}. #' #' It is a shortcut for \code{fitted(fit(object), ...)}, dispatching the call to #' the \code{fitted} method of the actual NMF model. setMethod('fitted', signature(object='NMFfit'), function(object, ...){ fitted(fit(object), ...) } ) #' Returns the basis matrix from an NMF model fitted with #' function \code{\link{nmf}}. #' #' It is a shortcut for \code{.basis(fit(object), ...)}, dispatching the call to #' the \code{.basis} method of the actual NMF model. setMethod('.basis', signature(object='NMFfit'), function(object, ...){ .basis(fit(object), ...) } ) #' Sets the the basis matrix of an NMF model fitted with #' function \code{\link{nmf}}. #' #' It is a shortcut for \code{.basis(fit(object)) <- value}, dispatching the call to #' the \code{.basis<-} method of the actual NMF model. #' It is not meant to be used by the user, except when developing #' NMF algorithms, to update the basis matrix of the seed object before #' returning it. #' setReplaceMethod('.basis', signature(object='NMFfit', value='matrix'), function(object, value){ .basis(fit(object)) <- value object } ) #' Returns the the coefficient matrix from an NMF model fitted with #' function \code{\link{nmf}}. #' #' It is a shortcut for \code{.coef(fit(object), ...)}, dispatching the call to #' the \code{.coef} method of the actual NMF model. setMethod('.coef', signature(object='NMFfit'), function(object, ...){ .coef(fit(object), ...) } ) #' Sets the the coefficient matrix of an NMF model fitted with #' function \code{\link{nmf}}. #' #' It is a shortcut for \code{.coef(fit(object)) <- value}, dispatching the call to #' the \code{.coef<-} method of the actual NMF model. #' It is not meant to be used by the user, except when developing #' NMF algorithms, to update the coefficient matrix in the seed object before #' returning it. #' setReplaceMethod('.coef', signature(object='NMFfit', value='matrix'), function(object, value){ .coef(fit(object)) <- value object } ) #' Method for single NMF fit objects, which returns the indexes of fixed #' basis terms from the fitted model. setMethod('ibterms', 'NMFfit', function(object){ ibterms(fit(object)) } ) #' Method for single NMF fit objects, which returns the indexes of fixed #' coefficient terms from the fitted model. setMethod('icterms', 'NMFfit', function(object){ icterms(fit(object)) } ) #' Returns the offset from the fitted model. setMethod('offset', signature(object='NMFfit'), function(object){ offset(fit(object)) } ) #' Returns the number of iteration performed to fit an NMF model, typically #' with function \code{\link{nmf}}. #' #' Currently this data is stored in slot \code{'extra'}, but this might change #' in the future. setMethod('niter', signature(object='NMFfit'), function(object, ...){ object@extra$iteration } ) #' Sets the number of iteration performed to fit an NMF model. #' #' This function is used internally by the function \code{\link{nmf}}. #' It is not meant to be called by the user, except when developing #' new NMF algorithms implemented as single function, to set the number #' of iterations performed by the algorithm on the seed, before returning it #' (see \code{\linkS4class{NMFStrategyFunction}}). #' setReplaceMethod('niter', signature(object='NMFfit', value='numeric'), function(object, value){ if( (length(value) != 1) || value < 0 ) stop("NMF::niter - invalid value for 'niter': single non-negative value is required.", call.=FALSE) object@extra$iteration <- value object } ) #' Show method for objects of class \code{NMFfit} setMethod('show', 'NMFfit', function(object) { cat("\n", sep='') cat(" # Model:\n ") s <- capture.output(show(fit(object))) cat(s, sep="\n ") cat(" # Details:\n ") .local <- function(){ if( algorithm(object) != '' ) cat("algorithm: ", algorithm(object), "\n") if( seeding(object) != '' ) cat("seed: ", seeding(object), "\n") # initial RNG stream cat("RNG: ", RNGstr(object), "\n", sep='') # distance/objective function svalue <- objective(object) svalue <- if( is.function(svalue) ) '' else paste("'", svalue,"'", sep='') cat("distance metric: ", svalue, "\n") if( length(residuals(object)) !=0 ) cat("residuals: ", residuals(object), "\n"); # show the miscellaneous result values if( length(object@misc) > 0L ) cat("miscellaneous:", str_desc(object@misc, exdent=12L), ". (use 'misc(object)')\n") # show the parameters specific to the method if( length(object@parameters) > 0 ){ cat("parameters:", str_desc(object@parameters, exdent=12L), "\n") # p <- sapply(object@parameters, function(x){ # if( is.vector(x) && length(x) == 1L ) x # else paste("<", class(x), ">", sep='') # }) # cat(str_wrap(str_out(p, NA, use.names=TRUE, quote=FALSE), exdent=12), "\n") } # show number of iterations if present if( !is.null(i <- niter(object)) ) cat("Iterations:", i, "\n") # show elapsed time if present if( length(runtime(object)) > 0 ){ cat("Timing:\n"); show(runtime(object));} } s <- capture.output(.local()) cat(s, sep="\n ") } ) #' Extracting Fitted Models #' #' The functions \code{fit} and \code{minfit} are S4 genetics that extract #' the best model object and the best fit object respectively, from a collection #' of models or from a wrapper object. #' #' @details #' A fit object differs from a model object in that it contains data about the #' fit, such as the initial RNG settings, the CPU time used, etc\ldots, while #' a model object only contains the actual modelling data such as regression #' coefficients, loadings, etc\ldots #' #' That best model is generally defined as the one that achieves the #' maximum/minimum some quantitative measure, amongst all models in a collection. #' #' In the case of NMF models, the best model is the one that achieves the best #' approximation error, according to the objective function associated with the #' algorithm that performed the fit(s). #' #' @param object an object fitted by some algorithm, e.g. as returned by the #' function \code{\link{nmf}}. #' @param value replacement value #' @param ... extra arguments to allow extension #' #' @rdname fit #' @export setGeneric('fit', function(object, ...) standardGeneric('fit')) #' Returns the NMF model object stored in slot \code{'fit'}. setMethod('fit', 'NMFfit', function(object) slot(object, 'fit')) #' \code{fit<-} sets the fitted model in a fit object. #' It is meant to be called only when developing new NMF algorithms, e.g. to update #' the value of the model stored in the starting point. #' #' @rdname fit #' @export setGeneric('fit<-', function(object, value) standardGeneric('fit<-')) #' Updates the NMF model object stored in slot \code{'fit'} with a new value. setReplaceMethod('fit', signature(object='NMFfit', value='NMF'), function(object, value){ slot(object, 'fit') <- value object # TODO: valid object before returning it (+param check=TRUE or FALSE) } ) #' @rdname fit #' @export setGeneric('minfit', function(object, ...) standardGeneric('minfit') ) #' Returns the object its self, since there it is the result of a single NMF run. setMethod('minfit', 'NMFfit', function(object) object) #' Returns the type of a fitted NMF model. #' It is a shortcut for \code{modelname(fit(object)}. setMethod('modelname', signature(object='NMFfit'), function(object) { modelname(fit(object)) } ) #' Residuals in NMF Models #' #' The package NMF defines methods for the function \code{\link[stats]{residuals}} #' that returns the final residuals of an NMF fit or the track of the residuals #' along the fit process, computed according to the objective function #' associated with the algorithm that fitted the model. #' #' When called with \code{track=TRUE}, the whole residuals track is returned, #' if available. #' Note that method \code{\link{nmf}} does not compute the residuals track, #' unless explicitly required. #' #' It is a S4 methods defined for the associated generic functions from package #' \code{stats} (See \link[stats]{residuals}). #' #' @note Stricly speaking, the method \code{residuals,NMFfit} does not fulfill #' its contract as defined by the package \code{stats}, but rather acts as function #' \code{deviance}. #' The might be changed in a later release to make it behave as it should. #' #' @param object an \code{NMFfit} object as fitted by function \code{\link{nmf}}, #' in single run mode. #' @param ... extra parameters (not used) #' #' @return \code{residuals} returns a single numeric value if \code{track=FALSE} #' or a numeric vector containing the residual values at some iterations. #' The names correspond to the iterations at which the residuals were computed. #' #' @family stats #' @inline #' @rdname residuals #' @export #' setGeneric('residuals', package='stats') #' Returns the residuals -- track -- between the target matrix and the NMF #' fit \code{object}. #' #' @param track a logical that indicates if the complete track of residuals #' should be returned (if it has been computed during the fit), or only the last #' value. #' #' @param niter specifies the iteration number for which one wants #' to get/set/test a residual value. This argument is used only if not \code{NULL} #' setMethod('residuals', 'NMFfit', function(object, track=FALSE, niter=NULL, ...){ ## IMPORTANT: keep this '...' and do not add a 'method' argument as this ## one is passed by NMFfitX::fit (see bug #159) and is not supposed to be ## used res <- slot(object, 'residuals') if( track ) res else if( is.null(niter) ) tail(res, n=1) else res[as.character(niter)] } ) #' \code{residuals<-} sets the value of the last residuals, or, optionally, #' of the complete residual track. #' #' @param value residual value #' #' @export #' @inline #' @rdname residuals setGeneric('residuals<-', function(object, ..., value) standardGeneric('residuals<-') ) #' @inline setReplaceMethod('residuals', 'NMFfit', function(object, ..., niter=NULL, track=FALSE, value){ if( track ) slot(object, 'residuals') <- value else{ if( !is.null(niter) ) value <- setNames(value, niter) slot(object, 'residuals') <- c(slot(object, 'residuals'), value) } object } ) #' Tells if an \code{NMFfit} object contains a recorded residual track. #' #' @export #' @rdname residuals hasTrack <- function(object, niter=NULL){ if( is.null(niter) ) length( slot(object, 'residuals') ) > 1 else !is.na(slot(object, 'residuals')[as.character(niter)]) } #' \code{trackError} adds a residual value to the track of residuals. #' #' @param force logical that indicates if the value should be added to the track #' even if there already is a value for this iteration number or if the iteration #' does not conform to the tracking interval \code{nmf.getOption('track.interval')}. #' #' @rdname residuals #' @export trackError <- function(object, value, niter, force=FALSE){ track <- run.options(object, 'error.track') track.interval <- run.options(object, 'track.interval') if( force || (track && niter %% track.interval == 0) ){ # add the new value to the error track last.iter <- names(residuals(object)) duplicate <- if( !is.null(last.iter) ) niter == last.iter else FALSE if( !duplicate ){ iter <- if( niter >= 0 ) niter residuals(object, niter=iter) <- value } } object } #' Returns the deviance of a fitted NMF model. #' #' This method returns the final residual value if the target matrix \code{y} is #' not supplied, or the approximation error between the fitted NMF model stored #' in \code{object} and \code{y}. #' In this case, the computation is performed using the objective function #' \code{method} if not missing, or the objective of the algorithm that #' fitted the model (stored in slot \code{'distance'}). #' #' If not computed by the NMF algorithm itself, the value is automatically #' computed at the end of the fitting process by the function \code{\link{nmf}}, #' using the objective function associated with the NMF algorithm, so that it #' should always be available. #' #' @inline setMethod('deviance', 'NMFfit', function(object, y, method, ...){ if( missing(y) ) setNames(residuals(object), NULL) else{ # if missing retrieve the actual distance measure from the NMF object if( missing(method) ) method = object@distance # compute the distance between the target and the fitted NMF model deviance(fit(object), y, method=method, ...) } } ) #' Returns the name of the algorithm that fitted the NMF model \code{object}. setMethod('algorithm', 'NMFfit', function(object){ object@method } ) #' @inline setReplaceMethod('algorithm', 'NMFfit', function(object, value){ object@method <- value object } ) #' Returns the name of the seeding method that generated the starting point #' for the NMF algorithm that fitted the NMF model \code{object}. setMethod('seeding', 'NMFfit', function(object){ object@seed } ) #' @inline setReplaceMethod('seeding', 'NMFfit', function(object, value){ object@seed <- value object } ) #' Returns the objective function associated with the algorithm that computed the #' fitted NMF model \code{object}, or the objective value with respect to a given #' target matrix \code{y} if it is supplied. #' #' @param y optional target matrix used to compute the objective value. #' setMethod('objective', signature(object='NMFfit'), function(object, y){ # when both x and y are missing then returns slot objective if( missing(y) ) return(slot(object, 'distance')) # return the distance computed using the strategy's objective function deviance(fit(object), y, method=slot(object, 'distance')) } ) #' @inline setReplaceMethod('objective', signature(object='NMFfit', value='ANY'), function(object, value){ slot(object, 'distance') <- value validObject(object) object } ) #' Returns the CPU time required to compute a single NMF fit. setMethod('runtime', 'NMFfit', function(object, ...){ object@runtime } ) #' Identical to \code{runtime}, since their is a single fit. setMethod('runtime.all', 'NMFfit', getMethod('runtime', 'NMFfit')) ###% Access methods to run options. setGeneric('run.options', function(object, ...) standardGeneric('run.options') ) setMethod('run.options', 'NMFfit', function(object, name){ if( missing(name) ) object@options else object@options[[name]] } ) setGeneric('run.options<-', function(object, ..., value) standardGeneric('run.options<-') ) setReplaceMethod('run.options', 'NMFfit', function(object, ..., value){ params <- list(...) baseError <- 'Setting NMF runtime options: ' if ( length(params) == 0 ){ if( !is.list(value) ) stop(baseError, 'options must be given as a list') object@options <- value return(object) } else if ( length(params) > 1 ) stop(baseError, 'options cannot set more than one option at a time') name <- params[[1]] if( !is.character(name) ) stop(baseError, 'option name must be given as a character string') # check if the option exists #if( !is.element(name, names(nmf.options.runtime())) ) stop(baseError, "option '", name, "' is not defined.") object@options[[name]] <- value object } ) setGeneric('verbose', function(object, ...) standardGeneric('verbose') ) setMethod('verbose', 'NMFfit', function(object){ return(run.options(object, 'verbose') || nmf.getOption('debug')) } ) setGeneric('plot', package='graphics' ) #' Plots the residual track computed at regular interval during the fit of #' the NMF model \code{x}. #' #' @param skip an integer that indicates the number of points to skip/remove from the beginning #' of the curve. #' If \code{skip=1L} (default) only the initial residual -- that is computed before any iteration, is #' skipped, if present in the track (it associated with iteration 0). #' #' @export setMethod('plot', signature(x='NMFfit', y='missing'), function(x, y, skip=-1L, ...){ # retrieve the residuals track track <- residuals(x, track=TRUE) if( length(track) <= 1 ){ warning(class(x), ' object has no residuals track') return(invisible()) } # skip part of the track if( skip == -1L && !is.null(names(track)) ) track <- track[names(track)!='0'] # remove initial residual else if( skip > 0 ) track <- track[-(1:skip)] # set default graphical parameters (those can be overriden by the user) params <- .set.list.defaults(list(...) , xlab='Iterations' , ylab=paste('Objective value (' , if( is.character(x@distance) ) x@distance else algorithm(x), ')' , sep='' ) , main=paste("NMF Residuals\nMethod: ", algorithm(x), " - Rank: ", nbasis(x), sep='') , cex.main = 1 , col='#5555ff', lwd=1.4, type='l', cex=0.5) do.call('plot', c(list(names(track), track), params)) points(names(track), track, type='p', cex=0.6, col=params$col) } ) #' Computes summary measures for a single fit from \code{\link{nmf}}. #' #' This method adds the following measures to the measures computed by the method #' \code{summary,NMF}: #' #' \describe{ #' \item{residuals}{Residual error as measured by the objective function associated #' to the algorithm used to fit the model.} #' \item{niter}{Number of iterations performed to achieve convergence of the algorithm.} #' \item{cpu}{Total CPU time required for the fit.} #' \item{cpu.all}{Total CPU time required for the fit. For \code{NMFfit} objects, this element is #' always equal to the value in \dQuote{cpu}, but will be different for multiple-run fits.} #' \item{nrun}{Number of runs performed to fit the model. This is always equal to 1 for #' \code{NMFfit} objects, but will vary for multiple-run fits.} #' } #' #' @inline #' #' @examples #' # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) #' n <- 50; counts <- c(5, 5, 8); #' V <- syntheticNMF(n, counts) #' cl <- unlist(mapply(rep, 1:3, counts)) #' #' # perform default NMF with rank=2 #' x2 <- nmf(V, 2) #' summary(x2, cl, V) #' # perform default NMF with rank=2 #' x3 <- nmf(V, 3) #' summary(x2, cl, V) #' setMethod('summary', signature(object='NMFfit'), function(object, ...){ res <- summary(fit(object), ...) ## IMPORTANT: if adding a summary measure also add it in the sorting ## schema of method NMFfitX::compare to allow ordering on it # retreive final residuals res <- c(res, residuals=as.numeric(residuals(object))) # nb of iterations res <- c(res, niter=as.integer(niter(object)) ) # runtime t <- runtime(object) utime <- as.numeric(t['user.self'] + t['user.child']) res <- c(res, cpu=utime, cpu.all=utime, nrun=1) # return result return(res) } ) #' Compares two NMF models when at least one comes from a NMFfit object, #' i.e. an object returned by a single run of \code{\link{nmf}}. setMethod('nmf.equal', signature(x='NMFfit', y='NMF'), function(x, y, ...){ nmf.equal(fit(x), y, ...) } ) #' Compares two NMF models when at least one comes from a NMFfit object, #' i.e. an object returned by a single run of \code{\link{nmf}}. setMethod('nmf.equal', signature(x='NMF', y='NMFfit'), function(x, y, ...){ nmf.equal(x, fit(y), ...) } ) #' Compares two fitted NMF models, i.e. objects returned by single runs of #' \code{\link{nmf}}. setMethod('nmf.equal', signature(x='NMFfit', y='NMFfit'), function(x, y, ...){ nmf.equal(fit(x), fit(y), ...) } ) NMF/R/algorithms-lsnmf.R0000644000176200001440000000606714333176413014522 0ustar liggesusers# Implementations of LS-NMF # # Reference: # LS-NMF: a modified non-negative matrix factorization algorithm utilizing uncertainty estimates. # Wang, Guoli, Andrew V Kossenkov, and Michael F Ochs. # BMC bioinformatics 7 (January 2006): 175. http://www.ncbi.nlm.nih.gov/pubmed/16569230. # # Author: Renaud Gaujoux # Creation: 09 Nov 2011 ############################################################################### #' @include registry-algorithms.R NULL #' Multiplicative Updates for LS-NMF #' #' Implementation of the updates for the LS-NMF algorithm from \cite{Wang2006}. #' #' @param i current iteration #' @param X target matrix #' @param object current NMF model #' @param weight value for \eqn{\Sigma}{S}, i.e. the weights that are applied to each #' entry in \code{X} by \code{X * weight} (= entry wise product). #' Weights are usually specified as a matrix of the same dimension as \code{X} #' (e.g. uncertainty estimates for each measurement), but may also be passed as a vector, #' in which case the standard rules for entry wise product between matrices and vectors apply #' (e.g. recylcing elements). #' @param eps small number passed to the standard euclidean-based NMF updates #' (see \code{\link{nmf_update.euclidean}}). #' @param ... extra arguments (not used) #' #' @return updated object \code{object} #' @rdname lsNMF-nmf nmf_update.lsnmf <- function(i, X, object, weight, eps=10^-9, ...) { if( i == 1 ){# pre-compute weighted target matrix staticVar('wX', X * weight, init=TRUE) } # retrieve weighted target matrix wX <- staticVar('wX') # retrieve each factor w <- .basis(object); h <- .coef(object); # compute the estimate WH wh <- fitted(object) * weight # euclidean-reducing NMF iterations # H_au = H_au (W^T V/sigma)_au / (W^T (W H)/sigma)_au h <- nmf_update.euclidean.h_R(wX, w, h, wh=wh, eps=eps) # update H and recompute the estimate WH .coef(object) <- h; wh <- fitted(object) * weight # W_ia = W_ia (V/sigma H^T)_ia / ((W H)/sigma H^T)_ia and columns are rescaled after each iteration w <- nmf_update.euclidean.w_R(wX, w, h, wh=wh, eps=eps) #return the modified data .basis(object) <- w return(object) } #' \code{wrss} implements the objective function used by the LS-NMF algorithm. #' #' @rdname lsNMF-nmf wrss <- function(object, X, weight){ sum( ((X - fitted(object)) * weight)^2 )/2 } # Registration of LS-NMF #' @inheritParams run,NMFStrategyIterative,matrix,NMFfit-method #' @inheritParams nmf.stop.stationary #' #' @aliases lsNMF-nmf #' @rdname lsNMF-nmf nmfAlgorithm.lsNMF <- setNMFMethod('ls-nmf', objective=wrss , Update=nmf_update.lsnmf , Stop='stationary') # Unit test for the LS-NMF algorithm runit.lsnmf <- function(){ requireNamespace('RUnit') set.seed(12345) X <- rmatrix(100,20) res <- nmf(X, 3, 'ls-nmf', weight=1, seed=1) res2 <- nmf(X, 3, '.R#lee', rescale=FALSE, seed=1, .stop=nmf.stop.stationary) tol <- 10^-14 RUnit::checkTrue( nmf.equal(res, res2, identical=FALSE, tol=tol ), paste("LS-NMF with weight = 1 and .R#Lee (no scale + stationary) give identical results at tolerance=", tol)) } NMF/R/nmf.R0000644000176200001440000032210514660664233012013 0ustar liggesusers#' @include NMFstd-class.R #' @include NMFSet-class.R #' @include registry-seed.R #' @include registry-algorithms.R #' @include parallel.R NULL #' Running NMF algorithms #' #' @description #' The function \code{nmf} is a S4 generic defines the main interface to run NMF #' algorithms within the framework defined in package \code{NMF}. #' It has many methods that facilitates applying, developing and testing NMF #' algorithms. #' #' The package vignette \code{vignette('NMF')} contains an introduction to the #' interface, through a sample data analysis. #' #' @details #' #' The \code{nmf} function has multiple methods that compose a very flexible #' interface allowing to: #' \itemize{ #' \item combine NMF algorithms with seeding methods and/or stopping/convergence #' criterion at runtime; #' #' \item perform multiple NMF runs, which are computed in parallel whenever the host #' machine allows it; #' #' \item run multiple algorithms with a common set of parameters, ensuring a #' consistent environment (notably the RNG settings). #' } #' #' The workhorse method is \code{nmf,matrix,numeric,NMFStrategy}, which is eventually #' called by all other methods. #' The other methods provides convenient ways of specifying the NMF algorithm(s), #' the factorization rank, or the seed to be used. #' Some allow to directly run NMF algorithms on different types of objects, such #' as \code{data.frame} or \emph{ExpressionSet} objects. #' #' @section Optimized C++ vs. plain R: #' Lee and Seung's multiplicative updates are used by several NMF algorithms. To improve #' speed and memory usage, a C++ implementation of the specific matrix products is used #' whenever possible. It directly computes the updates for each entry in the updated matrix, #' instead of using multiple standard matrix multiplication. #' #' The algorithms that benefit from this optimization are: 'brunet', 'lee', 'nsNMF' and 'offset'. % and 'lnmf' #' However there still exists plain R versions for these methods, which implement the updates #' as standard matrix products. These are accessible by adding the prefix '.R#' to their name: #' '.R#brunet', '.R#lee', '.R#nsNMF' and '.R#offset'. #' #' @param x target data to fit, i.e. a matrix-like object #' @param rank specification of the factorization rank. #' It is usually a single numeric value, but other type of values are possible #' (e.g. matrix), for which specific methods are implemented. #' See for example methods \code{nmf,matrix,matrix,ANY}. #' #' If \code{rank} is a numeric vector with more than one element, e.g. a range of ranks, #' then \code{\link{nmf}} performs the estimation procedure described in #' \code{\link{nmfEstimateRank}}. #' #' @param method specification of the NMF algorithm. #' The most common way of specifying the algorithm is to pass the access key #' (i.e. a character string) of an algorithm stored in the package's dedicated registry, #' but methods exists that handle other types of values, such as \code{function} or \code{list} #' object. See their descriptions in section \emph{Methods}. #' #' If \code{method} is missing the algorithm to use is obtained from the option #' \code{nmf.getOption('default.algorithm')}, unless it can be infer from the type of NMF model #' to fit, if this later is available from other arguments. #' Factory fresh default value is \sQuote{brunet}, which corresponds to the standard NMF #' algorithm from \cite{Brunet2004} (see section \emph{Algorithms}). #' #' Cases where the algorithm is inferred from the call are when an NMF model is passed in arguments \code{rank} #' or \code{seed} (see description for \code{nmf,matrix,numeric,NULL} in section \emph{Methods}). #' #' @param ... extra arguments to allow extension of the generic. #' Arguments that are not used in the chain of internal calls to \code{nmf} methods #' are passed to the function that effectively implements the algorithm that fits #' an NMF model on \code{x}. #' #' @export #' @inline #' #' @examples #' #' # Only basic calls are presented in this manpage. #' # Many more examples are provided in the demo file nmf.R #' \dontrun{ #' demo('nmf') #' } #' #' # random data #' x <- rmatrix(20,10) #' #' # run default algorithm with rank 2 #' res <- nmf(x, 2) #' #' # specify the algorithm #' res <- nmf(x, 2, 'lee') #' #' # get verbose message on what is going on #' res <- nmf(x, 2, .options='v') #' \dontrun{ #' # more messages #' res <- nmf(x, 2, .options='v2') #' # even more #' res <- nmf(x, 2, .options='v3') #' # and so on ... #' } #' #' @demo Using the main function nmf() #' #' # generate a synthetic dataset with known classes: 50 features, 23 samples (10+5+8) #' n <- 20; counts <- c(5, 3, 2); #' p <- sum(counts) #' x <- syntheticNMF(n, counts) #' dim(x) #' #' # build the true cluster membership #' groups <- unlist(mapply(rep, seq(counts), counts)) #' setGeneric('nmf', function(x, rank, method, ...) standardGeneric('nmf') ) #' Fits an NMF model on a \code{data.frame}. #' #' The target \code{data.frame} is coerced into a matrix with \code{\link{as.matrix}}. #' #' @demo #' #' # run on a data.frame #' res <- nmf(data.frame(x), 3) #' setMethod('nmf', signature(x='data.frame', rank='ANY', method='ANY'), function(x, rank, method, ...) { # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL if( missing(rank) ) rank <- NULL # apply NMF to the the data.frame converted into a matrix nmf(as.matrix(x), rank, method, ...) } ) #' Fits an NMF model using an appropriate algorithm when \code{method} is not supplied. #' #' This method tries to select an appropriate algorithm amongst the NMF algorithms #' stored in the internal algorithm registry, which contains the type of NMF models #' each algorithm can fit. #' This is possible when the type of NMF model to fit is available from argument \code{seed}, #' i.e. if it is an NMF model itself. #' Otherwise the algorithm to use is obtained from \code{nmf.getOption('default.algorithm')}. #' #' This method is provided for internal usage, when called from other \code{nmf} methods #' with argument \code{method} missing in the top call (e.g. \code{nmf,matrix,numeric,missing}). #' #' @demo #' #' # missing method: use algorithm suitable for seed #' res <- nmf(x, 2, seed=rnmf(2, x)) #' algorithm(res) #' res <- nmf(x, 2, seed=rnmf(2, x, model='NMFns')) #' algorithm(res) #' setMethod('nmf', signature(x='matrix', rank='numeric', method='NULL'), function(x, rank, method, seed=NULL, model=NULL, ...) { # a priori the default method will be used method <- nmf.getOption('default.algorithm') # use default seeding method if seed is missing if( is.null(seed) ){ # seed <- nmf.getOption('default.seed') }else{ # get reference object from which to infer model type refobj <- if( is.nmf(seed) ) seed else if( is.nmf(model) ) model if( !is.null(refobj) ){ mtype <- modelname(refobj) # try to find the algorithm suitable for the seed's NMF model method.potential <- selectNMFMethod(model=mtype, exact=TRUE, quiet=TRUE) if( is.null(method.potential) ) stop("NMF::nmf - Found no algorithm defined for model '", mtype, "'") if( length(method.potential) == 1 ) # only one to choose method <- method.potential else if( !is.element(method, method.potential) ){# several options, none is default method <- method.potential[1] warning("NMF::nmf - Selected algorithm '", method, "' to fit model '", mtype, "'." , "\n Alternatives are: " , str_out(method.potential[-1], Inf) , call.=FALSE, immediate.=TRUE) } } } nmf(x, rank, method, seed=seed, model=model, ...) } ) #' Fits multiple NMF models on a common matrix using a list of algorithms. #' #' The models are fitted sequentially with \code{nmf} using the same options #' and parameters for all algorithms. #' In particular, irrespective of the way the computation is seeded, this method #' ensures that all fits are performed using the same initial RNG settings. #' #' This method returns an object of class \code{\linkS4class{NMFList}}, that is #' essentially a list containing each fit. #' #' @param .parameters list of method-specific parameters. #' Its elements must have names matching a single method listed in \code{method}, #' and be lists of named values that are passed to the corresponding method. #' #' @demo #' # compare some NMF algorithms (tracking the approximation error) #' res <- nmf(x, 2, list('brunet', 'lee', 'nsNMF'), .options='t') #' res #' summary(res, class=groups) #' #' # plot the track of the residual errors #' plot(res) #' setMethod('nmf', signature(x='matrix', rank='numeric', method='list'), function(x, rank, method, ..., .parameters = list()) { # apply each NMF algorithm k <- 0 n <- length(method) # setup/check method specific parameters ARGS <- NULL .used.parameters <- character() if( !is.list(.parameters) ) stop("NMF::nmf - Invalid value for argument `.parameters`: must be a named list.") if( length(.parameters) && (is.null(names(.parameters)) || any(names(.parameters) == '')) ) stop("NMF::nmf - Invalid value for argument `.parameters`: all elements must be named.") t <- system.time({ res <- lapply(method, function(meth, ...){ k <<- k+1 methname <- if( isString(meth) ) meth else name(meth) cat("Compute NMF method '", methname, "' [", k, "/", n, "] ... ", sep='') # restore RNG on exit (except after last method) # => this ensures the methods use the same stochastic environment orng <- RNGseed() if( k < n ) on.exit( RNGseed(orng), add = TRUE) # look for method-specific arguments i.param <- 0L if( length(.parameters) ){ i.param <- charmatch(names(.parameters), methname) if( !length(i.param <- seq_along(.parameters)[!is.na(i.param)]) ) i.param <- 0L else if( length(i.param) > 1L ){ stop("Method name '", methname, "' matches multiple method-specific parameters " , "[", str_out(names(.parameters)[i.param], Inf), "]") } } #o <- capture.output( if( !i.param ){ res <- try( nmf(x, rank, meth, ...) , silent=TRUE) }else{ if( is.null(ARGS) ) ARGS <<- list(x, rank, ...) .used.parameters <<- c(.used.parameters, names(.parameters)[i.param]) res <- try( do.call(nmf, c(ARGS, method = meth, .parameters[[i.param]])) , silent=TRUE) } #) if( is(res, 'try-error') ) cat("ERROR\n") else cat("OK\n") return(res) } , ...) }) # filter out bad results ok <- sapply(res, function(x){ if( is(x, 'NMF.rank') ) all(sapply(x$fit, isNMFfit)) else isNMFfit(x) }) if( any(!ok) ){ # throw warning if some methods raised an error err <- lapply(which(!ok), function(i){ paste("'", method[[i]],"': ", res[[i]], sep='')}) warning("NMF::nmf - Incomplete results due to ", sum(!ok), " errors: \n- ", paste(err, collapse="- "), call.=FALSE) } res <- res[ok] # TODO error if ok is empty # not-used parameters if( length(.used.parameters) != length(.parameters) ){ warning("NMF::nmf - Did not use methods-specific parameters ", str_out(setdiff(names(.parameters), .used.parameters), Inf)) } # add names to the result list names(res) <- sapply(res, function(x){ if( is(x, 'NMF.rank') ) x <- x$fit[[1]] algorithm(x) }) # return list as is if surveying multiple ranks if( length(rank) > 1 ) return(res) # wrap the result in a NMFList object # DO NOT WRAP anymore here: NMFfitX objects are used only for results of multiple runs (single method) # the user can still join on the result if he wants to #res <- join(res, runtime=t) res <- new('NMFList', res, runtime=t) # return result return(res) } ) #' Fits an NMF model on \code{x} using an algorithm registered with access key #' \code{method}. #' #' Argument \code{method} is partially match against the access keys of all #' registered algorithms (case insensitive). #' Available algorithms are listed in section \emph{Algorithms} below or the #' introduction vignette. #' A vector of their names may be retrieved via \code{nmfAlgorithm()}. #' #' @section Algorithms: #' All algorithms are accessible by their respective access key as listed below. #' The following algorithms are available: #' \describe{ #' #' \item{\sQuote{brunet}}{ Standard NMF, based on the Kullback-Leibler divergence, #' from \cite{Brunet2004}. #' It uses simple multiplicative updates from \cite{Lee2001}, enhanced to avoid #' numerical underflow. #' #' Default stopping criterion: invariance of the connectivity matrix #' (see \code{\link{nmf.stop.connectivity}}). #' } #' #' \item{\sQuote{lee}}{ Standard NMF based on the Euclidean distance from \cite{Lee2001}. #' It uses simple multiplicative updates. #' #' Default stopping criterion: invariance of the connectivity matrix #' (see \code{\link{nmf.stop.connectivity}}). #' } #' #' \item{ls-nmf}{ Least-Square NMF from \cite{Wang2006}. #' It uses modified versions of Lee and Seung's multiplicative updates for the #' Euclidean distance, which incorporates weights on each entry of the target #' matrix, e.g. to reflect measurement uncertainty. #' #' Default stopping criterion: stationarity of the objective function #' (see \code{\link{nmf.stop.stationary}}). #' } #' #' \item{\sQuote{nsNMF}}{ Nonsmooth NMF from \cite{Pascual-Montano2006}. #' It uses a modified version of Lee and Seung's multiplicative updates for the #' Kullback-Leibler divergence \cite{Lee2001}, to fit a extension of the standard #' NMF model, that includes an intermediate smoothing matrix, meant meant to produce #' sparser factors. #' #' Default stopping criterion: invariance of the connectivity matrix #' (see \code{\link{nmf.stop.connectivity}}). #' } #' #' \item{\sQuote{offset}}{ NMF with offset from \cite{Badea2008}. #' It uses a modified version of Lee and Seung's multiplicative #' updates for Euclidean distance \cite{Lee2001}, to fit an NMF model that includes #' an intercept, meant to capture a common baseline and shared patterns, in #' order to produce cleaner basis components. #' #' Default stopping criterion: invariance of the connectivity matrix #' (see \code{\link{nmf.stop.connectivity}}). #' } #' #' \item{\sQuote{pe-nmf}}{ Pattern-Expression NMF from \emph{Zhang2008}. #' It uses multiplicative updates to minimize an objective function based on the #' Euclidean distance, that is regularized for effective expression of patterns #' with basis vectors. #' #' Default stopping criterion: stationarity of the objective function #' (see \code{\link{nmf.stop.stationary}}). #' } #' #' \item{\sQuote{snmf/r}, \sQuote{snmf/l}}{ Alternating Least Square (ALS) approach #' from \cite{KimH2007}. #' It applies the nonnegative least-squares algorithm from \cite{VanBenthem2004} #' (i.e. fast combinatorial nonnegative least-squares for multiple right-hand), #' to estimate the basis and coefficient matrices alternatively #' (see \code{\link{fcnnls}}). #' It minimises an Euclidean-based objective function, that is regularized to #' favour sparse basis matrices (for \sQuote{snmf/l}) or sparse coefficient matrices #' (for \sQuote{snmf/r}). #' #' Stopping criterion: built-in within the internal workhorse function \code{nmf_snmf}, #' based on the KKT optimality conditions. #' } #' #' } #' #' @section Seeding methods: #' The purpose of seeding methods is to compute initial values for the factor #' matrices in a given NMF model. #' This initial guess will be used as a starting point by the chosen NMF algorithm. #' #' The seeding method to use in combination with the algorithm can be passed #' to interface \code{nmf} through argument \code{seed}. #' The seeding seeding methods available in registry are listed by the function #' \code{\link{nmfSeed}} (see list therein). #' #' Detailed examples of how to specify the seeding method and its parameters can #' be found in the \emph{Examples} section of this man page and in the package's #' vignette. #' #' @seealso \code{\link{nmfAlgorithm}} #' #' @demo #' #' # specify algorithm by its name #' res <- nmf(x, 3, 'nsNMF', seed=123) # nonsmooth NMF #' # names are partially matched so this also works #' identical(res, nmf(x, 3, 'ns', seed=123)) #' #' res <- nmf(x, 3, 'offset') # NMF with offset #' #' setMethod('nmf', signature(x='matrix', rank='numeric', method='character'), function(x, rank, method, ...) { # if there is more than one methods then treat the vector as a list if( length(method) > 1 ){ return( nmf(x, rank, as.list(method), ...) ) } # create the NMFStrategy from its name strategy <- nmfAlgorithm(method) # apply nmf using the retrieved strategy nmf(x, rank, method=strategy, ...) } ) #' Fits an NMF model on \code{x} using a custom algorithm defined the function #' \code{method}. #' #' The supplied function must have signature \code{(x=matrix, start=NMF, ...)} #' and return an object that inherits from class \code{\linkS4class{NMF}}. #' It will be called internally by the workhorse \code{nmf} method, with an NMF model #' to be used as a starting point passed in its argument \code{start}. #' #' Extra arguments in \code{...} are passed to \code{method} from the top #' \code{nmf} call. #' Extra arguments that have no default value in the definition of the function #' \code{method} are required to run the algorithm (e.g. see argument \code{alpha} #' of \code{myfun} in the examples). #' #' If the algorithm requires a specific type of NMF model, this can be specified #' in argument \code{model} that is handled as in the workhorse \code{nmf} #' method (see description for this argument). #' #' @param name name associated with the NMF algorithm implemented by the function #' \code{method} [only used when \code{method} is a function]. #' @param objective specification of the objective function associated with the #' algorithm implemented by the function \code{method} #' [only used when \code{method} is a function]. #' #' It may be either \code{'euclidean'} or \code{'KL'} for specifying the euclidean #' distance (Frobenius norm) or the Kullback-Leibler divergence respectively, #' or a function with signature \code{(x="NMF", y="matrix", ...)} that computes #' the objective value for an NMF model \code{x} on a target matrix \code{y}, #' i.e. the residuals between the target matrix and its NMF estimate. #' Any extra argument may be specified, e.g. \code{function(x, y, alpha, beta=2, ...)}. #' #' @param mixed a logical that indicates if the algorithm implemented by the function #' \code{method} support mixed-sign target matrices, i.e. that may contain negative #' values [only used when \code{method} is a function]. #' #' @demo #' #' # run a custom algorithm defined as a standard function #' myfun <- function(x, start, alpha){ #' # update starting point #' # ... #' basis(start) <- 3 * basis(start) #' # return updated point #' start #' } #' #' res <- nmf(x, 2, myfun, alpha=3) #' algorithm(res) #' # error: alpha missing #' try( nmf(x, 2, myfun) ) #' #' # possibly the algorithm fits a non-standard NMF model, e.g. NMFns model #' res <- nmf(x, 2, myfun, alpha=3, model='NMFns') #' modelname(res) #' setMethod('nmf', signature(x='matrix', rank='numeric', method='function'), function(x, rank, method, seed, model='NMFstd', ..., name, objective='euclidean', mixed=FALSE){ model_was_a_list <- is.list(model) if( is.character(model) ) model <- list(model=model) if( !is.list(model) ){ stop("nmf - Invalid argument `model`: must be NULL or a named list of initial values for slots in an NMF model.") } # arguments passed to the call to NMFStrategyFunction strat <- list('NMFStrategyFunction' , algorithm = method , objective = objective , mixed = mixed[1] ) ## Determine type of NMF model associated with the NMFStrategy # All elements of `model` (except the model class) will be passed to # argument `model` of the workhorse `nmf` method, which will use them # to create the NMF model in a call to `nmfModel` if( length(model) > 0L ){ if( !is.null(model$model) ){ strat$model <- model$model model$model <- NULL }else if( isNMFclass(model[[1]]) ){ strat$model <- model[[1]] # use the remaining elements to instanciate the NMF model model <- model[-1] } # all elements must be named if( !hasNames(model, all=TRUE) ){ stop("NMF::nmf - Invalid argument `model`: all elements must be named, except the first one which must then be an NMF model class name") } } ## # if name is missing: generate a temporary unique name if( missing(name) ) name <- basename(tempfile("nmf_")) # check that the name is not a registered name if( existsNMFMethod(name) ) stop("Invalid name for custom NMF algorithm: '",name,"' is already a registered NMF algorithm") strat$name <- name # create NMFStrategy strategy <- do.call('new', strat) # full validation of the strategy validObject(strategy, complete=TRUE) if( missing(seed) ) seed <- NULL if( !model_was_a_list && length(model) == 0L ) model <- NULL # call method 'nmf' with the new object nmf(x, rank, strategy, seed=seed, model=model, ...) } ) #' Fits an NMF model using the NMF model \code{rank} to seed the computation, #' i.e. as a starting point. #' #' This method is provided for convenience as a shortcut for #' \code{nmf(x, nbasis(object), method, seed=object, ...)} #' It discards any value passed in argument \code{seed} and uses the NMF model passed #' in \code{rank} instead. #' It throws a warning if argument \code{seed} not missing. #' #' If \code{method} is missing, this method will call the method #' \code{nmf,matrix,numeric,NULL}, which will infer an algorithm suitable for fitting an #' NMF model of the class of \code{rank}. #' #' @demo #' #' # assume a known NMF model compatible with the matrix `x` #' y <- rnmf(3, x) #' # fits an NMF model (with default method) on some data using y as a starting point #' res <- nmf(x, y) #' # the fit can be reproduced using the same starting point #' nmf.equal(nmf(x, y), res) #' setMethod('nmf', signature(x='matrix', rank='NMF', method='ANY'), function(x, rank, method, seed, ...){ if( !missing(seed) ){ if( isNumber(seed) ){ set.seed(seed) }else if( !is.null(seed) ){ warning("NMF::nmf - Discarding value of argument `seed`: directly using NMF model supplied in `rank` instead.\n" , " If seeding is necessary, please use argument `model` pass initial model slots, which will be filled by the seeding method.") } # # pass the model via a one-off global variable # .nmf_InitModel(rank) } # replace missing method by NULL for correct dispatch if( missing(method) ) method <- NULL nmf(x, nbasis(rank), method, seed=rank, ...) } ) .nmf_InitModel <- oneoffVariable() #' Fits an NMF model using the NMF model supplied in \code{seed}, to seed the computation, #' i.e. as a starting point. #' #' This method is provided for completeness and is equivalent to #' \code{nmf(x, seed, method, ...)}. #' setMethod('nmf', signature(x='matrix', rank='NULL', method='ANY'), function(x, rank, method, seed, ...){ if( missing(seed) || !is.nmf(seed) ) stop("NMF::nmf - Argument `seed` must be an NMF model when argument `rank` is missing.") # replace missing method by NULL for correct dispatch if( missing(method) ) method <- NULL nmf(x, nbasis(seed), method, seed=seed, ...) } ) #' Method defined to ensure the correct dispatch to workhorse methods in case #' of argument \code{rank} is missing. setMethod('nmf', signature(x='matrix', rank='missing', method='ANY'), function(x, rank, method, ...){ # replace missing method by NULL for correct dispatch if( missing(method) ) method <- NULL nmf(x, NULL, method, ...) } ) #' Method defined to ensure the correct dispatch to workhorse methods in case #' of argument \code{method} is missing. #' #' @demo #' # missing method: use default algorithm #' res <- nmf(x, 3) #' setMethod('nmf', signature(x='matrix', rank='numeric', method='missing'), function(x, rank, method, ...){ nmf(x, rank, NULL, ...) } ) #' Fits an NMF model partially seeding the computation with a given matrix passed #' in \code{rank}. #' #' The matrix \code{rank} is used either as initial value for the basis or mixture #' coefficient matrix, depending on its dimension. #' #' Currently, such partial NMF model is directly used as a seed, meaning that #' the remaining part is left uninitialised, which is not accepted by all NMF algorithm. #' This should change in the future, where the missing part of the model will be #' drawn from some random distribution. #' #' Amongst built-in algorithms, only \sQuote{snmf/l} and \sQuote{snmf/r} support #' partial seeds, with only the coefficient or basis matrix initialised #' respectively. #' #' @demo #' #' # Fit a 3-rank model providing an initial value for the basis matrix #' nmf(x, rmatrix(nrow(x), 3), 'snmf/r') #' #' # Fit a 3-rank model providing an initial value for the mixture coefficient matrix #' nmf(x, rmatrix(3, ncol(x)), 'snmf/l') #' setMethod('nmf', signature(x='matrix', rank='matrix', method='ANY'), function(x, rank, method, seed, model=list(), ...) { if( is.character(model) ) model <- list(model=model) if( !is.list(model) ) stop("nmf - Invalid argument `model`: must be NULL or a named list of initial values for slots in an NMF object.") if( !hasNames(model, all=TRUE) ) stop("nmf - Invalid argument `model`: all elements must be named") # remove rank specification if necessary if( !is.null(model$rank) ){ warning("nmf - Discarding rank specification in argument `model`: use value inferred from matrix supplied in argument `rank`") model$rank <- NULL } # check compatibility of dimensions newseed <- if( nrow(rank) == nrow(x) ){ # rank is the initial value for the basis vectors if( length(model)==0L ) nmfModel(W=rank) else{ model$W <- rank do.call('nmfModel', model) } }else if( ncol(rank) == ncol(x) ){ # rank is the initial value for the mixture coefficients if( length(model)==0L ) nmfModel(H=rank) else{ model$H <- rank do.call('nmfModel', model) } }else stop("nmf - Invalid argument `rank`: matrix dimensions [",str_out(dim(x),sep=' x '),"]" , " are incompatible with the target matrix [", str_out(dim(x),sep=' x '),"].\n" , " When `rank` is a matrix it must have the same number of rows or columns as the target matrix `x`.") # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL if( missing(seed) ) seed <- NULL #nmf(x, nbasis(newseed), method, seed=seed, model=newseed, ...) nmf(x, newseed, method, seed=seed, ...) } ) #' Shortcut for \code{nmf(x, as.matrix(rank), method, ...)}. setMethod('nmf', signature(x='matrix', rank='data.frame', method='ANY'), function(x, rank, method, ...){ # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL nmf(x, as.matrix(rank), method, ...) } ) #' This method implements the interface for fitting formula-based NMF models. #' See \code{\link{nmfModel}}. #' #' Argument \code{rank} target matrix or formula environment. #' If not missing, \code{model} must be a \code{list}, a \code{data.frame} or #' an \code{environment} in which formula variables are searched for. #' setMethod('nmf', signature(x='formula', rank='ANY', method='ANY'), function(x, rank, method, ..., model=NULL){ # replace missing values by NULL values for correct dispatch if( missing(method) ) method <- NULL if( missing(rank) ) rank <- NULL # if multiple numeric rank: use nmfRestimateRank if( is.vector(rank) && is.numeric(rank) ){ if( length(rank) > 1L ){ return( nmfEstimateRank(x, rank, method, ..., model=model) ) } } # build formula based model model <- nmfModel(x, rank, data=model) nmf(attr(model, 'target'), nbasis(model), method, ..., model=model) } ) .as.numeric <- function(x){ suppressWarnings( as.numeric(x) ) } .translate.string <- function(string, dict){ res <- list() dict <- as.list(dict) if( nchar(string) == 0 ) return(res) opt.val <- TRUE last.key <- NULL buffer <- '' lapply(strsplit(string, '')[[1]], function(c){ if( c=='-' ) opt.val <<- FALSE else if( c=='+' ) opt.val <<- TRUE else if( opt.val && !is.na(.as.numeric(c)) ) buffer <<- paste(buffer, c, sep='') else if( !is.null(dict[[c]]) ){ # flush the buffer into the last key if necessary if( nchar(buffer) > 0 && !is.null(last.key) && !is.na(buffer <- .as.numeric(buffer)) ){ res[[dict[[last.key]]]] <<- buffer buffer <<- '' } res[[dict[[c]]]] <<- opt.val last.key <<- c } } ) # flush the buffer into the last key if( nchar(buffer) > 0 && !is.null(last.key) && !is.na(buffer <- .as.numeric(buffer)) ) res[[dict[[last.key]]]] <- buffer # return result return(res) } #' Error Checks in NMF Runs #' #' Auxiliary function for internal error checks in nmf results. #' #' @param object a list of lists #' @param element name of an element of the inner lists #' #' @keywords internal checkErrors <- function(object, element=NULL){ # extract error messages errors <- if( is.null(element) ){ lapply(seq_along(object), function(i){ x <- object[[i]] if( is(x, 'error') ) c(i, x) else NA }) }else{ lapply(seq_along(object), function(i){ x <- object[[i]][[element, exact=TRUE]] if( is(x, 'error') ) c(i, x) else NA }) } errors <- errors[!is.na(errors)] nerrors <- length(errors) res <- list(n = nerrors) # format messages if( nerrors ){ ierrors <- sapply(errors, '[[', 1L) msg <- sapply(errors, '[[', 2L) ierrors_unique <- ierrors[!duplicated(msg)] res$msg <- str_c(" - ", str_c("run #", ierrors_unique, ': ', msg[ierrors_unique], collapse="\n - ")) } # return error data res } ###% Performs NMF on a matrix using a given NMF method. ###% ###% This method is the entry point for NMF. It is eventually called by any definition of the \code{nmf} function. #' @param seed specification of the starting point or seeding method, which will #' compute a starting point, usually using data from the target matrix in order to #' provide a good guess. #' #' The seeding method may be specified in the following way: #' #' \describe{ #' #' \item{a \code{character} string:}{ giving the name of a \emph{registered} #' seeding method. The corresponding method will be called to compute #' the starting point. #' #' Available methods can be listed via \code{nmfSeed()}. #' See its dedicated documentation for details on each available registered methods #' (\code{\link{nmfSeed}}). #' } #' #' \item{a \code{list}:}{ giving the name of a \emph{registered} #' seeding method and, optionally, extra parameters to pass to it.} #' #' \item{a single \code{numeric}:}{ that is used to seed the random number #' generator, before generating a random starting point. #' #' Note that when performing multiple runs, the L'Ecuyer's RNG is used in order to #' produce a sequence of random streams, that is used in way that ensures #' that parallel computation are fully reproducible. #' } #' #' \item{an object that inherits from \code{\linkS4class{NMF}}:}{ it should #' contain the data of an initialised NMF model, i.e. it must contain valid #' basis and mixture coefficient matrices, directly usable by the algorithm's #' workhorse function.} #' #' \item{a \code{function}:}{ that computes the starting point. It must have #' signature \code{(object="NMF", target="matrix", ...)} and return an object that #' inherits from class \code{NMF}. #' It is recommended to use argument \code{object} as a template for the returned object, #' by only updating the basis and coefficient matrices, using \code{\link{basis<-}} and #' \code{\link{coef<-}} respectively. #' } #' #' } #' #' @param rng rng specification for the run(s). #' This argument should be used to set the the RNG seed, while still specifying the seeding #' method argument \var{seed}. #' #' @param model specification of the type of NMF model to use. #' #' It is used to instantiate the object that inherits from class \code{\linkS4class{NMF}}, #' that will be passed to the seeding method. #' The following values are supported: #' \itemize{ #' #' \item \code{NULL}, the default model associated to the NMF algorithm is #' instantiated and \code{...} is looked-up for arguments with names that #' correspond to slots in the model class, which are passed to the function #' \code{\link{nmfModel}} to instantiate the model. #' Arguments in \code{...} that do not correspond to slots are passed to the #' algorithm. #' #' \item a single \code{character} string, that is the name of the NMF model #' class to be instantiate. #' In this case, arguments in \code{...} are handled in the same way as #' when \code{model} is \code{NULL}. #' #' \item a \code{list} that contains named values that are passed to the #' function \code{\link{nmfModel}} to instantiate the model. #' In this case, \code{...} is not looked-up at all, and passed entirely to #' the algorithm. #' This means that all necessary model parameters must be specified in #' \code{model}. #' #' } #' #' \strong{Argument/slot conflicts:} #' In the case a parameter of the algorithm has the same name as a model slot, #' then \code{model} MUST be a list -- possibly empty --, if one wants this #' parameter to be effectively passed to the algorithm. #' #' If a variable appears in both arguments \code{model} and \code{\dots}, #' the former will be used to initialise the NMF model, the latter will be #' passed to the NMF algorithm. #' See code examples for an illustration of this situation. #' #' @param nrun number of runs to perform. #' It specifies the number of runs to perform. #' By default only one run is performed, except if \code{rank} is a numeric vector #' with more than one element, in which case a default of 30 runs per value of the #' rank are performed, allowing the computation of a consensus matrix that is used #' in selecting the appropriate rank (see \code{\link{consensus}}). #' #' When using a random seeding method, multiple runs are generally required to #' achieve stability and avoid \emph{bad} local minima. #' #' @param .options this argument is used to set runtime options. #' #' It can be a \code{list} containing named options with their values, or, in #' the case only boolean/integer options need to be set, a character string #' that specifies which options are turned on/off or their value, in a unix-like #' command line argument way. #' #' The string must be composed of characters that correspond to a given option #' (see mapping below), and modifiers '+' and '-' that toggle options on and off respectively. #' E.g. \code{.options='tv'} will toggle on options \code{track} and \code{verbose}, #' while \code{.options='t-v'} will toggle on option \code{track} and toggle off #' option \code{verbose}. #' #' Modifiers '+' and '-' apply to all option character found after them: #' \code{t-vp+k} means \code{track=TRUE}, \code{verbose=parallel=FALSE}, #' and \code{keep.all=TRUE}. #' The default behaviour is to assume that \code{.options} starts with a '+'. #' #' for options that accept integer values, the value may be appended to the #' option's character e.g. \code{'p4'} for asking for 4 processors or \code{'v3'} #' for showing verbosity message up to level 3. #' #' The following options are available (the characters after \dQuote{-} are those #' to use to encode \code{.options} as a string): #' \describe{ #' #' \item{debug - d}{ Toggle debug mode (default: \code{FALSE}). #' Like option \code{verbose} but with more information displayed.} #' #' \item{keep.all - k}{ used when performing multiple runs (\code{nrun}>1): if #' \code{TRUE}, all factorizations are saved and returned (default: \code{FALSE}). #' Otherwise only the factorization achieving the minimum residuals is returned.} #' #' \item{parallel - p}{ this option is useful on multicore *nix or Mac machine #' only, when performing multiple runs (\code{nrun} > 1) (default: \code{TRUE}). #' If \code{TRUE}, the runs are performed using the parallel foreach backend #' defined in argument \code{.pbackend}. #' If this is set to \code{'mc'} or \code{'par'} then \code{nmf} tries to #' perform the runs using multiple cores with package #' \code{link[doParallel]{doParallel}} -- which therefore needs to be installed. #' #' If equal to an integer, then \code{nmf} tries to perform the computation on #' the specified number of processors. #' When passing options as a string the number is appended to the option's character #' e.g. \code{'p4'} for asking for 4 processors. #' #' If \code{FALSE}, then the computation is performed sequentially using the base #' function \code{\link{sapply}}. #' #' Unlike option 'P' (capital 'P'), if the computation cannot be performed in #' parallel, then it will still be carried on sequentially. #' #' \strong{IMPORTANT NOTE FOR MAC OS X USERS:} The parallel computation is #' based on the \code{doMC} and \code{multicore} packages, so the same care #' should be taken as stated in the vignette of \code{doMC}: \emph{\dQuote{it #' is not safe to use doMC from R.app on Mac OS X. Instead, you should use doMC #' from a terminal session, starting R from the command line.}} } #' #' \item{parallel.required - P}{ Same as \code{p}, but an error is thrown if #' the computation cannot be performed in parallel or with the specified number #' of processors.} #' #' \item{shared.memory - m}{ toggle usage of shared memory (requires the #' \pkg{synchronicity} package). #' Default is as defined by \code{nmf.getOption('shared.memory')}.} #' #' \item{restore.seed - r}{ deprecated option since version 0.5.99. #' Will throw a warning if used.} #' #' \item{simplifyCB - S}{ toggle simplification of the callback results. #' Default is \code{TRUE}} #' #' \item{track - t}{ enables error tracking (default: FALSE). #' If \code{TRUE}, the returned object's slot \code{residuals} contains the #' trajectory of the objective values, which can be retrieved via #' \code{residuals(res, track=TRUE)} #' This tracking functionality is available for all built-in algorithms. #' } #' #' \item{verbose - v}{ Toggle verbosity (default: \code{FALSE}). #' If \code{TRUE}, messages about the configuration and the state of the #' current run(s) are displayed. #' The level of verbosity may be specified with an integer value, the greater #' the level the more messages are displayed. #' Value \code{FALSE} means no messages are displayed, while value \code{TRUE} #' is equivalent to verbosity level 1. #' } #' #' } #' #' @param .pbackend specification of the \code{\link[foreach]{foreach}} parallel backend #' to register and/or use when running in parallel mode. #' See options \code{p} and \code{P} in argument \code{.options} for how to #' enable this mode. #' Note that any backend that is internally registered is cleaned-up on exit, #' so that the calling foreach environment should not be affected by a call to #' \code{nmf} -- except when \code{.pbackend=NULL}. #' #' Currently it accepts the following values: #' \describe{ #' #' \item{\sQuote{par}}{ use the backend(s) defined by the package #' \code{\link[doParallel]{doParallel}};} #' \item{a numeric value}{ use the specified number of cores with \code{doParallel} #' backend;} #' \item{\sQuote{seq}}{ use the foreach sequential backend \code{doSEQ};} #' \item{\code{NULL}}{ use currently registered backend;} #' \item{\code{NA}}{ do not compute using a foreach loop -- and therefore not in #' parallel -- but rather use a call to standard \code{\link{sapply}}. #' This is useful for when developing/debugging NMF algorithms, as foreach loop #' handling may sometime get in the way. #' #' Note that this is equivalent to using \code{.options='-p'} or \code{.options='p0'}, #' but takes precedence over any option specified in \code{.options}: #' e.g. \code{nmf(..., .options='P10', .pbackend=NA)} performs all runs sequentially #' using \code{sapply}. #' Use \code{nmf.options(pbackend=NA)} to completely disable foreach/parallel computations #' for all subsequent \code{nmf} calls.} #' #' \item{\sQuote{mc}}{ identical to \sQuote{par} and defined to ensure backward #' compatibility.} #' } #' #' @param .callback Used when option \code{keep.all=FALSE} (default). It #' allows to pass a callback function that is called after each run when #' performing multiple runs (i.e. with \code{nrun>1}). #' This is useful for example if one is also interested in saving summary #' measures or process the result of each NMF fit before it gets discarded. #' After each run, the callback function is called with two arguments, the #' \code{\linkS4class{NMFfit}} object that as just been fitted and the run #' number: \code{.callback(res, i)}. #' For convenience, a function that takes only one argument or has #' signature \code{(x, ...)} can still be passed in \code{.callback}. #' It is wrapped internally into a dummy function with two arguments, #' only the first of which is passed to the actual callback function (see example #' with \code{summary}). #' #' The call is wrapped into a tryCatch so that callback errors do not stop the #' whole computation (see below). #' #' The results of the different calls to the callback function are stored in a #' miscellaneous slot accessible using the method \code{$} for \code{NMFfit} #' objects: \code{res$.callback}. #' By default \code{nmf} tries to simplify the list of callback result using #' \code{sapply}, unless option \code{'simplifyCB'} is \code{FASE}. #' #' If no error occurs \code{res$.callback} contains the list of values that #' resulted from the calling the callback function --, ordered as the fits. #' If any error occurs in one of the callback calls, then the whole computation is #' \strong{not} stopped, but the error message is stored in \code{res$.callback}, #' in place of the result. #' #' See the examples for sample code. #' #' @return The returned value depends on the run mode: #' #' \item{Single run:}{An object of class \code{\linkS4class{NMFfit}}.} #' #' \item{Multiple runs, single method:}{When \code{nrun > 1} and \code{method} #' is not \code{list}, this method returns an object of class \code{\linkS4class{NMFfitX}}.} #' #' \item{Multiple runs, multiple methods:}{When \code{nrun > 1} and \code{method} #' is a \code{list}, this method returns an object of class \code{\linkS4class{NMFList}}.} #' #' @demo #' #' # default fit #' res <- nmf(x, 2) #' summary(res, class=groups) #' #' # run default algorithm multiple times (only keep the best fit) #' res <- nmf(x, 3, nrun=10) #' res #' summary(res, class=groups) #' #' # run default algorithm multiple times keeping all the fits #' res <- nmf(x, 3, nrun=10, .options='k') #' res #' summary(res, class=groups) #' #' ## Note: one could have equivalently done #' # res <- nmf(V, 3, nrun=10, .options=list(keep.all=TRUE)) #' #' # use a method that fit different model #' res <- nmf(x, 2, 'nsNMF') #' fit(res) #' #' # pass parameter theta to the model via `...` #' res <- nmf(x, 2, 'nsNMF', theta=0.2) #' fit(res) #' #' ## handling arguments in `...` and model parameters #' myfun <- function(x, start, theta=100){ cat("theta in myfun=", theta, "\n\n"); start } #' # no conflict: default theta #' fit( nmf(x, 2, myfun) ) #' # no conlfict: theta is passed to the algorithm #' fit( nmf(x, 2, myfun, theta=1) ) #' # conflict: theta is used as model parameter #' fit( nmf(x, 2, myfun, model='NMFns', theta=0.1) ) #' # conflict solved: can pass different theta to model and algorithm #' fit( nmf(x, 2, myfun, model=list('NMFns', theta=0.1), theta=5) ) #' #' ## USING SEEDING METHODS #' #' # run default algorithm with the Non-negative Double SVD seeding method ('nndsvd') #' res <- nmf(x, 3, seed='nndsvd') #' #' ## Note: partial match also works #' identical(res, nmf(x, 3, seed='nn')) #' #' # run nsNMF algorithm, fixing the seed of the random number generator #' res <- nmf(x, 3, 'nsNMF', seed=123456) #' nmf.equal(nmf(x, 3, 'nsNMF', seed=123456), res) #' #' # run default algorithm specifying the starting point following the NMF standard model #' start.std <- nmfModel(W=matrix(0.5, n, 3), H=matrix(0.2, 3, p)) #' nmf(x, start.std) #' #' # to run nsNMF algorithm with an explicit starting point, this one #' # needs to follow the 'NMFns' model: #' start.ns <- nmfModel(model='NMFns', W=matrix(0.5, n, 3), H=matrix(0.2, 3, p)) #' nmf(x, start.ns) #' # Note: the method name does not need to be specified as it is infered from the #' # when there is only one algorithm defined for the model. #' #' # if the model is not appropriate (as defined by the algorihtm) an error is thrown #' # [cf. the standard model doesn't include a smoothing parameter used in nsNMF] #' try( nmf(x, start.std, method='nsNMF') ) #' #' ## Callback functions #' # Pass a callback function to only save summary measure of each run #' res <- nmf(x, 3, nrun=3, .callback=summary) #' # the callback results are simplified into a matrix #' res$.callback #' res <- nmf(x, 3, nrun=3, .callback=summary, .opt='-S') #' # the callback results are simplified into a matrix #' res$.callback #' #' # Pass a custom callback function #' cb <- function(obj, i){ if( i %% 2 ) sparseness(obj) >= 0.5 } #' res <- nmf(x, 3, nrun=3, .callback=cb) #' res$.callback #' #' # Passs a callback function which throws an error #' cb <- function(){ i<-0; function(object){ i <<- i+1; if( i == 1 ) stop('SOME BIG ERROR'); summary(object) }} #' res <- nmf(x, 3, nrun=3, .callback=cb()) #' #' ## PARALLEL COMPUTATIONS #' # try using 3 cores, but use sequential if not possible #' res <- nmf(x, 3, nrun=3, .options='p3') #' #' # force using 3 cores, error if not possible #' res <- nmf(x, 3, nrun=3, .options='P3') #' #' # use externally defined cluster #' library(parallel) #' cl <- makeCluster(6) #' res <- nmf(x, 3, nrun=3, .pbackend=cl) #' #' # use externally registered backend #' registerDoParallel(cl) #' res <- nmf(x, 3, nrun=3, .pbackend=NULL) #' setMethod('nmf', signature(x='matrix', rank='numeric', method='NMFStrategy'), #function(x, rank, method, seed='random', nrun=1, keep.all=FALSE, optimized=TRUE, init='NMF', track, verbose, ...) function(x, rank, method , seed=nmf.getOption('default.seed'), rng = NULL , nrun=if( length(rank) > 1L ) 30 else 1, model=NULL, .options=list() , .pbackend=nmf.getOption('pbackend') , .callback=NULL #callback function called after a run , ...) { fwarning <- function(...) nmf_warning('nmf', ...) fstop <- function(...) nmf_stop('nmf', ...) n <- NULL RNGobj <- NULL # if options are given as a character string, translate it into a list of booleans if( is.character(.options) ){ .options <- .translate.string(.options, c(t='track', v='verbose', d='debug' , p='parallel', P='parallel.required' , k='keep.all', r='restore.seed', f='dry.run' , g='garbage.collect' , c='cleanup', S='simplifyCB' , R='RNGstream', m='shared.memory')) } # get seeding method from the strategy's defaults if needed seed <- defaultArgument(seed, method, nmf.getOption('default.seed'), force=is.null(seed)) .method_defaults <- method@defaults .method_defaults$seed <- NULL # # RNG specification if( isRNGseed(seed) ){ if( !is.null(rng) ) warning("Discarding RNG specification in argument `rng`: using those passed in argument `seed`.") rng <- seed seed <- 'random' } # # setup verbosity options debug <- if( !is.null(.options$debug) ) .options$debug else nmf.getOption('debug') verbose <- if( debug ) Inf else if( !is.null(.options$verbose) ) .options$verbose else nmf.getOption('verbose') # show call in debug mode if( debug ){ .ca <- match.call() message('# NMF call: ', paste(capture.output(print(.ca)), collapse="\n ")) } # nmf over a range of values: pass the call to nmfEstimateRank if( length(rank) > 1 ){ if( verbose <= 1 ) .options$verbose <- FALSE return( nmfEstimateRank(x, range = rank, method = method, nrun = nrun , seed = seed, rng = rng, model = model , .pbackend = .pbackend, .callback = .callback , verbose=verbose, .options=.options, ...) ) } .OPTIONS <- list() # cleanup on exit .CLEANUP <- .options$cleanup %||% TRUE # tracking of objective value .OPTIONS$track <- if( !is.null(.options$track) ) .options$track else nmf.getOption('track') # dry run dry.run <- .options$dry.run %||% FALSE # call the garbage collector regularly opt.gc <- if( !is.null(.options$garbage.collect) ) .options$garbage.collect else nmf.getOption('gc') if( is.logical(opt.gc) && opt.gc ) opt.gc <- ceiling(max(nrun,50) / 3) .options$garbage.collect <- opt.gc # keep results from all runs? keep.all <- .options$keep.all %||% FALSE # shared memory? shared.memory <- if( !is.null(.options$shared.memory) ) .options$shared.memory else nmf.getOption('shared.memory') # use RNG stream .options$RNGstream <- .options$RNGstream %||% TRUE # discard .callback when not used if( is.function(.callback) ){ w <- if( nrun==1 ) "discarding argument `.callback`: not used when `nrun=1`." else if( keep.all ) "discarding argument `.callback`: not used when option `keep.all=TRUE`." if( !is.null(w) ){ .callback <- NULL fwarning(w, immediate.=TRUE) } # wrap into another function if necessary if( is.function(.callback) ){ # default is to simplify .options$simplifyCB <- .options$simplifyCB %||% TRUE args <- formals(.callback) if( length(args) <= 2L ){ if( length(args) < 2L || '...' %in% names(args) ){ .CALLBACK <- .callback .callback <- function(object, i) .CALLBACK(object) } } # define post-processing function processCallback <- function(res){ # check errors errors <- checkErrors(res, '.callback') if( errors$n > 0 ){ fwarning("All NMF fits were successful but ", errors$n, "/", nrun, " callback call(s) threw an error.\n" ,"# ", if(errors$n>10) "First 10 c" else "C", "allback error(s) thrown:\n" , errors$msg ) } # add callback values to result list sapply(res, '[[', '.callback' , simplify=.options$simplifyCB && errors$n == 0L) } } } ## ROLLBACK PROCEDURE exitSuccess <- exitCheck() on.exit({ if( verbose > 1 ) message("# NMF computation exit status ... ", if( exitSuccess() ) 'OK' else 'ERROR') if( verbose > 2 ){ if( exitSuccess() ){ message('\n## Running normal exit clean up ... ') }else{ message('\n## Running rollback clean up ... ') } } }, add=TRUE) # RNG restoration on error .RNG_ORIGIN <- getRNG() on.exit({ if( !exitSuccess() ){ if( verbose > 2 ) message("# Restoring RNG settings ... ", appendLF=verbose>3) setRNG(.RNG_ORIGIN) if( verbose > 3 ) showRNG(indent=' #') if( verbose > 2 ) message("OK") } }, add=TRUE) # Set debug/verbosity option just for the time of the run old.opt <- nmf.options(debug=debug, verbose=verbose, shared.memory = shared.memory); on.exit({ if( verbose > 2 ) message("# Restoring NMF options ... ", appendLF=FALSE) nmf.options(old.opt) if( verbose > 2 ) message("OK") }, add=TRUE) # make sure rank is an integer rank <- as.integer(rank) if( length(rank) != 1 ) fstop("invalid argument 'rank': must be a single numeric value") if( rank < 1 ) fstop("invalid argument 'rank': must be greater than 0") # option 'restore.seed' is deprecated if( !is.null(.options$restore.seed) ) fwarning("Option 'restore.seed' is deprecated and discarded since version 0.5.99.") if( verbose ){ if( dry.run ) message("*** fake/dry-run ***") message("NMF algorithm: '", name(method), "'") } ##START_MULTI_RUN # if the number of run is more than 1, then call itself recursively if( nrun > 1 ) { if( verbose ) message("Multiple runs: ", nrun) if( verbose > 3 ){ cat("## OPTIONS:\n") sapply(seq_along(.options) , function(i){ r <- i %% 4 cat(if(r!=1) '\t| ' else "# ", names(.options)[i],': ', .options[[i]], sep='') if(r==0) cat("\n# ") }) if( length(.options) %% 4 != 0 )cat("\n") } ## OPTIONS: parallel computations # option require-parallel: parallel computation is required if TRUE or numeric != 0 opt.parallel.required <- !is.null(.options$parallel.required) && .options$parallel.required # determine specification for parallel computations opt.parallel.spec <- if( opt.parallel.required ){ # priority over try-parallel # option require-parallel implies and takes precedence over option try-parallel .options$parallel.required }else if( !is.null(.options$parallel) ) .options$parallel # priority over .pbackend else !is_NA(.pbackend) # required only if backend is not trivial # determine if one should run in parallel at all: TRUE or numeric != 0, .pbackend not NA opt.parallel <- !is_NA(.pbackend) && (isTRUE(opt.parallel.spec) || opt.parallel.spec) ## if( opt.parallel ){ if( verbose > 1 ) message("# Setting up requested `foreach` environment: " , if( opt.parallel.required ) 'require-parallel' else 'try-parallel' , ' [', quick_str(.pbackend) , ']') # switch doMC backend to doParallel if( isString(.pbackend, 'MC', ignore.case=TRUE) ){ .pbackend <- 'par' } # try setting up parallel foreach backend oldBackend <- setupBackend(opt.parallel.spec, .pbackend, !opt.parallel.required, verbose=verbose) opt.parallel <- !isFALSE(oldBackend) # setup backend restoration if using one different from the current one if( opt.parallel && !is_NA(oldBackend) ){ on.exit({ if( verbose > 2 ){ message("# Restoring previous foreach backend '", getDoBackendName(oldBackend) ,"' ... ", appendLF=FALSE) } setDoBackend(oldBackend, cleanup=TRUE) if( verbose > 2 ) message('OK') }, add=TRUE) }# # From this point, the backend is registered # => one knows if we'll run a sequential or parallel foreach loop .MODE_SEQ <- is.doSEQ() MODE_PAR <- .MODE_PAR <- !.MODE_SEQ } # check seed method: fixed values are not sensible -> warning .checkRandomness <- FALSE if( is.nmf(seed) && !is.empty.nmf(seed) ){ .checkRandomness <- TRUE } # start_RNG_all # if the seed is numerical or a rstream object, then use it to set the # initial state of the random number generator: # build a sequence of RNGstreams: if no suitable seed is provided # then the sequence use a random seed generated with a single draw # of the current active RNG. If the seed is valid, then the # # setup the RNG sequence # override with standard RNG if .options$RNGstream=FALSE resetRNG <- NULL if( !.options$RNGstream && (!opt.parallel || .MODE_SEQ) ){ .RNG.seed <- rep(list(NULL), nrun) if( isNumber(rng) ){ resetRNG <- getRNG() if( verbose > 2 ) message("# Force using current RNG settings seeded with: ", rng) set.seed(rng) }else if( verbose > 2 ) message("# Force using current RNG settings") }else{ .RNG.seed <- setupRNG(rng, n = nrun, verbose=verbose) # restore the RNG state on exit as after RNGseq: # - if no seeding occured then the RNG has still been drawn once in RNGseq # which must be reflected so that different unseeded calls use different RNG states # - one needs to restore the RNG because it switched to L'Ecuyer-CMRG. resetRNG <- getRNG() } stopifnot( length(.RNG.seed) == nrun ) # update RNG settings on exit if necessary # and only if no error occured if( !is.null(resetRNG) ){ on.exit({ if( exitSuccess() ){ if( verbose > 2 ) message("# Updating RNG settings ... ", appendLF=FALSE) setRNG(resetRNG) if( verbose > 2 ) message("OK") if( verbose > 3 ) showRNG() } }, add=TRUE) } #end_RNG_all ####FOREACH_NMF if( opt.parallel ){ if( verbose ){ if( verbose > 1 ) message("# Using foreach backend: ", getDoParName() ," [version ", getDoParVersion(),"]") # show number of processes if( getDoParWorkers() == 1 ) message("Mode: sequential [foreach:",getDoParName(),"]") else message("Mode: parallel ", str_c("(", getDoParWorkers(), '/', parallel::detectCores()," core(s))")) } # check shared memory capability .MODE_SHARED <- !keep.all && setupSharedMemory(verbose) # setup temporary directory when not keeping all fits if( !keep.all || verbose ){ NMF_TMPDIR <- setupTempDirectory(verbose) # delete on exit if( .CLEANUP ){ on.exit({ if( verbose > 2 ) message("# Deleting temporary directory '", NMF_TMPDIR, "' ... ", appendLF=FALSE) unlink(NMF_TMPDIR, recursive=TRUE) if( verbose > 2 ) message('OK') }, add=TRUE) } } run.all <- function(x, rank, method, seed, model, .options, ...){ ## 1. SETUP # load some variables from parent environment to ensure they # are exported in the foreach loop MODE_SEQ <- .MODE_SEQ MODE_SHARED <- .MODE_SHARED verbose <- verbose keep.all <- keep.all opt.gc <- .options$garbage.collect CALLBACK <- .callback .checkRandomness <- .checkRandomness # check if single or multiple host(s) hosts <- unique(getDoParHosts()) if( verbose > 2 ) message("# Running on ", length(hosts), " host(s): ", str_out(hosts)) SINGLE_HOST <- length(hosts) <= 1L MODE_SHARED <- MODE_SHARED && SINGLE_HOST if( verbose > 2 ) message("# Using shared memory ... ", MODE_SHARED) # setup mutex evaluation function mutex_eval <- if( MODE_SHARED ) ts_eval(verbose = verbose > 4) else force # Specific thing only if one wants only the best result if( !keep.all ){ NMF_TMPDIR <- NMF_TMPDIR # - Define the shared memory objects vOBJECTIVE <- gVariable(as.numeric(NA), MODE_SHARED) # the consensus matrix is computed only if not all the results are kept vCONSENSUS <- gVariable(matrix(0, ncol(x), ncol(x)), MODE_SHARED) } ## 2. RUN # ensure that the package NMF is in each worker's search path .packages <- setupLibPaths('NMF', verbose>3) # export all packages that contribute to NMF registries, # e.g., algorithms or seeding methods. # This is important so that these can be found in worker nodes # for non-fork clusters. if( !is.null(contribs <- registryContributors(package = 'NMF')) ){ .packages <- c(.packages, contribs) } # export dev environment if in dev mode # .export <- if( isDevNamespace('NMF') && !is.doSEQ() ) ls(asNamespace('NMF')) # in parallel mode: verbose message from each run are only shown in debug mode .options$verbose <- FALSE if( verbose ){ if( debug || (.MODE_SEQ && verbose > 1) ) .options$verbose <- verbose if( (!.MODE_SEQ && !debug) || (.MODE_SEQ && verbose == 1) ){ if( verbose == 1 ){ # create progress bar pbar <- txtProgressBar(0, nrun+1, width=50, style=3, title='Runs:' , shared=NMF_TMPDIR) }else{ cat("Runs: ") } } } # get options from master process to pass to workers nmf.opts <- nmf.options() # load extra required packages for shared mode if( MODE_SHARED ) .packages <- c(.packages, 'bigmemory', 'synchronicity') res.runs <- foreach(n=1:nrun , RNGobj = .RNG.seed , .verbose = debug , .errorhandling = 'pass' , .packages = .packages # , .export = .export # , .options.RNG=.RNG.seed ) %dopar% { #START_FOREACH_LOOP # Pass options from master process nmf.options(nmf.opts) # in mode sequential or debug: show details for each run if( MODE_SEQ && verbose > 1 ) cat("\n## Run: ",n, "/", nrun, "\n", sep='') # set the RNG if necessary and restore after each run if( MODE_SEQ && verbose > 2 ) message("# Setting up loop RNG ... ", appendLF=FALSE) setRNG(RNGobj, verbose=verbose>3 && MODE_SEQ) if( MODE_SEQ && verbose > 2 ) message("OK") # limited verbosity in simple mode if( verbose && !(MODE_SEQ && verbose > 1)){ if( verbose >= 2 ) mutex_eval( cat('', n) ) else{ # update progress bar (in mutex) mutex_eval(setTxtProgressBar(pbar, n)) # } } # check RNG changes if( n == 1 && .checkRandomness ){ .RNGinit <- getRNG() } # fit a single NMF model res <- nmf(x, rank, method, nrun=1, seed=seed, model=model, .options=.options, ...) if( n==1 && .checkRandomness && rng.equal(.RNGinit) ){ warning("NMF::nmf - You are running multiple non-random NMF runs with a fixed seed") } # if only the best fit must be kept then update the shared objects if( !keep.all ){ # initialise result list resList <- list(filename=NA, residuals=NA, .callback=NULL) ##LOCK_MUTEX mutex_eval({ # check if the run found a better fit .STATIC.err <- vOBJECTIVE() # retrieve approximation error err <- deviance(res) if( is.na(.STATIC.err) || err < .STATIC.err ){ if( n>1 && verbose ){ if( MODE_SEQ && verbose > 1 ) cat("## Better fit found [err=", err, "]\n") else if( verbose >= 2 ) cat('*') } # update residuals vOBJECTIVE(err) # update best fit on disk: use pid if not using shared memory resfile <- hostfile("fit", tmpdir=NMF_TMPDIR, fileext='.rds', pid=!MODE_SHARED) if( MODE_SEQ && verbose > 2 ) message("# Serializing fit object in '", resfile, "' ... ", appendLF=FALSE) saveRDS(res, file=resfile, compress=FALSE) if( MODE_SEQ && verbose > 2 ){ message(if( file.exists(resfile) ) 'OK' else 'ERROR') } # store the filename and achieved objective value in the result list resList$filename <- resfile resList$residuals <- err } ## CONSENSUS # update the consensus matrix if( MODE_SHARED && SINGLE_HOST ){ # on single host: shared memory already contains consensus vCONSENSUS(vCONSENSUS() + connectivity(res, no.attrib=TRUE)) }else{ # on multiple hosts: must return connectivity and aggregate at the end resList$connectivity <- connectivity(res, no.attrib=TRUE) } ## CALLBACK # call the callback function if necessary (return error as well) if( is.function(CALLBACK) ){ resList$.callback <- tryCatch(CALLBACK(res, n), error=function(e) e) } }) ##END_LOCK_MUTEX # discard result object res <- NULL # return description list res <- resList } # garbage collection if requested if( opt.gc && n %% opt.gc == 0 ){ if( verbose > 2 ){ if( MODE_SEQ ) message("# Call garbage collector") else{ mutex_eval( cat('%') ) } } gc(verbose= MODE_SEQ && verbose > 3) } # return the result res } ## END_FOREACH_LOOP if( verbose && !debug ){ if( verbose >= 2 ) cat(" ... DONE\n") else{ setTxtProgressBar(pbar, nrun+1) pbar$kill(.CLEANUP) } } ## 3. CHECK FIT ERRORS errors <- checkErrors(res.runs) if( errors$n > 0 ){ fstop(errors$n,"/", nrun, " fit(s) threw an error.\n" ,"# Error(s) thrown:\n", errors$msg) } ## 4. WRAP UP if( keep.all ){ # result is a list of fits # directly return the list of fits res <- res.runs }else{ # result is a list of lists: filename, .callback # loop over the result files to find the best fit if( verbose > 2 ) message("# Processing partial results ... ", appendLF=FALSE) ffstop <- function(...){ message('ERROR'); fstop(...) } # get best fit index idx <- which.min(sapply(res.runs, '[[', 'residuals')) if( length(idx) == 0L ) ffstop("Unexpected error: no partial result seem to have been saved.") resfile <- res.runs[[idx]]$filename # check existence of the result file if( !file_test('-f', resfile) ) ffstop("could not find temporary result file '", resfile, "'") # update res with a better fit res <- readRDS(resfile) if( !isNMFfit(res) ) ffstop("invalid object found in result file '", resfile, "'") if( verbose > 2 ) message('OK') # wrap the result in a list: fit + consensus res <- list(fit=res, consensus=NA) # CONSENSUS MATRIX if( !is.null(res.runs[[1]]$connectivity) ){ # not MODE_SHARED # aggregate connectivity matrices con <- matrix(0, ncol(x), ncol(x)) sapply(res.runs, function(x){ con <<- con + x$connectivity }) res$consensus <- con }else{ # in MODE_SHARED: get consensus from global shared variable res$consensus <- vCONSENSUS() cn <- colnames(x) if( is.null(cn) ) dimnames(res$consensus) <- NULL else dimnames(res$consensus) <- list(cn, cn) } # CALLBACKS if( !is.null(.callback) ){ res$.callback <- processCallback(res.runs) } } ## if( MODE_SEQ && verbose>1 ) cat("## DONE\n") # return result res } }####END_FOREACH_NMF else{####SAPPLY_NMF run.all <- function(x, rank, method, seed, model, .options, ...){ # by default force no verbosity from the runs .options$verbose <- FALSE if( verbose ){ message("Mode: sequential [sapply]") if( verbose > 1 ){ # pass verbosity options in this case .options$verbose <- verbose } } ## 1. SETUP # define static variables for the case one only wants the best result if( !keep.all ){ # statis list with best result: fit, residual, consensus best.static <- list(fit=NULL, residuals=NA, consensus=matrix(0, ncol(x), ncol(x))) } ## 2. RUN: # perform a single run `nrun` times if( verbose == 2 ){ showRNG() } if( verbose && !debug ) cat('Runs:') res.runs <- mapply(1:nrun, .RNG.seed, FUN=function(n, RNGobj){ #start_verbose if( verbose ){ # in mode verbose > 1: show details for each run if( verbose > 1 ){ cat("\n## Run: ",n, "/", nrun, "\n", sep='') }else{ # otherwise only some details for the first run cat('', n) } }#end_verbose # set the RNG for each run if( verbose > 2 ) message("# Setting up loop RNG ... ", appendLF=FALSE) setRNG(RNGobj, verbose=verbose>3) if( verbose > 2 ) message("OK") # check RNG changes if( n == 1 && .checkRandomness ){ .RNGinit <- getRNG() } # fit a single NMF model res <- nmf(x, rank, method, nrun=1, seed=seed, model=model, .options=.options, ...) if( n==1 && .checkRandomness && rng.equal(.RNGinit) ){ warning("NMF::nmf - You are running multiple non-random NMF runs with a fixed seed" , immediate.=TRUE) } if( !keep.all ){ # initialise result list resList <- list(residuals=NA, .callback=NULL) # check if the run found a better fit err <- residuals(res) best <- best.static$residuals if( is.na(best) || err < best ){ if( verbose ){ if( verbose > 1L ) cat("## Updating best fit [deviance =", err, "]\n", sep='') else cat('*') } # update best fit (only if necessary) best.static$fit <<- res best.static$residuals <<- err resList$residuals <- err } # update the static consensus matrix (only if necessary) best.static$consensus <<- best.static$consensus + connectivity(res, no.attrib=TRUE) # call the callback function if necessary if( !is.null(.callback) ){ resList$.callback <- tryCatch(.callback(res, n), error=function(e) e) } # reset the result to NULL res <- resList } # garbage collection if requested if( opt.gc && n %% opt.gc == 0 ){ if( verbose > 1 ) message("# Call garbage collection NOW") else if( verbose ) cat('%') gc(verbose = verbose > 3) } if( verbose > 1 ) cat("## DONE\n") # return the result res }, SIMPLIFY=FALSE) ## if( verbose && !debug ) cat(" ... DONE\n") ## 3. ERROR CHECK / WRAP UP if( keep.all ){ res <- res.runs }else{ res <- list(fit=best.static$fit, consensus=best.static$consensus) # CALLBACKS if( !is.null(.callback) ){ res$.callback <- processCallback(res.runs) } } res } }####END_SAPPLY_NMF ####END_DEFINE_RUN # perform all the NMF runs t <- system.time({res <- run.all(x=x, rank=rank, method=method, seed=seed, model=model, .options, ...)}) if( verbose && !debug ){ cat("System time:\n") print(t) } if( keep.all ){ # when keeping all the fits: join the results into an NMFfitXn object # TODO: improve memory management here res <- NMFfitX(res, runtime.all=t) return( exitSuccess(res) ) }else{# if one just want the best result only return the best # ASSERT the presence of the result stopifnot( !is.null(res$fit) ) # ASSERT the presence of the consensus matrix stopifnot( !is.null(res$consensus) ) res.final <- NMFfitX(res$fit, consensus=res$consensus/nrun , runtime.all=t, nrun=as.integer(nrun) , rng1=.RNG.seed[[1]]) # ASSERT and add callback if necessary if( !is.null(.callback) ){ stopifnot( !is.null(res$.callback) ) res.final$.callback <- res$.callback } return( exitSuccess(res.final) ) } }##END_MULTI_RUN # start_RNG # show original RNG settings in verbose > 2 if( verbose > 3 ){ message("# ** Current RNG settings:") showRNG() } # do something if the RNG was actually changed newRNG <- getRNG() .RNG.seed <- setupRNG(rng, 1, verbose=verbose-1) # setup restoration if( isRNGseed(rng) ){ if( verbose > 3 ) showRNG() # restore RNG settings on.exit({ if( verbose > 2 ) message("# Restoring RNG settings ... ", appendLF=FALSE) setRNG(newRNG) if( verbose > 2 ) message("OK") if( verbose > 3 ) showRNG() }, add=TRUE) } #end_RNG # CHECK PARAMETERS: # test for negative values in x only if the method is not mixed if( !is.mixed(method) && min(x, na.rm = TRUE) < 0 ) fstop('Input matrix ', substitute(x),' contains some negative entries.'); # test if one row contains only zero entries if( min(rowSums(x, na.rm = TRUE), na.rm = TRUE) == 0 ) fstop('Input matrix ', substitute(x),' contains at least one null or NA-filled row.'); # a priori the parameters for the run are all the one in '...' # => expand with the strategy's defaults (e.g., maxIter) parameters.method <- expand_list(list(...), .method_defaults) # if( is.nmf(seed) ){ if( !is.null(model) ) fwarning("Discarding argument `model`: directly using NMF model supplied in argument `seed`") # if the seed is a NMFfit object then only use the fit (i.e. the NMF model) # => we want a fresh and clean NMFfit object if( isNMFfit(seed) ) seed <- fit(seed) # Wrap up the seed into a NMFfit object seed <- NMFfit(fit=seed, seed='NMF') } else if( !inherits(seed, 'NMFfit') ){ ## MODEL INSTANTIATION : # default NMF model is retrieved from the NMF strategy .modelClass <- modelname(method) # if a character string then use this type of NMF model, but still look # for slots in `...` if( is.character(model) ){ .modelClass <- model model <- NULL } # some of the instantiation parameters are set internally # TODO: change target into x (=> impact on nmfModel ? parameters.model.internal <- list(rank=rank, target=0) parameters.model <- list() init <- if( is.nmf(model) ){ model }else{ # if 'model' is NULL: initialization parameters are searched in '...' if( is.null(model) ){ # extract the parameters from '...' that correspond to slots in the given class stopifnot( isNMFclass(.modelClass) ) parameters <- .extract.slots.parameters(.modelClass, parameters.method) # restrict parameters.method to the ones that won't be used to instantiate the model overriden <- is.element(names(parameters$slots), names(parameters.model.internal)) parameters.method <- c(parameters$extra, parameters$slots[overriden]) #- the model parameters come from the remaining elements parameters.model <- c(model=.modelClass, parameters$slots) } else if( is.list(model) ){ # otherwise argument 'model' must be a list # if the list is not empty then check all elements are named and # not conflicting with the internally set values if( length(model) > 0 ){ # all the elements must be named if( !hasNames(model, all=TRUE) ) fstop("Invalid argument `model` [elements must all be named]. See ?nmf.") # warn the user if some elements are conflicting and won't be used overriden <- is.element(names(model), names(parameters.model.internal)) if( any(overriden) ) warning("NMF::nmf - Model parameter(s) [" , str_out(model[overriden], use.names=TRUE, max=Inf) , "] discarded. Used internally set value(s) [" , str_out(parameters.model.internal[names(model[overriden])], use.names=TRUE, max=Inf) , "]" , call.=FALSE) } # add default model class if necessary if( is.null(model$model) ) model$model <- .modelClass # all the instantiation parameters come from argument 'model' parameters.model <- model }else{ fstop("Invalid argument 'model' [expected NULL, a character string, or a list to set slots in the NMF model class '",.modelClass,"']. See ?nmf.") } #- force the value of the internally set arguments for the instantiation of the model parameters.model <- .merge.override(parameters.model, parameters.model.internal) # at this point 'init' should be the list of the initialization parameters if( !is.list(parameters.model) ){ fstop("Unexpected error: object 'parameters.model' must be a list") } if( !is.element('model', names(parameters.model)) ){ fstop("Unexpected error: object 'parameters.model' must contain an element named 'model'") } parameters.model } ## SEEDING: # the seed must either be an instance of class 'NMF', the name of a seeding method as a character string # or a list of parameters to pass to the 'seed' function. parameters.seed <- list() seed.method <- NULL if( (is.character(seed) && length(seed) == 1) || is.numeric(seed) || is.null(seed) # || is(seed, 'rstream') ) seed.method <- seed else if( is.function(seed) ) seed.method <- seed else if( is.list(seed) ){ # seed is a list... if( !is.null(seed$method) ){ # 'seed' must contain an element giving the method... seed.method <- seed$method parameters.seed <- seed[-which(names(seed)=='method')] } else if ( is.null(names(seed)) || names(seed)[1] == '' ){ # ... or the first element must be a method seed.method <- seed[[1]] if( length(seed) > 1 ) parameters.seed <- seed[2:length(seed)] } else fstop("Invalid parameter: list 'seed' must contain the seeding method through its first element or through an element named 'method' [", str_desc(seed, 2L), "]") # check validity of the method provided via the list if( !is.function(seed.method) && !(is.character(seed.method) && length(seed.method)==1) ) fstop("The seeding method provided by parameter 'seed' [", str_desc(seed.method), "] is invalid: a valid function or a character string is expected") } else fstop("Invalid parameter 'seed'. Acceptable values are:\n\t- ", paste("an object that inherits from class 'NMF'" , "the name of a seeding method (see ?nmfSeed)" , "a valid seed method definition" , "a list containing the seeding method (i.e. a function or a character string) as its first element\n\tor as an element named 'method' [and optionnally extra arguments it will be called with]" , "a numerical value used to set the seed of the random generator" , "NULL to directly pass the model instanciated from arguments 'model' or '...'." , sep="\n\t- ")) # call the 'seed' function passing the necessary parameters if( verbose ) message("NMF seeding method: ", if( is.character(seed.method) || is.numeric(seed.method) ) seed.method else if( is.null(seed.method) ) 'NULL' else if( !is.null(attr(seed.method, 'name')) ) attr(seed.method, 'name') else if( is.function(seed.method) ) '' else NA) #seed <- do.call(getGeneric('seed', package='NMF') seed <- do.call(getGeneric('seed') , c(list(x=x, model=init, method=seed.method), parameters.seed)) # check the validity of the seed if( !inherits(seed, 'NMFfit') ) fstop("The seeding method function should return class 'NMF' [" , if( is.character(seed.method) ) paste('method "', seed.method, "' ", sep='') else NULL , "returned class: '", class(seed), "']") } # -> at this point the 'seed' object is an instance of class 'NMFfit' nmf.debug('nmf', "Seed is of class: '", class(seed), "'") # ASSERT just to be sure if( !inherits(seed, 'NMFfit') ) fstop("Invalid class '", class(seed), "' for the computed seed: object that inherits from class 'NMFfit' expected.") # check the consistency of the NMF model expected by the algorithm and # the one defined by the seed #if( none( sapply(model(method), function(c) extends(model(seed), c)) ) ) if( all( !inherits(fit(seed), modelname(method)) ) ) fstop("Invalid NMF model '", modelname(seed),"': algorithm '", name(method), "' expects model(s) " , paste(paste("'", modelname(method),"'", sep=''), collapse=', ') , " or extension.") # get the complete seeding method's name seed.method <- seeding(seed) ## FINISH SETUP OF THE SEED OBJECT: store some data within the seed so # that strategy methods can access them directly algorithm(seed) <- name(method) # algorithm name seed@distance <- objective(method) # distance name seed@parameters <- parameters.method # extra parameters run.options(seed) <- nmf.options() # set default run options run.options(seed, 'error.track') <- .OPTIONS$track if( is.numeric(.OPTIONS$track) ) run.options(seed, 'track.interval') <- .OPTIONS$track run.options(seed, 'verbose') <- verbose # store ultimate nmf() call seed@call <- match.call() ## ## print options if in verbose > 3 if( verbose > 3 ){ cat("## OPTIONS:\n") sapply(seq_along(.options) , function(i){ r <- i %% 4 cat(if(r!=1) '\t| ' else "# ", names(.options)[i],': ', .options[[i]], sep='') if(r==0) cat("\n") }) if( length(.options) %% 4 != 0 )cat("\n") } ## run parameters: parameters.run <- c(list(object=method, y=x, x=seed), parameters.method) ## Compute the initial residuals if tracking is enabled init.resid <- if( .OPTIONS$track && !is.partial.nmf(seed) ){ do.call('deviance', parameters.run) } ## RUN NMF METHOD: # call the strategy's run method [and time it] t <- system.time({ res <- if( !dry.run ){ do.call('run', parameters.run) }else{ seed } }) ## WRAP/CHECK RESULT res <- .wrapResult(x, res, seed, method=method, seed.method=seed.method, t) if( !isNMFfit(res) ){ # stop if error fstop(res) } ## ## CLEAN-UP + EXTRAS: # add extra information to the object # slot 'parameters' if( length(res@parameters) == 0L && length(parameters.method)>0L ) res@parameters <- parameters.method # last residuals if( length(residuals(res)) == 0 && !is.partial.nmf(seed) ){ parameters.run$x <- res residuals(res, niter=niter(res)) <- do.call('deviance', parameters.run) } # first residual if tracking is enabled if( .OPTIONS$track && !is.null(init.resid) ){ if( !hasTrack(res, niter=0) ) residuals(res, track=TRUE) <- c('0'=init.resid, residuals(res, track=TRUE)) } if( length(residuals(res)) && is.na(residuals(res)) ) warning("NMF residuals: final objective value is NA") res@runtime <- t # return the result exitSuccess(res) }) # wrap result .wrapResult <- function(x, res, seed, method, seed.method, t){ ## wrap into an NMFfit object (update seed) if( !isNMFfit(res) ){ # extract expression data if necessary if( is(res, 'ExpressionSet') ) res <- exprs(res) if( is(x, 'ExpressionSet') ) x <- exprs(x) # wrap if( is.matrix(res) ){ if( ncol(res) == ncol(x) ){# partial fit: coef # force dimnames colnames(res) <- colnames(x) res <- nmfModel(H=res) }else if( nrow(res) == nrow(x) ){# partial fit: basis # force dimnames rownames(res) <- rownames(x) res <- nmfModel(W=res) } }else if( is.list(res) ){ # build NMF model from result list res <- do.call('nmfModel', res) } # substitute model in fit object if( is.nmf(res) ){ tmp <- seed fit(tmp) <- res tmp@runtime <- t res <- tmp } } ## check result if( !isTRUE(err <- .checkResult(res, seed)) ) return(err) ## Enforce some slot values # slot 'method' algorithm(res) <- name(method) # slot 'distance' res@distance <- objective(method) # slot 'seed' if( seed.method != '' ) seeding(res) <- seed.method # set dimnames of the result only if necessary if( is.null(dimnames(res)) ) dimnames(res) <- dimnames(seed) res } # check result .checkResult <- function(fit, seed){ # check the result is of the right type if( !inherits(fit, 'NMFfit') ){ return(str_c("NMF algorithms should return an instance of class 'NMFfit' [returned class:", class(fit), "]")) } # check that the model has been fully estimated if( is.partial.nmf(fit) ){ warning("nmf - The NMF model was only partially estimated [dim = (", str_out(dim(fit), Inf),")].") } # check that the fit conserved all fixed terms (only warning) if( nterms(seed) ){ if( length(i <- icterms(seed)) && !identical(coef(fit)[i,], coef(seed)[i,]) ){ warning("nmf - Fixed coefficient terms were not all conserved in the fit: the method might not support them.") } if( length(i <- ibterms(seed)) && !identical(basis(fit)[,i], basis(seed)[,i]) ){ warning("nmf - Fixed basis terms were not all conserved in the fit: the method might not support them.") } } TRUE } #' Interface for NMF Seeding Methods #' #' @description #' The function \code{seed} provides a single interface for calling all seeding #' methods used to initialise NMF computations. #' These methods at least set the basis and coefficient matrices of the initial #' \code{object} to valid nonnegative matrices. #' They will be used as a starting point by any NMF algorithm that accept #' initialisation. #' #' IMPORTANT: this interface is still considered experimental and is subject #' to changes in future release. #' #' @param x target matrix one wants to approximate with NMF #' @param model specification of the NMF model, e.g., the factorization rank. #' @param method specification of a seeding method. #' See each method for details on the supported formats. #' @param ... extra to allow extensions and passed down to the actual seeding method. #' #' @return an \code{\linkS4class{NMFfit}} object. #' #' @inline #' @export setGeneric('seed', function(x, model, method, ...) standardGeneric('seed') ) #' This is the workhorse method that seeds an NMF model object using a given #' seeding strategy defined by an \code{NMFSeed} object, to fit a given #' target matrix. #' #' @param rng rng setting to use. #' If not missing the RNG settings are set and restored on exit using #' \code{\link[rngtools]{setRNG}}. #' #' All arguments in \code{...} are passed to teh seeding strategy. #' setMethod('seed', signature(x='matrix', model='NMF', method='NMFSeed'), function(x, model, method, rng, ...){ # debug message nmf.debug('seed', "use seeding method: '", name(method), "'") # temporarly set the RNG if provided if( !missing(rng) ){ orng <- setRNG(rng) on.exit(setRNG(orng)) } # save the current RNG numerical seed rng.s <- getRNG() # create the result NMFfit object, storing the RNG numerical seed res <- NMFfit() # ASSERT: check that the RNG seed is correctly set stopifnot( rng.equal(res,rng.s) ) # call the seeding function passing the extra parameters f <- do.call(algorithm(method), c(list(model, x), ...)) # set the dimnames from the target matrix dimnames(f) <- dimnames(x) # set the basis names from the model if any if( !is.null(basisnames(model)) ) basisnames(f) <- basisnames(model) # store the result into the NMFfit object fit(res) <- f # if not already set: store the seeding method's name in the resulting object if( seeding(res) == '' ) seeding(res) <- name(method) # return the seeded object res } ) #' Seeds an NMF model using a custom seeding strategy, defined by a function. #' #' \code{method} must have signature \code{(x='NMFfit', y='matrix', ...)}, where #' \code{x} is the unseeded NMF model and \code{y} is the target matrix to fit. #' It must return an \code{\linkS4class{NMF}} object, that contains the seeded #' NMF model. #' #' @param name optional name of the seeding method for custom seeding strategies. #' setMethod('seed', signature(x='ANY', model='ANY', method='function'), function(x, model, method, name, ...){ # generate runtime name if necessary if( missing(name) ) name <- basename(tempfile("NMF.seed.")) # check that the name is not a registered name if( existsNMFSeed(name) ) stop("Invalid name for custom seeding method: '",name,"' is already a registered seeding method") # wrap function method into a new NMFSeed object seedObj <- new('NMFSeed', name=name, method=method) # call version with NMFSeed seed(x, model, seedObj, ...) } ) #' Seeds the model with the default seeding method given by #' \code{nmf.getOption('default.seed')} setMethod('seed', signature(x='ANY', model='ANY', method='missing'), function(x, model, method, ...){ seed(x, model, nmf.getOption('default.seed'), ...) } ) #' Use NMF method \code{'none'}. setMethod('seed', signature(x='ANY', model='ANY', method='NULL'), function(x, model, method, ...){ seed(x, model, 'none', ...) } ) #' Use \code{method} to set the RNG with \code{\link[rngtools]{setRNG}} and use method #' \dQuote{random} to seed the NMF model. #' #' Note that in this case the RNG settings are not restored. #' This is due to some internal technical reasons, and might change in future #' releases. setMethod('seed', signature(x='ANY', model='ANY', method='numeric'), function(x, model, method, ...){ # set the seed using the numerical value by argument 'method' orng <- setRNG(method) #TODO: restore the RNG state? # call seeding method 'random' res <- seed(x, model, 'random', ...) # return result return(res) } ) #setMethod('seed', signature(x='ANY', model='ANY', method='rstream'), # function(x, model, method, ...){ # # # set the seed using the numerical value by argument 'method' # orng <- setRNG(method) # #TODO: restore the RNG state? # # # call seeding method 'random' # res <- seed(x, model, 'random', ...) # # # return result # return(res) # } #) #' Use the registered seeding method whose access key is \code{method}. setMethod('seed', signature(x='ANY', model='ANY', method='character'), function(x, model, method, ...){ # get the seeding method from the registry seeding.fun <- nmfSeed(method) #Vc#Use seeding method: '${method}' # call 'seed' with the seeding.function seed(x, model, method=seeding.fun, ...) } ) #' Seed a model using the elements in \code{model} to instantiate it with #' \code{\link{nmfModel}}. setMethod('seed', signature(x='ANY', model='list', method='NMFSeed'), function(x, model, method, ...){ ## check validity of the list: there should be at least the NMF (sub)class name and the rank if( length(model) < 2 ) stop("Invalid parameter: list 'model' must contain at least two elements giving the model's class name and the factorization rank") # 'model' must contain an element giving the class to instanciate if( is.null(model$model) ){ err.msg <- "Invalid parameter: list 'model' must contain a valid NMF model classname in an element named 'model' or in its first un-named element" unamed <- if( !is.null(names(model)) ) which(names(model) %in% c('', NA)) else 1 if ( length(unamed) > 0 ){ # if not the first unamed element is taken as the class name idx <- unamed[1] val <- unlist(model[idx], recursive=FALSE) if( is.character(val) && length(val)==1 && extends(val, 'NMF') ) names(model)[idx] <- 'model' else stop(err.msg) }else stop(err.msg) } # 'model' must contain an element giving the factorization rank if( is.null(model$rank) ){ err.msg <- "Invalid parameter: list 'model' must contain the factorization rank in an element named 'rank' or in its second un-named element" unamed <- if( !is.null(names(model)) ) which(names(model) %in% c('', NA)) else 1 if ( length(unamed) > 0 ){ # if not the second element is taken as the factorization rank idx <- unamed[1] val <- unlist(model[idx], recursive=FALSE) if( is.numeric(val) && length(val)==1 ) names(model)[idx] <- 'rank' else stop(err.msg) } else stop(err.msg) } nmf.debug('seed', "using model parameters:\n", capture.output(print(model)) ) # instantiate the object using the factory method model <- do.call('nmfModel', model) nmf.debug('seed', "using NMF model '", class(model), "'") # check that model is from the right type, i.e. inherits from class NMF if( !inherits(model, 'NMF') ) stop("Invalid object returned by model: object must inherit from class 'NMF'") seed(x, model, method, ...) } ) #' Seeds a standard NMF model (i.e. of class \code{\linkS4class{NMFstd}}) of rank #' \code{model}. setMethod('seed', signature(x='ANY', model='numeric', method='NMFSeed'), function(x, model, method, ...){ seed(x, nmfModel(model), method, ...) } ) ###% Extract from a list the elements that can be used to initialize the slot of a class. ###% ###% This function only extract named elements. ###% ###% @param class.name Name of the class from whose slots will be search into '...' ###% @param ... The parameters in which the slot names will be search for ###% ###% @return a list with two elements: ###% - \code{slots}: is a list that contains the named parameters that can be used to instantiate an object of class \code{class.name} ###% - \code{extra}: is a list of the remaining parameters from \code{parameters} (i.e. the ones that do not correspond to a slot). ###% .extract.slots.parameters <- function(class.name, ...){ # check validity of class.name if( !isClass(class.name) ) stop("Invalid class name: class '", class.name, "' dose not exist") # transform '...' into a list parameters <- list(...) if( length(parameters) == 1L && is.null(names(parameters)) ){ parameters <- parameters[[1L]] } # get the slots from the class name slots <- slotNames(class.name) # get the named parameters that correspond to a slot in.slots <- is.element(names(parameters), slots) # return the two lists list( slots=parameters[in.slots], extra=parameters[!in.slots]) } ###% Merges two lists, but overriding with the values of the second list in the case ###% of duplicates. .merge.override <- function(l1, l2, warning=FALSE){ sapply(names(l2), function(name){ if( warning && !is.null(l1[[name]]) ) warning("overriding element '", name, "'") l1[[name]] <<- l2[[name]] }) # return updated list return(l1) } #' Estimate Rank for NMF Models #' #' A critical parameter in NMF algorithms is the factorization rank \eqn{r}. #' It defines the number of basis effects used to approximate the target #' matrix. #' Function \code{nmfEstimateRank} helps in choosing an optimal rank by #' implementing simple approaches proposed in the literature. #' #' Note that from version \emph{0.7}, one can equivalently call the #' function \code{\link{nmf}} with a range of ranks. #' #' @details #' Given a NMF algorithm and the target matrix, a common way of estimating #' \eqn{r} is to try different values, compute some quality measures of the #' results, and choose the best value according to this quality criteria. See #' \cite{Brunet2004} and \cite{Hutchins2008}. #' #' The function \code{nmfEstimateRank} allows to perform this estimation #' procedure. #' It performs multiple NMF runs for a range of rank of #' factorization and, for each, returns a set of quality measures together with #' the associated consensus matrix. #' #' In order to avoid overfitting, it is recommended to run the same procedure on #' randomized data. #' The results on the original and the randomised data may be plotted on the #' same plots, using argument \code{y}. #' #' @param x For \code{nmfEstimateRank} a target object to be estimated, in one #' of the format accepted by interface \code{\link{nmf}}. #' #' For \code{plot.NMF.rank} an object of class \code{NMF.rank} as returned by #' function \code{nmfEstimateRank}. #' @param range a \code{numeric} vector containing the ranks of factorization #' to try. #' Note that duplicates are removed and values are sorted in increasing order. #' The results are notably returned in this order. #' #' @param method A single NMF algorithm, in one of the format accepted by #' the function \code{\link{nmf}}. #' #' @param nrun a \code{numeric} giving the number of run to perform for each #' value in \code{range}. #' #' @param model model specification passed to each \code{nmf} call. #' In particular, when \code{x} is a formula, it is passed to argument #' \code{data} of \code{\link{nmfModel}} to determine the target matrix -- and #' fixed terms. #' #' @param verbose toggle verbosity. This parameter only affects the verbosity #' of the outer loop over the values in \code{range}. #' To print verbose (resp. debug) messages from each NMF run, one can use #' \code{.options='v'} (resp. \code{.options='d'}) #' that will be passed to the function \code{\link{nmf}}. #' #' @param stop logical flag for running the estimation process with fault #' tolerance. When \code{TRUE}, the whole execution will stop if any error is #' raised. When \code{FALSE} (default), the runs that raise an error will be #' skipped, and the execution will carry on. The summary measures for the runs #' with errors are set to NA values, and a warning is thrown. #' #' @param ... For \code{nmfEstimateRank}, these are extra parameters passed #' to interface \code{nmf}. Note that the same parameters are used for each #' value of the rank. See \code{\link{nmf}}. #' #' For \code{plot.NMF.rank}, these are extra graphical parameter passed to the #' standard function \code{plot}. See \code{\link{plot}}. #' #' @return #' \code{nmfEstimateRank} returns a S3 object (i.e. a list) of class #' \code{NMF.rank} with the following elements: #' #' \item{measures }{a \code{data.frame} containing the quality #' measures for each rank of factorizations in \code{range}. Each row #' corresponds to a measure, each column to a rank. } #' \item{consensus }{ a #' \code{list} of consensus matrices, indexed by the rank of factorization (as #' a character string).} #' \item{fit }{ a \code{list} of the fits, indexed by the rank of factorization #' (as a character string).} #' #' @export #' @examples #' #' if( !isCHECK() ){ #' #' set.seed(123456) #' n <- 50; r <- 3; m <- 20 #' V <- syntheticNMF(n, r, m) #' #' # Use a seed that will be set before each first run #' res <- nmfEstimateRank(V, seq(2,5), method='brunet', nrun=10, seed=123456) #' # or equivalently #' res <- nmf(V, seq(2,5), method='brunet', nrun=10, seed=123456) #' #' # plot all the measures #' plot(res) #' # or only one: e.g. the cophenetic correlation coefficient #' plot(res, 'cophenetic') #' #' # run same estimation on randomized data #' rV <- randomize(V) #' rand <- nmfEstimateRank(rV, seq(2,5), method='brunet', nrun=10, seed=123456) #' plot(res, rand) #' } #' nmfEstimateRank <- function(x, range, method=nmf.getOption('default.algorithm') , nrun=30, model=NULL, ..., verbose=FALSE, stop=FALSE){ # fix method if passed NULL (e.g., from nmf('formula', 'numeric')) if( is.null(method) ) method <- nmf.getOption('default.algorithm') # special handling of formula: get target data from the formula if( is(x, 'formula') ){ # dummy model to resolve formula dummy <- nmfModel(x, 0L, data=model) # retrieve target data V <- attr(dummy, 'target') }else{ V <- x } # remove duplicates and sort range <- sort(unique(range)) # initiate the list of consensus matrices: start with single NA values c.matrices <- setNames(lapply(range, function(x) NA), as.character(range)) fit <- setNames(lapply(range, function(x) NA), as.character(range)) bootstrap.measures <- list() # combine function: take all the results at once and merge them into a big matrix comb <- function(...){ measures <- list(...) err <- which( sapply(measures, is.character) ) if( length(err) == length(measures) ){ # all runs produced an error # build an warning using the error messages msg <- paste(paste("#", seq_along(range),' ', measures, sep=''), collapse="\n\t-") stop("All the runs produced an error:\n\t-", msg) }else if( length(err) > 0 ){ # some of the runs returned an error # simplify the results with no errors into a matrix measures.ok <- sapply(measures[-err], function(x) x) # build a NA matrix for all the results n <- nrow(measures.ok) tmp.res <- matrix(as.numeric(NA), n, length(range)) rownames(tmp.res) <- rownames(measures.ok) # set the results that are ok tmp.res[,-err] <- measures.ok # set only the rank for the error results tmp.res['rank', err] <- range[err] # build an warning using the error messages msg <- paste(paste("#", err, measures[err], ' ', sep=''), collapse="\n\t-") warning("NAs were produced due to errors in some of the runs:\n\t-", msg) # return full matrix tmp.res } else # all the runs are ok sapply(measures, function(x) x) } # measures <- foreach(r = range, .combine=comb, .multicombine=TRUE, .errorhandling='stop') %do% { k.rank <- 0 measures <- sapply(range, function(r, ...){ k.rank <<- k.rank + 1L if( verbose ) cat("Compute NMF rank=", r, " ... ") # restore RNG on exit (except after last rank) # => this ensures the methods use the same stochastic environment orng <- RNGseed() if( k.rank < length(range) ) on.exit( RNGseed(orng), add = TRUE) res <- tryCatch({ #START_TRY res <- nmf(x, r, method, nrun=nrun, model=model, ...) # directly return the result if a valid NMF result if( !isNMFfit(res, recursive = FALSE) ) return(res) # store the consensus matrix c.matrices[[as.character(r)]] <<- consensus(res) # store the fit fit[[as.character(r)]] <<- res # if confidence intervals must be computed then do it # if( conf.interval ){ # # resample the tries # samp <- sapply(seq(5*nrun), function(i){ sample(nrun, nrun, replace=TRUE) }) # # bootstrap.measures[[as.character(r)]] <<- apply(samp, 2, function(s){ # res.sample <- join(res[s]) # summary(res.sample, target=x) # }) # } # compute quality measures if( verbose ) cat('+ measures ... ') measures <- summary(res, target=V) if( verbose ) cat("OK\n") # return the measures measures } #END_TRY , error = function(e) { mess <- if( is.null(e$call) ) e$message else paste(e$message, " [in call to '", e$call[1],"']", sep='') mess <- paste('[r=', r, '] -> ', mess, sep='') if( stop ){ # throw the error if( verbose ) cat("\n") stop(mess, call.=FALSE) } # pass the error message if( verbose ) message("ERROR") return(mess) } ) # return the result res } , ..., simplify=FALSE) measures <- do.call(comb, measures) # reformat the result into a data.frame measures <- as.data.frame(t(measures)) # wrap-up result into a 'NMF.rank' S3 object res <- list(measures=measures, consensus=c.matrices, fit=fit) #if( conf.interval ) res$bootstrap.measure <- bootstrap.measures class(res) <- 'NMF.rank' return(res) } #' @method summary NMF.rank #' @export summary.NMF.rank <- function(object, ...){ s <- summary(new('NMFList', object$fit), ...) # NB: sort measures in the same order as required in ... i <- which(!names(s) %in% names(object$measures)) cbind(s[, i], object$measures[match(object$measures$rank, s$rank), ]) } #' \code{plot.NMF.rank} plots the result of rank estimation survey. #' #' In the plot generated by \code{plot.NMF.rank}, each curve represents a #' summary measure over the range of ranks in the survey. #' The colours correspond to the type of data to which the measure is related: #' coefficient matrix, basis component matrix, best fit, or consensus matrix. #' #' @param y reference object of class \code{NMF.rank}, as returned by #' function \code{nmfEstimateRank}. #' The measures contained in \code{y} are used and plotted as a reference. #' It is typically used to plot results obtained from randomized data. #' The associated curves are drawn in \emph{red} (and \emph{pink}), #' while those from \code{x} are drawn in \emph{blue} (and \emph{green}). #' @param what a \code{character} vector whose elements partially match #' one of the following item, which correspond to the measures computed #' by \code{\link{summary}} on each -- multi-run -- NMF result: #' \sQuote{all}, \sQuote{cophenetic}, \sQuote{rss}, #' \sQuote{residuals}, \sQuote{dispersion}, \sQuote{evar}, #' \sQuote{silhouette} (and more specific *.coef, *.basis, *.consensus), #' \sQuote{sparseness} (and more specific *.coef, *.basis). #' It specifies which measure must be plotted (\code{what='all'} plots #' all the measures). #' @param na.rm single logical that specifies if the rank for which the #' measures are NA values should be removed from the graph or not (default to #' \code{FALSE}). This is useful when plotting results which include NAs due #' to error during the estimation process. See argument \code{stop} for #' \code{nmfEstimateRank}. #' @param xname,yname legend labels for the curves corresponding to measures from #' \code{x} and \code{y} respectively #' @param xlab x-axis label #' @param ylab y-axis label #' @param main main title #' #' @method plot NMF.rank #' @export #' @rdname nmfEstimateRank #' @import ggplot2 #' @import reshape2 plot.NMF.rank <- function(x, y=NULL, what=c('all', 'cophenetic', 'rss', 'residuals' , 'dispersion', 'evar', 'sparseness' , 'sparseness.basis', 'sparseness.coef' , 'silhouette' , 'silhouette.coef', 'silhouette.basis' , 'silhouette.consensus') , na.rm=FALSE , xname = 'x' , yname = 'y' , xlab = 'Factorization rank' , ylab = '' , main = 'NMF rank survey' , ... ){ # trick for convenience if( is.character(y) && missing(what) ){ what <- y y <- NULL } what <- match.arg(what, several.ok=TRUE) if( 'all' %in% what ){ what <- c('cophenetic', 'rss', 'residuals', 'dispersion', 'evar', 'sparseness', 'silhouette') } .getvals <- function(x, xname){ measures <- x$measures iwhat <- unlist(lapply(paste('^',what,sep=''), grep, colnames(measures))) # remove NA values if required if( na.rm ) measures <- measures[ apply(measures, 1, function(row) !any(is.na(row[iwhat]))), ] vals <- measures[,iwhat, drop=FALSE] x <- as.numeric(measures$rank) xlim <- range(x) # define measure type measure.type <- setNames(rep('Best fit', ncol(measures)), colnames(measures)) cons.measures <- c('silhouette.consensus', 'cophenetic', 'cpu.all') measure.type[match(cons.measures, names(measure.type))] <- 'Consensus' measure.type[grep("\\.coef$", names(measure.type))] <- 'Coefficients' measure.type[grep("\\.basis$", names(measure.type))] <- 'Basis' measure.type <- factor(measure.type) pdata <- melt(cbind(rank = x, vals), id.vars = 'rank') # set measure type pdata$Type <- measure.type[as.character(pdata$variable)] # define measure groups pdata$Measure <- gsub("^([^.]+).*", "\\1", pdata$variable) pdata$Data <- xname pdata } pdata <- .getvals(x, xname) # add reference data if( is(y, 'NMF.rank') ){ pdata.y <- .getvals(y, yname) pdata <- rbind(pdata, pdata.y) } p <- ggplot(pdata, aes_string(x = 'rank', y = 'value')) + geom_line( aes_string(linetype = 'Data', colour = 'Type') ) + geom_point(size = 2, aes_string(shape = 'Data', colour = 'Type') ) + theme_bw() + scale_x_continuous(xlab, breaks = unique(pdata$rank)) + scale_y_continuous(ylab) + ggtitle(main) # remove legend if not necessary if( !is(y, 'NMF.rank') ){ p <- p + scale_shape(guide = 'none') + scale_linetype(guide = 'none') } # use fix set of colors myColors <- brewer.pal(5,"Set1") names(myColors) <- levels(pdata$Type) p <- p + scale_colour_manual(name = "Measure type", values = myColors) # add facet p <- p + facet_wrap( ~ Measure, scales = 'free') # return plot p } NMF/R/parallel.R0000644000176200001440000011435714406044735013034 0ustar liggesusers# Definitions used in the parallel computations of NMF # # - reproducible backend # - reproducible %dopar% operator: %dorng% # # Author: Renaud Gaujoux # Creation: 08-Feb-2011 ############################################################################### #' @include utils.R #' @import foreach #' @import doParallel NULL # returns the number of cores to use in all NMF computation when no number is # specified by the user getMaxCores <- function(limit=TRUE){ #ceiling(parallel::detectCores()/2) nt <- n <- parallel::detectCores() # limit to number of cores specified in options if asked for if(n > 2) n <- 2 # forces limiting maximum number of cores to 2 during CRAN checks if( n > 2 && isCHECK() ){ message("# NOTE - CRAN check detected: limiting maximum number of cores [2/", nt, "]") n <- 2L } n } #' Utilities and Extensions for Foreach Loops #' #' \code{registerDoBackend} is a unified register function for foreach backends. #' #' @param object specification of a foreach backend, e.g. \sQuote{SEQ}, #' \sQuote{PAR} (for doParallel), \sQuote{MPI}, etc\ldots #' @param ... extra arguments passed to the backend own registration function. #' #' @keywords internal #' @rdname foreach registerDoBackend <- function(object, ...){ # restore old backend data in case of an error old <- getDoBackend() on.exit( setDoBackend(old) ) # get old foreach backend object ob <- ForeachBackend() # register new backend: call the register method b <- ForeachBackend(object, ...) res <- register(b) # cancel backend restoration on.exit() # call old backend cleanup method doBackendCleanup(ob) # return old backend invisible(ob) } #' \code{getDoBackend} returns the internal data of the currently registered foreach \%dopar\% backend. #' @rdname foreach #' @export getDoBackend <- function(){ fe_ns <- asNamespace('foreach') fe <- ns_get('.foreachGlobals', fe_ns) if( !exists("fun", where = fe, inherits = FALSE) ) return(NULL) getDoPar <- ns_get('getDoPar', fe_ns) c(getDoPar() # this returns the registered %dopar% function + associated data # -> add info function from foreach internal environment , info= if( exists("info", where = fe, inherits = FALSE) ){ get('info', fe, inherits=FALSE) }else{ function(data, item) NULL } , cleanup = if( exists("cleanup", where = fe, inherits = FALSE) ){ get('cleanup', fe, inherits=FALSE) } ) } getDoBackendInfo <- function(x, item){ if( is.function(x$info) ) x$info(x$data, item) } getDoBackendName <- function(x){ getDoBackendInfo(x, 'name') } #' \code{setDoBackend} is identical to \code{\link[foreach]{setDoPar}}, but #' returns the internal of the previously registered backend. #' #' @param data internal data of a foreach \%dopar\% backend. #' @param cleanup logical that indicates if the previous #' backend's cleanup procedure should be run, \strong{before} #' setting the new backend. #' #' @export #' @rdname foreach setDoBackend <- function(data, cleanup=FALSE){ # get old backend data ob <- getDoBackend() ofb <- ForeachBackend() # cleanup old backend if requested if( cleanup ){ doBackendCleanup(ofb) } if( !is.null(data) ){ bdata <- data if( is.backend(data) ) data <- data[!names(data) %in% c('name', 'cleanup')] do.call('setDoPar', data) setBackendCleanup(bdata) }else{ do.call('setDoPar', list(NULL)) fe <- ns_get('.foreachGlobals', 'foreach') if (exists("fun", envir = fe, inherits = FALSE)) remove("fun", envir = fe) setBackendCleanup(NULL) } # return old backend invisible(ob) } # setup cleanup procedure for the current backend setBackendCleanup <- function(object, fun, verbose=FALSE){ fe <- ns_get('.foreachGlobals', 'foreach') name <- getDoParName() if( !is.null(fun <- object$cleanup) ){ if( verbose ) message("# Registering cleaning up function for '", name, "'... ", appendLF=FALSE) assign('cleanup', fun, fe) if( verbose ) message("OK") }else if (exists("cleanup", envir = fe, inherits = FALSE)){ if( verbose ) message("# Removing cleaning up function for '", name, "'... ", appendLF=FALSE) remove("cleanup", envir = fe) if( verbose ) message("OK") } invisible(object) } # run cleanup procedure for a given backend object doBackendCleanup <- function(object, ..., run=TRUE, verbose=FALSE){ name <- object$name if( !is.null(fun <- object$cleanup) ){ if( verbose ) message("# Cleaning up '", name, "'... ", appendLF=FALSE) res <- try(fun(), silent=TRUE) if( verbose ) message(if( is(res, 'try-error') ) 'ERROR' else 'OK') if( isTRUE(res) ) object$cleanup <- NULL if( verbose ) message('OK', if( !is.null(res) ) str_c(' [', res,']')) } invisible(object) } #' \code{register} is a generic function that register objects. #' It is used to as a unified interface to register foreach backends. #' #' @param x specification of a foreach backend #' #' @rdname foreach #' @export register <- function(x, ...){ UseMethod('register', x) } #' @export register.foreach_backend <- function(x, ...){ be <- x$name # For everything except doSEQ: # require definition package (it is safer to re-check) if( be != 'doSEQ' ){ if( !require.quiet(be, character.only=TRUE) ) stop("Package '", be, "' is required to use foreach backend '", be, "'") } regfun <- .foreach_regfun(x$name) res <- if( length(formals(regfun)) > 0L ) do.call(regfun, c(x$data, ...)) else regfun() # throw an error if not successful (foreach::setDoPar do not throw errors!!) if( is(res, 'simpleError') ) stop(res) # set cleanup procedure if any setBackendCleanup(x) # return result invisible(res) } #' \code{ForeachBackend} is a factory method for foreach backend objects. #' #' @export #' @inline #' @rdname foreach setGeneric('ForeachBackend', function(object, ...) standardGeneric('ForeachBackend')) #' Default method defined to throw an informative error message, when no other #' method was found. setMethod('ForeachBackend', 'ANY', function(object, ...){ if( is.backend(object) ){ # update arg list if necessary if( nargs() > 1L ) object$data <- list(...) object }else if( is(object, 'cluster') ) selectMethod('ForeachBackend', 'cluster')(object, ...) else stop("Could not create foreach backend object with a specification of class '", class(object)[1L], "'") } ) formatDoName <- function(x){ # numeric values are resolved as doParallel if( is.numeric(x) ) x <- 'PAR' if( is.character(x) ){ # use upper case if not already specified as 'do*' if( !grepl("^do", x) ){ x <- toupper(x) # special treatment for doParallel if( x %in% c('PAR', 'PARALLEL') ) x <- 'Parallel' } # stick prefix 'do' (removing leading 'do' if necessary) str_c('do', sub('^do', '', x)) }else '' } #' Creates a foreach backend object based on its name. setMethod('ForeachBackend', 'character', function(object, ...){ object <- formatDoName(object) # build S3 class name s3class <- str_c(object, "_backend") # create empty S3 object obj <- structure(list(name=object, data=list(...)) , class=c(s3class, 'foreach_backend')) # give a chance to a backend-specific ForeachBackend factory method # => this will generally fill the object with the elements suitable # to be used in a call to foreach::setDoPar: fun, data, info # and possibly change the name or the object class, e.g. to allow # subsequent argument-dependent dispatch. obj <- ForeachBackend(obj, ...) # check the registration routine is available .foreach_regfun(obj$name) # set data slot if not already set by the backend-specific method if( is.null(obj$data) || (length(obj$data) == 0L && nargs()>1L) ) obj$data <- list(...) # return object obj } ) #' Creates a foreach backend object for the currently registered backend. setMethod('ForeachBackend', 'missing', function(object, ...){ be <- getDoParName() data <- getDoBackend() bdata <- data$data res <- if( !is.null(bdata) ) do.call(ForeachBackend, c(list(be, bdata), ...)) else ForeachBackend(be, ...) if( !is.null(data$cleanup) ) res$cleanup <- data$cleanup res } ) #' Dummy method that returns \code{NULL}, defined for correct dispatch. setMethod('ForeachBackend', 'NULL', function(object, ...){ NULL }) setOldClass('cluster') #' Creates a doParallel foreach backend that uses the cluster described in #' \code{object}. setMethod('ForeachBackend', 'cluster', function(object, ...){ ForeachBackend('doParallel', cl=object) } ) #' Creates a doParallel foreach backend with \code{object} processes. setMethod('ForeachBackend', 'numeric', function(object, ...){ # check numeric specification if( length(object) == 0L ) stop("invalid number of cores specified as a backend [empty]") object <- object[1] if( object <= 0 ) stop("invalid negative number of cores [", object, "] specified for backend 'doParallel'") ForeachBackend('doParallel', cl=object, ...) } ) ############### # doParallel ############### setOldClass('doParallel_backend') #' doParallel-specific backend factory #' #' @param cl cluster specification: a cluster object or a numeric that indicates the #' number of nodes to use. #' @param type type of cluster, See \code{\link[parallel]{makeCluster}}. setMethod('ForeachBackend', 'doParallel_backend', function(object, cl, type=NULL){ # set type of cluster if explicitly provided if( !is.null(type) ) object$data$type <- type # required registration data # NB: a function doParallel:::doParallel should exist and do the same # thing as parallel::registerDoParallel without registering the backend #object$fun <- doParallel:::doParallel # object$info <- doParallel:::info # doParallel:::info has been removed from doParallel since version 1.0.7 # Reported in Issue #7 object$info <- getDoParallelInfo(object) # return object object } ) setOldClass('doParallelMC_backend') #' doParallel-specific backend factory for multicore (fork) clusters #' #' This method is needed since version 1.0.7 of \pkg{doParallel}, which removed #' internal function \code{info} and defined separate backend names for mc and snow clusters. setMethod('ForeachBackend', 'doParallelMC_backend', function(object, ...){ object$info <- getDoParallelInfo('mc') object$name <- 'doParallel' # return object object } ) setOldClass('doParallelSNOW_backend') #' doParallel-specific backend factory for SNOW clusters. #' #' This method is needed since version 1.0.7 of \pkg{doParallel}, which removed #' internal function \code{info} and defined separate backend names for mc and snow clusters. setMethod('ForeachBackend', 'doParallelSNOW_backend', function(object, ...){ object$info <- getDoParallelInfo('snow') object$name <- 'doParallel' # return object object } ) getDoParallelType <- function(x){ cl <- x$data[['cl']] if( is.null(cl) && length(x$data) && (is.null(names(x$data)) || names(x$data)[[1L]] == '') ) cl <- x$data[[1L]] if ( is.null(cl) || is.numeric(cl) ) { if (.Platform$OS.type == "windows" || (!is.null(x$data$type) && !identical(x$data$type, 'FORK')) ) 'snow' else 'mc' } else 'snow' } getDoParallelInfo <- function(x, ...){ t <- if( isString(x) ) x else getDoParallelType(x, ...) # str(t) ns <- asNamespace('doParallel') if( t == 'mc' ) get('mcinfo', ns) else get('snowinfo', ns) } ###################################################### # doPSOCK # Default snow-like cluster from parallel on Windows # but works on Unix as well ###################################################### setOldClass('doPSOCK_backend') #' doSNOW-specific backend factory setMethod('ForeachBackend', 'doPSOCK_backend', function(object, cl){ # use all available cores if not otherwise specified if( missing(cl) ) cl <- getMaxCores() # return equivalent doParallel object ForeachBackend('doParallel', cl, type='PSOCK') } ) .cl_cleanup <- function(gvar, envir=.GlobalEnv){ if( !exists(gvar, envir = envir) ) return() cl <- get(gvar, envir = envir) try( parallel::stopCluster(cl), silent=TRUE) rm(list=gvar, envir = envir) TRUE } cleanupCluster <- function(x, cl, stopFun=NULL){ function(){ if( is(x, 'doParallel_backend') ){ # On non-Windows machines registerDoParallel(numeric) will use # parallel::mclapply with `object` cores (no cleanup required). # On Windows doParallel::registerDoParallel(numeric) will create a # SOCKcluster with `object` cores. # => Windows needs a cleanup function that will stop the cluster # when another backend is registered. # Fortunately doParallel::registerDoParallel assign the cluster object # to the global variable `.revoDoParCluster` if( .Platform$OS.type == "windows" ){ .cl_cleanup(".revoDoParCluster") } } if( is.null(stopFun) ) stopFun <- parallel::stopCluster # stop cluster stopFun(cl) TRUE } } #' @export register.doParallel_backend <- function(x, ...){ # start cluster if numeric specification and type is defined cl <- x$data[[1]] if( is.numeric(cl) && (.Platform$OS.type == 'windows' || !is.null(x$data$type)) ){ names(x$data)[1L] <- 'spec' # start cluster clObj <- do.call(parallel::makeCluster, x$data) x$data <- list(clObj) # setup cleanup procedure x$cleanup <- cleanupCluster(x, clObj) } # register register.foreach_backend(x, ...) } ############### # doMPI ############### isMPIBackend <- function(x, ...){ b <- if( missing(x) ) ForeachBackend(...) else ForeachBackend(object=x, ...) if( is.null(b) ) FALSE else if( identical(b$name, 'doMPI') ) TRUE else if( length(b$data) ){ is(b$data[[1]], 'MPIcluster') || is(b$data[[1]], 'mpicluster') }else FALSE } #' @export register.doMPI_backend <- function(x, ...){ if( length(x$data) && isNumber(cl <- x$data[[1]]) ){ clObj <- doMPI::startMPIcluster(cl) x$data[[1]] <- clObj # setup cleanup procedure x$cleanup <- cleanupCluster(x, clObj, doMPI::closeCluster) } # register register.foreach_backend(x, ...) } setOldClass('mpicluster') #' Creates a doMPI foreach backend that uses the MPI cluster described in #' \code{object}. setMethod('ForeachBackend', 'mpicluster', function(object, ...){ ForeachBackend('doMPI', cl=object) } ) setOldClass('doMPI_backend') #' doMPI-specific backend factory setMethod('ForeachBackend', 'doMPI_backend', function(object, cl){ # use all available cores if not otherwise specified if( missing(cl) ) cl <- getMaxCores() # required registration data object$fun <- doMPI:::doMPI object$info <- doMPI:::info # return object object } ) #as.foreach_backend <- function(x, ...){ # # args <- list(...) # if( is.backend(x) ){ # # update arg list if necessary # if( length(args) > 0L ) x$args <- args # return(x) # } # # be <- # if( is.null(x) ){ # getDoParName() # } else if( is(x, 'cluster') || is.numeric(x) ){ # # check numeric specification # if( is.numeric(x) ){ # if( length(x) == 0L ) # stop("invalid number of cores specified as a backend [empty]") # x <- x[1] # if( x <= 0 ) # stop("invalid negative number of cores [", x, "] specified for backend 'doParallel'") # } # # args$spec <- x # 'Parallel' # } else if( is(x, 'mpicluster') ){ # args$spec <- x # 'MPI' # } else if( is.character(x) ){ # toupper(x) # } else # stop("invalid backend specification: must be NULL, a valid backend name, a numeric value or a cluster object [", class(x)[1L], "]") # # if( be %in% c('PAR', 'PARALLEL') ) be <- 'Parallel' # # remove leading 'do' # be <- str_c('do', sub('^do', '', be)) # # build S3 class name # s3class <- str_c(be, "_backend") # # # check the registration routine is available # regfun <- .foreach_regfun(be) # # structure(list(name=be, args=args), class=c(s3class, 'foreach_backend')) #} is.backend <- function(x) is(x, 'foreach_backend') #' @export print.foreach_backend <- function(x, ...){ cat("\n", sep='') if( length(x$data) ){ cat("Specifications:\n") str(x$data) } } .foreach_regfun <- function(name){ # early exit for doSEQ if( name == 'doSEQ' ) return( registerDoSEQ ) # build name of registration function s <- str_c(toupper(substring(name, 1,1)), substring(name, 2)) funname <- str_c('register', s) s3class <- str_c(name, "_backend") # require definition package if( !require.quiet(name, character.only=TRUE) ) stop("could not find package for foreach backend '", name, "'") # check for registering function or generic if( is.null(regfun <- getFunction(funname, mustFind=FALSE, where=asNamespace(name))) ){ if( is.null(regfun <- getS3method('register', s3class, optional=TRUE)) ) stop("could not find registration routine for foreach backend '", name, "'") # stop("backend '", name,"' is not supported: function " # ,"`", regfun, "` and S3 method `register.", s3class, "` not found.") } regfun } #' \code{getDoParHosts} is a generic function that returns the hostname of the worker nodes used by a backend. #' #' @export #' @rdname foreach #' @inline setGeneric('getDoParHosts', function(object, ...) standardGeneric('getDoParHosts')) setOldClass('foreach_backend') #' Default method that tries to heuristaically infer the number of hosts and in last #' resort temporarly register the backend and performs a foreach loop, to retrieve the #' nodename from each worker. setMethod('getDoParHosts', 'ANY', function(object, ...){ be <- if( missing(object) ) ForeachBackend(...) else ForeachBackend(object, ...) if( existsMethod('getDoParHosts', class(be)[1L]) ) return( callGeneric(object) ) # default behaviour nodename <- setNames(Sys.info()['nodename'], NULL) if( is.null(be) || is.null(be$data) ) return( NULL ) # doSEQ if( be$name == 'doSEQ' ) return( nodename ) if( isNumber(be$data) ) return( rep(nodename, be$data) ) if( length(be$data) && isNumber(be$data[[1]]) ) return( rep(nodename, be$data[[1]]) ) if( length(be$data) && be$name == 'doParallel' ) return( sapply(be$data[[1L]], '[[', 'host') ) if( !missing(object) ){ # backend passed: register temporarly ob <- getDoBackend() on.exit( setDoBackend(ob) ) registerDoBackend(be) } setNames(unlist(times(getDoParWorkers()) %dopar% { Sys.info()['nodename'] }), NULL) } ) #' \code{getDoParNHosts} returns the number of hosts used by a backend. #' #' @export #' @rdname foreach getDoParNHosts <- function(object){ if( missing(object) ) foreach::getDoParWorkers() else{ length(getDoParHosts(object)) } } # add new option: limit.cores indicates if the number of cores used in parallel # computation can exceed the detected number of CPUs on the host. #.OPTIONS$newOptions(limit.cores=TRUE) #' Computational Setup Functions #' #' @description #' Functions used internally to setup the computational environment. #' #' \code{setupBackend} sets up a foreach backend given some specifications. #' #' @param spec target parallel specification: either \code{TRUE} or \code{FALSE}, #' or a single numeric value that specifies the number of cores to setup. #' @param backend value from argument \code{.pbackend} of \code{nmf}. #' @param optional a logical that indicates if the specification must be fully #' satisfied, throwing an error if it is not, or if one can switch back to #' sequential, only outputting a verbose message. #' @param verbose logical or integer level of verbosity for message outputs. #' #' @return Returns \code{FALSE} if no foreach backend is to be used, \code{NA} if the currently #' registered backend is to be used, or, if this function call registered a new backend, #' the previously registered backend as a \code{foreach} object, so that it can be restored #' after the computation is over. #' @keywords internals #' @rdname setup setupBackend <- function(spec, backend, optional=FALSE, verbose=FALSE){ pbackend <- backend str_backend <- quick_str(pbackend) # early exit: FALSE specification or NA backend means not using foreach at all if( isFALSE(spec) || is_NA(pbackend) ) return(FALSE) # use doParallel with number of cores if specified in backend if( is.numeric(pbackend) ){ spec <- pbackend pbackend <- 'PAR' } # identify doSEQ calls doSEQ <- formatDoName(pbackend) == 'doSEQ' # custom error function pcomp <- is.numeric(spec) && !identical(spec[1], 1) errorFun <- function(value=FALSE, stop=FALSE, level=1){ function(e, ...){ if( !is(e, 'error') ) e <- list(message=str_c(e, ...)) pref <- if( pcomp ) "Parallel" else "Foreach" if( !optional || stop ){ if( verbose >= level ) message('ERROR') stop(pref, " computation aborted: ", e$message, call.=FALSE) }else if( verbose >= level ){ message('NOTE') message("# NOTE: ", pref, " computation disabled: ", e$message) } value } } # check current backend if backend is NULL if( is.null(pbackend) ){ if( verbose > 1 ){ message("# Using current backend ... ", appendLF=FALSE) } ok <- tryCatch({ if( is.null(parname <- getDoParName()) ) stop("argument '.pbackend' is NULL but there is no registered backend") if( verbose > 1 ) message('OK [', parname, ']') TRUE }, error = errorFun()) if( !ok ) return(FALSE) # exit now since there is nothing to setup, nothing should change # return NULL so that the backend is not restored on.exit of the parent call. return(NA) } ## # test if requested number of cores is actually available NCORES <- getMaxCores(limit=FALSE) if( verbose > 2 ) message("# Check available cores ... [", NCORES, ']') if( verbose > 2 ) message("# Check requested cores ... ", appendLF=FALSE) ncores <- if( doSEQ ) 1L else{ ncores <- tryCatch({ if( is.numeric(spec) ){ if( length(spec) == 0L ) stop("no number of cores specified for backend '", str_backend, "'") spec <- spec[1] if( spec <= 0L ) stop("invalid negative number of cores [", spec, "] specified for backend '", str_backend, "'") if( spec > 2L ) spec <- 2L # Limit number of cores to 2 spec }else # by default use the 'cores' option or half the number of cores getMaxCores() #getOption('cores', ceiling(NCORES/2)) }, error = errorFun(stop=TRUE)) if( isFALSE(ncores) ) return(FALSE) ncores } if( verbose > 2 ) message('[', ncores, ']') # create backend object if( verbose > 2 ) message("# Loading backend for specification `", str_backend, "` ... ", appendLF=FALSE) newBackend <- tryCatch({ # NB: limit to the number of cores available on the host if( !doSEQ ) ForeachBackend(pbackend, min(ncores, NCORES)) else ForeachBackend(pbackend) }, error = errorFun(level=3)) if( isFALSE(newBackend) ) return(FALSE) if( verbose > 2 ) message('OK') if( verbose > 1 ) message("# Check host compatibility ... ", appendLF=FALSE) ok <- tryCatch({ # check if we're not running on MAC from GUI if( is.Mac(check.gui=TRUE) && (newBackend$name == 'doMC' || (newBackend$name == 'doParallel' && is.numeric(newBackend$data[[1]]))) ){ # error only if the parallel computation was explicitly asked by the user stop("multicore parallel computations are not safe from R.app on Mac OS X." , "\n -> Use a terminal session, starting R from the command line.") } TRUE }, error = errorFun()) if( !ok ) return(FALSE) if( verbose > 1 ) message('OK') if( verbose > 1 ) message("# Registering backend `", newBackend$name, "` ... ", appendLF=FALSE) # try registering the backend oldBackend <- getDoBackend() # setup retoration of backend in case of an error # NB: the new backend cleanup will happens only # if regsitration succeeds, since the cleanup routine is # setup after the registration by the suitable register S3 method. on.exit( setDoBackend(oldBackend, cleanup=TRUE) ) ov <- lverbose(verbose) ok <- tryCatch({ registerDoBackend(newBackend) TRUE } , error ={ lverbose(ov) errorFun() }) lverbose(ov) if( !ok ) return(FALSE) if( verbose > 1 ) message('OK') # check allocated cores if not doSEQ backend if( newBackend$name != 'doSEQ' ){ # test allocated number of cores if( verbose > 2 ) message("# Check allocated cores ... ", appendLF=FALSE) wcores <- getDoParWorkers() if( ncores > 0L && wcores < ncores ){ if( !optional ){ errorFun(level=3)("only ", wcores, " core(s) available [requested ", ncores ," core(s)]") }else if( verbose > 2 ){ message('NOTE [', wcores, '/', ncores, ']') message("# NOTE: using only ", wcores, " core(s) [requested ", ncores ," core(s)]") } } else if( verbose > 2 ){ message('OK [', wcores, '/', ncores , if(ncores != NCORES ) str_c(' out of ', NCORES) , ']') } } # cancel backend restoration on.exit() # return old backend oldBackend } # add extra package bigmemory and synchronicity on Unix platforms if( .Platform$OS.type != 'windows' ){ setPackageExtra('install.packages', 'bigmemory', pkgs='bigmemory') setPackageExtra('install.packages', 'synchronicity', pkgs='synchronicity') } # add new option: shared.memory that indicates if one should try using shared memory # to speed-up parallel computations. .OPTIONS$newOptions(shared.memory = (.Platform$OS.type != 'windows' && !is.Mac())) #' \code{setupSharedMemory} checks if one can use the packages \emph{bigmemory} and \emph{sychronicity} #' to speed-up parallel computations when not keeping all the fits. #' When both these packages are available, only one result per host is written on disk, #' with its achieved deviance stored in shared memory, that is accessible to all cores on #' a same host. #' It returns \code{TRUE} if both packages are available and NMF option \code{'shared'} is #' toggled on. #' #' @rdname setup setupSharedMemory <- function(verbose){ if( verbose > 1 ) message("# Check shared memory capability ... ", appendLF=FALSE) # early exit if option shared is off if( !nmf.getOption('shared.memory') ){ if( verbose > 1 ) message('SKIP [disabled]') return(FALSE) } # early exit if foreach backend is doMPI: it is not working, not sure why if( isMPIBackend() ){ if( verbose > 1 ) message('SKIP [MPI cluster]') return(FALSE) } # not on Windows if( .Platform$OS.type == 'windows' ){ if( verbose > 1 ) message('SKIP [Windows OS]') return(FALSE) } if( !require.quiet('bigmemory', character.only=TRUE) ){ if( verbose > 1 ){ message('NO', if( verbose > 2 ) ' [Package `bigmemory` required]') } return(FALSE) } if( !require.quiet('synchronicity', character.only=TRUE) ){ if( verbose > 1 ){ message('NO', if( verbose > 2 ) ' [Package `synchronicity` required]') } return(FALSE) } if( verbose > 1 ) message('YES', if( verbose > 2 ) ' [synchronicity]') TRUE } is.doSEQ <- function(){ dn <- getDoParName() is.null(dn) || dn == 'doSEQ' } #' \code{setupTempDirectory} creates a temporary directory to store the best fits computed on each host. #' It ensures each worker process has access to it. #' #' @rdname setup setupTempDirectory <- function(verbose){ # - Create a temporary directory to store the best fits computed on each host NMF_TMPDIR <- tempfile('NMF_', getwd()) if( verbose > 2 ) message("# Setup temporary directory: '", NMF_TMPDIR, "' ... ", appendLF=FALSE) dir.create(NMF_TMPDIR) if( !is.dir(NMF_TMPDIR) ){ if( verbose > 2 ) message('ERROR') nmf_stop('nmf', "could not create temporary result directory '", NMF_TMPDIR, "'") } on.exit( unlink(NMF_TMPDIR, recursive=TRUE) ) # ensure that all workers can see the temporary directory wd <- times(getDoParWorkers()) %dopar% { if( !file_test('-d', NMF_TMPDIR) ) dir.create(NMF_TMPDIR, recursive=TRUE) file_test('-d', NMF_TMPDIR) } # check it worked if( any(!wd) ){ if( verbose > 2 ) message('ERROR') nmf_stop('nmf', "could not create/see temporary result directory '", NMF_TMPDIR, "' on worker nodes ", str_out(which(!wd), Inf)) } if( verbose > 2 ) message('OK') on.exit() NMF_TMPDIR } #' Utilities for Parallel Computations #' #' #' @rdname parallel #' @name parallel-NMF NULL #' \code{ts_eval} generates a thread safe version of \code{\link{eval}}. #' It uses boost mutexes provided by the \code{\link[synchronicity]{synchronicity}} #' package. #' The generated function has arguments \code{expr} and \code{envir}, which are passed #' to \code{\link{eval}}. #' #' @param mutex a mutex or a mutex descriptor. #' If missing, a new mutex is created via the function \code{\link[synchronicity]{boost.mutex}}. #' @param verbose a logical that indicates if messages should be printed when #' locking and unlocking the mutex. #' #' @rdname parallel #' @export ts_eval <- function(mutex = synchronicity::boost.mutex(), verbose=FALSE){ requireNamespace('bigmemory') #library(bigmemory) requireNamespace('synchronicity') #library(synchronicity) # describe mutex if necessary .MUTEX_DESC <- if( is(mutex, 'boost.mutex') ) synchronicity::describe(mutex) else mutex loadpkg <- TRUE function(expr, envir=parent.frame()){ # load packages once if( loadpkg ){ requireNamespace('bigmemory') #library(bigmemory) requireNamespace('synchronicity') #library(synchronicity) loadpkg <<- FALSE } MUTEX <- synchronicity::attach.mutex(.MUTEX_DESC) synchronicity::lock(MUTEX) if( verbose ) message('#', Sys.getpid(), " - START mutex: ", .MUTEX_DESC@description$shared.name) ERROR <- "### ###\n" on.exit({ if( verbose ){ message(ERROR, '#', Sys.getpid(), " - END mutex: ", .MUTEX_DESC@description$shared.name) } synchronicity::unlock(MUTEX) }) eval(expr, envir=envir) ERROR <- NULL } } #' \code{ts_tempfile} generates a \emph{unique} temporary filename #' that includes the name of the host machine and/or the caller's process id, #' so that it is thread safe. #' #' @inheritParams base::tempfile #' @param ... extra arguments passed to \code{\link[base]{tempfile}}. #' @param host logical that indicates if the host machine name should #' be appear in the filename. #' @param pid logical that indicates if the current process id #' be appear in the filename. #' #' @rdname parallel #' @export ts_tempfile <- function(pattern = "file", ..., host=TRUE, pid=TRUE){ if( host ) pattern <- c(pattern, Sys.info()['nodename']) if( pid ) pattern <- c(pattern, Sys.getpid()) tempfile(paste(pattern, collapse='_'), ...) } #' \code{hostfile} generates a temporary filename composed with #' the name of the host machine and/or the current process id. #' #' @inheritParams base::tempfile #' @inheritParams ts_tempfile #' #' @rdname parallel #' @export hostfile <- function(pattern = "file", tmpdir=tempdir(), fileext='', host=TRUE, pid=TRUE){ if( host ) pattern <- c(pattern, Sys.info()['nodename']) if( pid ) pattern <- c(pattern, Sys.getpid()) file.path(tmpdir, str_c(paste(pattern, collapse='.'), fileext)) } #' \code{gVariable} generates a function that access a global static variable, #' possibly in shared memory (only for numeric matrix-coercible data in this case). #' It is used primarily in parallel computations, to preserve data accross #' computations that are performed by the same process. #' #' @param init initial value #' @param shared a logical that indicates if the variable should be stored in shared #' memory or in a local environment. #' #' @rdname parallel #' @export gVariable <- function(init, shared=FALSE){ if( shared ){ # use bigmemory shared matrices if( !is.matrix(init) ) init <- as.matrix(init) requireNamespace('bigmemory') #library(bigmemory) DATA <- bigmemory::as.big.matrix(init, type='double', shared=TRUE) DATA_DESC <- bigmemory::describe(DATA) }else{ # use variables assigned to .GlobalEnv DATA_DESC <- basename(tempfile('.gVariable_')) } .VALUE <- NULL .loadpkg <- TRUE function(value){ # load packages once if( shared && .loadpkg ){ requireNamespace('bigmemory') #library(bigmemory) .loadpkg <<- FALSE } # if shared: attach bigmemory matrix from its descriptor object if( shared ){ DATA <- bigmemory::attach.big.matrix(DATA_DESC) } if( missing(value) ){# READ ACCESS if( !shared ){ # initialise on first call if necessary if( is.null(.VALUE) ) .VALUE <<- init # return variable .VALUE }else DATA[] }else{# WRITE ACCESS if( !shared ) .VALUE <<- value else DATA[] <- value } } } #' \code{setupLibPaths} add the path to the NMF package to each workers' libPaths. #' #' @param pkg package name whose path should be exported the workers. #' #' @rdname setup setupLibPaths <- function(pkg='NMF', verbose=FALSE){ # do nothing in sequential mode if( is.doSEQ() ) return( character() ) if( verbose ){ message("# Setting up libpath on workers for package(s) " , str_out(pkg, Inf), ' ... ', appendLF=FALSE) } p <- path.package(pkg) if( is.null(p) ) return() if( !isDevNamespace(pkg) ){ # not a dev package plibs <- dirname(p) libs <- times(getDoParWorkers()) %dopar% { .libPaths(c(.libPaths(), plibs)) } libs <- unique(unlist(libs)) if( verbose ){ message("OK\n# libPaths:\n", paste(' ', libs, collapse="\n")) } libs pkg }else if( getDoParName() != 'doParallel' || !isNumber(getDoBackend()$data) ){ # devmode: load the package + depends if( verbose ){ message("[devtools::load_all] ", appendLF=FALSE) } times(getDoParWorkers()) %dopar% { capture.output({ suppressMessages({ requireNamespace('devtools') #library(devtools) requireNamespace('bigmemory') #library(bigmemory) devtools::load_all(p) }) }) } if( verbose ){ message("OK") } c('bigmemory', 'rngtools') } else if( verbose ){ message("OK") } } #StaticWorkspace <- function(..., .SHARED=FALSE){ # # # create environment # e <- new.env(parent=.GlobalEnv) # # fill with initial data # vars <- list(...) # if( .SHARED ){ # lapply(names(vars), function(x){ # bm <- bigmemory::as.big.matrix(vars[[x]], type='double', shared=TRUE) # e[[x]] <- bigmemory::describe(bm) # }) # }else # list2env(vars, envir=e) # # structure(e, shared=.SHARED, class=c("static_wsp", 'environment')) #} # #`[[.static_wsp` <- function(x, ..., exact = TRUE){ # if( attr(x, 'shared') ){ # var <- bigmemory::attach.big.matrix(NextMethod()) # var[] # }else # NextMethod() #} # #`[[.static_wsp<-` <- function(x, i, value){ # # if( attr(x, 'shared') ){ # var <- bigmemory::attach.big.matrix(x[[i]]) # var[] <- value # }else # x[[i]] <- value # x #} isRNGseed <- function(x){ is.numeric(x) || ( is.list(x) && is.null(names(x)) && all(sapply(x, is.numeric)) ) } #' \code{setupRNG} sets the RNG for use by the function nmf. #' It returns the old RNG as an rstream object or the result of set.seed #' if the RNG is not changed due to one of the following reason: #' - the settings are not compatible with rstream #' #' @param seed initial RNG seed specification #' @param n number of RNG seeds to generate #' #' @rdname setup setupRNG <- function(seed, n, verbose=FALSE){ if( verbose == 2 ){ message("# Setting up RNG ... ", appendLF=FALSE) on.exit( if( verbose == 2 ) message("OK") ) }else if( verbose > 2 ) message("# Setting up RNG ... ") if( verbose > 3 ){ message("# ** Original RNG settings:") showRNG() } # for multiple runs one always uses RNGstreams if( n > 1 ){ # seeding with numeric values only if( is.list(seed) && isRNGseed(seed) ){ if( length(seed) != n ) stop("Invalid list of RNG seeds: must be of length ", n) if( verbose > 2 ) message("# Using supplied list of RNG seeds") return(seed) }else if( is.numeric(seed) ){ if( verbose > 2 ){ message("# Generate RNGStream sequence using seed (" , RNGstr(seed), ") ... " , appendLF=FALSE) } res <- RNGseq(n, seed) if( verbose > 2 ) message("OK") return(res) }else{ # create a sequence of RNGstream using a random seed if( verbose > 2 ){ message("# Generate RNGStream sequence using a random seed ... " , appendLF=FALSE) } res <- RNGseq(n, NULL) if( verbose > 2 ) message("OK") return(res) } }else if( is.numeric(seed) ){ # for single runs: 1-length seeds are used to set the current RNG # 6-length seeds are used to set RNGstream if( !is.vector(seed) ){ message('ERROR') stop("NMF::nmf - Invalid numeric seed: expects a numeric vector.") } # convert to an integer vector seed <- as.integer(seed) # immediately setup the RNG in the standard way if( length(seed) == 1L ){ if( verbose > 2 ){ message("# RNG setup: standard [seeding current RNG]") message("# Seeding current RNG with seed (", seed, ") ... " , appendLF=FALSE) } set.seed(seed) if( verbose > 2 ) message("OK") return( getRNG() ) }else if( length(seed) == 6L ){ if( verbose > 2 ){ message("# RNG setup: reproducible [using RNGstream]") message("# Generate RNGStream sequence using seed (" , RNGstr(seed), ") ... " , appendLF=FALSE) } res <- RNGseq(1, seed) setRNG(res) if( verbose > 2 ) message("OK") return( res ) }else{ if( verbose > 2 ){ message("# RNG setup: directly setting RNG") message("# Setting RNG with .Random.seed= (" , RNGstr(seed), ") ... " , appendLF=FALSE) } setRNG(seed, verbose > 2) if( verbose > 2 ) message("OK") return( getRNG() ) } stop("NMF::nmf - Invalid numeric seed: unexpected error.") }else{ if( verbose > 2 ) message("# RNG setup: standard [using current RNG]") NULL } } ################################################################## ## END ################################################################## NMF/R/rmatrix.R0000644000176200001440000001051514333176413012713 0ustar liggesusers# Generation of random matrices # # Defines the generic function `rmatrix` and basic methods for it. # # Author: Renaud Gaujoux ############################################################################### #' Generating Random Matrices #' #' The S4 generic \code{rmatrix} generates a random matrix from a given object. #' Methods are provided to generate matrices with entries drawn from any #' given random distribution function, e.g. \code{\link{runif}} or #' \code{\link{rnorm}}. #' #' @param x object from which to generate a random matrix #' #' @export setGeneric('rmatrix', function(x, ...) standardGeneric('rmatrix')) #' Generates a random matrix of given dimensions, whose entries #' are drawn using the distribution function \code{dist}. #' #' This is the workhorse method that is eventually called by all other methods. #' It returns a matrix with: #' \itemize{ #' \item \code{x} rows and \code{y} columns if \code{y} is not missing and #' not \code{NULL}; #' \item dimension \code{x[1]} x \code{x[2]} if \code{x} has at least two elements; #' \item dimension \code{x} (i.e. a square matrix) otherwise. #' } #' #' The default is to draw its entries from the standard uniform distribution using #' the base function \code{\link{runif}}, but any other function that generates #' random numeric vectors of a given length may be specified in argument \code{dist}. #' All arguments in \code{...} are passed to the function specified in \code{dist}. #' #' The only requirement is that the function in \code{dist} is of the following form: #' #' \samp{ #' function(n, ...){ #' # return vector of length n #' ... #' }} #' #' This is the case of all base random draw function such as \code{\link{rnorm}}, #' \code{\link{rgamma}}, etc\ldots #' #' #' @param y optional specification of number of columns #' @param dist a random distribution function or a numeric seed (see details of method #' \code{rmatrix,numeric}) #' @param byrow a logical passed in the internal call to the function #' \code{\link{matrix}} #' @param dimnames \code{NULL} or a \code{list} passed in the internal call to #' the function \code{\link{matrix}} #' @param ... extra arguments passed to the distribution function \code{dist}. #' #' @inline #' #' @examples #' ## Generate a random matrix of a given size #' rmatrix(5, 3) #' \dontshow{ stopifnot( identical(dim(rmatrix(5, 3)), c(5L,3L)) ) } #' #' ## Generate a random matrix of the same dimension of a template matrix #' a <- matrix(1, 3, 4) #' rmatrix(a) #' \dontshow{ stopifnot( identical(dim(rmatrix(a)), c(3L,4L)) ) } #' #' ## Specificy the distribution to use #' #' # the default is uniform #' a <- rmatrix(1000, 50) #' \dontrun{ hist(a) } #' #' # use normal ditribution #' a <- rmatrix(1000, 50, rnorm) #' \dontrun{ hist(a) } #' #' # extra arguments can be passed to the random variate generation function #' a <- rmatrix(1000, 50, rnorm, mean=2, sd=0.5) #' \dontrun{ hist(a) } #' setMethod('rmatrix', 'numeric', function(x, y=NULL, dist=runif, byrow = FALSE, dimnames = NULL, ...){ x <- as.integer(x) # early exit if x has length 0 if( length(x) == 0L ) stop("NMF::rmatrix - invalid empty vector in argument `x`.") # check/ensure that 'dist' is a function. if( is.null(dist) ) dist <- runif if( isNumber(dist) ){ os <- RNGseed() on.exit( RNGseed(os), add=TRUE) set.seed(dist) dist <- runif } if( !is.function(dist) ) stop("NMF::rmatrix - invalid value for argument 'dist': must be a function [class(dist)='", class(dist), "'].") # if 'y' is not specified: if( is.null(y) ){ if( length(x) == 1L ) y <- x # create a square matrix else{ # assume x contains all dimensions (e.g. returned by dim()) y <- x[2L] x <- x[1L] } }else{ y <- as.integer(y) y <- y[1L] # only use first element } # build the random matrix using the distribution function matrix(dist(x*y, ...), x, y, byrow=byrow, dimnames=dimnames) } ) #' Default method which calls \code{rmatrix,vector} on the dimensions of \code{x} #' that is assumed to be returned by a suitable \code{dim} method: #' it is equivalent to \code{rmatrix(dim(x), y=NULL, ...)}. #' #' @examples #' #' # random matrix of the same dimension as another matrix #' x <- matrix(3,4) #' dim(rmatrix(x)) #' setMethod('rmatrix', 'ANY', function(x, ...){ rmatrix(x=dim(x), y=NULL, ...) } ) NMF/R/seed-base.R0000644000176200001440000000060714333176413013056 0ustar liggesusers# Basic NMF seeding methods # # Author: Renaud Gaujoux ############################################################################### #' @include registry-seed.R NULL ## Register base seeding methods # None: do nothing and return object unchanged setNMFSeed('none', function(object, x, ...){object}, overwrite=TRUE) # Random: use function rnmf setNMFSeed('random', rnmf, overwrite=TRUE) NMF/R/setNMFClass.R0000644000176200001440000000305314333176413013346 0ustar liggesusers# Factory method for NMF model classes # # Author: Renaud Gaujoux # Creation: 18 Jul 2012 ############################################################################### #' @include NMF-class.R NULL if( FALSE ){ #START_DEACTIVATE ## #' Factory Method for NMF Model Classes ## #' ## #' Defines two S4 classes for representing NMF models: one to hold data from ## #' the actual model, the other one to hold fitting data for model estimated with ## #' the function \code{\link{nmf}}. ## #' #setNMFClass <- function(Class, ..., where=topns(), contains='NMFstd', VERBOSE=TRUE){ # # # add 'NMF' to contains if necessary # wNMF <- sapply(contains, isNMFclass) # if( !length(wNMF) || !any(wNMF) ){ # contains <- c(contains, 'NMFstd') # parentNMFClass <- 'NMFstd' # }else{ # parentNMFClass <- contains[which(wNMF)] # } # # # extract NMF prefix if present # Class <- sub('^NMF(.*)', "\\1", Class) # # define class names # NMFClass <- str_c('NMF', Class) # NMFfitClass <- str_c(NMFClass, '_fit') # if( VERBOSE ){ # message("Defining NMF classes: ", NMFClass , "(", parentNMFClass , ") and " # , NMFfitClass, ' in ', str_ns(where), ' ... ' # , appendLF=FALSE) # } # # 1. Create model class # setClass(NMFClass, ..., where=where, contains=contains) # # # 2. Create model fit class (in the same environment as the model class) # e <- packageEnv(getClassDef(NMFClass)@package) # setClass(NMFfitClass, where=e, contains=c('NMFfit', NMFClass)) # # if( VERBOSE ) message('OK') # # # return the name of the two new classes # c(NMFClass, NMFfitClass) #} }#END_DEACTIVATE NMF/R/data.R0000644000176200001440000000372714406045506012144 0ustar liggesusers# Description and generation of data # # Author: Renaud Gaujoux ############################################################################### #' Golub ExpressionSet #' #' This data comes originally from the gene expression data from \cite{Golub1999}. #' The version included in the package is the one used and referenced in \cite{Brunet2004}. #' The samples are from 27 patients with acute lymphoblastic leukemia (ALL) and #' 11 patients with acute myeloid leukemia (AML). #' #' The samples were assayed using Affymetrix Hgu6800 chips and the original #' data on the expression of 7129 genes (Affymetrix probes) are available on #' the Broad Institute web site (see references below). #' #' The data in \code{esGolub} were obtained from the web page related to #' the paper from \cite{Brunet2004}, which describes an application of #' Nonnegative Matrix Factorization to gene expression clustering. #' (see link in section \emph{Source}). #' #' They contain the 5,000 most highly varying genes according to their #' coefficient of variation, and were installed in an object of class #' \emph{ExpressionSet}. #' #' @format There are 3 covariates listed. #' #' \itemize{ #' #' \item Samples: The original sample labels. \item ALL.AML: Whether the #' patient had AML or ALL. It is a \code{\link{factor}} with levels #' \code{c('ALL', 'AML')}. \item Cell: ALL arises from two different types of #' lymphocytes (T-cell and B-cell). This specifies which for the ALL patients; #' There is no such information for the AML samples. It is a #' \code{\link{factor}} with levels \code{c('T-cell', 'B-cell', NA)}. #' #' } #' #' @source #' #' Original data from Golub et al.:\cr #' \url{http://www-genome.wi.mit.edu/mpr/data_set_ALL_AML.html} #' #' @name esGolub #' @docType data #' @keywords datasets #' @examples #' #' # requires package Biobase to be installed #' if(requireNamespace("Biobase", quietly=TRUE)){ #' #' data(esGolub) #' esGolub #' \dontrun{pData(esGolub)} #' #' } #' NULL NMF/R/extractFeatures.R0000644000176200001440000003156714333176413014410 0ustar liggesusers# Feature selection functions # # Author: Renaud Gaujoux # Created: Mar 18, 2013 ############################################################################### #' @include NMF-class.R NULL #' Feature Selection in NMF Models #' #' The function \code{featureScore} implements different methods to computes #' basis-specificity scores for each feature in the data. #' #' One of the properties of Nonnegative Matrix Factorization is that is tend to #' produce sparse representation of the observed data, leading to a natural #' application to bi-clustering, that characterises groups of samples by #' a small number of features. #' #' In NMF models, samples are grouped according to the basis #' components that contributes the most to each sample, i.e. the basis #' components that have the greatest coefficient in each column of the coefficient #' matrix (see \code{\link{predict,NMF-method}}). #' Each group of samples is then characterised by a set of features selected #' based on basis-specifity scores that are computed on the basis matrix. #' #' @section Feature scores: #' The function \code{featureScore} can compute basis-specificity scores using #' the following methods: #' #' \describe{ #' #' \item{\sQuote{kim}}{ Method defined by \cite{KimH2007}. #' #' The score for feature \eqn{i} is defined as: #' \deqn{S_i = 1 + \frac{1}{\log_2 k} \sum_{q=1}^k p(i,q) \log_2 p(i,q)}{ #' S_i = 1 + 1/log2(k) sum_q [ p(i,q) log2( p(i,q) ) ] }, #' #' where \eqn{p(i,q)} is the probability that the \eqn{i}-th feature contributes #' to basis \eqn{q}: \deqn{p(i,q) = \frac{W(i,q)}{\sum_{r=1}^k W(i,r)} }{ #' p(i,q) = W(i,q) / (sum_r W(i,r)) } #' #' The feature scores are real values within the range [0,1]. #' The higher the feature score the more basis-specific the corresponding feature. #' } #' #' \item{\sQuote{max}}{Method defined by \cite{Carmona-Saez2006}. #' #' The feature scores are defined as the row maximums. #' } #' #' } #' #' @param object an object from which scores/features are computed/extracted #' @param ... extra arguments to allow extension #' #' @return \code{featureScore} returns a numeric vector of the length the number #' of rows in \code{object} (i.e. one score per feature). #' #' @export #' @rdname scores #' @inline #' setGeneric('featureScore', function(object, ...) standardGeneric('featureScore') ) #' Computes feature scores on a given matrix, that contains the basis component in columns. setMethod('featureScore', 'matrix', function(object, method=c('kim', 'max')){ method <- match.arg(method) score <- switch(method, kim = { #for each row compute the score s <- apply(object, 1, function(g){ g <- abs(g) p_i <- g/sum(g) crossprod(p_i, log2(p_i)) }) # scale, translate and return the result 1 + s / log2(ncol(object)) } , max = { apply(object, 1L, function(x) max(abs(x))) } ) # return the computed score return(score) } ) #' Computes feature scores on the basis matrix of an NMF model. setMethod('featureScore', 'NMF', function(object, ...){ featureScore(basis(object), ...) } ) #' The function \code{extractFeatures} implements different methods to select the #' most basis-specific features of each basis component. #' #' @section Feature selection: #' The function \code{extractFeatures} can select features using the following #' methods: #' \describe{ #' \item{\sQuote{kim}}{ uses \cite{KimH2007} scoring schema and #' feature selection method. #' #' The features are first scored using the function #' \code{featureScore} with method \sQuote{kim}. #' Then only the features that fulfil both following criteria are retained: #' #' \itemize{ #' \item score greater than \eqn{\hat{\mu} + 3 \hat{\sigma}}, where \eqn{\hat{\mu}} #' and \eqn{\hat{\sigma}} are the median and the median absolute deviation #' (MAD) of the scores respectively; #' #' \item the maximum contribution to a basis component is greater than the median #' of all contributions (i.e. of all elements of W). #' } #' #' } #' #' \item{\sQuote{max}}{ uses the selection method used in the \code{bioNMF} #' software package and described in \cite{Carmona-Saez2006}. #' #' For each basis component, the features are first sorted by decreasing #' contribution. #' Then, one selects only the first consecutive features whose highest #' contribution in the basis matrix is effectively on the considered basis. #' } #' #' } #' #' @return \code{extractFeatures} returns the selected features as a list of indexes, #' a single integer vector or an object of the same class as \code{object} #' that only contains the selected features. #' #' @rdname scores #' @inline #' @export #' setGeneric('extractFeatures', function(object, ...) standardGeneric('extractFeatures') ) # internal functio to trick extractFeatures when format='subset' .extractFeaturesObject <- local({ .object <- NULL function(object){ # first call resets .object if( missing(object) ){ res <- .object .object <<- NULL res }else # set .object for next call .object <<- object } }) #' Select features on a given matrix, that contains the basis component in columns. #' #' @param method scoring or selection method. #' It specifies the name of one of the method described in sections \emph{Feature scores} #' and \emph{Feature selection}. #' #' Additionally for \code{extractFeatures}, it may be an integer vector that #' indicates the number of top most contributing features to #' extract from each column of \code{object}, when ordered in decreasing order, #' or a numeric value between 0 and 1 that indicates the minimum relative basis #' contribution above which a feature is selected (i.e. basis contribution threshold). #' In the case of a single numeric value (integer or percentage), it is used for all columns. #' #' Note that \code{extractFeatures(x, 1)} means relative contribution threshold of #' 100\%, to select the top contributing features one must explicitly specify #' an integer value as in \code{extractFeatures(x, 1L)}. #' However, if all elements in methods are > 1, they are automatically treated as #' if they were integers: \code{extractFeatures(x, 2)} means the top-2 most #' contributing features in each component. #' @param format output format. #' The following values are accepted: #' \describe{ #' \item{\sQuote{list}}{(default) returns a list with one element per column in #' \code{object}, each containing the indexes of the selected features, as an #' integer vector. #' If \code{object} has row names, these are used to name each index vector. #' Components for which no feature were selected are assigned a \code{NA} value.} #' #' \item{\sQuote{combine}}{ returns all indexes in a single vector. #' Duplicated indexes are made unique if \code{nodups=TRUE} (default).} #' #' \item{\sQuote{subset}}{ returns an object of the same class as \code{object}, #' but subset with the selected indexes, so that it contains data only from #' basis-specific features.} #' } #' #' @param nodups logical that indicates if duplicated indexes, #' i.e. features selected on multiple basis components (which should in #' theory not happen), should be only appear once in the result. #' Only used when \code{format='combine'}. #' #' @examples #' #' # random NMF model #' x <- rnmf(3, 50,20) #' #' # probably no feature is selected #' extractFeatures(x) #' # extract top 5 for each basis #' extractFeatures(x, 5L) #' # extract features that have a relative basis contribution above a threshold #' extractFeatures(x, 0.5) #' # ambiguity? #' extractFeatures(x, 1) # means relative contribution above 100% #' extractFeatures(x, 1L) # means top contributing feature in each component #' setMethod('extractFeatures', 'matrix', function(object, method=c('kim', 'max') , format=c('list', 'combine', 'subset'), nodups=TRUE){ res <- if( is.numeric(method) ){ # repeat single values if( length(method) == 1L ) method <- rep(method, ncol(object)) # float means percentage, integer means count # => convert into an integer if values > 1 if( all(method > 1L) ) method <- as.integer(method) if( is.integer(method) ){ # extract top features # only keep the specified number of feature for each column mapply(function(i, l) head(order(object[,i], decreasing=TRUE), l) , seq(ncol(object)), method, SIMPLIFY=FALSE) }else{ # extract features with contribution > threshold # compute relative contribution so <- sweep(object, 1L, rowSums(object), '/') # only keep features above threshold for each column mapply(function(i, l) which(so[,i] >= l) , seq(ncol(object)), method, SIMPLIFY=FALSE) } }else{ method <- match.arg(method) switch(method, kim = { # KIM & PARK method # first score the genes s <- featureScore(object, method='kim') # filter for the genes whose score is greater than \mu + 3 \sigma th <- median(s) + 3 * mad(s) sel <- s >= th #print( s[sel] ) #print(sum(sel)) # build a matrix with: #-> row#1=max column index, row#2=max value in row, row#3=row index temp <- 0; g.mx <- apply(object, 1L, function(x){ temp <<- temp +1 i <- which.max(abs(x)); #i <- sample(c(1,2), 1) c(i, x[i], temp) } ) # test the second criteria med <- median(abs(object)) sel2 <- g.mx[2,] >= med #print(sum(sel2)) # subset the indices g.mx <- g.mx[, sel & sel2, drop=FALSE] # order by decreasing score g.mx <- g.mx[,order(s[sel & sel2], decreasing=TRUE)] # return the indexes of the features that fullfil both criteria cl <- factor(g.mx[1,], levels=seq(ncol(object))) res <- split(g.mx[3,], cl) # add the threshold used attr(res, 'threshold') <- th # return result res }, max = { # MAX method from bioNMF # determine the specific genes for each basis vector res <- lapply(1:ncol(object), function(i){ mat <- object vect <- mat[,i] #order by decreasing contribution to factor i index.sort <- order(vect, decreasing=TRUE) for( k in seq_along(index.sort) ) { index <- index.sort[k] #if the feature contributes more to any other factor then return the features above it if( any(mat[index,-i] >= vect[index]) ) { if( k == 1 ) return(as.integer(NA)) else return( index.sort[1:(k-1)] ) } } # all features meet the criteria seq_along(vect) } ) # return res res } ) } #Note: make sure there is an element per basis (possibly NA) res <- lapply(res, function(ind){ if(length(ind)==0) ind<-NA; as.integer(ind)} ) # add names if possible if( !is.null(rownames(object)) ){ noNA <- sapply(res, is_NA) res[noNA] <- lapply(res[noNA], function(x){ setNames(x, rownames(object)[x]) }) } # apply the desired output format format <- match.arg(format) res <- switch(format #combine: return all the indices in a single vector , combine = { # ensure that there is no names: for unlist no to mess up feature names names(res) <- NULL ind <- na.omit(unlist(res)) if( nodups ) unique(ind) else ind } #subset: return the object subset with the selected indices , subset = { ind <- na.omit(unique(unlist(res))) sobject <- .extractFeaturesObject() {if( is.null(sobject) ) object else sobject}[ind, , drop=FALSE] } #else: leave as a list ,{ # add component names if any names(res) <- colnames(object) res } ) # add attribute method to track the method used attr(res, 'method') <- method # return result return( res ) } ) #' Select basis-specific features from an NMF model, by applying the method #' \code{extractFeatures,matrix} to its basis matrix. #' #' setMethod('extractFeatures', 'NMF', function(object, ...){ # extract features from the basis matrix, but subset the NMF model itself .extractFeaturesObject(object) extractFeatures(basis(object), ...) } ) unit.test(extractFeatures, { .check <- function(x){ msg <- function(...) paste(class(x), ':', ...) checkTrue( is.list(extractFeatures(x)), msg("default returns list")) checkTrue( is.list(extractFeatures(x, format='list')), msg("format='list' returns list")) checkTrue( is.integer(extractFeatures(x, format='combine')), msg("format='combine' returns an integer vector")) checkTrue( is(extractFeatures(x, format='subset'), class(x)), msg("format='subset' returns same class as object")) } .check(rmatrix(50, 5)) .check(rnmf(3, 50, 5)) }) NMF/R/colorcode.R0000644000176200001440000001333114556664206013206 0ustar liggesusers# Functions to define/extract compact colour specifications # # Author: "Renaud Gaujoux" # Creation: 19 Sep 2011 ############################################################################### #' @import RColorBrewer #' @importFrom colorspace sequential_hcl #' @import grDevices NULL col2hex <- function (cname) { colMat <- col2rgb(cname) rgb(red = colMat[1, ]/255, green = colMat[2, ]/255, blue = colMat[3,]/255) } #cc <- function(x, cval=80, lval=30){ # # sapply(x, function(co){ # if( is.integer(co) ) col2hex(if( co <= 8 ) co else colors()[co]) # else if( is.numeric(co) ) hcl(co, c=cval, l=lval) # else if( !grepl("^#") ) # else co # }) # #} #' Flags a Color Palette Specification for Reversion #' @keywords internal revPalette <- function(x){ attr(x, 'revPalette') <- TRUE x } #' Builds a Color Palette from Compact Color Specification #' @keywords internal ccPalette <- function(x, n=NA, verbose=FALSE){ if( length(x)==1 ){ # shortcut for single colors if( (is_NA(n) || n==1) && length(x) > 1L && all(grepl("^#", x)) ) return(x) sp <- ccSpec(x) x <- sp$palette if( is_NA(n) ) n <- sp$n a <- attributes(x) if( is.integer(x) ) # integer code between 1 and 8: R basic colour x <- c("#F1F1F1", col2hex(x)) else if( is.numeric(x) ) # numeric: hcl colour x <- rev(sequential_hcl(2, h = x, l = c(50, 95))) else if( is.character(x) ){ # Palette name: if( require.quiet('RColorBrewer') && x %in% rownames(brewer.pal.info) ){ if( verbose ) message("Load and generate ramp from RColorBrewer colour palette '", x, "'") x <- brewer.pal(brewer.pal.info[x, 'maxcolors'], x) }else{ cpal <- c('RdYlBu2', 'rainbow', 'heat', 'topo', 'terrain', 'cm', 'gray', 'grey') i <- pmatch(x, cpal) if( is.na(i) && (x %in% colours() || grepl("^#[0-9a-fA-F]+$", x)) ){ x <- c("#F1F1F1", x) }else{ if( is.na(i) ){ stop("Invalid palette name '", x, "': should be an RColorBrewer palette or one of " , paste("'", cpal ,"'", sep='', collapse=', ') , ".\n Available RColorBrewer palettes: ", str_out(rownames(brewer.pal.info), Inf), '.') } x <- cpal[i] # use default value of 10 for n if not specified np <- if( is_NA(n) ) 10 else n x <- switch(x , RdYlBu2 = c("#D73027", "#FC8D59", "#FEE090", "#FFFFBF", "#E0F3F8", "#91BFDB", "#4575B4") , rainbow = rainbow(np) , gray = rev(gray.colors(np)) , grey = rev(grey.colors(np)) , heat = heat.colors(np) , topo = topo.colors(np) , terrain = terrain.colors(np) , cm = cm.colors(np) , stop("Unknown colour palette name: '", x, "'") ) } } } else stop("Invalid colour palette specification :", x) attributes(x) <- a } # revert the palette if requested if( !is.null(attr(x, 'revPalette')) ){ x <- rev(x) attr(x, 'revPalette') <- NULL } # limit to the requested length if( !is_NA(n) ) x <- x[1:n] # return converted palette x } #' Generate Break Intervals from Numeric Variables #' #' Implementation is borrowed from the R core function \code{\link{cut.default}}. #' #' @keywords internal ccBreaks <- function(x, breaks){ if (!is.numeric(x)) stop("'x' must be numeric") if (length(breaks) == 1L) { if (is.na(breaks) | breaks < 2L) stop("Invalid number of intervals: should be >= 2") nb <- as.integer(breaks + 1) dx <- diff(rx <- range(x, na.rm = TRUE)) if (dx == 0) dx <- abs(rx[1L]) breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, length.out = nb) } else nb <- length(breaks <- sort.int(as.double(breaks))) if (anyDuplicated(breaks)) stop("'breaks' are not unique") breaks } #' Extract Colour Palette Specification #' #' @param x character string that specify a colour palette. #' @return a list with elements: palette, n and rev #' #' @keywords internal ccSpec <- function(x){ n <- NA rv <- FALSE if( length(x) == 1 ){ if( is.character(x) ){ # flag as reversed if it starts with a '-' if( grepl('^-', x) ){ x <- substr(x, 2, nchar(x)) rv <- TRUE } # extract length for string sm <- str_match(x, "([^:]+):([0-9]+).*")[1,] if( !is_NA(sm[1]) ){ n <- as.integer(sm[3]) x <- sm[2] } # convert to a colour code if possible # use maximum colour number of brewer sets if( is_NA(n) && isString(x) && require.quiet('RColorBrewer') && x %in% rownames(brewer.pal.info) ){ n <- brewer.pal.info[x,'maxcolors'] }else if( grepl("^[1-8]$", x) ){# integer code between 1 and 8: R basic colour x <- palette()[as.integer(x)] }else if( grepl("^[0-9.]+$", x) ) # numeric: hcl colour x <- as.numeric(x) }else if( is.numeric(x) ){ if( x < 0 ){ x <- -x rv<- TRUE } # single integer specification: use R default colours if( isInteger(x) ){ if( x <= 8 ) x <- palette()[x] else x <- colours()[x] } } } if( rv ) x <- revPalette(x) res <- list(palette=x, n=n, rev=rv) # print(res) res } #' Builds a Color Ramp from Compact Color Specification #' #' @keywords internal ccRamp <- function(x, n=NA, ...){ #breaks, data, ...){ # generate random color specification if necessary if( missing(x) ) x <- round(runif(1) * 360) # extract specifications sp <- ccSpec(x) x <- sp$palette if( missing(n) ){ n <- sp$n if( is_NA(n) ) n <- 50 } # create a palette from specification x x <- ccPalette(x, ...) # # compute breaks # breaks <- # if( !missing(breaks) ){ # breaks <- ccBreaks(x, breaks) # if( missing(n) ) # n <- length(breaks) # breaks # } # else if( !missing(data) ){ # if( missing(n) ) # n <- length(x) # ccBreaks(data, n) # } if( is_NA(n) ) n <- length(x) # return ramp from palette colorRampPalette(x)(n+1) } NMF/R/algorithms-snmf.R0000644000176200001440000006055714333176413014352 0ustar liggesusers#' @include registry-algorithms.R NULL #' Fast Combinatorial Nonnegative Least-Square #' #' This function solves the following nonnegative least square linear problem #' using normal equations and the fast combinatorial strategy from \cite{VanBenthem2004}: #' #' \deqn{ #' \begin{array}{l} #' \min \|Y - X K\|_F\\ #' \mbox{s.t. } K>=0 #' \end{array} #' }{min ||Y - X K||_F, s.t. K>=0} #' #' where \eqn{Y} and \eqn{X} are two real matrices of dimension \eqn{n \times p}{n x p} #' and \eqn{n \times r}{n x r} respectively, #' and \eqn{\|.\|_F}{|.|_F} is the Frobenius norm. #' #' The algorithm is very fast compared to other approaches, as it is optimised #' for handling multiple right-hand sides. #' #' @details #' Within the \code{NMF} package, this algorithm is used internally by the #' SNMF/R(L) algorithm from \cite{KimH2007} to solve general Nonnegative #' Matrix Factorization (NMF) problems, using alternating nonnegative #' constrained least-squares. #' That is by iteratively and alternatively estimate each matrix factor. #' #' The algorithm is an active/passive set method, which rearrange the #' right-hand side to reduce the number of pseudo-inverse calculations. #' It uses the unconstrained solution \eqn{K_u} obtained from the #' unconstrained least squares problem, #' i.e. \eqn{\min \|Y - X K\|_F^2}{min ||Y - X K||_F^2} , so as to determine #' the initial passive sets. #' #' The function \code{fcnnls} is provided separately so that it can be #' used to solve other types of nonnegative least squares problem. #' For faster computation, when multiple nonnegative least square fits #' are needed, it is recommended to directly use the function \code{\link{.fcnnls}}. #' #' The code of this function is a port from the original MATLAB code #' provided by \cite{KimH2007}. #' #' @inheritParams .fcnnls #' @param ... extra arguments passed to the internal function \code{.fcnnls}. #' Currently not used. #' @return A list containing the following components: #' #' \item{x}{ the estimated optimal matrix \eqn{K}.} \item{fitted}{ the fitted #' matrix \eqn{X K}.} \item{residuals}{ the residual matrix \eqn{Y - X K}.} #' \item{deviance}{ the residual sum of squares between the fitted matrix #' \eqn{X K} and the target matrix \eqn{Y}. That is the sum of the square #' residuals.} \item{passive}{ a \eqn{r x p} logical matrix containing the #' passive set, that is the set of entries in \eqn{K} that are not null (i.e. #' strictly positive).} \item{pseudo}{ a logical that is \code{TRUE} if the #' computation was performed using the pseudoinverse. See argument #' \code{pseudo}.} #' #' @seealso \code{\link{nmf}} #' @references #' #' Original MATLAB code from Van Benthem and Keenan, slightly modified by H. #' Kim (http://www.cc.gatech.edu/~hpark/software/fcnnls.m) #' #' @author #' Original MATLAB code : Van Benthem and Keenan #' #' Adaption of MATLAB code for SNMF/R(L): H. Kim #' #' Adaptation to the NMF package framework: Renaud Gaujoux #' #' @keywords optimize multivariate regression #' @export #' @inline #' @examples #' #' ## Define a random nonnegative matrix matrix #' n <- 200; p <- 20; r <- 3 #' V <- rmatrix(n, p) #' #' ## Compute the optimal matrix K for a given X matrix #' X <- rmatrix(n, r) #' res <- fcnnls(X, V) #' #' ## Compute the same thing using the Moore-Penrose generalized pseudoinverse #' res <- fcnnls(X, V, pseudo=TRUE) #' #' ## It also works in the case of single vectors #' y <- runif(n) #' res <- fcnnls(X, y) #' # or #' res <- fcnnls(X[,1], y) #' #' setGeneric('fcnnls', function(x, y, ...) standardGeneric('fcnnls') ) #' This method wraps a call to the internal function \code{.fcnnls}, and #' formats the results in a similar way as other lest-squares methods such #' as \code{\link{lm}}. #' #' @param verbose toggle verbosity (default is \code{FALSE}). #' setMethod('fcnnls', signature(x='matrix', y='matrix'), function(x, y, verbose=FALSE, pseudo=TRUE, ...){ # load corpcor if necessary if( isTRUE(pseudo) ){ library(corpcor) } # call the internal function res <- .fcnnls(x, y, verbose=verbose, pseudo=pseudo, ...) # process the result f <- x %*% res$coef resid <- y - f # set dimnames if( is.null(rownames(res$coef)) ) rownames(res$coef) <- colnames(x) # wrap up the result out <- list(x=res$coef, fitted=f, residuals=resid, deviance=norm(resid, 'F')^2, passive=res$Pset, pseudo=pseudo) class(out) <- 'fcnnls' out } ) #' Shortcut for \code{fcnnls(as.matrix(x), y, ...)}. setMethod('fcnnls', signature(x='numeric', y='matrix'), function(x, y, ...){ fcnnls(as.matrix(x), y, ...) } ) #' Shortcut for \code{fcnnls(x, as.matrix(y), ...)}. setMethod('fcnnls', signature(x='ANY', y='numeric'), function(x, y, ...){ fcnnls(x, as.matrix(y), ...) } ) #' @export print.fcnnls <- function(x, ...){ cat("\n") cat("Dimensions:", nrow(x$x)," x ", ncol(x$x), "\n") cat("Residual sum of squares:", x$deviance,"\n") cat("Active constraints:", length(x$passive)-sum(x$passive),"/", length(x$passive), "\n") cat("Inverse method:", if( isTRUE(x$pseudo) ) 'pseudoinverse (corpcor)' else if( is.function(x$pseudo) ) str_fun(x$pseudo) else 'QR (solve)', "\n") invisible(x) } ###% M. H. Van Benthem and M. R. Keenan, J. Chemometrics 2004; 18: 441-450 ###% ###% Given A and C this algorithm solves for the optimal ###% K in a least squares sense, using that ###% A = C*K ###% in the problem ###% min ||A-C*K||, s.t. K>=0, for given A and C. ###% ###% ###% @param C the matrix of coefficients ###% @param A the target matrix of observations ###% ###% @return [K, Pset] ###% #' Internal Routine for Fast Combinatorial Nonnegative Least-Squares #' #' @description #' This is the workhorse function for the higher-level function #' \code{\link{fcnnls}}, which implements the fast nonnegative least-square #' algorithm for multiple right-hand-sides from \cite{VanBenthem2004} to solve #' the following problem: #' #' \deqn{ #' \begin{array}{l} #' \min \|Y - X K\|_F\\ #' \mbox{s.t. } K>=0 #' \end{array} #' }{min ||Y - X K||_F, s.t. K>=0} #' #' where \eqn{Y} and \eqn{X} are two real matrices of dimension \eqn{n \times p}{n x p} #' and \eqn{n \times r}{n x r} respectively, #' and \eqn{\|.\|_F}{|.|_F} is the Frobenius norm. #' #' The algorithm is very fast compared to other approaches, as it is optimised #' for handling multiple right-hand sides. #' #' @param x the coefficient matrix #' @param y the target matrix to be approximated by \eqn{X K}. #' @param verbose logical that indicates if log messages should be shown. #' @param pseudo By default (\code{pseudo=FALSE}) the algorithm uses Gaussian #' elimination to solve the successive internal linear problems, using the #' \code{\link{solve}} function. If \code{pseudo=TRUE} the algorithm uses #' Moore-Penrose generalized \code{\link[corpcor]{pseudoinverse}} from the #' \code{corpcor} package instead of \link{solve}. #' @param eps threshold for considering entries as nonnegative. #' This is an experimental parameter, and it is recommended to #' leave it at 0. #' #' @return A list with the following elements: #' #' \item{coef}{the fitted coefficient matrix.} #' \item{Pset}{the set of passive constraints, as a logical matrix of #' the same size as \code{K} that indicates which element is positive.} #' #' @export .fcnnls <- function(x, y, verbose=FALSE, pseudo=FALSE, eps=0){ # check arguments if( any(dim(y) == 0L) ){ stop("Empty target matrix 'y' [", paste(dim(y), collapse=' x '), "]") } if( any(dim(x) == 0L) ){ stop("Empty regression variable matrix 'x' [", paste(dim(x), collapse=' x '), "]") } # map arguments C <- x A <- y # NNLS using normal equations and the fast combinatorial strategy # # I/O: [K, Pset] = fcnnls(C, A); # K = fcnnls(C, A); # # C is the nObs x lVar coefficient matrix # A is the nObs x pRHS matrix of observations # K is the lVar x pRHS solution matrix # Pset is the lVar x pRHS passive set logical array # # M. H. Van Benthem and M. R. Keenan # Sandia National Laboratories # # Pset: set of passive sets, one for each column # Fset: set of column indices for solutions that have not yet converged # Hset: set of column indices for currently infeasible solutions # Jset: working set of column indices for currently optimal solutions # # Check the input arguments for consistency and initializeerror(nargchk(2,2,nargin)) nObs = nrow(C); lVar = ncol(C); if ( nrow(A)!= nObs ) stop('C and A have imcompatible sizes') pRHS = ncol(A); W = matrix(0, lVar, pRHS); iter=0; maxiter=3*lVar; # Precompute parts of pseudoinverse #CtC = t(C)%*%C; CtA = t(C)%*%A; CtC = crossprod(C); CtA = crossprod(C,A); # Obtain the initial feasible solution and corresponding passive set K = .cssls(CtC, CtA, pseudo=pseudo); Pset = K > 0; K[!Pset] = 0; D = K; # which columns of Pset do not have all entries TRUE? Fset = which( colSums(Pset) != lVar ); #V+# Active set algorithm for NNLS main loop oitr=0; # HKim while ( length(Fset)>0 ) { oitr=oitr+1; if ( verbose && oitr > 5 ) cat(sprintf("%d ",oitr));# HKim #Vc# Solve for the passive variables (uses subroutine below) K[,Fset] = .cssls(CtC, CtA[,Fset, drop=FALSE], Pset[,Fset, drop=FALSE], pseudo=pseudo); # Find any infeasible solutions # subset Fset on the columns that have at least one negative entry Hset = Fset[ colSums(K[,Fset, drop=FALSE] < eps) > 0 ]; #V+# Make infeasible solutions feasible (standard NNLS inner loop) if ( length(Hset)>0 ){ nHset = length(Hset); alpha = matrix(0, lVar, nHset); while ( nHset>0 && (iter < maxiter) ){ iter = iter + 1; alpha[,1:nHset] = Inf; #Vc# Find indices of negative variables in passive set ij = which( Pset[,Hset, drop=FALSE] & (K[,Hset, drop=FALSE] < eps) , arr.ind=TRUE); i = ij[,1]; j = ij[,2] if ( length(i)==0 ) break; hIdx = (j - 1) * lVar + i; # convert array indices to indexes relative to a lVar x nHset matrix negIdx = (Hset[j] - 1) * lVar + i; # convert array indices to index relative to the matrix K (i.e. same row index but col index is stored in Hset) alpha[hIdx] = D[negIdx] / (D[negIdx] - K[negIdx]); alpha.inf <- alpha[,1:nHset, drop=FALSE] minIdx = max.col(-t(alpha.inf)) # get the indce of the min of each row alphaMin = alpha.inf[minIdx + (0:(nHset-1) * lVar)] alpha[,1:nHset] = matrix(alphaMin, lVar, nHset, byrow=TRUE); D[,Hset] = D[,Hset, drop=FALSE] - alpha[,1:nHset, drop=FALSE] * (D[,Hset, drop=FALSE]-K[,Hset, drop=FALSE]); idx2zero = (Hset - 1) * lVar + minIdx; # convert array indices to index relative to the matrix D D[idx2zero] = 0; Pset[idx2zero] = FALSE; K[, Hset] = .cssls(CtC, CtA[,Hset, drop=FALSE], Pset[,Hset, drop=FALSE], pseudo=pseudo); # which column of K have at least one negative entry? Hset = which( colSums(K < eps) > 0 ); nHset = length(Hset); } } #V-# #Vc# Make sure the solution has converged #if iter == maxiter, error('Maximum number iterations exceeded'), end # Check solutions for optimality W[,Fset] = CtA[,Fset, drop=FALSE] - CtC %*% K[,Fset, drop=FALSE]; # which columns have all entries non-positive Jset = which( colSums( (ifelse(!(Pset[,Fset, drop=FALSE]),1,0) * W[,Fset, drop=FALSE]) > eps ) == 0 ); Fset = setdiff(Fset, Fset[Jset]); if ( length(Fset) > 0 ){ #Vc# For non-optimal solutions, add the appropriate variable to Pset # get indice of the maximum in each column mxidx = max.col( t(ifelse(!Pset[,Fset, drop=FALSE],1,0) * W[,Fset, drop=FALSE]) ) Pset[ (Fset - 1) * lVar + mxidx ] = TRUE; D[,Fset] = K[,Fset, drop=FALSE]; } } #V-# # return K and Pset list(coef=K, Pset=Pset) } # ****************************** Subroutine**************************** #library(corpcor) .cssls <- function(CtC, CtA, Pset=NULL, pseudo=FALSE){ # use provided function if( is.function(pseudo) ){ pseudoinverse <- pseudo pseudo <- TRUE } # Solve the set of equations CtA = CtC*K for the variables in set Pset # using the fast combinatorial approach K = matrix(0, nrow(CtA), ncol(CtA)); if ( is.null(Pset) || length(Pset)==0 || all(Pset) ){ K <- (if( !pseudo ) solve(CtC) else pseudoinverse(CtC)) %*% CtA; # K = pseudoinverse(CtC) %*% CtA; #K=pinv(CtC)*CtA; }else{ lVar = nrow(Pset); pRHS = ncol(Pset); codedPset = as.numeric(2.^(seq(lVar-1,0,-1)) %*% Pset); sortedPset = sort(codedPset) sortedEset = order(codedPset) breaks = diff(sortedPset); breakIdx = c(0, which(breaks > 0 ), pRHS); for( k in seq(1,length(breakIdx)-1) ){ cols2solve = sortedEset[ seq(breakIdx[k]+1, breakIdx[k+1])]; vars = Pset[,sortedEset[breakIdx[k]+1]]; K[vars,cols2solve] <- (if( !pseudo ) solve(CtC[vars,vars, drop=FALSE]) else pseudoinverse(CtC[vars,vars, drop=FALSE])) %*% CtA[vars,cols2solve, drop=FALSE]; #K[vars,cols2solve] <- pseudoinverse(CtC[vars,vars, drop=FALSE])) %*% CtA[vars,cols2solve, drop=FALSE]; #TODO: check if this is the right way or needs to be reversed #K(vars,cols2solve) = pinv(CtC(vars,vars))*CtA(vars,cols2solve); } } # return K K } ###% ###% SNMF/R ###% ###% Author: Hyunsoo Kim and Haesun Park, Georgia Insitute of Technology ###% ###% Reference: ###% ###% Sparse Non-negative Matrix Factorizations via Alternating ###% Non-negativity-constrained Least Squares for Microarray Data Analysis ###% Hyunsoo Kim and Haesun Park, Bioinformatics, 2007, to appear. ###% ###% This software requires fcnnls.m, which can be obtained from ###% M. H. Van Benthem and M. R. Keenan, J. Chemometrics 2004; 18: 441-450 ###% ###% NMF: min_{W,H} (1/2) || A - WH ||_F^2 s.t. W>=0, H>=0 ###% SNMF/R: NMF with additional sparsity constraints on H ###% ###% min_{W,H} (1/2) (|| A - WH ||_F^2 + eta ||W||_F^2 ###% + beta (sum_(j=1)^n ||H(:,j)||_1^2)) ###% s.t. W>=0, H>=0 ###% ###% A: m x n data matrix (m: features, n: data points) ###% W: m x k basis matrix ###% H: k x n coefficient matrix ###% ###% function [W,H,i]=nmfsh_comb(A,k,param,verbose,bi_conv,eps_conv) ###% ###% input parameters: ###% A: m x n data matrix (m: features, n: data points) ###% k: desired positive integer k ###% param=[eta beta]: ###% eta (for supressing ||W||_F) ###% if eta < 0, software uses maxmum value in A as eta. ###% beta (for sparsity control) ###% Larger beta generates higher sparseness on H. ###% Too large beta is not recommended. ###% verbos: verbose = 0 for silence mode, otherwise print output ###% eps_conv: KKT convergence test (default eps_conv = 1e-4) ###% bi_conv=[wminchange iconv] biclustering convergence test ###% wminchange: the minimal allowance of the change of ###% row-clusters (default wminchange=0) ###% iconv: decide convergence if row-clusters (within wminchange) ###% and column-clusters have not changed for iconv convergence ###% checks. (default iconv=10) ###% ###% output: ###% W: m x k basis matrix ###% H: k x n coefficient matrix ###% i: the number of iterations ###% ###% sample usage: ###% [W,H]=nmfsh_comb(amlall,3,[-1 0.01],1); ###% [W,H]=nmfsh_comb(amlall,3,[-1 0.01],1,[3 10]); ###% -- in the convergence check, the change of row-clusters to ###% at most three rows is allowed. ###% ###% #function [W,H,i] nmf_snmf <- function(A, x, maxIter= nmf.getOption('maxIter') %||% 20000L, eta=-1, beta=0.01, bi_conv=c(0, 10), eps_conv=1e-4, version=c('R', 'L'), verbose=FALSE){ #nmfsh_comb <- function(A, k, param, verbose=FALSE, bi_conv=c(0, 10), eps_conv=1e-4, version=c('R', 'L')){ # depending on the version: # in version L: A is transposed while W and H are swapped and transposed version <- match.arg(version) if( version == 'L' ) A <- t(A) #if( missing(param) ) param <- c(-1, 0.01) m = nrow(A); n = ncol(A); erravg1 = numeric(); #eta=param[1]; beta=param[2]; maxA=max(A); if ( eta<0 ) eta=maxA; eta2=eta^2; # bi_conv if( length(bi_conv) != 2 ) stop("SNMF/", version, "::Invalid argument 'bi_conv' - value should be a 2-length numeric vector") wminchange=bi_conv[1]; iconv=bi_conv[2]; ## VALIDITY of parameters # eps_conv if( eps_conv <= 0 ) stop("SNMF/", version, "::Invalid argument 'eps_conv' - value should be positive") # wminchange if( wminchange < 0 ) stop("SNMF/", version, "::Invalid argument 'bi_conv' - bi_conv[1] (i.e 'wminchange') should be non-negative") # iconv if( iconv < 0 ) stop("SNMF/", version, "::Invalid argument 'bi_conv' - bi_conv[2] (i.e 'iconv') should be non-negative") # beta if( beta <=0 ) stop("SNMF/", version, "::Invalid argument 'beta' - value should be positive") ## # initialize random W if no starting point is given if( isNumber(x) ){ # rank is given by x k <- x message('# NOTE: Initialise W internally (runif)') W <- matrix(runif(m*k), m,k); x <- NULL } else if( is.nmf(x) ){ # rank is the number of basis components in x k <- nbasis(x) # seed the method (depends on the version to run) start <- if( version == 'R' ) basis(x) else t(coef(x)) # check compatibility of the starting point with the target matrix if( any(dim(start) != c(m,k)) ) stop("SNMF/", version, " - Invalid initialization - incompatible dimensions [expected: ", paste(c(m,k), collapse=' x '),", got: ", paste(dim(start), collapse=' x '), " ]") # use the supplied starting point W <- start }else{ stop("SNMF/", version, ' - Invalid argument `x`: must be a single numeric or an NMF model [', class(x), ']') } if ( verbose ) cat(sprintf("--\nAlgorithm: SNMF/%s\nParameters: k=%d eta=%.4e beta (for sparse H)=%.4e wminchange=%d iconv=%d\n", version, k,eta,beta,wminchange,iconv)); idxWold=rep(0, m); idxHold=rep(0, n); inc=0; # check validity of seed if( any(NAs <- is.na(W)) ) stop("SNMF/", version, "::Invalid initialization - NAs found in the ", if(version=='R') 'basis (W)' else 'coefficient (H)' , " matrix [", sum(NAs), " NAs / ", length(NAs), " entries]") # normalize columns of W W= apply(W, 2, function(x) x / sqrt(sum(x^2)) ); I_k=diag(eta, k); betavec=rep(sqrt(beta), k); nrestart=0; i <- 0L while( i < maxIter){ i <- i + 1L # min_h ||[[W; 1 ... 1]*H - [A; 0 ... 0]||, s.t. H>=0, for given A and W. res = .fcnnls(rbind(W, betavec), rbind(A, rep(0, n))); H = res[[1]] if ( any(rowSums(H)==0) ){ if( verbose ) cat(sprintf("iter%d: 0 row in H eta=%.4e restart!\n",i,eta)); nrestart=nrestart+1; if ( nrestart >= 10 ){ warning("NMF::snmf - Too many restarts due to too big 'beta' value [Computation stopped after the 9th restart]"); break; } # re-initialize random W idxWold=rep(0, m); idxHold=rep(0, n); inc=0; erravg1 <- numeric();# re-initialize base average error W=matrix(runif(m*k), m,k); W= apply(W, 2, function(x) x / sqrt(sum(x^2)) ); # normalize columns of W next; } # min_w ||[H'; I_k]*W' - [A'; 0]||, s.t. W>=0, for given A and H. res = .fcnnls(rbind(t(H), I_k), rbind(t(A), matrix(0, k,m))); Wt = res[[1]] W= t(Wt); # track the error (not computed unless tracking option is enabled in x) if( !is.null(x) ) x <- trackError(x, .snmf.objective(A, W, H, eta, beta), niter=i) # test convergence every 5 iterations OR if the base average error has not been computed yet if ( (i %% 5==0) || (length(erravg1)==0) ){ # indice of maximum for each row of W idxW = max.col(W) # indice of maximum for each column of H idxH = max.col(t(H)) changedW=sum(idxW != idxWold); changedH=sum(idxH != idxHold); if ( (changedW<=wminchange) && (changedH==0) ) inc=inc+1 else inc=0 resmat=pmin(H, crossprod(W) %*% H - t(W) %*% A + matrix(beta, k , k) %*% H); resvec=as.numeric(resmat); resmat=pmin(W, W %*% tcrossprod(H) - A %*% t(H) + eta2 * W); resvec=c(resvec, as.numeric(resmat)); conv=sum(abs(resvec)); #L1-norm convnum=sum(abs(resvec)>0); erravg=conv/convnum; # compute base average error if necessary if ( length(erravg1)==0 ) erravg1=erravg; if ( verbose && (i %% 1000==0) ){ # prints number of changing elements if( i==1000 ) cat("Track:\tIter\tInc\tchW\tchH\t---\terravg1\terravg\terravg/erravg1\n") cat(sprintf("\t%d\t%d\t%d\t%d\t---\terravg1: %.4e\terravg: %.4e\terravg/erravg1: %.4e\n", i,inc,changedW,changedH,erravg1,erravg,erravg/erravg1)); } #print(list(inc=inc, iconv=iconv, erravg=erravg, eps_conv=eps_conv, erravg1=erravg1)) if ( (inc>=iconv) && (erravg<=eps_conv*erravg1) ) break; idxWold=idxW; idxHold=idxH; } } if( verbose ) cat("--\n") # force to compute last error if not already done if( !is.null(x) ) x <- trackError(x, .snmf.objective(A, W, H, eta, beta), niter=i, force=TRUE) # transpose and reswap the roles if( !is.null(x) ){ if( version == 'L' ){ .basis(x) <- t(H) .coef(x) <- t(W) } else{ .basis(x) <- W .coef(x) <- H } # set number of iterations performed niter(x) <- i return(x) }else{ res <- list(W=W, H=H) if( version == 'L' ){ res$W <- t(H) res$H <- t(W) } return(invisible(res)) } } ###% Computes the objective value for the SNMF algorithm .snmf.objective <- function(target, w, h, eta, beta){ 1/2 * ( sum( (target - (w %*% h))^2 ) + eta * sum(w^2) + beta * sum( colSums( h )^2 ) ) } snmf.objective <- function(x, y, eta=-1, beta=0.01){ .snmf.objective(y, .basis(x), .coef(x), eta, beta) } ###% Wrapper function to use the SNMF/R algorithm with the NMF package. ###% .snmf <- function(target, seed, maxIter=20000L, eta=-1, beta=0.01, bi_conv=c(0, 10), eps_conv=1e-4, ...){ # retrieve the version of SNMF algorithm from its name: # it is defined by the last letter in the method's name (in upper case) name <- algorithm(seed) version <- toupper(substr(name, nchar(name), nchar(name))) # perform factorization using Kim and Park's algorithm ca <- match.call() ca[[1L]] <- as.name('nmf_snmf') # target ca[['A']] <- ca[['target']] ca[['target']] <- NULL # seed ca[['x']] <- ca[['seed']] ca[['seed']] <- NULL # version ca[['version']] <- version # verbose ca[['verbose']] <- verbose(seed) e <- parent.frame() sol <- eval(ca, envir=e) # nmf_snmf(target, seed, ..., version = version, verbose = verbose(seed)) # return solution return(sol) } #' NMF Algorithm - Sparse NMF via Alternating NNLS #' #' NMF algorithms proposed by \cite{KimH2007} that enforces sparsity #' constraint on the basis matrix (algorithm \sQuote{SNMF/L}) or the #' mixture coefficient matrix (algorithm \sQuote{SNMF/R}). #' #' The algorithm \sQuote{SNMF/R} solves the following NMF optimization problem on #' a given target matrix \eqn{A} of dimension \eqn{n \times p}{n x p}: #' \deqn{ #' \begin{array}{ll} #' & \min_{W,H} \frac{1}{2} \left(|| A - WH ||_F^2 + \eta ||W||_F^2 #' + \beta (\sum_{j=1}^p ||H_{.j}||_1^2)\right)\\ #' s.t. & W\geq 0, H\geq 0 #' \end{array} #' }{ #' min_{W,H} 1/2 (|| A - WH ||_F^2 + eta ||W||_F^2 #' + beta (sum_j ||H[,j]||_1^2)) #' #' s.t. W>=0, H>=0 #' } #' #' The algorithm \sQuote{SNMF/L} solves a similar problem on the transposed target matrix \eqn{A}, #' where \eqn{H} and \eqn{W} swap roles, i.e. with sparsity constraints applied to \code{W}. #' #' @param maxIter maximum number of iterations. #' @param eta parameter to suppress/bound the L2-norm of \code{W} and in #' \code{H} in \sQuote{SNMF/R} and \sQuote{SNMF/L} respectively. #' #' If \code{eta < 0}, then it is set to the maximum value in the target matrix is used. #' @param beta regularisation parameter for sparsity control, which #' balances the trade-off between the accuracy of the approximation and the #' sparseness of \code{H} and \code{W} in \sQuote{SNMF/R} and \sQuote{SNMF/L} respectively. #' #' Larger beta generates higher sparseness on \code{H} (resp. \code{W}). #' Too large beta is not recommended. #' @param bi_conv parameter of the biclustering convergence test. #' It must be a size 2 numeric vector \code{bi_conv=c(wminchange, iconv)}, #' with: #' \describe{ #' \item{\code{wminchange}:}{the minimal allowance of change in row-clusters.} #' \item{\code{iconv}:}{ decide convergence if row-clusters #' (within the allowance of \code{wminchange}) #' and column-clusters have not changed for \code{iconv} convergence checks.} #' } #' #' Convergence checks are performed every 5 iterations. #' @param eps_conv threshold for the KKT convergence test. #' @param ... extra argument not used. #' #' @rdname SNMF-nmf #' @aliases SNMF/R-nmf nmfAlgorithm.SNMF_R <- setNMFMethod('snmf/r', .snmf, objective=snmf.objective) #' @aliases SNMF/L-nmf #' @rdname SNMF-nmf nmfAlgorithm.SNMF_L <- setNMFMethod('snmf/l', .snmf, objective=snmf.objective) NMF/R/aheatmap.R0000644000176200001440000021716114333176413013013 0ustar liggesusers#' @include atracks.R #' @include grid.R #' @include colorcode.R NULL library(grid) library(gridBase) # extends gpar objects c_gpar <- function(gp, ...){ x <- list(...) do.call(gpar, c(gp, x[!names(x) %in% names(gp)])) } lo <- function (rown, coln, nrow, ncol, cellheight = NA, cellwidth = NA , treeheight_col, treeheight_row, legend, main = NULL, sub = NULL, info = NULL , annTracks, annotation_legend , fontsize, fontsize_row, fontsize_col, gp = gpar()){ annotation_colors <- annTracks$colors row_annotation <- annTracks$annRow annotation <- annTracks$annCol gp0 <- gp coln_height <- unit(10, "bigpts") if(!is.null(coln)){ longest_coln = which.max(nchar(coln)) coln_height <- coln_height + unit(1.1, "grobheight", textGrob(coln[longest_coln], rot = 90, gp = c_gpar(gp, fontsize = fontsize_col))) } rown_width <- rown_width_min <- unit(10, "bigpts") if(!is.null(rown)){ longest_rown = which.max(nchar(rown)) rown_width <- rown_width_min + unit(1.2, "grobwidth", textGrob(rown[longest_rown], gp = c_gpar(gp, fontsize = fontsize_row))) } gp = c_gpar(gp, fontsize = fontsize) # Legend position if( !is_NA(legend) ){ longest_break = which.max(nchar(as.character(legend))) longest_break = unit(1.1, "grobwidth", textGrob(as.character(legend)[longest_break], gp = gp)) # minimum fixed width: plan for 2 decimals and a sign min_lw = unit(1.1, "grobwidth", textGrob("-00.00", gp = gp)) longest_break = max(longest_break, min_lw) title_length = unit(1.1, "grobwidth", textGrob("Scale", gp = c_gpar(gp0, fontface = "bold"))) legend_width = unit(12, "bigpts") + longest_break * 1.2 legend_width = max(title_length, legend_width) } else{ legend_width = unit(0, "bigpts") } .annLegend.dim <- function(annotation, fontsize){ # Width of the corresponding legend longest_ann <- unlist(lapply(annotation, names)) longest_ann <- longest_ann[which.max(nchar(longest_ann))] annot_legend_width = unit(1, "grobwidth", textGrob(longest_ann, gp = gp)) + unit(10, "bigpts") # width of the legend title annot_legend_title <- names(annotation)[which.max(nchar(names(annotation)))] annot_legend_title_width = unit(1, "grobwidth", textGrob(annot_legend_title, gp = c_gpar(gp, fontface = "bold"))) # total width max(annot_legend_width, annot_legend_title_width) + unit(5, "bigpts") } # Column annotations if( !is_NA(annotation) ){ # Column annotation height annot_height = unit(ncol(annotation) * (8 + 2) + 2, "bigpts") } else{ annot_height = unit(0, "bigpts") } # add a viewport for the row annotations if ( !is_NA(row_annotation) ) { # Row annotation width row_annot_width = unit(ncol(row_annotation) * (8 + 2) + 2, "bigpts") } else { row_annot_width = unit(0, "bigpts") } # Width of the annotation legend annot_legend_width <- if( annotation_legend && !is_NA(annotation_colors) ){ .annLegend.dim(annotation_colors, fontsize) }else unit(0, "bigpts") # Tree height treeheight_col = unit(treeheight_col, "bigpts") + unit(5, "bigpts") treeheight_row = unit(treeheight_row, "bigpts") + unit(5, "bigpts") # main title main_height <- if(!is.null(main)) unit(1, "grobheight", main) + unit(20, "bigpts") else unit(0, "bigpts") # sub title sub_height <- if(!is.null(sub)) unit(1, "grobheight", sub) + unit(10, "bigpts") else unit(0, "bigpts") # info panel if( !is.null(info) ){ info_height <- unit(1, "grobheight", info) + unit(20, "bigpts") info_width <- unit(1, "grobwidth", info) + unit(10, "bigpts") }else{ info_height <- unit(0, "bigpts") info_width <- unit(0, "bigpts") } # Set cell sizes if(is.na(cellwidth)){ matwidth = unit(1, "npc") - rown_width - legend_width - row_annot_width - treeheight_row - annot_legend_width } else{ matwidth = unit(cellwidth * ncol, "bigpts") } if(is.na(cellheight)){ matheight = unit(1, "npc") - treeheight_col - annot_height - main_height - coln_height - sub_height - info_height # recompute the cell width depending on the automatic fontsize if( is.na(cellwidth) && !is.null(rown) ){ cellheight <- convertHeight(unit(1, "grobheight", rectGrob(0,0, matwidth, matheight)), "bigpts", valueOnly = T) / nrow fontsize_row <- convertUnit(min(unit(fontsize_row, 'points'), unit(0.6*cellheight, 'bigpts')), 'points') rown_width <- rown_width_min + unit(1.2, "grobwidth", textGrob(rown[longest_rown], gp = c_gpar(gp0, fontsize = fontsize_row))) matwidth <- unit(1, "npc") - rown_width - legend_width - row_annot_width - treeheight_row - annot_legend_width } } else{ matheight = unit(cellheight * nrow, "bigpts") } # HACK: # - use 6 instead of 5 column for the row_annotation # - take into account the associated legend's width # Produce layout() unique.name <- vplayout(NULL) lo <- grid.layout(nrow = 7, ncol = 6 , widths = unit.c(treeheight_row, row_annot_width, matwidth, rown_width, legend_width, annot_legend_width) , heights = unit.c(main_height, treeheight_col, annot_height, matheight, coln_height, sub_height, info_height)) hvp <- viewport( name=paste('aheatmap', unique.name, sep='-'), layout = lo) pushViewport(hvp) #grid.show.layout(lo); stop('sas') # Get cell dimensions vplayout('mat') cellwidth = convertWidth(unit(1, "npc"), "bigpts", valueOnly = T) / ncol cellheight = convertHeight(unit(1, "npc"), "bigpts", valueOnly = T) / nrow upViewport() height <- as.numeric(convertHeight(sum(lo$height), "inches")) width <- as.numeric(convertWidth(sum(lo$width), "inches")) # Return minimal cell dimension in bigpts to decide if borders are drawn mindim = min(cellwidth, cellheight) return( list(width=width, height=height, vp=hvp, mindim=mindim, cellwidth=cellwidth, cellheight=cellheight) ) } draw_dendrogram = function(hc, horizontal = T){ # .draw.dendrodram <- function(hc){ # # # convert into an hclust if necessary # if( is(hc, 'dendrogram') ){ # hca <- attr(hc, 'hclust') # hc <- if( !is.null(hca) ) hca else as.hclust(hc) # } # # h = hc$height / max(hc$height) / 1.05 # m = hc$merge # o = hc$order # n = length(o) # # m[m > 0] = n + m[m > 0] # m[m < 0] = abs(m[m < 0]) # # dist = matrix(0, nrow = 2 * n - 1, ncol = 2, dimnames = list(NULL, c("x", "y"))) # dist[1:n, 1] = 1 / n / 2 + (1 / n) * (match(1:n, o) - 1) # # for(i in 1:nrow(m)){ # dist[n + i, 1] = (dist[m[i, 1], 1] + dist[m[i, 2], 1]) / 2 # dist[n + i, 2] = h[i] # } # # draw_connection = function(x1, x2, y1, y2, y){ # grid.lines(x = c(x1, x1), y = c(y1, y)) # grid.lines(x = c(x2, x2), y = c(y2, y)) # grid.lines(x = c(x1, x2), y = c(y, y)) # } # # # create a rotating viewport for vertical dendrogram # if(!horizontal){ # gr = rectGrob() # pushViewport(viewport(height = unit(1, "grobwidth", gr), width = unit(1, "grobheight", gr), angle = 90)) # on.exit(upViewport()) # } # # for(i in 1:nrow(m)){ # draw_connection(dist[m[i, 1], 1], dist[m[i, 2], 1], dist[m[i, 1], 2], dist[m[i, 2], 2], h[i]) # } # # } .draw.dendrodram <- function(hc, ...){ # suppressWarnings( opar <- par(plt = gridPLT(), new = TRUE) ) ( opar <- par(plt = gridPLT(), new = TRUE) ) on.exit(par(opar)) if( getOption('verbose') ) grid.rect(gp = gpar(col = "blue", lwd = 2)) if( !is(hc, 'dendrogram') ) hc <- as.dendrogram(hc) plot(hc, horiz=!horizontal, xaxs="i", yaxs="i", axes=FALSE, leaflab="none", ...) } # create a margin viewport if(!horizontal) pushViewport( viewport(x=0,y=0,width=0.9,height=1,just=c("left", "bottom")) ) else pushViewport( viewport(x=0,y=0.1,width=1,height=0.9,just=c("left", "bottom")) ) on.exit(upViewport()) .draw.dendrodram(hc) } # draw a matrix first row at bottom, last at top draw_matrix = function(matrix, border_color, txt = NULL, gp = gpar()){ n = nrow(matrix) m = ncol(matrix) x = (1:m)/m - 1/2/m y = (1:n)/n - 1/2/n # substitute NA values with empty strings if( !is.null(txt) ) txt[is.na(txt)] <- '' for(i in 1:m){ grid.rect(x = x[i], y = y, width = 1/m, height = 1/n, gp = gpar(fill = matrix[,i], col = border_color)) if( !is.null(txt) ){ grid.text(label=txt[, i], x=x[i], y=y, # just=just, # hjust=hjust, # vjust=vjust, rot=0, check.overlap= FALSE, #check.overlap, default.units= 'npc', #default.units, # name=name, gp=gp, # draw=draw, # vp=vp ) } } } draw_colnames = function(coln, gp = gpar()){ m = length(coln) # decide on the label orientation width <- m * unit(1, "grobwidth", textGrob(coln[i <- which.max(nchar(coln))], gp = gp)) width <- as.numeric(convertWidth(width, "inches")) gwidth <- as.numeric(convertWidth(unit(1, 'npc'), "inches")) y <- NULL if( gwidth < width ){ rot <- 270 vjust <- 0.5 hjust <- 0 y <- unit(1, 'npc') - unit(5, 'bigpts') }else{ rot <- 0 vjust <- 0.5 hjust <- 0.5 } if( is.null(y) ){ height <- unit(1, "grobheight", textGrob(coln[i], vjust = vjust, hjust = hjust, rot=rot, gp = gp)) y <- unit(1, 'npc') - height } x = (1:m)/m - 1/2/m grid.text(coln, x = x, y = y, vjust = vjust, hjust = hjust, rot=rot, gp = gp) } # draw rownames first row at bottom, last on top draw_rownames = function(rown, gp = gpar()){ n = length(rown) y = (1:n)/n - 1/2/n grid.text(rown, x = unit(5, "bigpts"), y = y, vjust = 0.5, hjust = 0, gp = gp) } draw_legend = function(color, breaks, legend, gp = gpar()){ height = min(unit(1, "npc"), unit(150, "bigpts")) pushViewport(viewport(x = 0, y = unit(1, "npc"), just = c(0, 1), height = height)) legend_pos = (legend - min(breaks)) / (max(breaks) - min(breaks)) breaks = (breaks - min(breaks)) / (max(breaks) - min(breaks)) h = breaks[-1] - breaks[-length(breaks)] grid.rect(x = 0, y = breaks[-length(breaks)], width = unit(10, "bigpts"), height = h, hjust = 0, vjust = 0, gp = gpar(fill = color, col = "#FFFFFF00")) grid.text(legend, x = unit(12, "bigpts"), y = legend_pos, hjust = 0, gp = gp) upViewport() } convert_annotations = function(annotation, annotation_colors){ #new = annotation x <- sapply(seq_along(annotation), function(i){ #for(i in 1:length(annotation)){ a = annotation[[i]] b <- attr(a, 'color') if( is.null(b) ) b = annotation_colors[[names(annotation)[i]]] if(class(a) %in% c("character", "factor")){ a = as.character(a) #print(names(b)) #print(unique(a)) if ( FALSE && length(setdiff(names(b), a)) > 0){ stop(sprintf("Factor levels on variable %s do not match with annotation_colors", names(annotation)[i])) } #new[, i] = b[a] b[match(a, names(b))] } else{ a = cut(a, breaks = 100) #new[, i] = colorRampPalette(b)(100)[a] ccRamp(b, 100)[a] } }) colnames(x) <- names(annotation) return(x) #return(as.matrix(new)) } draw_annotations = function(converted_annotations, border_color, horizontal=TRUE){ n = ncol(converted_annotations) m = nrow(converted_annotations) if( horizontal ){ x = (1:m)/m - 1/2/m y = cumsum(rep(8, n)) - 4 + cumsum(rep(2, n)) for(i in 1:m){ grid.rect(x = x[i], unit(y[n:1], "bigpts"), width = 1/m, height = unit(8, "bigpts"), gp = gpar(fill = converted_annotations[i, ], col = border_color)) } }else{ x = cumsum(rep(8, n)) - 4 + cumsum(rep(2, n)) y = (1:m)/m - 1/2/m for (i in 1:m) { grid.rect(x = unit(x[1:n], "bigpts"), y=y[i], width = unit(8, "bigpts"), height = 1/m, gp = gpar(fill = converted_annotations[i,] , col = border_color)) } } } draw_annotation_legend = function(annotation_colors, border_color, gp = gpar()){ y = unit(1, "npc") text_height = convertHeight(unit(1, "grobheight", textGrob("FGH", gp = gp)), "bigpts") for(i in names(annotation_colors)){ grid.text(i, x = 0, y = y, vjust = 1, hjust = 0, gp = c_gpar(gp, fontface = "bold")) y = y - 1.5 * text_height #if(class(annotation[[i]]) %in% c("character", "factor")){ acol <- annotation_colors[[i]] if( attr(acol, 'afactor') ){ sapply(seq_along(acol), function(j){ grid.rect(x = unit(0, "npc"), y = y, hjust = 0, vjust = 1, height = text_height, width = text_height, gp = gpar(col = border_color, fill = acol[j])) grid.text(names(acol)[j], x = text_height * 1.3, y = y, hjust = 0, vjust = 1, gp = gp) y <<- y - 1.5 * text_height }) } else{ yy = y - 4 * text_height + seq(0, 1, 0.01) * 4 * text_height h = 4 * text_height * 0.02 grid.rect(x = unit(0, "npc"), y = yy, hjust = 0, vjust = 1, height = h, width = text_height, gp = gpar(col = "#FFFFFF00", fill = ccRamp(acol, 100))) txt = c(tail(names(acol),1), head(names(acol))[1]) yy = y - c(0, 3) * text_height grid.text(txt, x = text_height * 1.3, y = yy, hjust = 0, vjust = 1, gp = gp) y = y - 4.5 * text_height } y = y - 1.5 * text_height } } vplayout <- function () { graphic.name <- NULL .index <- 0L function(x, y, verbose = getOption('verbose') ){ # initialize the graph name if( is.null(x) ){ .index <<- .index + 1L graphic.name <<- paste0("AHEATMAP.VP.", .index) #grid:::vpAutoName() return(graphic.name) } name <- NULL if( !is.numeric(x) ){ name <- paste(graphic.name, x, sep='-') if( !missing(y) && is(y, 'viewport') ){ y$name <- name return(pushViewport(y)) } if( !is.null(tryViewport(name, verbose=verbose)) ) return() switch(x , main={x<-1; y<-3;} , ctree={x<-2; y<-3;} , cann={x<-3; y<-3;} , rtree={x<-4; y<-1;} , rann={x<-4; y<-2;} , mat={x<-4; y<-3;} , rnam={x<-4; y<-4;} , leg={x<-4; y<-5;} , aleg={x<-4; y<-6;} , cnam={x<-5; y<-3;} , sub={x<-6; y<-3;} , info={x<-7; y<-3;} , stop("aheatmap - invalid viewport name") ) } if( verbose ) message("vp - create ", name) pushViewport(viewport(layout.pos.row = x, layout.pos.col = y, name=name)) } } vplayout <- vplayout() #' Open a File Graphic Device #' #' Opens a graphic device depending on the file extension #' #' @keywords internal gfile <- function(filename, width, height, ...){ # Get file type r = regexpr("\\.[a-zA-Z]*$", filename) if(r == -1) stop("Improper filename") ending = substr(filename, r + 1, r + attr(r, "match.length")) f = switch(ending, pdf = function(x, ...) pdf(x, ...), svg = function(x, ...) svg(x, ...), png = function(x, ...) png(x, ...), jpeg = function(x, ...) jpeg(x, ...), jpg = function(x, ...) jpeg(x, ...), tiff = function(x, ...) tiff(x, compression = "lzw", ...), bmp = function(x, ...) bmp(x, ...), stop("File type should be: pdf, svg, png, bmp, jpg, tiff") ) args <- c(list(filename), list(...)) if( !missing(width) ){ args$width <- as.numeric(width) args$height <- as.numeric(height) if( !ending %in% c('pdf','svg') && is.null(args[['res']]) ){ args$units <- "in" args$res <- 300 } } do.call('f', args) } #gt <- function(){ # # x <- rmatrix(20, 10) # z <- unit(0.1, "npc") # w <- unit(0.4, "npc") # h <- unit(0.3, "npc") # lo <- grid.layout(nrow = 7, ncol = 6 # , widths = unit.c(z, z, w, z, z, z) # , heights = unit.c(z, z, z, h, z, z, z)) # # nvp <- 0 # on.exit( upViewport(nvp) ) # # u <- vplayout(NULL) # vname <- function(x) basename(tempfile(x)) # # hvp <- viewport( name=u, layout = lo) # pushViewport(hvp) # nvp <- nvp + 1 # # pushViewport(viewport(layout.pos.row = 4, layout.pos.col = 3, name='test')) # #vplayout('mat') # nvp <- nvp + 1 # # grid.rect() # NULL #} #gt2 <- function(){ # # x <- rmatrix(10, 5) # lo(NULL, NULL, nrow(x), ncol(x), cellheight = NA, cellwidth = NA # , treeheight_col=0, treeheight_row=0, legend=FALSE, main = NULL, sub = NULL, info = NULL # , annTracks=list(colors=NA, annRow=NA, annCol=NA), annotation_legend=FALSE # , fontsize=NULL, fontsize_row=NULL, fontsize_col=NULL) # # #vplayout('mat') # vname <- function(x) basename(tempfile(x)) # pushViewport(viewport(layout.pos.row = 4, layout.pos.col = 3, name=vname('test'))) # print(current.vpPath()) # grid.rect() # upViewport(2) # NULL #} d <- function(x){ if( is.character(x) ) x <- rmatrix(dim(x)) nvp <- 0 on.exit(upViewport(nvp), add=TRUE) lo <- grid.layout(nrow = 4, ncol = 3) hvp <- viewport( name=basename(tempfile()), layout = lo) pushViewport(hvp) nvp <- nvp + 1 pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 1)) nvp <- nvp + 1 w = convertWidth(unit(1, "npc"), "bigpts", valueOnly = T) / 10 h = convertHeight(unit(1, "npc"), "bigpts", valueOnly = T) / 10 grid.rect() upViewport() nvp <- nvp - 1 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) nvp <- nvp + 1 # add inner padding viewport pushViewport( viewport(x=0,y=0,width=0.9,height=0.9,just=c("left", "bottom")) ) nvp <- nvp + 1 ( opar <- par(plt = gridPLT(), new = TRUE) ) on.exit(par(opar), add=TRUE) hc <- hclust(dist(x)) plot(as.dendrogram(hc), xaxs="i", yaxs="i", axes=FALSE, leaflab="none") invisible(basename(tempfile())) } heatmap_motor = function(matrix, border_color, cellwidth, cellheight , tree_col, tree_row, treeheight_col, treeheight_row , filename=NA, width=NA, height=NA , breaks, color, legend, txt = NULL , annTracks, annotation_legend=TRUE , new=TRUE, fontsize, fontsize_row, fontsize_col , main=NULL, sub=NULL, info=NULL , verbose=getOption('verbose') , gp = gpar()){ annotation_colors <- annTracks$colors row_annotation <- annTracks$annRow annotation <- annTracks$annCol writeToFile <- !is.na(filename) # open graphic device (dimensions will be changed after computation of the correct height) if( writeToFile ){ gfile(filename) on.exit(dev.off()) } # identify the plotting context: base or grid #NB: use custom function current.vpPath2 instead of official # grid::current.vpPath as this one creates a new page when called # on a fresh graphic device vpp <- current.vpPath_patched() if( is.null(vpp) ){ # we are at the root viewport if( verbose ) message("Detected path: [ROOT]") mf <- par('mfrow') #print(mf) # if in in mfrow/layout context: setup fake-ROOT viewports with gridBase # and do not call plot.new as it is called in grid.base.mix. new <- if( !identical(mf, c(1L,1L)) ){ if( verbose ) message("Detected mfrow: ", mf[1], " - ", mf[2], ' ... MIXED') opar <- grid.base.mix(trace=verbose>1) on.exit( grid.base.mix(opar) ) FALSE } else{ if( verbose ){ message("Detected mfrow: ", mf[1], " - ", mf[2]) message("Honouring ", if( missing(new) ) "default " ,"argument `new=", new, '` ... ' , if( new ) "NEW" else "OVERLAY") } new } }else{ if( verbose ) message("Detected path: ", vpp) # if new is not specified: change the default behaviour by not calling # plot.new so that drawing occurs in the current viewport if( missing(new) ){ if( verbose ) message("Missing argument `new` ... OVERLAY") new <- FALSE }else if( verbose ) message("Honouring argument `new=", new, '` ... ' , if( new ) "NEW" else "OVERLAY") } # reset device if necessary or requested if( new ){ if( verbose ) message("Call: plot.new") #grid.newpage() plot.new() } # define grob for main mainGrob <- if( !is.null(main) && !is.grob(main) ) textGrob(main, gp = c_gpar(gp, fontsize = 1.2 * fontsize, fontface="bold")) subGrob <- if( !is.null(sub) && !is.grob(sub) ) textGrob(sub, gp = c_gpar(gp, fontsize = 0.8 * fontsize)) infoGrob <- if( !is.null(info) && !is.grob(info) ){ # infotxt <- paste(strwrap(paste(info, collapse=" | "), width=20), collapse="\n") grobTree(gList(rectGrob(gp = gpar(fill = "grey80")) ,textGrob(paste(info, collapse=" | "), x=unit(5, 'bigpts'), y=0.5, just='left', gp = c_gpar(gp, fontsize = 0.8 * fontsize)))) } # Set layout glo = lo(coln = colnames(matrix), rown = rownames(matrix), nrow = nrow(matrix), ncol = ncol(matrix) , cellwidth = cellwidth, cellheight = cellheight , treeheight_col = treeheight_col, treeheight_row = treeheight_row , legend = legend , annTracks = annTracks, annotation_legend = annotation_legend , fontsize = fontsize, fontsize_row = fontsize_row, fontsize_col = fontsize_col , main = mainGrob, sub = subGrob, info = infoGrob, gp = gp) # resize the graphic file device if necessary if( writeToFile ){ if( verbose ) message("Compute size for file graphic device") m <- par('mar') if(is.na(height)) height <- glo$height if(is.na(width)) width <- glo$width dev.off() if( verbose ) message("Resize file graphic device to: ", width, " - ", height) gfile(filename, width=width, height=height) # re-call plot.new if it was called before if( new ){ if( verbose ) message("Call again plot.new") op <- par(mar=c(0,0,0,0)) plot.new() par(op) } if( verbose ) message("Push again top viewport") # repush the layout pushViewport(glo$vp) if( verbose ) grid.rect(width=unit(glo$width, 'inches'), height=unit(glo$height, 'inches'), gp = gpar(col='blue')) } #grid.show.layout(glo$layout); return() mindim <- glo$mindim # Omit border color if cell size is too small if(mindim < 3) border_color = NA # Draw tree for the columns if (!is_NA(tree_col) && treeheight_col != 0){ #vplayout(1, 2) vplayout('ctree') draw_dendrogram(tree_col, horizontal = T) upViewport() } # Draw tree for the rows if(!is_NA(tree_row) && treeheight_row !=0){ #vplayout(3, 1) vplayout('rtree') draw_dendrogram(tree_row, horizontal = F) upViewport() } # recompute margin fontsizes fontsize_row <- convertUnit(min(unit(fontsize_row, 'points'), unit(0.6*glo$cellheight, 'bigpts')), 'points') fontsize_col <- convertUnit(min(unit(fontsize_col, 'points'), unit(0.6*glo$cellwidth, 'bigpts')), 'points') # Draw matrix #vplayout(3, 2) vplayout('mat') draw_matrix(matrix, border_color, txt = txt, gp = gpar(fontsize = fontsize_row)) #d(matrix) #grid.rect() upViewport() # Draw colnames if(length(colnames(matrix)) != 0){ #vplayout(4, 2) vplayout('cnam') draw_colnames(colnames(matrix), gp = c_gpar(gp, fontsize = fontsize_col)) upViewport() } # Draw rownames if(length(rownames(matrix)) != 0){ #vplayout(3, 3) vplayout('rnam') draw_rownames(rownames(matrix), gp = c_gpar(gp, fontsize = fontsize_row)) upViewport() } # Draw annotation tracks if( !is_NA(annotation) ){ #vplayout(2, 2) vplayout('cann') draw_annotations(annotation, border_color) upViewport() } # add row annotations if necessary if ( !is_NA(row_annotation) ) { vplayout('rann') draw_annotations(row_annotation, border_color, horizontal=FALSE) upViewport() } # Draw annotation legend if( annotation_legend && !is_NA(annotation_colors) ){ #vplayout(3, 5) vplayout('aleg') draw_annotation_legend(annotation_colors, border_color, gp = c_gpar(gp, fontsize = fontsize)) upViewport() } # Draw legend if(!is_NA(legend)){ #vplayout(3, 4) vplayout('leg') draw_legend(color, breaks, legend, gp = c_gpar(gp, fontsize = fontsize)) upViewport() } # Draw main if(!is.null(mainGrob)){ vplayout('main') grid.draw(mainGrob) upViewport() } # Draw subtitle if(!is.null(subGrob)){ vplayout('sub') grid.draw(subGrob) upViewport() } # Draw info if(!is.null(infoGrob)){ vplayout('info') grid.draw(infoGrob) upViewport() } # return current vp tree #ct <- current.vpTree() #print(current.vpPath()) upViewport() #popViewport() # grab current grob and return # gr <- grid.grab() # grid.draw(gr) #ct NULL } generate_breaks = function(x, n, center=NA){ if( missing(center) || is_NA(center) ) seq(min(x, na.rm = T), max(x, na.rm = T), length.out = n + 1) else{ # center the breaks on the requested value n2 <- ceiling((n+0.5)/2) M <- max(abs(center - min(x, na.rm = TRUE)), abs(center - max(x, na.rm = TRUE))) lb <- seq(center-M, center, length.out = n2) rb <- seq(center, center+M, length.out = n2) c(lb, rb[-1]) } } scale_vec_colours = function(x, col = rainbow(10), breaks = NA){ return(col[as.numeric(cut(x, breaks = breaks, include.lowest = T))]) } scale_colours = function(mat, col = rainbow(10), breaks = NA){ mat = as.matrix(mat) return(matrix(scale_vec_colours(as.vector(mat), col = col, breaks = breaks), nrow(mat), ncol(mat), dimnames = list(rownames(mat), colnames(mat)))) } cutheight <- function(x, n){ # exit early if n <=1: nothing to do if( n <=1 ) return( attr(x, 'height') ) res <- NULL .heights <- function(subtree, n){ if( is.leaf(subtree) ) return() if (!(K <- length(subtree))) stop("non-leaf subtree of length 0") # extract heights from each subtree for( k in 1:K){ res <<- c(res, attr(subtree[[k]], 'height')) } # continue only if there is not yet enough subtrees if( length(res) < n ){ for( k in 1:K){ .heights(subtree[[k]], n) } } } # extract at least the top h heights .heights(x, n) # sort by decreasing order res <- sort(res, decreasing=TRUE) res[n-1] } #' Fade Out the Upper Branches from a Dendrogram #' #' @param x a dendrogram #' @param n the number of groups #' #' @import digest #' @keywords internal cutdendro <- function(x, n){ # exit early if n <=1: nothing to do if( n <= 1 ) return(x) # add node digest ids to x x <- dendrapply(x, function(n){ attr(n, 'id') <- digest(attributes(n)) n }) # cut x in n groups # find the height where to cut h <- cutheight(x, n) cfx <- cut(x, h) # get the ids of the upper nodes ids <- sapply(cfx$lower, function(sub) attr(sub, 'id')) # highlight the upper branches with dot lines dts <- c(lty=2, lwd=1.2, col=8) a <- dendrapply(x, function(node){ a <- attributes(node) if( a$id %in% ids || (!is.leaf(node) && any(c(attr(node[[1]], 'id'), attr(node[[2]], 'id')) %in% ids)) ) attr(node, 'edgePar') <- dts node }) } # internal class definition for as_treedef <- function(x, ...){ res <- if( is(x, 'hclust') ) list(dendrogram=as.dendrogram(x), dist.method=x$dist.method, method=x$method) else list(dendrogram=x, ...) class(res) <- "aheatmap_treedef" res } rev.aheatmap_treedef <- function(x){ x$dendrogram <- rev(x$dendrogram) x } is_treedef <- function(x) is(x, 'aheatmap_treedef') isLogical <- function(x) isTRUE(x) || identical(x, FALSE) # Convert an index vector usable on the subset data into one usable on the # original data subset2orginal_idx <- function(idx, subset){ if( is.null(subset) || is.null(idx) ) idx else{ res <- subset[idx] attr(res, 'subset') <- idx res } } #' Cluster Matrix Rows in Annotated Heatmaps #' #' @param mat original input matrix that has already been appropriately subset in #' the caller function (\code{aheatmap}) #' @param param clustering specifications #' @param distfun Default distance method/function #' @param hclustfun Default clustering (linkage) method/function #' @param reorderfun Default reordering function #' @param na.rm Logical that specifies if NA values should be removed #' @param subset index (integer) vector specifying the subset indexes used to #' subset mat. This is required to be able to return the original indexes. #' #' @keywords internal cluster_mat = function(mat, param, distfun, hclustfun, reorderfun, na.rm=TRUE, subset=NULL, verbose = FALSE){ # do nothing if an hclust object is passed parg <- deparse(substitute(param)) Rowv <- if( is(param, 'hclust') || is(param, 'dendrogram') ){ # hclust or dendrograms are honoured res <- as_treedef(param) # subset if requested: convert into an index vector # the actuval subsetting is done by first case (index vector) if( !is.null(subset) ){ warning("Could not directly subset dendrogram/hclust object `", parg ,"`: using subset of the dendrogram's order instead.") # use dendrogram order instead of dendrogram itself param <- order.dendrogram(res$dendrogram) }else # EXIT: return treedef return(res) }else if( is(param, 'silhouette') ){ # use silhouette order si <- sortSilhouette(param) param <- attr(si, 'iOrd') } # index vectors are honoured if( is.integer(param) && length(param) > 1 ){ # subset if requested: reorder the subset indexes as in param if( !is.null(subset) ) param <- order(match(subset, param)) param }else{ # will compute dendrogram (NB: mat was already subset before calling cluster_mat) param <- if( is.integer(param) ) param else if( is.null(param) || isLogical(param) ) # use default reordering by rowMeans rowMeans(mat, na.rm=na.rm) else if( is.numeric(param) ){ # numeric reordering weights # subset if necessary if( !is.null(subset) ) param <- param[subset] param }else if( is.character(param) || is.list(param) ){ if( length(param) == 0 ) stop("aheatmap - Invalid empty character argument `", parg, "`.") # set default names if no names were provided if( is.null(names(param)) ){ if( length(param) > 3 ){ warning("aheatmap - Only using the three first elements of `", parg, "` for distfun and hclustfun respectively.") param <- param[1:3] } n.allowed <- c('distfun', 'hclustfun', 'reorderfun') names(param) <- head(n.allowed, length(param)) } # use the distance passed in param if( 'distfun' %in% names(param) ) distfun <- param[['distfun']] # use the clustering function passed in param if( 'hclustfun' %in% names(param) ) hclustfun <- param[['hclustfun']] # use the reordering function passed in param if( 'reorderfun' %in% names(param) ) reorderfun <- param[['reorderfun']] TRUE }else stop("aheatmap - Invalid value for argument `", parg, "`. See ?aheatmap.") # compute distances d <- if( isString(distfun) ){ distfun <- distfun[1] corr.methods <- c("pearson", "kendall", "spearman") av <- c("correlation", corr.methods, "euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski") i <- pmatch(distfun, av) if( is_NA(i) ) stop("aheatmap - Invalid dissimilarity method, must be one of: ", str_out(av, Inf)) distfun <- av[i] if(distfun == "correlation") distfun <- 'pearson' if(distfun %in% corr.methods){ # distance from correlation matrix if( verbose ) message("Using distance method: correlation (", distfun, ')') d <- dist(1 - cor(t(mat), method = distfun)) attr(d, 'method') <- distfun d }else{ if( verbose ) message("Using distance method: ", distfun) dist(mat, method = distfun) } }else if( is(distfun, "dist") ){ if( verbose ) message("Using dist object: ", distfun) distfun }else if( is.function(distfun) ){ if( verbose ) message("Using custom dist function") distfun(mat) }else stop("aheatmap - Invalid dissimilarity function: must be a character string, an object of class 'dist', or a function") # do hierarchical clustering hc <- if( is.character(hclustfun) ){ av <- c('ward', 'single', 'complete', 'average', 'mcquitty', 'median', 'centroid') i <- pmatch(hclustfun, av) if( is.na(i) ) stop("aheatmap - Invalid clustering method, must be one of: ", paste("'", av, "'", sep='', collapse=', ')) hclustfun <- av[i] if( verbose ) message("Using clustering method: ", hclustfun) hclust(d, method=hclustfun) }else if( is.function(hclustfun) ) hclustfun(d) else stop("aheatmap - Invalid clustering function: must be a character string or a function") #convert into a dendrogram dh <- as.dendrogram(hc) # customize the dendrogram plot: highlight clusters if( is.integer(param) ) dh <- cutdendro(dh, param) else if( is.numeric(param) && length(param)==nrow(mat) ) # reorder the dendrogram if necessary dh <- reorderfun(dh, param) # wrap up into a aheatmap_treedef object as_treedef(dh, dist.method=hc$dist.method, method=hc$method) } } #scale_rows = function(x){ # m = apply(x, 1, mean) # s = apply(x, 1, sd) # return((x - m) / s) #} scale_mat = function(x, scale, na.rm=TRUE){ av <- c("none", "row", "column", 'r1', 'c1') i <- pmatch(scale, av) if( is_NA(i) ) stop("scale argument shoud take values: 'none', 'row' or 'column'") scale <- av[i] switch(scale, none = x , row = { x <- sweep(x, 1L, rowMeans(x, na.rm = na.rm), check.margin = FALSE) sx <- apply(x, 1L, sd, na.rm = na.rm) sweep(x, 1L, sx, "/", check.margin = FALSE) } , column = { x <- sweep(x, 2L, colMeans(x, na.rm = na.rm), check.margin = FALSE) sx <- apply(x, 2L, sd, na.rm = na.rm) sweep(x, 2L, sx, "/", check.margin = FALSE) } , r1 = sweep(x, 1L, rowSums(x, na.rm = na.rm), '/', check.margin = FALSE) , c1 = sweep(x, 2L, colSums(x, na.rm = na.rm), '/', check.margin = FALSE) ) } .Rd.seed <- new.env() round.pretty <- function(x, min=2){ if( is.null(x) ) return(NULL) n <- 0 y <- round(sort(x), n) if( all(diff(y)==0) ) return( round(x, min) ) while( any(diff(y)==0) ){ n <- n+1 y <- round(sort(x), n) } dec <- max(min,n) round(x, dec) } generate_annotation_colours = function(annotation, annotation_colors, seed=TRUE){ if( is_NA(annotation_colors) ){ annotation_colors = list() } # use names from annotations if necessary/possible if( length(annotation_colors) > 0L && length(annotation_colors) <= length(annotation) && is.null(names(annotation_colors)) ){ names(annotation_colors) <- head(names(annotation), length(annotation_colors)) } count = 0 annotationLevels <- list() anames <- names(annotation) sapply(seq_along(annotation), function(i){ a <- annotation[[i]] if( class(annotation[[i]]) %in% c("character", "factor")){ # convert to character vector a <- if( is.factor(a) ) levels(a) else unique(a) count <<- count + nlevels(a) # merge if possible if( !is.null(anames) && anames[i]!='' ) annotationLevels[[anames[i]]] <<- unique(c(annotationLevels[[anames[i]]], a)) else annotationLevels <<- c(annotationLevels, list(a)) }else annotationLevels <<- c(annotationLevels, annotation[i]) }) annotation <- annotationLevels #str(annotationLevels) factor_colors = hcl(h = seq(1, 360, length.out = max(count+1,20)), 100, 70) # get random seeds to restore/update on exit rs <- RNGseed() on.exit({ # update local random seed on exit .Rd.seed$.Random.seed <- getRNG() # restore global random seed RNGseed(rs) }) # restore local random seed if it exists if( !is.null(.Rd.seed$.Random.seed) ) setRNG(.Rd.seed$.Random.seed) # set seed and restore on exit if( isTRUE(seed) ){ # reset .Random.seed to a dummy RNG in case the current kind is user-supplied: # we do not want to draw even once from the current RNG setRNG(c(401L, 0L, 0L)) set.seed(12345, 'default', 'default') } factor_colors <- sample(factor_colors) # pal(factor_colors); stop("sasa") res_colors <- list() for(i in 1:length(annotation)){ ann <- annotation[[i]] aname <- names(annotation)[i] # skip already generated colors acol_def <- res_colors[[aname]] if( !is.null(acol_def) ) next; acol <- annotation_colors[[aname]] if( is.null(acol) ){ res_colors[[aname]] <- if( class(annotation[[i]]) %in% c("character", "factor")){ lev <- ann ind = 1:length(lev) acol <- setNames(factor_colors[ind], lev) factor_colors = factor_colors[-ind] # conserve NA value acol[which(is.na(names(acol)))] <- NA acol } else{ h = round(runif(1) * 360) rg <- range(ann, na.rm=TRUE) if( rg[1] == rg[2] ) rg <- sort(c(0, rg[1])) setNames(rev(sequential_hcl(2, h, l = c(50, 95))), round.pretty(rg)) } }else{ acol <- if( length(acol) == 1 && grepl("^\\$", acol) ) # copy colors from other columns if the spec starts with '$' annotation_colors[[substr(acol, 2, nchar(acol))]] else if( !is.numeric(ann) ){ local({ #do this locally so that it does not affect `ann` # subset to the levels for which no colour has already been defined lev <- ann # subset to the levels for which no colour has already been defined # idx <- which(!lev %in% names(acol_def) & !is.na(lev)) # lev <- lev[idx] # #idx <- idx + length(acol_def) # # if( length(lev) == 0L ) acol_def # nothing to add # else { # convert to a palette of the number of levels if necessary nl <- length(lev) acol <- ccPalette(acol, nl) if( is.null(names(acol)) ) names(acol) <- lev c(acol_def, acol) } }) }else{ acol <- ccPalette(acol) if( is.null(names(acol)) ) names(acol) <- round.pretty(seq(min(ann, na.rm=TRUE), max(ann, na.rm=TRUE), length.out=length(acol))) acol } # update the colors if necessary if( !is.null(acol) ) res_colors[[aname]] <- acol } # store type information attr(res_colors[[aname]], 'afactor') <- !is.numeric(ann) } # return ordered colors as the annotations res_colors[names(annotation)[!duplicated(names(annotation))]] } # Create row/column names generate_dimnames <- function(x, n, ref){ if( is_NA(x) ) NULL else if( length(x) == n ) x else if( identical(x, 1) || identical(x, 1L) ) 1L:n else if( isString(x) ){ regexp <- "^/(.+)/([0-9]+)?$" if( grepl(regexp, x) ){ x <- str_match(x, regexp) p <- x[1,2] n <- if( x[1, 3] != '' ) as.numeric(x[1, 2]) else 2L s <- str_match(ref, p)[, n] ifelse(is.na(s), ref, s) } else paste(x, 1L:n, sep='') #print(str_match_all(x, "^/(([^%]*)(%[in])?)+/$")) } else stop("aheatmap - Invalid row/column label. Possible values are:" , " NA, a vector of correct length, value 1 (or 1L) or single character string.") } .make_annotation <- function(x, ord=NULL){ # convert into a data.frame if necessary if( !is.data.frame(x) ){ x <- if( is(x, 'ExpressionSet') ) Biobase::pData(x) else if( is.factor(x) || is.character(x) ) data.frame(Factor=x) else if( is.numeric(x) ) data.frame(Variable=x) else stop("aheatmap - Invalid annotation argument `", substitute(x), "`: must be a data.frame, a factor or a numeric vector") } # reorder if necessary if( !is.null(ord) ) x <- x[ord, , drop = F] # return modifed object x } renderAnnotations <- function(annCol, annRow, annotation_colors, verbose=getOption('verbose')){ # concatenate both col and row annotation annotation <- list() if( is_NA(annotation_colors) ) annotation_colors <- list() nc <- length(annCol) nr <- length(annRow) flag <- function(x, f){ if( missing(f) ) attr(x, 'flag') else{ attr(x, 'flag') <- f; x} } if( !is_NA(annCol) ) annotation <- c(annotation, sapply(as.list(annCol), flag, 'col', simplify=FALSE)) if( !is_NA(annRow) ) annotation <- c(annotation, sapply(as.list(annRow), flag, 'row', simplify=FALSE)) if( length(annotation) == 0 ) return( list(annCol=NA, annRow=NA, colors=NA) ) # generate the missing name n <- names(annotation) xnames <- paste('X', 1:length(annotation), sep='') if( is.null(n) ) names(annotation) <- xnames else names(annotation)[n==''] <- xnames[n==''] # preprocess the annotation color links if( !is.null(cnames <- names(annotation_colors)) ){ m <- str_match(cnames, "^@([^{]+)\\{([^}]+)\\}") apply(m, 1L, function(x){ # skip unmatched names if( is_NA(x[1]) ) return() acol <- annotation_colors[[x[1]]] # rename both annotation and annotation_colors if necessary if( x[2] != x[3] ){ annotation[[x[3]]] <<- annotation[[x[2]]] annotation[[x[2]]] <<- NULL if( !is_NA(acol) ) annotation_colors[[x[3]]] <<- acol annotation_colors[[x[1]]] <<- NULL } }) } # message("### ANNOTATION ###"); print(annotation) # message("### ANNOTATION COLORS ###"); print(annotation_colors) if( verbose ) message("Generate column annotation colours") annotation_colors <- generate_annotation_colours(annotation, annotation_colors) if( verbose > 2 ){ message("### Annotation colors ###") print(annotation_colors) message("#########################") } # bind each annotation with its respective color and regroup into column and row annotation res <- list() lapply(seq_along(annotation), function(i){ aname <- names(annotation)[i] acol <- annotation_colors[[aname]] if( is.null(acol) ) stop("aheatmap - No color was defined for annotation '", aname, "'.") attr(annotation[[i]], 'color') <- acol # put into the right annotation list if( flag(annotation[[i]]) == 'col' ) res$annCol <<- c(res$annCol, annotation[i]) else res$annRow <<- c(res$annRow, annotation[i]) }) res$annCol <- if( !is.null(res$annCol) ) convert_annotations(res$annCol, annotation_colors) else NA res$annRow <- if( !is.null(res$annRow) ) convert_annotations(res$annRow, annotation_colors) else NA res$colors <- annotation_colors # return result list res } # set/get special annotation handlers specialAnnotation <- local({ .empty <- list(list(), list()) .cache <- .empty function(margin, name, fun, clear=FALSE){ if( isTRUE(clear) ){ if( nargs() > 1L ) stop("Invalid call: no other argument can be passed when `clear=TRUE`") .cache <<- .empty return() } if( missing(name) && missing(fun) ){ return(.cache[[margin]]) }else if( is.list(name) ){ .cache[[margin]] <<- c(.cache[[margin]], name) }else if( missing(fun) ){ return(.cache[[margin]][[name]]) }else{ .cache[[margin]][[name]] <<- fun } } }) # Converts Subset Specification into Indexes subset_index <- function(x, margin, subset){ # if null then do nothing if( is.null(subset) ) return( NULL ) # get dimension n <- dim(x)[margin] dn <- dimnames(x)[[margin]] dt <- if( margin == 1L ) "rows" else "columns" so <- deparse(substitute(subset)) if( length(subset) == 0 ) stop("Invalid empty subset object `", so, "`") subIdx <- if( is.logical(subset) ){ if( length(subset) != n ){ if( n %% length(subset) == 0 ) subset <- rep(subset, n / length(subset)) else stop("Invalid length for logical subset argument `", so, "`: number of ", dt, " [" , n, "] is not a multiple of subset length [",length(subset),"].") } # convert into indexes which(subset) } else if( is.integer(subset) || is.character(subset) ){ if( length(subset) > n ) stop("Invalid too long integer/character subset argument `", so , "`: length must not exceed the number of ", dt, " [", n, "].") if( anyDuplicated(subset) ) warning("Duplicated index or name in subset argument `", so, "`.") # for character argument: match against dimname to convert into indexes if( is.character(subset) ){ if( is.null(dn) ) stop("Could not subset the ", dt, " with a character subset argument `", so, "`: no " , if( margin == 1L ) "rownames" else "colnames" , " are available.") msubset <- match(subset, dn) nas <- is.na(msubset) if( any(nas) ){ warning("Mismatch in character subset argument `", so ,"`: Could not find ", sum(nas), " out of ", length(subset), " names (" , paste("'", head(subset[nas], 5), "'", sep='', collapse=', ') , if( sum(nas) > 5 ) ", ... ", ").") msubset <- msubset[!nas] } subset <- msubset } subset }else stop("Invalid subset argument `", so, "`: should be a logical, integer or character vector.") # return the indexes sorted sort(subIdx) } #' Annotated Heatmaps #' #' The function \code{aheatmap} plots high-quality heatmaps, with a detailed legend #' and unlimited annotation tracks for both columns and rows. #' The annotations are coloured differently according to their type #' (factor or numeric covariate). #' Although it uses grid graphics, the generated plot is compatible with base #' layouts such as the ones defined with \code{'mfrow'} or \code{\link{layout}}, #' enabling the easy drawing of multiple heatmaps on a single a plot -- at last!. #' #' The development of this function started as a fork of the function #' \code{pheatmap} from the \pkg{pheatmap} package, and provides #' several enhancements such as: #' \itemize{ #' \item argument names match those used in the base function \code{\link{heatmap}}; #' \item unlimited number of annotation for \strong{both} columns and rows, #' with simplified and more flexible interface; #' \item easy specification of clustering methods and colors; #' \item return clustering data, as well as grid grob object. #' } #' #' Please read the associated vignette for more information and sample code. #' #' @section PDF graphic devices: if plotting on a PDF graphic device -- started with \code{\link{pdf}}, #' one may get generate a first blank page, due to internals of standard functions from #' the \pkg{grid} package that are called by \code{aheatmap}. #' The \pkg{NMF} package ships a custom patch that fixes this issue. #' However, in order to comply with CRAN policies, the patch is \strong{not} applied by default #' and the user must explicitly be enabled it. #' This can be achieved on runtime by either setting the NMF specific option 'grid.patch' #' via \code{nmf.options(grid.patch=TRUE)}, or on load time if the environment variable #' 'R_PACKAGE_NMF_GRID_PATCH' is defined and its value is something that is not equivalent #' to \code{FALSE} (i.e. not '', 'false' nor 0). #' #' @param x numeric matrix of the values to be plotted. #' An \emph{ExpressionSet} object can also be passed, in which case the expression values #' are plotted (\code{exprs(x)}). #' #' @param color colour specification for the heatmap. Default to palette #' '-RdYlBu2:100', i.e. reversed palette 'RdYlBu2' (a slight modification of #' RColorBrewer's palette 'RdYlBu') with 100 colors. #' Possible values are: #' \itemize{ #' \item a character/integer vector of length greater than 1 that is directly used #' and assumed to contain valid R color specifications. #' \item a single color/integer (between 0 and 8)/other numeric value #' that gives the dominant colors. Numeric values are converted into a pallete #' by \code{rev(sequential_hcl(2, h = x, l = c(50, 95)))}. Other values are #' concatenated with the grey colour '#F1F1F1'. #' \item one of RColorBrewer's palette name (see \code{\link[RColorBrewer]{display.brewer.all}}) #' , or one of 'RdYlBu2', 'rainbow', 'heat', 'topo', 'terrain', 'cm'. #' } #' When the coluor palette is specified with a single value, and is negative or #' preceded a minus ('-'), the reversed palette is used. #' The number of breaks can also be specified after a colon (':'). For example, #' the default colour palette is specified as '-RdYlBu2:100'. #' #' @param breaks a sequence of numbers that covers the range of values in \code{x} and is one #' element longer than color vector. Used for mapping values to colors. Useful, if needed #' to map certain values to certain colors. If value is NA then the #' breaks are calculated automatically. If \code{breaks} is a single value, #' then the colour palette is centered on this value. #' #' @param border_color color of cell borders on heatmap, use NA if no border should be #' drawn. #' #' @param cellwidth individual cell width in points. If left as NA, then the values #' depend on the size of plotting window. #' #' @param cellheight individual cell height in points. If left as NA, #' then the values depend on the size of plotting window. #' #' @param scale character indicating how the values should scaled in #' either the row direction or the column direction. Note that the scaling is #' performed after row/column clustering, so that it has no effect on the #' row/column ordering. #' Possible values are: #' \itemize{ #' \item \code{"row"}: center and standardize each row separately to row Z-scores #' \item \code{"column"}: center and standardize each column separately to column Z-scores #' \item \code{"r1"}: scale each row to sum up to one #' \item \code{"c1"}: scale each column to sum up to one #' \item \code{"none"}: no scaling #' } #' #' @param Rowv clustering specification(s) for the rows. It allows to specify #' the distance/clustering/ordering/display parameters to be used for the #' \emph{rows only}. #' Possible values are: #' \itemize{ #' \item \code{TRUE} or \code{NULL} (to be consistent with \code{\link{heatmap}}): #' compute a dendrogram from hierarchical clustering using the distance and #' clustering methods \code{distfun} and \code{hclustfun}. #' #' \item \code{NA}: disable any ordering. In this case, and if not otherwise #' specified with argument \code{revC=FALSE}, the heatmap shows the input matrix #' with the rows in their original order, with the first row on top to the last #' row at the bottom. Note that this differ from the behaviour or \code{\link{heatmap}}, #' but seemed to be a more sensible choice when vizualizing a matrix without #' reordering. #' #' \item an integer vector of length the number of rows of the input matrix #' (\code{nrow(x)}), that specifies the row order. As in the case \code{Rowv=NA}, #' the ordered matrix is shown first row on top, last row at the bottom. #' #' \item a character vector or a list specifying values to use instead of arguments #' \code{distfun}, \code{hclustfun} and \code{reorderfun} when clustering the #' rows (see the respective argument descriptions for a list of accepted #' values). #' If \code{Rowv} has no names, then the first element is used for \code{distfun}, #' the second (if present) is used for \code{hclustfun}, and the third #' (if present) is used for \code{reorderfun}. #' #' \item a numeric vector of weights, of length the number of rows of the input matrix, #' used to reorder the internally computed dendrogram \code{d} #' by \code{reorderfun(d, Rowv)}. #' #' \item \code{FALSE}: the dendrogram \emph{is} computed using methods \code{distfun}, #' \code{hclustfun}, and \code{reorderfun} but is not shown. #' #' \item a single integer that specifies how many subtrees (i.e. clusters) #' from the computed dendrogram should have their root faded out. #' This can be used to better highlight the different clusters. #' #' \item a single double that specifies how much space is used by the computed #' dendrogram. That is that this value is used in place of \code{treeheight}. #' } #' #' @param Colv clustering specification(s) for the columns. It accepts the same #' values as argument \code{Rowv} (modulo the expected length for vector specifications), #' and allow specifying the distance/clustering/ordering/display parameters to #' be used for the \emph{columns only}. #' \code{Colv} may also be set to \code{"Rowv"}, in which case the dendrogram #' or ordering specifications applied to the rows are also applied to the #' columns. Note that this is allowed only for square input matrices, #' and that the row ordering is in this case by default reversed #' (\code{revC=TRUE}) to obtain the diagonal in the standard way #' (from top-left to bottom-right). #' See argument \code{Rowv} for other possible values. #' #' @param revC a logical that specify if the \emph{row order} defined by #' \code{Rowv} should be reversed. This is mainly used to get the rows displayed #' from top to bottom, which is not the case by default. Its default value is #' computed at runtime, to suit common situations where natural ordering is a #' more sensible choice: no or fix ordering of the rows (\code{Rowv=NA} or an #' integer vector of indexes -- of length > 1), and when a symmetric ordering is #' requested -- so that the diagonal is shown as expected. #' An argument in favor of the "odd" default display (bottom to top) is that the #' row dendrogram is plotted from bottom to top, and reversing its reorder may #' take a not too long but non negligeable time. #' #' @param distfun default distance measure used in clustering rows and columns. #' Possible values are: #' \itemize{ #' \item all the distance methods supported by \code{\link{dist}} #' (e.g. "euclidean" or "maximum"). #' #' \item all correlation methods supported by \code{\link{cor}}, #' such as \code{"pearson"} or \code{"spearman"}. #' The pairwise distances between rows/columns are then computed as #' \code{d <- dist(1 - cor(..., method = distfun))}. #' #' One may as well use the string "correlation" which is an alias for "pearson". #' #' \item an object of class \code{dist} such as returned by \code{\link{dist}} or #' \code{\link{as.dist}}. #' } #' #' @param hclustfun default clustering method used to cluster rows and columns. #' Possible values are: #' \itemize{ #' \item a method name (a character string) supported by \code{\link{hclust}} #' (e.g. \code{'average'}). #' \item an object of class \code{hclust} such as returned by \code{\link{hclust}} #' \item a dendrogram #' } #' #' @param reorderfun default dendrogram reordering function, used to reorder the #' dendrogram, when either \code{Rowv} or \code{Colv} is a numeric weight vector, #' or provides or computes a dendrogram. It must take 2 parameters: a dendrogram, #' and a weight vector. #' #' @param subsetRow Specification of subsetting the rows before drawing the #' heatmap. #' Possible values are: #' \itemize{ #' \item an integer vector of length > 1 specifying the indexes of the rows to #' keep; #' \item a character vector of length > 1 specyfing the names of the rows to keep. #' These are the original rownames, not the names specified in \code{labRow}. #' \item a logical vector of length > 1, whose elements are recycled if the #' vector has not as many elements as rows in \code{x}. #' } #' Note that in the case \code{Rowv} is a dendrogram or hclust object, it is first #' converted into an ordering vector, and cannot be displayed -- and a warning is thrown. #' #' @param subsetCol Specification of subsetting the columns before drawing the #' heatmap. It accepts the similar values as \code{subsetRow}. See details above. #' #' @param txt character matrix of the same size as \code{x}, that contains text to #' display in each cell. #' \code{NA} values are allowed and are not displayed. #' See demo for an example. #' #' @param treeheight how much space (in points) should be used to display #' dendrograms. If specified as a single value, it is used for both dendrograms. #' A length-2 vector specifies separate values for the row and #' column dendrogram respectively. #' Default value: 50 points. #' #' @param legend boolean value that determines if a colour ramp for the heatmap's #' colour palette should be drawn or not. #' Default is \code{TRUE}. #' #' @param annCol specifications of column annotation tracks displayed as coloured #' rows on top of the heatmaps. The annotation tracks are drawn from bottom to top. #' A single annotation track can be specified as a single vector; multiple tracks #' are specified as a list, a data frame, or an \emph{ExpressionSet} object, in #' which case the phenotypic data is used (\code{pData(eset)}). #' Character or integer vectors are converted and displayed as factors. #' Unnamed tracks are internally renamed into \code{Xi}, with i being incremented for #' each unamed track, across both column and row annotation tracks. #' For each track, if no corresponding colour is specified in argument #' \code{annColors}, a palette or a ramp is automatically computed and named #' after the track's name. #' #' @param annRow specifications of row annotation tracks displayed as coloured #' columns on the left of the heatmaps. The annotation tracks are drawn from #' left to right. The same conversion, renaming and colouring rules as for argument #' \code{annCol} apply. #' #' @param annColors list for specifying annotation track colors manually. It is #' possible to define the colors for only some of the annotations. Check examples for #' details. #' #' @param annLegend boolean value specifying if the legend for the annotation tracks #' should be drawn or not. #' Default is \code{TRUE}. #' #' @param labRow labels for the rows. #' @param labCol labels for the columns. See description for argument \code{labRow} #' for a list of the possible values. #' #' @param fontsize base fontsize for the plot #' @param cexRow fontsize for the rownames, specified as a fraction of argument #' \code{fontsize}. #' @param cexCol fontsize for the colnames, specified as a fraction of argument #' \code{fontsize}. #' #' @param main Main title as a character string or a grob. #' @param sub Subtitle as a character string or a grob. #' @param info (experimental) Extra information as a character vector or a grob. #' If \code{info=TRUE}, information about the clustering methods is displayed #' at the bottom of the plot. #' #' @param filename file path ending where to save the picture. Currently following #' formats are supported: png, pdf, tiff, bmp, jpeg. Even if the plot does not fit into #' the plotting window, the file size is calculated so that the plot would fit there, #' unless specified otherwise. #' @param width manual option for determining the output file width in #' @param height manual option for determining the output file height in inches. #' #' @param verbose if \code{TRUE} then verbose messages are displayed and the #' borders of some viewports are highlighted. It is entended for debugging #' purposes. #' #' @param gp graphical parameters for the text used in plot. Parameters passed to #' \code{\link{grid.text}}, see \code{\link{gpar}}. #' #' @author #' Original version of \code{pheatmap}: Raivo Kolde #' #' Enhancement into \code{aheatmap}: Renaud Gaujoux #' #' @examples #' #' ## See the demo 'aheatmap' for more examples: #' \dontrun{ #' demo('aheatmap') #' } #' #' # Generate random data #' n <- 50; p <- 20 #' x <- abs(rmatrix(n, p, rnorm, mean=4, sd=1)) #' x[1:10, seq(1, 10, 2)] <- x[1:10, seq(1, 10, 2)] + 3 #' x[11:20, seq(2, 10, 2)] <- x[11:20, seq(2, 10, 2)] + 2 #' rownames(x) <- paste("ROW", 1:n) #' colnames(x) <- paste("COL", 1:p) #' #' ## Default heatmap #' aheatmap(x) #' #' ## Distance methods #' aheatmap(x, Rowv = "correlation") #' aheatmap(x, Rowv = "man") # partially matched to 'manhattan' #' aheatmap(x, Rowv = "man", Colv="binary") #' #' # Generate column annotations #' annotation = data.frame(Var1 = factor(1:p %% 2 == 0, labels = c("Class1", "Class2")), Var2 = 1:10) #' aheatmap(x, annCol = annotation) #' #' @demo Annotated heatmaps #' #' # Generate random data #' n <- 50; p <- 20 #' x <- abs(rmatrix(n, p, rnorm, mean=4, sd=1)) #' x[1:10, seq(1, 10, 2)] <- x[1:10, seq(1, 10, 2)] + 3 #' x[11:20, seq(2, 10, 2)] <- x[11:20, seq(2, 10, 2)] + 2 #' rownames(x) <- paste("ROW", 1:n) #' colnames(x) <- paste("COL", 1:p) #' #' ## Scaling #' aheatmap(x, scale = "row") #' aheatmap(x, scale = "col") # partially matched to 'column' #' aheatmap(x, scale = "r1") # each row sum up to 1 #' aheatmap(x, scale = "c1") # each colum sum up to 1 #' #' ## Heatmap colors #' aheatmap(x, color = colorRampPalette(c("navy", "white", "firebrick3"))(50)) #' # color specification as an integer: use R basic colors #' aheatmap(x, color = 1L) #' # color specification as a negative integer: use reverse basic palette #' aheatmap(x, color = -1L) #' # color specification as a numeric: use HCL color #' aheatmap(x, color = 1) #' # do not cluster the rows #' aheatmap(x, Rowv = NA) #' # no heatmap legend #' aheatmap(x, legend = FALSE) #' # cell and font size #' aheatmap(x, cellwidth = 10, cellheight = 5) #' #' # directly write into a file #' aheatmap(x, cellwidth = 15, cellheight = 12, fontsize = 8, filename = "aheatmap.pdf") #' unlink('aheatmap.pdf') #' #' # Generate column annotations #' annotation = data.frame(Var1 = factor(1:p %% 2 == 0, labels = c("Class1", "Class2")), Var2 = 1:10) #' #' aheatmap(x, annCol = annotation) #' aheatmap(x, annCol = annotation, annLegend = FALSE) #' #' #' # Specify colors #' Var1 = c("navy", "darkgreen") #' names(Var1) = c("Class1", "Class2") #' Var2 = c("lightgreen", "navy") #' #' ann_colors = list(Var1 = Var1, Var2 = Var2) #' #' aheatmap(x, annCol = annotation, annColors = ann_colors) #' #' # Specifying clustering from distance matrix #' drows = dist(x, method = "minkowski") #' dcols = dist(t(x), method = "minkowski") #' aheatmap(x, Rowv = drows, Colv = dcols) #' #' # Display text in each cells #' t <- outer(as.character(outer(letters, letters, paste0)), letters, paste0)[1:n, 1:p] #' aheatmap(x, txt = t) #' # NA values are shown as empty cells #' t.na <- t #' t.na[sample(length(t.na), 500)] <- NA # half of the cells #' aheatmap(x, txt = t.na) #' #' @export aheatmap = function(x , color = '-RdYlBu2:100' , breaks = NA, border_color=NA, cellwidth = NA, cellheight = NA, scale = "none" , Rowv=TRUE, Colv=TRUE , revC = identical(Colv, "Rowv") || is_NA(Rowv) || (is.integer(Rowv) && length(Rowv) > 1) || is(Rowv, 'silhouette') , distfun = "euclidean", hclustfun = "complete", reorderfun = function(d,w) reorder(d,w) , treeheight = 50 , legend = TRUE, annCol = NA, annRow = NA, annColors = NA, annLegend = TRUE , labRow = NULL, labCol = NULL , subsetRow = NULL, subsetCol = NULL , txt = NULL , fontsize=10, cexRow = min(0.2 + 1/log10(nr), 1.2), cexCol = min(0.2 + 1/log10(nc), 1.2) , filename = NA, width = NA, height = NA , main = NULL, sub = NULL, info = NULL , verbose=getOption('verbose'), gp = gpar()){ # set verbosity level ol <- lverbose(verbose) on.exit( lverbose(ol) ) # convert ExpressionSet into if( is(x, 'ExpressionSet') ){ requireNamespace('Biobase') #library(Biobase) if( isTRUE(annCol) ) annCol <- atrack(x) x <- Biobase::exprs(x) } # rename to old parameter name mat <- x if( !is.null(txt) ){ if( !all(dim(mat), dim(x)) ){ stop("Incompatible data and text dimensions: arguments x and txt must have the same size.") } } # init result list res <- list() # treeheight: use common or separate spec for rows and columns if( length(treeheight) == 1 ) treeheight <- c(treeheight, treeheight) treeheight_row <- treeheight[1] treeheight_col <- treeheight[2] ## SUBSET: process subset argument for rows/columsn if requested. # this has to be done before relabelling and clustering # but the actual subsetting has to be done after relabelling and before # clustering. # Here one convert a subset argument into an interger vector with the indexes if( !is.null(subsetRow) ){ if( verbose ) message("Compute row subset indexes") subsetRow <- subset_index(mat, 1L, subsetRow) } if( !is.null(subsetCol) ){ if( verbose ) message("Compute column subset indexes") subsetCol <- subset_index(mat, 2L, subsetCol) } ## LABELS: set the row/column labels # label row numerically if no rownames if( is.null(labRow) && is.null(rownames(mat)) ) labRow <- 1L if( !is.null(labRow) ){ if( verbose ) message("Process labRow") rownames(mat) <- generate_dimnames(labRow, nrow(mat), rownames(mat)) } # label columns numerically if no colnames if( is.null(labCol) && is.null(colnames(mat)) ) labCol <- 1L if( !is.null(labCol) ){ if( verbose ) message("Process labCol") colnames(mat) <- generate_dimnames(labCol, ncol(mat), colnames(mat)) } ## DO SUBSET if( !is.null(subsetRow) ){ mat <- mat[subsetRow, ] } if( !is.null(subsetCol) ){ mat <- mat[, subsetCol] } ## CLUSTERING # Do row clustering tree_row <- if( !is_NA(Rowv) ){ if( verbose ) message("Cluster rows") # single numeric Rowv means treeheight if( isReal(Rowv) ){ # treeheight treeheight_row <- Rowv # do cluster the rows Rowv <- TRUE } cluster_mat(mat, Rowv , distfun=distfun, hclustfun=hclustfun , reorderfun=reorderfun, subset=subsetRow , verbose = verbose) } else NA # do not show the tree if Rowv=FALSE or not a tree if( identical(Rowv, FALSE) || !is_treedef(tree_row) ) treeheight_row <- 0 # Do col clustering tree_col <- if( !is_NA(Colv) ){ if( identical(Colv,"Rowv") ){ # use row indexing if requested if( ncol(mat) != nrow(mat) ) stop("aheatmap - Colv='Rowv' but cannot treat columns and rows symmetrically: input matrix is not square.") treeheight_col <- treeheight_row tree_row }else{ # single numeric Colv means treeheight if( isReal(Colv) ){ # tree height treeheight_col <- Colv # do cluster the columns Colv <- TRUE } if( verbose ) message("Cluster columns") cluster_mat(t(mat), Colv , distfun=distfun, hclustfun=hclustfun , reorderfun=reorderfun, subset=subsetCol , verbose = verbose) } } else NA # do not show the tree if Colv=FALSE if( identical(Colv, FALSE) || !is_treedef(tree_col) ) treeheight_col <- 0 ## ORDER THE DATA if( !is_NA(tree_row) ){ # revert the row order if requested if( revC ){ if( verbose ) message("Reverse row clustering") tree_row <- rev(tree_row) } # store the order and row tree if possible if( is_treedef(tree_row) ){ res$Rowv <- tree_row$dendrogram res$rowInd <- order.dendrogram(tree_row$dendrogram) if( length(res$rowInd) != nrow(mat) ) stop("aheatmap - row dendrogram ordering gave index of wrong length (", length(res$rowInd), ")") } else{ res$rowInd <- tree_row tree_row <- NA } }else if( revC ){ # revert the row order if requested res$rowInd <- nrow(mat):1L } # possibly map the index to the original data index res$rowInd <- subset2orginal_idx(res$rowInd, subsetRow) # order the rows if necessary if( !is.null(res$rowInd) ){ # check validity of ordering if( !is.integer(res$rowInd) || length(res$rowInd) != nrow(mat) ) stop("aheatmap - Invalid row ordering: should be an integer vector of length nrow(mat)=", nrow(mat)) if( verbose ) message("Order rows") subInd <- attr(res$rowInd, 'subset') ri <- if( is.null(subInd) ) res$rowInd else subInd mat <- mat[ri, , drop=FALSE] # data if( !is.null(txt) ) txt <- txt[ri, , drop = FALSE] # text } if( !is_NA(tree_col) ){ # store the column order and tree if possible if( is_treedef(tree_col) ){ res$Colv <- tree_col$dendrogram res$colInd <- order.dendrogram(tree_col$dendrogram) if( length(res$colInd) != ncol(mat) ) stop("aheatmap - column dendrogram ordering gave index of wrong length (", length(res$colInd), ")") }else{ res$colInd <- tree_col tree_col <- NA } } # possibly map the index to the original data index res$colInd <- subset2orginal_idx(res$colInd, subsetCol) # order the columns if necessary if( !is.null(res$colInd) ){ # check validity of ordering if( !is.integer(res$colInd) || length(res$colInd) != ncol(mat) ) stop("aheatmap - Invalid column ordering: should be an integer vector of length ncol(mat)=", ncol(mat)) if( verbose ) message("Order columns") subInd <- attr(res$colInd, 'subset') ci <- if( is.null(subInd) ) res$colInd else subInd mat <- mat[, ci, drop=FALSE] # data if( !is.null(txt) ) txt <- txt[, ci, drop = FALSE] # text } # adding clustering info if( isTRUE(info) || is.character(info) ){ if( verbose ) message("Compute info") if( !is.character(info) ) info <- NULL linfo <- NULL if( is_treedef(tree_row) && !is.null(tree_row$dist.method) ) linfo <- paste("rows:", tree_row$dist.method, '/', tree_row$method) if( is_treedef(tree_col) && !is.null(tree_col$dist.method) ) linfo <- paste(linfo, paste(" - cols:", tree_col$dist.method, '/', tree_col$method)) info <- c(info, linfo) } # drop extra info except dendrograms for trees if( is_treedef(tree_col) ) tree_col <- tree_col$dendrogram if( is_treedef(tree_row) ) tree_row <- tree_row$dendrogram # Preprocess matrix if( verbose ) message("Scale matrix") mat = as.matrix(mat) mat = scale_mat(mat, scale) ## Colors and scales # load named palette if necessary color <- ccRamp(color) # generate breaks if necessary if( is_NA(breaks) || isNumber(breaks) ){ if( verbose ) message("Generate breaks") # if a single number: center the breaks on this value cbreaks <- if( isNumber(breaks) ) breaks else NA breaks = generate_breaks(as.vector(mat), length(color), center=cbreaks) } if( isTRUE(legend) ){ if( verbose ) message("Generate data legend breaks") legend = grid.pretty(range(as.vector(breaks))) } else { legend = NA } mat = scale_colours(mat, col = color, breaks = breaks) annotation_legend <- annLegend annotation_colors <- annColors # render annotation tracks for both rows and columns annCol_processed <- atrack(annCol, order=res$colInd, .SPECIAL=specialAnnotation(2L), .DATA=amargin(x,2L), .CACHE=annRow) annRow_processed <- atrack(annRow, order=res$rowInd, .SPECIAL=specialAnnotation(1L), .DATA=amargin(x,1L), .CACHE=annCol) specialAnnotation(clear=TRUE) annTracks <- renderAnnotations(annCol_processed, annRow_processed , annotation_colors = annotation_colors , verbose=verbose) # # retrieve dimension for computing cexRow and cexCol (evaluated from the arguments) nr <- nrow(mat); nc <- ncol(mat) # Draw heatmap res$vp <- heatmap_motor(mat, border_color = border_color, cellwidth = cellwidth, cellheight = cellheight , treeheight_col = treeheight_col, treeheight_row = treeheight_row, tree_col = tree_col, tree_row = tree_row , filename = filename, width = width, height = height, breaks = breaks, color = color, legend = legend , annTracks = annTracks, annotation_legend = annotation_legend , txt = txt , fontsize = fontsize, fontsize_row = cexRow * fontsize, fontsize_col = cexCol * fontsize , main = main, sub = sub, info = info , verbose = verbose , gp = gp) # return info about the plot invisible(res) } #' @import gridBase grid.base.mix <- function(opar, trace = getOption('verbose')){ if( !missing(opar) ){ if( !is.null(opar) ){ if( trace ) message("grid.base.mix - restore") upViewport(2) par(opar) } return(invisible()) } if( trace ) message("grid.base.mix - init") if( trace ) grid.rect(gp=gpar(lwd=40, col="blue")) opar <- par(xpd=NA) if( trace ) grid.rect(gp=gpar(lwd=30, col="green")) if( trace ) message("grid.base.mix - plot.new") plot.new() if( trace ) grid.rect(gp=gpar(lwd=20, col="black")) vps <- baseViewports() pushViewport(vps$inner) if( trace ) grid.rect(gp=gpar(lwd=10, col="red")) pushViewport(vps$figure) # if( trace ) grid.rect(gp=gpar(lwd=3, col="green")) # pushViewport(vps$plot) # upViewport(2) # if( trace ) grid.rect(gp=gpar(lwd=3, col="pink")) # pushViewport(viewport(x=unit(0.5, "npc"), y=unit(0, "npc"), width=unit(0.5, "npc"), height=unit(1, "npc"), just=c("left","bottom"))) if( trace ) grid.rect(gp=gpar(lwd=3, col="yellow")) opar } if( FALSE ){ testmix <- function(){ opar <- mixplot.start(FALSE) profplot(curated$data$model, curated$fits[[1]]) mixplot.add(TRUE) basismarker(curated$fits[[1]], curated$data$markers) mixplot.end() par(opar) } dd <- function(d, horizontal = TRUE, ...){ grid.rect(gp = gpar(col = "blue", lwd = 2)) opar <- par(plt = gridPLT(), new = TRUE) on.exit(par(opar)) plot(d, horiz=horizontal, xaxs="i", yaxs="i", axes=FALSE, leaflab="none", ...) } toto <- function(new=FALSE){ library(RGraphics) set.seed(123456) x <- matrix(runif(30*20), 30) x <- crossprod(x) d <- as.dendrogram(hclust(dist(x))) #grid.newpage() if( new ) plot.new() lo <- grid.layout(nrow=2, ncol=2) pushViewport(viewport(layout=lo)) pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 1)) dd(d) upViewport() pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) dd(d, FALSE) upViewport() pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 2)) grid.imageGrob(nrow(x), ncol(x), x) upViewport() popViewport() stop("END toto") } test <- function(){ pdf('aheatmap.pdf') #try(v <- aheatmap(consensus(res), color='grey:100', Colv=2L, verbose=TRUE)) try(v <- consensusmap(res, color='grey:100', Colv=2L, verbose=TRUE)) dev.off() } test2 <- function(){ op <- par(mfrow=c(1,2)) on.exit(par(op)) #try(v <- aheatmap(consensus(res), color='grey:100', Colv=2L, verbose=TRUE)) try(v <- consensusmap(res, verbose=TRUE)) try(v <- consensusmap(res, color='grey:100', Colv=2L, verbose=TRUE)) } testsw <- function(file=TRUE){ if(file ){ pdf('asweave.pdf', width=20, height=7) on.exit(dev.off()) } opar <- par(mfrow=c(1,2)) # removing all automatic annotation tracks coefmap(res, tracks=NA, verbose=TRUE) # customized plot coefmap(res, Colv = 'euclidean', Rowv='max', verbose=TRUE) # , main = "Metagene contributions in each sample", labCol = NULL # , tracks = c(Metagene='basis'), annCol = list(Class=a, Index=c) # , annColors = list(Metagene='Set2') # , info = TRUE) par(opar) } testvp <- function(file=TRUE){ if(file ){ pdf('avp.pdf', width=20, height=7) on.exit(dev.off()) } plot.new() lo <- grid.layout(nrow=1, ncol=2) pushViewport(viewport(layout=lo)) pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 1)) basismap(res, Colv='eucl', verbose=TRUE) upViewport() pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) coefmap(res, tracks=NA, verbose=TRUE) upViewport() popViewport() } } NMF/R/nmf-package.R0000644000176200001440000001074214560455543013406 0ustar liggesusers#' @import graphics #' @import rngtools #' @import digest #' @import stringr #' @import stats #' @import methods NULL #library(digest) #' Defunct Functions and Classes in the NMF Package #' #' @name NMF-defunct #' @rdname NMF-defunct NULL #' Deprecated Functions in the Package NMF #' #' @param object an R object #' @param ... extra arguments #' #' @name NMF-deprecated #' @rdname NMF-deprecated NULL #' Algorithms and framework for Nonnegative Matrix Factorization (NMF). #' #' This package provides a framework to perform Non-negative Matrix Factorization (NMF). #' It implements a set of already published algorithms and seeding methods, and provides a framework #' to test, develop and plug new/custom algorithms. #' Most of the built-in algorithms have been optimized in C++, and the main interface function provides #' an easy way of performing parallel computations on multicore machines. #' #' \code{\link{nmf}} Run a given NMF algorithm #' #' @author Renaud Gaujoux \email{renaud@@cbio.uct.ac.za} #' @name NMF-package #' @aliases NMF #' @docType package #' @useDynLib NMF, .registration = TRUE #' #' @bibliography ~/Documents/articles/library.bib #' @references #' \url{http://cran.r-project.org/} #' #' \url{http://nmf.r-forge.project.org} #' @keywords package #' @seealso \code{\link{nmf}} #' @examples #' # generate a synthetic dataset with known classes #' n <- 50; counts <- c(5, 5, 8); #' V <- syntheticNMF(n, counts) #' #' # perform a 3-rank NMF using the default algorithm #' res <- nmf(V, 3) #' #' basismap(res) #' coefmap(res) #' NA devnmf <- function(){ .LOCAL_PKG_NAME <- 'NMF' requireNamespace('devtools') devtools::load_all(.LOCAL_PKG_NAME) compile_src(.LOCAL_PKG_NAME) } # local config info nmfConfig <- mkoptions() .onLoad <- function(libname, pkgname) { # set default number of cores if( isCHECK() ){ options(cores=2) }else{ if( nchar(nc <- Sys.getenv('R_PACKAGE_NMF_CORES')) > 0 ){ try({ nmf.options(cores=as.numeric(nc)) }) } } # use grid patch? nmf.options(grid.patch = !isFALSE(Sys.getenv_value('R_PACKAGE_NMF_GRID_PATCH'))) pkgEnv <- packageEnv() .init.sequence <- function(){ ## 0. INITIALIZE PACKAGE SPECFIC OPTIONS #.init.nmf.options() ## 1. INITIALIZE THE NMF MODELS .init.nmf.models() ## 2. INITIALIZE BIOC LAYER b <- body(.onLoad.nmf.bioc) bioc.loaded <- eval(b, envir=pkgEnv) nmfConfig(bioc=bioc.loaded) # 3. SHARED MEMORY if( .Platform$OS.type != 'windows' ){ msg <- if( !require.quiet('bigmemory', character.only=TRUE) ) 'bigmemory' else if( !require.quiet('synchronicity', character.only=TRUE) ) 'synchronicity' else TRUE nmfConfig(shared.memory=msg) } # } # run intialization sequence suppressing messages or not depending on verbosity options .init.sequence() if( getOption('verbose') ) .init.sequence() else suppressMessages(.init.sequence()) return(invisible()) } .onUnload <- function(libpath) { # unload compiled library dlls <- names(base::getLoadedDLLs()) if ( 'NMF' %in% dlls ) library.dynam.unload("NMF", libpath); } .onAttach <- function(libname, pkgname){ # build startup message msg <- NULL details <- NULL ## 1. CHECK BIOC LAYER bioc.loaded <- nmfConfig('bioc')[[1L]] msg <- paste0(msg, 'BioConductor layer') if( is(bioc.loaded, 'try-error') ) msg <- paste0(msg, ' [ERROR]') else if ( isTRUE(bioc.loaded) ) msg <- paste0(msg, ' [OK]') else{ msg <- paste0(msg, ' [NO: missing Biobase]') details <- c(details, " To enable the Bioconductor layer, try: install.extras('", pkgname, "') [with Bioconductor repository enabled]") } # 2. SHARED MEMORY msg <- paste0(msg, ' | Shared memory capabilities') if( .Platform$OS.type != 'windows' ){ conf <- nmfConfig('shared.memory')[[1L]] if( isTRUE(conf) ) msg <- paste0(msg, ' [OK]') else{ msg <- paste0(msg, ' [NO: ', conf, ']') details <- c(details, " To enable shared memory capabilities, try: install.extras('", pkgname, "')") } }else msg <- paste0(msg, ' [NO: windows]') # # 3. NUMBER OF CORES msg <- paste0(msg, ' | Cores ', getMaxCores(), '/', getMaxCores(limit=FALSE)) # # FINAL. CRAN FLAG if( isCHECK() ){ msg <- paste0(msg, ' | CRAN check') } # # print startup message ver <- if( isDevNamespace() ){ paste0(' [', utils::packageVersion(pkgname), '-devel', ']') }#else{ # utils::packageVersion(pkgname, lib.loc = libname) # } packageStartupMessage(pkgname, ver, ' - ', msg) if( !is.null(details) ){ packageStartupMessage(paste(details, collapse="\n")) } } NMF/R/fixed-terms.R0000644000176200001440000002620014333176413013452 0ustar liggesusers# Interface for NMF models that contain fixed terms # # Author: Renaud Gaujoux # Creation: 03 Jul 2012 ############################################################################### #' @include NMF-class.R #' @include NMFstd-class.R NULL #' Concatenating NMF Models #' #' Binds compatible matrices and NMF models together. #' #' @param x an NMF model #' @param ... other objects to concatenate. Currently only two objects at a time #' can be concatenated (i.e. \code{x} and \code{..1}). #' @param margin integer that indicates the margin along which to concatenate #' (only used when \code{..1} is a matrix): #' \describe{ #' \item{1L}{} #' \item{2L}{} #' \item{3L}{} #' \item{4L}{} #' } #' If missing the margin is heuristically determined by looking at common #' dimensions between the objects. #' #' @keywords internal setMethod('c', 'NMF', function(x, ..., margin=3L, recursive=FALSE){ y <- ..1 if( is.matrix(y) ){ if( missing(margin) ){ if( nrow(y) == nrow(x) ){ if( ncol(y) == ncol(x) ){ warning("NMF::`c` - Right argument match both target dimensions: concatenating basis columns." , " Use `margin=4L` to concatenate coefficient rows.") } margin <- 3L }else if( ncol(y) == ncol(x) ){ margin <- 4L }else{ stop("NMF::`c` - Incompatible argument dimensions: could not infer concatenation margin.") } } if( margin == 1L ){ # extend basis vectors if( nbterms(x) ){ # cannot extend models with fixed basis terms stop("NMF::`c` - Could not extend basis vectors:" , " NMF model has fixed basis terms [", nbterms(x), "]") } if( ncol(y) != nbasis(x) ){ stop("NMF::`c` - Could not extend basis vectors:" , " incompatible number of columns [", nbasis(x), '!=', ncol(y), "].") } # extend basis vectors basis(x) <- rbind(basis(x), y) } else if( margin == 2L ){ # extend basis profiles if( ncterms(x) ){ # cannot extend models with fixed coef terms stop("NMF::`c` - Could not extend basis profiles:" , " NMF model has fixed coefficient terms [", ncterms(x), "]") } if( nrow(y) != nbasis(x) ){ stop("NMF::`c` - Could not extend basis profiles:" , " incompatible number of rows [", nbasis(x), '!=', nrow(y), "].") } # extend basis profiles coef(x) <- cbind(coef(x), y) } else if( margin == 3L ){ # add basis vectors if( nrow(y) != nrow(x) ){ stop("NMF::`c` - Could not concatenate basis vectors:" , " incompatible number of rows [", nrow(x), '!=', nrow(y), "].") } # bind basis terms .basis(x) <- cbind(basis(x), y) dn <- colnames(.basis(x)) # bind dummy coef .coef(x) <- rbind(coef(x), matrix(NA, ncol(y), ncol(x))) basisnames(x) <- dn } else if( margin == 4L ){ # add basis profiles if( ncol(y) != ncol(x) ){ stop("NMF::`c` - Could not concatenate basis profiles:" , " incompatible number of columns [", ncol(x), '!=', ncol(y), "].") } # bind coef terms .coef(x) <- rbind(coef(x), y) dn <- rownames(.coef(x)) # bind dummy basis .basis(x) <- cbind(basis(x), matrix(NA, nrow(x), nrow(y))) basisnames(x) <- dn }else{ stop("NMF::`c` - Invalid concatenation margin: should be either" , " 1L (basis rows), 2L (coef columns), 3L (basis vectors/columns) or 4L (basis profiles/coef rows).") } }else if( is.nmf(y) ){ # check dimensions if( nrow(x) != nrow(y) ) stop("NMF::`c` - Could not concatenate NMF objects:" , " incompatible number of rows [", nrow(x), '!=', nrow(y), "]") if( ncol(x) != ncol(y) ) stop("NMF::`c` - Could not concatenate NMF objects:" , " incompatible number of columns [", ncol(x), '!=', ncol(y), "]") .basis(x) <- cbind(basis(x), basis(y)) .coef(x) <- rbind(coef(x), coef(y)) }else{ stop("NMF::`c` - Concatenation of an NMF object with objects of class '", class(y), "' is not supported.") } # return augmented object x } ) fterms <- function(value){ res <- list(n=0L, terms=NULL, df=NULL, i=integer()) if( !length(value) ) return(res) # convert into a data.frame if( is.factor(value) ) value <- data.frame(Group=value) else if( is.numeric(value) ) value <- data.frame(Var=value) else if( !is.data.frame(value) ) value <- as.data.frame(value) res$n <- length(value) res$df <- value # generate fixed term matrix terms <- model.matrix(~ -1 + ., data=value) res$terms <- terms # build indexes res$i <- 1:ncol(terms) res } ## #' Annotations in NMF Models ## #' ## #' NMF models may contain annotations for columns/rows and/or rows/features, in ## #' a similar way gene expression data are annotated ## #' \code{\linkS4class{ExpressionSet}} objects in Bioconductor. ## #' ## NULL #' Fixed Terms in NMF Models #' #' These functions are for internal use and should not be called by the end-user. #' #' They use \code{\link{model.matrix}(~ -1 + ., data=value)} to generate suitable #' term matrices. #' #' @param object NMF object to be updated. #' @param value specification of the replacement value for fixed-terms. #' #' @rdname terms-internal #' @keywords internal #' @inline setGeneric('bterms<-', function(object, value) standardGeneric('bterms<-')) #' Default method tries to coerce \code{value} into a \code{data.frame} with #' \code{\link{as.data.frame}}. setReplaceMethod('bterms', signature('NMFstd', 'ANY'), function(object, value){ if( nterms(object) ){ stop("Cannot set fixed basis terms on an object that already has fixed terms:", " these can be set only once and before setting any fixed coefficient term", " [coef=", ncterms(object), ", basis=", nbterms(object), "].") } # build terms t <- fterms(value) if( !t$n ) return(object) # check dimension if( nrow(t$terms) != nrow(object) ){ stop("Invalid fixed basis terms: all terms should have length the number of target rows" , "[terms=", nrow(t$terms), " != ", nrow(object), "=target]") } # set data object@bterms <- t$df # set indexes i <- t$i nv <- nbasis(object) object@ibterms <- nv + i # set terms object <- c(object, t$terms, margin=3L) object } ) #' \code{cterms<-} sets fixed coefficient terms or indexes and should only be #' called on a newly created NMF object, i.e. in the constructor/factory generic #' \code{\link{nmfModel}}. #' #' @rdname terms-internal #' @inline setGeneric('cterms<-', function(object, value) standardGeneric('cterms<-')) #' Default method tries to coerce \code{value} into a \code{data.frame} with #' \code{\link{as.data.frame}}. setReplaceMethod('cterms', signature('NMFstd', 'ANY'), function(object, value){ if( ncterms(object) ){ stop("Cannot set fixed coef terms on an object that already has fixed coef terms:", " these can be set only once", " [coef=", ncterms(object), ", basis=", nbterms(object), "].") } # build terms t <- fterms(value) if( !t$n ) return(object) # check dimension if( nrow(t$terms) != ncol(object) ){ stop("Invalid fixed coefficient terms: all terms should have length the number of target columns" , "[terms=", nrow(t$terms), " != ", ncol(object), "=target]") } # transpose term matrix t$terms <- t(t$terms) # set data object@cterms <- t$df # set indexes i <- t$i nv <- nbasis(object) object@icterms <- nv + i # set terms object <- c(object, t$terms, margin=4L) object } ) #' Fixed Terms in NMF Models #' #' @description #' Formula-based NMF models may contain fixed basis and/or coefficient terms. #' The functions documented here provide access to these data, which are #' read-only and defined when the model object is instantiated #' (e.g., see \code{\link[=nmfModel,formula,ANY-method]{nmfModel,formula-method}}). #' #' \code{ibterms}, \code{icterms} and \code{iterms} respectively return the #' indexes of the fixed basis terms, the fixed coefficient terms and all fixed #' terms, within the basis and/or coefficient matrix of an NMF model. #' #' @param object NMF object #' @param ... extra parameters to allow extension (currently not used) #' #' @export #' @rdname terms setGeneric('ibterms', function(object, ...) standardGeneric('ibterms') ) #' Default pure virtual method that ensure a method is defined for concrete #' NMF model classes. setMethod('ibterms', 'NMF', function(object, ...){ stop("NMF::ibterms is a pure virtual method of interface 'NMF'." ," It should be overloaded in class '", class(object),"'.") } ) #' Method for standard NMF models, which returns the integer vector that is #' stored in slot \code{ibterms} when a formula-based NMF model is instantiated. setMethod('ibterms', 'NMFstd', function(object){ object@ibterms } ) #' @export #' @rdname terms setGeneric('icterms', function(object, ...) standardGeneric('icterms') ) #' Default pure virtual method that ensure a method is defined for concrete #' NMF model classes. setMethod('icterms', 'NMF', function(object, ...){ stop("NMF::icterms is a pure virtual method of interface 'NMF'." ," It should be overloaded in class '", class(object),"'.") } ) #' Method for standard NMF models, which returns the integer vector that is #' stored in slot \code{icterms} when a formula-based NMF model is instantiated. setMethod('icterms', 'NMFstd', function(object){ object@icterms } ) #' @export #' @rdname terms iterms <- function(object, ...){ c(ibterms(object), icterms(object)) } #' \code{nterms}, \code{nbterms}, and \code{ncterms} return, respectively, #' the number of all fixed terms, fixed basis terms and fixed coefficient terms #' in an NMF model. #' In particular: i.e. \code{nterms(object) = nbterms(object) + ncterms(object)}. #' @export #' @rdname terms nterms <- function(object){ length(ibterms(object)) + length(icterms(object)) } #' @export #' @rdname terms nbterms <- function(object){ length(ibterms(object)) } #' @export #' @rdname terms ncterms <- function(object){ length(icterms(object)) } #' \code{bterms} and \code{cterms} return, respectively, the primary data for #' fixed basis and coefficient terms in an NMF model -- as stored in slots #' \code{bterms} and \code{cterms} . #' These are factors or numeric vectors which define fixed basis components, #' e.g., used for defining separate offsets for different \emph{a priori} groups #' of samples, or to incorporate/correct for some known covariate. #' #' @export #' @rdname terms bterms <- function(object){ object@bterms } #' @export #' @rdname terms cterms <- function(object){ object@cterms } #' \code{ibasis} and \code{icoef} return, respectively, the #' indexes of all latent basis vectors and estimated coefficients within the #' basis or coefficient matrix of an NMF model. #' @export #' @rdname terms ibasis <- function(object, ...){ i <- 1:nbasis(object) if( length(idx <- ibterms(object, ...)) ) i[-idx] else i } #' @export #' @rdname terms icoef <- function(object, ...){ i <- 1:nbasis(object) if( length(idx <- icterms(object, ...)) ) i[-idx] else i } #' @export t.NMFstd <- function(x){ # transpose and swap factors x <- t.NMF(x) # swap fixed terms bt <- bterms(x) ibt <- ibterms(x) x@bterms <- cterms(x) x@ibterms <- icterms(x) x@cterms <- bt x@icterms <- ibt # returns x } NMF/R/tests.R0000644000176200001440000000223014333176413012362 0ustar liggesusers# Utility functions to test NMF algorithms # # Author: Renaud Gaujoux # Created: 29 Nov 2012 ############################################################################### #' @include rmatrix.R NULL #' Checking NMF Algorithm #' #' \code{nmfCheck} enables to quickly check that a given NMF algorithm runs #' properly, by applying it to some small random data. #' #' @param method name of the NMF algorithm to be tested. #' @param rank rank of the factorization #' @param x target data. If \code{NULL}, a random 20 x 10 matrix is generated #' @param seed specifies a seed or seeding method for the computation. #' @param ... other arguments passed to the call to \code{\link{nmf}}. #' #' @return the result of the NMF fit invisibly. #' #' @export #' @examples #' #' # test default algorithm #' nmfCheck() #' #' # test 'lee' algorithm #' nmfCheck('lee') #' nmfCheck <- function(method=NULL, rank=max(ncol(x)/5, 3), x=NULL, seed=1234, ...){ # seed computation if( isNumber(seed) ){ os <- RNGseed() on.exit( RNGseed(os), add=TRUE) set.seed(seed) seed <- NULL } if( is.null(x) ){ x <- rmatrix(20, 10) } res <- nmf(x, rank, method, seed=seed, ...) } NMF/R/registry-algorithms.R0000644000176200001440000015200314334425771015250 0ustar liggesusers ##### All these functions were taken over from pkgmaker package #' @export isCHECK <- function(){ isCRANcheck() || # known CRAN check flags !isFALSE(utestCheckMode()) || # unit test-specific flag isTRUE(getOption('R_CHECK_RUNNING_EXAMPLES_')) # roxygen generated example flag } #' @export isCRANcheck <- function(...){ tests <- list(...) if( !length(tests) ){ #default tests tests <- list('timing', 'cran') } test_sets <- c(timing="_R_CHECK_TIMINGS_", cran='_R_CHECK_CRAN_INCOMING_') tests <- sapply(tests, function(x){ # convert named tests if( length(i <- which(x %in% names(test_sets))) ){ y <- test_sets[x[i]] x <- x[-i] x <- c(x, y) } # get environment variables evar <- unlist(sapply(x, Sys.getenv)) all(nchar(as.character(evar)) > 0) }) any(tests) } checkMode_function <- function(varname){ .varname <- varname function(value, raw = FALSE){ if( missing(value) ) Sys.getenv_value(.varname, raw = raw) else{ old <- Sys.getenv_value(.varname, raw = TRUE) if( is_NA(value) ) Sys.unsetenv(.varname) # unset else do.call(Sys.setenv, setNames(list(value), .varname)) # set value # return old value old } } } utestCheckMode <- checkMode_function('_R_CHECK_RUNNING_UTESTS_') packageRegistry <- function(regname=NULL, quiet=FALSE, entry=FALSE, update=!entry, package=topenv(parent.frame())){ # library(registry) metaregname <- '.packageRegistry' name <- regname # get package environment e <- packageEnv(package) # get namespace name nm <- packageName(e) # get package meta-registry pkgreg <- .packageMetaRegistry(package, quiet) # return meta registry if no name is specified if( is.null(name) ) return(pkgreg) else{ if( is.null(pkgreg) ){ if( quiet ) return(NULL) # throw error stop("Could not find registry '", name, "' in package `", nm, "`: meta registry does not exist.") } # retrieve sub-registry entry nm <- packageSlot(pkgreg) reg <- regfetch(pkgreg, key=name, exact=TRUE, error=FALSE) if( is.null(reg) ){# not found if( quiet ) return(NULL) # throw error stop("Could not find registry `", name, "` in package `", nm, "`.") }else{ # synchronise and substitute by primary sub-registry (if necessary) if( update ) reg <- .update_pkgreg(reg) # return plain registry entry if requested if( entry ) return(reg) # return sub-registry object reg$regobj } } } packageRegistries <- function(regname=NULL, package=NULL, primary=FALSE){ lns <- loadedNamespaces() if( !is.null(package) ) lns <- lns[lns %in% package] # early exit if no namespace if( !length(lns) ) return( character() ) res <- lapply(lns, function(ns){ reg <- packageRegistry(package=ns, quiet=TRUE) if( is.null(reg) ) return( character() ) regnames <- reg$get_entry_names() res <- setNames(regnames, rep(ns, length(regnames))) if( primary ){ pr <- sapply(res, function(n) reg$get_entry(n)$parent) res <- res[ nchar(pr) == 0L ] } res }) res <- unlist(res) if( !is.null(regname) ){ res <- res[res == regname] if( primary && length(res) > 1L ){ warning("Package registry - Found multiple primary registries '", regname, "' in packages " , str_out(res, Inf), " [using first one only]") res <- res[1L] } } res } regfetch <- function(regobj, ..., all=FALSE, error=TRUE, exact=FALSE , KEYS = NULL , verbose=FALSE, entry=FALSE, msg=NULL){ # load the registry package # library(registry) # list -- all -- keys if no key is specified keylist <- allkeys <- regobj$get_entry_names() if( !all ) keylist <- grep("^[^.]", keylist, value=TRUE) index_fields <- if( !is.null(KEYS) ){ if( !is.list(KEYS) ) stop("Invalid argument : must be a list of field values.") KEYS }else list(...) # extract primary key key <- if( length(index_fields) ){ # remove fields that are not keys if named list if( !is.null(names(index_fields)) ) index_fields <- regkeys(regobj, index_fields) if( length(index_fields) ){ paste(unlist(index_fields), collapse='_') str_out(index_fields, Inf, use.names=TRUE) } } if( is.null(key) ){ return(keylist) } # set verbosity level if( !missing(verbose) ){ ol <- lverbose(verbose) on.exit( lverbose(ol) ) } if( !is.null(msg) ) msg <- str_c(msg, ' - ') if( regobj$n_of_entries() == 0L ){ if( error ) stop(msg, "Registry is empty: no matching entry for key ", dQuote(key), ".") else return(NULL) } # get entry d <- do.call(regobj$get_entries, index_fields) # no entry found if( is.null(d) ){ if( error ){ stop(msg, "No matching entry for key ", dQuote(key), " in the registry." , "\n Use one of: ", str_wrap(str_out(sort(allkeys), Inf), exdent=2), '.') }else return(NULL) } # look for exact matches if( is.list(index_fields) ){ ex <- sapply(d, function(x) all(mapply(identical, index_fields, x[names(index_fields)]))) }else{ ex <- names(d) == index_fields } # limit to exact mathes if( length(i <- which(ex)) ){ d <- d[i] }else if( exact ){ if( error ){ stop(msg, "No exact match for key '", key, "' in the registry." , "\n Use one of: ", str_wrap(str_out(allkeys, Inf), exdent=2), '.') }else return(NULL) } if( all ) return(d) # multiple match # str(d) if( length(d) > 1L ){ if( error ){ stop(msg, "Multiple entries found for key ", dQuote(key), ": ", str_out(sort(names(d)), Inf), '.') }else return(NA) } # check single match if( length(d) != 1L ) stop("Unexpected error: more than one entry was selected.") # return single match d <- d[[1L]] # return registry object if the entry is an automatic sub-registry if( !entry && is(regobj, 'object_subregistry') ) d$object else d } clone_regobj <- function(regobj, empty=FALSE){ tmp <- tempfile('registry') on.exit(unlink(tmp)) saveRDS(regobj, file=tmp) newreg <- readRDS(tmp) # empty entries if necessary if( empty ){ sapply(newreg$get_entry_names(), newreg$delete_entry) } newreg } .packageMetaRegistry <- function(package, quiet=FALSE, create=FALSE){ # library(registry) metaregname <- '.packageRegistry' # get package environment e <- packageEnv(package) # get namespace name nm <- packageName(e) # create registry environment if necessary if( !exists(metaregname, e, inherits=FALSE) ){ if( !create ){ if( quiet ) return(NULL) # throw error stop("Meta registry in package `", nm, "` does not exist.") } # if( !isLoadingNamespace(e) ){ # stop("Can only create a package meta-registry when loading it" # ," [loading namespace: ", if(!is.null(ns <- getLoadingNamespace()) ) ns else 'none', "].") # } message("Creating meta registry in package '", nm, "' ... ", appendLF=FALSE) # create registry object with special classes for the registry and entries meta <- registry(c(paste('package', nm, 'subregistry', sep='_'), 'package_subregistry') , c(paste('package', nm, 'metaregistry', sep='_'), 'package_metaregistry')) ## set fields # access key meta$set_field("key", type="character", is_key = TRUE, index_FUN = match_exact) # sub-registry object meta$set_field("regobj", type="registry", is_mandatory = TRUE) # human readable description meta$set_field("description", type="character", is_mandatory = TRUE) # short object description meta$set_field("entrydesc", type="character", is_mandatory = TRUE) # parent package = owner of the primary registry meta$set_field("parent", type="character", default = '') # owner package (its value is forced) meta$set_field("package", type="character", default = nm, alternatives=nm) # # fix registry meta <- fix_registry(meta) # add package attribute attr(meta, 'package') <- nm # store within the calling package environment assign(metaregname, meta, envir = e) message('OK') } # get package meta registry get(metaregname, envir=e, inherits = FALSE) } .update_pkgreg <- function(regentry){ verbose <- getOption('verbose') # directly return entry if: # - one is loading the namespace of the package (primary or not) if( isLoadingNamespace(regentry$package) ) return(regentry) # - not a primary registry if( nchar(regentry$parent) > 0L ) return(regentry) primary <- regentry$package primaryreg <- regentry$regobj key <- regentry$key fullkey <- str_c(primary, '::', key) # sync if loaded packages changed hash <- digest(c(.cacheNS[[fullkey]], ns <- loadedNamespaces())) # print(ns) # print(.cacheNS) if( !identical(hash, .cacheMD5[[fullkey]]) ){ if( verbose ) message('Updating registry ', fullkey, " ... ", appendLF=FALSE) # remove entries from unloaded packages if( length(.cacheNS[[fullkey]]) && length(notloaded <- setdiff(.cacheNS[[fullkey]], ns)) ){ ndel <- sapply(notloaded, function(p){ if( verbose > 1L ) message("\n Removing entries from package ", p, " ... ", appendLF=FALSE) e <- primaryreg$get_entry_names() n <- sapply(e, function(x){ rec <- primaryreg$get_entry(x) if( rec$REGISTERINGpackage == p ){ primaryreg$delete_entry(x) 1L }else 0L }) if( verbose > 1L ) message('OK [', sum(n), ']') sum(n) }) } # list packages that have local versions of this registry reglist <- packageRegistries(fullkey) # print(reglist) pkgs <- names(reglist) # add entries from new packages into the primary registry if( length(miss <- setdiff(pkgs, .cacheNS[[fullkey]])) ){ nadd <- sapply(miss, function(p){ if( verbose > 1L ) message("\n Adding entries from package ", p, " ... ", appendLF=FALSE) reg <- packageRegistry(fullkey, package=p) e <- reg$get_entries() n <- sapply(e, function(x){ # add entry if it does not exists already oldentry <- regfetch(primaryreg, KEYS=x, exact=TRUE, error=FALSE) if( is.null(oldentry) ){ do.call(primaryreg$set_entry, x) 1L }else 0L }) if( verbose > 1L ) message('OK [', sum(n), ']') sum(n) }) } # store contributing packages and MD5 hash .cacheNS[[fullkey]] <<- pkgs .cacheMD5[[fullkey]] <<- digest(c(.cacheNS[[fullkey]], ns)) if( verbose ) message('OK') } regentry } .update_pkgreg <- local({ .cacheNS <- list() .cacheMD5 <- list() function(regentry){ verbose <- getOption('verbose') # directly return entry if: # - one is loading the namespace of the package (primary or not) if( isLoadingNamespace(regentry$package) ) return(regentry) # - not a primary registry if( nchar(regentry$parent) > 0L ) return(regentry) primary <- regentry$package primaryreg <- regentry$regobj key <- regentry$key fullkey <- str_c(primary, '::', key) # sync if loaded packages changed hash <- digest(c(.cacheNS[[fullkey]], ns <- loadedNamespaces())) # print(ns) # print(.cacheNS) if( !identical(hash, .cacheMD5[[fullkey]]) ){ if( verbose ) message('Updating registry ', fullkey, " ... ", appendLF=FALSE) # remove entries from unloaded packages if( length(.cacheNS[[fullkey]]) && length(notloaded <- setdiff(.cacheNS[[fullkey]], ns)) ){ ndel <- sapply(notloaded, function(p){ if( verbose > 1L ) message("\n Removing entries from package ", p, " ... ", appendLF=FALSE) e <- primaryreg$get_entry_names() n <- sapply(e, function(x){ rec <- primaryreg$get_entry(x) if( rec$REGISTERINGpackage == p ){ primaryreg$delete_entry(x) 1L }else 0L }) if( verbose > 1L ) message('OK [', sum(n), ']') sum(n) }) } # list packages that have local versions of this registry reglist <- packageRegistries(fullkey) # print(reglist) pkgs <- names(reglist) # add entries from new packages into the primary registry if( length(miss <- setdiff(pkgs, .cacheNS[[fullkey]])) ){ nadd <- sapply(miss, function(p){ if( verbose > 1L ) message("\n Adding entries from package ", p, " ... ", appendLF=FALSE) reg <- packageRegistry(fullkey, package=p) e <- reg$get_entries() n <- sapply(e, function(x){ # add entry if it does not exists already oldentry <- regfetch(primaryreg, KEYS=x, exact=TRUE, error=FALSE) if( is.null(oldentry) ){ do.call(primaryreg$set_entry, x) 1L }else 0L }) if( verbose > 1L ) message('OK [', sum(n), ']') sum(n) }) } # store contributing packages and MD5 hash .cacheNS[[fullkey]] <<- pkgs .cacheMD5[[fullkey]] <<- digest(c(.cacheNS[[fullkey]], ns)) if( verbose ) message('OK') } regentry } }) fix_registry <- function(regobj){ # get private environment .REGENV <- environment(environment(regobj$n_of_entries)$f) # do not fix twice if( isFixed <- exists('.isFixed', .REGENV, inherits=FALSE) ){ return(regobj) } # message("REGENV:\n", capture.output(print(ls(.REGENV, all=TRUE)))) # message("env(delete_entry)\n", capture.output(print(ls(environment(environment(regobj$delete_entry)$f), all=TRUE)))) # dummy variables for R CMD check PERMISSIONS <- .get_entry_indices <- .get_entry_names <- SEALED_ENTRIES <- DATA <- .delete_entry <- NULL # .get_entries .get_entries <- get('.get_entries', .REGENV, inherits=FALSE) .get_fields <- get('.get_fields', .REGENV, inherits=FALSE) hook <- function(...){ # remove fields that are not keys fld <- .get_fields() if( length(fld) ){ keyfield <- names(fld[sapply(fld, function(x) isTRUE(x$is_key) )]) index_fields <- list(...) if( !is.null(names(index_fields)) ){ i <- match(keyfield, names(index_fields)) index_fields <- index_fields[i[!is.na(i)]] } } do.call(.get_entries, index_fields) } assign('.get_entries', hook, .REGENV) # # fix bug in delete_entry hook <- function(...){ key <- list(...) isString <- function(x) is.character(x) && length(x) == 1L if( length(key) == 1L && isString(key[[1L]]) ){ errmsg <- paste0("Could not delete entry '", key[[1L]],"': ") if (!PERMISSIONS["delete_entries"]) stop(errmsg, "deletion of entries denied due to restricted permissions.", call. = FALSE) entry_index <- .get_entry_indices(key) # fix: check for exact match (on full key) if( key[[1L]] %in% .get_entry_names() ){ entry_index <- match(key[[1L]], .get_entry_names()) } #end_fix if( !length(entry_index) ){ # if( !quiet ) warning(errmsg, "not in registry.", immediate.=TRUE, call. = FALSE) return() } if (length(entry_index) != 1) stop(errmsg, "multiple matches.", call. = FALSE) if (entry_index %in% SEALED_ENTRIES) stop(errmsg, "deletion of entry not allowed in sealed registry.", call. = FALSE) DATA[entry_index] <<- NULL } else .delete_entry(...) } environment(hook) <- .REGENV regobj$delete_entry <- hook # # fix bug in get_entry hook <- function(...){ key <- list(...) isString <- function(x) is.character(x) && length(x) == 1L if( length(key) == 1L && isString(key[[1L]]) ){ res <- .get_entries(...) if( key[[1L]] %in% names(res) ) res[[key[[1L]]]] else res[[1L]] }else .get_entries(...)[[1]] } environment(hook) <- .REGENV regobj$get_entry <- hook # # flag the registry as fixed assign('.isFixed', TRUE, .REGENV) # return fixed registry regobj } regkeys <- function(regobj, ...){ # get keys fld <- regobj$get_fields() keyfield <- names(fld[sapply(fld, function(x) isTRUE(x$is_key) )]) if( nargs() == 1L ) return(keyfield) index_fields <- list(...) if( is.null(names(index_fields)) && length(index_fields)==1L ) index_fields <- index_fields[[1L]] index_fields <- index_fields[!sapply(index_fields, is.null)] if( !length(index_fields) ) return(list()) # remove fields that are not keys i <- match(keyfield, names(index_fields)) index_fields[i[!is.na(i)]] } setPackageRegistry <- function(regname, regobj , description='', entrydesc=NA , ... , package=topenv(parent.frame()) , overwrite=FALSE){ # library(registry) # force overwrite in dev mode if( missing(overwrite) && isDevNamespace(package) ){ overwrite <- TRUE } # check if sub-registry already exists oldreg <- packageRegistry(regname, quiet=TRUE, package=package) if( !is.null(oldreg) && !overwrite ){ return( oldreg ) } # get meta-registry (force creation) regenv <- .packageMetaRegistry(package, create=TRUE) nm <- packageSlot(regenv) ns_str <- str_c("package '", nm, "'") if( !is.null(oldreg) ){ if( !overwrite ){ if( isLoadingNamespace() ){ # exit if loading a namespace message("NOTE: Did not create registry '", regname,"' in ", ns_str, ": registry already exists.") return(oldreg) } stop("Could not create registry '", regname,"' in ", ns_str, ": registry already exists") }else{ message("Removing registry '", regname,"' from ", ns_str) regenv$delete_entry(regname) } } message("Creating registry '", regname,"' in ", ns_str, ' ... ', appendLF=FALSE) .add_regclass <- function(x, newcl, before){ cl <- class(x) ir <- which(cl == before) class(x) <- c(if( ir > 1 ) cl[1:(ir-1)] , newcl, cl[ir:length(cl)]) x } pkgregclass <- c(paste(regname, 'package_registry', sep='_'), 'package_registry') if( is.character(regobj) ){# regobj specifies the S4 class of the registry entries objtype <- regobj[1] regobj <- registry(entry_class = paste(regname, 'entry', sep='_') , registry_class = c(pkgregclass, 'object_subregistry')) # access key regobj$set_field("key", type="character", is_key = TRUE , index_FUN = match_partial_ignorecase) # object regobj$set_field("object", type=objtype, is_mandatory=TRUE, validity_FUN = validObject) }else if( is(regobj, 'registry') ){ if( !is(regobj, 'package_registry') ){ regobj <- .add_regclass(regobj, pkgregclass, 'registry') } }else{ message('ERROR') stop("Invalid argument 'regobj': must be a class name or a registry object.") } # add field for REGISTERING package if( !"REGISTERINGpackage" %in% regobj$get_field_names() ) regobj$set_field("REGISTERINGpackage", type='character', is_mandatory=TRUE, index_FUN=match_exact) # fix registry object regobj <- fix_registry(regobj) # add package attr(regobj, 'package') <- nm # create new meta entry regenv$set_entry(key=regname, regobj=regobj , description=description, entrydesc=entrydesc , ...) message('OK') # return newly created registry regenv$get_entry(regname)$regobj } setPackageRegistryEntry <- function(regname, key, ..., overwrite=FALSE, verbose=FALSE , where=topenv(parent.frame()), msg=NULL){ if( isLoadingNamespace() ){ verbose <- TRUE if( missing(overwrite) ) overwrite <- TRUE } registry <- regname package <- where # check if the name provided is not empty if( nchar(key) == 0 ) stop('Invalid argument : cannot be an empty string.') # build full key, that includes the name of the top calling namespace fullkey <- key top_ns <- topns(strict=FALSE) # # retrieve package registry (it must exist or this will throw an error) package <- packageEnv(package) subregentry <- packageRegistry(registry, package=package, entry=TRUE, update=TRUE) # get regobj (do that to ensure it is updated with entries from other packages) regobj <- subregentry$regobj # setup complete list of fields fields <- list(...) objdesc <- if( !is_NA(subregentry$entrydesc) ) subregentry$entrydesc else paste(registry, 'object') objdesc <- paste(objdesc, " '", key, "'", sep='') if( length(fields)==1L ){ objdesc <- paste(objdesc, ' [', class(fields[[1L]]), ']', sep='') if( is.null(names(fields)) && is(regobj, 'object_subregistry') ) names(fields) <- 'object' } fields$key <- key regpkg <- packageName(top_ns, .Global=TRUE) fields$REGISTERINGpackage <- regpkg # str(fields) # # check if the object is already registered oldentry <- regfetch(regobj, KEYS=fields, exact=TRUE, error=FALSE, all=TRUE) # error if already exists and not overwriting if( !is.null(oldentry) && !overwrite ){ if( verbose ) message("ERROR") stop("Cannot register ", objdesc, ": key already exists.") } # add entry if( verbose ){ action <- if( is.null(oldentry) ) 'Registering' else 'Replacing' message(action, " ", objdesc, msg, " ... ", appendLF=FALSE) } # delete old entry if( !is.null(oldentry) ){ regobj$delete_entry(names(oldentry)[1L]) } # do add entry do.call(regobj$set_entry, fields) if( verbose ) message("OK") # if the registration happens during loading another package: # create local registry and add entry to it. # It will be merged to the main registry on the next call to # packageRegistry after the package is loaded. lns <- getLoadingNamespace(env=TRUE) if( !is.null(lns <- getLoadingNamespace(env=TRUE)) && !identical(lns, package) ){ # clone registry if( nchar(subregentry$parent) ){ warning("Deriving package registry '", registry, "' in package ", lns , " from ", subregentry$parent, " instead of ", subregentry$package, immediate.=TRUE) parent <- subregentry$parent }else parent <- subregentry$package fullregistry <- str_c(parent, '::', registry) if( is.null(locregobj <- packageRegistry(fullregistry, package=lns, quiet=TRUE)) ){ # clone registry locregobj <- clone_regobj(regobj, empty=TRUE) # attach to loading namespace locregobj <- setPackageRegistry(fullregistry, locregobj , description = subregentry$description , entrydesc = subregentry$entrydesc , parent = parent , package = lns) } action <- 'Adding' if( !is.null(locentry <- regfetch(locregobj, KEYS=fields, exact=TRUE, error=FALSE, all=TRUE)) ){ action <- 'Overwriting' locregobj$delete_entry(names(locentry)[1L]) } # add entry into local registry if( verbose ) message(action, " entry '", key, "' in registry '", packageName(lns), "::", fullregistry, "' ... ", appendLF=FALSE) do.call(locregobj$set_entry, fields) if( verbose ) message("OK") } # # return registered object regfetch(regobj, KEYS=fields, exact=TRUE) } regfetch <- function(regobj, ..., all=FALSE, error=TRUE, exact=FALSE , KEYS = NULL , verbose=FALSE, entry=FALSE, msg=NULL){ # load the registry package # library(registry) # list -- all -- keys if no key is specified keylist <- allkeys <- regobj$get_entry_names() if( !all ) keylist <- grep("^[^.]", keylist, value=TRUE) index_fields <- if( !is.null(KEYS) ){ if( !is.list(KEYS) ) stop("Invalid argument : must be a list of field values.") KEYS }else list(...) # extract primary key key <- if( length(index_fields) ){ # remove fields that are not keys if named list if( !is.null(names(index_fields)) ) index_fields <- regkeys(regobj, index_fields) if( length(index_fields) ){ paste(unlist(index_fields), collapse='_') str_out(index_fields, Inf, use.names=TRUE) } } if( is.null(key) ){ return(keylist) } # set verbosity level if( !missing(verbose) ){ ol <- lverbose(verbose) on.exit( lverbose(ol) ) } if( !is.null(msg) ) msg <- str_c(msg, ' - ') if( regobj$n_of_entries() == 0L ){ if( error ) stop(msg, "Registry is empty: no matching entry for key ", dQuote(key), ".") else return(NULL) } # get entry d <- do.call(regobj$get_entries, index_fields) # no entry found if( is.null(d) ){ if( error ){ stop(msg, "No matching entry for key ", dQuote(key), " in the registry." , "\n Use one of: ", str_wrap(str_out(sort(allkeys), Inf), exdent=2), '.') }else return(NULL) } # look for exact matches if( is.list(index_fields) ){ ex <- sapply(d, function(x) all(mapply(identical, index_fields, x[names(index_fields)]))) }else{ ex <- names(d) == index_fields } # limit to exact mathes if( length(i <- which(ex)) ){ d <- d[i] }else if( exact ){ if( error ){ stop(msg, "No exact match for key '", key, "' in the registry." , "\n Use one of: ", str_wrap(str_out(allkeys, Inf), exdent=2), '.') }else return(NULL) } if( all ) return(d) # multiple match # str(d) if( length(d) > 1L ){ if( error ){ stop(msg, "Multiple entries found for key ", dQuote(key), ": ", str_out(sort(names(d)), Inf), '.') }else return(NA) } # check single match if( length(d) != 1L ) stop("Unexpected error: more than one entry was selected.") # return single match d <- d[[1L]] # return registry object if the entry is an automatic sub-registry if( !entry && is(regobj, 'object_subregistry') ) d$object else d } pkgreg_fetch <- function(regname, ..., msg=NULL, where=topenv(parent.frame())){ # get package registry regentry <- packageRegistry(regname, package=where, entry=TRUE, update=TRUE) # define addon error message if( missing(msg) && !is_NA(regentry$entrydesc) ) msg <- regentry$entrydesc # fetch from registry regfetch(regentry$regobj, ..., msg=msg) } pkgreg_remove <- function(regname, ..., msg=NULL, where=topenv(parent.frame()), quiet=FALSE){ # get package registry regentry <- packageRegistry(regname, package=where, entry=TRUE, update=TRUE) # define addon error message if( missing(msg) && !is_NA(regentry$entrydesc) ) msg <- regentry$entrydesc # fetch from registry entry <- regfetch(regentry$regobj, ..., exact=TRUE, error=FALSE, all=TRUE, msg=msg) res <- if( !is.null(entry) ){ # get the method registry and the method's fullname name <- names(entry) if( !quiet ){ msg <- paste0("Removing ", msg, " '", name, "' from registry '", regname, "'") message(msg, ' ... ', appendLF=FALSE) } # delete from registry regentry$regobj$delete_entry(name) if( !quiet ) message('OK') TRUE }else{ if( !quiet ){ name <- str_out(list(...), Inf, use.names=TRUE) warning("Could not remove ", msg, " '", name, "': no matching registry entry.", call.=FALSE) } FALSE } if( quiet ) invisible(res) else res } str_out <- function(x, max=3L, quote=is.character(x), use.names=FALSE, sep=", ", total = FALSE){ if( is_NA(max) ) max <- Inf suffix <- NULL nTotal <- length(x) if( max > 2 && length(x) > max ){ suffix <- "..." x <- c(head(x, max-1), tail(x, 1)) } x <- head(x, max) # add quotes if necessary quote <- if( isTRUE(quote) ) "'" else if( is.character(quote) ) quote if( !is.null(quote) ) x <- unlist(lapply(x, function(v) paste(quote,v,quote, sep=''))) else if( all(sapply(x, isInteger)) ) x <- unlist(lapply(x, function(v) str_c(v,'L'))) # add names if necessary if( use.names && !is.null(names(x)) ){ nm <- str_c(names(x),'=') x <- paste(ifelse(nm=='=','',nm), x, sep='') } # insert suffix if( !is.null(suffix) ){ x <- c(head(x, length(x)-1L), suffix, tail(x, 1L)) } s <- paste(paste(x, collapse=sep), sep='') if( total ) s <- paste0(s, ' (', format(nTotal, big.mark=",", scientific=F), ' total)') # return formatted string s } is_NA <- function(x){ is.atomic(x) && length(x) == 1L && is.na(x) # x <- unname(x) # identical(x, NA) || identical(x, as.character(NA)) || identical(x, as.numeric(NA)) || identical(x, as.integer(NA)) } isInteger <- function(x){ is.integer(x) && length(x) == 1 } topns <- function(strict=TRUE){ ns <- topns_name(n=1L, strict=strict) if( ns == '.GlobalEnv' ) return( .GlobalEnv ) else if( nchar(ns) ) asNamespace(ns) #packageEnv(skip=TRUE, verbose=verbose) } topns_name <- function(n=1L, strict=TRUE, unique=TRUE){ if( n==1L && !is.null(ns <- getLoadingNamespace()) ){ return(ns) } nf <- sys.nframe() i <- 0 res <- character() while( i <= nf && length(res) < n ){ e <- sys.frame(i) if( !strict || !identical(e, .GlobalEnv) ){ pkg <- methods::getPackageName(e, create=FALSE) if( pkg != '' ){ res <- c(res, pkg) } } i <- i + 1 } if( !length(res) ){# try with packageEnv e <- packageEnv(skip=TRUE) if( isNamespace(e) ){ res <- methods::getPackageName(e) # print(res) }else{ #warning('Could not find top namespace.', immediate.=TRUE) return('') } } if( unique || n==1L ) res <- match.fun('unique')(res) if( length(res) || n>1L ) res else '' } hasArg2 <- function (name) { name <- as.name(name) ## apply methods::hasArg aname <- as.character(substitute(name)) fnames <- names(formals(sys.function(sys.parent()))) if (is.na(match(aname, fnames))) { if (is.na(match("...", fnames))) FALSE else { dotsCall <- eval(quote(substitute(list(...))), sys.parent()) !is.na(match(aname, names(dotsCall))) } } else eval(substitute(!missing(name)), sys.frame(sys.parent())) ## } allFormals <- function(f){ # look inside method for S4 methods if( is(f, 'MethodDefinition') ){ # check if the method is defined as a wrapper function f <- f@.Data lf <- try(codetools::getAssignedVar(body(f)), silent=TRUE) if( !identical(lf, '.local') ) return( formals(f) ) # extract arguments from local function lfun <- extractLocalFun(f) res <- formals(lfun) # set default values from the generic, only for arguments that have no # default values in the method generic_args <- formals(f) meth_no_default <- sapply(res, is.symbol) gen_no_default <- sapply(generic_args, is.symbol) generic_args <- generic_args[ !gen_no_default ] generic_args <- generic_args[ names(generic_args) %in% names(res[meth_no_default]) ] if( length(generic_args) ){ res[names(generic_args)] <- generic_args } # return complete list of arguments res }else if( is.function(f) ) formals(f) } extractLocalFun <- function(f){ bf <- body(f) txt <- as.character(bf)[2] # in R-2.14.2 -- at least, as.character does not return the complete body # so some text manipulation is necessary if( !grepl("\\{", txt) ){ sf <- capture.output(print(bf)) w <- tail(grep("^\\s*\\.local\\(", sf), 1L) txt <- paste(sf[-w], collapse="\n") } expr <- parse(text=txt) e <- new.env() eval(expr, e) } expand_list <- function(x, ..., .exact=TRUE, .names=!.exact){ # extract defaults from ... arguments defaults <- list(...) if( length(defaults) == 1L && is.null(names(defaults)) ){ defaults <- defaults[[1L]] } # early exit if no defaults if( !length(defaults) ) return(x) # match names from x in defaults x_ex <- x if( !.exact ){ i <- pmatch(names(x), names(defaults)) # first expand names if necessary if( length(w <- which(!is.na(i))) ){ names(x_ex)[w] <- names(defaults)[i[w]] # apply to as well if necessary if( .names ) names(x)[w] <- names(defaults)[i[w]] } } # expand list i <- match(names(defaults), names(x_ex)) if( length(w <- which(is.na(i))) ){ n <- names(defaults)[w] lapply(n, function(m){ if( is.null(defaults[[m]]) ) x[m] <<- list(NULL) else x[[m]] <<- defaults[[m]] }) } x } .getExtraEnv <- function(package){ if( missing(package) || is.null(package) ) where <- topns(FALSE) else if( isString(package) ) { package <- sub("^package:", "", package) if( package == 'R_GlobalEnv') where <- .GlobalEnv else where <- asNamespace(package) } else stop("Invalid argument `package`: must be missing or a package name.") where } # extra handler registry extra_handlers <- setPackageRegistry('extra_handler', 'function' , description = 'Handler functions for package-specific extra tasks' , entrydesc = 'extra handler') # extra action registry extra_actions <- registry() extra_actions$set_field("key", type="character", is_key = TRUE, index_FUN = match_exact) extra_actions$set_field("package", type="character", is_key = TRUE, index_FUN = match_exact) extra_actions$set_field("handler", type='character', is_mandatory=TRUE, is_key=TRUE) extra_actions$set_field("args", type='list', default=list()) extra_actions <- setPackageRegistry('extra_action', extra_actions , description = 'Handler functions for package-specific extra actions' , entrydesc = 'extra action') #' Install/Run Extra Things After Standard Package Installation #' #' @description #' These functions define a framework to register actions for which default sets of arguments #' can be defined when (lazy-)loading a package, and run later on, e.g., after the package #' is installed using dedicated commands. #' #' \code{setPackageExtraHandler} defines main action handler functions, for which #' actions are defined as a set of arguments and registered using \code{setPackageExtra}. #' #' @param handler name of a handler, e.g, \code{'install'}. #' It must be unique across all handlers registered by any other packages. #' @param fun handler function that will be called with the arguments registered #' with \code{packageExtra(name, ...)} #' @param package package name where to store/look for the internal registries. #' End users should not need to use this argument. #' #' @return the runner function associated with the newly registered handler, #' as built by \code{packageExtraRunner}. #' #' @rdname packageExtra setPackageExtraHandler <- function(handler, fun, ...){ # add entry to the registry setPackageRegistryEntry('extra_handler', handler, fun, ...) # build associated runner runner <- packageExtraRunner(handler) } #' @describeIn packageExtra retrieves a given handler from the registry. #' #' @param ... extra arguments passed to internal function calls. #' In \code{packageExtraHandler}, these are passed to \code{\link{pkgreg_fetch}}. #' #' In \code{setPackageExtra}, these define default arguments for the handler function. #' These are overwritten by arguments in the call to runner function if any. #' packageExtraHandler <- function(handler=NULL, ...){ # load handler from registry pkgreg_fetch('extra_handler', key=handler, ...) } #' @describeIn packageExtra registers extra actions for a given handler. #' #' For example, calling \code{setPackageExtra('install', pkgs='non_CRAN_pkg', repos='http://non-standard-repo')} #' in a source file of package 'myPkg' registers the call #' \code{install.packages('non_CRAN_pkg', repos='http://non-standard-repo', ...)} #' in a registry internal to the package. #' All calls to \code{setPackageExtra('install', ...)} can then be run by the user, as #' a post installation step via \code{install.extrapackages('myPkg', ..)}. #' #' @param extra name of the extra action. #' @param .wrap logical that indicates if a function that runs the extra action should #' be returned or only the default arguments #' setPackageExtra <- function(handler, extra, ...){ # check that a handler is defined in the registry fhandler <- packageExtraHandler(handler, exact=TRUE, error=FALSE) if( is.null(fhandler) ){ handlers <- packageExtraHandler() stop("Could not register action '", extra, "': handler '", handler, "' is not defined" , if( length(handlers) ){ str_c(".\n Available handlers are: ", str_out(handlers, Inf)) } else " [handler registry is empty]." ) } args <- list(...) pkg <- packageName(topenv(parent.frame()), .Global=TRUE) setPackageRegistryEntry('extra_action', key=extra, handler=handler, args=args , package = pkg, where = topenv() , msg=str_c(" for handler '", handler, "'")) } .wrapExtra <- function(fhandler, args=list()){ # define wrapper function f <- function(...){ cl <- match.call() cl[[1L]] <- as.name('fhandler') # add default arguments lapply(names(args), function(a){ if( !a %in% names(cl) ) cl[[a]] <<- as.name(substitute(a, list(a=a))) }) eval(cl) } # set registered arguments as default arguments formals(f) <- c(args, formals(f)) f } #' @describeIn packageExtra retrieve a given extra action, either as its registry entry, #' or as a function that would perform the given action. #' packageExtra <- function(handler=NULL, extra=NULL, package=NULL, .wrap=FALSE){ # load extra registry extras <- pkgreg_fetch('extra_action', key=extra, handler=handler, package=package , exact=TRUE, all=!.wrap) # return whole registry if no other argument is provided if( missing(handler) || is.null(extra) || !.wrap ) return( extras ) args <- extras$args fhandler <- packageExtraHandler(handler, package='pkgmaker') if( is.null(fhandler) ){ handlers <- packageExtraHandler(package='pkgmaker') stop("Could not find action handler '", handler, "' in pkgmaker global handler registry.\n" , " Available handlers are: ", str_out(handlers, Inf)) } # define wrapper function .wrapExtra(fhandler, args) } #' @describeIn packageExtra defines a function to run all or some of the actions registered #' for a given handler in a given package. #' For example, the function \code{install.extrapackages} is the runner defined for the extra handler \code{'install'} #' via \code{packageExtraRunner('install')}. #' #' @param .verbose logical that indicates if verbose messages about the extra actions being #' run should be displayed. #' packageExtraRunner <- function(handler){ .handler <- handler function(package, extra=NULL, handler=NULL, ..., .verbose=getOption('verbose')){ if( missing(handler) ) handler <- .handler .local <- function(p, ...){ # load list of extras extras <- packageExtra(handler=handler, extra=extra, package=p) # execute extras sapply(extras, function(def, ...){ e <- def$key h <- def$handler f <- packageExtra(handler=h, extra=e, package=p, .wrap=TRUE) if( .verbose ){ message("# Running extra action '", h, ':', e, "' ...") message("# Action: ", str_fun(f)) on.exit( message("# ERROR [", e, "]\n") ) } res <- f(...) if( .verbose ){ on.exit() message("# OK [", e, "]\n") } res } , ...) } invisible(sapply(package, .local, ...)) } } #' @describeIn packageExtra runs all extra actions registered for a given package. #' install.extras <- packageExtraRunner(NULL) #' @describeIn packageExtra install sets of packages that can enhance a #' package, but may not be available from CRAN. #' #' It is defined as the extra handler for #' the extra action handler \code{'install.packages'}. #' All arguments in \code{...} are passed to \code{\link{install.packages}}. #' By default, packages that are already installed are not re-installed. #' An extra argument \code{force} allows to force their installation. #' The packages are loaded if their installation is successful. #' install.extrapackages <- setPackageExtraHandler('install.packages', function(pkgs, ..., force=FALSE){ res <- sapply(pkgs, function(pkg, ...){ if( force || !require.quiet(pkg, character.only=TRUE) ){ install.packages(pkg, ...) require(pkg, character.only=TRUE) }else message("Loaded extra package: ", pkg) }, ...) } ) oneoffVariable <- function(default=NULL){ .var <- default function(value){ if( missing(value) ){ res <- .var .var <<- default res }else .var <<- value } } Sys.getenv_value <- function(name, raw = FALSE){ val <- Sys.getenv(name, unset = NA, names = FALSE) if( raw ) return(val) # convert false values to FALSE if required if( is.na(val) || !nchar(val) || identical(tolower(val), 'false') || val == '0' ){ val <- FALSE } val } # NMF algorithm registry access methods # # Author: Renaud Gaujoux ############################################################################### #' @include registry.R #' @include NMFStrategy-class.R #' @include NMFStrategyFunction-class.R #' @include NMFStrategyIterative-class.R NULL # create sub-registry for NMF algorithm .registryAlgorithm <- setPackageRegistry('algorithm', "NMFStrategy" , description = "Algorithms to solve MF optimisation problems" , entrydesc = "NMF algorithm") nmfAlgorithmInfo <- function(show=TRUE){ obj <- .registryAlgorithm if( show ) print(obj) invisible(obj) } # specific register method for registering NMFStrategy objects setMethod('nmfRegister', signature(key='NMFStrategy', method='missing'), function(key, method, ...){ nmfRegister(name(key), key, ..., regname='algorithm') } ) #' Registering NMF Algorithms #' #' Adds a new algorithm to the registry of algorithms that perform #' Nonnegative Matrix Factorization. #' #' @inheritParams NMFStrategy #' @param ... arguments passed to the factory function \code{\link{NMFStrategy}}, #' which instantiate the \code{\linkS4class{NMFStrategy}} object that is stored #' in registry. #' @param overwrite logical that indicates if any existing NMF method with the #' same name should be overwritten (\code{TRUE}) or not (\code{FALSE}), #' in which case an error is thrown. #' @param verbose a logical that indicates if information about the registration #' should be printed (\code{TRUE}) or not (\code{FALSE}). #' #' @export #' @examples #' #' # define/regsiter a new -- dummy -- NMF algorithm with the minimum arguments #' # y: target matrix #' # x: initial NMF model (i.e. the seed) #' # NB: this algorithm simply return the seed unchanged #' setNMFMethod('mynmf', function(y, x, ...){ x }) #' #' # check algorithm on toy data #' res <- nmfCheck('mynmf') #' # the NMF seed is not changed #' stopifnot( nmf.equal(res, nmfCheck('mynmf', seed=res)) ) #' setNMFMethod <- function(name, method, ..., overwrite=isLoadingNamespace(), verbose=TRUE){ # build call to NMFStrategy constructor call_const <- match.call(NMFStrategy) call_const[[1]] <- as.name('NMFStrategy') call_const$verbose <- NULL call_const$overwrite <- NULL # swap name and method if method is missing and name is a registered method if( missing(method) && !missing(name) && is.character(name) && existsNMFMethod(name) ){ call_const$method <- name call_const$name <- NULL } # build the NMFStrategy object (in the parent frame to get the package slot right) e <- parent.frame() method <- eval(call_const, envir=e) # add to the algorithm registry res <- nmfRegister(method, overwrite=overwrite, verbose=verbose) # return wrapper function invisibly wrap <- nmfWrapper(method) } #' \code{nmfRegisterAlgorithm} is an alias to \code{setNMFMethod} for backward #' compatibility. #' #' @export #' @rdname setNMFMethod nmfRegisterAlgorithm <- setNMFMethod #' Registry for NMF Algorithms #' #' @name methods-NMF #' @rdname registry-algorithm #' @family regalgo Registry for NMF algorithms NULL #' Testing Compatibility of Algorithm and Models #' #' \code{canFit} is an S4 generic that tests if an algorithm can #' fit a particular model. #' #' @param x an object that describes an algorithm #' @param y an object that describes a model #' @param ... extra arguments to allow extension #' #' @export #' @inline #' @family regalgo setGeneric('canFit', function(x, y, ...) standardGeneric('canFit') ) #' Tells if an NMF algorithm can fit a given class of NMF models #' #' @param exact for logical that indicates if an algorithm is considered able to fit #' only the models that it explicitly declares (\code{TRUE}), or if it should be #' considered able to also fit models that extend models that it explicitly fits. #' setMethod('canFit', signature(x='NMFStrategy', y='character'), function(x, y, exact=FALSE){ if( !exact ){ # check for one model amongst all the models fittable by the strategy can <- if( length(mo <- modelname(x)) > 1 ) sapply(mo, function(m) extends(y, m)) else extends(y, mo) any(can) }else is.element(y, modelname(x)) } ) #' Tells if an NMF algorithm can fit the same class of models as \code{y} setMethod('canFit', signature(x='NMFStrategy', y='NMF'), function(x, y, ...){ canFit(x, modelname(y), ...) } ) #' Tells if a registered NMF algorithm can fit a given NMF model setMethod('canFit', signature(x='character', y='ANY'), function(x, y, ...){ canFit(nmfAlgorithm(x), y, ...) } ) #' \code{selectNMFMethod} tries to select an appropriate NMF algorithm that is #' able to fit a given the NMF model. #' #' @param name name of a registered NMF algorithm #' @param model class name of an NMF model, i.e. a class that inherits from class #' \code{\linkS4class{NMF}}. #' @param load a logical that indicates if the selected algorithms should be loaded #' into \code{NMFStrategy} objects #' @param all a logical that indicates if all algorithms that can fit \code{model} #' should be returned or only the default or first found. #' @param quiet a logical that indicates if the operation should be performed quietly, #' without throwing errors or warnings. #' #' @return \code{selectNMFMethod} returns a character vector or \code{NMFStrategy} objects, #' or NULL if no suitable algorithm was found. #' #' @rdname registry-algorithm #' selectNMFMethod <- function(name, model, load=FALSE, exact=FALSE, all=FALSE, quiet=FALSE){ # lookup for an algorithm suitable for the given NMF model if( !isNMFclass(model) ) stop("argument 'model' must be the name of a class that extends class 'NMF'") algo_list <- if( !missing(name) ){ algo <- nmfAlgorithm(name) name(algo) }else nmfAlgorithm() # lookup for all the algorithms that can fit the given model #NB: if only one model needs to be selected then first look for an exact fit as # this would need to be done with exact=FALSE and TRUE anyways w <- sapply(algo_list, canFit, model, exact= if(all) exact else TRUE) algo <- algo_list[w] # if no suitable algorithm was found, and an exact match is not required # then look for other potential non-exact algorithms if( !all && !exact && length(algo) == 0 ){ w <- sapply(algo_list, canFit, model, exact=FALSE) algo <- algo_list[w] } # return NULL if no algorithm was found if( length(algo) == 0L ){ if( !quiet ) stop("Could not find an NMF algorithm to fit model '", model, "'" , if( !missing(name) ) paste(" amongst ", str_out(algo_list, Inf))) return(NULL) } # if all=FALSE then try to choose the default algorithm if present in the list, or the first one res <- if( !all && length(algo) > 1L ){ idx <- which( algo == nmf.getOption('default.algorithm') ) if( !length(idx) ) idx <- 1L res <- algo[idx] if( !quiet ) warning("Selected NMF algorithm '", res, "' amongst other possible algorithm(s): " , paste(paste("'", algo[-idx], "'", sep=''), collapse=", ")) res }else # otherwise return all the algorithms algo # load the methods if required if( load ){ if( length(res) > 1 ) sapply(res, nmfAlgorithm) else nmfAlgorithm(res) } else res } #' \code{getNMFMethod} retrieves NMF algorithm objects from the registry. #' #' @param ... extra arguments passed to \code{pkgreg_fetch} #' or \code{pkgreg_remove}. #' #' @export #' @rdname registry-algorithm getNMFMethod <- function(...) nmfGet('algorithm', ...) #' Listing and Retrieving NMF Algorithms #' #' \code{nmfAlgorithm} lists access keys or retrieves NMF algorithms that are #' stored in registry. #' It allows to list #' #' @param name Access key. #' If not missing, it must be a single character string that is partially matched #' against the available algorithms in the registry. #' In this case, if \code{all=FALSE} (default), then the algorithm is returned #' as an \code{NMFStrategy} object that can be directly passed to \code{\link{nmf}}. #' An error is thrown if no matching algorithm is found. #' #' If missing or \code{NULL}, then access keys of algorithms -- that #' match the criteria \code{version}, are returned. #' This argument is assumed to be regular expression if \code{all=TRUE} or #' \code{version} is not \code{NULL}. #' @param version version of the algorithm(s) to retrieve. #' Currently only value \code{'R'} is supported, which searched for plain R #' implementations. #' @param all a logical that indicates if all algorithm keys should be returned, #' including the ones from alternative algorithm versions (e.g. plain R #' implementations of algorithms, for which a version based on optimised #' C updates is used by default). #' @param ... extra arguments passed to \code{\link{getNMFMethod}} when \code{name} #' is not \code{NULL} and \code{all=FALSE}. It is not used otherwise. #' #' @return an \code{\linkS4class{NMFStrategy}} object if \code{name} is not #' \code{NULL} and \code{all=FALSE}, or a named character vector that contains #' the access keys of the matching algorithms. #' The names correspond to the access key of the primary algorithm: e.g. #' algorithm \sQuote{lee} has two registered versions, one plain R (\sQuote{.R#lee}) #' and the other uses optimised C updates (\sQuote{lee}), which will all get #' named \sQuote{lee}. #' #' @export #' @family regalgo #' #' @examples #' #' # list all main algorithms #' nmfAlgorithm() #' # list all versions of algorithms #' nmfAlgorithm(all=TRUE) #' # list all plain R versions #' nmfAlgorithm(version='R') #' nmfAlgorithm <- function(name=NULL, version=NULL, all=FALSE, ...){ # if one passes an NMFStrategy just returns it if( is(name, 'NMFStrategy') ) return(name) # force all=TRUE if type is provided if( !is.null(version) ) all <- TRUE # directly return the algorithm object if a key is supplied and all=FALSE if( !is.null(name) && !all ) return( getNMFMethod(name, ...) ) # get all algorithms algo <- getNMFMethod(all=TRUE) # set names to match the primary key algo <- setNames(algo, sub("^\\.(.+#)?", '', algo)) # filter out hidden methods if( !all ) algo <- algo[!grepl("^\\.", algo)] # filter out methods not from the requested algorithm if( !is.null(name) ) algo <- algo[grepl(str_c("^", name), names(algo))] # filter out types if( !is.null(version) ){ type <- match.arg(version, c('R')) algo <- Filter( function(x) grepl(str_c("^\\.", version, '#'), x), algo) } # remove names if no arguments if( is.null(version) ) algo <- setNames(algo, NULL) # return the selected algorithm(s) algo } #' \code{existsNMFMethod} tells if an NMF algorithm is registered under the #' #' @param exact a logical that indicates if the access key should be matched #' exactly (\code{TRUE}) or partially (\code{FALSE}). #' #' @export #' @rdname registry-algorithm existsNMFMethod <- function(name, exact=TRUE){ !is.null( getNMFMethod(name, error=FALSE, exact=exact) ) } #' \code{removeNMFMethod} removes an NMF algorithm from the registry. #' #' @export #' @rdname registry-algorithm removeNMFMethod <- function(name, ...){ pkgreg_remove('algorithm', key=name, ...) } #' Wrapping NMF Algorithms #' #' This function creates a wrapper function for calling the function \code{\link{nmf}} #' with a given NMF algorithm. #' #' @param method Name of the NMF algorithm to be wrapped. #' It should be the name of a registered algorithm as returned by \code{\link{nmfAlgorithm}}, #' or an NMF algorithm object (i.e. an instance of \code{\linkS4class{NMFStrategy}}). #' @param ... extra named arguments that define default values for any arguments #' of \code{\link{nmf}} or the algorithm itself. #' @param .FIXED a logical that indicates if the default arguments defined in \code{...} #' must be considered as fixed, i.e. that they are forced to have the defined values and cannot #' be used in a call to the wrapper function, in which case, a warning about discarding them #' is thrown if they are used. #' Non fixed arguments may have their value changed at call time, in which case it is honoured and #' passed to the \code{nmf} call. #' #' \code{.FIXED} may also be a character vector that specifies which argument amongst \code{...} #' should be considered as fixed. #' @return a function with argument \code{...} and a set of default arguments defined #' in \code{...} in the call to \code{nmfWrapper}. #' #' @seealso \code{\link{nmfAlgorithm}}, \code{\link{nmf}} #' @keywords internal #' @export #' #' @examples #' #' # wrap Lee & Seung algorithm into a function #' lee <- nmfWrapper('lee', seed=12345) #' args(lee) #' #' # test on random data #' x <- rmatrix(100,20) #' res <- nmf(x, 3, 'lee', seed=12345) #' res2 <- lee(x, 3) #' nmf.equal(res, res2) #' res3 <- lee(x, 3, seed=123) #' nmf.equal(res, res3) #' #' \dontshow{ #' stopifnot(nmf.equal(res, res2)) #' stopifnot( !nmf.equal(res, res3)) #' } #' #' # argument 'method' has no effect #' res4 <- lee(x, 3, method='brunet') #' nmf.equal(res, res4) #' #' \dontshow{ #' stopifnot(nmf.equal(res, res4)) #' } #' #' nmfWrapper <- function(method, ..., .FIXED=FALSE){ # store original call .call <- match.call() # check that all arguments are named if( nargs() > 1L && any(names(.call)[-(1:2)]=='') ) stop("Invalid call: all arguments must be named.") # store fixed arguments from default arguments .fixedargs <- 'method' .defaults <- names(.call)[-1L] .defaults <- .defaults[!.defaults %in% 'method'] if( length(.defaults) ){ # e <- parent.frame() # for(n in .defaults){ # .call[[n]] <- eval(.call[[n]], envir=e) # } if( isTRUE(.FIXED) ) .fixedargs <- c(.fixedargs, .defaults) else if( is.character(.FIXED) ){ .FIXED <- .FIXED[.FIXED %in% .defaults] .fixedargs <- c(.fixedargs, .FIXED) } } # store in local environment .method <- method .checkArgs <- function(ca, args){ # check for fixed arguments passed in the call that need # to be discarded nm <- names(ca)[-1L] if( any(fnm <- !is.na(pmatch(nm, .fixedargs))) ){ warning("Discarding fixed arguments from wrapped call to ", .call[1L] , " [", str_out(nm[fnm], Inf), '].', immediate.=TRUE) ca <- ca[!c(FALSE, fnm)] } # # start with complete call .call <- ca # set values of wrapper default arguments if any if( length(.defaults) ){ defaults <- args[.defaults] .call <- expand_list(ca, defaults, .exact=FALSE) } # change into a call to nmf .call[[1L]] <- as.name('nmf') .call[['method']] <- force(.method) as.call(.call) } # define wrapper function fwrap <- function(...){ ca <- match.call() args <- formals() .call <- .checkArgs(ca, args) # eval in parent environment e <- parent.frame() eval(.call, envir=e) } # add default arguments to signature if( length(.defaults) ){ formals(fwrap) <- expand_list(formals(fwrap), as.list(.call[.defaults])) } # add arguments from the NMF algorithm if( length(meth <- nmfFormals(.method)) ){ formals(fwrap) <- expand_list(formals(fwrap), meth) } return( fwrap ) } NMF/R/algorithms-base.R0000644000176200001440000004226214406045564014315 0ustar liggesusers# Standard NMF algorithms # # Author: Renaud Gaujoux # Creation: 30 Apr 2012 ############################################################################### #' @include NMFstd-class.R #' @include NMFOffset-class.R #' @include NMFns-class.R #' @include registry-algorithms.R NULL ################################################################################ # BRUNET (standard KL-based NMF) ################################################################################ #' NMF Algorithm/Updates for Kullback-Leibler Divergence #' #' The built-in NMF algorithms described here minimise #' the Kullback-Leibler divergence (KL) between an NMF model and a target matrix. #' They use the updates for the basis and coefficient matrices (\eqn{W} and \eqn{H}) #' defined by \cite{Brunet2004}, which are essentially those from \cite{Lee2001}, #' with an stabilisation step that shift up all entries from zero every 10 iterations, #' to a very small positive value. #' #' @param i current iteration number. #' @param v target matrix. #' @param x current NMF model, as an \code{\linkS4class{NMF}} object. #' @param eps small numeric value used to ensure numeric stability, by shifting up #' entries from zero to this fixed value. #' @param ... extra arguments. These are generally not used and present #' only to allow other arguments from the main call to be passed to the #' initialisation and stopping criterion functions (slots \code{onInit} and #' \code{Stop} respectively). #' @inheritParams nmf_update.KL.h #' #' @author #' Original implementation in MATLAB: Jean-Philippe Brunet \email{brunet@@broad.mit.edu} #' #' Port to R and optimisation in C++: Renaud Gaujoux #' #' @source #' #' Original MATLAB files and references can be found at: #' #' \url{http://www.broadinstitute.org/mpr/publications/projects/NMF/nmf.m} #' #' Original license terms: #' #' This software and its documentation are copyright 2004 by the #' Broad Institute/Massachusetts Institute of Technology. All rights are reserved. #' This software is supplied without any warranty or guaranteed support whatsoever. #' Neither the Broad Institute nor MIT can not be responsible for its use, misuse, #' or functionality. #' #' @details #' \code{nmf_update.brunet_R} implements in pure R a single update step, i.e. it updates #' both matrices. #' #' @export #' @rdname KL-nmf #' @aliases KL-nmf nmf_update.brunet_R <- function(i, v, x, eps=.Machine$double.eps, ...) { # retrieve each factor w <- .basis(x); h <- .coef(x); # standard divergence-reducing NMF update for H h <- R_std.divergence.update.h(v, w, h) # standard divergence-reducing NMF update for W w <- R_std.divergence.update.w(v, w, h) #every 10 iterations: adjust small values to avoid underflow if( i %% 10 == 0 ){ #precision threshold for numerical stability #eps <- .Machine$double.eps h[h\n") cat("Length:", length(object), "\n") if( length(object) > 0 ) cat("Method(s):", algorithm(object, string=TRUE), "\n") # show totaltime if present tt <- runtime(object) if( length(tt) > 0 ){ cat("Total timing:\n"); show(tt); } } ) #' Returns the method names used to compute the NMF fits in the list. #' It returns \code{NULL} if the list is empty. #' #' @param string a logical that indicate whether the names should be collapsed #' into a comma-separated string. #' @param unique a logical that indicates whether the result should contain the #' set of method names, removing duplicated names. #' This argument is forced to \code{TRUE} when \code{string=TRUE}. #' setMethod('algorithm', 'NMFList', function(object, string=FALSE, unique=TRUE){ l <- length(object) if( string ) unique <- TRUE if( l == 0 ) NULL else if( l == 1 ) algorithm(object[[1]]) else{ # build the vector of the algorithm names (with no repeat) m <- sapply(object, algorithm) if( unique ) m <- unique(m) if( string ) m <- paste(m, collapse=', ') m } } ) .seqtime <- function(object){ if( length(object) == 0 ) return(NULL) # sum up the time across the runs t.mat <- sapply(object, function(x){ if( is(x, 'NMFfitXn') ) runtime.all(x) else runtime(x) }) res <- rowSums(t.mat) class(res) <- 'proc_time' res } #' Returns the CPU time that would be required to sequentially compute all NMF #' fits stored in \code{object}. #' #' This method calls the function \code{runtime} on each fit and sum up the #' results. #' It returns \code{NULL} on an empty object. setMethod('seqtime', 'NMFList', function(object){ if( length(object) == 0 ) return(NULL) # sum up the time across the runs .seqtime(object) } ) #' Returns the CPU time required to compute all NMF fits in the list. #' It returns \code{NULL} if the list is empty. #' If no timing data are available, the sequential time is returned. #' #' @param all logical that indicates if the CPU time of each fit should be #' returned (\code{TRUE}) or only the total CPU time used to compute all #' the fits in \code{object}. setMethod('runtime', 'NMFList', function(object, all=FALSE){ if( !all ){ t <- slot(object, 'runtime') if( length(t)==0 ) seqtime(object) else t }else sapply(object, runtime) } ) as.NMFList <- function(..., unlist=FALSE){ arg.l <- list(...) if( length(arg.l) == 1L && is.list(arg.l[[1]]) && !is(arg.l[[1]], 'NMFfitX') ) arg.l <- arg.l[[1]] # unlist if required if( unlist ) arg.l <- unlist(arg.l) # create a NMFList object from the input list new('NMFList', arg.l) } #' Virtual Class to Handle Results from Multiple Runs of NMF Algorithms #' #' This class defines a common interface to handle the results from multiple #' runs of a single NMF algorithm, performed with the \code{\link{nmf}} method. #' #' Currently, this interface is implemented by two classes, #' \code{\linkS4class{NMFfitX1}} and \code{\linkS4class{NMFfitXn}}, which #' respectively handle the case where only the best fit is kept, and the case #' where the list of all the fits is returned. #' #' See \code{\link{nmf}} for more details on the method arguments. #' #' @slot runtime.all Object of class \code{\link[=proc.time]{proc_time}} that #' contains CPU times required to perform all the runs. #' #' @export #' @family multipleNMF #' @examples #' #' # generate a synthetic dataset with known classes #' n <- 20; counts <- c(5, 2, 3); #' V <- syntheticNMF(n, counts) #' #' # perform multiple runs of one algorithm (default is to keep only best fit) #' res <- nmf(V, 3, nrun=3) #' res #' #' # plot a heatmap of the consensus matrix #' \dontrun{ consensusmap(res) } #' setClass('NMFfitX' , representation( runtime.all = 'proc_time' # running time to perform all the NMF runs ) , contains='VIRTUAL' ) #' Returns the CPU time required to compute all the NMF runs. #' It returns \code{NULL} if no CPU data is available. setMethod('runtime.all', 'NMFfitX', function(object){ t <- slot(object, 'runtime.all') if( length(t) > 0 ) t else NULL } ) #' Returns the number of NMF runs performed to create \code{object}. #' #' It is a pure virtual method defined to ensure \code{nrun} is defined #' for sub-classes of \code{NMFfitX}, which throws an error if called. #' #' Note that because the \code{\link{nmf}} function allows to run the NMF #' computation keeping only the best fit, \code{nrun} may return a value #' greater than one, while only the result of the best run is stored in #' the object (cf. option \code{'k'} in method \code{\link{nmf}}). setMethod('nrun', 'NMFfitX', function(object){ stop("NMF::NMFfitX - missing definition for pure virtual method 'nrun' in class '", class(object), "'") } ) #' This method always returns 1, since an \code{NMFfit} object is obtained #' from a single NMF run. setMethod('nrun', 'NMFfit', function(object){ 1L } ) #' \code{consensus} is an S4 generic that computes/returns the consensus matrix #' from a model object, which is the mean connectivity matrix of all the runs. #' #' The consensus matrix has been proposed by \cite{Brunet2004} to help #' visualising and measuring the stability of the clusters obtained by #' NMF approaches. #' For objects of class \code{NMF} (e.g. results of a single NMF run, or NMF #' models), the consensus matrix reduces to the connectivity matrix. #' #' @rdname connectivity #' @export setGeneric('consensus', function(object, ...) standardGeneric('consensus') ) #' Pure virtual method defined to ensure \code{consensus} is defined for sub-classes of \code{NMFfitX}. #' It throws an error if called. setMethod('consensus', 'NMFfitX', function(object, ...){ stop("NMF::NMFfitX - missing definition for pure virtual method 'consensus' in class '", class(object), "'") } ) #' This method is provided for completeness and is identical to #' \code{\link{connectivity}}, and returns the connectivity matrix, #' which, in the case of a single NMF model, is also the consensus matrix. setMethod('consensus', 'NMF', function(object, ...){ connectivity(object, ...) } ) #' Hierarchical Clustering of a Consensus Matrix #' #' The function \code{consensushc} computes the hierarchical clustering of #' a consensus matrix, using the matrix itself as a similarity matrix and #' average linkage. #' It is #' #' @param object a matrix or an \code{NMFfitX} object, as returned by multiple #' NMF runs. #' @param ... extra arguments passed to next method calls #' #' @return an object of class \code{dendrogram} or \code{hclust} depending on the #' value of argument \code{dendrogram}. #' #' @inline #' @export setGeneric('consensushc', function(object, ...) standardGeneric('consensushc')) #' Workhorse method for matrices. #' #' @param method linkage method passed to \code{\link{hclust}}. #' @param dendrogram a logical that specifies if the result of the hierarchical #' clustering (en \code{hclust} object) should be converted into a dendrogram. #' Default value is \code{TRUE}. setMethod('consensushc', 'matrix', function(object, method='average', dendrogram=TRUE){ # hierachical clustering based on the connectivity matrix hc <- hclust(as.dist(1-object), method=method) # convert into a dendrogram if requested if( dendrogram ) as.dendrogram(hc) else hc } ) #' Compute the hierarchical clustering on the connectivity matrix of \code{object}. setMethod('consensushc', 'NMF', function(object, ...){ # hierachical clustering based on the connectivity matrix consensushc(connectivity(object), ...) } ) #' Compute the hierarchical clustering on the consensus matrix of \code{object}, #' or on the connectivity matrix of the best fit in \code{object}. #' #' @param what character string that indicates which matrix to use in the #' computation. #' setMethod('consensushc', 'NMFfitX', function(object, what=c('consensus', 'fit'), ...){ what <- match.arg(what) if( what == 'consensus' ){ # hierachical clustering on the consensus matrix consensushc(consensus(object), ...) }else if( what == 'fit' ) consensushc(fit(object), ...) } ) #' Returns the cluster membership index from an NMF model fitted with multiple #' runs. #' #' Besides the type of clustering available for any NMF models #' (\code{'columns', 'rows', 'samples', 'features'}), this method can return #' the cluster membership index based on the consensus matrix, computed from #' the multiple NMF runs. #' #' Argument \code{what} accepts the following extra types: #' \describe{ #' \item{\code{'chc'}}{ returns the cluster membership based on the #' hierarchical clustering of the consensus matrix, as performed by #' \code{\link{consensushc}}.} #' \item{\code{'consensus'}}{ same as \code{'chc'} but the levels of the membership #' index are re-labeled to match the order of the clusters as they would be displayed on the #' associated dendrogram, as re-ordered on the default annotation track in consensus #' heatmap produced by \code{\link{consensusmap}}.} #' } #' setMethod('predict', signature(object='NMFfitX'), function(object, what=c('columns', 'rows', 'samples', 'features', 'consensus', 'chc'), dmatrix = FALSE, ...){ # determine which prediction to do what <- match.arg(what) res <- if( what %in% c('consensus', 'chc') ){ # build the tree from consensus matrix h <- consensushc(object, what='consensus', dendrogram=FALSE) # extract membership from the tree cl <- cutree(h, k=nbasis(object)) # rename the cluster ids in the case of a consensus map if( what != 'chc' ){ dr <- as.dendrogram(h) o <- order.dendrogram(reorder(dr, rowMeans(consensus(object), na.rm=TRUE))) cl <- setNames(match(cl, unique(cl[o])), names(cl)) } res <- as.factor(cl) # add dissimilarity matrix if requested if( dmatrix ){ attr(res, 'dmatrix') <- 1 - consensus(object) } if( what != 'chc' ) attr(res, 'iOrd') <- o # return res } else predict(fit(object), what=what, ..., dmatrix = dmatrix) attr(res, 'what') <- what res } ) #' Returns the model object that achieves the lowest residual approximation #' error across all the runs. #' #' It is a pure virtual method defined to ensure \code{fit} is defined #' for sub-classes of \code{NMFfitX}, which throws an error if called. setMethod('fit', 'NMFfitX', function(object){ stop("NMF::NMFfitX - missing definition for pure virtual method 'fit' in class '", class(object), "'") } ) #' Returns the fit object that achieves the lowest residual approximation #' error across all the runs. #' #' It is a pure virtual method defined to ensure \code{minfit} is defined #' for sub-classes of \code{NMFfitX}, which throws an error if called. setMethod('minfit', 'NMFfitX', function(object){ stop("NMF::NMFfitX - missing definition for pure virtual method 'minfit' in class '", class(object), "'") } ) #' Show method for objects of class \code{NMFfitX} #' @export setMethod('show', 'NMFfitX', function(object){ cat("\n") # name of the algorithm cat(" Method:", algorithm(object), "\n") # number of runs cat(" Runs: ", nrun(object),"\n"); # initial state cat(" RNG:\n ", RNGstr(getRNG1(object)),"\n"); if( nrun(object) > 0 ){ # show total timing cat(" Total timing:\n"); show(runtime.all(object)); } } ) #' Extracting RNG Data from NMF Objects #' #' The \code{\link{nmf}} function returns objects that contain embedded RNG data, #' that can be used to exactly reproduce any computation. #' These data can be extracted using dedicated methods for the S4 generics #' \code{\link[rngtools]{getRNG}} and \code{\link[rngtools]{getRNG1}}. #' #' @inheritParams rngtools::getRNG #' @inheritParams rngtools::getRNG1 #' #' @inline #' @rdname RNG #' @export setGeneric('getRNG1', package='rngtools') #' Returns the RNG settings used for the first NMF run of multiple NMF runs. #' #' @examples #' # For multiple NMF runs, the RNG settings used for the first run is also stored #' V <- rmatrix(20,10) #' res <- nmf(V, 3, nrun=3) #' # RNG used for the best fit #' getRNG(res) #' # RNG used for the first of all fits #' getRNG1(res) #' # they may differ if the best fit is not the first one #' rng.equal(res, getRNG1(res)) #' setMethod('getRNG1', signature(object='NMFfitX'), function(object){ stop("NMF::getRNG1(", class(object), ") - Unimplemented pure virtual method: could not extract initial RNG settings.") } ) #' Compares two NMF models when at least one comes from multiple NMF runs. setMethod('nmf.equal', signature(x='NMFfitX', y='NMF'), function(x, y, ...){ nmf.equal(fit(x), y, ...) } ) #' Compares two NMF models when at least one comes from multiple NMF runs. setMethod('nmf.equal', signature(x='NMF', y='NMFfitX'), function(x, y, ...){ nmf.equal(x, fit(y), ...) } ) #' Returns the residuals achieved by the best fit object, i.e. the lowest #' residual approximation error achieved across all NMF runs. setMethod('residuals', signature(object='NMFfitX'), function(object, ...){ residuals(minfit(object), ...) } ) #' Returns the deviance achieved by the best fit object, i.e. the lowest #' deviance achieved across all NMF runs. setMethod('deviance', signature(object='NMFfitX'), function(object, ...){ deviance(minfit(object), ...) } ) ######################################################### # END_NMFfitX ######################################################### #' Structure for Storing the Best Fit Amongst Multiple NMF Runs #' #' This class is used to return the result from a multiple run of a single NMF #' algorithm performed with function \code{nmf} with the -- default -- option #' \code{keep.all=FALSE} (cf. \code{\link{nmf}}). #' #' It extends both classes \code{\linkS4class{NMFfitX}} and #' \code{\linkS4class{NMFfit}}, and stores a the result of the best fit in its #' \code{NMFfit} structure. #' #' Beside the best fit, this class allows to hold data about the computation of #' the multiple runs, such as the number of runs, the CPU time used to perform #' all the runs, as well as the consensus matrix. #' #' Due to the inheritance from class \code{NMFfit}, objects of class #' \code{NMFfitX1} can be handled exactly as the results of single NMF run -- #' as if only the best run had been performed. #' #' #' @slot consensus object of class \code{matrix} used to store the #' consensus matrix based on all the runs. #' #' @slot nrun an \code{integer} that contains the number of runs #' performed to compute the object. #' #' @slot rng1 an object that contains RNG settings used for the first #' run. See \code{\link{getRNG1}}. #' #' @export #' @family multipleNMF #' @examples #' #' # generate a synthetic dataset with known classes #' n <- 15; counts <- c(5, 2, 3); #' V <- syntheticNMF(n, counts, factors = TRUE) #' #' # get the class factor #' groups <- V$pData$Group #' #' # perform multiple runs of one algorithm, keeping only the best fit (default) #' #i.e.: the implicit nmf options are .options=list(keep.all=FALSE) or .options='-k' #' res <- nmf(V[[1]], 3, nrun=2) #' res #' #' # compute summary measures #' summary(res) #' # get more info #' summary(res, target=V[[1]], class=groups) #' #' # show computational time #' runtime.all(res) #' #' # plot the consensus matrix, as stored (pre-computed) in the object #' \dontrun{ consensusmap(res, annCol=groups) } #' setClass('NMFfitX1' , representation( #fit = 'NMFfit' # holds the best fit from all the runs consensus = 'matrix' # average connectivity matrix of all the NMF runs , nrun = 'integer' , rng1 = 'ANY' ) , contains=c('NMFfitX', 'NMFfit') , prototype=prototype( consensus = matrix(as.numeric(NA),0,0) , nrun = as.integer(0) ) ) #' Show method for objects of class \code{NMFfitX1} #' @export setMethod('show', 'NMFfitX1', function(object){ callNextMethod(object) # show details of the best fit #cat(" # Best fit:\n ") #s <- capture.output(show(fit(object))) #cat(s, sep="\n |") } ) #' Returns the number of NMF runs performed, amongst which \code{object} was #' selected as the best fit. setMethod('nrun', 'NMFfitX1', function(object){ slot(object,'nrun') } ) #' Returns the consensus matrix computed while performing all NMF runs, #' amongst which \code{object} was selected as the best fit. #' #' The result is the matrix stored in slot \sQuote{consensus}. #' This method returns \code{NULL} if the consensus matrix is empty. setMethod('consensus', signature(object='NMFfitX1'), function(object, no.attrib = FALSE){ C <- slot(object, 'consensus') if( length(C) > 0 ){ if( !no.attrib ){ class(C) <- c(class(C), 'NMF.consensus') attr(C, 'nrun') <- nrun(object) attr(C, 'nbasis') <- nbasis(object) } C }else NULL } ) #' Returns the fit object associated with the best fit, amongst all the #' runs performed when fitting \code{object}. #' #' Since \code{NMFfitX1} objects only hold the best fit, this method simply #' returns \code{object} coerced into an \code{NMFfit} object. setMethod('minfit', 'NMFfitX1', function(object){ # coerce the object into a NMFfit object as(object, 'NMFfit') } ) #' Returns the model object associated with the best fit, amongst all the #' runs performed when fitting \code{object}. #' #' Since \code{NMFfitX1} objects only hold the best fit, this method simply #' returns the NMF model fitted by \code{object} -- that is stored in slot #' \sQuote{fit}. setMethod('fit', signature(object='NMFfitX1'), function(object){ slot(object, 'fit') } ) #' Returns the RNG settings used to compute the first of all NMF runs, amongst #' which \code{object} was selected as the best fit. setMethod('getRNG1', signature(object='NMFfitX1'), function(object){ object@rng1 } ) #' Compares the NMF models fitted by multiple runs, that only kept the best fits. setMethod('nmf.equal', signature(x='NMFfitX1', y='NMFfitX1'), function(x, y, ...){ nmf.equal(fit(x), fit(y), ...) } ) ######################################################### # END_NMFfitX1 ######################################################### #' Structure for Storing All Fits from Multiple NMF Runs #' #' This class is used to return the result from a multiple run of a single NMF #' algorithm performed with function \code{nmf} with option #' \code{keep.all=TRUE} (cf. \code{\link{nmf}}). #' #' It extends both classes \code{\linkS4class{NMFfitX}} and \code{list}, and #' stores the result of each run (i.e. a \code{NMFfit} object) in its #' \code{list} structure. #' #' IMPORTANT NOTE: This class is designed to be \strong{read-only}, even though #' all the \code{list}-methods can be used on its instances. Adding or removing #' elements would most probably lead to incorrect results in subsequent calls. #' Capability for concatenating and merging NMF results is for the moment only #' used internally, and should be included and supported in the next release of #' the package. #' #' #' @slot .Data standard slot that contains the S3 \code{list} object data. #' See R documentation on S3/S4 classes for more details (e.g., \code{\link{setOldClass}}). #' #' @export #' @family multipleNMF #' @examples #' #' # generate a synthetic dataset with known classes #' n <- 15; counts <- c(5, 2, 3); #' V <- syntheticNMF(n, counts, factors = TRUE) #' #' # get the class factor #' groups <- V$pData$Group #' #' # perform multiple runs of one algorithm, keeping all the fits #' res <- nmf(V[[1]], 3, nrun=2, .options='k') # .options=list(keep.all=TRUE) also works #' res #' #' summary(res) #' # get more info #' summary(res, target=V[[1]], class=groups) #' #' # compute/show computational times #' runtime.all(res) #' seqtime(res) #' #' # plot the consensus matrix, computed on the fly #' \dontrun{ consensusmap(res, annCol=groups) } #' setClass('NMFfitXn' , contains=c('NMFfitX', 'list') , validity=function(object){ # the list must only contains NMFfit objects of the same dimensions ref.dim <- NULL ref.algo <- NULL for(i in seq_along(object)){ # check class of the element item <- object[[i]] if( !(is(item, 'NMFfit') && !is(item, 'NMFfitX')) ) return(paste("invalid class for element", i, "of input list [all elements must be a NMFfit object]")) # check dimensions if( is.null(ref.dim) ) ref.dim <- dim(item) if( !identical(ref.dim, dim(item)) ) return(paste("invalid dimension for element", i, "of input list [all elements must have the same dimensions]")) # check algorithm names if( is.null(ref.algo) ) ref.algo <- algorithm(item) if( !identical(ref.algo, algorithm(item)) ) return(paste("invalid algorithm for element", i, "of input list [all elements must result from the same algorithm]")) } } ) # Updater for slot .Data #objectUpdater('NMFfitXn', '0.5.06' # , vfun=function(object){ !.hasSlot(object, 'rng1') } # , function(x, y){ # y@.Data <- lapply(x@.Data, nmfObject) # } #) #' Show method for objects of class \code{NMFfitXn} #' @export setMethod('show', 'NMFfitXn', function(object){ callNextMethod(object) # if the object is not empty and slot runtime.all is not null then show # the sequential time, as it might be different from runtime.all if( length(object) > 0 && !is.null(runtime.all(object, null=TRUE)) ){ # show total sequential timing cat(" Sequential timing:\n"); show(seqtime(object)); } } ) #' Returns the number of basis components common to all fits. #' #' Since all fits have been computed using the same rank, it returns the #' factorization rank of the first fit. #' This method returns \code{NULL} if the object is empty. setMethod('nbasis', signature(x='NMFfitXn'), function(x, ...){ if( length(x) == 0 ) return(NULL) return( nbasis(x[[1]]) ) } ) #' Returns the dimension common to all fits. #' #' Since all fits have the same dimensions, it returns the dimension of the #' first fit. #' This method returns \code{NULL} if the object is empty. #' #' @rdname dims setMethod('dim', signature(x='NMFfitXn'), function(x){ if( length(x) == 0 ) return(NULL) return( dim(x[[1L]]) ) } ) #' Returns the coefficient matrix of the best fit amongst all the fits stored in #' \code{object}. #' It is a shortcut for \code{coef(fit(object))}. setMethod('coef', signature(object='NMFfitXn'), function(object, ...){ coef(fit(object), ...) } ) #' Returns the basis matrix of the best fit amongst all the fits stored in #' \code{object}. #' It is a shortcut for \code{basis(fit(object))}. setMethod('basis', signature(object='NMFfitXn'), function(object, ...){ basis(fit(object), ...) } ) #' Method for multiple NMF fit objects, which returns the indexes of fixed basis #' terms from the best fitted model. setMethod('ibterms', 'NMFfitX', function(object){ ibterms(fit(object)) } ) #' Method for multiple NMF fit objects, which returns the indexes of fixed #' coefficient terms from the best fitted model. setMethod('icterms', 'NMFfit', function(object){ icterms(fit(object)) } ) #' Returns the number of runs performed to compute the fits stored in the list #' (i.e. the length of the list itself). setMethod('nrun', 'NMFfitXn', function(object){ length(object) } ) #' Returns the name of the common NMF algorithm used to compute all fits #' stored in \code{object} #' #' Since all fits are computed with the same algorithm, this method returns the #' name of algorithm that computed the first fit. #' It returns \code{NULL} if the object is empty. setMethod('algorithm', 'NMFfitXn', function(object){ if( length(object) == 0 ) return(NULL) return( algorithm(object[[1]]) ) } ) #' Returns the name of the common seeding method used the computation of all fits #' stored in \code{object} #' #' Since all fits are seeded using the same method, this method returns the #' name of the seeding method used for the first fit. #' It returns \code{NULL} if the object is empty. setMethod('seeding', 'NMFfitXn', function(object){ if( length(object) == 0 ) return(NULL) return( seeding(object[[1]]) ) } ) #' Returns the common type NMF model of all fits stored in \code{object} #' #' Since all fits are from the same NMF model, this method returns the #' model type of the first fit. #' It returns \code{NULL} if the object is empty. setMethod('modelname', signature(object='NMFfitXn'), function(object){ if( length(object) == 0 ) return(NULL) return( modelname(object[[1]]) ) } ) #' Returns the CPU time that would be required to sequentially compute all NMF #' fits stored in \code{object}. #' #' This method calls the function \code{runtime} on each fit and sum up the #' results. #' It returns \code{NULL} on an empty object. setMethod('seqtime', 'NMFfitXn', function(object){ if( length(object) == 0 ) return(NULL) # sum up the time across the runs .seqtime(object) } ) #' Returns the CPU time used to perform all the NMF fits stored in \code{object}. #' #' If no time data is available from in slot \sQuote{runtime.all} and argument #' \code{null=TRUE}, then the sequential time as computed by #' \code{\link{seqtime}} is returned, and a warning is thrown unless \code{warning=FALSE}. #' #' @param null a logical that indicates if the sequential time should be returned #' if no time data is available in slot \sQuote{runtime.all}. #' @param warning a logical that indicates if a warning should be thrown if the #' sequential time is returned instead of the real CPU time. #' setMethod('runtime.all', 'NMFfitXn', function(object, null=FALSE, warning=TRUE){ if( length(object) == 0 ) return(NULL) stored.time <- slot(object, 'runtime.all') # if there is some time stored, return it if( length(stored.time) > 0 ) stored.time else if( null ) NULL else{ if( warning ) warning("NMFfitXn::runtime.all - computation time data not available [sequential time was used instead]") seqtime(object) # otherwise total sequential time } } ) #' Returns the best NMF model in the list, i.e. the run that achieved the lower #' estimation residuals. #' #' The model is selected based on its \code{deviance} value. #' setMethod('minfit', 'NMFfitXn', function(object){ b <- which.best(object, deviance) # test for length 0 if( length(b) == 0 ) return(NULL) # return the run with the lower object[[ b ]] } ) #' \code{which.best} returns the index of the best fit in a list of NMF fit, #' according to some quantitative measure. #' The index of the fit with the lowest measure is returned. #' #' @param object an NMF model fitted by multiple runs. #' @param FUN the function that computes the quantitative measure. #' @param ... extra arguments passed to \code{FUN}. #' #' @export #' @rdname advanced which.best <- function(object, FUN=deviance, ...){ # test for length 0 if( length(object) == 0 ) return(integer()) # retrieve the measure for each run e <- sapply(object, FUN, ...) # return the run with the lower which.min(e) } #' Returns the RNG settings used for the first run. #' #' This method throws an error if the object is empty. setMethod('getRNG1', signature(object='NMFfitXn'), function(object){ if( length(object) == 0 ) stop("NMF::getRNG1 - Could not extract RNG data from empty object [class:", class(object), "]") getRNG(object[[1]]) } ) #' @inline #' @rdname RNG #' @export setGeneric('.getRNG', package='rngtools') #' Returns the RNG settings used for the best fit. #' #' This method throws an error if the object is empty. setMethod('.getRNG', signature(object='NMFfitXn'), function(object, ...){ if( length(object) == 0 ) stop("NMF::getRNG - Could not extract RNG data from empty object [class:", class(object), "]") getRNG(minfit(object), ...) } ) #' Returns the best NMF fit object amongst all the fits stored in \code{object}, #' i.e. the fit that achieves the lowest estimation residuals. setMethod('fit', signature(object='NMFfitXn'), function(object){ fit( minfit(object) ) } ) #' Compares the results of multiple NMF runs. #' #' This method either compare the two best fit, or all fits separately. #' All extra arguments in \code{...} are passed to each internal call to #' \code{nmf.equal}. #' #' @param all a logical that indicates if all fits should be compared separately #' or only the best fits #' @param vector a logical, only used when \code{all=TRUE}, that indicates if #' all fits must be equal for \code{x} and \code{y} to be declared equal, or #' if one wants to return the result of each comparison in a vector. #' #' @inline setMethod('nmf.equal', signature(x='list', y='list'), function(x, y, ..., all=FALSE, vector=FALSE){ if( !all ) nmf.equal(x[[ which.best(x) ]], y[[ which.best(y) ]], ...) else{ if( length(x) != length(y) ) FALSE else res <- mapply(function(a,b,...) isTRUE(nmf.equal(a,b,...)), x, y, MoreArgs=list(...)) if( !vector ) res <- all( res ) res } } ) #' Compare all elements in \code{x} to \code{x[[1]]}. setMethod('nmf.equal', signature(x='list', y='missing'), function(x, y, ...){ if( length(x) == 0L ){ warning("Empty list argument `x`: returning NA") return(NA) } if( length(x) == 1L ){ warning("Only one element in list argument `x`: returning TRUE") return(TRUE) } for( a in x ){ if( !nmf.equal(x[[1]], a, ...) ) return(FALSE) } return(TRUE) } ) #' Computes the consensus matrix of the set of fits stored in \code{object}, as #' the mean connectivity matrix across runs. #' #' This method returns \code{NULL} on an empty object. #' The result is a matrix with several attributes attached, that are used by #' plotting functions such as \code{\link{consensusmap}} to annotate the plots. #' #' @aliases plot.NMF.consensus setMethod('consensus', signature(object='NMFfitXn'), function(object, ..., no.attrib = FALSE){ if( length(object) == 0 ) return(NULL) # init empty consensus matrix con <- matrix(0, ncol(object), ncol(object)) # name the rows and columns appropriately: use the sample names of the first fit dimnames(con) <- list(colnames(object[[1]]), colnames(object[[1]])) # compute mean connectivity matrix sapply(object , function(x, ...){ con <<- con + connectivity(x, ..., no.attrib = TRUE) NULL } , ... ) con <- con / nrun(object) # return result if( !no.attrib ){ class(con) <- c(class(con), 'NMF.consensus') attr(con, 'nrun') <- nrun(object) attr(con, 'nbasis') <- nbasis(object) } con } ) #' @method plot NMF.consensus #' @export plot.NMF.consensus <- function(x, ...){ consensusmap(x, ...) } #' Dispersion of a Matrix #' #' Computes the dispersion coefficient of a -- consensus -- matrix #' \code{object}, generally obtained from multiple NMF runs. #' #' The dispersion coefficient is based on the consensus matrix (i.e. the #' average of connectivity matrices) and was proposed by \cite{KimH2007} to #' measure the reproducibility of the clusters obtained from NMF. #' #' It is defined as: #' \deqn{\rho = \sum_{i,j=1}^n 4 (C_{ij} - \frac{1}{2})^2 , } #' where \eqn{n} is the total number of samples. #' #' By construction, \eqn{0 \leq \rho \leq 1} and \eqn{\rho = 1} only for a perfect #' consensus matrix, where all entries 0 or 1. #' A perfect consensus matrix is obtained only when all the connectivity matrices #' are the same, meaning that the algorithm gave the same clusters at each run. #' See \cite{KimH2007}. #' #' @param object an object from which the dispersion is computed #' @param ... extra arguments to allow extension #' #' @export setGeneric('dispersion', function(object, ...) standardGeneric('dispersion') ) #' Workhorse method that computes the dispersion on a given matrix. setMethod('dispersion', 'matrix', function(object, ...){ stopifnot( nrow(object) == ncol(object) ) sum( 4 * (object-1/2)^2 ) / nrow(object)^2 } ) #' Computes the dispersion on the consensus matrix obtained from multiple NMF #' runs. setMethod('dispersion', 'NMFfitX', function(object, ...){ dispersion(consensus(object), ...) } ) #' Factory Method for Multiple NMF Run Objects #' #' @param object an object from which is created an \code{NMFfitX} object #' @param ... extra arguments used to pass values for slots #' #' @inline #' @keywords internal setGeneric('NMFfitX', function(object, ...) standardGeneric('NMFfitX') ) #' Create an \code{NMFfitX} object from a list of fits. #' #' @param .merge a logical that indicates if the fits should be aggregated, only #' keeping the best fit, and return an \code{NMFfitX1} object. #' If \code{FALSE}, an \code{NMFfitXn} object containing the data of all the fits #' is returned. #' setMethod('NMFfitX', 'list', function(object, ..., .merge=FALSE){ if( length(object) == 0 ) return(new('NMFfitXn')) else if( is(object, 'NMFfitXn') && !.merge) return(object) # retrieve the extra arguments extra <- list(...) # if runtime.all is provided: be sure it's of the right class tt <- extra$runtime.all compute.tt <- TRUE if( !is.null(tt) ){ if( !is(tt, 'proc_time') ){ if( !is.numeric(tt) || length(tt) != 5 ) stop("NMF::NMFfitX - invalid value for 'runtime.all' [5-length numeric expected]") class(extra$runtime.all) <- 'proc_time' } compute.tt <- FALSE }else{ extra$runtime.all <- rep(0,5) class(extra$runtime.all) <- 'proc_time' } # check validity and aggregate if required ref.algo <- NULL ref.class <- NULL nrun <- 0 lapply( seq_along(object) , function(i){ item <- object[[i]] # check the type of each element if( !(is(item, 'NMFfitX') || is(item, 'NMFfit')) ) stop("NMF::NMFfitX - invalid class for element ", i, " of input list [all elements must be NMFfit or NMFfitX objects]") # check that all elements result from the same algorithm if( is.null(ref.algo) ) ref.algo <<- algorithm(item) if( !identical(algorithm(item), ref.algo) ) stop("NMF::NMFfitX - invalid algorithm for element ", i, " of input list [cannot join results from different algorithms]") # check if simple join is possible: only Ok if all elements are from the same class (NMFfit or NMFfitXn) if( length(ref.class) <= 1 ) ref.class <<- unique(c(ref.class, class(item))) # sum up the number of runs nrun <<- nrun + nrun(item) # compute total running time if necessary if( compute.tt ) extra$runtime.all <<- extra$runtime.all + runtime.all(item) } ) # force merging if the input list is hetergeneous or if it only contains NMFfitX1 objects if( length(ref.class) > 1 || ref.class == 'NMFfitX1' ){ nmf.debug('NMFfitX', ".merge is forced to TRUE") .merge <- TRUE } # unpack all the NMFfit objects object.list <- unlist(object) nmf.debug('NMFfitX', "Number of fits to join = ", length(object.list)) # one wants to keep only the best result if( .merge ){ warning("NMF::NMFfitX - The method for merging lists is still in development") # set the total number of runs extra$nrun <- as.integer(nrun) # consensus matrix if( !is.null(extra$consensus) ) warning("NMF::NMFfitX - the value of 'consensus' was discarded as slot 'consensus' is computed internally") extra$consensus <- NULL consensus <- matrix(as.numeric(NA), 0, 0) best.res <- Inf best.fit <- NULL sapply(object.list, function(x){ if( !is(x, 'NMFfit') ) stop("NMF::NMFfitX - all inner-elements of '",substitute(object),"' must inherit from class 'NMFfit'") # merge consensus matrices consensus <<- if( sum(dim(consensus)) == 0 ) nrun(x) * consensus(x) else consensus + nrun(x) * consensus(x) temp.res <- residuals(x) if( temp.res < best.res ){ # keep best result best.fit <<- minfit(x) best.res <<- temp.res } }) # finalize consensus matrix consensus <- consensus/extra$nrun extra$consensus <- consensus # return merged result return( do.call(NMFfitX, c(list(best.fit), extra)) ) } else{ # create a NMFfitXn object that holds the whole list do.call('new', c(list('NMFfitXn', object.list), extra)) } } ) #' Creates an \code{NMFfitX1} object from a single fit. #' This is used in \code{\link{nmf}} when only the best fit is kept in memory or #' on disk. #' setMethod('NMFfitX', 'NMFfit', function(object, ...){ extra <- list(...) # default value for nrun is 1 if( is.null(extra$nrun) ) extra$nrun = as.integer(1) # a consensus matrix is required (unless nrun is 1) if( is.null(extra$consensus) ){ if( extra$nrun == 1 ) extra$consensus <- connectivity(object) else stop("Slot 'consensus' is required to create a 'NMFfitX1' object where nrun > 1") } # slot runtime.all is inferred if missing and nrun is 1 if( is.null(extra$runtime.all) && extra$nrun == 1 ) extra$runtime.all <- runtime(object) # create the NMFfitX1 object do.call('new', c(list('NMFfitX1', object), extra)) } ) #' Provides a way to aggregate \code{NMFfitXn} objects into an \code{NMFfitX1} #' object. setMethod('NMFfitX', 'NMFfitX', function(object, ...){ # nothing to do in the case of NMFfitX1 objects if( is(object, 'NMFfitX1') ) return(object) # retrieve extra arguments extra <- list(...) # take runtime.all from the object itself if( !is.null(extra$runtime.all) ) warning("NMF::NMFfitX - argument 'runtime.all' was discarded as it is computed from argument 'object'") extra$runtime.all <- runtime.all(object) # create the NMFfitX1 object f <- selectMethod(NMFfitX, 'list') do.call(f, c(list(object), extra)) } ) #' Computes the best or mean purity across all NMF fits stored in \code{x}. #' #' @param method a character string that specifies how the value is computed. #' It may be either \code{'best'} or \code{'mean'} to compute the best or mean #' purity respectively. #' #' @inline setMethod('purity', signature(x='NMFfitXn', y='ANY'), function(x, y, method='best', ...){ c <- sapply(x, purity, y=y, ...) # aggregate the results if a method is provided if( is.null(method) ) c else aggregate.measure(c, method, decreasing=TRUE) } ) #' Computes the best or mean entropy across all NMF fits stored in \code{x}. #' #' @inline setMethod('entropy', signature(x='NMFfitXn', y='ANY'), function(x, y, method='best', ...){ c <- sapply(x, entropy, y=y, ...) # aggregate the results if a method is provided if( is.null(method) ) c else aggregate.measure(c, method) } ) #' Utility function to aggregate numerical quality measures from \code{NMFfitXn} objects. #' #' Given a numerical vector, this function computes an aggregated value using one of the following methods: #' best or mean #' #' @param x a numerical vector #' @param method the method to aggregate values. This argument can take two values : #' - mean: the mean of the measures #' - best: the best measure according to the specified sorting order (decreasing or not) #' @param decreasing logical that specified the sorting order #' @param ... extra arguments to allow extension #' aggregate.measure <- function(x, method=c('best', 'mean'), decreasing=FALSE,...){ # aggregate the results method <- match.arg(method) res <- switch(method , mean = mean(x) , best = if( decreasing ) max(x) else min(x) ) # set the name to names(res) <- method # return result res } #' Computes a set of measures to help evaluate the quality of the \emph{best #' fit} of the set. #' The result is similar to the result from the \code{summary} method of #' \code{NMFfit} objects. #' See \code{\linkS4class{NMF}} for details on the computed measures. #' In addition, the cophenetic correlation (\code{\link{cophcor}}) and #' \code{\link{dispersion}} coefficients of the consensus matrix are returned, #' as well as the total CPU time (\code{\link{runtime.all}}). #' setMethod('summary', signature(object='NMFfitX'), function(object, ...){ # compute summary measures for the best fit best.fit <- minfit(object) s <- summary(best.fit, ...) # get totaltime t <- runtime.all(object) # replace cpu.all and nrun in the result (as these are set by the summary method of class NMFfit) s[c('cpu.all', 'nrun')] <- c(as.numeric(t['user.self']+t['user.child']), nrun(object)) # compute cophenetic correlation coeff and dispersion C <- consensus(object) s <- c(s, cophenetic=cophcor(C), dispersion=dispersion(C)) # compute mean consensus silhouette width si <- silhouette(object, what = 'consensus') s <- c(s, silhouette.consensus = if( !is_NA(si) ) summary(si)$avg.width else NA) # return result s } ) #' Comparing Results from Different NMF Runs #' #' The functions documented here allow to compare the fits computed in #' different NMF runs. #' The fits do not need to be from the same algorithm, nor have the same #' dimension. #' #' The methods \code{compare} enables to compare multiple NMF fits either #' passed as arguments or as a list of fits. #' These methods eventually call the method \code{summary,NMFList}, so that #' all its arguments can be passed \strong{named} in \code{...}. #' #' @param ... extra arguments passed by \code{compare} to \code{summary,NMFList} #' or to the \code{summary} method of each fit. #' #' @name compare-NMF #' @rdname nmf-compare NULL .compare_NMF <- function(...){ args <- list(...) iargs <- if( is.null(names(args)) ){ names(args) <- rep("", length(args)) seq(args) }else{ iargs <- which(names(args)=='') if( length(iargs) != length(args) ) iargs <- iargs[ iargs < which(names(args)!='')[1L] ] iargs } lfit <- args[iargs] lfit <- unlist(lfit, recursive=FALSE) # wrap up into an NMFList object object <- as.NMFList(lfit) do.call('summary', c(list(object), args[-iargs])) } #' Compare multiple NMF fits passed as arguments. #' #' @rdname nmf-compare #' #' @examples #' #' x <- rmatrix(20,10) #' res <- nmf(x, 3) #' res2 <- nmf(x, 2, 'lee') #' #' # compare arguments #' compare(res, res2, target=x) #' setMethod('compare', signature(object='NMFfit'), function(object, ...){ .compare_NMF(object, ...) } ) #' Compares the fits obtained by separate runs of NMF, in a single #' call to \code{\link{nmf}}. #' #' @rdname nmf-compare #' #' # compare each fits in a multiple runs #' res3 <- nmf(x, 2, nrun=3, .opt='k') #' compare(res3) #' compare(res3, res, res2) #' compare(list(res3), res, res2, target=x) #' setMethod('compare', signature(object='NMFfitXn'), function(object, ...){ do.call(.compare_NMF, c(unlist(object), list(...))) } ) #' Compares multiple NMF fits passed as a standard list. #' #' @rdname nmf-compare #' #' @examples #' # compare elements of a list #' compare(list(res, res2), target=x) setMethod('compare', signature(object='list'), function(object, ...){ do.call(.compare_NMF, c(list(object), list(...))) } ) #' @details #' \code{summary,NMFList} computes summary measures for each NMF result in the list #' and return them in rows in a \code{data.frame}. #' By default all the measures are included in the result, and \code{NA} values #' are used where no data is available or the measure does not apply to the #' result object (e.g. the dispersion for single' NMF runs is not meaningful). #' This method is very useful to compare and evaluate the performance of #' different algorithms. #' #' @param select the columns to be output in the result \code{data.frame}. The #' column are given by their names (partially matched). The column names are #' the names of the summary measures returned by the \code{summary} methods of #' the corresponding NMF results. #' @param sort.by the sorting criteria, i.e. a partial match of a column name, #' by which the result \code{data.frame} is sorted. The sorting direction #' (increasing or decreasing) is computed internally depending on the chosen #' criteria (e.g. decreasing for the cophenetic coefficient, increasing for the #' residuals). #' #' @rdname nmf-compare setMethod('summary', signature(object='NMFList'), function(object, sort.by=NULL, select=NULL, ...){ if( length(object) == 0L ) return() # define the sorting schema for each criteria (TRUE for decreasing, FALSE for increasing) sorting.schema <- list(method=FALSE, seed=FALSE, rng=FALSE, metric=FALSE , residuals=FALSE, cpu=FALSE, purity=TRUE, nrun=FALSE, cpu.all=FALSE , cophenetic=TRUE, dispersion=TRUE #NMFfitX only , entropy=FALSE, sparseness.basis=TRUE, sparseness.coef=TRUE, rank=FALSE, rss=FALSE , niter=FALSE, evar=TRUE , silhouette.coef = TRUE, silhouette.basis = TRUE , silhouette.consensus = TRUE) # for each result compute the summary measures measure.matrix <- sapply(object, summary, ...) # the results from 'summary' might not have the same length => generate NA where necessary if( is.list(measure.matrix) ){ name.all <- unique(unlist(sapply(measure.matrix, names))) measure.matrix <- sapply(seq_along(measure.matrix), function(i){ m <- measure.matrix[[i]][name.all] names(m) <- name.all m } ) } # transpose the results so that methods are in lines, measures are in columns measure.matrix <- t(measure.matrix) # set up the resulting data.frame methods <- sapply(object, function(x, ...){ x <- minfit(x) m <- algorithm(x) s <- seeding(x) svalue <- objective(x) svalue <- if( is.function(svalue) ) '' else svalue c(method=m, seed=s, rng=RNGdigest(x), metric=svalue) } ) methods <- t(methods) res <- as.data.frame(methods, stringsAsFactors=FALSE) # add the measures to the result res <- cbind(res, measure.matrix) res$rng <- as.numeric(factor(res$rng)) # sort according to the user's preference # ASSERT FOR DEV: all columns measure must have a defined sorting schema #if( !all( no.schema <- is.element(colnames(res), names(sorting.schema))) ) # warning("ASSERT: missing sorting schema for criteria(e): ", paste(paste("'", colnames(res)[!no.schema], "'", sep=''), collapse=', ')) if( !is.null(sort.by) ){ sorting.criteria <- intersect(colnames(res), names(sorting.schema)) sort.by.ind <- pmatch(sort.by, sorting.criteria) if( is.na(sort.by.ind) ) stop("NMF::summary[NMFList] : argument 'sort.by' must be NULL or partially match one of " , paste( paste("'", names(sorting.schema), "'", sep=''), collapse=', ') , call.=FALSE) sort.by <- sorting.criteria[sort.by.ind] res <- res[order(res[[sort.by]], decreasing=sorting.schema[[sort.by]]) , ] # add an attribute to the result to show the sorting criteria that was used attr(res, 'sort.by') <- sort.by } # limit the output to the required measures if( !is.null(select) || !missing(select) ){ select.full <- match.arg(select, colnames(res), several.ok=TRUE) if( length(select.full) < length(select) ) stop("NMF::summary[NMFList] - the elements of argument 'select' must partially match one of " , paste(paste("'", colnames(res),"'", sep=''), collapse=', ') , call.=FALSE) res <- subset(res, select=select.full) } # return result res } ) #' @details #' \code{plot} plot on a single graph the residuals tracks for each fit in \code{x}. #' See function \code{\link{nmf}} for details on how to enable the tracking of residuals. #' #' @param x an \code{NMFList} object that contains fits from separate NMF runs. #' @param y missing #' @inheritParams plot,NMFfit,missing-method #' #' @rdname nmf-compare setMethod('plot', signature(x='NMFList', y='missing'), function(x, y, skip=-1L, ...){ # retrieve normalized residuals tracks max.iter <- 0 tracks <- lapply( x, function(res){ res <- minfit(res) t <- residuals(res, track=TRUE) # skip some residuals(s) if requested if( skip == -1L && !is.null(names(t)) ) t <- t[names(t)!='0'] # remove initial residual else if( skip > 0 ) t <- t[-(1:skip)] #print(t) # update max iteration max.iter <<- max(max.iter, as.numeric(names(t))) # return normalized track t/t[1] } ) minT <- min(sapply(tracks, min)) maxT <- max(sapply(tracks, max)) #print(tracks) # create an empty plot # set default graphical parameters (those can be overriden by the user) params <- .set.list.defaults(list(...) , xlab='Iterations', ylab='Normalised objective values' , main='NMF Residuals') # setup the plot do.call('plot', c(list(0, xlim=c(0,max.iter+100), ylim=c(minT, maxT)), col='#00000000' , params) ) # add legend cols <- seq_along(tracks) legend('topright', legend=names(tracks), fill=cols , title='Algorithm') # plot each tracks lapply( seq_along(tracks), function(i){ t <- tracks[[i]] points(names(t), t, col=cols[i], type='p', cex=0.5) points(names(t), t, col=cols[i], type='l', lwd=1.4) }) # return invisible return(invisible()) } ) #' Deprecated method subsituted by \code{\link{consensusmap}}. setMethod('metaHeatmap', signature(object='NMFfitX'), function(object, ...){ # send deprecated warning .Deprecated('metaHeatmap', 'NMF', "Direct use of the S4-Method 'metaHeatmap' for 'NMFfitX' objects is deprecated, use 'consensusmap' instead.") # call the new function 'consmap' return( consensusmap(object, ...) ) } ) #' \code{consensusmap} plots heatmaps of consensus matrices. #' #' @details #' \code{consensusmap} redefines default values for the following arguments of #' \code{\link{aheatmap}}: #' \itemize{ #' \item the colour palette; #' \item the column ordering which is set equal to the row ordering, since #' a consensus matrix is symmetric; #' \item the distance and linkage methods used to order the rows (and columns). #' The default is to use 1 minus the consensus matrix itself as distance, and #' average linkage. #' \item the addition of two special named annotation tracks, \code{'basis:'} and #' \code{'consensus:'}, that show, for each column (i.e. each sample), #' the dominant basis component in the best fit and the hierarchical clustering #' of the consensus matrix respectively (using 1-consensus as distance and average #' linkage). #' #' These tracks are specified in argument \code{tracks}, which behaves as in #' \code{\link{basismap}}. #' #' \item a suitable title and extra information like the type of NMF model or the #' fitting algorithm, when \code{object} is a fitted NMF model. #' } #' #' @rdname heatmaps #' #' @examples #' #' \dontrun{ #' res <- nmf(x, 3, nrun=3) #' consensusmap(res) #' } #' #' @inline #' @export setGeneric('consensusmap', function(object, ...) standardGeneric('consensusmap') ) #' Plots a heatmap of the consensus matrix obtained when fitting an NMF model with multiple runs. setMethod('consensusmap', 'NMFfitX', function(object, annRow=NA, annCol=NA , tracks=c('basis:', 'consensus:', 'silhouette:') , main = 'Consensus matrix', info = FALSE , ...){ # add side information if requested info <- if( isTRUE(info) ){ paste("NMF model: '", modelname(object) , "'\nAlgorithm: '", algorithm(object) , "'\nbasis: ", nbasis(object) ,"\nnrun: ", nrun(object), sep='') }else if( isFALSE(info) ) NULL else info x <- consensus(object) # process annotation tracks ptracks <- process_tracks(x, tracks, annRow, annCol) annRow <- ptracks$row annCol <- ptracks$col # set special annotation handler ahandlers <- list( basis = function() predict(object) , consensus = function() predict(object, what='consensus') , silhouette = function(){ si <- silhouette(object, what='consensus', order = NA) if( is_NA(si) ) NA else si[, 'sil_width'] } ) specialAnnotation(1L, ahandlers) specialAnnotation(2L, ahandlers) # consensusmap(x, ..., annRow=annRow, annCol=annCol, main = main, info = info) } ) #' Plots a heatmap of the connectivity matrix of an NMF model. setMethod('consensusmap', 'NMF', function(object, ...){ consensusmap(connectivity(object), ...) } ) #' Main method that redefines default values for arguments of \code{\link{aheatmap}}. setMethod('consensusmap', 'matrix', function(object, color='-RdYlBu' , distfun = function(x) as.dist(1-x), hclustfun = 'average' , Rowv = TRUE, Colv = "Rowv" , main = if( is.null(nr) || nr > 1 ) 'Consensus matrix' else 'Connectiviy matrix' , info = FALSE , ...){ nr <- nrun(object) nb <- nbasis(object) info <- if( isTRUE(info) ){ info <- NULL if( !is.null(nr) ) info <- c(info, paste("nrun:", nr)) if( !is.null(nb) ) info <- c(info, paste("nbasis:", nb)) info <- c(info, paste("cophcor:", round(cophcor(object), 3))) }else if( isFALSE(info) ) NULL else info aheatmap(object, color = color, ... , distfun = distfun, hclustfun = hclustfun , Rowv = Rowv, Colv = Colv , main = main , info = info) } ) setOldClass('NMF.rank') #' Draw a single plot with a heatmap of the consensus matrix obtained for each value of the rank, #' in the range tested with \code{\link{nmfEstimateRank}}. #' #' @rdname nmf-compare setMethod('consensusmap', 'NMF.rank', function(object, ...){ # plot the list of consensus matrix (set names to be used as default main titles) consensusmap(setNames(object$fit, paste("rank = ", lapply(object$fit, nbasis))), ...) } ) #' Draw a single plot with a heatmap of the consensus matrix of each element in the list \code{object}. #' #' @param layout specification of the layout. #' It may be a single numeric or a numeric couple, to indicate a square or rectangular layout #' respectively, that is filled row by row. #' It may also be a matrix that is directly passed to the function \code{\link[graphics]{layout}} #' from the package \code{graphics}. #' #' @rdname nmf-compare setMethod('consensusmap', 'list', function(object, layout , Rowv = FALSE, main = names(object) , ...){ opar <- par(no.readonly=TRUE) on.exit(par(opar)) # define default layout if (missing(layout) ){ n <- length(object) nr <- nc <- floor(sqrt(n)) if( nr^2 != n ){ nc <- nr + 1 if( nr == 1 && nr*nc < n ) nr <- nr + 1 } layout <- c(nr, nc) } if( !is.matrix(layout) ){ if( !is.numeric(layout) ) stop("invalid layout specification: must be a matrix or a numeric") if( length(layout) == 1 ) layout <- c(layout, layout) layout <- matrix(1:(layout[1]*layout[2]), layout[1], byrow=TRUE) } graphics::layout(layout) res <- sapply(seq_along(object), function(i, ...){ x <- object[[i]] # set main title main <- if( !is.null(main) && length(main) > 1 ){ if( length(main) != length(object) ) stop("consensusmap - Invalid length for argument `main`: should be either a single character string, or a list or vector of same length as ", deparse(substitute(object))) main[[i]] } # call method for the fit consensusmap(x, ..., Rowv=Rowv, main=main) }, ...) invisible(res) } ) #' Plots a heatmap of the basis matrix of the best fit in \code{object}. setMethod('basismap', signature(object='NMFfitX'), function(object, ...){ # call the method on the best fit basismap(minfit(object), ...) } ) #' Plots a heatmap of the coefficient matrix of the best fit in \code{object}. #' #' This method adds: #' \itemize{ #' \item an extra special column annotation track for multi-run NMF fits, #' \code{'consensus:'}, that shows the consensus cluster associated to each sample. #' \item a column sorting schema \code{'consensus'} that can be passed #' to argument \code{Colv} and orders the columns using the hierarchical clustering of the #' consensus matrix with average linkage, as returned by \code{\link{consensushc}(object)}. #' This is also the ordering that is used by default for the heatmap of the consensus matrix #' as ploted by \code{\link{consensusmap}}. #' } setMethod('coefmap', signature(object='NMFfitX'), function(object , Colv=TRUE , annRow=NA, annCol=NA , tracks=c('basis', 'consensus:') , ...){ x <- minfit(object) # process annotation tracks ptracks <- process_tracks(x, tracks, annRow, annCol) annRow <- ptracks$row annCol <- ptracks$col # set special annotation handler specialAnnotation(2L, 'consensus', function() predict(object, what='consensus')) # row track handler is added in coefmap,NMF # ## process ordering if( isString(Colv) ){ if( Colv %in% c('consensus', 'cmap') ) Colv <- consensushc(object, 'consensus') } ## # call the method on the best fit coefmap(x, ..., Colv=Colv, annRow=annRow, annCol=annCol, tracks=NA) } ) #' Cophenetic Correlation Coefficient #' #' The function \code{cophcor} computes the cophenetic correlation coefficient #' from consensus matrix \code{object}, e.g. as obtained from multiple NMF runs. #' #' The cophenetic correlation coeffificient is based on the consensus matrix #' (i.e. the average of connectivity matrices) and was proposed by #' \cite{Brunet2004} to measure the stability of the clusters obtained from NMF. #' #' It is defined as the Pearson correlation between the samples' distances #' induced by the consensus matrix (seen as a similarity matrix) and their #' cophenetic distances from a hierachical clustering based on these very #' distances (by default an average linkage is used). #' See \cite{Brunet2004}. #' #' @param object an object from which is extracted a consensus matrix. #' @param ... extra arguments to allow extension and passed to subsequent calls. #' #' @inline #' @seealso \code{\link{cophenetic}} #' @export setGeneric('cophcor', function(object, ...) standardGeneric('cophcor') ) #' Workhorse method for matrices. #' #' @param linkage linkage method used in the hierarchical clustering. #' It is passed to \code{\link{hclust}}. #' setMethod('cophcor', signature(object='matrix'), function(object, linkage='average'){ # check for empty matrix if( nrow(object)==0 || ncol(object)==0 ) { warning("NMF::cophcor - NA produced [input matrix is of dimension ", nrow(object), "x", ncol(object), "]" , call.=FALSE) return(NA) } # safe-guard for diagonal matrix: to prevent error in 'cor' if( all(object[upper.tri(object)]==0) && all(diag(object)==object[1,1]) ) return(1) # convert consensus matrix into dissimilarities d.consensus <- as.dist(1 - object) # compute cophenetic distance based on these dissimilarities hc <- hclust(d.consensus, method=linkage) d.coph <- cophenetic(hc) # return correlation between the two distances res <- cor(d.consensus, d.coph, method='pearson') return(res) } ) #' Computes the cophenetic correlation coefficient on the consensus matrix #' of \code{object}. #' All arguments in \code{...} are passed to the method \code{cophcor,matrix}. setMethod('cophcor', signature(object='NMFfitX'), function(object, ...){ # compute the consensus matrix C <- consensus(object) return( cophcor(C, ...)) } ) # TODO: uncomment this and make it compute the mean or best rss #setMethod('rss', 'NMFfitXn', # function(object, target, ...){ # rss(fit(object, ...), target) # } #) NMF/R/registry.R0000644000176200001440000000753614333201273013077 0ustar liggesusers###% Define access/setup methods for NMF package registry. ###% ###% The registry is used to provide a common interface to NMF methods (algorithms, seeding methods, distance, ...). ###% It enables the user to add custom methods which will be accessible in the same way as the built-in ones. ###% ###% @author Renaud Gaujoux ###% @created 22 Jul 2009 ########################################################################### # COMMON REGISTRY ########################################################################### #' @import registry nmfRegistry <- function(...) packageRegistry(...) # Returns the names of all the packages that contibute to all or a given # package's primary registry registryContributors <- function(package, regname = NULL){ regs <- packageRegistries(regname = regname, package = package, primary = TRUE) if( length(regs) ) unique(names(unlist(lapply(paste0(package, '::', regs), packageRegistries)))) } ###% Return a method stored in the NMF registry. ###% ###% @param name the key (a character string) of the method to be retrieved ###% @param regname the name of the sub-registry where to look for the \code{key} ###% @param exact a boolean. When set to \code{TRUE} the key is searched exactly, otherwise (default) the key ###% is matched partially with the keys registered in the registry. ###% @param error a boolean. When set to \code{TRUE} (default) the function will raise an error if the key is not found. ###% Otherwise it will not raise any error and return \code{NULL}. ###% nmfGet <- function(regname, name=NULL, ...){ # retrieve from the given package's sub-registry pkgreg_fetch(regname, key=name, ...) } ###% Register a NMF method so that it is accessible via the common interface defined by the \code{nmf} function. ###% @param method an NMFStrategy object or a function that defines the method ###% @param key a non-empty character string that will be used as an identifier to access the method ###% @param overwrite a boolean that specify if an existing method (i.e. with exactly the same \code{key}) should be overwritten or not. ###% If \code{FALSE} and a method with the same key exists, an error will be thrown. ###% @param save [Not used] a boolean that if set to \code{TRUE} will save in database so that it is available in other R sessions. ###% @param ... [Not used] ###% ###% @return \code{TRUE} invisibly in case of success. ###% ###% @seealso nmf ###% setGeneric('nmfRegister', function(key, method, ...) standardGeneric('nmfRegister') ) setMethod('nmfRegister', signature(key='character'), function(key, method, regname, ...){ #TODO: add functionality to save the registered strategy into a file for use is other R sessions parent.method <- attr(method, 'parent') tmpl <- if( !is.null(parent.method) && parent.method != key ){ str_c(" based on template '", parent.method, "'") } setPackageRegistryEntry(regname, key, method, ..., where='NMF', msg=tmpl) } ) ####% Unregister a NMF method. ####% ####% @param name the key of the method to unregister [character string] ####% #nmfUnregister <- function(name, regname, quiet=FALSE){ # # return( pkgreg_remove(regname, key=name, quiet=quiet) ) # # add the strategy to the registry # obj <- nmfGet(name, exact=TRUE, error=FALSE, regname=regname) # regentry <- nmfRegistry(regname, entry=TRUE) # registry <- regentry$regobj # objtype <- regentry$entrydesc # # if( !is.null(obj) ){ # # get the method registry and the method's fullname # name <- attr(strategy, 'name') # # if( !quiet ){ # msg <- paste0("Removing ", objtype," '", name, "' from registry '", regname, "' [", class(obj), ']') # message(msg, ' ... ', appendLF=FALSE) # } # # delete from registry # registry$delete_entry(name) # if( !quiet ) message('OK') # TRUE # }else{ # if( !quiet ) # warning("Could not remove ", objtype, " '", name, "': no matching registry entry.", call.=FALSE) # FALSE # } #} NMF/demo/0000755000176200001440000000000014333156273011625 5ustar liggesusersNMF/demo/heatmaps.R0000644000176200001440000000170414333176413013552 0ustar liggesusers#' # random data with underlying NMF model v <- syntheticNMF(20, 3, 10) # estimate a model x <- nmf(v, 3) # highligh row only (using custom colors) basismap(x, tracks=':basis', annColor=list(basis=1:3)) ## character annotation vector: ok if it does not contain 'basis' # annotate first and second row + automatic special track basismap(x, annRow=c('alpha', 'beta')) # no special track here basismap(x, annRow=c('alpha', 'beta', ':basis'), tracks=NA) # with special track `basis` basismap(x, annRow=list(c('alpha', 'beta'), ':basis'), tracks=NA) # highligh columns only (using custom colors) basismap(x, tracks='basis:') # changing the name of the basis annotation track basismap(x, annRow=list(new_name=':basis')) # coefficient matrix coefmap(x, annCol=c('alpha', 'beta')) # annotate first and second sample coefmap(x, annCol=list('basis', Greek=c('alpha', 'beta'))) # annotate first and second sample + basis annotation coefmap(x, annCol=c(new_name='basis')) NMF/demo/00Index0000644000176200001440000000013714333176413012756 0ustar liggesusersnmf Using the main function nmf() heatmaps Heatmaps of NMF objects aheatmap Annotated heatmaps NMF/demo/nmf.R0000644000176200001440000001201614333176413012526 0ustar liggesusers# generate a synthetic dataset with known classes: 50 features, 23 samples (10+5+8) n <- 20; counts <- c(5, 3, 2); p <- sum(counts) x <- syntheticNMF(n, counts) dim(x) # build the true cluster membership groups <- unlist(mapply(rep, seq(counts), counts)) # run on a data.frame res <- nmf(data.frame(x), 3) # missing method: use algorithm suitable for seed res <- nmf(x, 2, seed=rnmf(2, x)) algorithm(res) res <- nmf(x, 2, seed=rnmf(2, x, model='NMFns')) algorithm(res) # compare some NMF algorithms (tracking the approximation error) res <- nmf(x, 2, list('brunet', 'lee', 'nsNMF'), .options='t') res summary(res, class=groups) # plot the track of the residual errors plot(res) # specify algorithm by its name res <- nmf(x, 3, 'nsNMF', seed=123) # nonsmooth NMF # names are partially matched so this also works identical(res, nmf(x, 3, 'ns', seed=123)) res <- nmf(x, 3, 'offset') # NMF with offset # run a custom algorithm defined as a standard function myfun <- function(x, start, alpha){ # update starting point # ... basis(start) <- 3 * basis(start) # return updated point start } res <- nmf(x, 2, myfun, alpha=3) algorithm(res) # error: alpha missing try( nmf(x, 2, myfun) ) # possibly the algorithm fits a non-standard NMF model, e.g. NMFns model res <- nmf(x, 2, myfun, alpha=3, model='NMFns') modelname(res) # assume a known NMF model compatible with the matrix `x` y <- rnmf(3, x) # fits an NMF model (with default method) on some data using y as a starting point res <- nmf(x, y) # the fit can be reproduced using the same starting point nmf.equal(nmf(x, y), res) # missing method: use default algorithm res <- nmf(x, 3) # Fit a 3-rank model providing an initial value for the basis matrix nmf(x, rmatrix(nrow(x), 3), 'snmf/r') # Fit a 3-rank model providing an initial value for the mixture coefficient matrix nmf(x, rmatrix(3, ncol(x)), 'snmf/l') # default fit res <- nmf(x, 2) summary(res, class=groups) # run default algorithm multiple times (only keep the best fit) res <- nmf(x, 3, nrun=10) res summary(res, class=groups) # run default algorithm multiple times keeping all the fits res <- nmf(x, 3, nrun=10, .options='k') res summary(res, class=groups) ## Note: one could have equivalently done # res <- nmf(V, 3, nrun=10, .options=list(keep.all=TRUE)) # use a method that fit different model res <- nmf(x, 2, 'nsNMF') fit(res) # pass parameter theta to the model via `...` res <- nmf(x, 2, 'nsNMF', theta=0.2) fit(res) ## handling arguments in `...` and model parameters myfun <- function(x, start, theta=100){ cat("theta in myfun=", theta, "\n\n"); start } # no conflict: default theta fit( nmf(x, 2, myfun) ) # no conlfict: theta is passed to the algorithm fit( nmf(x, 2, myfun, theta=1) ) # conflict: theta is used as model parameter fit( nmf(x, 2, myfun, model='NMFns', theta=0.1) ) # conflict solved: can pass different theta to model and algorithm fit( nmf(x, 2, myfun, model=list('NMFns', theta=0.1), theta=5) ) ## USING SEEDING METHODS # run default algorithm with the Non-negative Double SVD seeding method ('nndsvd') res <- nmf(x, 3, seed='nndsvd') ## Note: partial match also works identical(res, nmf(x, 3, seed='nn')) # run nsNMF algorithm, fixing the seed of the random number generator res <- nmf(x, 3, 'nsNMF', seed=123456) nmf.equal(nmf(x, 3, 'nsNMF', seed=123456), res) # run default algorithm specifying the starting point following the NMF standard model start.std <- nmfModel(W=matrix(0.5, n, 3), H=matrix(0.2, 3, p)) nmf(x, start.std) # to run nsNMF algorithm with an explicit starting point, this one # needs to follow the 'NMFns' model: start.ns <- nmfModel(model='NMFns', W=matrix(0.5, n, 3), H=matrix(0.2, 3, p)) nmf(x, start.ns) # Note: the method name does not need to be specified as it is infered from the # when there is only one algorithm defined for the model. # if the model is not appropriate (as defined by the algorihtm) an error is thrown # [cf. the standard model doesn't include a smoothing parameter used in nsNMF] try( nmf(x, start.std, method='nsNMF') ) ## Callback functions # Pass a callback function to only save summary measure of each run res <- nmf(x, 3, nrun=3, .callback=summary) # the callback results are simplified into a matrix res$.callback res <- nmf(x, 3, nrun=3, .callback=summary, .opt='-S') # the callback results are simplified into a matrix res$.callback # Pass a custom callback function cb <- function(obj, i){ if( i %% 2 ) sparseness(obj) >= 0.5 } res <- nmf(x, 3, nrun=3, .callback=cb) res$.callback # Passs a callback function which throws an error cb <- function(){ i<-0; function(object){ i <<- i+1; if( i == 1 ) stop('SOME BIG ERROR'); summary(object) }} res <- nmf(x, 3, nrun=3, .callback=cb()) ## PARALLEL COMPUTATIONS # try using 3 cores, but use sequential if not possible res <- nmf(x, 3, nrun=3, .options='p3') # force using 3 cores, error if not possible res <- nmf(x, 3, nrun=3, .options='P3') # use externally defined cluster library(parallel) cl <- makeCluster(6) res <- nmf(x, 3, nrun=3, .pbackend=cl) # use externally registered backend registerDoParallel(cl) res <- nmf(x, 3, nrun=3, .pbackend=NULL) NMF/demo/aheatmap.R0000644000176200001440000000365714333176413013541 0ustar liggesusers# Generate random data n <- 50; p <- 20 x <- abs(rmatrix(n, p, rnorm, mean=4, sd=1)) x[1:10, seq(1, 10, 2)] <- x[1:10, seq(1, 10, 2)] + 3 x[11:20, seq(2, 10, 2)] <- x[11:20, seq(2, 10, 2)] + 2 rownames(x) <- paste("ROW", 1:n) colnames(x) <- paste("COL", 1:p) ## Scaling aheatmap(x, scale = "row") aheatmap(x, scale = "col") # partially matched to 'column' aheatmap(x, scale = "r1") # each row sum up to 1 aheatmap(x, scale = "c1") # each colum sum up to 1 ## Heatmap colors aheatmap(x, color = colorRampPalette(c("navy", "white", "firebrick3"))(50)) # color specification as an integer: use R basic colors aheatmap(x, color = 1L) # color specification as a negative integer: use reverse basic palette aheatmap(x, color = -1L) # color specification as a numeric: use HCL color aheatmap(x, color = 1) # do not cluster the rows aheatmap(x, Rowv = NA) # no heatmap legend aheatmap(x, legend = FALSE) # cell and font size aheatmap(x, cellwidth = 10, cellheight = 5) # directly write into a file aheatmap(x, cellwidth = 15, cellheight = 12, fontsize = 8, filename = "aheatmap.pdf") unlink('aheatmap.pdf') # Generate column annotations annotation = data.frame(Var1 = factor(1:p %% 2 == 0, labels = c("Class1", "Class2")), Var2 = 1:10) aheatmap(x, annCol = annotation) aheatmap(x, annCol = annotation, annLegend = FALSE) # Specify colors Var1 = c("navy", "darkgreen") names(Var1) = c("Class1", "Class2") Var2 = c("lightgreen", "navy") ann_colors = list(Var1 = Var1, Var2 = Var2) aheatmap(x, annCol = annotation, annColors = ann_colors) # Specifying clustering from distance matrix drows = dist(x, method = "minkowski") dcols = dist(t(x), method = "minkowski") aheatmap(x, Rowv = drows, Colv = dcols) # Display text in each cells t <- outer(as.character(outer(letters, letters, paste0)), letters, paste0)[1:n, 1:p] aheatmap(x, txt = t) # NA values are shown as empty cells t.na <- t t.na[sample(length(t.na), 500)] <- NA # half of the cells aheatmap(x, txt = t.na) NMF/NEWS0000644000176200001440000006547014335415724011415 0ustar liggesusers************************************************************************* Changes in version 0.20.6 ************************************************************************* FIXES o fixed new NOTEs in R CMD check (about requireNamespace) o fixed error in heatmaps due to new version of stringr (>= 1.0.0) ************************************************************************* Changes in version 0.20 ************************************************************************* NEW FEATURES o aheatmap gains an argument txt that enables displaying text in each cell of the heatmap. FIXES o now all examples, vignettes and unit tests comply with CRAN policies on the maximum number of cores to be used when checking packages (2). ************************************************************************* Changes in version 0.18 ************************************************************************* NEW FEATURES o aheatmap gains distfun methods 'spearman', 'kendall', and, for completeness, 'pearson' (for which 'correlation' is now an alias), which specifies the correlation method to use when computing the distance matrix. CHANGES o In order to fully comply with CRAN policies, internals of the aheatmap function slightly changed. In particular, this brings an issue when directly plotting to PDF graphic devices, where a first blank page may appear. See the dedicated section in the man page ?aheatmap for a work around. ************************************************************************* Changes in version 0.17.3 ************************************************************************* NEW FEATURES o add silhouette computation for NMF results, which can be performed on samples, features or consensus matrix. The average silhouette width is also computed by the summary methods. (Thanks to Gordon Robertson for this suggestion) o New runtime option 'shared.memory' (or 'm') for toggling usage of shared memory (requires package synchronicity). CHANGES o some plots are -- finally -- generated using ggplot2 This adds an Imports dependency to ggplot2 and reshape2. BUG FIXES o fix a bug when running parallel NMF computation with algorithms defined in other packages (this most probably only affected my own packages, e.g., CellMix) ************************************************************************* Changes in version 0.17.1 ************************************************************************* CHANGES o Computations seeded with an NMF object now set slot @seed to 'NMF' o Added unit tests on seeding with an NMF object o Removed some obsolete comments BUG FIXES o an error was thrown when running multiple sequential NMF computations with nrun>=50: object '.MODE_SEQ' not found. (reported by Kenneth Lopiano) ************************************************************************* Changes in version 0.16.5 ************************************************************************* CHANGES o Now depends on pkgmaker 0.16 o Disabled shared memory on Mac machines by default, due to un-resolved bug that occurs with big-matrix descriptors. It can be restored using nmf.options(shared.memory=TRUE) o Package version is now shown on startup message o Re-enabled unit test checks on CRAN, using the new function pkgmaker::isCHECK, that definitely identifies if tests are run under R CMD check. ************************************************************************* * Changes in version 0.15.2 * ************************************************************************* NEW FEATURES o New function nmfObject() to update old versions of NMF objects, eg., saved on disk. o NMF strategies can now define default values for their parameters, eg., `seed` to associate them with a seeding method that is not the default method, `maxIter` to make default runs with more iterations (for algorithms defined as NMFStrategyIterative), or any other algorithm-specific parameter. o new general utility function hasArg2 that is identical to hasArg but takes the argument name as a character string, so that no check NOTE is thrown. CHANGES o All vignettes are now generated using knitr. o New dependency to pkgmaker which incorporated many of the general utility functions, initially defined for the NMF package. o example check is faster (as requested by CRAN) o the function selectMethodNMF was renamed into selectNMFMethod to be consistent with the other related *NMFMethod functions (get, set, etc..) FIXES o Fix computation of R-squared in profplot/corplot: now compute from a linear fit that includes an intercept. ************************************************************************* * Changes in version 0.8.6 * ************************************************************************* NEW FEATURES o Formula based NMF models that can incorporate fixed terms, which may be used to correct for covariates or define group specific offsets. CHANGES o Subsetting an NMF object with a single index now returns an NMF object, except if argument drop is not missing (i.e. either TRUE or FALSE). ************************************************************************* * Changes in version 0.6.03 * ************************************************************************* WARNING o Due to the major changes made in the internal structure of the standard NMF models, previous NMF fits are not compatible with this version. NEW FEATURES o The factory function nmfModel has been enhanced and provides new methods that makes more easier the creation of NMF objects. See ?nmfModel. o A new heatmap drawing function 'aheatmap' (for annotated heatmap) is now used to generate the different heatmaps (basismap, coefmap and consensusmap). It is a enhancement/fork of the function pheatmap from package pheatmap and draw -- I think -- very nice heatmaps, providing a convenient and flexible interface to add annotation tracks to both the columns and rows, with sensible automatic legends. CHANGES o Method nmfModel when called with no arguments does not return anymore the list of available NMF models, but an empty NMF model. To list the available models, directly call `nmfModels()`. o The function `rmatrix` is now a S4 generic function. It gains methods for generating random matrices based on a template matrix or an NMF model. See ?rmatrix. o The function `rnmf` gains a method to generate a random NMF model given numerical dimensions. o The function nmfEstimateRank now returns the fits for each value of the rank in element 'fit' of the result list. See ?nmfEstimateRank. ************************************************************************* * Changes in version 0.5.3 * ************************************************************************* NEW FEATURES o The state of the random number generator is systematically stored in the 'NMFfit' object returned by function 'nmf'. It is stored in a new slot 'rng.seed' and can be access via the new method 'rngSeed' of class 'NMFfit'. See ?rngSeed for more details. o The number of cores to use in multicore computations can now also be specified by the 'p - parallel' runtime option (e.g. 'p4' to use 4 cores). Note that the value specified in option 'p' takes precedence on the one passed via argument '.pbackend'. See section 'Runtime options' in ?nmf for more details. o Function 'nmfApply' now allows values 3 and 4 for argument 'MARGIN' to apply a given function to the basis vectors (i.e. columns of the basis matrix W) and basis profiles (i.e. rows of the mixture coefficients H) respectively. See ?nmfApply for more details. o New S4 generic 'basiscor' and 'profcor' to compute the correlation matrices of the basis vectors and basis profiles respectively from two NMF models or from an NMF model and a given compatible matrix. See ?basiscor or ?profcor for more details. o New S4 generic 'fitcmp' to compare the NMF models fitted by two different runs of function 'nmf' (i.e. two 'NMFfit' objects). See ?fitcmp for more details. o New S4 generic 'canFit' that tells if an NMF method is able to exactly or partly fit a given NMF model. See ?canFit for more details. o New function 'selectMethodNMF' that selects an appropriate NMF method to fit a given NMF model. See ?selectMethodNMF for more details. o The verbosity level can be controlled more finely by the 'v - verbose' runtime option (e.g. using .options='v1' or 'v2'). The greater is the level the more information is printed. The verbose outputs have been cleaned-up and should be more consistent across the run mode (sequential or multicore). See section 'Runtime options' in ?nmf for more details. CHANGES o The standard update equations have been optimised further, by making them modify the factor matrices in place. This speeds up the computation and greatly improves the algorithms' memory footprint. o The package NMF now depends on the package digest that is used to display the state of random number generator in a concise way. o The methods 'metaHeatmap' are split into 3 new S4 generic 'basismap' to plot a heatmap of the basis matrix [formerly plotted by the call : 'metaHeatmap(object.of.class.NMF, 'features', ...) ], 'coefmap' to plot a heatmap of the mixture coefficient matrix [formerly plotted by the call : 'metaHeatmap(object.of.class.NMF, 'samples', ...) ], and 'consensusmap' to plot a heatmap of the consensus matrix associated with multiple runs of NMF [formerly plotted by the call : 'metaHeatmap(object.of.class.NMFfitX, ...) ]. BUG FIX o In factory method 'nmfModel': the colnames (resp. rownames) of matrix W (resp. H) are now correctly set when the rownames of H (resp. the colnames of W) are not null. NEWLY DEPRECATED CLASSES, METHODS, FUNCTIONS, DATA SETS o Deprecated Generics/Methods 1) 'metaHeatmap,NMF' and 'metaHeatmap,NMFfitX' - S4 methods remain with .Deprecated message. They are replaced by the definition of 3 new S4 generic 'basismap', 'coefmap' and 'consensusmap'. See the related point in section CHANGES above. They will be completely removed from the package in the next version. ************************************************************************* * Changes in version 0.5.1 * ************************************************************************* BUG FIX o fix a small bug in method 'rss' to allow argument 'target' to be a 'data.frame'. This was generating errors when computing the summary measures and especially when the function 'nmfEstimateRank' was called on a 'data.frame'. Thanks to Pavel Goldstein for reporting this. ************************************************************************* * Changes in version 0.5 * ************************************************************************* NEW FEATURES o Method 'fcnnls' provides a user-friendly interface for the internal function '.fcnnls' to solve non-nengative linear least square problems, using the fast combinatorial approach from Benthem and Keenan (2004). See '?fcnnls' for more details. o New argument 'callback' in method 'nmf' allows to provide a callback function when running multiple runs in default mode, that only keeps the best result. The callback function is applied to the result of each run before it possibly gets discarding. The results are stored in the miscellaneous slot '.callback' accessible via the '$' operator (e.g. res$.callback). See '?nmf' for more details. o New method 'niter' to retrieve the number of iterations performed to fit a NMF model. It is defined on objects of class 'NMFfit'. o New function 'isNMFfit' to check if an object is a result from NMF fitting. o New function 'rmatrix' to easily generate random matrices, and allow to specify the distribution from which the entries are drawn. For example: * 'rmatrix(100, 10)' generates a 100x10 matrix whose entries are drawn from the uniform distribution * 'rmatrix(100, 10, rnorm)' generates a 100x10 matrix whose entries are drawn from the standard Normal distribution. o New methods 'basisnames' and 'basisnames<-' to retrieve and set the basis vector names. See '?basisnames'. CHANGES o Add a CITATION file that provides the bibtex entries for citing the BMC Bioinformatics paper for the package (https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-11-367), the vignette and manual. See 'citation('NMF')' for complete references. o New argument 'ncol' in method 'nmfModel' to specify the target dimensions more easily by calls like 'nmfModel(r, n, p)' to create a r-rank NMF model that fits a n x p target matrix. o The subset method '[]' of objects of class 'NMF' has been changed to be more convenient. See BUG FIX o Method 'dimnames' for objects of class 'NMF' now correctly sets the names of each dimension. REMOVED CLASSES, METHODS, FUNCTIONS, DATA SETS o Method 'extra' has completely been removed. ************************************************************************* * Changes in version 0.4.8 * ************************************************************************* BUG FIX o When computing NMF with the SNMF/R(L) algorithms, an error could occur if a restart (recomputation of the initial value) for the H matrix (resp. W matrix) occured at the first iteration. Thanks to Joe Maisog for reporting this. ************************************************************************* * Changes in version 0.4.7 * ************************************************************************* BUG FIX o When computing the cophenetic correlation coefficient of a diagonal matrix, the 'cophcor' method was returning 'NA' with a warning from the 'cor' function. It now correctly returns 1. Thanks to Joe Maisog for reporting this. ************************************************************************* * Changes in version 0.4.4 * ************************************************************************* CHANGES o The major change is the explicit addition of the synchronicity package into the suggested package dependencies. Since the publication of versions 4.x of the bigmemory package, it is used by the NMF package to provide the mutex functionality required by multicore computations. Note This is relevant only for Linux/Mac-like platforms as the multicore package is not yet supported on MS Windows. Users using a recent version of the bigmemory package (i.e. >=4.x) DO NEED to install the synchronicity package to be able to run multicore NMF computations. Versions of bigmemory prior to 4.x include the mutex functionality. o Minor enhancement in error messages o Method 'nmfModel' can now be called with arguments 'rank' and 'target' swapped. This is for convenience and ease of use. BUG FIX o Argument 'RowSideColors' of the 'metaHeatmap' function is now correctly subset according to the value of argument 'filter'. However the argument must be named with its complete name 'RowSideColors', not assuming partial match. See KNOWN ISSUES. KNOWN ISSUES o In the 'metaHeatmap' function, when argument 'filter' is not 'FALSE': arguments 'RowSideColors', 'labRow', 'Rowv' that are intended to the 'heatmap.plus'-like function (and are used to label the rows) should be named using their complete name (i.e. not assuming partial match), otherwise the filtering is not applied to these argument and an error is generated. This issue will be fixed in a future release. ************************************************************************* * Changes in version 0.4.3 * ************************************************************************* CHANGES o function 'nmfEstimateRank' has been enhanced: -run options can be passed to each internal call to the 'nmf' function. See ?nmfEstiamteRank and ?nmf for details on the supported options. - a new argument 'stop' allows to run the estimation with fault tolerance, skipping runs that throw an error. Summary measures for these runs are set to NAs and a warning is thrown with details about the errors. o in function 'plot.NMF.rank': a new argument 'na.rm' allows to remove from the plots the ranks for which the measures are NAs (due to errors during the estimation process with 'nmfEstimateRank'). BUG FIX o Method 'consensus' is now exported in the NAMESPACE file. Thanks to Gang Su for reporting this. o Warnings and messages about loading packages are now suppressed. This was particularly confusing for users that do not have the packages and/or platform required for parallel computation: warnings were printed whereas the computation was -- sequentially -- performed without problem. Thanks to Joe Maisog for reporting this. ************************************************************************* * Changes in version 0.4.1 * ************************************************************************* BUG FIX o The 'metaHeatmap' function was not correctly handling row labels when argument filter was not FALSE. All usual row formating in heatmaps (label and ordering) are now working as expected. Thanks to Andreas Schlicker, from The Netherlands Cancer Institute for reporting this. o An error was thrown on some environments/platforms (e.g. Solaris) where not all the packages required for parallel computation were not available -- even when using option 'p' ('p' in lower case), which should have switched the computation to sequential. This is solved and the error is only thrown when running NMF with option 'P' (capital 'P'). o Not all the options were passed (e.g. 't' for tracking) in sequential mode (option '-p'). o verbose/debug global nmf.options were not restored if a numerical random seed were used. CHANGES o The 'metaHeatmap' function nows support passing the name of a filtering method in argument 'filter', which is passed to method 'extractFeatures'. See ?metaHeatmap. o Verbose and debug messages are better handled. When running a parallel computation of multiple runs, verbose messages from each run are shown only in debug mode. ************************************************************************* * Changes in version 0.4 * ************************************************************************* NEW FEATURES o Part of the code has been optimised in C++ for speed and memory efficiency: - the multiplicative updates for reducing the KL divergence and the euclidean distance have been optimised in C++. This significantly reduces the computation time of the methods that make use of them: 'lee', 'brunet', 'offset', 'nsNMF' and 'lnmf'. Old R version of the algorithm are still accessible with the suffix '.R#'. - the computation of euclidean distance and KL divergence are implemented in C++, and do not require the duplication of the original matrices as done in R. o Generic 'dimnames' is now defined for objects of class 'NMF' and returns a list with 3 elements: the row names of the basis matrix, the column names of the mixture coefficient matrix , and the column names of the basis matrix. This implies that methods 'rownames' and 'columnames' are also available for 'NMF' objects. o A new class structure has been developed to handle the results of multiple NMF runs in a cleaner and more structured way: - Class 'NMFfitX' defines a common interface for multiple NMF runs of a single algorithm. - Class 'NMFfitX1' handles the sub-case where only the best fit is returned. In particular, this class allows to handle such results as if coming from a single run. - Class 'NMFfitXn' handles the sub-case where the list of all the fits is returned. - Class 'NMFList' handles the case of heterogeneous NMF runs (different algorithms, different factorization rank, different dimension, etc...) o The vignette contains more examples and details about the use of package. o The package is compatible with both versions 3.x and 4.x of the bigmemory package. This package is used when running multicore parallel computations. With version 4.x of bigmemory, the synchronicity package is also required as it provides the mutex functionality that used to be provided by bigmemory 3.x. BUG FIX o Running in multicore mode from the GUI on MacOS X is not allowed anymore as it is not safe and were throwing an error ['The process has forked and ...']. Thanks to Stephen Henderson from the UCL Cancer Institute (UK) for reporting this. o Function 'nmf' now restores the random seed to its original value as before its call with a numeric seed. This behaviour can be disabled with option 'restore.seed=FALSE' or '-r' NEWLY DEPRECATED CLASSES, METHODS, FUNCTIONS, DATA SETS o Deprecated Generics/Methods 1) 'errorPlot' - S4 generic/methods remains with .Deprecated message. It is replaced by a definition of the 'plot' method for signatures 'NMFfit,missing' and 'NMFList,missing' It will be completely removed from the package in the next version. o Deprecated Class 1) 'NMFSet' - S4 class remains for backward compatibility, but is not used anymore. It is replaced by the classes 'NMFfitX1', 'NMFfitXn', 'NMFList'. ************************************************************************* * Changes in version 0.3 * ************************************************************************* NEW FEATURES o Now requires R 2.10 o New list slot 'misc' in class 'NMF' to be able to define new NMF models, without having to extend the S4 class. Access is done by methods '$' and '$<-'. o More robust and convenient interface 'nmf' o New built-in algorithm : PE-NMF [Zhang (2008)] o The vignette and documentation have been enriched with more examples and details on the functionalities. o When possible the computation is run in parallel on all the available cores. See option 'p' or 'parallel=TRUE' in argument '.options' of function 'nmf'. o Algorithms have been optimized and run faster o Plot for rank estimation: quality measure curves can be plotted together with a set of reference measures. The reference measures could for example come from the rank estimation of randomized data, to investigate overfitting. o New methods '$' and '$<-' to access slot 'extra' in class 'NMFfit' These methods replace method 'extra' that is now defunct. o Function 'randomize' allows to randomise a target matrix or 'ExpressionSet' by permuting the entries within each columns using a different permutation for each column. It is useful when checking for over-fitting. CHANGES o The 'random' method of class 'NMF' is renamed 'rnmf', but is still accessible through name 'random' via the 'seed' argument in the interface method 'nmf'. NEWLY DEFUNCT CLASSES, METHODS, FUNCTIONS, DATA SETS o Defunct Generics/Methods 1) 'extra' - S4 generic/methods remains with .Defunct message. It will be completely removed from the package in the next version. ************************************************************************* * Changes in version 0.2.4 * ************************************************************************* CHANGES o Class 'NMFStrategy' has a new slot 'mixed', that specify if the algorithm can handle mixed signed input matrices. o Method 'nmf-matrix,numeric,function' accepts a new parameter 'mixed' to specify if the custom algorithm can handle mixed signed input matrices. ************************************************************************* * Changes in version 0.2.3 * ************************************************************************* NEW FEATURES o Package 'Biobase' is not required anymore, and only suggested. The definition and export of the NMF-BioConductor layer is done at loading. o 'nmfApply' S4 generic/method: a 'apply'-like method for objects of class 'NMF'. o 'predict' S4 method for objects of class 'NMF': the method replace the now deprecated 'clusters' method. o 'featureNames' and 'sampleNames' S4 method for objects of class 'NMFSet'. o sub-setting S4 method '[' for objects of class 'NMF': row subsets are applied to the rows of the basis matrix, column subsets are applied to the columns of the mixture coefficient matrix. CHANGES o method 'featureScore' has a new argument 'method' to allow choosing between different scoring schema. o method 'extractFeatures' has two new arguments: 'method' allows choosing between different scoring and selection methods; 'format' allows to specify the output format. NOTE: the default output format has changed. The default result is now a list whose elements are integer vectors (one per basis component) that contain the indices of the basis-specific features. It is in practice what one is usually interested in. BUG FIXES o Methods 'basis<-' and 'coef<-' were not exported by file NAMESPACE. o Method 'featureNames' was returning the column names of the mixture coefficient matrix, instead of the row names of the basis matrix. o 'metaHeatmap' with argument 'class' set would throw an error. NEWLY DEPRECATED CLASSES, METHODS, FUNCTIONS, DATA SETS o Deprecated Generics/Methods 1) clusters - S4 generic/methods remain with .Deprecated message NMF/vignettes/0000755000176200001440000000000014661566507012722 5ustar liggesusersNMF/vignettes/consensus.pdf0000644000176200001440000023327614333176413015437 0ustar liggesusers%PDF-1.4 %âãÏÓ\r 1 0 obj << /CreationDate (D:20111003210125) /ModDate (D:20111003210125) /Title (R Graphics Output) /Producer (R 2.13.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 9 0 R >> stream 1 J 1 j q Q q Q q Q q Q q 54.99 425.88 326.74 49.49 re W n /sRGB CS 0.000 0.000 0.000 SCN 0.75 w [] 0 d 1 J 1 j 10.00 M 132.36 475.37 m 67.85 475.37 l S 67.85 475.37 m 67.85 425.88 l S 67.85 425.88 m 59.29 425.88 l S 59.29 425.88 m 59.29 425.88 l S 67.85 425.88 m 76.42 425.88 l S 76.42 425.88 m 76.42 425.88 l S 76.42 425.88 m 67.88 425.88 l S 67.88 425.88 m 67.88 425.88 l S 76.42 425.88 m 84.95 425.88 l S 84.95 425.88 m 84.95 425.88 l S 84.95 425.88 m 76.48 425.88 l S 76.48 425.88 m 76.48 425.88 l S 84.95 425.88 m 93.41 425.88 l S 93.41 425.88 m 93.41 425.88 l S 93.41 425.88 m 85.08 425.88 l S 85.08 425.88 m 85.08 425.88 l S 93.41 425.88 m 101.74 425.88 l S 101.74 425.88 m 101.74 425.88 l S 101.74 425.88 m 93.68 425.88 l S 93.68 425.88 m 93.68 425.88 l S 101.74 425.88 m 109.80 425.88 l S 109.80 425.88 m 109.80 425.88 l S 109.80 425.88 m 102.28 425.88 l S 102.28 425.88 m 102.28 425.88 l S 109.80 425.88 m 117.33 425.88 l S 117.33 425.88 m 117.33 425.88 l S 117.33 425.88 m 110.88 425.88 l S 110.88 425.88 m 110.88 425.88 l S 117.33 425.88 m 123.77 425.88 l S 123.77 425.88 m 123.77 425.88 l S 123.77 425.88 m 119.48 425.88 l S 119.48 425.88 m 119.48 425.88 l S 123.77 425.88 m 128.07 425.88 l S 128.07 425.88 m 128.07 425.88 l S 132.36 475.37 m 196.86 475.37 l S 196.86 475.37 m 196.86 474.08 l S 196.86 474.08 m 145.27 474.08 l S 145.27 474.08 m 145.27 440.73 l S 145.27 440.73 m 136.67 440.73 l S 136.67 440.73 m 136.67 425.88 l S 145.27 440.73 m 153.86 440.73 l S 153.86 440.73 m 153.86 425.88 l S 153.86 425.88 m 145.27 425.88 l S 145.27 425.88 m 145.27 425.88 l S 153.86 425.88 m 162.45 425.88 l S 162.45 425.88 m 162.45 425.88 l S 162.45 425.88 m 153.87 425.88 l S 153.87 425.88 m 153.87 425.88 l S 162.45 425.88 m 171.03 425.88 l S 171.03 425.88 m 171.03 425.88 l S 171.03 425.88 m 162.47 425.88 l S 162.47 425.88 m 162.47 425.88 l S 171.03 425.88 m 179.60 425.88 l S 179.60 425.88 m 179.60 425.88 l S 179.60 425.88 m 171.07 425.88 l S 171.07 425.88 m 171.07 425.88 l S 179.60 425.88 m 188.13 425.88 l S 188.13 425.88 m 188.13 425.88 l S 188.13 425.88 m 179.66 425.88 l S 179.66 425.88 m 179.66 425.88 l S 188.13 425.88 m 196.59 425.88 l S 196.59 425.88 m 196.59 425.88 l S 196.59 425.88 m 188.26 425.88 l S 188.26 425.88 m 188.26 425.88 l S 196.59 425.88 m 204.92 425.88 l S 204.92 425.88 m 204.92 425.88 l S 204.92 425.88 m 196.86 425.88 l S 196.86 425.88 m 196.86 425.88 l S 204.92 425.88 m 212.98 425.88 l S 212.98 425.88 m 212.98 425.88 l S 212.98 425.88 m 205.46 425.88 l S 205.46 425.88 m 205.46 425.88 l S 212.98 425.88 m 220.51 425.88 l S 220.51 425.88 m 220.51 425.88 l S 220.51 425.88 m 214.06 425.88 l S 214.06 425.88 m 214.06 425.88 l S 220.51 425.88 m 226.96 425.88 l S 226.96 425.88 m 226.96 425.88 l S 226.96 425.88 m 222.66 425.88 l S 222.66 425.88 m 222.66 425.88 l S 226.96 425.88 m 231.26 425.88 l S 231.26 425.88 m 231.26 425.88 l S 196.86 474.08 m 248.45 474.08 l S 248.45 474.08 m 248.45 426.87 l S 248.45 426.87 m 239.85 426.87 l S 239.85 426.87 m 239.85 425.88 l S 248.45 426.87 m 257.05 426.87 l S 257.05 426.87 m 257.05 425.88 l S 257.05 425.88 m 248.45 425.88 l S 248.45 425.88 m 248.45 425.88 l S 257.05 425.88 m 265.65 425.88 l S 265.65 425.88 m 265.65 425.88 l S 265.65 425.88 m 257.05 425.88 l S 257.05 425.88 m 257.05 425.88 l S 265.65 425.88 m 274.25 425.88 l S 274.25 425.88 m 274.25 425.88 l S 274.25 425.88 m 265.65 425.88 l S 265.65 425.88 m 265.65 425.88 l S 274.25 425.88 m 282.84 425.88 l S 282.84 425.88 m 282.84 425.88 l S 282.84 425.88 m 274.25 425.88 l S 274.25 425.88 m 274.25 425.88 l S 282.84 425.88 m 291.44 425.88 l S 291.44 425.88 m 291.44 425.88 l S 291.44 425.88 m 282.85 425.88 l S 282.85 425.88 m 282.85 425.88 l S 291.44 425.88 m 300.04 425.88 l S 300.04 425.88 m 300.04 425.88 l S 300.04 425.88 m 291.45 425.88 l S 291.45 425.88 m 291.45 425.88 l S 300.04 425.88 m 308.63 425.88 l S 308.63 425.88 m 308.63 425.88 l S 308.63 425.88 m 300.04 425.88 l S 300.04 425.88 m 300.04 425.88 l S 308.63 425.88 m 317.21 425.88 l S 317.21 425.88 m 317.21 425.88 l S 317.21 425.88 m 308.64 425.88 l S 308.64 425.88 m 308.64 425.88 l S 317.21 425.88 m 325.77 425.88 l S 325.77 425.88 m 325.77 425.88 l S 325.77 425.88 m 317.24 425.88 l S 317.24 425.88 m 317.24 425.88 l S 325.77 425.88 m 334.30 425.88 l S 334.30 425.88 m 334.30 425.88 l S 334.30 425.88 m 325.84 425.88 l S 325.84 425.88 m 325.84 425.88 l S 334.30 425.88 m 342.77 425.88 l S 342.77 425.88 m 342.77 425.88 l S 342.77 425.88 m 334.44 425.88 l S 334.44 425.88 m 334.44 425.88 l S 342.77 425.88 m 351.10 425.88 l S 351.10 425.88 m 351.10 425.88 l S 351.10 425.88 m 343.04 425.88 l S 343.04 425.88 m 343.04 425.88 l S 351.10 425.88 m 359.16 425.88 l S 359.16 425.88 m 359.16 425.88 l S 359.16 425.88 m 351.63 425.88 l S 351.63 425.88 m 351.63 425.88 l S 359.16 425.88 m 366.68 425.88 l S 366.68 425.88 m 366.68 425.88 l S 366.68 425.88 m 360.23 425.88 l S 360.23 425.88 m 360.23 425.88 l S 366.68 425.88 m 373.13 425.88 l S 373.13 425.88 m 373.13 425.88 l S 373.13 425.88 m 368.83 425.88 l S 368.83 425.88 m 368.83 425.88 l S 373.13 425.88 m 377.43 425.88 l S 377.43 425.88 m 377.43 425.88 l S Q q Q q Q q Q q Q q 0.00 19.81 49.49 378.55 re W n /sRGB CS 0.000 0.000 0.000 SCN 0.75 w [] 0 d 1 J 1 j 10.00 M 0.00 308.72 m 0.00 233.99 l S 0.00 233.99 m 1.30 233.99 l S 1.30 233.99 m 1.30 174.22 l S 1.30 174.22 m 48.50 174.22 l S 48.50 174.22 m 48.50 164.26 l S 48.50 164.26 m 49.49 164.26 l S 49.49 164.26 m 49.49 154.29 l S 49.49 154.29 m 49.49 154.29 l S 49.49 154.29 m 49.49 144.33 l S 49.49 144.33 m 49.49 144.33 l S 49.49 144.33 m 49.49 134.37 l S 49.49 134.37 m 49.49 134.37 l S 49.49 134.37 m 49.49 124.41 l S 49.49 124.41 m 49.49 124.41 l S 49.49 124.41 m 49.49 114.46 l S 49.49 114.46 m 49.49 114.46 l S 49.49 114.46 m 49.49 104.50 l S 49.49 104.50 m 49.49 104.50 l S 49.49 104.50 m 49.49 94.56 l S 49.49 94.56 m 49.49 94.56 l S 49.49 94.56 m 49.49 84.64 l S 49.49 84.64 m 49.49 84.64 l S 49.49 84.64 m 49.49 74.75 l S 49.49 74.75 m 49.49 74.75 l S 49.49 74.75 m 49.49 64.95 l S 49.49 64.95 m 49.49 64.95 l S 49.49 64.95 m 49.49 55.30 l S 49.49 55.30 m 49.49 55.30 l S 49.49 55.30 m 49.49 45.96 l S 49.49 45.96 m 49.49 45.96 l S 49.49 45.96 m 49.49 37.24 l S 49.49 37.24 m 49.49 37.24 l S 49.49 37.24 m 49.49 29.77 l S 49.49 29.77 m 49.49 29.77 l S 49.49 29.77 m 49.49 24.79 l S 49.49 24.79 m 49.49 24.79 l S 49.49 29.77 m 49.49 34.75 l S 49.49 34.75 m 49.49 34.75 l S 49.49 37.24 m 49.49 44.71 l S 49.49 44.71 m 49.49 44.71 l S 49.49 45.96 m 49.49 54.67 l S 49.49 54.67 m 49.49 54.67 l S 49.49 55.30 m 49.49 64.64 l S 49.49 64.64 m 49.49 64.64 l S 49.49 64.95 m 49.49 74.60 l S 49.49 74.60 m 49.49 74.60 l S 49.49 74.75 m 49.49 84.56 l S 49.49 84.56 m 49.49 84.56 l S 49.49 84.64 m 49.49 94.52 l S 49.49 94.52 m 49.49 94.52 l S 49.49 94.56 m 49.49 104.48 l S 49.49 104.48 m 49.49 104.48 l S 49.49 104.50 m 49.49 114.45 l S 49.49 114.45 m 49.49 114.45 l S 49.49 114.46 m 49.49 124.41 l S 49.49 124.41 m 49.49 124.41 l S 49.49 124.41 m 49.49 134.37 l S 49.49 134.37 m 49.49 134.37 l S 49.49 134.37 m 49.49 144.33 l S 49.49 144.33 m 49.49 144.33 l S 49.49 144.33 m 49.49 154.29 l S 49.49 154.29 m 49.49 154.29 l S 49.49 154.29 m 49.49 164.26 l S 49.49 164.26 m 49.49 164.26 l S 49.49 164.26 m 49.49 174.22 l S 49.49 174.22 m 49.49 174.22 l S 48.50 174.22 m 48.50 184.18 l S 48.50 184.18 m 49.49 184.18 l S 1.30 233.99 m 1.30 293.77 l S 1.30 293.77 m 34.64 293.77 l S 34.64 293.77 m 34.64 283.81 l S 34.64 283.81 m 49.49 283.81 l S 49.49 283.81 m 49.49 273.86 l S 49.49 273.86 m 49.49 273.86 l S 49.49 273.86 m 49.49 263.91 l S 49.49 263.91 m 49.49 263.91 l S 49.49 263.91 m 49.49 253.99 l S 49.49 253.99 m 49.49 253.99 l S 49.49 253.99 m 49.49 244.11 l S 49.49 244.11 m 49.49 244.11 l S 49.49 244.11 m 49.49 234.30 l S 49.49 234.30 m 49.49 234.30 l S 49.49 234.30 m 49.49 224.65 l S 49.49 224.65 m 49.49 224.65 l S 49.49 224.65 m 49.49 215.31 l S 49.49 215.31 m 49.49 215.31 l S 49.49 215.31 m 49.49 206.59 l S 49.49 206.59 m 49.49 206.59 l S 49.49 206.59 m 49.49 199.12 l S 49.49 199.12 m 49.49 199.12 l S 49.49 199.12 m 49.49 194.14 l S 49.49 194.14 m 49.49 194.14 l S 49.49 199.12 m 49.49 204.10 l S 49.49 204.10 m 49.49 204.10 l S 49.49 206.59 m 49.49 214.07 l S 49.49 214.07 m 49.49 214.07 l S 49.49 215.31 m 49.49 224.03 l S 49.49 224.03 m 49.49 224.03 l S 49.49 224.65 m 49.49 233.99 l S 49.49 233.99 m 49.49 233.99 l S 49.49 234.30 m 49.49 243.95 l S 49.49 243.95 m 49.49 243.95 l S 49.49 244.11 m 49.49 253.91 l S 49.49 253.91 m 49.49 253.91 l S 49.49 253.99 m 49.49 263.88 l S 49.49 263.88 m 49.49 263.88 l S 49.49 263.91 m 49.49 273.84 l S 49.49 273.84 m 49.49 273.84 l S 49.49 273.86 m 49.49 283.80 l S 49.49 283.80 m 49.49 283.80 l S 49.49 283.81 m 49.49 293.76 l S 49.49 293.76 m 49.49 293.76 l S 34.64 293.77 m 34.64 303.72 l S 34.64 303.72 m 49.49 303.72 l S 0.00 308.72 m 0.00 383.46 l S 0.00 383.46 m 49.49 383.46 l S 49.49 383.46 m 49.49 373.53 l S 49.49 373.53 m 49.49 373.53 l S 49.49 373.53 m 49.49 363.65 l S 49.49 363.65 m 49.49 363.65 l S 49.49 363.65 m 49.49 353.84 l S 49.49 353.84 m 49.49 353.84 l S 49.49 353.84 m 49.49 344.19 l S 49.49 344.19 m 49.49 344.19 l S 49.49 344.19 m 49.49 334.85 l S 49.49 334.85 m 49.49 334.85 l S 49.49 334.85 m 49.49 326.14 l S 49.49 326.14 m 49.49 326.14 l S 49.49 326.14 m 49.49 318.67 l S 49.49 318.67 m 49.49 318.67 l S 49.49 318.67 m 49.49 313.68 l S 49.49 313.68 m 49.49 313.68 l S 49.49 318.67 m 49.49 323.65 l S 49.49 323.65 m 49.49 323.65 l S 49.49 326.14 m 49.49 333.61 l S 49.49 333.61 m 49.49 333.61 l S 49.49 334.85 m 49.49 343.57 l S 49.49 343.57 m 49.49 343.57 l S 49.49 344.19 m 49.49 353.53 l S 49.49 353.53 m 49.49 353.53 l S 49.49 353.84 m 49.49 363.49 l S 49.49 363.49 m 49.49 363.49 l S 49.49 363.65 m 49.49 373.46 l S 49.49 373.46 m 49.49 373.46 l S 49.49 373.53 m 49.49 383.42 l S 49.49 383.42 m 49.49 383.42 l S 49.49 383.46 m 49.49 393.38 l S 49.49 393.38 m 49.49 393.38 l S Q q Q q Q q /sRGB cs 0.192 0.212 0.584 scn 55.00 19.79 8.60 9.96 re f 55.00 29.75 8.60 9.96 re f 55.00 39.71 8.60 9.96 re f 55.00 49.67 8.60 9.96 re f 55.00 59.64 8.60 9.96 re f 55.00 69.60 8.60 9.96 re f 55.00 79.56 8.60 9.96 re f 55.00 89.53 8.60 9.96 re f 55.00 99.49 8.60 9.96 re f 55.00 109.45 8.60 9.96 re f 55.00 119.42 8.60 9.96 re f 55.00 129.38 8.60 9.96 re f 55.00 139.34 8.60 9.96 re f 55.00 149.31 8.60 9.96 re f 55.00 159.27 8.60 9.96 re f 55.00 169.23 8.60 9.96 re f 55.00 179.20 8.60 9.96 re f 55.00 189.16 8.60 9.96 re f 55.00 199.12 8.60 9.96 re f 55.00 209.08 8.60 9.96 re f 55.00 219.05 8.60 9.96 re f 55.00 229.01 8.60 9.96 re f 55.00 238.97 8.60 9.96 re f 55.00 248.94 8.60 9.96 re f 55.00 258.90 8.60 9.96 re f 55.00 268.86 8.60 9.96 re f 55.00 278.83 8.60 9.96 re f 55.00 288.79 8.60 9.96 re f 55.00 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 55.00 308.72 8.60 9.96 re f 55.00 318.68 8.60 9.96 re f 55.00 328.64 8.60 9.96 re f 55.00 338.61 8.60 9.96 re f 55.00 348.57 8.60 9.96 re f 55.00 358.53 8.60 9.96 re f 55.00 368.49 8.60 9.96 re f 55.00 378.46 8.60 9.96 re f 55.00 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 63.60 19.79 8.60 9.96 re f 63.60 29.75 8.60 9.96 re f 63.60 39.71 8.60 9.96 re f 63.60 49.67 8.60 9.96 re f 63.60 59.64 8.60 9.96 re f 63.60 69.60 8.60 9.96 re f 63.60 79.56 8.60 9.96 re f 63.60 89.53 8.60 9.96 re f 63.60 99.49 8.60 9.96 re f 63.60 109.45 8.60 9.96 re f 63.60 119.42 8.60 9.96 re f 63.60 129.38 8.60 9.96 re f 63.60 139.34 8.60 9.96 re f 63.60 149.31 8.60 9.96 re f 63.60 159.27 8.60 9.96 re f 63.60 169.23 8.60 9.96 re f 63.60 179.20 8.60 9.96 re f 63.60 189.16 8.60 9.96 re f 63.60 199.12 8.60 9.96 re f 63.60 209.08 8.60 9.96 re f 63.60 219.05 8.60 9.96 re f 63.60 229.01 8.60 9.96 re f 63.60 238.97 8.60 9.96 re f 63.60 248.94 8.60 9.96 re f 63.60 258.90 8.60 9.96 re f 63.60 268.86 8.60 9.96 re f 63.60 278.83 8.60 9.96 re f 63.60 288.79 8.60 9.96 re f 63.60 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 63.60 308.72 8.60 9.96 re f 63.60 318.68 8.60 9.96 re f 63.60 328.64 8.60 9.96 re f 63.60 338.61 8.60 9.96 re f 63.60 348.57 8.60 9.96 re f 63.60 358.53 8.60 9.96 re f 63.60 368.49 8.60 9.96 re f 63.60 378.46 8.60 9.96 re f 63.60 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 72.20 19.79 8.60 9.96 re f 72.20 29.75 8.60 9.96 re f 72.20 39.71 8.60 9.96 re f 72.20 49.67 8.60 9.96 re f 72.20 59.64 8.60 9.96 re f 72.20 69.60 8.60 9.96 re f 72.20 79.56 8.60 9.96 re f 72.20 89.53 8.60 9.96 re f 72.20 99.49 8.60 9.96 re f 72.20 109.45 8.60 9.96 re f 72.20 119.42 8.60 9.96 re f 72.20 129.38 8.60 9.96 re f 72.20 139.34 8.60 9.96 re f 72.20 149.31 8.60 9.96 re f 72.20 159.27 8.60 9.96 re f 72.20 169.23 8.60 9.96 re f 72.20 179.20 8.60 9.96 re f 72.20 189.16 8.60 9.96 re f 72.20 199.12 8.60 9.96 re f 72.20 209.08 8.60 9.96 re f 72.20 219.05 8.60 9.96 re f 72.20 229.01 8.60 9.96 re f 72.20 238.97 8.60 9.96 re f 72.20 248.94 8.60 9.96 re f 72.20 258.90 8.60 9.96 re f 72.20 268.86 8.60 9.96 re f 72.20 278.83 8.60 9.96 re f 72.20 288.79 8.60 9.96 re f 72.20 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 72.20 308.72 8.60 9.96 re f 72.20 318.68 8.60 9.96 re f 72.20 328.64 8.60 9.96 re f 72.20 338.61 8.60 9.96 re f 72.20 348.57 8.60 9.96 re f 72.20 358.53 8.60 9.96 re f 72.20 368.49 8.60 9.96 re f 72.20 378.46 8.60 9.96 re f 72.20 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 80.79 19.79 8.60 9.96 re f 80.79 29.75 8.60 9.96 re f 80.79 39.71 8.60 9.96 re f 80.79 49.67 8.60 9.96 re f 80.79 59.64 8.60 9.96 re f 80.79 69.60 8.60 9.96 re f 80.79 79.56 8.60 9.96 re f 80.79 89.53 8.60 9.96 re f 80.79 99.49 8.60 9.96 re f 80.79 109.45 8.60 9.96 re f 80.79 119.42 8.60 9.96 re f 80.79 129.38 8.60 9.96 re f 80.79 139.34 8.60 9.96 re f 80.79 149.31 8.60 9.96 re f 80.79 159.27 8.60 9.96 re f 80.79 169.23 8.60 9.96 re f 80.79 179.20 8.60 9.96 re f 80.79 189.16 8.60 9.96 re f 80.79 199.12 8.60 9.96 re f 80.79 209.08 8.60 9.96 re f 80.79 219.05 8.60 9.96 re f 80.79 229.01 8.60 9.96 re f 80.79 238.97 8.60 9.96 re f 80.79 248.94 8.60 9.96 re f 80.79 258.90 8.60 9.96 re f 80.79 268.86 8.60 9.96 re f 80.79 278.83 8.60 9.96 re f 80.79 288.79 8.60 9.96 re f 80.79 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 80.79 308.72 8.60 9.96 re f 80.79 318.68 8.60 9.96 re f 80.79 328.64 8.60 9.96 re f 80.79 338.61 8.60 9.96 re f 80.79 348.57 8.60 9.96 re f 80.79 358.53 8.60 9.96 re f 80.79 368.49 8.60 9.96 re f 80.79 378.46 8.60 9.96 re f 80.79 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 89.39 19.79 8.60 9.96 re f 89.39 29.75 8.60 9.96 re f 89.39 39.71 8.60 9.96 re f 89.39 49.67 8.60 9.96 re f 89.39 59.64 8.60 9.96 re f 89.39 69.60 8.60 9.96 re f 89.39 79.56 8.60 9.96 re f 89.39 89.53 8.60 9.96 re f 89.39 99.49 8.60 9.96 re f 89.39 109.45 8.60 9.96 re f 89.39 119.42 8.60 9.96 re f 89.39 129.38 8.60 9.96 re f 89.39 139.34 8.60 9.96 re f 89.39 149.31 8.60 9.96 re f 89.39 159.27 8.60 9.96 re f 89.39 169.23 8.60 9.96 re f 89.39 179.20 8.60 9.96 re f 89.39 189.16 8.60 9.96 re f 89.39 199.12 8.60 9.96 re f 89.39 209.08 8.60 9.96 re f 89.39 219.05 8.60 9.96 re f 89.39 229.01 8.60 9.96 re f 89.39 238.97 8.60 9.96 re f 89.39 248.94 8.60 9.96 re f 89.39 258.90 8.60 9.96 re f 89.39 268.86 8.60 9.96 re f 89.39 278.83 8.60 9.96 re f 89.39 288.79 8.60 9.96 re f 89.39 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 89.39 308.72 8.60 9.96 re f 89.39 318.68 8.60 9.96 re f 89.39 328.64 8.60 9.96 re f 89.39 338.61 8.60 9.96 re f 89.39 348.57 8.60 9.96 re f 89.39 358.53 8.60 9.96 re f 89.39 368.49 8.60 9.96 re f 89.39 378.46 8.60 9.96 re f 89.39 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 97.99 19.79 8.60 9.96 re f 97.99 29.75 8.60 9.96 re f 97.99 39.71 8.60 9.96 re f 97.99 49.67 8.60 9.96 re f 97.99 59.64 8.60 9.96 re f 97.99 69.60 8.60 9.96 re f 97.99 79.56 8.60 9.96 re f 97.99 89.53 8.60 9.96 re f 97.99 99.49 8.60 9.96 re f 97.99 109.45 8.60 9.96 re f 97.99 119.42 8.60 9.96 re f 97.99 129.38 8.60 9.96 re f 97.99 139.34 8.60 9.96 re f 97.99 149.31 8.60 9.96 re f 97.99 159.27 8.60 9.96 re f 97.99 169.23 8.60 9.96 re f 97.99 179.20 8.60 9.96 re f 97.99 189.16 8.60 9.96 re f 97.99 199.12 8.60 9.96 re f 97.99 209.08 8.60 9.96 re f 97.99 219.05 8.60 9.96 re f 97.99 229.01 8.60 9.96 re f 97.99 238.97 8.60 9.96 re f 97.99 248.94 8.60 9.96 re f 97.99 258.90 8.60 9.96 re f 97.99 268.86 8.60 9.96 re f 97.99 278.83 8.60 9.96 re f 97.99 288.79 8.60 9.96 re f 97.99 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 97.99 308.72 8.60 9.96 re f 97.99 318.68 8.60 9.96 re f 97.99 328.64 8.60 9.96 re f 97.99 338.61 8.60 9.96 re f 97.99 348.57 8.60 9.96 re f 97.99 358.53 8.60 9.96 re f 97.99 368.49 8.60 9.96 re f 97.99 378.46 8.60 9.96 re f 97.99 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 106.59 19.79 8.60 9.96 re f 106.59 29.75 8.60 9.96 re f 106.59 39.71 8.60 9.96 re f 106.59 49.67 8.60 9.96 re f 106.59 59.64 8.60 9.96 re f 106.59 69.60 8.60 9.96 re f 106.59 79.56 8.60 9.96 re f 106.59 89.53 8.60 9.96 re f 106.59 99.49 8.60 9.96 re f 106.59 109.45 8.60 9.96 re f 106.59 119.42 8.60 9.96 re f 106.59 129.38 8.60 9.96 re f 106.59 139.34 8.60 9.96 re f 106.59 149.31 8.60 9.96 re f 106.59 159.27 8.60 9.96 re f 106.59 169.23 8.60 9.96 re f 106.59 179.20 8.60 9.96 re f 106.59 189.16 8.60 9.96 re f 106.59 199.12 8.60 9.96 re f 106.59 209.08 8.60 9.96 re f 106.59 219.05 8.60 9.96 re f 106.59 229.01 8.60 9.96 re f 106.59 238.97 8.60 9.96 re f 106.59 248.94 8.60 9.96 re f 106.59 258.90 8.60 9.96 re f 106.59 268.86 8.60 9.96 re f 106.59 278.83 8.60 9.96 re f 106.59 288.79 8.60 9.96 re f 106.59 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 106.59 308.72 8.60 9.96 re f 106.59 318.68 8.60 9.96 re f 106.59 328.64 8.60 9.96 re f 106.59 338.61 8.60 9.96 re f 106.59 348.57 8.60 9.96 re f 106.59 358.53 8.60 9.96 re f 106.59 368.49 8.60 9.96 re f 106.59 378.46 8.60 9.96 re f 106.59 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 115.18 19.79 8.60 9.96 re f 115.18 29.75 8.60 9.96 re f 115.18 39.71 8.60 9.96 re f 115.18 49.67 8.60 9.96 re f 115.18 59.64 8.60 9.96 re f 115.18 69.60 8.60 9.96 re f 115.18 79.56 8.60 9.96 re f 115.18 89.53 8.60 9.96 re f 115.18 99.49 8.60 9.96 re f 115.18 109.45 8.60 9.96 re f 115.18 119.42 8.60 9.96 re f 115.18 129.38 8.60 9.96 re f 115.18 139.34 8.60 9.96 re f 115.18 149.31 8.60 9.96 re f 115.18 159.27 8.60 9.96 re f 115.18 169.23 8.60 9.96 re f 115.18 179.20 8.60 9.96 re f 115.18 189.16 8.60 9.96 re f 115.18 199.12 8.60 9.96 re f 115.18 209.08 8.60 9.96 re f 115.18 219.05 8.60 9.96 re f 115.18 229.01 8.60 9.96 re f 115.18 238.97 8.60 9.96 re f 115.18 248.94 8.60 9.96 re f 115.18 258.90 8.60 9.96 re f 115.18 268.86 8.60 9.96 re f 115.18 278.83 8.60 9.96 re f 115.18 288.79 8.60 9.96 re f 115.18 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 115.18 308.72 8.60 9.96 re f 115.18 318.68 8.60 9.96 re f 115.18 328.64 8.60 9.96 re f 115.18 338.61 8.60 9.96 re f 115.18 348.57 8.60 9.96 re f 115.18 358.53 8.60 9.96 re f 115.18 368.49 8.60 9.96 re f 115.18 378.46 8.60 9.96 re f 115.18 388.42 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 123.78 19.79 8.60 9.96 re f 123.78 29.75 8.60 9.96 re f 123.78 39.71 8.60 9.96 re f 123.78 49.67 8.60 9.96 re f 123.78 59.64 8.60 9.96 re f 123.78 69.60 8.60 9.96 re f 123.78 79.56 8.60 9.96 re f 123.78 89.53 8.60 9.96 re f 123.78 99.49 8.60 9.96 re f 123.78 109.45 8.60 9.96 re f 123.78 119.42 8.60 9.96 re f 123.78 129.38 8.60 9.96 re f 123.78 139.34 8.60 9.96 re f 123.78 149.31 8.60 9.96 re f 123.78 159.27 8.60 9.96 re f 123.78 169.23 8.60 9.96 re f 123.78 179.20 8.60 9.96 re f 123.78 189.16 8.60 9.96 re f 123.78 199.12 8.60 9.96 re f 123.78 209.08 8.60 9.96 re f 123.78 219.05 8.60 9.96 re f 123.78 229.01 8.60 9.96 re f 123.78 238.97 8.60 9.96 re f 123.78 248.94 8.60 9.96 re f 123.78 258.90 8.60 9.96 re f 123.78 268.86 8.60 9.96 re f 123.78 278.83 8.60 9.96 re f 123.78 288.79 8.60 9.96 re f 123.78 298.75 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 123.78 308.72 8.60 9.96 re f 123.78 318.68 8.60 9.96 re f 123.78 328.64 8.60 9.96 re f 123.78 338.61 8.60 9.96 re f 123.78 348.57 8.60 9.96 re f 123.78 358.53 8.60 9.96 re f 123.78 368.49 8.60 9.96 re f 123.78 378.46 8.60 9.96 re f 123.78 388.42 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 132.38 19.79 8.60 9.96 re f 132.38 29.75 8.60 9.96 re f 132.38 39.71 8.60 9.96 re f 132.38 49.67 8.60 9.96 re f 132.38 59.64 8.60 9.96 re f 132.38 69.60 8.60 9.96 re f 132.38 79.56 8.60 9.96 re f 132.38 89.53 8.60 9.96 re f 132.38 99.49 8.60 9.96 re f 132.38 109.45 8.60 9.96 re f 132.38 119.42 8.60 9.96 re f 132.38 129.38 8.60 9.96 re f 132.38 139.34 8.60 9.96 re f 132.38 149.31 8.60 9.96 re f 132.38 159.27 8.60 9.96 re f 132.38 169.23 8.60 9.96 re f /sRGB cs 0.710 0.871 0.922 scn 132.38 179.20 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 132.38 189.16 8.60 9.96 re f 132.38 199.12 8.60 9.96 re f 132.38 209.08 8.60 9.96 re f 132.38 219.05 8.60 9.96 re f 132.38 229.01 8.60 9.96 re f 132.38 238.97 8.60 9.96 re f 132.38 248.94 8.60 9.96 re f 132.38 258.90 8.60 9.96 re f 132.38 268.86 8.60 9.96 re f 132.38 278.83 8.60 9.96 re f 132.38 288.79 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 132.38 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 132.38 308.72 8.60 9.96 re f 132.38 318.68 8.60 9.96 re f 132.38 328.64 8.60 9.96 re f 132.38 338.61 8.60 9.96 re f 132.38 348.57 8.60 9.96 re f 132.38 358.53 8.60 9.96 re f 132.38 368.49 8.60 9.96 re f 132.38 378.46 8.60 9.96 re f 132.38 388.42 8.60 9.96 re f 140.98 19.79 8.60 9.96 re f 140.98 29.75 8.60 9.96 re f 140.98 39.71 8.60 9.96 re f 140.98 49.67 8.60 9.96 re f 140.98 59.64 8.60 9.96 re f 140.98 69.60 8.60 9.96 re f 140.98 79.56 8.60 9.96 re f 140.98 89.53 8.60 9.96 re f 140.98 99.49 8.60 9.96 re f 140.98 109.45 8.60 9.96 re f 140.98 119.42 8.60 9.96 re f 140.98 129.38 8.60 9.96 re f 140.98 139.34 8.60 9.96 re f 140.98 149.31 8.60 9.96 re f 140.98 159.27 8.60 9.96 re f 140.98 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 140.98 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 140.98 189.16 8.60 9.96 re f 140.98 199.12 8.60 9.96 re f 140.98 209.08 8.60 9.96 re f 140.98 219.05 8.60 9.96 re f 140.98 229.01 8.60 9.96 re f 140.98 238.97 8.60 9.96 re f 140.98 248.94 8.60 9.96 re f 140.98 258.90 8.60 9.96 re f 140.98 268.86 8.60 9.96 re f 140.98 278.83 8.60 9.96 re f 140.98 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 140.98 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 140.98 308.72 8.60 9.96 re f 140.98 318.68 8.60 9.96 re f 140.98 328.64 8.60 9.96 re f 140.98 338.61 8.60 9.96 re f 140.98 348.57 8.60 9.96 re f 140.98 358.53 8.60 9.96 re f 140.98 368.49 8.60 9.96 re f 140.98 378.46 8.60 9.96 re f 140.98 388.42 8.60 9.96 re f 149.57 19.79 8.60 9.96 re f 149.57 29.75 8.60 9.96 re f 149.57 39.71 8.60 9.96 re f 149.57 49.67 8.60 9.96 re f 149.57 59.64 8.60 9.96 re f 149.57 69.60 8.60 9.96 re f 149.57 79.56 8.60 9.96 re f 149.57 89.53 8.60 9.96 re f 149.57 99.49 8.60 9.96 re f 149.57 109.45 8.60 9.96 re f 149.57 119.42 8.60 9.96 re f 149.57 129.38 8.60 9.96 re f 149.57 139.34 8.60 9.96 re f 149.57 149.31 8.60 9.96 re f 149.57 159.27 8.60 9.96 re f 149.57 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 149.57 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 149.57 189.16 8.60 9.96 re f 149.57 199.12 8.60 9.96 re f 149.57 209.08 8.60 9.96 re f 149.57 219.05 8.60 9.96 re f 149.57 229.01 8.60 9.96 re f 149.57 238.97 8.60 9.96 re f 149.57 248.94 8.60 9.96 re f 149.57 258.90 8.60 9.96 re f 149.57 268.86 8.60 9.96 re f 149.57 278.83 8.60 9.96 re f 149.57 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 149.57 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 149.57 308.72 8.60 9.96 re f 149.57 318.68 8.60 9.96 re f 149.57 328.64 8.60 9.96 re f 149.57 338.61 8.60 9.96 re f 149.57 348.57 8.60 9.96 re f 149.57 358.53 8.60 9.96 re f 149.57 368.49 8.60 9.96 re f 149.57 378.46 8.60 9.96 re f 149.57 388.42 8.60 9.96 re f 158.17 19.79 8.60 9.96 re f 158.17 29.75 8.60 9.96 re f 158.17 39.71 8.60 9.96 re f 158.17 49.67 8.60 9.96 re f 158.17 59.64 8.60 9.96 re f 158.17 69.60 8.60 9.96 re f 158.17 79.56 8.60 9.96 re f 158.17 89.53 8.60 9.96 re f 158.17 99.49 8.60 9.96 re f 158.17 109.45 8.60 9.96 re f 158.17 119.42 8.60 9.96 re f 158.17 129.38 8.60 9.96 re f 158.17 139.34 8.60 9.96 re f 158.17 149.31 8.60 9.96 re f 158.17 159.27 8.60 9.96 re f 158.17 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 158.17 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 158.17 189.16 8.60 9.96 re f 158.17 199.12 8.60 9.96 re f 158.17 209.08 8.60 9.96 re f 158.17 219.05 8.60 9.96 re f 158.17 229.01 8.60 9.96 re f 158.17 238.97 8.60 9.96 re f 158.17 248.94 8.60 9.96 re f 158.17 258.90 8.60 9.96 re f 158.17 268.86 8.60 9.96 re f 158.17 278.83 8.60 9.96 re f 158.17 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 158.17 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 158.17 308.72 8.60 9.96 re f 158.17 318.68 8.60 9.96 re f 158.17 328.64 8.60 9.96 re f 158.17 338.61 8.60 9.96 re f 158.17 348.57 8.60 9.96 re f 158.17 358.53 8.60 9.96 re f 158.17 368.49 8.60 9.96 re f 158.17 378.46 8.60 9.96 re f 158.17 388.42 8.60 9.96 re f 166.77 19.79 8.60 9.96 re f 166.77 29.75 8.60 9.96 re f 166.77 39.71 8.60 9.96 re f 166.77 49.67 8.60 9.96 re f 166.77 59.64 8.60 9.96 re f 166.77 69.60 8.60 9.96 re f 166.77 79.56 8.60 9.96 re f 166.77 89.53 8.60 9.96 re f 166.77 99.49 8.60 9.96 re f 166.77 109.45 8.60 9.96 re f 166.77 119.42 8.60 9.96 re f 166.77 129.38 8.60 9.96 re f 166.77 139.34 8.60 9.96 re f 166.77 149.31 8.60 9.96 re f 166.77 159.27 8.60 9.96 re f 166.77 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 166.77 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 166.77 189.16 8.60 9.96 re f 166.77 199.12 8.60 9.96 re f 166.77 209.08 8.60 9.96 re f 166.77 219.05 8.60 9.96 re f 166.77 229.01 8.60 9.96 re f 166.77 238.97 8.60 9.96 re f 166.77 248.94 8.60 9.96 re f 166.77 258.90 8.60 9.96 re f 166.77 268.86 8.60 9.96 re f 166.77 278.83 8.60 9.96 re f 166.77 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 166.77 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 166.77 308.72 8.60 9.96 re f 166.77 318.68 8.60 9.96 re f 166.77 328.64 8.60 9.96 re f 166.77 338.61 8.60 9.96 re f 166.77 348.57 8.60 9.96 re f 166.77 358.53 8.60 9.96 re f 166.77 368.49 8.60 9.96 re f 166.77 378.46 8.60 9.96 re f 166.77 388.42 8.60 9.96 re f 175.37 19.79 8.60 9.96 re f 175.37 29.75 8.60 9.96 re f 175.37 39.71 8.60 9.96 re f 175.37 49.67 8.60 9.96 re f 175.37 59.64 8.60 9.96 re f 175.37 69.60 8.60 9.96 re f 175.37 79.56 8.60 9.96 re f 175.37 89.53 8.60 9.96 re f 175.37 99.49 8.60 9.96 re f 175.37 109.45 8.60 9.96 re f 175.37 119.42 8.60 9.96 re f 175.37 129.38 8.60 9.96 re f 175.37 139.34 8.60 9.96 re f 175.37 149.31 8.60 9.96 re f 175.37 159.27 8.60 9.96 re f 175.37 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 175.37 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 175.37 189.16 8.60 9.96 re f 175.37 199.12 8.60 9.96 re f 175.37 209.08 8.60 9.96 re f 175.37 219.05 8.60 9.96 re f 175.37 229.01 8.60 9.96 re f 175.37 238.97 8.60 9.96 re f 175.37 248.94 8.60 9.96 re f 175.37 258.90 8.60 9.96 re f 175.37 268.86 8.60 9.96 re f 175.37 278.83 8.60 9.96 re f 175.37 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 175.37 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 175.37 308.72 8.60 9.96 re f 175.37 318.68 8.60 9.96 re f 175.37 328.64 8.60 9.96 re f 175.37 338.61 8.60 9.96 re f 175.37 348.57 8.60 9.96 re f 175.37 358.53 8.60 9.96 re f 175.37 368.49 8.60 9.96 re f 175.37 378.46 8.60 9.96 re f 175.37 388.42 8.60 9.96 re f 183.96 19.79 8.60 9.96 re f 183.96 29.75 8.60 9.96 re f 183.96 39.71 8.60 9.96 re f 183.96 49.67 8.60 9.96 re f 183.96 59.64 8.60 9.96 re f 183.96 69.60 8.60 9.96 re f 183.96 79.56 8.60 9.96 re f 183.96 89.53 8.60 9.96 re f 183.96 99.49 8.60 9.96 re f 183.96 109.45 8.60 9.96 re f 183.96 119.42 8.60 9.96 re f 183.96 129.38 8.60 9.96 re f 183.96 139.34 8.60 9.96 re f 183.96 149.31 8.60 9.96 re f 183.96 159.27 8.60 9.96 re f 183.96 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 183.96 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 183.96 189.16 8.60 9.96 re f 183.96 199.12 8.60 9.96 re f 183.96 209.08 8.60 9.96 re f 183.96 219.05 8.60 9.96 re f 183.96 229.01 8.60 9.96 re f 183.96 238.97 8.60 9.96 re f 183.96 248.94 8.60 9.96 re f 183.96 258.90 8.60 9.96 re f 183.96 268.86 8.60 9.96 re f 183.96 278.83 8.60 9.96 re f 183.96 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 183.96 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 183.96 308.72 8.60 9.96 re f 183.96 318.68 8.60 9.96 re f 183.96 328.64 8.60 9.96 re f 183.96 338.61 8.60 9.96 re f 183.96 348.57 8.60 9.96 re f 183.96 358.53 8.60 9.96 re f 183.96 368.49 8.60 9.96 re f 183.96 378.46 8.60 9.96 re f 183.96 388.42 8.60 9.96 re f 192.56 19.79 8.60 9.96 re f 192.56 29.75 8.60 9.96 re f 192.56 39.71 8.60 9.96 re f 192.56 49.67 8.60 9.96 re f 192.56 59.64 8.60 9.96 re f 192.56 69.60 8.60 9.96 re f 192.56 79.56 8.60 9.96 re f 192.56 89.53 8.60 9.96 re f 192.56 99.49 8.60 9.96 re f 192.56 109.45 8.60 9.96 re f 192.56 119.42 8.60 9.96 re f 192.56 129.38 8.60 9.96 re f 192.56 139.34 8.60 9.96 re f 192.56 149.31 8.60 9.96 re f 192.56 159.27 8.60 9.96 re f 192.56 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 192.56 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 192.56 189.16 8.60 9.96 re f 192.56 199.12 8.60 9.96 re f 192.56 209.08 8.60 9.96 re f 192.56 219.05 8.60 9.96 re f 192.56 229.01 8.60 9.96 re f 192.56 238.97 8.60 9.96 re f 192.56 248.94 8.60 9.96 re f 192.56 258.90 8.60 9.96 re f 192.56 268.86 8.60 9.96 re f 192.56 278.83 8.60 9.96 re f 192.56 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 192.56 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 192.56 308.72 8.60 9.96 re f 192.56 318.68 8.60 9.96 re f 192.56 328.64 8.60 9.96 re f 192.56 338.61 8.60 9.96 re f 192.56 348.57 8.60 9.96 re f 192.56 358.53 8.60 9.96 re f 192.56 368.49 8.60 9.96 re f 192.56 378.46 8.60 9.96 re f 192.56 388.42 8.60 9.96 re f 201.16 19.79 8.60 9.96 re f 201.16 29.75 8.60 9.96 re f 201.16 39.71 8.60 9.96 re f 201.16 49.67 8.60 9.96 re f 201.16 59.64 8.60 9.96 re f 201.16 69.60 8.60 9.96 re f 201.16 79.56 8.60 9.96 re f 201.16 89.53 8.60 9.96 re f 201.16 99.49 8.60 9.96 re f 201.16 109.45 8.60 9.96 re f 201.16 119.42 8.60 9.96 re f 201.16 129.38 8.60 9.96 re f 201.16 139.34 8.60 9.96 re f 201.16 149.31 8.60 9.96 re f 201.16 159.27 8.60 9.96 re f 201.16 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 201.16 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 201.16 189.16 8.60 9.96 re f 201.16 199.12 8.60 9.96 re f 201.16 209.08 8.60 9.96 re f 201.16 219.05 8.60 9.96 re f 201.16 229.01 8.60 9.96 re f 201.16 238.97 8.60 9.96 re f 201.16 248.94 8.60 9.96 re f 201.16 258.90 8.60 9.96 re f 201.16 268.86 8.60 9.96 re f 201.16 278.83 8.60 9.96 re f 201.16 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 201.16 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 201.16 308.72 8.60 9.96 re f 201.16 318.68 8.60 9.96 re f 201.16 328.64 8.60 9.96 re f 201.16 338.61 8.60 9.96 re f 201.16 348.57 8.60 9.96 re f 201.16 358.53 8.60 9.96 re f 201.16 368.49 8.60 9.96 re f 201.16 378.46 8.60 9.96 re f 201.16 388.42 8.60 9.96 re f 209.76 19.79 8.60 9.96 re f 209.76 29.75 8.60 9.96 re f 209.76 39.71 8.60 9.96 re f 209.76 49.67 8.60 9.96 re f 209.76 59.64 8.60 9.96 re f 209.76 69.60 8.60 9.96 re f 209.76 79.56 8.60 9.96 re f 209.76 89.53 8.60 9.96 re f 209.76 99.49 8.60 9.96 re f 209.76 109.45 8.60 9.96 re f 209.76 119.42 8.60 9.96 re f 209.76 129.38 8.60 9.96 re f 209.76 139.34 8.60 9.96 re f 209.76 149.31 8.60 9.96 re f 209.76 159.27 8.60 9.96 re f 209.76 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 209.76 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 209.76 189.16 8.60 9.96 re f 209.76 199.12 8.60 9.96 re f 209.76 209.08 8.60 9.96 re f 209.76 219.05 8.60 9.96 re f 209.76 229.01 8.60 9.96 re f 209.76 238.97 8.60 9.96 re f 209.76 248.94 8.60 9.96 re f 209.76 258.90 8.60 9.96 re f 209.76 268.86 8.60 9.96 re f 209.76 278.83 8.60 9.96 re f 209.76 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 209.76 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 209.76 308.72 8.60 9.96 re f 209.76 318.68 8.60 9.96 re f 209.76 328.64 8.60 9.96 re f 209.76 338.61 8.60 9.96 re f 209.76 348.57 8.60 9.96 re f 209.76 358.53 8.60 9.96 re f 209.76 368.49 8.60 9.96 re f 209.76 378.46 8.60 9.96 re f 209.76 388.42 8.60 9.96 re f 218.35 19.79 8.60 9.96 re f 218.35 29.75 8.60 9.96 re f 218.35 39.71 8.60 9.96 re f 218.35 49.67 8.60 9.96 re f 218.35 59.64 8.60 9.96 re f 218.35 69.60 8.60 9.96 re f 218.35 79.56 8.60 9.96 re f 218.35 89.53 8.60 9.96 re f 218.35 99.49 8.60 9.96 re f 218.35 109.45 8.60 9.96 re f 218.35 119.42 8.60 9.96 re f 218.35 129.38 8.60 9.96 re f 218.35 139.34 8.60 9.96 re f 218.35 149.31 8.60 9.96 re f 218.35 159.27 8.60 9.96 re f 218.35 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 218.35 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 218.35 189.16 8.60 9.96 re f 218.35 199.12 8.60 9.96 re f 218.35 209.08 8.60 9.96 re f 218.35 219.05 8.60 9.96 re f 218.35 229.01 8.60 9.96 re f 218.35 238.97 8.60 9.96 re f 218.35 248.94 8.60 9.96 re f 218.35 258.90 8.60 9.96 re f 218.35 268.86 8.60 9.96 re f 218.35 278.83 8.60 9.96 re f 218.35 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 218.35 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 218.35 308.72 8.60 9.96 re f 218.35 318.68 8.60 9.96 re f 218.35 328.64 8.60 9.96 re f 218.35 338.61 8.60 9.96 re f 218.35 348.57 8.60 9.96 re f 218.35 358.53 8.60 9.96 re f 218.35 368.49 8.60 9.96 re f 218.35 378.46 8.60 9.96 re f 218.35 388.42 8.60 9.96 re f 226.95 19.79 8.60 9.96 re f 226.95 29.75 8.60 9.96 re f 226.95 39.71 8.60 9.96 re f 226.95 49.67 8.60 9.96 re f 226.95 59.64 8.60 9.96 re f 226.95 69.60 8.60 9.96 re f 226.95 79.56 8.60 9.96 re f 226.95 89.53 8.60 9.96 re f 226.95 99.49 8.60 9.96 re f 226.95 109.45 8.60 9.96 re f 226.95 119.42 8.60 9.96 re f 226.95 129.38 8.60 9.96 re f 226.95 139.34 8.60 9.96 re f 226.95 149.31 8.60 9.96 re f 226.95 159.27 8.60 9.96 re f 226.95 169.23 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 226.95 179.20 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 226.95 189.16 8.60 9.96 re f 226.95 199.12 8.60 9.96 re f 226.95 209.08 8.60 9.96 re f 226.95 219.05 8.60 9.96 re f 226.95 229.01 8.60 9.96 re f 226.95 238.97 8.60 9.96 re f 226.95 248.94 8.60 9.96 re f 226.95 258.90 8.60 9.96 re f 226.95 268.86 8.60 9.96 re f 226.95 278.83 8.60 9.96 re f 226.95 288.79 8.60 9.96 re f /sRGB cs 0.992 0.682 0.380 scn 226.95 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 226.95 308.72 8.60 9.96 re f 226.95 318.68 8.60 9.96 re f 226.95 328.64 8.60 9.96 re f 226.95 338.61 8.60 9.96 re f 226.95 348.57 8.60 9.96 re f 226.95 358.53 8.60 9.96 re f 226.95 368.49 8.60 9.96 re f 226.95 378.46 8.60 9.96 re f 226.95 388.42 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 235.55 19.79 8.60 9.96 re f 235.55 29.75 8.60 9.96 re f 235.55 39.71 8.60 9.96 re f 235.55 49.67 8.60 9.96 re f 235.55 59.64 8.60 9.96 re f 235.55 69.60 8.60 9.96 re f 235.55 79.56 8.60 9.96 re f 235.55 89.53 8.60 9.96 re f 235.55 99.49 8.60 9.96 re f 235.55 109.45 8.60 9.96 re f 235.55 119.42 8.60 9.96 re f 235.55 129.38 8.60 9.96 re f 235.55 139.34 8.60 9.96 re f 235.55 149.31 8.60 9.96 re f 235.55 159.27 8.60 9.96 re f 235.55 169.23 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 235.55 179.20 8.60 9.96 re f /sRGB cs 0.208 0.259 0.608 scn 235.55 189.16 8.60 9.96 re f 235.55 199.12 8.60 9.96 re f 235.55 209.08 8.60 9.96 re f 235.55 219.05 8.60 9.96 re f 235.55 229.01 8.60 9.96 re f 235.55 238.97 8.60 9.96 re f 235.55 248.94 8.60 9.96 re f 235.55 258.90 8.60 9.96 re f 235.55 268.86 8.60 9.96 re f 235.55 278.83 8.60 9.96 re f 235.55 288.79 8.60 9.96 re f /sRGB cs 0.710 0.871 0.922 scn 235.55 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 235.55 308.72 8.60 9.96 re f 235.55 318.68 8.60 9.96 re f 235.55 328.64 8.60 9.96 re f 235.55 338.61 8.60 9.96 re f 235.55 348.57 8.60 9.96 re f 235.55 358.53 8.60 9.96 re f 235.55 368.49 8.60 9.96 re f 235.55 378.46 8.60 9.96 re f 235.55 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 244.15 19.79 8.60 9.96 re f 244.15 29.75 8.60 9.96 re f 244.15 39.71 8.60 9.96 re f 244.15 49.67 8.60 9.96 re f 244.15 59.64 8.60 9.96 re f 244.15 69.60 8.60 9.96 re f 244.15 79.56 8.60 9.96 re f 244.15 89.53 8.60 9.96 re f 244.15 99.49 8.60 9.96 re f 244.15 109.45 8.60 9.96 re f 244.15 119.42 8.60 9.96 re f 244.15 129.38 8.60 9.96 re f 244.15 139.34 8.60 9.96 re f 244.15 149.31 8.60 9.96 re f 244.15 159.27 8.60 9.96 re f 244.15 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 244.15 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 244.15 189.16 8.60 9.96 re f 244.15 199.12 8.60 9.96 re f 244.15 209.08 8.60 9.96 re f 244.15 219.05 8.60 9.96 re f 244.15 229.01 8.60 9.96 re f 244.15 238.97 8.60 9.96 re f 244.15 248.94 8.60 9.96 re f 244.15 258.90 8.60 9.96 re f 244.15 268.86 8.60 9.96 re f 244.15 278.83 8.60 9.96 re f 244.15 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 244.15 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 244.15 308.72 8.60 9.96 re f 244.15 318.68 8.60 9.96 re f 244.15 328.64 8.60 9.96 re f 244.15 338.61 8.60 9.96 re f 244.15 348.57 8.60 9.96 re f 244.15 358.53 8.60 9.96 re f 244.15 368.49 8.60 9.96 re f 244.15 378.46 8.60 9.96 re f 244.15 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 252.75 19.79 8.60 9.96 re f 252.75 29.75 8.60 9.96 re f 252.75 39.71 8.60 9.96 re f 252.75 49.67 8.60 9.96 re f 252.75 59.64 8.60 9.96 re f 252.75 69.60 8.60 9.96 re f 252.75 79.56 8.60 9.96 re f 252.75 89.53 8.60 9.96 re f 252.75 99.49 8.60 9.96 re f 252.75 109.45 8.60 9.96 re f 252.75 119.42 8.60 9.96 re f 252.75 129.38 8.60 9.96 re f 252.75 139.34 8.60 9.96 re f 252.75 149.31 8.60 9.96 re f 252.75 159.27 8.60 9.96 re f 252.75 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 252.75 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 252.75 189.16 8.60 9.96 re f 252.75 199.12 8.60 9.96 re f 252.75 209.08 8.60 9.96 re f 252.75 219.05 8.60 9.96 re f 252.75 229.01 8.60 9.96 re f 252.75 238.97 8.60 9.96 re f 252.75 248.94 8.60 9.96 re f 252.75 258.90 8.60 9.96 re f 252.75 268.86 8.60 9.96 re f 252.75 278.83 8.60 9.96 re f 252.75 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 252.75 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 252.75 308.72 8.60 9.96 re f 252.75 318.68 8.60 9.96 re f 252.75 328.64 8.60 9.96 re f 252.75 338.61 8.60 9.96 re f 252.75 348.57 8.60 9.96 re f 252.75 358.53 8.60 9.96 re f 252.75 368.49 8.60 9.96 re f 252.75 378.46 8.60 9.96 re f 252.75 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 261.34 19.79 8.60 9.96 re f 261.34 29.75 8.60 9.96 re f 261.34 39.71 8.60 9.96 re f 261.34 49.67 8.60 9.96 re f 261.34 59.64 8.60 9.96 re f 261.34 69.60 8.60 9.96 re f 261.34 79.56 8.60 9.96 re f 261.34 89.53 8.60 9.96 re f 261.34 99.49 8.60 9.96 re f 261.34 109.45 8.60 9.96 re f 261.34 119.42 8.60 9.96 re f 261.34 129.38 8.60 9.96 re f 261.34 139.34 8.60 9.96 re f 261.34 149.31 8.60 9.96 re f 261.34 159.27 8.60 9.96 re f 261.34 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 261.34 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 261.34 189.16 8.60 9.96 re f 261.34 199.12 8.60 9.96 re f 261.34 209.08 8.60 9.96 re f 261.34 219.05 8.60 9.96 re f 261.34 229.01 8.60 9.96 re f 261.34 238.97 8.60 9.96 re f 261.34 248.94 8.60 9.96 re f 261.34 258.90 8.60 9.96 re f 261.34 268.86 8.60 9.96 re f 261.34 278.83 8.60 9.96 re f 261.34 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 261.34 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 261.34 308.72 8.60 9.96 re f 261.34 318.68 8.60 9.96 re f 261.34 328.64 8.60 9.96 re f 261.34 338.61 8.60 9.96 re f 261.34 348.57 8.60 9.96 re f 261.34 358.53 8.60 9.96 re f 261.34 368.49 8.60 9.96 re f 261.34 378.46 8.60 9.96 re f 261.34 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 269.94 19.79 8.60 9.96 re f 269.94 29.75 8.60 9.96 re f 269.94 39.71 8.60 9.96 re f 269.94 49.67 8.60 9.96 re f 269.94 59.64 8.60 9.96 re f 269.94 69.60 8.60 9.96 re f 269.94 79.56 8.60 9.96 re f 269.94 89.53 8.60 9.96 re f 269.94 99.49 8.60 9.96 re f 269.94 109.45 8.60 9.96 re f 269.94 119.42 8.60 9.96 re f 269.94 129.38 8.60 9.96 re f 269.94 139.34 8.60 9.96 re f 269.94 149.31 8.60 9.96 re f 269.94 159.27 8.60 9.96 re f 269.94 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 269.94 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 269.94 189.16 8.60 9.96 re f 269.94 199.12 8.60 9.96 re f 269.94 209.08 8.60 9.96 re f 269.94 219.05 8.60 9.96 re f 269.94 229.01 8.60 9.96 re f 269.94 238.97 8.60 9.96 re f 269.94 248.94 8.60 9.96 re f 269.94 258.90 8.60 9.96 re f 269.94 268.86 8.60 9.96 re f 269.94 278.83 8.60 9.96 re f 269.94 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 269.94 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 269.94 308.72 8.60 9.96 re f 269.94 318.68 8.60 9.96 re f 269.94 328.64 8.60 9.96 re f 269.94 338.61 8.60 9.96 re f 269.94 348.57 8.60 9.96 re f 269.94 358.53 8.60 9.96 re f 269.94 368.49 8.60 9.96 re f 269.94 378.46 8.60 9.96 re f 269.94 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 278.54 19.79 8.60 9.96 re f 278.54 29.75 8.60 9.96 re f 278.54 39.71 8.60 9.96 re f 278.54 49.67 8.60 9.96 re f 278.54 59.64 8.60 9.96 re f 278.54 69.60 8.60 9.96 re f 278.54 79.56 8.60 9.96 re f 278.54 89.53 8.60 9.96 re f 278.54 99.49 8.60 9.96 re f 278.54 109.45 8.60 9.96 re f 278.54 119.42 8.60 9.96 re f 278.54 129.38 8.60 9.96 re f 278.54 139.34 8.60 9.96 re f 278.54 149.31 8.60 9.96 re f 278.54 159.27 8.60 9.96 re f 278.54 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 278.54 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 278.54 189.16 8.60 9.96 re f 278.54 199.12 8.60 9.96 re f 278.54 209.08 8.60 9.96 re f 278.54 219.05 8.60 9.96 re f 278.54 229.01 8.60 9.96 re f 278.54 238.97 8.60 9.96 re f 278.54 248.94 8.60 9.96 re f 278.54 258.90 8.60 9.96 re f 278.54 268.86 8.60 9.96 re f 278.54 278.83 8.60 9.96 re f 278.54 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 278.54 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 278.54 308.72 8.60 9.96 re f 278.54 318.68 8.60 9.96 re f 278.54 328.64 8.60 9.96 re f 278.54 338.61 8.60 9.96 re f 278.54 348.57 8.60 9.96 re f 278.54 358.53 8.60 9.96 re f 278.54 368.49 8.60 9.96 re f 278.54 378.46 8.60 9.96 re f 278.54 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 287.14 19.79 8.60 9.96 re f 287.14 29.75 8.60 9.96 re f 287.14 39.71 8.60 9.96 re f 287.14 49.67 8.60 9.96 re f 287.14 59.64 8.60 9.96 re f 287.14 69.60 8.60 9.96 re f 287.14 79.56 8.60 9.96 re f 287.14 89.53 8.60 9.96 re f 287.14 99.49 8.60 9.96 re f 287.14 109.45 8.60 9.96 re f 287.14 119.42 8.60 9.96 re f 287.14 129.38 8.60 9.96 re f 287.14 139.34 8.60 9.96 re f 287.14 149.31 8.60 9.96 re f 287.14 159.27 8.60 9.96 re f 287.14 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 287.14 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 287.14 189.16 8.60 9.96 re f 287.14 199.12 8.60 9.96 re f 287.14 209.08 8.60 9.96 re f 287.14 219.05 8.60 9.96 re f 287.14 229.01 8.60 9.96 re f 287.14 238.97 8.60 9.96 re f 287.14 248.94 8.60 9.96 re f 287.14 258.90 8.60 9.96 re f 287.14 268.86 8.60 9.96 re f 287.14 278.83 8.60 9.96 re f 287.14 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 287.14 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 287.14 308.72 8.60 9.96 re f 287.14 318.68 8.60 9.96 re f 287.14 328.64 8.60 9.96 re f 287.14 338.61 8.60 9.96 re f 287.14 348.57 8.60 9.96 re f 287.14 358.53 8.60 9.96 re f 287.14 368.49 8.60 9.96 re f 287.14 378.46 8.60 9.96 re f 287.14 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 295.73 19.79 8.60 9.96 re f 295.73 29.75 8.60 9.96 re f 295.73 39.71 8.60 9.96 re f 295.73 49.67 8.60 9.96 re f 295.73 59.64 8.60 9.96 re f 295.73 69.60 8.60 9.96 re f 295.73 79.56 8.60 9.96 re f 295.73 89.53 8.60 9.96 re f 295.73 99.49 8.60 9.96 re f 295.73 109.45 8.60 9.96 re f 295.73 119.42 8.60 9.96 re f 295.73 129.38 8.60 9.96 re f 295.73 139.34 8.60 9.96 re f 295.73 149.31 8.60 9.96 re f 295.73 159.27 8.60 9.96 re f 295.73 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 295.73 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 295.73 189.16 8.60 9.96 re f 295.73 199.12 8.60 9.96 re f 295.73 209.08 8.60 9.96 re f 295.73 219.05 8.60 9.96 re f 295.73 229.01 8.60 9.96 re f 295.73 238.97 8.60 9.96 re f 295.73 248.94 8.60 9.96 re f 295.73 258.90 8.60 9.96 re f 295.73 268.86 8.60 9.96 re f 295.73 278.83 8.60 9.96 re f 295.73 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 295.73 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 295.73 308.72 8.60 9.96 re f 295.73 318.68 8.60 9.96 re f 295.73 328.64 8.60 9.96 re f 295.73 338.61 8.60 9.96 re f 295.73 348.57 8.60 9.96 re f 295.73 358.53 8.60 9.96 re f 295.73 368.49 8.60 9.96 re f 295.73 378.46 8.60 9.96 re f 295.73 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 304.33 19.79 8.60 9.96 re f 304.33 29.75 8.60 9.96 re f 304.33 39.71 8.60 9.96 re f 304.33 49.67 8.60 9.96 re f 304.33 59.64 8.60 9.96 re f 304.33 69.60 8.60 9.96 re f 304.33 79.56 8.60 9.96 re f 304.33 89.53 8.60 9.96 re f 304.33 99.49 8.60 9.96 re f 304.33 109.45 8.60 9.96 re f 304.33 119.42 8.60 9.96 re f 304.33 129.38 8.60 9.96 re f 304.33 139.34 8.60 9.96 re f 304.33 149.31 8.60 9.96 re f 304.33 159.27 8.60 9.96 re f 304.33 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 304.33 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 304.33 189.16 8.60 9.96 re f 304.33 199.12 8.60 9.96 re f 304.33 209.08 8.60 9.96 re f 304.33 219.05 8.60 9.96 re f 304.33 229.01 8.60 9.96 re f 304.33 238.97 8.60 9.96 re f 304.33 248.94 8.60 9.96 re f 304.33 258.90 8.60 9.96 re f 304.33 268.86 8.60 9.96 re f 304.33 278.83 8.60 9.96 re f 304.33 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 304.33 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 304.33 308.72 8.60 9.96 re f 304.33 318.68 8.60 9.96 re f 304.33 328.64 8.60 9.96 re f 304.33 338.61 8.60 9.96 re f 304.33 348.57 8.60 9.96 re f 304.33 358.53 8.60 9.96 re f 304.33 368.49 8.60 9.96 re f 304.33 378.46 8.60 9.96 re f 304.33 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 312.93 19.79 8.60 9.96 re f 312.93 29.75 8.60 9.96 re f 312.93 39.71 8.60 9.96 re f 312.93 49.67 8.60 9.96 re f 312.93 59.64 8.60 9.96 re f 312.93 69.60 8.60 9.96 re f 312.93 79.56 8.60 9.96 re f 312.93 89.53 8.60 9.96 re f 312.93 99.49 8.60 9.96 re f 312.93 109.45 8.60 9.96 re f 312.93 119.42 8.60 9.96 re f 312.93 129.38 8.60 9.96 re f 312.93 139.34 8.60 9.96 re f 312.93 149.31 8.60 9.96 re f 312.93 159.27 8.60 9.96 re f 312.93 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 312.93 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 312.93 189.16 8.60 9.96 re f 312.93 199.12 8.60 9.96 re f 312.93 209.08 8.60 9.96 re f 312.93 219.05 8.60 9.96 re f 312.93 229.01 8.60 9.96 re f 312.93 238.97 8.60 9.96 re f 312.93 248.94 8.60 9.96 re f 312.93 258.90 8.60 9.96 re f 312.93 268.86 8.60 9.96 re f 312.93 278.83 8.60 9.96 re f 312.93 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 312.93 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 312.93 308.72 8.60 9.96 re f 312.93 318.68 8.60 9.96 re f 312.93 328.64 8.60 9.96 re f 312.93 338.61 8.60 9.96 re f 312.93 348.57 8.60 9.96 re f 312.93 358.53 8.60 9.96 re f 312.93 368.49 8.60 9.96 re f 312.93 378.46 8.60 9.96 re f 312.93 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 321.53 19.79 8.60 9.96 re f 321.53 29.75 8.60 9.96 re f 321.53 39.71 8.60 9.96 re f 321.53 49.67 8.60 9.96 re f 321.53 59.64 8.60 9.96 re f 321.53 69.60 8.60 9.96 re f 321.53 79.56 8.60 9.96 re f 321.53 89.53 8.60 9.96 re f 321.53 99.49 8.60 9.96 re f 321.53 109.45 8.60 9.96 re f 321.53 119.42 8.60 9.96 re f 321.53 129.38 8.60 9.96 re f 321.53 139.34 8.60 9.96 re f 321.53 149.31 8.60 9.96 re f 321.53 159.27 8.60 9.96 re f 321.53 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 321.53 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 321.53 189.16 8.60 9.96 re f 321.53 199.12 8.60 9.96 re f 321.53 209.08 8.60 9.96 re f 321.53 219.05 8.60 9.96 re f 321.53 229.01 8.60 9.96 re f 321.53 238.97 8.60 9.96 re f 321.53 248.94 8.60 9.96 re f 321.53 258.90 8.60 9.96 re f 321.53 268.86 8.60 9.96 re f 321.53 278.83 8.60 9.96 re f 321.53 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 321.53 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 321.53 308.72 8.60 9.96 re f 321.53 318.68 8.60 9.96 re f 321.53 328.64 8.60 9.96 re f 321.53 338.61 8.60 9.96 re f 321.53 348.57 8.60 9.96 re f 321.53 358.53 8.60 9.96 re f 321.53 368.49 8.60 9.96 re f 321.53 378.46 8.60 9.96 re f 321.53 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 330.12 19.79 8.60 9.96 re f 330.12 29.75 8.60 9.96 re f 330.12 39.71 8.60 9.96 re f 330.12 49.67 8.60 9.96 re f 330.12 59.64 8.60 9.96 re f 330.12 69.60 8.60 9.96 re f 330.12 79.56 8.60 9.96 re f 330.12 89.53 8.60 9.96 re f 330.12 99.49 8.60 9.96 re f 330.12 109.45 8.60 9.96 re f 330.12 119.42 8.60 9.96 re f 330.12 129.38 8.60 9.96 re f 330.12 139.34 8.60 9.96 re f 330.12 149.31 8.60 9.96 re f 330.12 159.27 8.60 9.96 re f 330.12 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 330.12 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 330.12 189.16 8.60 9.96 re f 330.12 199.12 8.60 9.96 re f 330.12 209.08 8.60 9.96 re f 330.12 219.05 8.60 9.96 re f 330.12 229.01 8.60 9.96 re f 330.12 238.97 8.60 9.96 re f 330.12 248.94 8.60 9.96 re f 330.12 258.90 8.60 9.96 re f 330.12 268.86 8.60 9.96 re f 330.12 278.83 8.60 9.96 re f 330.12 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 330.12 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 330.12 308.72 8.60 9.96 re f 330.12 318.68 8.60 9.96 re f 330.12 328.64 8.60 9.96 re f 330.12 338.61 8.60 9.96 re f 330.12 348.57 8.60 9.96 re f 330.12 358.53 8.60 9.96 re f 330.12 368.49 8.60 9.96 re f 330.12 378.46 8.60 9.96 re f 330.12 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 338.72 19.79 8.60 9.96 re f 338.72 29.75 8.60 9.96 re f 338.72 39.71 8.60 9.96 re f 338.72 49.67 8.60 9.96 re f 338.72 59.64 8.60 9.96 re f 338.72 69.60 8.60 9.96 re f 338.72 79.56 8.60 9.96 re f 338.72 89.53 8.60 9.96 re f 338.72 99.49 8.60 9.96 re f 338.72 109.45 8.60 9.96 re f 338.72 119.42 8.60 9.96 re f 338.72 129.38 8.60 9.96 re f 338.72 139.34 8.60 9.96 re f 338.72 149.31 8.60 9.96 re f 338.72 159.27 8.60 9.96 re f 338.72 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 338.72 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 338.72 189.16 8.60 9.96 re f 338.72 199.12 8.60 9.96 re f 338.72 209.08 8.60 9.96 re f 338.72 219.05 8.60 9.96 re f 338.72 229.01 8.60 9.96 re f 338.72 238.97 8.60 9.96 re f 338.72 248.94 8.60 9.96 re f 338.72 258.90 8.60 9.96 re f 338.72 268.86 8.60 9.96 re f 338.72 278.83 8.60 9.96 re f 338.72 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 338.72 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 338.72 308.72 8.60 9.96 re f 338.72 318.68 8.60 9.96 re f 338.72 328.64 8.60 9.96 re f 338.72 338.61 8.60 9.96 re f 338.72 348.57 8.60 9.96 re f 338.72 358.53 8.60 9.96 re f 338.72 368.49 8.60 9.96 re f 338.72 378.46 8.60 9.96 re f 338.72 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 347.32 19.79 8.60 9.96 re f 347.32 29.75 8.60 9.96 re f 347.32 39.71 8.60 9.96 re f 347.32 49.67 8.60 9.96 re f 347.32 59.64 8.60 9.96 re f 347.32 69.60 8.60 9.96 re f 347.32 79.56 8.60 9.96 re f 347.32 89.53 8.60 9.96 re f 347.32 99.49 8.60 9.96 re f 347.32 109.45 8.60 9.96 re f 347.32 119.42 8.60 9.96 re f 347.32 129.38 8.60 9.96 re f 347.32 139.34 8.60 9.96 re f 347.32 149.31 8.60 9.96 re f 347.32 159.27 8.60 9.96 re f 347.32 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 347.32 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 347.32 189.16 8.60 9.96 re f 347.32 199.12 8.60 9.96 re f 347.32 209.08 8.60 9.96 re f 347.32 219.05 8.60 9.96 re f 347.32 229.01 8.60 9.96 re f 347.32 238.97 8.60 9.96 re f 347.32 248.94 8.60 9.96 re f 347.32 258.90 8.60 9.96 re f 347.32 268.86 8.60 9.96 re f 347.32 278.83 8.60 9.96 re f 347.32 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 347.32 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 347.32 308.72 8.60 9.96 re f 347.32 318.68 8.60 9.96 re f 347.32 328.64 8.60 9.96 re f 347.32 338.61 8.60 9.96 re f 347.32 348.57 8.60 9.96 re f 347.32 358.53 8.60 9.96 re f 347.32 368.49 8.60 9.96 re f 347.32 378.46 8.60 9.96 re f 347.32 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 355.92 19.79 8.60 9.96 re f 355.92 29.75 8.60 9.96 re f 355.92 39.71 8.60 9.96 re f 355.92 49.67 8.60 9.96 re f 355.92 59.64 8.60 9.96 re f 355.92 69.60 8.60 9.96 re f 355.92 79.56 8.60 9.96 re f 355.92 89.53 8.60 9.96 re f 355.92 99.49 8.60 9.96 re f 355.92 109.45 8.60 9.96 re f 355.92 119.42 8.60 9.96 re f 355.92 129.38 8.60 9.96 re f 355.92 139.34 8.60 9.96 re f 355.92 149.31 8.60 9.96 re f 355.92 159.27 8.60 9.96 re f 355.92 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 355.92 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 355.92 189.16 8.60 9.96 re f 355.92 199.12 8.60 9.96 re f 355.92 209.08 8.60 9.96 re f 355.92 219.05 8.60 9.96 re f 355.92 229.01 8.60 9.96 re f 355.92 238.97 8.60 9.96 re f 355.92 248.94 8.60 9.96 re f 355.92 258.90 8.60 9.96 re f 355.92 268.86 8.60 9.96 re f 355.92 278.83 8.60 9.96 re f 355.92 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 355.92 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 355.92 308.72 8.60 9.96 re f 355.92 318.68 8.60 9.96 re f 355.92 328.64 8.60 9.96 re f 355.92 338.61 8.60 9.96 re f 355.92 348.57 8.60 9.96 re f 355.92 358.53 8.60 9.96 re f 355.92 368.49 8.60 9.96 re f 355.92 378.46 8.60 9.96 re f 355.92 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 364.51 19.79 8.60 9.96 re f 364.51 29.75 8.60 9.96 re f 364.51 39.71 8.60 9.96 re f 364.51 49.67 8.60 9.96 re f 364.51 59.64 8.60 9.96 re f 364.51 69.60 8.60 9.96 re f 364.51 79.56 8.60 9.96 re f 364.51 89.53 8.60 9.96 re f 364.51 99.49 8.60 9.96 re f 364.51 109.45 8.60 9.96 re f 364.51 119.42 8.60 9.96 re f 364.51 129.38 8.60 9.96 re f 364.51 139.34 8.60 9.96 re f 364.51 149.31 8.60 9.96 re f 364.51 159.27 8.60 9.96 re f 364.51 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 364.51 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 364.51 189.16 8.60 9.96 re f 364.51 199.12 8.60 9.96 re f 364.51 209.08 8.60 9.96 re f 364.51 219.05 8.60 9.96 re f 364.51 229.01 8.60 9.96 re f 364.51 238.97 8.60 9.96 re f 364.51 248.94 8.60 9.96 re f 364.51 258.90 8.60 9.96 re f 364.51 268.86 8.60 9.96 re f 364.51 278.83 8.60 9.96 re f 364.51 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 364.51 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 364.51 308.72 8.60 9.96 re f 364.51 318.68 8.60 9.96 re f 364.51 328.64 8.60 9.96 re f 364.51 338.61 8.60 9.96 re f 364.51 348.57 8.60 9.96 re f 364.51 358.53 8.60 9.96 re f 364.51 368.49 8.60 9.96 re f 364.51 378.46 8.60 9.96 re f 364.51 388.42 8.60 9.96 re f /sRGB cs 0.647 0.000 0.149 scn 373.11 19.79 8.60 9.96 re f 373.11 29.75 8.60 9.96 re f 373.11 39.71 8.60 9.96 re f 373.11 49.67 8.60 9.96 re f 373.11 59.64 8.60 9.96 re f 373.11 69.60 8.60 9.96 re f 373.11 79.56 8.60 9.96 re f 373.11 89.53 8.60 9.96 re f 373.11 99.49 8.60 9.96 re f 373.11 109.45 8.60 9.96 re f 373.11 119.42 8.60 9.96 re f 373.11 129.38 8.60 9.96 re f 373.11 139.34 8.60 9.96 re f 373.11 149.31 8.60 9.96 re f 373.11 159.27 8.60 9.96 re f 373.11 169.23 8.60 9.96 re f /sRGB cs 0.686 0.035 0.149 scn 373.11 179.20 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 373.11 189.16 8.60 9.96 re f 373.11 199.12 8.60 9.96 re f 373.11 209.08 8.60 9.96 re f 373.11 219.05 8.60 9.96 re f 373.11 229.01 8.60 9.96 re f 373.11 238.97 8.60 9.96 re f 373.11 248.94 8.60 9.96 re f 373.11 258.90 8.60 9.96 re f 373.11 268.86 8.60 9.96 re f 373.11 278.83 8.60 9.96 re f 373.11 288.79 8.60 9.96 re f /sRGB cs 0.667 0.847 0.910 scn 373.11 298.75 8.60 9.96 re f /sRGB cs 0.192 0.212 0.584 scn 373.11 308.72 8.60 9.96 re f 373.11 318.68 8.60 9.96 re f 373.11 328.64 8.60 9.96 re f 373.11 338.61 8.60 9.96 re f 373.11 348.57 8.60 9.96 re f 373.11 358.53 8.60 9.96 re f 373.11 368.49 8.60 9.96 re f 373.11 378.46 8.60 9.96 re f 373.11 388.42 8.60 9.96 re f Q q Q q BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 0.00 -5.00 5.00 0.00 57.50 14.79 Tm (27) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 66.10 14.79 Tm (26) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 74.70 14.79 Tm (25) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 83.30 14.79 Tm (24) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 91.89 14.79 Tm (23) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 100.49 14.79 Tm (22) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 109.09 14.79 Tm (21) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 117.69 14.79 Tm (10) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 126.28 14.79 Tm (20) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 134.88 14.79 Tm (6) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 143.48 14.79 Tm (38) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 152.08 14.79 Tm (37) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 160.68 14.79 Tm (36) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 169.27 14.79 Tm (35) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 177.87 14.79 Tm (34) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 186.47 14.79 Tm (33) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 195.07 14.79 Tm (32) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 203.66 14.79 Tm (31) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 212.26 14.79 Tm (30) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 220.86 14.79 Tm (28) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 229.46 14.79 Tm (29) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 238.05 14.79 Tm (17) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 246.65 14.79 Tm (19) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 255.25 14.79 Tm (18) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 263.85 14.79 Tm (16) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 272.44 14.79 Tm (15) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 281.04 14.79 Tm (14) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 289.64 14.79 Tm (13) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 298.24 14.79 Tm (12) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 306.83 14.79 Tm (11) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 315.43 14.79 Tm (9) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 324.03 14.79 Tm (8) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 332.63 14.79 Tm (7) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 341.23 14.79 Tm (5) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 349.82 14.79 Tm (4) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 358.42 14.79 Tm (3) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 367.02 14.79 Tm (1) Tj ET BT /F2 1 Tf 0.00 -5.00 5.00 0.00 375.62 14.79 Tm (2) Tj ET Q q Q q BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 22.61 Tm (2) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 32.58 Tm (1) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 42.54 Tm (3) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 52.50 Tm (4) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 62.47 Tm (5) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 72.43 Tm (7) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 82.39 Tm (8) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 92.35 Tm (9) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 102.32 Tm (11) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 112.28 Tm (12) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 122.24 Tm (13) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 132.21 Tm (14) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 142.17 Tm (15) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 152.13 Tm (16) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 162.10 Tm (18) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 172.06 Tm (19) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 182.02 Tm (17) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 191.99 Tm (29) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 201.95 Tm (28) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 211.91 Tm (30) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 221.88 Tm (31) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 231.84 Tm (32) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 241.80 Tm (33) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 251.76 Tm (34) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 261.73 Tm (35) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 271.69 Tm (36) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 281.65 Tm (37) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 291.62 Tm (38) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 301.58 Tm (6) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 311.54 Tm (20) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 321.51 Tm (10) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 331.47 Tm (21) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 341.43 Tm (22) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 351.40 Tm (23) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 361.36 Tm (24) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 371.32 Tm (25) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 381.29 Tm (26) Tj ET BT /F2 1 Tf 6.00 0.00 -0.00 6.00 386.71 391.25 Tm (27) Tj ET Q q Q q /sRGB cs 0.616 0.624 1.000 scn 55.00 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 55.00 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 63.60 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 63.60 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 72.20 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 72.20 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 80.79 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 80.79 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 89.39 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 89.39 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 97.99 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 97.99 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 106.59 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 106.59 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 115.18 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 115.18 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 123.78 400.38 8.60 8.00 re f /sRGB cs 0.827 0.545 1.000 scn 123.78 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 132.38 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 132.38 410.38 8.60 8.00 re f /sRGB cs 0.961 0.482 1.000 scn 140.98 400.38 8.60 8.00 re f 149.57 400.38 8.60 8.00 re f 158.17 400.38 8.60 8.00 re f 166.77 400.38 8.60 8.00 re f 175.37 400.38 8.60 8.00 re f 183.96 400.38 8.60 8.00 re f 192.56 400.38 8.60 8.00 re f 201.16 400.38 8.60 8.00 re f 209.76 400.38 8.60 8.00 re f 218.35 400.38 8.60 8.00 re f 226.95 400.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 235.55 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 235.55 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 244.15 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 244.15 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 252.75 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 252.75 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 261.34 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 261.34 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 269.94 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 269.94 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 278.54 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 278.54 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 287.14 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 287.14 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 295.73 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 295.73 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 304.33 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 304.33 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 312.93 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 312.93 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 321.53 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 321.53 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 330.12 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 330.12 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 338.72 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 338.72 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 347.32 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 347.32 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 355.92 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 355.92 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 364.51 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 364.51 410.38 8.60 8.00 re f /sRGB cs 0.616 0.624 1.000 scn 373.11 400.38 8.60 8.00 re f /sRGB cs 0.227 0.694 1.000 scn 373.11 410.38 8.60 8.00 re f Q q Q q BT /sRGB cs 0.000 0.000 0.000 scn /F3 1 Tf 10.00 0.00 -0.00 10.00 455.12 391.20 Tm (ALL.AML) Tj ET /sRGB cs 0.616 0.624 1.000 scn 455.12 380.43 7.18 7.18 re f BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 10.00 0.00 -0.00 10.00 464.45 380.43 Tm (ALL) Tj ET /sRGB cs 0.961 0.482 1.000 scn 455.12 369.66 7.18 7.18 re f BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 10.00 0.00 -0.00 10.00 464.45 369.66 Tm (AML) Tj ET BT /F3 1 Tf 10.00 0.00 -0.00 10.00 455.12 348.12 Tm (Cell) Tj ET /sRGB cs 0.227 0.694 1.000 scn 455.12 337.35 7.18 7.18 re f BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 10.00 0.00 -0.00 10.00 464.45 337.35 Tm (B-cell) Tj ET /sRGB cs 0.827 0.545 1.000 scn 455.12 326.58 7.18 7.18 re f BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 10.00 0.00 -0.00 10.00 464.45 326.58 Tm (T-cell) Tj ET Q q Q q /sRGB cs 0.192 0.212 0.584 scn 402.38 248.38 10.00 2.94 re f /sRGB cs 0.208 0.259 0.608 scn 402.38 251.33 10.00 2.94 re f /sRGB cs 0.220 0.310 0.631 scn 402.38 254.27 10.00 2.94 re f /sRGB cs 0.235 0.357 0.655 scn 402.38 257.21 10.00 2.94 re f /sRGB cs 0.255 0.408 0.678 scn 402.38 260.15 10.00 2.94 re f /sRGB cs 0.271 0.459 0.706 scn 402.38 263.09 10.00 2.94 re f /sRGB cs 0.306 0.502 0.725 scn 402.38 266.03 10.00 2.94 re f /sRGB cs 0.341 0.545 0.749 scn 402.38 268.97 10.00 2.94 re f /sRGB cs 0.380 0.588 0.773 scn 402.38 271.91 10.00 2.94 re f /sRGB cs 0.416 0.631 0.796 scn 402.38 274.85 10.00 2.94 re f /sRGB cs 0.455 0.678 0.820 scn 402.38 277.80 10.00 2.94 re f /sRGB cs 0.494 0.710 0.835 scn 402.38 280.74 10.00 2.94 re f /sRGB cs 0.537 0.745 0.855 scn 402.38 283.68 10.00 2.94 re f /sRGB cs 0.580 0.780 0.875 scn 402.38 286.62 10.00 2.94 re f /sRGB cs 0.627 0.816 0.894 scn 402.38 289.56 10.00 2.94 re f /sRGB cs 0.667 0.847 0.910 scn 402.38 292.50 10.00 2.94 re f /sRGB cs 0.710 0.871 0.922 scn 402.38 295.44 10.00 2.94 re f /sRGB cs 0.753 0.890 0.937 scn 402.38 298.38 10.00 2.94 re f /sRGB cs 0.792 0.910 0.949 scn 402.38 301.33 10.00 2.94 re f /sRGB cs 0.835 0.929 0.957 scn 402.38 304.27 10.00 2.94 re f /sRGB cs 0.878 0.953 0.973 scn 402.38 307.21 10.00 2.94 re f /sRGB cs 0.902 0.961 0.925 scn 402.38 310.15 10.00 2.94 re f /sRGB cs 0.925 0.969 0.882 scn 402.38 313.09 10.00 2.94 re f /sRGB cs 0.949 0.980 0.835 scn 402.38 316.03 10.00 2.94 re f /sRGB cs 0.973 0.988 0.792 scn 402.38 318.97 10.00 2.94 re f /sRGB cs 1.000 1.000 0.749 scn 402.38 321.91 10.00 2.94 re f /sRGB cs 0.996 0.973 0.710 scn 402.38 324.85 10.00 2.94 re f /sRGB cs 0.996 0.949 0.675 scn 402.38 327.80 10.00 2.94 re f /sRGB cs 0.996 0.925 0.635 scn 402.38 330.74 10.00 2.94 re f /sRGB cs 0.996 0.902 0.600 scn 402.38 333.68 10.00 2.94 re f /sRGB cs 0.996 0.878 0.565 scn 402.38 336.62 10.00 2.94 re f /sRGB cs 0.992 0.839 0.525 scn 402.38 339.56 10.00 2.94 re f /sRGB cs 0.992 0.800 0.490 scn 402.38 342.50 10.00 2.94 re f /sRGB cs 0.992 0.761 0.451 scn 402.38 345.44 10.00 2.94 re f /sRGB cs 0.992 0.722 0.416 scn 402.38 348.38 10.00 2.94 re f /sRGB cs 0.992 0.682 0.380 scn 402.38 351.33 10.00 2.94 re f /sRGB cs 0.984 0.631 0.357 scn 402.38 354.27 10.00 2.94 re f /sRGB cs 0.976 0.580 0.333 scn 402.38 357.21 10.00 2.94 re f /sRGB cs 0.969 0.529 0.310 scn 402.38 360.15 10.00 2.94 re f /sRGB cs 0.961 0.478 0.286 scn 402.38 363.09 10.00 2.94 re f /sRGB cs 0.957 0.427 0.263 scn 402.38 366.03 10.00 2.94 re f /sRGB cs 0.933 0.376 0.239 scn 402.38 368.97 10.00 2.94 re f /sRGB cs 0.910 0.329 0.216 scn 402.38 371.91 10.00 2.94 re f /sRGB cs 0.886 0.282 0.196 scn 402.38 374.85 10.00 2.94 re f /sRGB cs 0.863 0.235 0.173 scn 402.38 377.80 10.00 2.94 re f /sRGB cs 0.843 0.188 0.153 scn 402.38 380.74 10.00 2.94 re f /sRGB cs 0.800 0.149 0.149 scn 402.38 383.68 10.00 2.94 re f /sRGB cs 0.765 0.110 0.149 scn 402.38 386.62 10.00 2.94 re f /sRGB cs 0.725 0.075 0.149 scn 402.38 389.56 10.00 2.94 re f /sRGB cs 0.686 0.035 0.149 scn 402.38 392.50 10.00 2.94 re f /sRGB cs 0.647 0.000 0.149 scn 402.38 395.44 10.00 2.94 re f BT /sRGB cs 0.000 0.000 0.000 scn /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 244.79 Tm (0) Tj ET BT /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 274.79 Tm (0.2) Tj ET BT /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 304.79 Tm (0.4) Tj ET BT /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 334.79 Tm (0.6) Tj ET BT /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 364.79 Tm (0.8) Tj ET BT /F2 1 Tf 10.00 0.00 -0.00 10.00 414.38 394.79 Tm (1) Tj ET Q q Q q Q q BT /sRGB cs 0.000 0.000 0.000 scn /F3 1 Tf 12.00 0.00 -0.00 12.00 166.34 485.38 Tm (Consensus matrix) Tj ET Q q Q q Q q Q endstream endobj 9 0 obj 68611 endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 503] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /N 3 /Alternate /DeviceRGB /Length 9433 /Filter /ASCIIHexDecode >> stream 00 00 0c 48 4c 69 6e 6f 02 10 00 00 6d 6e 74 72 52 47 42 20 58 59 5a 20 07 ce 00 02 00 09 00 06 00 31 00 00 61 63 73 70 4d 53 46 54 00 00 00 00 49 45 43 20 73 52 47 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f6 d6 00 01 00 00 00 00 d3 2d 48 50 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 63 70 72 74 00 00 01 50 00 00 00 33 64 65 73 63 00 00 01 84 00 00 00 6c 77 74 70 74 00 00 01 f0 00 00 00 14 62 6b 70 74 00 00 02 04 00 00 00 14 72 58 59 5a 00 00 02 18 00 00 00 14 67 58 59 5a 00 00 02 2c 00 00 00 14 62 58 59 5a 00 00 02 40 00 00 00 14 64 6d 6e 64 00 00 02 54 00 00 00 70 64 6d 64 64 00 00 02 c4 00 00 00 88 76 75 65 64 00 00 03 4c 00 00 00 86 76 69 65 77 00 00 03 d4 00 00 00 24 6c 75 6d 69 00 00 03 f8 00 00 00 14 6d 65 61 73 00 00 04 0c 00 00 00 24 74 65 63 68 00 00 04 30 00 00 00 0c 72 54 52 43 00 00 04 3c 00 00 08 0c 67 54 52 43 00 00 04 3c 00 00 08 0c 62 54 52 43 00 00 04 3c 00 00 08 0c 74 65 78 74 00 00 00 00 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39 38 20 48 65 77 6c 65 74 74 2d 50 61 63 6b 61 72 64 20 43 6f 6d 70 61 6e 79 00 00 64 65 73 63 00 00 00 00 00 00 00 12 73 52 47 42 20 49 45 43 36 31 39 36 36 2d 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 12 73 52 47 42 20 49 45 43 36 31 39 36 36 2d 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 58 59 5a 20 00 00 00 00 00 00 f3 51 00 01 00 00 00 01 16 cc 58 59 5a 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 58 59 5a 20 00 00 00 00 00 00 6f a2 00 00 38 f5 00 00 03 90 58 59 5a 20 00 00 00 00 00 00 62 99 00 00 b7 85 00 00 18 da 58 59 5a 20 00 00 00 00 00 00 24 a0 00 00 0f 84 00 00 b6 cf 64 65 73 63 00 00 00 00 00 00 00 16 49 45 43 20 68 74 74 70 3a 2f 2f 77 77 77 2e 69 65 63 2e 63 68 00 00 00 00 00 00 00 00 00 00 00 16 49 45 43 20 68 74 74 70 3a 2f 2f 77 77 77 2e 69 65 63 2e 63 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 65 73 63 00 00 00 00 00 00 00 2e 49 45 43 20 36 31 39 36 36 2d 32 2e 31 20 44 65 66 61 75 6c 74 20 52 47 42 20 63 6f 6c 6f 75 72 20 73 70 61 63 65 20 2d 20 73 52 47 42 00 00 00 00 00 00 00 00 00 00 00 2e 49 45 43 20 36 31 39 36 36 2d 32 2e 31 20 44 65 66 61 75 6c 74 20 52 47 42 20 63 6f 6c 6f 75 72 20 73 70 61 63 65 20 2d 20 73 52 47 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 65 73 63 00 00 00 00 00 00 00 2c 52 65 66 65 72 65 6e 63 65 20 56 69 65 77 69 6e 67 20 43 6f 6e 64 69 74 69 6f 6e 20 69 6e 20 49 45 43 36 31 39 36 36 2d 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 2c 52 65 66 65 72 65 6e 63 65 20 56 69 65 77 69 6e 67 20 43 6f 6e 64 69 74 69 6f 6e 20 69 6e 20 49 45 43 36 31 39 36 36 2d 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 69 65 77 00 00 00 00 00 13 a4 fe 00 14 5f 2e 00 10 cf 14 00 03 ed cc 00 04 13 0b 00 03 5c 9e 00 00 00 01 58 59 5a 20 00 00 00 00 00 4c 09 56 00 50 00 00 00 57 1f e7 6d 65 61 73 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 8f 00 00 00 02 73 69 67 20 00 00 00 00 43 52 54 20 63 75 72 76 00 00 00 00 00 00 04 00 00 00 00 05 00 0a 00 0f 00 14 00 19 00 1e 00 23 00 28 00 2d 00 32 00 37 00 3b 00 40 00 45 00 4a 00 4f 00 54 00 59 00 5e 00 63 00 68 00 6d 00 72 00 77 00 7c 00 81 00 86 00 8b 00 90 00 95 00 9a 00 9f 00 a4 00 a9 00 ae 00 b2 00 b7 00 bc 00 c1 00 c6 00 cb 00 d0 00 d5 00 db 00 e0 00 e5 00 eb 00 f0 00 f6 00 fb 01 01 01 07 01 0d 01 13 01 19 01 1f 01 25 01 2b 01 32 01 38 01 3e 01 45 01 4c 01 52 01 59 01 60 01 67 01 6e 01 75 01 7c 01 83 01 8b 01 92 01 9a 01 a1 01 a9 01 b1 01 b9 01 c1 01 c9 01 d1 01 d9 01 e1 01 e9 01 f2 01 fa 02 03 02 0c 02 14 02 1d 02 26 02 2f 02 38 02 41 02 4b 02 54 02 5d 02 67 02 71 02 7a 02 84 02 8e 02 98 02 a2 02 ac 02 b6 02 c1 02 cb 02 d5 02 e0 02 eb 02 f5 03 00 03 0b 03 16 03 21 03 2d 03 38 03 43 03 4f 03 5a 03 66 03 72 03 7e 03 8a 03 96 03 a2 03 ae 03 ba 03 c7 03 d3 03 e0 03 ec 03 f9 04 06 04 13 04 20 04 2d 04 3b 04 48 04 55 04 63 04 71 04 7e 04 8c 04 9a 04 a8 04 b6 04 c4 04 d3 04 e1 04 f0 04 fe 05 0d 05 1c 05 2b 05 3a 05 49 05 58 05 67 05 77 05 86 05 96 05 a6 05 b5 05 c5 05 d5 05 e5 05 f6 06 06 06 16 06 27 06 37 06 48 06 59 06 6a 06 7b 06 8c 06 9d 06 af 06 c0 06 d1 06 e3 06 f5 07 07 07 19 07 2b 07 3d 07 4f 07 61 07 74 07 86 07 99 07 ac 07 bf 07 d2 07 e5 07 f8 08 0b 08 1f 08 32 08 46 08 5a 08 6e 08 82 08 96 08 aa 08 be 08 d2 08 e7 08 fb 09 10 09 25 09 3a 09 4f 09 64 09 79 09 8f 09 a4 09 ba 09 cf 09 e5 09 fb 0a 11 0a 27 0a 3d 0a 54 0a 6a 0a 81 0a 98 0a ae 0a c5 0a dc 0a f3 0b 0b 0b 22 0b 39 0b 51 0b 69 0b 80 0b 98 0b b0 0b c8 0b e1 0b f9 0c 12 0c 2a 0c 43 0c 5c 0c 75 0c 8e 0c a7 0c c0 0c d9 0c f3 0d 0d 0d 26 0d 40 0d 5a 0d 74 0d 8e 0d a9 0d c3 0d de 0d f8 0e 13 0e 2e 0e 49 0e 64 0e 7f 0e 9b 0e b6 0e d2 0e ee 0f 09 0f 25 0f 41 0f 5e 0f 7a 0f 96 0f b3 0f cf 0f ec 10 09 10 26 10 43 10 61 10 7e 10 9b 10 b9 10 d7 10 f5 11 13 11 31 11 4f 11 6d 11 8c 11 aa 11 c9 11 e8 12 07 12 26 12 45 12 64 12 84 12 a3 12 c3 12 e3 13 03 13 23 13 43 13 63 13 83 13 a4 13 c5 13 e5 14 06 14 27 14 49 14 6a 14 8b 14 ad 14 ce 14 f0 15 12 15 34 15 56 15 78 15 9b 15 bd 15 e0 16 03 16 26 16 49 16 6c 16 8f 16 b2 16 d6 16 fa 17 1d 17 41 17 65 17 89 17 ae 17 d2 17 f7 18 1b 18 40 18 65 18 8a 18 af 18 d5 18 fa 19 20 19 45 19 6b 19 91 19 b7 19 dd 1a 04 1a 2a 1a 51 1a 77 1a 9e 1a c5 1a ec 1b 14 1b 3b 1b 63 1b 8a 1b b2 1b da 1c 02 1c 2a 1c 52 1c 7b 1c a3 1c cc 1c f5 1d 1e 1d 47 1d 70 1d 99 1d c3 1d ec 1e 16 1e 40 1e 6a 1e 94 1e be 1e e9 1f 13 1f 3e 1f 69 1f 94 1f bf 1f ea 20 15 20 41 20 6c 20 98 20 c4 20 f0 21 1c 21 48 21 75 21 a1 21 ce 21 fb 22 27 22 55 22 82 22 af 22 dd 23 0a 23 38 23 66 23 94 23 c2 23 f0 24 1f 24 4d 24 7c 24 ab 24 da 25 09 25 38 25 68 25 97 25 c7 25 f7 26 27 26 57 26 87 26 b7 26 e8 27 18 27 49 27 7a 27 ab 27 dc 28 0d 28 3f 28 71 28 a2 28 d4 29 06 29 38 29 6b 29 9d 29 d0 2a 02 2a 35 2a 68 2a 9b 2a cf 2b 02 2b 36 2b 69 2b 9d 2b d1 2c 05 2c 39 2c 6e 2c a2 2c d7 2d 0c 2d 41 2d 76 2d ab 2d e1 2e 16 2e 4c 2e 82 2e b7 2e ee 2f 24 2f 5a 2f 91 2f c7 2f fe 30 35 30 6c 30 a4 30 db 31 12 31 4a 31 82 31 ba 31 f2 32 2a 32 63 32 9b 32 d4 33 0d 33 46 33 7f 33 b8 33 f1 34 2b 34 65 34 9e 34 d8 35 13 35 4d 35 87 35 c2 35 fd 36 37 36 72 36 ae 36 e9 37 24 37 60 37 9c 37 d7 38 14 38 50 38 8c 38 c8 39 05 39 42 39 7f 39 bc 39 f9 3a 36 3a 74 3a b2 3a ef 3b 2d 3b 6b 3b aa 3b e8 3c 27 3c 65 3c a4 3c e3 3d 22 3d 61 3d a1 3d e0 3e 20 3e 60 3e a0 3e e0 3f 21 3f 61 3f a2 3f e2 40 23 40 64 40 a6 40 e7 41 29 41 6a 41 ac 41 ee 42 30 42 72 42 b5 42 f7 43 3a 43 7d 43 c0 44 03 44 47 44 8a 44 ce 45 12 45 55 45 9a 45 de 46 22 46 67 46 ab 46 f0 47 35 47 7b 47 c0 48 05 48 4b 48 91 48 d7 49 1d 49 63 49 a9 49 f0 4a 37 4a 7d 4a c4 4b 0c 4b 53 4b 9a 4b e2 4c 2a 4c 72 4c ba 4d 02 4d 4a 4d 93 4d dc 4e 25 4e 6e 4e b7 4f 00 4f 49 4f 93 4f dd 50 27 50 71 50 bb 51 06 51 50 51 9b 51 e6 52 31 52 7c 52 c7 53 13 53 5f 53 aa 53 f6 54 42 54 8f 54 db 55 28 55 75 55 c2 56 0f 56 5c 56 a9 56 f7 57 44 57 92 57 e0 58 2f 58 7d 58 cb 59 1a 59 69 59 b8 5a 07 5a 56 5a a6 5a f5 5b 45 5b 95 5b e5 5c 35 5c 86 5c d6 5d 27 5d 78 5d c9 5e 1a 5e 6c 5e bd 5f 0f 5f 61 5f b3 60 05 60 57 60 aa 60 fc 61 4f 61 a2 61 f5 62 49 62 9c 62 f0 63 43 63 97 63 eb 64 40 64 94 64 e9 65 3d 65 92 65 e7 66 3d 66 92 66 e8 67 3d 67 93 67 e9 68 3f 68 96 68 ec 69 43 69 9a 69 f1 6a 48 6a 9f 6a f7 6b 4f 6b a7 6b ff 6c 57 6c af 6d 08 6d 60 6d b9 6e 12 6e 6b 6e c4 6f 1e 6f 78 6f d1 70 2b 70 86 70 e0 71 3a 71 95 71 f0 72 4b 72 a6 73 01 73 5d 73 b8 74 14 74 70 74 cc 75 28 75 85 75 e1 76 3e 76 9b 76 f8 77 56 77 b3 78 11 78 6e 78 cc 79 2a 79 89 79 e7 7a 46 7a a5 7b 04 7b 63 7b c2 7c 21 7c 81 7c e1 7d 41 7d a1 7e 01 7e 62 7e c2 7f 23 7f 84 7f e5 80 47 80 a8 81 0a 81 6b 81 cd 82 30 82 92 82 f4 83 57 83 ba 84 1d 84 80 84 e3 85 47 85 ab 86 0e 86 72 86 d7 87 3b 87 9f 88 04 88 69 88 ce 89 33 89 99 89 fe 8a 64 8a ca 8b 30 8b 96 8b fc 8c 63 8c ca 8d 31 8d 98 8d ff 8e 66 8e ce 8f 36 8f 9e 90 06 90 6e 90 d6 91 3f 91 a8 92 11 92 7a 92 e3 93 4d 93 b6 94 20 94 8a 94 f4 95 5f 95 c9 96 34 96 9f 97 0a 97 75 97 e0 98 4c 98 b8 99 24 99 90 99 fc 9a 68 9a d5 9b 42 9b af 9c 1c 9c 89 9c f7 9d 64 9d d2 9e 40 9e ae 9f 1d 9f 8b 9f fa a0 69 a0 d8 a1 47 a1 b6 a2 26 a2 96 a3 06 a3 76 a3 e6 a4 56 a4 c7 a5 38 a5 a9 a6 1a a6 8b a6 fd a7 6e a7 e0 a8 52 a8 c4 a9 37 a9 a9 aa 1c aa 8f ab 02 ab 75 ab e9 ac 5c ac d0 ad 44 ad b8 ae 2d ae a1 af 16 af 8b b0 00 b0 75 b0 ea b1 60 b1 d6 b2 4b b2 c2 b3 38 b3 ae b4 25 b4 9c b5 13 b5 8a b6 01 b6 79 b6 f0 b7 68 b7 e0 b8 59 b8 d1 b9 4a b9 c2 ba 3b ba b5 bb 2e bb a7 bc 21 bc 9b bd 15 bd 8f be 0a be 84 be ff bf 7a bf f5 c0 70 c0 ec c1 67 c1 e3 c2 5f c2 db c3 58 c3 d4 c4 51 c4 ce c5 4b c5 c8 c6 46 c6 c3 c7 41 c7 bf c8 3d c8 bc c9 3a c9 b9 ca 38 ca b7 cb 36 cb b6 cc 35 cc b5 cd 35 cd b5 ce 36 ce b6 cf 37 cf b8 d0 39 d0 ba d1 3c d1 be d2 3f d2 c1 d3 44 d3 c6 d4 49 d4 cb d5 4e d5 d1 d6 55 d6 d8 d7 5c d7 e0 d8 64 d8 e8 d9 6c d9 f1 da 76 da fb db 80 dc 05 dc 8a dd 10 dd 96 de 1c de a2 df 29 df af e0 36 e0 bd e1 44 e1 cc e2 53 e2 db e3 63 e3 eb e4 73 e4 fc e5 84 e6 0d e6 96 e7 1f e7 a9 e8 32 e8 bc e9 46 e9 d0 ea 5b ea e5 eb 70 eb fb ec 86 ed 11 ed 9c ee 28 ee b4 ef 40 ef cc f0 58 f0 e5 f1 72 f1 ff f2 8c f3 19 f3 a7 f4 34 f4 c2 f5 50 f5 de f6 6d f6 fb f7 8a f8 19 f8 a8 f9 38 f9 c7 fa 57 fa e7 fb 77 fc 07 fc 98 fd 29 fd ba fe 4b fe dc ff 6d ff ff > endstream endobj 10 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 10 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 10 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000068977 00000 n 0000069060 00000 n 0000069183 00000 n 0000069216 00000 n 0000000213 00000 n 0000000293 00000 n 0000068956 00000 n 0000078752 00000 n 0000079010 00000 n 0000079108 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 79211 %%EOF NMF/vignettes/heatmaps.Rnw0000644000176200001440000004470414334451255015213 0ustar liggesusers%\VignetteIndexEntry{NMF: generating heatmaps} %\VignetteDepends{utils,NMF,RColorBrewer,knitr} %\VignetteKeyword{aplot} %\VignetteCompiler{knitr} %\VignetteEngine{knitr::knitr} \documentclass[a4paper]{article} %\usepackage[OT1]{fontenc} \usepackage[colorlinks]{hyperref} \usepackage{a4wide} \usepackage{xspace} \usepackage[all]{hypcap} % for linking to the top of the figures or tables % add preamble from pkgmaker <>= library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") @ \newcommand{\nmfpack}{\pkgname{NMF}} \newcommand{\MATLAB}{MATLAB\textsuperscript{\textregistered}\xspace} \newcommand{\refeqn}[1]{(\ref{#1})} % REFERENCES \usepackage[citestyle=authoryear-icomp , doi=true , url=true , maxnames=1 , maxbibnames=15 , backref=true , backend=bibtex]{biblatex} \AtEveryCitekey{\clearfield{url}} <>= latex_bibliography('NMF') @ \newcommand{\citet}[1]{\textcite{#1}} \renewcommand{\cite}[1]{\parencite{#1}} \DefineBibliographyStrings{english}{% backrefpage = {see p.}, % for single page number backrefpages = {see pp.} % for multiple page numbers } % % boxed figures \usepackage{float} \floatstyle{boxed} \restylefloat{figure} \usepackage{array} \usepackage{tabularx} \usepackage{mathabx} \usepackage{url} \urlstyle{rm} % use cleveref for automatic reference label formatting \usepackage[capitalise, noabbrev]{cleveref} % define commands for notes \usepackage{todonotes} \newcommand{\nbnote}[1]{\ \bigskip\todo[inline, backgroundcolor=blue!20!white]{\scriptsize\textsf{\textbf{NB:} #1}}\ \\} % put table of contents on two columns \usepackage[toc]{multitoc} \setkeys{Gin}{width=0.95\textwidth} \begin{document} <>= #options(prompt=' ') #options(continue=' ') set.seed(123456) @ \title{Generating heatmaps for Nonnegative Matrix Factorization\\ \small Package \nmfpack\ - Version \Sexpr{utils::packageVersion('NMF')}} \author{Renaud Gaujoux} \maketitle \begin{abstract} This vignette describes how to produce different informative heatmaps from NMF objects, such as returned by the function \code{nmf} in the \citeCRANpkg{NMF}. The main drawing engine is implemented by the function \code{aheatmap}, which is a highly enhanced modification of the function \code{pheatmap} from the \CRANpkg{pheatmap}, and provides convenient and quick ways of producing high quality and customizable annotated heatmaps. Currently this function is part of the package \nmfpack, but may eventually compose a separate package on its own. \end{abstract} {\small \tableofcontents} \section{Preliminaries} \subsection{Quick reminder on NMF models} Given a nonnegative target matrix $X$ of dimension $n\times p$, NMF algorithms aim at finding a rank $k$ approximation of the form: $$ X \approx W H, $$ where $W$ and $H$ are nonnegative matrices of dimensions $n\times k$ and $k\times p$ respectively. The matrix $W$ is the basis matrix, whose columns are the basis components. The matrix $H$ is the mixture coefficient or weight matrix, whose columns contain the contribution of each basis component to the corresponding column of $X$. We call the rows of $H$ the basis profiles. \subsection{Heatmaps for NMF} Because NMF objects essentially wrap up a pair of matrices, heatmaps are convenient to visualise the results of NMF runs. The package \nmfpack provides several specialised heatmap functions, designed to produce heatmaps with sensible default configurations according to the data being drawn. Being all based on a common drawing engine, they share almost identical interfaces and capabilities. The following specialised functions are currently implemented: \begin{description} \item[\code{basismap}] draws heatmaps of the basis matrix \item[\code{coefmap}] draws heatmaps of the mixture coefficient matrix \item[\code{consensusmap}] draws heatmaps of the consensus matrix, for results of multiple NMF runs. \end{description} \subsection{Heatmap engine} All the above functions eventually call a common heatmap engine, with different default parameters, chosen to be relevant for the given underlying data. The engine is implemented by the function \code{aheatmap}. Its development started as modification of the function \code{pheatmap} from the \pkgname{pheatmap} package. The initial objective was to improve and increase its capabilities, as well as defining a simplified interface, more consistent with the R core function \code{heatmap}. We eventually aim at providing a general, flexible, powerful and easy to use engine for drawing annotated heatmaps. The function \code{aheatmap} has many advantages compared to other heatmap functions such as \code{heatmap}, \code{gplots::heatmap2}, \code{heatmap.plus::heatmap.plus} , or even \code{pheatmap}: \begin{itemize} \item Annotations: unlimited number of annotation tracks can be added to \emph{both} columns and rows, with automated colouring for categorical and numeric variables. \item Compatibility with both base and grid graphics: the function can be directly called in drawing contexts such as grid, mfrow or layout. This is a feature many R users were looking for, and that was strictly impossible with base heatmaps. \item Legends: default automatic legend and colouring; \item Customisation: clustering methods, annotations, colours and legend can all be customised, even separately for rows and columns; \item Convenient interface: many arguments provide multiple ways of specifying their value(s), which speeds up developping/writing and reduce the amount of code required to generate customised plots (e.g. see \cref{sec:colour_spec}). \item Aesthetics: the heatmaps look globally cleaner, the image and text components are by default well proportioned relatively to each other, and all fit within the graphic device. \end{itemize} \subsection{Data and model} \label{sec:data} For the purpose of illustrating the use of each heatmap function, we generate a random target matrix, as well as some annotations or covariates: <>= # random data that follow an 3-rank NMF model (with quite some noise: sd=2) X <- syntheticNMF(100, 3, 20, noise=2, factors = TRUE) Xmat <- X[[1]] # row annotations and covariates n <- nrow(Xmat) d <- rnorm(n) e <- unlist(mapply(rep, c('X', 'Y', 'Z'), 10)) e <- c(e, rep(NA, n-length(e))) rdata <- data.frame(Var=d, Type=e) # column annotations and covariates p <- ncol(Xmat) a <- sample(c('alpha', 'beta', 'gamma'), p, replace=TRUE) # define covariates: true groups and some numeric variable c <- rnorm(p) # gather them in a data.frame covariates <- data.frame(a, X$pData, c) @ %\SweaveOpts{fig.width=14,fig.height=7} <>= library(knitr) opts_chunk$set(fig.width=14, fig.height=7) @ Note that in the code above, the object \code{X} returned by \code{syntheticNMF} \emph{really is} a matrix object, but wrapped through the function \code{ExposedAttribute} object, which exposes its attributes via a more friendly and access controlled interface \code{\$}. Of particular interests are attributes \code{'pData'} and \code{'fData'}, which are lists that contain a factor named \code{'Group'} that indicates the true underlying clusters. These are respectively defined as each sample's most contrbuting basis component and the basis component to which each feature contributes the most. They are useful to annotate heatmaps and assess the ability of NMF methods to recover the true clusters. As an example, one can conveniently visualize the target matrix as a heatmap, with or without the relevant sample and feature annotations, using simple calls to the \code{aheatmap} function: <>= par(mfrow=c(1,2)) aheatmap(Xmat, annCol=covariates, annRow=X$fData) aheatmap(Xmat) @ Then, we fit an NMF model using multiple runs, that will be used throughtout this vignette to illustrate the use of NMF heatmaps: <>= res <- nmf(Xmat, 3, nrun=10) res @ \nbnote{To keep the vignette simple, we always use the default NMF method (i.e. \code{'brunet'}), but all steps could be performed using a different method, or multiple methods in order to compare their perfromances.} \section{Mixture Coefficient matrix: \texttt{coefmap}} The coefficient matrix of the result can be plotted using the function \code{coefmap}. The default behaviour for multiple NMF runs is to add two annotation tracks that show the clusters obtained by the best fit and the hierarchical clustering of the consensus matrix\footnote{The hierarchical clustering is computed using the consensus matrix itself as a similarity measure, and average linkage. See \code{?consensushc}.}. In the legend, these tracks are named \emph{basis} and \emph{consensus} respectively. For single NMF run or NMF model objects, no consensus data are available, and only the clusters from the fit are displayed. <>= opar <- par(mfrow=c(1,2)) # coefmap from multiple run fit: includes a consensus track coefmap(res) # coefmap of a single run fit: no consensus track coefmap(minfit(res)) par(opar) @ \nbnote{Note how both heatmaps were drawn on the same plot, simply using the standard call to \code{par(mfrow=c(1,2)}. This is impossible to achieve with the R core function \code{heatmap}. See \cref{sec:aheatmap} for more details about compatibility with base and grid graphics.} By default: \begin{itemize} \item the rows are not ordered; \item the columns use the default ordering of \code{aheatmap}, but may easily be ordered according to the clusters defined by the dominant basis component for each column with \code{Colv="basis"}, or according to those implied by the consensus matrix, i.e. as in \code{consensusmap}, with \code{Colv="consensus"}; \item each column is scaled to sum up to one; \item the color palette used is \code{'YlOrRd'} from the \citeCRANpkg{RColorBrewer}, with 50 breaks. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= Rowv = NA Colv = TRUE scale = 'c1' color = 'YlOrRd:50' annCol = predict(object) + predict(object, 'consensus') @ If the ordering does not come from a hierarchical clustering (e.g., if \code{Colv='basis'}), then no dendrogram is displayed. The default behaviour of \code{aheatmap} can be obtained by setting arguments \code{Rowv=TRUE, Colv=TRUE, scale='none'}. \medskip The automatic annotation tracks can be hidden all together by setting argument \code{tracks=NA}, displayed separately by passing only one of the given names (e.g. \code{tracks=':basis'} or \code{tracks='basis:'} for the row or column respectively), and their legend names may be changed by specifying e.g. \code{tracks=c(Metagene=':basis', 'consensus')}. Beside this, they are handled by the heatmap engine function \code{aheatmap} and can be customised as any other annotation tracks -- that can be added via the same argument \code{annCol} (see \cref{sec:aheatmap} or \code{?aheatmap} for more details). <>= opar <- par(mfrow=c(1,2)) # removing all automatic annotation tracks coefmap(res, tracks=NA) # customized plot coefmap(res, Colv = 'euclidean' , main = "Metagene contributions in each sample", labCol = NULL , annRow = list(Metagene=':basis'), annCol = list(':basis', Class=a, Index=c) , annColors = list(Metagene='Set2') , info = TRUE) par(opar) @ \nbnote{The feature that allows to display some information about the fit at the bottom of the plot via argument \code{info=TRUE} is still experimental. It is helpful mostly when developing algorithms or doing an analysis, but would seldom be used in publications.} \section{Basis matrix: \texttt{basismap}} The basis matrix can be plotted using the function \code{basismap}. The default behaviour is to add an annotation track that shows for each row the dominant basis component. That is, for each row, the index of the basis component with the highest loading. This track can be disabled by setting \code{tracks=NA}, and extra row annotations can be added using the same argument \code{annRow}. <>= opar <- par(mfrow=c(1,2)) # default plot basismap(res) # customized plot: only use row special annotation track. basismap(res, main="Metagenes", annRow=list(d, e), tracks=c(Metagene=':basis')) par(opar) @ By default: \begin{itemize} \item the columns are not ordered; \item the rows are ordered by hierarchical clustering using default distance and linkage methods (\code{'eculidean'} and \code{'complete'}); \item each row is scaled to sum up to one; \item the color palette used is \code{'YlOrRd'} from the \citeCRANpkg{RColorBrewer}, with 50 breaks. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= Colv = NA scale = 'r1' color = 'YlOrRd:50' annRow = predict(object, 'features') @ \section{Consensus matrix: \texttt{consensusmap}} When doing clustering with NMF, a common way of assessing the stability of the clusters obtained for a given rank is to consider the consensus matrix computed over multiple independent NMF runs, which is the average of the connectivity matrices of each separate run \footnote{Hence, stability here means robustness with regards to the initial starting point, and shall not be interpreted as in e.g. cross-validation/bootstrap analysis. However, one can argue that having very consistent clusters across runs somehow supports for a certain regularity or the presence of an underlying pattern in the data.}. This procedure is usually repeated over a certain range of factorization ranks, and the results are compared to identify which rank gives the best clusters, possibly in the light of some extra knowledge one could have about the samples (e.g. covariates). The functions \code{nmf} and \code{consensusmap} make it easy to implement this whole process. \nbnote{The consensus plots can also be generated for fits obtained from single NMF runs, in which case the consensus matrix simply reduces to a single connectivity matrix. This is a binary matrix (i.e. entries are either 0 or 1), that will always produce a bi-colour heatmap, and by default clear blocks for each cluster.} \subsection{Single fit} In section \cref{sec:data}, the NMF fit \code{res} was computed with argument \code{nrun=10}, and therefore contains the best fit over 10 runs, as well as the consensus matrix computed over all the runs \footnote{If one were interested in keeping the fits from all the runs, the function \code{nmf} should have been called with argument \code{.options='k'}. See section \emph{Options} in \code{?nmf}. The downstream hanlding of the result would remain identical.}. This can be ploted using the function \code{consensusmap}, which allows for the same kind of customization as the other NMF heatmap functions: <>= opar <- par(mfrow=c(1,2)) # default plot consensusmap(res) # customized plot consensusmap(res, annCol=covariates, annColors=list(c='blue') , labCol='sample ', main='Cluster stability' , sub='Consensus matrix and all covariates') par(opar) @ By default: \begin{itemize} \item the rows and columns of the consensus heatmap are symmetrically ordered by hierarchical clustering using the consensus matrix as a similarity measure and average linkage, and the associated dendrogram is displayed; \item the color palette used is the reverse of \code{'RdYlBu'} from the \citeCRANpkg{RColorBrewer}. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= distfun = function(x) as.dist(1-x) # x being the consensus matrix hclustfun = 'average' Rowv = TRUE Colv = "Rowv" color = '-RdYlBu' @ \subsection{Single method over a range of ranks} The function \code{nmf} accepts a range of value for the rank (argument \code{rank}), making it fit NMF models for each value in the given range \footnote{Before version 0.6, this feature was provided by the function \code{nmfEstimateRank}. From version 0.6, the function \code{nmf} accepts ranges of ranks, and internally calls the function \code{nmfEstimateRank} -- that remains exported and can still be called directly. See documentation \code{?nmfEstimateRank} for more details on the returned value.}: <>= res2_7 <- nmf(Xmat, 2:7, nrun=10, .options='v') class(res2_7) @ The result \code{res2\_7} is an S3 object of class \code{'NMF.rank'}, that contains -- amongst other data -- a list of the best fits obtained for each value of the rank in range $\ldbrack 2, 7\rdbrack]$. The method of \code{consensusmap} defined for class \code{'NMF.rank'}, which plots all the consensus matrices on the same plot: <>= consensusmap(res2_7) @ \nbnote{ The main title of each consensus heatmap can be customized by passing to argument \code{main} a character vector or a list whose elements specify each title. All other arguments are used in each internal call to consensusmap, and will therefore affect all the plots simultaneously. The layout can be specified via argument \code{layout} as a numeric vector giving the number of rows and columns in a \code{mfrow}-like way, or as a matrix that will be passed to R core function \code{layout}. See \code{?consensusmap} for more details and example code. } \subsection{Single rank over a range of methods} If one is interested in comparing methods, for a given factorization rank, then on can fit an NMF model for each method by providing the function \code{nmf} with a \code{list} in argument \code{method}: <>= res_methods <- nmf(Xmat, 3, list('lee', 'brunet', 'nsNMF'), nrun=10) class(res_methods) @ The result \code{res\_methods} is an S4 object of class \code{NMFList}, which is essentially a named list, that contains each fits and the CPU time required by the whole computation. As previously, the sequence of consensus matrices is plotted with \code{consensusmap}: <>= consensusmap(res_methods) @ \section{Generic heatmap engine: \texttt{aheatmap}} \label{sec:aheatmap} This section still needs to be written, but many examples of annotated heatmaps can be found in the demos \code{'aheatmap'} and \code{'heatmaps'}: <>= demo('aheatmap') # or demo('heatmaps') @ These demos and the plots they generate can also be browsed online at \url{http://nmf.r-forge.r-project.org/_DEMOS.html}. \section{Session Info} <>= toLatex(sessionInfo()) @ \printbibliography[heading=bibintoc] \end{document} NMF/vignettes/src/0000755000176200001440000000000014333156273013500 5ustar liggesusersNMF/vignettes/src/bmc.R0000644000176200001440000000250614333176413014365 0ustar liggesusers# Scripts runs to produce the figures in the BMC paper # # Author: renaud ############################################################################### # install and load NMF package lib.dir <- 'lib' dir.create(lib.dir, showWarnings=FALSE) install.packages('NMF_0.1.tar.gz', repos=NULL, lib=lib.dir) library(NMF, lib=lib.dir) # define a seed .seed <- 123456 # load Golub data if(!requireNamespace("Biobase")) BiocManager::install("Biobase") data(esGolub) #esGolub <- syntheticNMF(500, 3, 20, noise=TRUE) # estimate rank for Golub dataset rank.nrun <- 50 rank.range <- seq(2,6) res.estimate <- nmfEstimateRank(esGolub, rank.range, method='brunet' , nrun=rank.nrun, conf.interval=TRUE, seed=.seed) save(res.estimate, file='res.estimate.rda') # Full run of Brunet algorithm nmf.nrun <- 200 res.brunet <- nmf(esGolub, 3, 'brunet', nrun=nmf.nrun, seed=.seed, .options='tv') save(res.brunet, file='res.brunet.rda') # Comparison of methods res.comp <- nmf(esGolub, 3, list('brunet', 'lee', 'ns', 'lnmf'), seed='nndsvd', .options='tv') save(res.comp, file='res.comp.rda') # save all in one file save(res.estimate, res.brunet, res.comp, file='res.bmc.rda') if( FALSE ){ # generate plots png('consensus.png') metaHeatmap(res.brunet, class=esGolub$Cell) dev.off() png('metagenes.png') metaHeatmap(fit(res.brunet), class=esGolub$Cell) dev.off() }NMF/vignettes/.install_extras0000644000176200001440000000001514333176413015740 0ustar liggesusersconsensus.pdfNMF/vignettes/NMF-vignette.Rnw0000644000176200001440000016515314334457640015662 0ustar liggesusers%\VignetteIndexEntry{An introduction to the package NMF} %\VignetteDepends{utils,NMF,Biobase,bigmemory,xtable,RColorBrewer,knitr} %\VignetteKeyword{math} %\VignetteCompiler{knitr} %\VignetteEngine{knitr::knitr} \documentclass[a4paper]{article} %\usepackage[OT1]{fontenc} \usepackage[colorlinks]{hyperref} % for hyperlinks \usepackage{a4wide} \usepackage{xspace} \usepackage[all]{hypcap} % for linking to the top of the figures or tables % add preamble from pkgmaker <>= library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") @ \newcommand{\nmfpack}{\Rpkg{NMF}} \newcommand{\RcppOctave}{\textit{RcppOctave}\xspace} \newcommand{\matlab}{Matlab$^\circledR$\xspace} \newcommand{\MATLAB}{\matlab} \newcommand{\gauss}{GAUSS$^\circledR$\xspace} \newcommand{\graphwidth}{0.9\columnwidth} \newcommand{\refeqn}[1]{(\ref{#1})} % REFERENCES \usepackage[citestyle=authoryear-icomp , doi=true , url=true , maxnames=1 , maxbibnames=15 , backref=true , backend=bibtex]{biblatex} \AtEveryCitekey{\clearfield{url}} <>= latex_bibliography('NMF') @ \newcommand{\citet}[1]{\textcite{#1}} \renewcommand{\cite}[1]{\parencite{#1}} \DefineBibliographyStrings{english}{% backrefpage = {see p.}, % for single page number backrefpages = {see pp.} % for multiple page numbers } %% % boxed figures \usepackage{float} \floatstyle{boxed} \restylefloat{figure} \usepackage{array} \usepackage{tabularx} \usepackage{xcolor} \usepackage{url} \urlstyle{rm} <>= set.seed(123456) library(knitr) # Helper functions: hook_try <- function(before, options, envir){ .try_defined <- FALSE # remove hacked version of try if( !before ){ if( .try_defined && exists('try', envir = envir, inherits = FALSE) ){ remove(list = 'try', envir = envir) } .try_defined <<- FALSE return(invisible()) } if( !is.null(options$try) ){ # signal do.signal <- isFALSE(options$try) if( isManualVignette() && isTRUE(options$try) ){ do.signal <- TRUE } # define hacked version of try() .try <- try_message(do.signal) assign('try', .try, envir) .try_defined <<- TRUE } } chunkOutputHook <- function(name, hook, type = c('output', 'source', 'chunk')){ type <- match.arg(type) function(){ if( !requireNamespace('knitr', quietly = TRUE) ) stop("Package 'knitr' is required to setup knit hook '", name, "'") .hook_bkp <- NULL function(before, options, envir){ # do nothing if the option is not ON if( is.null(options[[name]]) ) return() # set/unset hook if( before ){ # store current hook function if( is.null(.hook_bkp) ) .hook_bkp <<- knitr::knit_hooks$get(type) # define hook wrapper hook_wrapper <- function(x, options){ res <- .hook_bkp(x, options) hook(res, options) } args <- list() args[[type]] <- hook_wrapper do.call(knitr::knit_hooks$set, args) }else{ args <- list() args[[type]] <- .hook_bkp do.call(knitr::knit_hooks$set, args) .hook_bkp <<- NULL } } } } hook_backspace <- chunkOutputHook('backspace', function(x, options){ if( !isTRUE(options$backspace) ) x str_bs(x) } ) str_bs <- function(x){ # remove leading backspaces x <- gsub("^\b+", "", x) # remove backspaces at beginning of line x <- gsub("\n\b+", '\n', x) while( length(grep('\b', x, fixed = TRUE)) ) x <- gsub('[^\n\b][\b]', '', x) x } isManualVignette <- function(){ isTRUE(getOption('R_RUNNING_MANUAL_VIGNETTE')) } try_message <- function(signal = FALSE){ function(expr){ tryCatch(expr, error = function(e){ if( signal ) message(e) else message('Error: ', conditionMessage(e)) invisible() }) } } knit_hooks$set(try = hook_try, backspace = hook_backspace()) @ % use cleveref for automatic reference label formatting \usepackage[capitalise, noabbrev]{cleveref} % multiple columns \usepackage{multicol} % define commands for notes \usepackage{todonotes} \newcommand{\nbnote}[1]{\todo[inline, backgroundcolor=blue!20!white]{\scriptsize\textsf{\textbf{NB:} #1}}\ \\} % default graphic width \setkeys{Gin}{width=0.95\textwidth} \begin{document} <>= # Load library(NMF) # limit number of cores used nmf.options(cores = 2) @ \title{An introduction to NMF package\\ \small Version \Sexpr{utils::packageVersion('NMF')}} \author{Renaud Gaujoux} % \\Address Computational Biology - University of Cape Town, South Africa, \maketitle This vignette presents the \citeCRANpkg{NMF}, which implements a framework for Nonnegative Matrix Factorization (NMF) algorithms in R \cite{R}. The objective is to provide an implementation of some standard algorithms, while allowing the user to easily implement new methods that integrate into a common framework, which facilitates analysis, result visualisation or performance benchmarking. If you use the package \nmfpack in your analysis and publications please cite: \bigskip \todo[inline, backgroundcolor=blue!10!white]{\fullcite{Rpackage:NMF}} Note that the \nmfpack includes several NMF algorithms, published by different authors. Please make sure to also cite the paper(s) associated with the algorithm(s) you used. Citations for those can be found in \cref{tab:algo} and in the dedicated help pages \code{?gedAlgorithm.}, e.g., \code{?gedAlgorithm.SNMF\_R}. \bigskip \paragraph{Installation:} The latest stable version of the package can be installed from any \href{http://cran.r-project.org}{CRAN} repository mirror: <>= # Install install.packages('NMF') # Load library(NMF) @ The \nmfpack is a project hosted on \emph{R-forge}\footnote{\url{https://r-forge.r-project.org/projects/nmf}}. The latest development version is available from \url{https://r-forge.r-project.org/R/?group_id=649} and may be installed from there\footnote{\code{install.packages("NMF", repos = "http://R-Forge.R-project.org")}}. \paragraph{Support:} UseRs interested in this package are encouraged to subscribe to the user mailing list (\href{https://lists.r-forge.r-project.org/mailman/listinfo/nmf-user}{nmf-user@lists.r-forge.r-project.org}), which is the preferred channel for enquiries, bug reports, feature requests, suggestions or NMF-related discussions. This will enable better tracking as well as fruitful community exchange. \paragraph{Important:} Note that some of the classes defined in the NMF package have gained new slots. If you need to load objects saved in versions prior 0.8.14 please use: <>= # eg., load from some RData file load('object.RData') # update class definition object <- nmfObject(object) @ \pagebreak \tableofcontents \pagebreak \section{Overview} \subsection{Package features} This section provides a quick overview of the \nmfpack package's features. \Cref{sec:usecase} provides more details, as well as sample code on how to actually perform common tasks in NMF analysis. <>= nalgo <- length(nmfAlgorithm()) nseed <- length(nmfSeed()) @ The \nmfpack package provides: \begin{itemize} \item \Sexpr{nalgo} built-in algorithms; \item \Sexpr{nseed} built-in seeding methods; \item Single interface to perform all algorithms, and combine them with the seeding methods; \item Provides a common framework to test, compare and develop NMF methods; \item Accept custom algorithms and seeding methods; \item Plotting utility functions to visualize and help in the interpretation of the results; \item Transparent parallel computations; \item Optimized and memory efficient C++ implementations of the standard algorithms; \item Optional layer for bioinformatics using BioConductor \cite{Gentleman2004}; \end{itemize} \subsection{Nonnegative Matrix Factorization} This section gives a formal definition for Nonnegative Matrix Factorization problems, and defines the notations used throughout the vignette. Let $X$ be a $n \times p$ non-negative matrix, (i.e with $x_{ij} \geq 0$, denoted $X \geq 0$), and $r > 0$ an integer. Non-negative Matrix Factorization (NMF) consists in finding an approximation \begin{equation} X \approx W H\ , \label{NMFstd} \end{equation} where $W, H$ are $n\times r$ and $r \times p$ non-negative matrices, respectively. In practice, the factorization rank $r$ is often chosen such that $r \ll \min(n, p)$. The objective behind this choice is to summarize and split the information contained in $X$ into $r$ factors: the columns of $W$. Depending on the application field, these factors are given different names: basis images, metagenes, source signals. In this vignette we equivalently and alternatively use the terms \emph{basis matrix} or \emph{metagenes} to refer to matrix $W$, and \emph{mixture coefficient matrix} and \emph{metagene expression profiles} to refer to matrix $H$. The main approach to NMF is to estimate matrices $W$ and $H$ as a local minimum: \begin{equation} \min_{W, H \geq 0}\ \underbrace{[D(X, WH) + R(W, H)]}_{=F(W,H)} \label{nmf_min} \end{equation} where \begin{itemize} \item $D$ is a loss function that measures the quality of the approximation. Common loss functions are based on either the Frobenius distance $$D: A,B\mapsto \frac{Tr(AB^t)}{2} = \frac{1}{2} \sum_{ij} (a_{ij} - b_{ij})^2,$$ or the Kullback-Leibler divergence. $$D: A,B\mapsto KL(A||B) = \sum_{i,j} a_{ij} \log \frac{a_{ij}}{b_{ij}} - a_{ij} + b_{ij}.$$ \item $R$ is an optional regularization function, defined to enforce desirable properties on matrices $W$ and $H$, such as smoothness or sparsity \cite{Cichocki2008}. \end{itemize} \subsection{Algorithms} NMF algorithms generally solve problem \refeqn{nmf_min} iteratively, by building a sequence of matrices $(W_k,H_k)$ that reduces at each step the value of the objective function $F$. Beside some variations in the specification of $F$, they also differ in the optimization techniques that are used to compute the updates for $(W_k,H_k)$. For reviews on NMF algorithms see \cite{Berry2007, Chu2004} and references therein. The \nmfpack package implements a number of published algorithms, and provides a general framework to implement other ones. \Cref{tab:algo} gives a short description of each one of the built-in algorithms: The built-in algorithms are listed or retrieved with function \code{nmfAlgorithm}. A given algorithm is retrieved by its name (a \code{character} key), that is partially matched against the list of available algorithms: <>= # list all available algorithms nmfAlgorithm() # retrieve a specific algorithm: 'brunet' nmfAlgorithm('brunet') # partial match is also fine identical(nmfAlgorithm('br'), nmfAlgorithm('brunet')) @ \begin{table}[h!t] \begin{tabularx}{\textwidth}{lX} \hline Key & Description\\ \hline \code{brunet} & Standard NMF. Based on Kullback-Leibler divergence, it uses simple multiplicative updates from \cite{Lee2001}, enhanced to avoid numerical underflow. \begin{eqnarray} H_{kj} & \leftarrow & H_{kj} \frac{\left( \sum_l \frac{W_{lk} V_{lj}}{(WH)_{lj}} \right)}{ \sum_l W_{lk} }\\ W_{ik} & \leftarrow & W_{ik} \frac{ \sum_l [H_{kl} A_{il} / (WH)_{il} ] }{\sum_l H_{kl} } \end{eqnarray} \textbf{Reference:} \cite{Brunet2004}\\ \hline % \code{lee} & Standard NMF. Based on euclidean distance, it uses simple multiplicative updates \begin{eqnarray} H_{kj} & \leftarrow & H_{kj} \frac{(W^T V)_{kj}}{(W^T W H)_{kj}}\\ W_{ik} & \leftarrow & W_{ik} \frac{(V H^T)_{ik}}{(W H H^T)_{ik}} \end{eqnarray} \textbf{Reference:} \cite{Lee2001}\\ \hline % %\code{lnmf} & Local Nonnegative Matrix Factorization. Based on a %regularized Kullback-Leibler divergence, it uses a modified version of %Lee and Seung's multiplicative updates. % %\textbf{Reference:} \cite{Li2001}\\ % \code{nsNMF} & Non-smooth NMF. Uses a modified version of Lee and Seung's multiplicative updates for Kullback-Leibler divergence to fit a extension of the standard NMF model. It is meant to give sparser results. \textbf{Reference:} \cite{Pascual-Montano2006}\\ \hline % \code{offset} & Uses a modified version of Lee and Seung's multiplicative updates for euclidean distance, to fit a NMF model that includes an intercept. \textbf{Reference:} \cite{Badea2008}\\ \hline % \code{pe-nmf} & Pattern-Expression NMF. Uses multiplicative updates to minimize an objective function based on the Euclidean distance and regularized for effective expression of patterns with basis vectors. \textbf{Reference:} \cite{Zhang2008}\\ \hline % \code{snmf/r}, \code{snmf/l} & Alternating Least Square (ALS) approach. It is meant to be very fast compared to other approaches. \textbf{Reference:} \cite{KimH2007}\\ \hline \end{tabularx} \caption{Description of the implemented NMF algorithms. The first column gives the key to use in the call to the \texttt{nmf} function.\label{tab:algo}} \end{table} \subsection{Initialization: seeding methods} NMF algorithms need to be initialized with a seed (i.e. a value for $W_0$ and/or $H_0$\footnote{Some algorithms only need one matrix factor (either $W$ or $H$) to be initialized. See for example the SNMF/R(L) algorithm of Kim and Park \cite{KimH2007}.}), from which to start the iteration process. Because there is no global minimization algorithm, and due to the problem's high dimensionality, the choice of the initialization is in fact very important to ensure meaningful results. The more common seeding method is to use a random starting point, where the entries of $W$ and/or $H$ are drawn from a uniform distribution, usually within the same range as the target matrix's entries. This method is very simple to implement. However, a drawback is that to achieve stability one has to perform multiple runs, each with a different starting point. This significantly increases the computation time needed to obtain the desired factorization. To tackle this problem, some methods have been proposed so as to compute a reasonable starting point from the target matrix itself. Their objective is to produce deterministic algorithms that need to run only once, still giving meaningful results. For a review on some existing NMF initializations see \cite{Albright2006} and references therein. The \nmfpack\ package implements a number of already published seeding methods, and provides a general framework to implement other ones. \Cref{tab:seed} gives a short description of each one of the built-in seeding methods: The built-in seeding methods are listed or retrieved with function \code{nmfSeed}. A given seeding method is retrieved by its name (a \code{character} key) that is partially matched against the list of available seeding methods: <>= # list all available seeding methods nmfSeed() # retrieve a specific method: 'nndsvd' nmfSeed('nndsvd') # partial match is also fine identical(nmfSeed('nn'), nmfSeed('nndsvd')) @ \begin{table}[h!t] \begin{tabularx}{\textwidth}{lX} \hline Key & Description\\ \hline \code{ica} & Uses the result of an Independent Component Analysis (ICA) (from the \citeCRANpkg{fastICA}). Only the positive part of the result are used to initialize the factors.\\ \hline % \code{nnsvd} & Nonnegative Double Singular Value Decomposition. The basic algorithm contains no randomization and is based on two SVD processes, one approximating the data matrix, the other approximating positive sections of the resulting partial SVD factors utilizing an algebraic property of unit rank matrices. It is well suited to initialize NMF algorithms with sparse factors. Simple practical variants of the algorithm allows to generate dense factors. \textbf{Reference:} \cite{Boutsidis2008}\\ \hline % \code{none} & Fix seed. This method allows the user to manually provide initial values for both matrix factors.\\ \hline % \code{random} & The entries of each factors are drawn from a uniform distribution over $[0, max(V)]$, where $V$ is the target matrix.\\ \hline \end{tabularx} \caption{Description of the implemented seeding methods to initialize NMF algorithms. The first column gives the key to use in the call to the \texttt{nmf} function.\label{tab:seed}} \end{table} \subsection{How to run NMF algorithms} Method \code{nmf} provides a single interface to run NMF algorithms. It can directly perform NMF on object of class \code{matrix} or \code{data.frame} and \code{ExpressionSet} -- if the \citeBioCpkg{Biobase} is installed. The interface has four main parameters: \medskip \fbox{\code{nmf(x, rank, method, seed, ...)}} \begin{description} \item[\code{x}] is the target \code{matrix}, \code{data.frame} or \code{ExpressionSet} \footnote{\code{ExpressionSet} is the base class for handling microarray data in BioConductor, and is defined in the \pkgname{Biobase} package.} \item[\code{rank}] is the factorization rank, i.e. the number of columns in matrix $W$. \item[\code{method}] is the algorithm used to estimate the factorization. The default algorithm is given by the package specific option \code{'default.algorithm'}, which defaults to \code{'brunet'} on installation \cite{Brunet2004}. \item[\code{seed}] is the seeding method used to compute the starting point. The default method is given by the package specific option \code{'default.seed'}, which defaults to \code{'random'} on initialization (see method \code{?rnmf} for details on its implementation). \end{description} See also \code{?nmf} for details on the interface and extra parameters. \subsection{Performances} Since version 0.4, some built-in algorithms are optimized in C++, which results in a significant speed-up and a more efficient memory management, especially on large scale data. The older R versions of the concerned algorithms are still available, and accessible by adding the prefix \code{'.R\#'} to the algorithms' access keys (e.g. the key \code{'.R\#offset'} corresponds to the R implementation of NMF with offset \cite{Badea2008}). Moreover they do not show up in the listing returned by the \code{nmfAlgorithm} function, unless argument \code{all=TRUE}: <>= nmfAlgorithm(all=TRUE) # to get all the algorithms that have a secondary R version nmfAlgorithm(version='R') @ \Cref{tab:perf} shows the speed-up achieved by the algorithms that benefit from the optimized code. All algorithms were run once with a factorization rank equal to 3, on the Golub data set which contains a $5000\times 38$ gene expression matrix. The same numeric random seed (\code{seed=123456}) was used for all factorizations. The columns \emph{C} and \emph{R} show the elapsed time (in seconds) achieved by the C++ version and R version respectively. The column \emph{Speed.up} contains the ratio $R/C$. <>= # retrieve all the methods that have a secondary R version meth <- nmfAlgorithm(version='R') meth <- c(names(meth), meth) meth if(requireNamespace("Biobase", quietly=TRUE)){ # load the Golub data data(esGolub) # compute NMF for each method res <- nmf(esGolub, 3, meth, seed=123456) # extract only the elapsed time t <- sapply(res, runtime)[3,] } @ <>= # speed-up m <- length(res)/2 su <- cbind( C=t[1:m], R=t[-(1:m)], Speed.up=t[-(1:m)]/t[1:m]) library(xtable) xtable(su, caption='Performance speed up achieved by the optimized C++ implementation for some of the NMF algorithms.', label='tab:perf') @ \subsection{How to cite the package NMF} To view all the package's bibtex citations, including all vignette(s) and manual(s): <>= # plain text citation('NMF') # or to get the bibtex entries #toBibtex(citation('NMF')) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Use case: Golub dataset}\label{sec:usecase} We illustrate the functionalities and the usage of the \nmfpack package on the -- now standard -- Golub dataset on leukemia. It was used in several papers on NMF \cite{Brunet2004, Gao2005} and is included in the \nmfpack package's data, wrapped into an \code{ExpressionSet} object. For performance reason we use here only the first 200 genes. Therefore the results shown in the following are not meant to be biologically meaningful, but only illustrative: <>= if(requireNamespace("Biobase", quietly=TRUE)){ data(esGolub) esGolub esGolub <- esGolub[1:200,] # remove the uneeded variable 'Sample' from the phenotypic data esGolub$Sample <- NULL } @ % TODO: pass to 50 genes for dev \paragraph{Note:} To run this example, the \code{Biobase} package from BioConductor is required. \subsection{Single run}\label{sec:single_run} \subsubsection{Performing a single run} To run the default NMF algorithm on data \code{esGolub} with a factorization rank of 3, we call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # default NMF algorithm res <- nmf(esGolub, 3) } @ Here we did not specify either the algorithm or the seeding method, so that the computation is done using the default algorithm and is seeded by the default seeding methods. These defaults are set in the package specific options \code{'default.algorithm'} and \code{'default.seed'} respectively. See also \cref{sec:algo,sec:seed} for how to explicitly specify the algorithm and/or the seeding method. \subsubsection{Handling the result} The result of a single NMF run is an object of class \code{NMFfit}, that holds both the fitted NMF model and data about the run: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res } @ The fitted model can be retrieved via method \code{fit}, which returns an object of class \code{NMF}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ fit(res) } @ The estimated target matrix can be retrieved via the generic method \code{fitted}, which returns a -- generally big -- \code{matrix}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ V.hat <- fitted(res) dim(V.hat) } @ Quality and performance measures about the factorization are computed by method \code{summary}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ summary(res) # More quality measures are computed, if the target matrix is provided: summary(res, target=esGolub) } @ If there is some prior knowledge of classes present in the data, some other measures about the unsupervised clustering's performance are computed (purity, entropy, \ldots). Here we use the phenotypic variable \code{Cell} found in the Golub dataset, that gives the samples' cell-types (it is a factor with levels: T-cell, B-cell or \code{NA}): <>= if(requireNamespace("Biobase", quietly=TRUE)){ summary(res, class=esGolub$Cell) } @ The basis matrix (i.e. matrix $W$ or the metagenes) and the mixture coefficient matrix (i.e matrix $H$ or the metagene expression profiles) are retrieved using methods \code{basis} and \code{coef} respectively: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # get matrix W w <- basis(res) dim(w) # get matrix H h <- coef(res) dim(h) } @ If one wants to keep only part of the factorization, one can directly subset on the \code{NMF} object on features and samples (separately or simultaneously). The result is a \code{NMF} object composed of the selected rows and/or columns: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # keep only the first 10 features res.subset <- res[1:10,] class(res.subset) dim(res.subset) # keep only the first 10 samples dim(res[,1:10]) # subset both features and samples: dim(res[1:20,1:10]) } @ \subsubsection{Extracting metagene-specific features} In general NMF matrix factors are sparse, so that the metagenes can usually be characterized by a relatively small set of genes. Those are determined based on their relative contribution to each metagene. Kim and Park \cite{KimH2007} defined a procedure to extract the relevant genes for each metagene, based on a gene scoring schema. The NMF package implements this procedure in methods \code{featureScore} and \code{extractFeature}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # only compute the scores s <- featureScore(res) summary(s) # compute the scores and characterize each metagene s <- extractFeatures(res) str(s) } @ \subsection{Specifying the algorithm}\label{sec:algo} \subsubsection{Built-in algorithms} The \nmfpack package provides a number of built-in algorithms, that are listed or retrieved by function \code{nmfAlgorithm}. Each algorithm is identified by a unique name. The following algorithms are currently implemented (cf. \cref{tab:algo} for more details): <>= nmfAlgorithm() @ %\begin{tech} %Internally, all algorithms are stored in objects that inherit from class %\code{NMFStrategy}. This class defines the minimum interface %\end{tech} The algorithm used to compute the NMF is specified in the third argument (\code{method}). For example, to use the NMF algorithm from Lee and Seung \cite{Lee2001} based on the Frobenius euclidean norm, one make the following call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using Lee and Seung's algorithm res <- nmf(esGolub, 3, 'lee') algorithm(res) } @ To use the Nonsmooth NMF algorithm from \cite{Pascual-Montano2006}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using the Nonsmooth NMF algorithm with parameter theta=0.7 res <- nmf(esGolub, 3, 'ns', theta=0.7) algorithm(res) fit(res) } @ Or to use the PE-NMF algorithm from \cite{Zhang2008}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using the PE-NMF algorithm with parameters alpha=0.01, beta=1 res <- nmf(esGolub, 3, 'pe', alpha=0.01, beta=1) res } @ %\begin{tech} %Although the last two calls looks similar these are handled % %In the case of the nsNMF algorithm, the fitted model is an object of class %\code{NMFns} that extends the standard NMF model \code{NMFstd}, as it introduces %a smoothing matrix $S$, parametrised by a real number $\theta \in [0,1]$, such %that the fitted model is: %$$ %V \approx W S(\theta) H. %$$ % %Hence the call to function \code{nmf}, parameter $\theta$ is used to % %\end{tech} \subsubsection{Custom algorithms} The \nmfpack package provides the user the possibility to define his own algorithms, and benefit from all the functionalities available in the NMF framework. There are only few contraints on the way the custom algorithm must be defined. See the details in \cref{sec:algo_custom}. \subsection{Specifying the seeding method}\label{sec:seed} The seeding method used to compute the starting point for the chosen algorithm can be set via argument \code{seed}. Note that if the seeding method is deterministic there is no need to perform multiple run anymore. \subsubsection{Built-in seeding methods} Similarly to the algorithms, the \code{nmfSeed} function can be used to list or retrieve the built-in seeding methods. The following seeding methods are currently implemented: <>= nmfSeed() @ To use a specific method to seed the computation of a factorization, one simply passes its name to \code{nmf}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res <- nmf(esGolub, 3, seed='nndsvd') res } @ \subsubsection{Numerical seed}\label{sec:numseed} Another possibility, useful when comparing methods or reproducing results, is to set the random number generator (RNG) by passing a numerical value in argument \code{seed}. This value is used to set the state of the RNG, and the initialization is performed by the built-in seeding method \code{'random'}. When the function \code{nmf} exits, the value of the random seed (\code{.Random.seed}) is restored to its original state -- as before the call. In the case of a single run (i.e. with \code{nrun=1}), the default is to use the current RNG, set with the R core function \code{set.seed}. In the case of multiple runs, the computations use RNGstream, as provided by the core RNG ``L'Ecuyer-CMRG" \cite{Lecuyer2002}, which generates multiple independent random streams (one per run). This ensures the complete reproducibility of any given set of runs, even when their computation is performed in parallel. Since RNGstream requires a 6-length numeric seed, a random one is generated if only a single numeric value is passed to \code{seed}. Moreover, single runs can also use RNGstream by passing a 6-length seed. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # single run and single numeric seed res <- nmf(esGolub, 3, seed=123456) showRNG(res) # multiple runs and single numeric seed res <- nmf(esGolub, 3, seed=123456, nrun=2) showRNG(res) # single run with a 6-length seed res <- nmf(esGolub, 3, seed=rep(123456, 6)) showRNG(res) } @ \nbnote{To show the RNG changes happening during the computation use \texttt{.options='v4'} to turn on verbosity at level 4.\\ In versions prior 0.6, one could specify option \texttt{restore.seed=FALSE} or \texttt{'-r'}, this option is now deprecated.} \subsubsection{Fixed factorization} Yet another option is to completely specify the initial factorization, by passing values for matrices $W$ and $H$: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # initialize a "constant" factorization based on the target dimension init <- nmfModel(3, esGolub, W=0.5, H=0.3) head(basis(init)) # fit using this NMF model as a seed res <- nmf(esGolub, 3, seed=init) } @ \subsubsection{Custom function} The \nmfpack package provides the user the possibility to define his own seeding method, and benefit from all the functionalities available in the NMF framework. There are only few contraints on the way the custom seeding method must be defined. See the details in \cref{sec:seed_custom}. \subsection{Multiple runs} When the seeding method is stochastic, multiple runs are usually required to achieve stability or a resonable result. This can be done by setting argument \code{nrun} to the desired value. For performance reason we use \code{nrun=5} here, but a typical choice would lies between 100 and 200: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res.multirun <- nmf(esGolub, 3, nrun=5) res.multirun } @ By default, the returned object only contains the best fit over all the runs. That is the factorization that achieved the lowest approximation error (i.e. the lowest objective value). Even during the computation, only the current best factorization is kept in memory. This limits the memory requirement for performing multiple runs, which in turn allows to perform more runs. The object \code{res.multirun} is of class \code{NMFfitX1} that extends class \code{NMFfit}, the class returned by single NMF runs. It can therefore be handled as the result of a single run and benefit from all the methods defined for single run results. \medskip If one is interested in keeping the results from all the runs, one can set the option \code{keep.all=TRUE}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # explicitly setting the option keep.all to TRUE res <- nmf(esGolub, 3, nrun=5, .options=list(keep.all=TRUE)) res } @ <>= if(requireNamespace("Biobase", quietly=TRUE)){ # or using letter code 'k' in argument .options nmf(esGolub, 3, nrun=5, .options='k') } @ In this case, the result is an object of class \code{NMFfitXn} that also inherits from class \code{list}. Note that keeping all the results may be memory consuming. For example, a 3-rank \code{NMF} fit\footnote{i.e. the result of a single NMF run with rank equal 3.} for the Golub gene expression matrix ($5000 \times 38$) takes about \Sexpr{round(object.size(fit(res.multirun))/1000)}Kb\footnote{This size might change depending on the architecture (32 or 64 bits)}. \subsection{Parallel computations}\label{multicore} To speed-up the analysis whenever possible, the \nmfpack package implements transparent parallel computations when run on multi-core machines. It uses the \code{foreach} framework developed by REvolution Computing \citeCRANpkg{foreach}, together with the related \code{doParallel} parallel backend from the \citeCRANpkg{doParallel} -- based on the \pkgname{parallel} package -- to make use of all the CPUs available on the system, with each core simultaneously performing part of the runs. \subsubsection{Memory considerations} Running multicore computations increases the required memory linearly with the number of cores used. When only the best run is of interest, memory usage is optimized to only keep the current best factorization. On non-Windows machine, further speed improvement are achieved by using shared memory and mutex objects from the \citeCRANpkg{bigmemory} and the \citeCRANpkg{synchronicity}. \subsubsection{Parallel foreach backends} The default parallel backend used by the \code{nmf} function is defined by the package specific option \code{'pbackend'}, which defaults to \code{'par'} -- for \code{doParallel}. The backend can also be set on runtime via argument \code{.pbackend}. \medskip \paragraph{IMPORTANT NOTE:} The parallel computation is based on the \pkgname{doParallel} and \pkgname{parallel} packages, and the same care should be taken as stated in the vignette of the \citeCRANpkg{doMC}: \begin{quote} \emph{... it usually isn't safe to run doMC and multicore from a GUI environment. In particular, it is not safe to use doMC from R.app on Mac OS X. Instead, you should use doMC from a terminal session, starting R from the command line.} \end{quote} Therefore, the \code{nmf} function does not allow to run multicore computation from the MacOS X GUI. From version 0.8, other parallel backends are supported, and may be specified via argument \code{.pbackend}: \begin{description} \item[\code{.pbackend='mpi'}] uses the parallel backend \citeCRANpkg{doParallel} and \citeCRANpkg{doMPI} \item[\code{.pbackend=NULL}]{} \end{description} It is possible to specify that the currently registered backend should be used, by setting argument \code{.pbackend=NULL}. This allow to perform parallel computations with ``permanent'' backends that are configured externally of the \code{nmf} call. \subsubsection{Runtime options} There are two other runtime options, \code{parallel} and \code{parallel.required}, that can be passed via argument \code{.options}, to control the behaviour of the parallel computation (see below). \medskip A call for multiple runs will be computed in parallel if one of the following condition is satisfied: \begin{itemize} \item call with option \code{'P'} or \code{parallel.required} set to TRUE (note the upper case in \code{'P'}). In this case, if for any reason the computation cannot be run in parallel (packages requirements, OS, ...), then an error is thrown. Use this mode to force the parallel execution. \item call with option \code{'p'} or \code{parallel} set to TRUE. In this case if something prevents a parallel computation, the factorizations will be done sequentially. \item a valid parallel backend is specified in argument \code{.pbackend}. For the moment it can either be the string \code{'mc'} or a single \code{numeric} value specifying the number of core to use. Unless option \code{'P'} is specified, it will run using option \code{'p'} (i.e. try-parallel mode). \end{itemize} \nbnote{The number of processors to use can also be specified in the runtime options as e.g. \texttt{.options='p4'} or \texttt{.options='P4'} -- to ask or request 4 CPUs.} \paragraph{Examples}\ \\ The following exmaples are run with \code{.options='v'} which turn on verbosity at level 1, that will show which parallell setting is used by each computation. Although we do not show the output here, the user is recommended to run these commands on his machine to see the internal differences of each call. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # the default call will try to run in parallel using all the cores # => will be in parallel if all the requirements are satisfied nmf(esGolub, 3, nrun=5, .opt='v') # request a certain number of cores to use => no error if not possible nmf(esGolub, 3, nrun=5, .opt='vp8') # force parallel computation: use option 'P' nmf(esGolub, 3, nrun=5, .opt='vP') # require an improbable number of cores => error nmf(esGolub, 3, nrun=5, .opt='vP200') } @ \subsubsection{High Performance Computing on a cluster} To achieve further speed-up, the computation can be run on an HPC cluster. In our tests we used the \citeCRANpkg{doMPI} to perform 100 factorizations using hybrid parallel computation on 4 quadri-core machines -- making use of all the cores computation on each machine. <>= # file: mpi.R if(requireNamespace("Biobase", quietly=TRUE)){ ## 0. Create and register an MPI cluster library(doMPI) cl <- startMPIcluster() registerDoMPI(cl) library(NMF) # run on all workers using the current parallel backend data(esGolub) res <- nmf(esGolub, 3, 'brunet', nrun=n, .opt='p', .pbackend=NULL) # save result save(res, file='result.RData') ## 4. Shutdown the cluster and quit MPI closeCluster(cl) mpi.quit() } @ Passing the following shell script to \emph{qsub} should launch the execution on a Sun Grid Engine HPC cluster, with OpenMPI. Some adaptation might be necessary for other queueing systems/installations. \begin{shaded} \small \begin{verbatim} #!/bin/bash #$ -cwd #$ -q opteron.q #$ -pe mpich_4cpu 16 echo "Got $NSLOTS slots. $TMP/machines" orterun -v -n $NSLOTS -hostfile $TMP/machines R --slave -f mpi.R \end{verbatim} \end{shaded} \subsubsection{Forcing sequential execution} When running on a single core machine, \nmfpack package has no other option than performing the multiple runs sequentially, one after another. This is done via the \code{sapply} function. On multi-core machine, one usually wants to perform the runs in parallel, as it speeds up the computation (cf. \cref{multicore}). However in some situation (e.g. while debugging), it might be useful to force the sequential execution of the runs. This can be done via the option \code{'p1'} to run on a single core , or with \code{.pbackend='seq'} to use the foreach backend \code{doSEQ} or to \code{NA} to use a standard \code{sapply} call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # parallel execution on 2 cores (if possible) res1 <- nmf(esGolub, 3, nrun=5, .opt='vp2', seed=123) # or use the doParallel with single core res2 <- nmf(esGolub, 3, nrun=5, .opt='vp1', seed=123) # force sequential computation by sapply: use option '-p' or .pbackend=NA res3 <- nmf(esGolub, 3, nrun=5, .opt='v-p', seed=123) res4 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend=NA, seed=123) # or use the SEQ backend of foreach: .pbackend='seq' res5 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend='seq', seed=123) # all results are all identical nmf.equal(list(res1, res2, res3, res4, res5)) } @ \subsection{Estimating the factorization rank} A critical parameter in NMF is the factorization rank $r$. It defines the number of metagenes used to approximate the target matrix. Given a NMF method and the target matrix, a common way of deciding on $r$ is to try different values, compute some quality measure of the results, and choose the best value according to this quality criteria. Several approaches have then been proposed to choose the optimal value of $r$. For example, \cite{Brunet2004} proposed to take the first value of $r$ for which the cophenetic coefficient starts decreasing, \cite{Hutchins2008} suggested to choose the first value where the RSS curve presents an inflection point, and \cite{Frigyesi2008} considered the smallest value at which the decrease in the RSS is lower than the decrease of the RSS obtained from random data. The \nmfpack package provides functions to help implement such procedures and plot the relevant quality measures. Note that this can be a lengthy computation, depending on the data size. Whereas the standard NMF procedure usually involves several hundreds of random initialization, performing 30-50 runs is considered sufficient to get a robust estimate of the factorization rank \cite{Brunet2004, Hutchins2008}. For performance reason, we perform here only 10 runs for each value of the rank. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # perform 10 runs for each value of r in range 2:6 estim.r <- nmf(esGolub, 2:6, nrun=10, seed=123456) } @ The result is a S3 object of class \code{NMF.rank}, that contains a \code{data.frame} with the quality measures in column, and the values of $r$ in row. It also contains a list of the consensus matrix for each value of $r$. All the measures can be plotted at once with the method \code{plot} (\cref{fig:estim_all}), and the function \code{consensusmap} generates heatmaps of the consensus matrix for each value of the rank. In the context of class discovery, it is useful to see if the clusters obtained correspond to known classes. This is why in the particular case of the Golub dataset, we added annotation tracks for the two covariates available ('Cell' and 'ALL.AML'). Since we removed the variable 'Sample' in the preliminaries, these are the only variables in the phenotypic \code{data.frame} embedded within the \code{ExpressionSet} object, and we can simply pass the whole object to argument \code{annCol} (\cref{fig:estim_all_hm}). One can see that at rank 2, the clusters correspond to the ALL and AML samples respectively, while rank 3 separates AML from ALL/T-cell and ALL/B-cell\footnote{Remember that the plots shown in \cref{fig:estim_all_hm} come from only 10 runs, using the 200 first genes in the dataset, which explains the somewhat not so clean clusters. The results are in fact much cleaner when using the full dataset (\cref{fig:heatmap_consensus}).}. \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ plot(estim.r) } @ \caption{Estimation of the rank: Quality measures computed from 10 runs for each value of $r$. \label{fig:estim_all}} \end{figure} \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ consensusmap(estim.r, annCol=esGolub, labCol=NA, labRow=NA) } @ \caption{Estimation of the rank: Consensus matrices computed from 10 runs for each value of $r$. \label{fig:estim_all_hm}} \end{figure} \subsubsection{Overfitting} Even on random data, increasing the factorization rank would lead to decreasing residuals, as more variables are available to better fit the data. In other words, there is potentially an overfitting problem. In this context, the approach from \cite{Frigyesi2008} may be useful to prevent or detect overfitting as it takes into account the results for unstructured data. However it requires to compute the quality measure(s) for the random data. The \nmfpack package provides a function that shuffles the original data, by permuting the rows of each column, using each time a different permutation. The rank estimation procedure can then be applied to the randomized data, and the ``random'' measures added to the plot for comparison (\cref{fig:estim_all_rd}). \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ # shuffle original data V.random <- randomize(esGolub) # estimate quality measures from the shuffled data (use default NMF algorithm) estim.r.random <- nmf(V.random, 2:6, nrun=10, seed=123456) # plot measures on same graph plot(estim.r, estim.r.random) } @ \caption{Estimation of the rank: Comparison of the quality measures with those obtained from randomized data. The curves for the actual data are in blue and green, those for the randomized data are in red and pink. The estimation is based on Brunet's algorithm.} \label{fig:estim_all_rd} \end{figure} \subsection{Comparing algorithms} To compare the results from different algorithms, one can pass a list of methods in argument \code{method}. To enable a fair comparison, a deterministic seeding method should also be used. Here we fix the random seed to 123456. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # fit a model for several different methods res.multi.method <- nmf(esGolub, 3, list('brunet', 'lee', 'ns'), seed=123456, .options='t') } @ Passing the result to method \code{compare} produces a \code{data.frame} that contains summary measures for each method. Again, prior knowledge of classes may be used to compute clustering quality measures: <>= if(requireNamespace("Biobase", quietly=TRUE)){ compare(res.multi.method) # If prior knowledge of classes is available compare(res.multi.method, class=esGolub$Cell) } @ Because the computation was performed with error tracking enabled, an error plot can be produced by method \code{plot} (\cref{fig:errorplot}). Each track is normalized so that its first value equals one, and stops at the iteration where the method's convergence criterion was fulfilled. \subsection{Visualization methods} \subsubsection*{Error track} If the NMF computation is performed with error tracking enabled -- using argument \code{.options} -- the trajectory of the objective value is computed during the fit. This computation is not enabled by default as it induces some overhead. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # run nmf with .option='t' res <- nmf(esGolub, 3, .options='t') # or with .options=list(track=TRUE) } @ The trajectory can be plot with the method \code{plot} (\cref{fig:errorplot}): \begin{figure}[!htbp] <>= if(requireNamespace("Biobase", quietly=TRUE)){ plot(res) plot(res.multi.method) } @ \caption{Error track for a single NMF run (left) and multiple method runs (right)} \label{fig:errorplot} \end{figure} \subsubsection*{Heatmaps} The methods \code{basismap}, \code{coefmap} and \code{consensusmap} provide an easy way to visualize respectively the resulting basis matrix (i.e. metagenes), mixture coefficient matrix (i.e. metaprofiles) and the consensus matrix, in the case of multiple runs. It produces pre-configured heatmaps based on the function \code{aheatmap}, the underlying heatmap engine provided with the package NMF. The default heatmaps produced by these functions are shown in \cref{fig:heatmap_coef_basis,fig:heatmap_consensus}. They can be customized in many different ways (colours, annotations, labels). See the dedicated vignette \emph{``NMF: generating heatmaps"} or the help pages \code{?coefmap} and \code{?aheatmap} for more information. An important and unique feature of the function \code{aheatmap}, is that it makes it possible to combine several heatmaps on the same plot, using the both standard layout calls \texttt{par(mfrow=...)} and \texttt{layout(...)}, or grid viewports from \texttt{grid} graphics. The plotting context is automatically internally detected, and a correct behaviour is achieved thanks to the \citeCRANpkg{gridBase}. Examples are provided in the dedicated vignette mentioned above. The rows of the basis matrix often carry the high dimensionality of the data: genes, loci, pixels, features, etc\ldots The function \code{basismap} extends the use of argument \code{subsetRow} (from \code{aheatmap}) to the specification of a feature selection method. In \cref{fig:heatmap_coef_basis} we simply used \code{subsetRow=TRUE}, which subsets the rows using the method described in \cite{KimH2007}, to only keep the basis-specific features (e.g. the metagene-specific genes). We refer to the relevant help pages \code{?basismap} and \code{?aheatmap} for more details about other possible values for this argument. \begin{figure}[!htbp] \centering <>= if(requireNamespace("Biobase", quietly=TRUE)){ layout(cbind(1,2)) # basis components basismap(res, subsetRow=TRUE) # mixture coefficients coefmap(res) } @ \caption{Heatmap of the basis and the mixture coefficient matrices. The rows of the basis matrix were selected using the default feature selection method -- described in \cite{KimH2007}.} \label{fig:heatmap_coef_basis} \end{figure} In the case of multiple runs the function \code{consensusmap} plots the consensus matrix, i.e. the average connectivity matrix across the runs (see results in \cref{fig:heatmap_consensus} for a consensus matrix obtained with 100 runs of Brunet's algorithm on the complete Golub dataset): \begin{figure}[ht] <>= if(requireNamespace("Biobase", quietly=TRUE)){ # The cell type is used to label rows and columns consensusmap(res.multirun, annCol=esGolub, tracks=NA) plot(1:10) f2 <- fig_path("2.pdf") } @ <>= if(requireNamespace("Biobase", quietly=TRUE)){ file.copy('consensus.pdf', f2, overwrite=TRUE) } @ \caption{Heatmap of consensus matrices from 10 runs on the reduced dataset (left) and from 100 runs on the complete Golub dataset (right).} \label{fig:heatmap_consensus} \end{figure} \section{Extending the package} We developed the \nmfpack\ package with the objective to facilitate the integration of new NMF methods, trying to impose only few requirements on their implementations. All the built-in algorithms and seeding methods are implemented as strategies that are called from within the main interface method \code{nmf}. The user can define new strategies and those are handled in exactly the same way as the built-in ones, benefiting from the same utility functions to interpret the results and assess their performance. \subsection{Custom algorithm} %New NMF algrithms can be defined in two ways: % %\begin{itemize} %\item as a single \code{function} %\item as a set of functions that implement a pre-defined \emph{iterative schema} %\end{itemize} % %\subsubsection{Defined as a \code{function}} \subsubsection{Using a custom algorithm}\label{sec:algo_custom} To define a strategy, the user needs to provide a \code{function} that implements the complete algotihm. It must be of the form: <>= my.algorithm <- function(x, seed, param.1, param.2){ # do something with starting point # ... # return updated starting point return(seed) } @ Where: \begin{description} \item[target] is a \code{matrix}; \item[start] is an object that inherits from class \code{NMF}. This \code{S4} class is used to handle NMF models (matrices \code{W} and \code{H}, objective function, etc\dots); \item[param.1, param.2] are extra parameters specific to the algorithms; \end{description} The function must return an object that inherits from class \code{NMF}. For example: <>= my.algorithm <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(seed) basis(seed) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(seed) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # return updated data return(seed) } @ To use the new method within the package framework, one pass \code{my.algorithm} to main interface \code{nmf} via argument \code{method}. Here we apply the algorithm to some matrix \code{V} randomly generated: <>= n <- 50; r <- 3; p <- 20 V <-syntheticNMF(n, r, p) @ <>= nmf(V, 3, my.algorithm, scale.factor=10) @ \subsubsection{Using a custom distance measure} The default distance measure is based on the euclidean distance. If the algorithm is based on another distance measure, this one can be specified in argument \code{objective}, either as a \code{character} string corresponding to a built-in objective function, or a custom \code{function} definition\footnote{Note that from version 0.8, the arguments for custom objective functions have been swapped: (1) the current NMF model, (2) the target matrix}: <>= # based on Kullback-Leibler divergence nmf(V, 3, my.algorithm, scale.factor=10, objective='KL') # based on custom distance metric nmf(V, 3, my.algorithm, scale.factor=10 , objective=function(model, target, ...){ ( sum( (target-fitted(model))^4 ) )^{1/4} } ) @ %\subsubsection{Using the iterative schema} % %NMF algorithms generally implement the following common iterative schema: % %\begin{enumerate} %\item %\item %\end{enumerate} \subsubsection{Defining algorithms for mixed sign data} All the algorithms implemented in the \nmfpack package assume that the input data is nonnegative. However, some methods exist in the litterature that work with relaxed constraints, where the input data and one of the matrix factors ($W$ or $H$) are allowed to have negative entries (eg. semi-NMF \cite{Ding2010, Roux2008}). Strictly speaking these methods do not fall into the NMF category, but still solve constrained matrix factorization problems, and could be considered as NMF methods when applied to non-negative data. Moreover, we received user requests to enable the development of semi-NMF type methods within the package's framework. Therefore, we designed the \nmfpack package so that such algorithms -- that handle negative data -- can be integrated. This section documents how to do it. By default, as a safe-guard, the sign of the input data is checked before running any method, so that the \code{nmf} function throws an error if applied to data that contain negative entries \footnote{Note that on the other side, the sign of the factors returned by the algorithms is never checked, so that one can always return factors with negative entries.}. To extend the capabilities of the \nmfpack package in handling negative data, and plug mixed sign NMF methods into the framework, the user needs to specify the argument \code{mixed=TRUE} in the call to the \code{nmf} function. This will skip the sign check of the input data and let the custom algorithm perform the factorization. As an example, we reuse the previously defined custom algorithm\footnote{As it is defined here, the custom algorithm still returns nonnegative factors, which would not be desirable in a real example, as one would not be able to closely fit the negative entries.}: <>= # put some negative input data V.neg <- V; V.neg[1,] <- -1; # this generates an error try( nmf(V.neg, 3, my.algorithm, scale.factor=10) ) # this runs my.algorithm without error nmf(V.neg, 3, my.algorithm, mixed=TRUE, scale.factor=10) @ \subsubsection{Specifying the NMF model} If not specified in the call, the NMF model that is used is the standard one, as defined in \cref{NMFstd}. However, some NMF algorithms have different underlying models, such as non-smooth NMF \cite{Pascual-Montano2006} which uses an extra matrix factor that introduces an extra parameter, and change the way the target matrix is approximated. The NMF models are defined as S4 classes that extends class \code{NMF}. All the available models can be retreived calling the \code{nmfModel()} function with no argument: <>= nmfModel() @ One can specify the NMF model to use with a custom algorithm, using argument \code{model}. Here we first adapt a bit the custom algorithm, to justify and illustrate the use of a different model. We use model \code{NMFOffset} \cite{Badea2008}, that includes an offset to take into account genes that have constant expression levels accross the samples: <>= my.algorithm.offset <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # retrieve the model being estimated data.model <- fit(seed) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(data.model) basis(data.model) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(data.model) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # 3. Compute the offset as the mean expression data.model@offset <- rowMeans(x) # return updated data fit(seed) <- data.model seed } @ Then run the algorithm specifying it needs model \code{NMFOffset}: <>= # run custom algorithm with NMF model with offset nmf(V, 3, my.algorithm.offset, model='NMFOffset', scale.factor=10) @ \subsection{Custom seeding method}\label{sec:seed_custom} The user can also define custom seeding method as a function of the form: <>= # start: object of class NMF # target: the target matrix my.seeding.method <- function(model, target){ # use only the largest columns for W w.cols <- apply(target, 2, function(x) sqrt(sum(x^2))) basis(model) <- target[,order(w.cols)[1:nbasis(model)]] # initialize H randomly coef(model) <- matrix(runif(nbasis(model)*ncol(target)) , nbasis(model), ncol(target)) # return updated object return(model) } @ To use the new seeding method: <>= nmf(V, 3, 'snmf/r', seed=my.seeding.method) @ \section{Advanced usage} \subsection{Package specific options} The package specific options can be retieved or changed using the \code{nmf.getOption} and \code{nmf.options} functions. These behave similarly as the \code{getOption} and \code{nmf.options} base functions: <>= #show default algorithm and seeding method nmf.options('default.algorithm', 'default.seed') # retrieve a single option nmf.getOption('default.seed') # All options nmf.options() @ The default/current values of each options can be displayed using the function \code{nmf.printOptions}: <>= nmf.printOptions() @ %% latex table generated in R 2.10.1 by xtable 1.5-6 package %% Wed Apr 7 15:27:05 2010 %\begin{table}[ht] %\begin{center} %\begin{tabularx}{\textwidth}{>{\ttfamily}rlX} % \hline %Option & Default value & Description\\ %\hline %default.algorithm & brunet & Default NMF algorithm used by the \code{nmf} function when argument \code{method} is missing. %The value should the key of one of the available NMF algorithms. %See \code{?nmfAlgorithm}.\\ %track.interval & 30 & Number of iterations between two points in the residual track. %This option is relevant only when residual tracking is enabled. %See \code{?nmf}.\\ %error.track & FALSE & Toggle default residual tracking. %When \code{TRUE}, the \code{nmf} function compute and store the residual track in the result -- if not otherwise specified in argument \code{.options}. %Note that tracking may significantly slow down the computations.\\ %default.seed & random & Default seeding method used by the \code{nmf} function when argument \code{seed} is missing. %The value should the key of one of the available seeding methods. %See \code{?nmfSeed}.\\ %backend & mc & Default parallel backend used used by the \code{nmf} function when argument \code{.pbackend} is missing. %Currently the following values are supported: \code{'mc'} for multicore, \code{'seq'} for sequential, \code{''} for \code{sapply}.\\ %verbose & FALSE & Toggle verbosity.\\ %debug & FALSE & Toggle debug mode, which is an extended verbose mode.\\ %\hline %\end{tabularx} %\end{center} %\caption{} %\end{table} \pagebreak \section{Session Info} <>= toLatex(sessionInfo()) @ \printbibliography[heading=bibintoc] \end{document} NMF/data/0000755000176200001440000000000014333156273011612 5ustar liggesusersNMF/data/esGolub.rda0000644000176200001440000107763014333176413013716 0ustar liggesusersý7zXZi"Þ6!ÏXÌãs•ïþ])TW"änRÊŸãXgøØø%>Áƒ¥e@HröŽ԰‘5sº‘.½x§ *ê¢ãq‚jÉÒnqÍøýÑLÅl¾kœ$¿$Ö(?ãÑ{l¸ÜR穯×A|j%Ïã%íϸÏÞ5ÿ~‡ƒKZˆ 8 EìZ§w†Ù ƒç§iƒ\KD2Ð%H„·µâ±xKà`À2¤à^f{ WDsDO=nÅ6|š±~¹ñøWÐzâæò°yUX+.ú o9K”ðšËk9—Ñ/j8ˆ­Œ‹ÒW£š]ˆZêœ-¢þEÐ[ýQ‰ìË>Ç¥¦J¡B€NÚ4ÊÊ%Çí>C3€Ù­ZhBòYxuª…„¨|¨S@Îc^°[¾4Ï7 $ù(6L9±ŒY këç˜">m¦”#i•#`Fdž®t'`¶¯NÝÎþRÜ–oļ´Xô¤6çm¡4ÍÛ?™”°·ã‘£‹à·®ìß´]>yY¢¦‡´:³Ì«¿XÝÙzSƒ y™÷!(ᚸýÁjZ|=æªv$%51±7°z\d£èiŸ6VÕï5ÿè>–0Îñ¯»9á}©Zú$ÊæÀ}OòÓ!pZ`ûL­@ªxefÓOË¡¦ÚcÉ ­t¶³(G»f8ðeОDr/¶€è4[‘ëDmÀþ&¹Üj ݰÿ,1íóÙaFM¥ª™wÅ÷]nvÇj”a­Ç9!öö»hW?=Ù˜í#¥$#«ôP˜()mŽÆ*€sNžs$p,t˜‰Û>Ü3¦IoZËŠŒBH”2b2-?¶]½•«ËcŸ†-aïÎ-WÊ_*-Éy•˜ a Ž‚Yåe½þÚðv™=.âN.ãd}v¾è*…+» ~ú6jD¡`òZTÏíÄ{ é2OJáú;àiln'PwæÜh¸!{ºÕš±ï^äJÀsvÅ_ü‡IU¬[½ A ãmAIåEÅԂС„ÌËaî ¶&åÏÓ·2 Ó‹ˆšY|4PU‰¹ÔöIC ñ¯c>È" â(Fg " ¥‘œ™ÿtúYSº³Çjâáž¼>v/«‡sYa6‘§â7Hè ú¶¸ÙÿUW™¯ÂÜÜK®1èÈ‘uØ,ðôõv§±—ãUš„¢›¾çÙ°G7•øIjdÝO%L/æ÷WB¶‚”¦ÂÇ+fF‘É4’q6fË—=ùöÒù%†å_YVNß×õŒ?gÍG2Ôš\ÿÌtXÌZð­0ŽW:¾ð:ûpÁ÷Z™°Hfo®ç/Õ…jhð•n,Æ3•ÀîÔè:àU…›K ‚·|à2Ø¡ 1cítú Ë  ×Ê×€V*[½´ÅX4+hrþZKœÆ&ŸÄ V%’°g¨“»eÌMPô:¡â)-tg#+‹×´’b=ç)'vÜcþÁ D¬øQŠÃ8WüÛ‰µÃ¤Ä²QµüOìŠðâpfV¡°_£Û?Ž¨Õ ë‹´1©(®[‡Héoú4è/;*ZS»Vï°m9f€*Âu MD~@×*΄àÔš.=j21üÛ²^z¾ÓSÀ»i\•· E<“’J=×ú“ ì‰ï³Õ ¾íÅ—I³˜±ËAµ°´ÎBP*š„ÎÖœÂh B±kpä»$?tªU“ûŠo-¨©¢}DX Éfk‡õ\Ý—áÌd¾HN3F/IjË´¢d»u âÌÌ]­Xø¢El>UQS ÀMj¢á÷·„¶rd’R•¦`†#«~í³ŽÆœîÛùÁ Dnõ' bGv§Rkø*æ©"ýèA;BÕra¶Ÿ4DãÐïFž»³\¥nȾpj§#&Ðr,$°Z¬ü£Òá­ÏndF¬7•ßøˆÈƒ±g^qºíU.¢”Îd¬í¶ñ )¨5ˆî”4Ø«ˆÝ—X@õ± s}è›6?ý„„~¿Œ;£uIÑÛݧç–ìw?B;‰’@RU„ɿ輓ƒÕ„ª×áI%æü„èÞQSÖ»j%-Iy‹áJ幚úÀaW')ÏQ•€°ëÓ èhÃÊÖT2A‡ ΰÓ\9PôЩº]òQ²w¨Ï}LÖÓáÁ¼Œ…³’]«„WG,œ±73~áVÃ<Š ¶aÙ]Å¿3¸²Q(»]‰²éÚüVƳðVAœžWؤ0¾GeQ¶ä;YçKœêšµ›)OUÌ)ªÏ(¬v†6myì·™¥/–êéþ騮Ìiv0Ëêã X7Y–1üåꥩµvvGª*þ8²ßo¾{—ø*²ùÝ¡”}u=Q¸(Ü0Œ¯û,¶=‚x õÒ¡ì3„»ÌÊURñ6MLùˆ}º°\Ë;ÄY‘×X-‘·‘â¾3gæG ¦PH_FwXdgµ¥„åîéßW|Ö¶D;‘–;.UñWBµ³”u¥È(Zö“¯f>ò/@«r–5¨•êœÿ®Ã^Åáøã;üŒíL˜ÁxFz¬'ÔtS¦ç°ò+U—wvr³Dˆ%µÎ ¼×TgŠbXø)òó=Pk¥ÌäÙyå&p5Ц?",ÉÖh(.ƒ‹&·k½sT½"/æ.„³9®0DÆ5 ÞîrÕr.õ™‚ô<¿èž,eQ€Š*£Â5H 8ÇÜ%™Á>ÍSÐpSªTýNKø€¼IyÓž+ð™ûuDæûB ЪÞÛIîW°·é3rŽ*jñÏQ×=°ÅÏz; úl6 #-L œÕŸÀ]9Ußp²qÈ}š”æ`mùÐô]å̦>rà{¸X{ÔÍ\u‘Ê­£[ÅÀ4º&¬ JÈXsòFFïB¯†@Ú«°óÚ‰éþ‹ßƒ1!|®Æpi.ú:ßÖÄy€C¦7D|Ö•½Œ¬#yÔÙQ½ç³@»Œ2ð¶R‚ @ê¡}”^Êv¦)âÍÉúl¸©Ïd«1[ñiv=ÁPy…ËàY‹*•Êׄ Í|èûDx’µÒ=|˜ÈÈ÷Ùƒ_yµÍÛÐÊo!)øH*:I†þÝ®ô’*̓Ú•¼üBi´‚Œì¼Û “{I®D)Ýø³6óy·Ë:2ë¶Å™ƒºO E÷|@EÊ%P÷#Õo O¾>ÿ‰¤­Ì¶þXV\ Õh¸ø¦”©MÝÊvßUWJQQïv¬Ü“†LžîÊÇ„’4¦½ž¡l)èø¯Qð¥¸_‚ˆzž7r0¿ÚË•æ «žUݦô›= ?xó¥o4Á,:âz½dF¦îé£ÂóŠÄbÄŸ’ÍW݋ёÑo£wË Ó\Óî©åH;ç´†ÇÕ,¯[tq“Ý©kM{i—[ ¸&¼WºøŽU Fž¿¨Nk.U}À±ñHÏgüõn˜·KŠÐ|Ð’×÷ªh¢à~¸c+øe´Êö+mDæÝ]ŒëÙ&Gœ¯6€sA¤ÁÑóÈá|>_s`-Œ¼ßc«[‰×1?¡€9@àŽ†{ ò™Ÿü³Óxaÿ.QC,¤¿W:Cù2äßï"\‰Oð9á·%` Œæ¶uYÖÅ›9u³º†ë-¨¨=~[±· Õ6‹ì²ÿ W´Rnîygzh¾+¤ôh™ºkÒƦT2?¬:Ø»¯<(»ûÂ=‹ëÅ’=Q»ÅTl÷âªÖœ3-zx·$¬½Àn¬è›‘HŽI£}†õöìÿ„εÑ=&ÊÿÈÉQƒ\¢üwÐï­Ø›«›ÐýõVG;ó—¸×”‡äÎáí…L̈߃}ŒƒD©9Wl -#›ê³ŽBmaØZk NE·u‘߉tVưAË®çýªHHØ=cg.ô\º ‘P~µæðñƒƒØ§¼ {ÛÚ‰nF_|Âý’ÜRJƒ©­+^>ËÌ þÝ 6/<ÍÞ˜×'É’û(d 8Ú®[Êĵ¹"]ð[ÁÏôš=AVþç4îo'h¶‹/¸ÍXÙè4'£òl•Y½)ñ«3›¼Ü¶@ã-èJøÒ¿e)4d®w²BÒÍ)¼°ÝÕtÁ§I@dm(½ˆûÅDôÉí\©PÌÉ®ë"ξå@ɜ𧀋ï21Ï4c݈.·Ä½)ºunÞ+-/széy4É ‹ZÝkiBùïK¹áÂ/€®×¤ôÚåê…\NÄšž <fáÅüÿ|P<2×bh“cÑÉð”6õÌúˆJ™V/XÚ+ˆD踑\ž7 ÖpN•Uy™Óþ O°—kM˜ #÷ôi|øÓ C¾àÔ·ð‚‰ˆN÷ ËŒqÕ©°1ÁS q¶ªJõÑ-ß`£·û0"}õ*„í?å‘f»qr'ﺰö_àʪp(óÁš-l!¸ÿ›ysŒl µ ÎfO-–¢,›)mö6ÉÞÔ»•}‹b{!µM(ÖU³ qžiL‘ÂUz@AëätÿTP>­¶a©*T"¹H•î»éç±±Ò1Hk‰½ ’³ä–m¯³ÿˆÔÅ<÷ƒxõv¥œð¼Ú±–yOÇÛ²ÿ uéxÝ~èîa2'À[Î5GæÔöÚ¼8ÔS6“ gÑbJž¼E–¹8)X çêõ¬)1z8|§I NXd­›Ü ”aTÖ¸þ7Ñœ‹4“:0&Òp¤Ó”6抷ÃåË)ä‘Ráâš?GkD ’åÊOá´ÿíˆ0(¬pŠ©pÏã³+çÎõar Ê[L°Õ¨ ÿeTÈQÛ÷B V¥xqcwX©ü[£*aiLßmFþÏ­Òè„‘•á# ºú®¡“ݵ»ˆøqZ;}v´Ë¿@Óž»Œq‰J¯ÈÞÑýlSV„”‰.B*°ÃM;²HNP(ô}wþ_Ä Á ¤Õºâá=3*¥­¢D³zê^D §¤VÂ?ÇM'H-§j•à„:5î!5ÆŸ‡a€Œ­‡C÷…'z*"~;t>É­<£iH ?™ª,–6¸gK¬kËû£(0,0cû»?‹Ãª¡Aà—ùLÍŠa£WÜv‘Åë%;¬ ùÓYãs>}N¸E=‡’21*‘VhÉÜk#/)•¨q8í°àa NA@ú¥³ "a‚_àjˆ«]ü=¡Òy5:µG„àa#O Ÿ:6µr%6:ŽGšÛ U(Žø’E§y´Àä»ÕšÑ‘âu2:Þm@i×zr£y«˜k²Î‹ëʼýÒ3 è÷{Q•ÔÌ$­í+J“g®¼ØÌt}'üœ5ð~q»4Œ“§Ûj¬ê ôÖ2øáýµM ‘L@Ç—š WÜß>þ¤^%Ñ-w·2ÅO¤ÌÞnÉ ¸KÈ´¾tk;k,#;0‘d¯Ñ_¢wX¯ÝÊF\Ažð>9I³[ŒT4ÒŠ‚íë°Wm\.í—)%k f‚µÃ‚ˆ‘ÅþzH–Á.÷º]*r·iW‘OŠá#¤Ñ…Æa)Ò± ™’Ö¿Iƒ½Aƃx9=|_r»Ôõè—Vë’A¬pÊÖu–]ì™òU»Y’Dʈ³o0¡\›ôds¬‡:&žìÞ2Ê2Ć)³JCï¡I4³täG¡³:Õ: %¤xè%_«fGz­ý¤þwe:©¦à6±€$[¶ éó»'¬þÊÿH ¿É—ô]à9»†/ž±B°&Á€¶¥Þáo ì»lóCûíÄt1a—°-Òèv°ý?Fs«]¡~ îiÜœV[Ä[q½]g“ÁÏ©c¢¬Qî +BYôïà匜ÂW °pVs£Á̇6\ÜIúÑÇ-4Ta&gNÛÑFÇäst€Sj–åØª¹sïâæ?í‚£qànò£Áyc\¼Ö]JóˆÜüDÞNHËž[q—M–‹×rÞÞ –Ý—¾¨¥8XR`‰b¼¿t•Jï¬32Ä›ç¼p¯Ë4ùXÖ53 ÿòïÊÏ ³ë¼a%n^æ4Ð}`òx~€ òOePàGrºmËÈ ç¬©4èB74ÒåÏ ª}JÀ0l­V{}|åÇ„¾ü†##¢VKªœw§èóDÖß½ñɳˆ *ã{îC<žË甬q§ZLíÿ­iW.zaQ?•0\¿ J6Â8 N!¡à½›J–¬^2û™Ø¸ T`K‡(þ]Ô&Û µ­:Õçl Z·°¸N‡~Iû\®søá˜Öd¼¼ÀŠ ¦Ñ Cc³“µÞ…·®s†ÀIÃüüpA.QÓûü>À˜zò™nÂúHlE]ˆj±jyµ[/,sƒˆ]òc‡Iò£l¦]®xëQÛæâDvÍõ8pbÀ8ø“òŠ ‡±Ú$žœJ†=ÆÔ«XV<·cvçk®EÂl³±­]V"Ú uiýa®ß£–Ò™òZ_ª1Zø%‚öæm'’l”Û\},fé÷#¨"ëQ_ë ‡£¯ûýw·/ b}·bßKú®î8Ã1/Ý Ê;ðB­¨–õTr{e'Nµ|™ œ ´¸¿Y»²29)|Ö†)¿s!.Û>ƒÕ÷y=A§n±•ö’³½3÷Ýc ¸GhÁï>ªŒT§s6sû`—f\ßlT%0[â «Áö¡xI½«o§H¹¯‡%Ö2Þ0Ïfê°#¥ÏéŸÂÇ”íu‘“Ø÷ý¥}3ïP2ÄÉDÁiopÁ<6¡ SUì³}q$P´7g.“ Énù[ƒúÅPÅ'ßýU¤™wbƒX¥»§£Lò=¬õj ²3ë¤ülæ“°YÅ*;³°‹TìÜQ„š×¾û,ÅDëªBzÃÔJ‡Ê˜_uÈ£%ªóá/³3‡ŽÂ”â]ýÿä+U®þ¢_Ù² UÃA’®®tˆ¢íµ…“[çí„I~cØE¨Ã¾–Jßâ–F Þ╇ÓéË'·#µ³×[P)"YÖ¦€û…UŠ#û¾ž3àÉ‘UíW%|:#\‡À°JUÇËŠ<ÔHÉ@"4QG1ÅýKò'÷Ϋ1-ÿzGµyí®¬¥€Æ—Ÿ’TÂIà/ññWünʘ—Øëñ±…7AˆÁbh'½ƒ8 Ížï pÁô@Ž÷ÆÜ߇Í,”ÈÌÌQ÷ƒÕê·PsYYî½CËʘÐZ07gEG:Ä û^ûþ™ëé…¸œ4X¨JˆÍèµ7å/sZö³ ¢§ña»ò7IÏÖ#ep!%?¡‰ÌAz+¡ˆ3—¬™§=¦GþðëE­`)gúלž°šþ‹ F‘ô”àŠ|‰ÀmêÐUÿb\ü—p@ÒTiÑ}ˆþ!Ð4FÎ5µTûo SȈƒOPì•ø¨„Äè¬É¾óá¨ú»˜—pf¼A0PO…§ä•Vô«¥ót%´õ±;WÛ‡½™«[ËFk*iäqÖRÈuQÆR§Gˆ~N£ôyK07ó®kÙ>t~ÞodCÂ)ó‡Ê`b» ôà>3 /¯ ”½¼·$F8B=i:@*Ú÷çpMñx…n–3­ÈYvåðâ¡–"Æß~qT›ã„·ñ³ Ù T óä¹9Ë0¶õX—üå»–ÍÕÊ1t;,*ˆ² r±ÓÎAðwBt"_CžM³æp \K6«í"âJô)ín£æ,ü? ò ù£={ˆ¡QC`ýlÎ|—^¶}èŸs.†“päÜÏû Ÿj¾Å§,Å› çTí¤ºÂoci:°’H¸ ¿*êÉÛUÆ]ËÑ¡QDÍp Ư/ú¡ó Ø?¨L^ øi‰7f®ž™¼'Xëȸì $q#¿ßʧê$‚åñõ oïÍ„iï„üÐâ% 7Ä0/IVBÇܰDpÔ,ݘÌM¬Ã%£$Úiù“q­¦ÃnðØOÊbkŸ|5ׂ¿6º‚‘,ñ5UÕ»j>Ü:tËy±Ã}·ˆD1LšFb]%Ý€ ݶ1ÏsÔ¸csáb©'JK𜛷 Ò@;gâq‘ÑÉÇÏ»T7ÚT%FÔ¯ý¤&ÞIž3ÎÄà¦ÕÙ)M„ªAí‹2èãrÚ¡—Õ^&¥wR0 mQ,p³ZK’QØeÿ)ÂIKâËrÇ}ÿ;[A­–§ƒ[¯îaã‹gv|ŒîÜ °žÀ¨„“ÁÈUO”òcrDèµaœtèùßõÜqÅF´óÌÚ¬®aL:3Ò¡!ñ7š4xް2òO=i¯6VmÔb(Ä/Þ‹¢>RŽ_^±–µßÊ™RbåÀv¯ì´–z£E—ü"½{ÈYçÒ]€A>Î$ŸÌ ‡Š5¶sÙVoÓÃ’"w·#0ÙÍ,Õ>Øçظ•hsÝNCP-f,GÃæL­ŠÜ½ Ûxi0â\ÊÌ Ë-ÑIòrL•HÚŽQÔà¶ —°ø1uòÝ­ã8Í1Æûš²U¤øorÁ÷ Ä0â(w±‚èä8ðkå%PQÉ e„€vü|œšvŽÀ¿OE† LÄ{íÜ;]%Y©‹Þó‹7Trü£áã!©”‘'¾¤ÖKÃýÜèdm’F´S½Fç%ÖùXûqº(Òi‘ذUÏÛo™¿†ÀõNG]2Äv½«ìÙÌ-uû¾—ÀZÈ`@ÇÙ;=\Æd(c¢êx7¦ºó¹¥ÍÝ,¥²bAFusãú¨F¶¶Lñ³¹î€Íœ}Û1§Œˆ$ Ç'7­xº£DaT…Ø¡v×¶¥ÑA;ªÙ̱§Ø•\kyƒ¿mºçÛÏŸ÷g}áN¤BsiÎE|Lµˆ>t÷ËE’©¿Ÿšá‡tïÛkJ„ÜÈG÷¡‡œKC mƒ™òÿðÂU•4´–´Ø±ë]”éÿ8þxZNr®¥ÙiYÄv퉊~”Öq¾s;â{–°™×W!•ÆÏ¹Å©àÿ¥Í  Ñ”¡+ y*JpOÛ^²{k[óD£WP ÂZV¸:lò¥[¦‘½ÿX#¢û§QKJ£f¤xÀí”ôÒ+îúSìfÛÅGÀžƒÅ04«FFæ™z¬Ó´ãZýM¬­]e?î}éÖi®¹‘åèDXWýšekÛYGŸ¥þ}d!t¬r½4%•’ŠlP*$åZ<ÇC§¥66Ó«2 œ}©Å4QHÎ>΢԰eGAã„oñêôª‰&!îWêa ÃbîÖ@J“ÖðXù »©¿+uWøo“,ƒ¾\t|y|Ißy=±ê¿o›AÄß5\ø¿H®õ‹}KÓ‡«kÛÈM‹Dqw’o9ÁbMß!ú¨£Ö_G®ÝK£*ñ 0±©)è—^ŽÇ¯-F€ÜÂ{øÛF®¯Q#µû‡ó\19Më¸R6ÛÀ› GRW™'Š9Ü×>7ÜD®¤:áôov4d˜KЈys­lüÛgƒÕçýz†¿”a­#öÀßz²÷}rKñsÉÆ‹rY×’‘?1¡¼%X¸<‚ŠºÌ´d£ðoŽ[©h{KÀ¢J†™! )zVRUc4D°W}Œ,–w>ηsÉU- âµÿ/3´ÕÈ„¿¢SÌÖú¼ðrF6·ÅÁ[è"“æ‘Ãlb0W2i¨$\è¶jʃ8‰?~ÅЮ}kU?,âãìVÖ H=ˆ?[õ2·IÄm¤CE`bVï@»'>B:• 4¢ò#b~#@L9&ÞÙS^˜ï.´PåT–Kj;kãÎ0ÍÜA‡Ü™â$û@5èµI nOš¸)ò"3 åGAyàs*›Ì”vÞ¯ñwZ8p~޽ÒP£­4ªÎÝœLLN9±è£ö`©)ê³Ç£¤?Ú²7fŸÞ˜guöHQGë³ å’e?E«RL›Ÿª—%­Z½º¯’Õç2˜¼€‘›ï;ŸnÀb¦†Ë:›¶øê@~×GQTÝ€œæ@²‘Ï~À9 ³xîy‹Í™<¶é¡îøØ? ¦!óÄœºØt1¦[ñ"«W™»‚nö.¯oÕ Ð4ù24Lû¸Ès˜¼Ô÷:jÀöàsC™?z^J{&ÌÙãvVé{ô%Ù6Ó“Õ½d[ð@ý'Ó "Ö4&žiøIž‰­òô[x:c¤šâï_4‚ ¹ Ud # §‘ƒØÁâ|\Ï…` uôùM*¶ý84òWã!i¤óãåv9dF¥µ¥ñ#©Ó‚—t÷Å´‹Ôw@¯Ê£ÁGnßÜ·ôp—Û2¡µú µ/å=»çq‹§F*¡=ü¿¢Ï¬ž±ÌjÛ7?nâè7›¯b'^ÔÄcÒëy–YAu˜ü_AÍö«¬ØÔ¦cCÌ#ÂG®÷¤_a··*à2Nè%»ìú…„E}ìÄ;Ëd0¥²ò+Æ“³d‹3~-ïJ©i‡Â@D÷ïÛbf$ž¼ø€9e7*.Έvù €z\?(ëëCË.’/Mh ûùþ‹†l†@ÞZe`BÒªKÂSµ€OÝæPÝgiýn0mõD:ÕÐZÏ­2ºÍŽË æ¬;_½Vî?–±ÃÔX"r1tò';Åî`gÐ[ûhQÉ Ç þü­ÃÓz±pð×Üë¹ÛY']AãÕÂ5qmð¤uÃôz×%£ö®8ûʆ.j•&£°#à&u#Ÿ©×/[ ·ŒuÎubï_äá'HÎ2cÊè(öÊ*PåÞ`xnÕ9*?1Ôç?î©íVV:®Þ™ó“5+«¢º¬43UsaÅp1ÒR@uÑ`EÁ÷t:O¦.!ž‡]TVT'ºUP¾az?ü|.Æ!dù‹ˆ–³â ñéZ=Ñ ÓúáàX}ÖWR_lü!,aR@Š¿vN¦¡ônÿ—°ß ›¨ÁÉ·5^Y3Ö]…ñï1øKwÂ]íb; Dgܯ5—._ê«4æg ˜¡ãæãžu@Ý'<“tƒx³rX(ûögÈ&-ÜI7öb›«',YA(N¨sÚ³GÝL”ÀÃ*V¾2¤ÈZý^ö(Fîõðú(Å¡õu¿#èç)÷QUÜÃÇ’_V{‰6U†ð zË|bg/ Ⱥ(K]DÉÒ?`×&Äpˆkˆ*õtã!cü×cÝvËp±ÎõJž%¾Pà.Ó¤FÖ™fŠÃºVdԶdž‡]˜d´Yò §Ð[•§N{ÞOü2Ë_`½³~©=ß|J_ÃŒV«d`þKPJé—9êjLB©„^X€+­ýÌy›¯ð4×fÉCÑå¸Á¾‡HÏ¿fÙÄÖ혔ƒÿåBX¼Èe OëÚ\Z±Š † feAú0 3 *»ãàY#½ÿ®•°¾XJ†/‰*ûmÎQ”}½=¬ãß͆òÇ@Ûó7åÃÇ%#EìIÍèÁ¥`q§¦Nú|¥³ hÒ§A Œh€/CíÀg$öfG9àȼÔüI”ÐT® »u\¢ZLÕÙ‘Ž?r§FkÜSp}P!>+„[²—í U+ù|WµØÙ%È¡ª¬´o¨«CaT‚GÕ·qC§ ¸ÇÍ­ÔÅ=ËÎøßGw»£B³¯)•ûxýüþk>ê#[=à.åFÂR¬_„år¯,õÞš$‘(\÷U>ñ¢¥é<Þ ‘(aš¤Plúôì_®Xh³éÿî){:R•Ë&Å?×¾(ö2=Çò#a4Ö+`½=aÏ?r!W[ÒåršC÷ ðeð—¼z™yâç§ÜAÎ[ýûEÿ"óŒi•¡—ÇkÉ»µtàÃÅj)ª¡l(ŽùÙs B©Oï±>ݢϚƒö·Îü×¢´æd$ŽbÜHx;\\K@Lgæ{uHm6UTƒ~å¨Qd#péŽé-ôkX¸oõ™ÛãWÌSQ‡&óýW´æ!Ád¢£–Mâ9<Ú+»û sqëdDÚŒóª§Ú±8UujPžyØ®‰†ƒ<Æ&–=@+uþžjQ’KÿTøùÃÈÿλçÔK2“v9–ëC\‚¨˜ËÇ5Í+TýóîZAj ‚§:Zà¼_É{{]¼¥l“¦– Ç,Qê«Po…­4«} ô¹&âí%ìÝ…ªbÔ¿¿yÚ ÌûÝ? Á§»k}\§§Àv}~›£f~7®Æ@®)Œdm„¼Ï)'0|{±‹X»uË‹¹ØA>冔¯ÓÁg`d ô[ˆÔ¶?’ÀâŸZìúè_™ÞwøTØ$}³BÉÈú~Ï&±n¾@ÝŽÕ…ÖØì–ŠÑ¥1ü†0ÔÀö´þÚ ‘|:ÓÁ"² ÚÛƒþ°{9E9ƒ­sľ…•W×–žˆWgÞKÇ•š_ªYdæœxb^AÅœ“ŒßzÒì麚ëˆø7‹aŠ„r Ñ艵ïy `û!b¬æ-éI€£J8.þsðùr”)²‰«XËFpsp…ô‘“Áz}ÁraQmÛ Þ»fœ+¿ÙC¹¥C•Öx1ÊÅeÝÏ¡óšÜÌšQ(cûôQT?¨U’˜ÃUʰÙ÷š™q ¤J,ço@­æ Â¹È=ÌSb*ŽFØŸNŽóœ¥Ÿ±Š›­“s9O9ü¿±.b÷" žÖ4¹ÏUÙ-I|è´ü!Nªª º„€~E™¾° ]~I¾?yÌ' Æñ© ñ>9—óêcä­é!Ú76}÷¥p`ÙB×YcãµÊúìñ¶“a¨ïoV½X¦aÇ8¤M”çy“…°aÀ<~/íºp‚  ’îÓB‹ ZÆ›§_À2_š؇|rW­ 9Ò—ˆ‘D¼¼èȉkW¢½zÃAÊÍ•7þçª D+ƒáI’0Íi(¾©OÒrWçg0š_Ã$I~#e·­ / j„Ë×q;#vˆ0fÚ ûò[úÂ0¯qÁÐK·\ô¬Tµ@…½Ý0ûØþΔ{®¤ÄI Ï %Y#þY”ûK³ž¸Þá`%ýŽ¿V€8Û d ¡šµü ÔGEC“$’Ñ©9‘GIì0: øÓÃ+kÿÍ›U;Èã—M?uƒ3ë|¥!´¾÷÷å˜ßáC÷Øq['ä.w>Ùœi‰§ˆh/6!»kÉ¡cû]dÀäX”õ¦'OÊ~}™ 0^WÂÅ/wpĬ»>¬„¤¼:âütn¨°”ù! äSH“‘r)TH«OùnÅ“/5îIä×[óA‘À°‘ç|áÿ[‹j•c,c¯¸å¥:d?æ ³Ž#%û›¼.`7ÍÃéG€jô”¦í‹Ìs=5~‚Ê3¦–žÑ°9ãýíœGë-AìjãâëãWäjm†h-—"׊}4!£¥püÕ*ù·Ä“fÔm£·wðnV65ÞUð€ BòÖ¸>RzD3ÚÅU¢“ôþ„#²0þËâþƒ|*+h^{ÞÆ¤…¯!*—¤È”6ƒ§ÍõYƒÅj06Bðûáv‚d+ !“ÿýAù:ÏYoéˆù ¼‹×ã@ÇH'ûèƒßÌ¢œ-µ˜×u¤ <¼¡6hŒ·6 õÜ åHzv°¸MV¹rL*l=´h‚ÁÔ Åòì€Ãû2ß=¶E›_”!¸Arí¬&‹è°’ýËtûwÓxW;œqAAR:§ßjj¹T)QšcØ%ñ!Kª=ã,|²hÝMÚrìO­ «½Ÿõp o›KÜN±¾ýFó ׆²HFƒ²JÛ‰Ã\¥_K¤Md€•?f§N÷(%⨶tèÿ lÐ¥áþ/,iHO-á{¥ñ!}Y©5äþø¼më#§{3ÆüÑFj VVáß„¨}®ËÒåK)pú´uÕ¸‹„ߌB×®Uc¢ã¨kâžKì!ÎßÅ¥¤QÁÔ¶(ßµ4–Mˆø"S Ýwq?¾FÄ¿d·Sߊß@Eá*ñÜ"Y)ÙUÀ%%5ž:Ь˜ªè ë©2?65ŠôHš£?UíMþù&äw Ó>Wݵd柂x Ê™]’ÆöÖš»oîƒëæáÞÍ€ò·þËçqæòW±ïÖ·¨??a‰ëÕµ>_=UP±žnð,‘x…ù‡4£ˆVí•{€æÌ-# 1¦T‡fj®Ú9"ë¯ýŸ¤‚GJö<8Gs¯Ç×Ì<®^>;3U³•p./¦>˜à"‘„Áÿ€‡lô½%û£?©f«?lëÑÊakc–ôõ¼¦öȹ%,Xæ ô¾ÓèøêRHw(î‚å|áL46+¾ÀâäÚH·,ë ÐiiÑ˳ƒÜL–¾ÝCìp)çâäf–‘TñŸÁ`¡BixØ|×ÃNè3**fGµó6†7CZ1•hbž«.!áJÌìä’÷j¹ºŸÖÇXêE¿™.û»ŽE„wcdžSÇxë+æeçL_.ó ±øpðcû7% 'é.ØàÁ>ûû¦ Ïgõ,<‡Š¤„¢H¹³‡ÂÖ;-m¿Ö¥Fš{{mÎE+ —IíÀ+•Ÿ‰§ñ‰ŸéçÚt]ša¾Ãq*ú4ô>¨ð²a“CÞ¢BZÿW€Ì 6‹úOû›\Œpä$ nulfüÌ9FRÝŒ[¨4ND#öð¨^vìŠ&@¾ÛBãÂõ¯„ÞT¤\ö¯ZµÉÏF¹p¢ª§~^Lß%ó!pŒ>üÉÚbè6W53|Ž ×yÚ(®ÝËéj>õæû@G4¼f4Êßã” ÏáT{Ì+½™ÃqÊo½_C5ÅÿS™6?P4ƾjÆ/ý³Å]‹u~'Åxâò5§C³)‰Ýê @¿bÖ’]ÒT5k‘ü€ªiUpC€¼ÝÏÙ^˜Aí 6ž Ê}}‰MŽ¥Ýa¥3fŽ “V´ÞÏæUÿbÅN_úßå=fÀZïP:Þ:Úxz†Ð$NF_®ã§=ãÇ‚-Tß |׋{žÊh:-ô(=ŠÚÞPeÂ4Kèæ”ÜTŒ{ûDÑjž2àõQ=öDújú)’«Xø¨³’a³ ^ÂV-$|È\Ú:nÓ¯=Aºß$µ[ƒ`Ê\Iý‚¯©ÜN«3Î&?3°·$= þdPDÕ<Ïø¥'$‹Ã7ñ-„}¥lç:Mëèƒ]ì$qH£¦!ã\$1Lÿ èRö§·Ú#zm`L.ø|w—ˆètÐZS(Á[GüQ±€Íã̺2 z3¸[ŸÛùNƒ¢²òŸÄI¦gŒfê|x(C‹eÍØdòo žô5÷bO§š…n#i–>‹1p­ÅÕ+n÷‘¹ˆuÁ& ‘"³¿iòJŽaˆ–!Ÿ`Úùîk_÷èápЉòðZÉ@æˆòIˆay3¬ ”"Z‡Úoöa¾îM®=,žþ<ž•»Ö'K’Küø½P°ÊLKƒÐÍi=êeÆÑ=pT#8Wì7Þë øgAƒÿœK¬iíÙ=hŠ'€–Ém¨[Ôf2}¦¹á'½¹ÑÔvîTâðvwT;»¥Æv Ê5}µÛÒíq‹÷[?° 06ìP…ªH¶@<`’ê’U?ßtc{g6ÂʾX½e½ƒSôÔµÆèn_z²YOU_>Û¬€Õ å9Vçöº#ôS"Ýuå@mËúõB]ñÁt»Ø˜=ìêòçŠûM¬™É y¾ûÁǶP•¹6 SéFOËš]=Ñö¤C¤ä‡fþ¢ÙhÉÿÄ€¶ß 1×~-ÜBÙ_¸Þm¥D­!K€õ笥(ê JãÛ4O0Xj<;Y8ä¡ñÐ)RàF¢‡sÀï›,¥JÝm(è vOTè˜+ÖɃ%ÆããœFy•vú‹ªŒa·ñT „o¬§íõmk*5-dDò'xP^‰þGjW EWt?ü÷”¬½¢¬#N¦1ü> èµZÎß·9_Qt4œ£¤@êß¾.zž@LÈÇ{Eïñ&|“ÎkôGsþþaVB”¡ˆñ÷ Ñ¸aõ =Ѥh Q±$ŽöòÊ HyA}œ3o¸j óþ¨Ýhš#öv½Ó€Ëœõo:œ?ðæØoF6fËëÚ\ÖÍÂx*^DlLxÒ&­òaUzÛ'ò ‹_2¬#”§J*—$LÖÝv¾…ÕeT 8ÛÎXô…týÂ9Z±uV0oXÿ¿“ li~·ÏîZ¹å(P. B"LÊÃù]üpEÑ ±´Ž/X­ÖœˆJJ0UA(U®ÅΊ—bv¡EN-"‹ÉGú‘ºÑ ^ª›•¹ùÏp£9ÒÌù+¬Ý@^Î2ìéHÒZõ”U ðïrå}ºæ:ª¢¶ÿ+D˜ÓZp¹øT‡ÞÞm s¬?¤¥:ÿC =\k û¢—gÕè× ‰‚µ;½oøËxP_¬×Oè‚;všF§ùÍ7„Z0LS¿ õ¼ ê ÌxKOtÕbOHää%>¥ñ¿Èƒ/â*ç4¯Ùã©ô õÍgðÆ©žH8ÂìêKounPÆzH0v”¸Ûê«oÅåÃCû—®Ìûç£Îï’Až^*7<Ï×ç!º–b·õNú"N¹klkÃïj UµÀO¯X¸Yl—ÖU 9™  ›`jk¸q÷—JX5èt¹i­dž”{åz€N‹'¥ØJöãß|¼s0‹ÔDZàaŠäž‹2+i'ã;¥êĹո`k›eä„o°Æ+û°­ß:¼¼ïú­§y`(QΚ-< ¢éã‹Vž„”³×=dƒß(ÙÀñ#zú‡²§¼LŸÊ]‡=ûùÄe€M…ÌBé`O8s“½±YúsñòÕ’Ô)nyå1âH 8²ãÓʇ3Aâ§…|déåÐ*¾N®¡®Uº1`r÷=äõgœ‡€ f«/þcŒT•,]ù³Êß~~Ž9ŠæHz¬R£Jv®Q¼Ý*œ^õp‹s̘|—B=—ÌT®c(Á÷䯫¨ ‹wÌÆ'å迳žš]ßž,Wé8Ü'%×ÙÛ)¾±0À8ÉTs£!FŽ<A³Í뮥üõ™°kvƒ1o`ùÔ~³ŠØ?—çÛŠçÖDâŸÑ­ ^>§õk™G9ëƒ)Q(w³”d]ϯê0ç2;E"Ö¸ÀÌŠó;#åû7š=ˆ©u>rfrÜ Þ´`z ï_W¸³küÎ>ûB{öÂÕʲ§<ÈŸâ³¶¨]ˆdmä·/6½ƒyU¾¥S^*8P+c sµ bœŸžËïn Ë‹1–ýg(²ÅÞ«ñî·Åh©« Vxž!&±·e—Ýo, ©F?Ë ŽÞÖ%’­ù“ò¡ !#‡j?>ßpîÙÕíé‡|d×µ6-éKCm½Å7,oˆd¤ü˜KÅâ×¼™‚¼v‚Fz«ž AK‹«1@Ú* \4j«9~‹MiFÖDúŽדTzcM úúg!ÍÏ^ê! …æÀôÓ¼mxq5:ýL¬aqÛT éèÚß(t:=ÉüЧŠnœñüN_ÿ‚*>šf—¹ûÆjÇPL‘¾ÕHó3¹î8ö”’C5b7#wœMÀB0K~ 0i?ù®ïj¤‡ô¢î‰Æ8I5ï¦$¸ö¢å= r¯Û™ xfÙ•:ð¾}+²åQÃOž@˜|úÒJ#Íøá@z.S«;‘¸c‰¶1YèË"e&GÞ©Ÿ?íÃ$6ÄŸ„(‡K¤H«\dr|¤•K‹îÙ[!ì2ÐïPXG`RZWá¨;ÚŽlÅ·#ÀÑ$PB,„³Ã>êa´ KX±„6ÏÍûĬMBçb£ësSµ@JÌ1Šï“3‘¿h°ÑwöôN9<Æñ»<î^®2‹´iâî˵»¹2×ýx¶ôûF<)YOÊ‹i$³rƒ÷eY¸H“SÆ i»µh›O2bE²¦¬”·røRR£–O å¶ìVÃuhøºæeü£cÅÚª]q ’§Ÿ´up¬Ù&ÎwÕ¡¤~}•#ôÂ;š ø!$‡qÔпp·®BTqËɵW7@ïºÙ2˜¦ˆrCz“DÉuî]ün(…µo G¿¦·© §4!ÑÁ;áú(d„,4]>/x˜£6}áÀFfáÞÖ‚ËÒoãÂô´ôfpTòÏÀ÷GŸ»›¡ÈþV.'û™ZÓVÆBÍ¡þ(®¤ ©'p8/ön-»:ËÌÎÕŽàßÔ›pÙ¸çž"X`; [½¢{|}˜fîgÔ¸À€×t~;xÑ¢fõð\9×êi)Æ¥ç“È…\æÅ·fOôì—Hd㟾ê\OO–³Ž¯…§¥àFõC`iWüêÅ# o‰¡ Cµ‹Äí<öªæ‘°6‹C¤kž3‚›Y[³í’š'èj;ƒËLæOÝÔV}2×ä»Ùô¸²× hxF®l™¤ ò®Ü>ý‘=9U‰Ú×î\&ô ƒˆA\jÇ*´ãNž×ÛMncïˆÉê‚é9äËY‚ Då*œÀ8Ïó~ÆÒÉ‘{|YÞ“{êÎW]n‹N;­ ;¾×ÜÈ‚I¹­vÖ w¶Â¼hÁ†«ï€¦äU¨ôuCª™"AyWþö( 0³ê(SA%R5PàÂ4¥ŒÎ|wê^N=ž$F‚¦Ð*•|^|(Z¾Ê„ž%UUk1jHX8¬#1gÂlL=æ‡*"ˆŸ¶Òi¿öx›-ûE[Ñ–Úë|ã¸BN.ürÈOˆ[ÅܾpÛJ«Ô¹[‚£z‰ [þ_"CqïÇ*‡€j%n+JY’Ë÷£Nn¯¨Œi`Ö8Ú¨š‚N™ø¤øãþB!̨g_Yy¸ž¡ëPÊè^‘eÖ:HD¬BúP–Åâ·¸|?3öƒ])u«™Ëbs\<«BN ¦ZZA|¯MÔ=ª¥ÑU®Kdüÿ™ZHeå*zFhñ{æºOªIM†eG©KßäÒ±µÖX7Œ„" n`uzª–ƒ¦ª;Ý(úm<°ÖAíhígÅ‚°¥ÞŠö œzöqÙX7Múo£+T)ÇÒÎÇIØHÍ¡ii±iûN!¯åhÕˆJ6Y&ùÐÛWPlÈ×xМK‘A 2²ŠðDk=]¦ÝYaVö+qýTØ5ƒ]ÂŽë-91 ¢<üccÇ¢Žñ͉·£Õ=cF=Ιõ¥ê–Ãy1öVC?ñA®<À/ªUX+;8kk`ËûɆàþwíña u¸‡SÎÃ<¿b”Ø=Òk|®ìôyû÷{ÒÆ£O°p>÷†¨Lä]ÛƒÝ.ÄïsGçj*2åa²3ÿ¸aq¥ÍÔ…H¦y¬†In¤Ç» UZân¤±!5"ûDÈÞi˜.Ã"ø¦ÐÛùŽ#!“ú üÅÏ!Bð s/†.8öt€Ò±Ð´ƒ5 †]ªì\›CnZßš #†òqȆ5çØ#y}®Aó+£u[üÀ¬;EQÉ“à„#Þîƒ/Œ€A—Ù™ð!ä¹ù¹IúDI)éN`ZôQ$ûj‚*¢ZÚ|Ý G°ö_ÿùé¡.ºª]þVkòBãê7Œµ€,‰Tãm«ì”f%ªÓECÊ<¬^duL¿Å{ìÜåC“®mÛ»Û§ñû"à$bÿë,_ÒS3¿v(/ë³N§)ìÅy³ä¯ïÕ‚œÔ ëC»%"MàÊg0‡X–MæúöN•r‚—B£ãÜÈÛúˆíÂÏ›'|à¥ØYŸ" ;¤ ³Âx³­]¿,6ZÐÒFød;_œh¾"Ü]FJa#a«H= Ö|D2زóùd€\#)EwÑ–ÓAðý{¯k€»ÑVy-¦¬9`£pÎ'= HØ4rë(% Fj€ïó5>à‡¡ ž‘‚á¯óª#äêŒ&7;Ÿñ 8¢À¾6`zLôîoÞ„H–[ †GÇÁo+‚yÂÁ ̧Ì_ù ÛÀzøVD‡'qr_s xõì³åbëÃäÊòÈ‘ð­e“|Ò1ƒ©M¹0]„‹ZG¼\²!™Ð¤B3~~:‡À—s³ˆ±QüÓÁ#´%SéÚ‚xsoÐù¦þ¶W&^”/»Tà>ÃŒª²Cå9œÚ"ˆMRùIä~`³_¡Øp!ÈÀòÊ×Ë|º•Z˜W÷#,?eÑÁÙçžD 🠌*å*¢µ>qtS÷¨Î«Ôü·aSòM¿ýÌ÷æl@Òä'½RrkÊÖÝ&›_.’¹a¬5Å‘¦¾]°l²2×­ … »`ë§ (\¤º™=(Hß–ò´,m?•–¥ÚL \§ÇŸoÞíÁ•<Ði{yOû´í:ЊÃÚö Ç¥O.-è7Y<-)æ6¯è:ÄÍNĉi­w Œ;MbˆtKOa¡ñ¸¬/"Ud„„yY|ƒ$…Š'kÛ*·täùž ¶@f¦‘"©ßORcª‚yƒ<³Ù»dH‡û¶×¸ºòæ2i÷„†áUT:Še„åÊr µ±L“'Jæ±ÆàYÀ6t˜þ‚-" 8”®ÐCÁ;*þ,mœ`˜¶ÅÜ8ºhÁ"I1 UçÍ´wÔsø¸ØpLšêdØ)²ñü„†Eæ½£/äp±¼›’çòÛº¬qØ­-dÅôÄüòÄŸþÙ~ü#Äœá£w°íäÃ9ͨLc¢tr~Ç|æ3. 3˰/Ô[Éx¾ ü{Αq°u–Bž7‚“›èÀb~‡¸ótÙ»‹Nå·À  ”gdûlFVÏɘæ´=ŸŠE b™Znu®LŠtf·ƒË²\&ÿ¢¬«d§(ßCÜ’mß|;hHÛ¸Ãnÿ&<˜…L<Ùd<.åÈ̈́çñÔeÖqÒ>T …!ÔN+A]€ŽÆFÑ ø_œn´W•29Õæ8Ñbÿ}hWd½È©…”ÇüURoÏ mˆË 6>‘µs*-G 8­ÙŽ& áÚSé£v_–3.!)¯šÀàä%I͸ê2ÄÐ•Ñ  ,v3a  »}‡ ÚLX*fx´ÀecÎ GXMA†ê@ ýNw‰<€û£m ë'pwÑeIL¹ÂiÇw®CƒV/aáï§i5 ‘L/ìÓÓðõŸýpX-ø)úowmÀ¡—ݼSl ý_K ^jº8¨†ÎŠÖÂÃÂYJ„%ŒËÈÖ:) ½¨MÁëÃ3 †‘ªFÝÔÏ0¶áBRàªÇ¯âQõÁÚ}vM®ä0Ljm³ÞføØ¡!¡V¨ ¼=Uƒ²Oi[wÚ1è'B?-*ˆh^ˆˆˆ¼ìîKLk©ºq>žw¡¢ýíû½ÚT®4Ô±wùS@ŽÕ`©-pöõ’ÒºlR¥—Ñ6s#ÍOšuMŠ«¶úÂ+ã+*†Å/0ý›øûV°ì¸Í{ÿƒvð6m² ê»xà•‰M>Ød£dPôÒ‡Wp.Á- °càm¼tîTeãŠø¥ªÒœk˜–¥’Ÿ8ú÷ðOú2Õš?蘰zÆRT|ù:='óUj^Tô§(”…ÒJÚwnXDY .`u9dZG'r‰DS\J9tƒ¬öÆ^sT ¿]A£õl…7sº y|9Êyú9JvA²ÀAMÑOç¬à «‘öê*´ž½ŸC½Ì…»|¥2uN=˜Ýþ4‡ ô§ |þ¨uU6Ò% ä7ãÚ›p2ÿrT 0Jì­¥Ì È;éT&='é›FÝíè·¯U«êèeé¾LaA+ù%‹ªUŸÜ‰,¼§µ?+½w!džw&x\}2æôƒeèü¸©˜©Dp$R­bHS\îõj¦|\p6 ´*g) ’/\¯vÃ×Ì ! ö[Ï1ö¼5~_íð4¿¤ÉwWTëVd äâA,ŒHý  Ñ›%-‘ž1 ;œäy= šƒx8Õ£FO¶§Ù¡wYmXŠí¤&ˆ îÿ˰Ý6]2 ¶#ººýÈU}¡ð±GtËœ]Žâ˜dY[³©ûs |×·@É0/˜vô›4³1&„†í•SÒî…̲Ã÷잎™£ßMlSŒ›SD^.ô=9Du,ˆaÎìçá…%£užo¡iåˆgøÖ§‘;»9õÖÔ ùowMz¼‡É¤Ûózy†Ö²83AµFÈî]Û$­G yÐl6;ìª bõÕ !Aq7`)?*9„Yƒï§oÄî›sòæ”Áóí¶Ý#’*'šv!åGAù!¤[Þço¤R¯‹}Ûò‡O ç¸Ìg87oÂ$“­‡ê Gþ7—|Ö«_v>Ù5ÔÕþw_ÁàDr.xII’N^ûo=:Éçü ÓE¶‰nã®–gû$??jFî­zCÄ5ØÌŒ9ÉÂ4fʸطwÄÐx[‚ÿ9:R×ð3õ”çãFøT.§dX5sW&K­ý;Yv;ñŸç[=¢Lû=û-"4…iòT‚ g£»áqØüæ>$jÆy4—#(`À™õ¦T®¿M/ŠÆF­,Ùs‰åk-‡Ø£¥ñâq¢$PÝÎõ(õ«F§lÏÓ)€Ü±Ø»ïìòb~8S:ŽX ™å€áätä._æ‹?U%í/U&­f#þ¼>pœÀ‰F‘Íâ¿mJþê›*ðþœ"+:çþîfç®EW¦ôG|â{¯€O‘B$— Ç?zX+´ P\i}ø0§^ laÁS¬ôvƒxG¶î…8ÍDVeeª—>´ñÅ®8úsÆÅeLƒ—±ñ]éy Öª„Z©}é}Œd—¾n£´º\qæúðÿÊÞ“ò¿ê•­»]ν ­!kÿpª³‡ëi…M ýs)»±Á öcXø-Ûuå‘2ôBÏw‹îCÓŽªà|ß+“Ó_ƒº7ØU}´ÎV!u óhUZx²2߸²U ˆíŠ6«¥8[å™[a¢¯Ý ¡‡^c€ÝÁÇóPœiiMß ©xЩ’ÇI ÿÒ÷K|æþÉ ÜÅ/èývÕ˜[Àp3'b$hB« Ó:e9+³$­¨t…<ìù©M¿-ýÏ–ˆ¯X1/¨Ó‹u¯ç¦ûL®òýÈZÑs,¨Daãë2¶»çßvS¡ux²â;ǼM&v4Fø5¶H'­ ²Q×JœzT °'`}¿S>wD4!ÿã¤ÃeÊ×’Gi_Z¶Ê˨,%kÃH$‹Ö”íhl€•Ù@£âR%,(Qáщ”û_ãZ€ÏEoRoa5õš4ž˜‹XªÇ;³R¢5zì Ôª4XUÙvõPÃP3:"ŸØ³¢½$T(šÐÙoP1XDÌ—;Þ\5 E*RN7©¾ëÞdü˜Byå „ÿ’Îbw­RS°6wŽ”©¨õtw’6¾_WôC{1ÖºnTÜϽðÕŽê“2rjªßôùšÕjU©Õÿh91ÁßzA±F‘³È·Ô²‡7ë¼öJj2|ó}¸LØŠ}i§SöDÈíp u¯$ÉS42ArÈyebÝj¼.®ItƬ© “I€ñ¤Û03u|€`!É@‡æ£øi˜z0³Û!‚ óA¥¿V/$<ÝòÉ ôFo±|®ÁáQ¡ „Ͱç{CcþÇù¸U.­Këxx˜¬üçO(6¯WVâ9Z¼ žrù…ÈÛ¢Ÿ’4ç´½ˆ C«lÞãÛŸ¿ÃW? ÞÍd[Ê’et˘&*]«H» Ÿá/PP<¬ÕŒØ2I¢®Y ˜ÐFÈÉ$ÃPYì¦ó/(iwùJÛ˜ç 3öm7ÙNo]5¬é ^JÙ• ³áºõ™ ®‹`žEÓgdM%bteTËÈ û:€½ûˆñã͆I¨^™ˆòAÀ ªü¥ÒKn¢íå²¢l¦¿W=Z»í·¬ç¤§oà«7 n·íÔ,úÝv‡¥KqÅ¬Ó @?ä?ƒ_‡#.é–ø¹t®/  a²o– XÔèLê–Ž¦è!Þ æ–qëH ylëge¡t{[bZÇ÷ƒvfÆ®|ñؘíâkX½¦>¶{ùeg.Úþ·³ŸI¯~RBÂhBcÆ¥ð¯9PS×mzP  jF¸¿É¨ ù;a¢Úe‘#Áœ«5 k§²àmqZ•v¡hZ ©jý6-¤Étu‰¾œ¯yDrµrÅ‘úô;%ddM$ÝQYø­n8•›Ä¬D9#Àg›”:l‚b0x6E7¥ê¯ïÑŠ‚ãÖnˆô/)Õ¥7üZÝ×^Z,!«†Ó‚•ê2GC Áˆ­ÀŽ¢š¼"*Þ?˜öÈ ÷çÝ8¦Gÿ'ÍÊå T¿W}ÊLp§N#F’Åâøâ¡'_lð{"«×]%@8‰¥rŠ<_—Ð}„@ÚGïÒ—q Qц“ÝmÚµ73Ø€ò`¨Þ¦šÍ ÙMM)XC–¹RêœJúO‘Ÿ@$¼ísh.YÆáAÇ]2üDï™s^3Ú˜,BwÏ:ásÑ âÁ³Âã­ :¿àÓv\ãÞ á[z6é¾N.ÓZÉÕËnªÍ8êØ èlç¤æ¸/ƒ>Á“©î؈Ȩؘ¸óa¶‰ð¥{YªáŒOzO¼ü EÈàM8l“<|TЦ§ ãå‰[;Mb®†ª? GòV@S`L=5io­O—£¶ó-ªÜM  Xµò¢]R°Ä­¶Ý/˜Íht&V«àÔh1Mˤê^ðîàÅ ßrð©'>¡ƒòëï³aQ$à‹ ‰»Æ"æx±!¶y»'LØŽ´®cm¶BÃbÉ@ Q]mò{óƒ 1t±âø/͸§JÜ͉ñãµ³“£¾Þ³§ÇÏS§Ë÷¿ˆ/Cêê{¬à!lAad,ʃ]ѱ!‘® W~dwÐDªÅß—‚œŠæó<ždhÑ *€?“) Ðw§ð½9zÞhíƒ9°ߑ߼%"VGF¿‡7_ãyš&RÄ'ñÌ'g¸‚\¶ûE>ódÕS¨ëùW¼Bß{½NÁò&³ïD‚$¯^È;rÙh¶êoAû…#ƒ$N}¥QHù¾®2ýݯÅ^ɰ?¸7„C4mÞ²ÔªHó†PÅ  àÌsõ‚™n•Òáð~s¦Ó`IÍX­ìîüR«ŠÝ'yä efSœpÝôv ÖÕÞù˜uS¦‹%w3Hô­}€Ãa,$\Ž·CÞD¸­ét^èX€"‹–ëy6LúYrE‰ãå8x›dbÐ=²Õ@Ý"È÷©¼qö‡§+0æ#-¼¢¶£Á7®ÇÀ´¶€£ÇTQ£Ö&X?êšH@H¢¶g_\I%ÆÖ3jRWAô^VÓJ\÷nˆm¿û[eï¢p]+ ’m'B4p$ÓL ý“U终e±©ÿ€#±‘™&m("yakèM’-(?>$høñ|vÈ:‡‰YQ±å>bh»ÔÜE|Aï=ÙÏ2‡R‰xÒ:µb°þ”¿^$,¾g‰·*O ÚsÖDù¤”}ò6-A!ø>"ÙôVØQª–°¨ ^”º;¶àꌱ ¯j“Êü¦ÞK¬Ìç=n3{É"Ä”sÊ3Ô¾˜×êZV]óµZc[ÙˆŠ½ž„¿a΋קyˆ F%É8Èß^ˆ)îý ‰‡ùj™HôÒôûÙøßËÖ¦ˆiºF“9àãŸ/³Ô[§Ñ¦­¨ìCf`‚d½i =±‘å­)Ì»ï.÷œû+C*ìOÖŒövÏ-p3¤òaï`ÛT$¥YDÒÝ?„­E­¶·¿XçEèµ3¥îT L¾Y—öàã¹2uež Sv øtÏoðÀ»w»‚l¥Åº³0°é)©GHJ/Éøêt¢ü[ú©š°áÙž¶Ž&A\xÈÿÿÍx{ëRyð¯„}ý!i‚gˆ]œ”d:UCîô/là{‡Í5ä5ÁÉ$j¾Í»ïÚ2jˆféV]x†#Û duD @ÅÞÞ©ÿAQ7¸;8rºh57q™UQçv“®¬õp§Þ¶ÔPtËÕ)áK4™`Ó9¥6£·Äµ­´WË3׸ÁÀ.S ØDÁ)ŠhNŸ¶ÜR™$­‡© ûµàQŽÄÊMF=se û­¾Õ… Ùâ v™‹ÒQ„ÒYf4WµôrĤÄœçÝ}§Œ‚.`¹èßÃÑcu<þÕAAeà—c˜¢»[^Q¸á‡nÏ×ü+ü| °OÉÓ/L‹¹PxGÖM ‰à¡7yÔAYЬ¤ü#ÎçY$e $¨ÍUièU4ƒj(!*âڷ葱Ê] d5fëþOF‘†×>íñ´«åQ_{ŠÏÜrĦ VH³ö=½¢ÈTQ6/ ÖEÂ7ôHœ½¦¹Ó6:{¨¼»!FzkX]åÛ™7R’-Jó“5ùóÿ#n!¬£[/ó›Ï=éÒ†¡--,ÿÝŸ£‘/¼^Ät&hvú\ìP>8!Ñ3Kôp—^å; à,!–¶.…t¶ø³,¤›°ð¤`TEè\¤Þªƒ ñ^šÍÚO²_%çç€{‰°6šn0';z[ø+BZN6¶A߯ŽëYƹì7ý“í05=/`7ÙöH[¦OÝZbÿÙt9)õR5{ÿd¾¹LŒ¸Îþ³0r1‰Á=4%äÒn´Ô'IþLؘ‹ÂÝ;Úû¶ýÃîL·•ÂÜö­"ðb•Ù—jû¥’ïßÙÜ€¸Ÿ¢T¸ÌÛøa"t¦¬»ë®îVEû®q+ÙÆš×ô¦TùÇñ²‡ åHBp\ƒãþUD2o³6;ë‚ÙiÙèáRPÀc‘ðdaïÃåeòa!ò Çà61üÃR¦úº¿ø÷é[èÊܘèŠpV„]½ë³«’Z=w—,ÓwDDÀgñÎ[·gæcÿ·dYl$3Tí *nUÂßj^Pe§_gCŽ«ÒE|“¬`Ýað¡k£òÏ¿—É´®zü›°({L©O…¿»Ì_jI¹°©¨LulVG â'6:ÿ~×ýz4ô±ÀÎ_bo²…!_ 뜷T`ù(©v^£×NšK…ß%Áº+ 8Öç[zâaÚ˜T`·@Æ ³‡²ÃXÚà{50Áòʇ2©ÎÉJUz$¸4ž2¶6ïF©íìëyCp¿[sG¾Ä%¢4MlÂYRÅthXOút%3¬muÕ4ù^ŸÊ6\ClwNgZÖ[î@iÙ˜aZ@ î aÀÉp«Ôàh…Hê?z-û¸Žb³5èi) z 'ömZìP]˜à—ÇÓåÕmh´áúÕ¤»ÇÄü;ÓÝéåˆ=¥¹ /€ó:l g.n„¬¢§´K"ˆ¸Âf²øvЧj³Zœ¡GO¿±«Oñ.Íi|€:3©–=s*ØE"Z7Ž êˆ Q“k»ìõ?\ºë§¬.ËP~wZ»0QÙ߉ ‘kÝ¿­§ýú"ÐåÂé9$\Á:Ã-ak–c:N½dêã?½¤ÀPkÕ-Ì{ðßW}3 çîªr+‹Ô?MÛQ_¨¾‘¢…:oÇÂŽ…*å^ Ø…ãÞ§çßêSêÓŒbìùî"‚ “—5·ý÷)½Ý6‚ãHO`FöwI Ò¡2‘wÇúcgŽŽU[ ÕŒ5S‹?”Uá°¥A£%&ÿ-·É¥ýÅÁM²ÜN€½ÎxS‹­ª.t‚Ú+m59NrÌÔǸ’bP¤ºL§­Š™á(›lûóŠ™¶› K±Ù÷"ÖÃ>„»|ØRl‰0Y:ò¶iRŒ¦ûOß« ¼ŒOíÔÆÐ) MpÈØø/¦$öñëHgaV’àøGš¤qéÙ/ŽØm$óœ5ÀÍýUUîJ(eç|LÃ7òÎߡ˜%gWÏæòi”c4Êfm<ç6®Bê_]ÀÕ$7¡ŽÛ+Ÿ}“€pÏ€€5oË´°ÈüÂ5qÀJP¬„JW€äï8oN[îŸ'Ž ˆð³@÷áŠqÏèI¼±é¦s ˜Ì›€¾£Mz¿Ô :»~̸ÁÀk ªKßÞVxëQáð ìL,skÊqÓžFíHRñ½aÑ/sšîL)äòüðhªN$æôÔÑN]Aç˜QÚŠeÛ|$[v¤æÌØ&¿¦Æ6H@¢Ö(‡ªÃ`Ý~D›ô漿˜ D™X5Öô€Ý‚Óq¾€`R³2’+ ñ,­£7¢»rÝöG^Y^õ(àŠ7ÔÈzç<.•9tg]lˆ†žs'5Ôä¿+pkµð 9ó@h«ªÕ“ssèÓeµÑÚ5%gQŽýÕ±j3 ›QIpÍ:U§êmT Ù­øïºÑ·ß‚a$Ó~b’Êù41ŽÓZÿÀA>Ü{ºfõ f²ŒK˱€çÓ3^’OoÓ㻆;¬9h›ð4ÙTu»­A9âD7~!¾#óÁrwQ÷éC{æReÕŠˆ˜ª!oG³.VqdYx”2.´(×ýg<¹ð”\óÝ8ä$rÍJé—¥Ì6¤(sóOµðí @£7+ÙÛÕo-¹Ý †o—£øcçà« Gü.[î².•yrÞq4^Fœ#† ™:Xò†Æçê{Ô\Xús O5ÍSlOÏ/[ èØF]Hݵжڙ.‚J/ pj`Qˆ= ¼Lø‹öŒ{zF°¥P;³°Û¾ 3™êÁ‚K…q Ü@IUJ‰j~Væ'„ÇAçâ)Ñá¥â¥,9o }ÓY˜=$œºcÀ}Žx ²wðÛ×ËÞsøµ A·Xö" hRˆäR­r1vm—G@Ìfêú“(z J‡qli7À’—4føÎ]K­T$€ƒœ’8D×½üCÈ ZuéËÊ’ø;˜„׉êO”Bqñ‰Û¶/ìE˜³‡~N÷ñø*¾(Ü7kËü®²MÊs-t{B«ð÷[Å7áæ hRoJò ¡®„;ðÖJ.S²^-3·´|†USZ®ÍîLøˆ§×ô”bbŒÊ‹ýÓ2Ù¸|M@Â$üc؉wzšmã˜8¶ºGUo—”Æ+È·þ€/ýž4C(0è~¶ˆŒÍý~¦¾Ä›óåþaÄÄ"õC•$Äϳóf½ÎerHª‹ªÒJ±&'6ÕÝ=ÛxÙFº4lF^ã>|å=u®¨.š½“(Š‘é\:V$ÿ‘mÕ ÿ<ù&͹ yÛÜfXžµæ!yGÓ®TA|¸˜aN*úùY_ u>¢‘´’¨í•àÙ¡mkÞÒÊa=7ÆËRõPAè¦E!Ø¢`y"K>—:-·ëzPõiýGÝ!0‹VÏÊÜÔ)€+A-|•.d &ôÞ[qGÎû8¦L×$²tt6Reµ9êf35±øóðñý^âçUXAbãßǪþÀ0ÛÃXs4xÆn²[Û4¸Q ¡tCZÌu¯Œ}ðÒd÷ uÌD&‘`ÃȰ–(Ü&· ´ƒ ˜¢”VÇÞ§ë ýJ¿–èQ@æýÉâ5™ÚâEÿº4\˜©ÔÄãÞ¾y“{¢—Y³QZ^¯º uS@‘ÜÎÐ]Û¢ó´èD PXP¡“^'Až÷ÿÊHœF¼ |ÓšW®¡´ë.ÎZ¿üƒ××gj7¸Ó}±fACFEoÞ ™jíƒsõ®œ¦Rô]1+¶S6÷VÉ»wõs.k®›¹ ¡/q”/3¼¡m>?®ñÀwÅžÜG²2Vu@gQ‹øMJ!VÕyç‚r| &Õ9ÑYx‹cßœŽ¨ÜåØMâ 8Ô¯‘¨¤;ú̘8”ô`ÂÓ…Þ–ÄL%̦c+B@m4s‰K B.‘­•hbð[¦ŒŸì÷¢Tv&£•ôÃFk…T±ÌG•é˜ü:c¼rŸI›椹àÚ :ÈÿyÑç ¼ qº¡˜ŒÂsW‘nÈüq×è²äLù¼·‹n¸A ´–œXÈD>ëôÈh¦f™¶1ð¥\ï_š)2Ý,$°È´íÊ…ã¹dä¯dÓT‘µµajLmÙ.œq˜—p‡ü€.ÒöR¤«ÂÚߺšGµé0ÓVü´½”iý‹ˆÖèц'mÆf¾QÕûÞdêËÛýÏœ›æ¶Ä7{«ìš™À×É/覑y5™Î‚~è‡@¿»ÈïjFÍ”wÜd'i”ïþÝßvSî³±7% ”Í‘–ž¢*÷ËÊÒŒxèT±ºíÊ)â.Ì q§c/£m‹u× *?§¾ÉetKäÐkH0¦»ê{b—b‹¼dÿ²ó6ƒ_€)ú »€ðZ¥âieá¸IóžŸ!í99,ÁI˜$›ÔôXZƒŽ``ßÍê³·ðdbSÇWÑÕ}“¼aõšo‚T›4fžyØ ðaWâ]U¤yÙúiؽ*¡xËpŒóÚwƒ'¦UêCÃÅ=“Z1cÒK÷&0›jËÎÑG‘ƒà5öW²­lŒKï2ÜPG]“ªgŠF.RKd`ûž'ŽÑaSŸRKQÚ^þõY¡`LÍ*Ð¥§ #7Ïâ> ïê„ÈÎû¶aåUâCemó¹±;Æ:ˆáÿïâñû3NÌY·ó¥â·ÆvG­Í”Ó_Þ8œ€Üá;3ˆ¦Ò¬nÐËRWËÜ»¡.3¤ntËŒn˜›§<ŸÆÄ Ò‚ZOíÀ{jÊ ž»Sfµ<™×™!ƒ€r!8µDðˆ›àØäÙ¤ƒµV%ia6AïõÕ>Šóʰþ“Åd† #•j| xMq•€cc‰˜ u:¼U‡E¬‹sÜÛ'¤j>ÆTS)´™Êe(Ô~òÁðÂá}Oƒ./»!7¡D—r]Î^ãMì”(¸ìƒ=vÿZ¹…_´}è>(„%=» Æ‘ Ý¿”Qá…¤aªùg]‹=|3C"îJ3 R ¼yeÎÈbÔ‘÷®Å.[Vãß<®YZ(•G`ÍpÚ|õˆM#ôÌɬªŠúé‰U“SÊ íE…pÑץʃN~_ÉÒŽéÓ”lX§ýZzÜ€sTnG ÞÚ^°'Á¼ttb^i¦­XL»::š£©a$4V¾ŒýU;:ëêzmRSOÛç Ë qö4Á@ÛÂPk¦,ЮÚü51>™¯bÛ|Âgñ¨G¾ù¸ӟwѶÃ>%Úœ<—zXUµ7³ hà$6}A\ cPtúžn¿™Ì/c¦Ë4u Œ@f-áÅ-tê5Üy5[Ö3rü6ëÕuË™Sséèxí­·ÚoÝÚ÷›—îïÄ[Àñ‰Îe^)]}rk0Žû°G‚å/û Ø-ºî†—ÈZm)>cƒUiéK2UóïLÜiÍîk¾ѲEaê·GC´•E­ógòwŸ*›Ék~½cpçÜ-¦ì!™½’¤¸Å÷YÙÉ¢ nWæy­KOïÏC÷D±}è\,lQ »[§ Ž{Mq ö·ÖeQ¬T6ˆC¢»õ1'»ÖéâAy3ßüAtÁ†V\¯”“ø:<„é…ßlu¶¹ÃxZ-v»d·=£pÈ­ŸËüðigÙxÐòÙOèš[ÕŽÇ'E8<ë›ø³ ;µ.¸H„Ýà; Ãz躕ôhQ_ÉM¯'QB¹€ÒÝ>ÈgÆP]sm™75Gâ`˜¬BʲåW (“›fÙ<".4ÁKënr^ÂÛÄ÷}4ßÐZÊ„úSÎ|þcTº´„—ÌÈ„††ØoE]<âê`\ºÄÛöNU=ì‹'$§>tç–Õ€HƒÅ]ÔÎUwKb~V¡Q ‘ñ-Øžøý¶VÛØì"ç¹e„ éqÚ‰oÃ<’l»ê‚½Ü`‚õ-ð¡n"¢[¦~ÌñPRßëtŽ Äðø¼”Õï±¾ÂÐtÄb«F އâï ‚YzÍŸôFM¡ü9 vÆ©@ß·GηÝ}‘àš:Ž^ª6é.¡Kk@R³móK¯‡5ÀÜ^¶FsôTjukÇ.m^`áâ~hŠf7Ýi E"hL$ÏØ£•ª"ú¾ŸY3 JáéÌ" F4,"”ýØgëŒp+÷FÁÁ¹ä¡Á>ò„äÚ`¨æÆ¯óíéÁòŒ+ïÄËd´æúmwí—íRŽ'ŸmÖã´õ£33©èœÌ*´ø¦€„­^žíQô¶Ô=“òoÊH™mƒ–'"6ñ$©©¨ƒ¸7R’ɘÖ<À7P͇'èeäîzÎUBØÃù+ç²%¥Ü§ÌtÙ¶ÎÆ-ñ_D»]Ú y¦jÅ_#›ï†ì”nœÁiõm¿S>ÔbµëºùcîÞz·(«ŒSüÉ_ïÈŸWJÏáë$‡ƒŠÊŒòæàJê“ç5¦eïí ‡…M"g\+ErLLP.ç¡ËªÝ+Ò’—XöÛ{~åÉ®ó›ÓaŠº@b’3ö=*6¨ðwIOuµâéµÕ莅Þ90©ÝEUL<Ú¡8íÎGΦ’‡Ôv²Þ7í¢†ÂÂ÷(Þ—NŽÅÈ) j.è„¶tP—7‚ú«º*“ŠH¹O®³Ó žCu9aÈÒ’Äá  ÑmJúõ‰íØÖVÀ °rˆËÊD¥(Ûx«¯S½“‡heñÊŽ°,Hλ»ÿò&µäÏEa‚:^w®Šˆè ab y1>ÐþÓ» °{Ÿ$Ùß„>.kÖ-!yÐ">ÕtOK¬LB=Ë}9#)¨EØý2dwŒÕLYÅfG~Ã3i1„€®¨®y¤52£ýÑhó͈ÑÇ)vÇ©lò¦oCÒò¢•ý 3˜ä¼i\@Wo‹f<¿¥œ¢äDÔÈ$Þqñà(½W¢i Öf²ùœP-©6vo¤Hy›ÊìQ`)>'Nq"f*€NŒY¤E@ƒ—ñ¾ÔÕ8æÄÝ•ãÓ®µäæ"þù¹–¹zÕ—Bÿ+–+ä§^á4«³"d$œÕ,‰à±T³VLcR1ÅÙ<…³Êô¬]ýµ‰-Ûl j ˆsgpZüû™/¬êXà)ZT6 0 ®Ï˜ _ ùž$Dö_ð]ô™Ày{;ÅÖ´J'æa MB”;rŸ]¯&‰îu|xXv£Yù¹ko½1Q(©Ãð ìQœeÇ,lU–°%,`ðËc ™»# …Õ½0Ä®·‹‹C¶—Ü·"½0ÖÛ=B„¸:ÂSÿ‰÷†tïbÄ‹zV¯êø¾èÿ±ÿG¨×NÅÿ -Å|+{:É%>0£\Ë+BÃáÚ æ*àVFbßGê[žN” JÛ« ;—‚µ$jÆïØšc ¨VA¨:ÌPÉÒˆ+˜¶ì#«¿Vœ%fö¿D~è_!“H¡û~hùª[{m4âÃw¥C¤µw} (綪—­¦„ýÀ‹è¨fj7šþÒE¶g£@íŸù¢Ç/ô›ŒÍ èDG4åõ A¹P ›$HÅÉgû'/]±•pN»Ù~n*?%ŠÄßïn¿v²è]ù6¡ò5½»n¾Ã‹ìƒ'ééÒ#îg¨Bu—øåµ :^¯nŸnµé¼U§jÈæŽMkïIçdÛTßö…¸p @ìF_.K<õŸÑ #çäD†ø‚‘'û¤ë¦û°PÞﳓ %ï Ç„hªË  hˆÂõ²eûÉí'z>-Ðdìƒ ùË1„1ÙqOúc\ÆÑ†{«òPƒ#Ùhú0C©´½~›c_Z³@jfÙÄ=/91ËФÔÖ HTƒ[WJNá²1üØwu^–ð;x™w.©,¤ÚìüsnÃvKÒ7¨%a¬íýšM} ToÕ×ݠ=_œiÌ@È: ¼“~Ç}âŠB6ÔÍ'ñ#uªìTÁa×}Š³Ô ½œä‰ô(sò-™—½Ï­Ö>ËY”? lròQ B¾Âדejp!÷þ©nן¡Ó½~ü$í¨Ç*éÜ ÜSa‡åÛ4êú“ã£Ãâ¹cÈÇGX5°Z)YéæœWtJWŠ’`¶iÊ#e¯œ2;Ì ôŸýCçå¶£Ñ`ÙÌ0 1È|PJ(†ÛmFVêÅ¢ùc`œ|tÖžg×Tx¢DÄQHk€“²džåõÒoȹGéÉaçN.”ØlߨtQë'ÔŠ­Ý¼w6„²óµ“¶ÇÒÿá-$•ê»p.iïOéŠé’ž¾£"fƒ¤„DK`-PáÂU,Ý32{(™?tCçEÒtê§ß,ÔêáÃa™QŠÓ¢}zK÷—Æq¯ÐŸÈ멮̈́–Tnð“TÜ” $ÄÛ{þ&Aw2¯Y•ÏéG¤ ]¢¾ØtOÈÝêH2"wF#݇'%%“v÷›–w/î”ÀÈšÁd3Ë+D ½ùn§©àÊ©m¿¬¯Åa‡ ¾€þ]ÉAˆÝ£Doûi¤Gs÷‘ÏØZÖ±g鉯ÐbÙÑÂF"YVvdáWª_#Š&$Ém«°‡Ë°P+Üž(£ô¦)óõâÝô‰È?Vµæš°.C@B,*Ò |Z§ö›ì*Å)!¸K˜JƒQµ y‡ mÕÆ ^Ù˜ö÷ÿÛTö]Ž®šÄ4ô¾™ÎÌGYÂ;Øj k!ý+Å'Hµ†%®:+÷ˆ4§é~VÂDºc¢j NîAjZjƒ³_}à>•B„_{ õå#Tø³ð/„®¿{âTÐåà…¯ÍËâã$¨õ1 :×`„»+áÚeTQUãó–¡ß´Á?¥;µka+¼v„ÚÈZ§xH´|ß;î¿›¶‰âùJˆÅÜïkiëeäe6õ°µk±ÿ}GO–Ý =psä³’”ŒÂ3)âYw,´òtÖéçú6 #‹‹ÊÊ÷v!ÞÊI¢wP4dn«’+õ¸¦UÐýêÉ”š½8­J8åŸ=~±°(¢R„ÖæÖµ²ÈÛZ)wi‡*ˆsɨډ®âü·àþs^óÉFsÝ©qY9C÷ÃÖ5õ *Å«SÆÊ•qÄÖhÛAßçûœ‹-ÜU7ýµÏ¡±+Ib3)¨ â k&…´rwôýR²¢ƒw†Ó°åø¬„ H8#;›ÿþ!“­gˆš·XÔÉBWë°»‘0³Râ+š/Á¤ yq™Ã¦ô®4¦jW 8îð´tŠŠ&(Äj¥¦Q] eiÒ…ÖLÀO[0I‘¾ÇÉõÒ P¦­±ª |¾¬ZsâÞÈÞ£ç>â"&»îF/¿Lµu%à#g]k†ECHÔECÌhá[#uO ýJIA–ï#@|ý:u<­,ÛÆÀw¶ÝJ¾"P{‚–€Â£Q4àæ˜–¿û×å¿iÊê(ì*dÂà; ï—kXÅXfä.R.Fr¨tMÁUš¿ªeÂàdodgÅÈ—ã1Óªo6 ŽÎ’Ê’ª)áúRí­¾ÓƒNÚ2ê×róÜØÍ»û÷^ò0ÜþÑ• mñÑkÊi7;’¸¸»S¿Jd?¬6j^ÿ= µ|v+×íáoF=£Ê×ÜH}ïÿ•‘Ü¿~}tÌ»óº˜ìÞS¼£†!$¾÷Æ_ôé3ôþ²<¡oªÏ&{^$ÿû\Ó2?×A0˜þ’0Êlh݆¥ßaÔíœÃ‚¥ç¹²l,Åø–pbR,æ£PÔðÙ.x¨h÷!÷ÖvÂ*ª’LÁ´§§ëúV»òt—Ñÿ¢_œXRvN^AiželMç–Q¾ÜñÍî[îa²ßx Ìv1ì÷š¥«Ï=kÇ…ûæjL߉P¡ÿøæß‹³Y‘‚tÚ­~@ˆ¡u_.EÕ_‹¥ÿÕü±Æš–MC'>fõzHŒj¨“¾ò?/‚óÉδL¢ -ñâüÊêÔùRÉ È‰EC„…áôíºÆydXS[æåÜ´+#—îÊH úéw²{d,ˆpñ'|Ê/3æn´‚‚ðùÿG2㮜3VÜ­! $ÐïzBE}ñÔ¡_ª"W33ÂàÁ·“7t\í¬iÔ’ÐÅìüÀ0Ñ×VµY9Gx³ïТ¨¾úÒ/dA}c—cá·”F†ld震Aê+¤X‡Bè.‹+B7ÓgbQJ„TŒ0±À|=Ÿ<¢[<— BÖë|CÑ­¿»{õ1„¦í8¬ø¤vñ&¹5zëó?¦øi°½8È­ƒÙÅ?A”þ½ YôdY¨XúýÅËpÅ_ý=í®s‰wÔî¦)M¦ÛÔF€T ûïŸ9¹ÝÑñno^õý2zÕXX¢»Àö* ÁãšH•ËÉÜ$yÎÎø$•²ˆ zŽÂJ¡øŠ{§§Ga¼å&ãHy˜‹¦*ä–„ˆ,h8¼Ô]@ÓN¾ÑÆÄ`¦*e™…s°  !Aù‹BèWöKo\ˆ;eµËȇ;Á©CšY÷ìa. k&±1´lAŸ]FÈúV“÷»9™Êëw"e§ôö³ïÔÊ6Ø•@¼[WxoF„O 'núÊRK£¼Å! ›£A¸ie¤z!ã„õmFǰÖRuH ¦8îÎ.¿d>O\¸"ÃHðf¹…‘¯~¶D©@X-k¯ %QóC⽦­‡JF8Dº¬wS-|³ð¨£+]5Š-T·1Œ>Ä÷W….i Ä]sÚô/ùü;6Üßä#ÀDmYfˆ)‰?ùAzÛOAÏÀF(ó²µw¥|ÉìN~¹k½:4 `»Ð 4žšXh"a{ç­ç›Š¶µúG"´#5ÍQMªÊU孀Ě{¾©$¢Ãö´Žu’=ló€_ø¡&SXѱŸ*ø\cõ-cœCµo®êAª'M¿rÛCi’”ê¼G4®ì…› §Â1(Mzo&¦–Òâ‡Jÿ;i`zmMQÚ%ÆhÊ!ÅKëòœDG5ðü°iaÊÛå7Ýz‚gÌU7ñO‹aÙ³ø[ÀZ¶ðË­CqæçSŽ@æwú^A’Æ~“}Pò>;Ê*ÙTÜVøk×z\×Ùë$2ä‘…O €Õ~aPa½ ^ÍÊÔà4õìʰZÂŒÈO;`ˆéèRDP÷‘Áâ©ÎÒ;؈H¢«"}zS4g™qñ4ˆj+aŒ8 Œ(#¢Maz«¥ ’ß, ¾=kÐL ¼‘žnÀ1Ưv€ê…w8ÖÞ[l}¨³ZQÝ_¿XF#ðá<ª³¶ôqìª×´‚cH&ðÑ+¥’à)áŸàHGI°›þ©G+’]f¡;¼Ã#0ØX/;z9uçKß“´V‚:DÖWö¥dXê¡R{¯Š¹®@ªê:'HäÕ±0]– {{ûLç¸6sUQëÙ:GâøÌ¡ð»»¹E’N*Î×Éã¯æ2/kÜ³ÈØ.L!íkR§w‹y ]dsÔ2àò?¢\¤’kÈW“å7R®¹¾4 ÿbS·ø"jÙí鿊A,Üd8H°I\œ´‡s,€”Nœõ_ñ—§À[¿Ÿ~=)×2¼ô–[‡>QÅGí¾ uuIÈ%bgdõ%h’ƒq?ÃÆO QœR“èGmÞþ=êÚœ~â*ÿÔª•Ê>¿Q½L§@R=›S“b€œÚÒØ0ÄêyÁ@üþáis×7KÖz;žQduBÛX6¥‘c•îJ4ëpÐJhÓý^Äm´ás*3dÉërRˆÚz:cV¡EÝËø|F±y‡Wy@Êt{ç¥9A‚ -­¶ŸÌfY,[J“µ##ŒR9N]*€®¦8ÇéäéþU.F™ÿ[ª¸5ðF€}òUuŠ>zÒjóªú‚b ØÓ^NÅ(ƒžþý µoûÌ´vüÆYšùk_R–wŸÓþµò)‹”ÉÃÑ6©æùÛ,¤šn—"E×»ø ©î$³«(? &p+i?´ºyÕ†Ó£ Ø t:-!%sVHœ-ãFjÔ¿}[ ì8ëÓ×òÆ[Ó_ö‰nŸÜý¿ÎšËT3k½–$bút˜ô¬’ÅŠãœõ«Q ­­ñ[_ƒŒguÛŸZœ9Œ®^õ¿i‡LGãÿÖ”ÅuÏíFQŸ™l_Új"ä¢ÃrÈáOËwÍ;<Öü’6™HÙ`§­TYb¾ f¢/ó.âwÌóxñK@ü‡z£ä1ƒ›ao]s¡<—Sq›¨¿®…¥vïùx_+ê‹›f:‚VÈäØ;¨]SË^˜ßaÚâj|9öRéUŽ;zŠ$ç+×äýJ–æaB_. žBœ“D¿Xï Õ26mÝ.í\¤±Û§ƒ¸f&ÿlB qt\“N‡àÜÓÞ6òÆÏ»Y‡n  îBÓÎçx=¸: ¥±íæ6ãÄ-D&¦S*"ûOcÅs ˆŒNÄ Fu)Ûj~ ˜#ðËC„ïï‚ÈNÿmK¹V³Ø^WòØv¾OÙ™HLÏ5y³yþ)ýRþ ù«ÿb95z9ÞðÓߣ†(ýRþb³ãvé-F—ÌÄAmçlÞ¯ý¦‹x•Ý(‚[CªI‰õpæI“[r«jŪgì͆xTÜb›Ô©æ0•ݬ‰»œ=[ ùv:\v4¬Úyü•h=¬,× SÒýŸâ[!{Wþüô¨Ñ\Øý‰É“5ºe¥itDpîÀ¥4u(䕨+55k†’¢p÷x"’³zQ.^Ú œB"²âKQ ¾(".Î :)š®ž°ÐÆÃͦ„K•o›B3!ð‡ZpÚæ"¯;ÊK°uô¦Èfƒ\P(›êËõæÙ…´ñ•ÊÒÛ¥ ”:0›þO=;ŽMOZ¯6å§£mÄ¿ê¾Ne+ëG?$sç²ÅŽz^V ¦ßæÉç5Ò@dt²@A½1o)u ª&3ò;€Ó‹ç\ €Æ}4* Ó§;«—ÞAÆšç÷æ?óïwÀTeƒv¥vÍÛÆ#+ø RëS;Æe6AÂ{ô ˜ò|í AØÆ,cñ»­šÅ {¸¦ÝJ‰…/Èb¥ÔIâ¬)ýkçìkd¢W§l{÷˜Ë8ãÐ3 2&Œ êþÛÕæOL7-ƒI¬°__@”þ1gnë+*S]rª{ä¯À—`ŒöA@UŽÎ~§µžFÎ|æÜ¦J w§)FJ÷ËÀ„hºÌx›†6MÉ›Rð¬Ã‘ s&BÑ€;âS8ð±ÓÜÁ6 `-1 ØFW/¾UË*ÎWÇ.¶ÇxëZ­†C!ÈbÜ€ÝÚ%•Êû2÷M›À£ît#?¶³™%€‚V‚Ç e„ϴ۹¹— i#q¸,£>(>ötÚfäh(W$¸k·Ú. È(ÉÎÖáÛCâz2½èí•A6áç¨ö•\H2?BRYŠÉ_\Ë&¨[ñQ­©ù?Qð„ÿøq˜ïô¼ðmå)ÄІÓXŠÿŠYWµ(„*äO3ý”2'ºýOºJ¯…“µÿÚˆ2c'×m¦Ùú%œ j1Üe?m]7ïoª<È\ñ6 )û·ÌÔkØýy&ºüXT:Î8~n”„Eb:TˆýüÍ| v ¼oúDE“6s$¸œëƒy~M/^½À»DBrëž»ì#€å?Cõ–ö]µ¹3ó¼Ó×U°PŸ·ÒŸÝ6h3›s]”€µa}wTà[~¾0ꥮ$RF¡2¼kƒM'q“¿ ^È`ÒÝÆd-°ü¢é7ʶ~´Ç‰$ëp^Q|Ôú0£c›ÍÕÚðß=vÿMðR†¡&ÂÄàéüÅÊôÆLXýÅ! ôá=}…´¦¬IwzÚ(TÄÊzâ`Xë ƒ$ íºó¢Þqä­Ùe4 20–²”vo€ú¯§pÒ‘ ãPù˜I½ŠZì‹Q&la¸mU‰>%:øµu¤Ÿvkm§0'á*–•ÃÏZ/+¡lÖËî™5ï˜ÒDí²\ZŸ˜¨#ÅüžË*)zÚ…®÷g@/Ÿç3·‰þ‰»F¸e0ˆ´mÈ‚Hh›‡ºÿNŸö›<€çü¦5/À‚VÄü†Yúw *èR˜ #oSÿCl4pøöÀ€_ ýª¶ñLð;ÛÊ„´— ߊ öD¦L !8e3VªË.õ ™ÈÃ4^þÍÕ™{éFNqXÕU•ŠÔIB­LAƇž9`*KÂÀÐyýÝj²œ;,fßœà>¯íÈWµBÙž.‘yÑtbòÊËë"ûkÎE^¿Wz 3¡þG¦/–õqÒ•˜“M®ÜD‡ù˜lXärj„õ1 máY¢çÛÞŠsɶKáΦÙÄñ»ådp;J•Ëx®ÝøJ?§U0–>ä¹1“ EÿU &f—ñ.v‹ªYF|c¾¤¸È®äOþǃ©Œ€3U˜‘ŽEІæFøbœôí¼A¥¢Ä]Ú&2e¦ùuÛ?$f.r%}Z¦xn¨´Œ~‚qj{¬Ù¾^œ0{ïÚë(É’¤Ûíf¡kÙ9øvx`vB÷w°ŸSúñõÇRD19Y0M’{J¬ ix(7™ÛÑ'è{oD%‹Éy©ª¤ëôpÓ’ç(‰ýÆ‹QeÝÃ`õT\¬Í² ´¾8 ¹2ìг u°§Ä{‚1K<ûTÚÕ~ýüöž'û®»&êËïu—[íy;"À>ÿüÜêÒesp>¸œ“¢G,a-µORÏJzåÔÝb‘@º”ý!eøæjüœ£4o¯lLß<íó5ݰ_Ëú¯!Iï¬ÀàîˆÛ‚äHeÑ'å´7xÞùDZm__ÖROHî…¿/U0ä^Ã'ÝëléñAªò: œ-R^«—)š4bRŸ:x®f‡x˜*3‘B‡‰`ŸÄ“¬“Ѽs5¦ ×á&XØ­{[ ±\Nn×ýÙߘC-ÅqÁÖo¡k2Ü `ü±CÊtõù1ÇB;|1÷Ô^kÓ>ÄšqÇöääc7“~"ŒS/ѰŠËNSƒ¤®¨É- ŸP;Rë*ô«þY#U©,tS™Dòj:T““ö+ø§žâÿ%c¤oÔ%35¨=ÀI¥¢¹%ØÒžñg5Þ4†y ÉD`å=Ï•á›û—Ç G€á²Ž˜-~yˆN¾­V åOJrâÒ©^¸0ÿîÓ ¼3øÞ¹ôìÔåï9Ë´»Ù™á¦t~ Må­™áŸÑÃ| bv×VK n(6ÔpKοøVT+I Bœ8ü…œjÌñýµjňSöœú‹¯¹z_oxc±Ý>Ý>Íæ2÷МÄùj©WÐoøÇ6ÝÍ'ƒµçi1Æ9åW$º•®ƒü²Uê­nÁäL©ñ"û¸÷)ìºbZ™‰á^Á"ÒîE19½vfÕ1ÂwëTx‰¬|gUÄ-É›¾8Ä›ª~m¯]Ä ˜ËȰ¹A`q7°<÷_|°DÑv6©T ä䤿}¦võÊ1X‚à/3Îe IAp•c}¤dÝ&ØÌ‹dQ„¼œEÉS+þ¸2¬hDª~î­å -QEx·ròúlP@Ô$ÒVøZ8Š™È2KžØòkR˜Y•DÙI'{¬ÁÞmž4èŒQ)Š?:ÅØ¯0„¨n‡øG]w †Õ£—Ž9£×~¤¦ìÆSËÛ"ËØŒÐ[^½>ù›¢¹Î;ènh’¾ k¥÷-×?ú)ÆvNs…~·\Œ—Ÿ2·uZ`ÇR;iQ*íà‹t"[4”†è§w6GÞuûëÜÊž©¾j+Q´­EØÐ `lçË:…tQýŸŒ G÷Ê3|¨ð;çô1ðÂB»ÓÖ=ð+@oL©T'˜‚Ö‰î[é¸jö!µµÓ¸©ôâÿý&Tåߎ­ÂI\§Ôm÷¸­´Ü©jÇ _M»è:F„’áJ¨ÍËâ KÈ­ÛT*=¾­÷T»çßi=¤šÀ=¥¤ƒ 7Sñ}+4¡¾qñ7¼ íJ3‚¨l¸óÌÌm dt‰wN¯«ÒwN¡1DFMzÈ@ùì¦ã2ÞAl¥¡y¤Ƨ† G¼Û68Ø?v¦b½Ã3…[ëcâ!zŒ:b|šŒ(O“kÔ>ÒuCZᩜþ¡-Ó—ñ³MŸ8ó_/¨Ý^$¬Ë[gþu$A$Þnl Aƒ—Ga>»ý’¾kâgíƒÜþ ‘fÆY`$²<úÂHaRbݹ1Jé{Ès»\¸wMs}d#’>ÚȲsQ«)³CJ7Am›èhb“}ü4IŠqð¦7÷«tNw i\jhe®\žs»FZERPÇùö½ÏïÒß¹L'ñ%äPЛw†ÌZy5°ÆŽåJo«þ2_Îöü~`Á’ƒcØÆ3÷ÞnçËaR TYE†ìà:à‰-#ãëZºÁS‰h“!øq½álù‰cËÕ­=7(‚έô¡\_nGÂYhÁåêZŠï0SÀ&lí6ù%½”gxÞÝ,úuš‚'ÉoA $·§Qž:˜•†ˆ ØÖI‹Ç{â4Âî'ênû§Ûü¯K¨øŠÿ”× OPvvɸF|]WýS³¦È÷™Êò2€.qŒ›ïâ‘90gð o±|‚ç¯Mvnr(°x`{ë'¡p7ÿ™sæ/FÒ{ˆZ›5bÌuœ2[\4ºˆãmûuwƒ, MWÅS ÜLü´ñ_ë1N¸¿—ÏJÃ'3çÞü½'•Àïÿ.ê™I¡ ©·K’Ô4±¬OQŒµ¥`³,EfDõ ¬å™šfnRŒmäx¡"¢5<“3}ÒBcô§äæ úÚ¾¨v”ÿë†7šj&˜!ž3%„‘}'±y¨Š2Š®Ým°CúÞZß[ùMáR¬3ÉxÓ €Åcé+ÜÍâ®Â‹ÆàºµýŽ—uTÒ~#?µ;™&÷[ŒuŒ ͲÃfk׊èÌxñAúþV/ª#…¦3D- øÂ?á»õMX:Ã:Šßˆ~,Ë£ ž1Ѝ*ªUŸh8"t4ÚuÅãÁÔúݪ9¡þw¼±ÿG&U»T^ÿ?J©«—‡žœ=UÏQzrH\¿~ÆèÔiZ¸'÷Í#×ãÛ$׬;¾žW@—¤²~û[oõ…c®s܃vB³–eб27 ‘oɈõý]úöϹ,×#æ0{ÇLjS(¸áÿ 5¦`Œ¤¿BJ X#;!˜ÝXWXöíwÖ²‹€+ÖéUÔ«Q êCŸÈA ·&ÃA‘&¸JX¦jºUL²7>ˆŸ Ä8~ƒvÀo³m7XKaø[³iJ¬ðêóâŒ@E#¶€P ÃÍ*ï)²S3Yx(¬Á¨©ðÜ<Èÿ½™Ú«Öa¾ë¾öw˜zÂ÷p”fÉgcFH£Óz{¾¤‰Š—cÓ6}šìâ<ëÇ9FÜöËþz^ÉJ˜Ø[$˜ÛºÒ­Î"â.þá9¸gÐD–¹ñ_‚‚½M-GêÎOþ&›j6îÙï‘D4ÓQ礲C•¬ä¹³€B«ÿ°ÆÑfå§qè"ÄÔ]TpÞM {ŸFÐÓÀè„Р*³ä¿½—›<Û%™µ„Ö_ÿ_¶Ínߣ²5}I‰ÏYŸ„9€©Wç¥LÙ<}zOB¥ ‡¶Æ)_;©èPóá³Ï£‹ý 免  fõŸ=Õ)Õ$ÿWò_ “Êu¤îlÏÏÑm£à%ñQ‹«KøÉº®«ìñ•éçÒâ?_p_uš”Ž{üüR6Ôs—ÊÃsåo<DÍngÙ7µS¬jö³ŽôWÅ"¸UÌÚ •˜¤H/u½[Ò##ˆtÍY0'?«¾ù6Å% bbO{Ö·WPîæÞWNs\’:ÚŸB*†æ²¦ > +hO\³¼qºAkõüïÆá´æˆZ#@Ý'á çñ†jcHÖŽ¸c+îù霓°Îšº¢Ã—§]£ Ô|ö–H=&kÈ‹ ·n@«ºûQȦõÖOFyÜRNݹÄÄ’mЬö^—ô›RCæˆ1vLNkŠ7žÏÜôÝ·œBøSEXŸÿxnÑŸPú[ä>)-â^dz·v~Ì™a½Mf2óþ‡ E ^µÄU¬@íÍØ‘bˆ]ºC5K̪…š+™¨3 ùkŠNÅe£•{“'7!àhBŽo¥Y›ðYAÊzüÖ­l'#ØJÔõ#R6Ê€z)ŸùÓÅë·7} P/¢#´„ m*põ‡ò•Km[»T ¸¢«T÷fó æÂÉ ðgllú4Ö8÷]t‘g}V·±®¾'&nDç¡&Î)6I¥bðÜhòBŠö£ˆÿÉ%tPv»b&;¯?²÷5´ß¥os,õ>2Å×$’ÆÝ{H…y6Bl£eH{{ÞèŽÆoenÝÞ‹~•xqqh’-œáðP»Öíîëo½¤ÚþqÉ y5Z/K„‡?ÿ.c’4`(õXLÝXãv?sT ÏT¬Ì¾[¥÷ÖK;À|•âªÓ”?°CMýDî° ·ü®ã@õÌì òêbíN¿x%ôã+<ù†ýþ@÷QÕ# Z 5Ç|©SßÒcTˆéìqí®“ Ö#h~xuY‰‘É»nKÙÇžƒAÜöe£G+k¯Ã¨Åo_‚ÓWã¡)ekkî¹:czÔ´kmܺåxè1–9…—Cƒé–Jè ÇÊeЮ#×óâÆxx‡%Wcóy|š‰îF[é ·57ŸÝXù$°m²[b®`ùUŸ@­‚C‡wÉÇülS q)9Žûk ^(«+­­ý—“}¾Žæ®þÞ£êâ¿ä@ âRÔø(ýBuP[¬7 ¥|íy_b¼3 {­Áo£+L’}ÓLÊï¬?¨3cÏaÞã’¡ Å[ì}Rª?¯µê*›uX &êLEmSŒÄl7X·lˆÞJpl÷b=µ+;‚ ãIö]žÌiØ>™áE—€N'ßn¢{ª÷ÊÁy£8F^n•˜[÷o£"œvIžJÙnªãçˆEß¾@u I5Í"¾^¯é3˜‰?RÆܶ¡+]¡Òæ¾Aé«}¤ù¬*7¬nîî™}YÞ xþjJ»”+ 5¢?ïÜû>¡I¡ c}4ÿ©¶3•JÙun3fâ^él†%+ÐüÇ«ïlGc©ZI/Ð^õ¹Ðø½_°¿\n= +f ¬N,j!Ì_Ȳ ”j:¶v¥ÁÒˆR>¯0±OßkàZùü0ø­ÿI)$dÜp=‡9¶ö?ƒi D5T‡A(± X+¡?Öæ0—SCÇV5ñŒ±Ï¶¬,Œgφ(ô3jÎn%~®)ÈMMH–È­í/ ³X'>»\†îh¨ÒÃG@Ê^¦¡Ùú ÝP4˜d^ØpOÅž"Í–¼*¬6BfÅÊcpv#¸z0ê2m /ÃAäe{!@mâ=ø“0vÍì|v®ÃpqÓ- ËïêŠÚ}o¡‰>a‘M¿èÇhÓ?¢«9õ׃ÝÁŒâEꢡQBÊ;s#ZC2Lã»JfÇ‹ùå`ˆ™GÍÆI ³ËýM+ö»QaL]sÑ»0ï7M%’âÿD§évPªÍŸ…xëNJV2 a€U·á€é[+‰PpåÄÉHÞX¸˜-‰Åj…OáÐÑÚ B]cÅ©­%§Õds…`ƒÈæx[?íu§Ëh Ï:ß!ÇÔ5Uöµ¦[ÍkÎ c!u¸:bñ.¼RóÍ\Éë:ZŒ¤FñU_È_]ºL EÈ2ä…Æ©ø0О“TøXG-®f@™›¤µ.¥I_{ÖÕRÃspÄ‹ &Wájk¡I…§'˜»ú¨Ó|xc™ú9»’š{å`ÛPºŠ@*•gÁËTÎF+®r¦„«/vLzñkƬ$Z°YÞÔ¾vc™uû5Õ Ðùš½Ë+,ïŒôÙ«dcVŠEéÒiïJÃfSØ/ÂÕnOxW@n\íÍY÷7WЙì­ÓŸ¾Lóìk]| KàÃò‰‰?"Í’ “ˆžÓ6U‰LÕîæ¥…Ö‰¶^÷.ÛÝ$Ç@‹)íù‰.A¿—”ß7dœo—ˆ–£·„ž¬ê‡ô‰ŽËx3„úÿùH aàÈËz¥yå;x»7Kâê¯bŽ §Í_% /å6f_ãøäž°™ %p!S[=x''Òû@—dÃ_Žøãõ´¡L>æê ˆT¿‡Ónï$–rÈá§EÎß•—N_¼¯S½+ZBs´âúXºÃ0Ø9:¸'²K£…G.o;9„kqÔÇQLo®~IP£·1ÞîÁW]qáUÒ&4Gø7HÜísw[RUË|–Ò¢ÖÈ®0qº8ÑÆäZoì/¿¦¬!Ô7úž¡Fáó8b w¦¡Ø™WŸŒÚ]WWˆ22ç4ð{ƒ_/Ÿ²Î‰FYl&ç ½Ê9ú@~sÐ¦Ø ôPSõÝÞÔ˜_“÷[»Dõg· óY§÷sè¿ÖÇÐïL€›E¢U‘†üÿìCI=˜ÍÛ¯¾.E^&W!P±ûÇØÕM®±`ÝûŃ„¢ZÓ:i±Í±Ý5ñöüGog6îÖ•†²tl‡=ã O餯 ”²†"¹ßW]ÔJÙD$ œÛ`ê8ŒÍ‚©~ÐÃÿ5ÌwÜÇ{i; \¹_l`ÿ'E"¤áfó'“™Õ^s6\ȶäŒ\qW}*¿¿AbhŸvÐ Ý àT¢¥jÿt™<ìèjcçüaÙ ;äÜ»:nˆþòÎd{dV# v„'@áÉ?ôR°ÅË8?™fáäîVoïàZ`ñ Î3«°À™Jdù0¦¿2W´è@2)vâ„¶bwÑÒ±5ÍÿÏÎ8 Np!HD·!}+³ÚÓA¨>f©®u,hý#Û}¨Ø‡kd]Í—_é-ޤ«þûÃL©VmO— S’ã@¥+#Úr†ÜÖŠGOG3sW{OŽ¥rþnŸÀý?ÄÞ N Ì(LÉ“ž–1$‰n}*ܩ۶Ì|@ͨ0qš`cö§á*§X¶ %‰žFckøÇÂòÈã÷N·÷»×"ƒðß‚bŒ“ãe’ç$P,£]H"ùŒ‚XŒ,¬wfIYÿÝZÑrÞª¨è=Ÿ{-òæ¿G#²õ9"V¹ES ëý¯òZæ£_q?ƒÛŠÅŸ’õÈžvÝò£5_¾z(–YiD©ºé ˆL±Ô)…ììa“±í°ßÔ1£”v¥*U´âiIžÃ¢]dº•¡°üW‹¥4Ó ÆG;¿Ö="œ­óFÂÃr™FãSÎâÑ’›y‰ÌGÃë3‹·¦güÚñï©Ï<©é´?®w zAcq’•ó ›©S0ö¦³NÂò¢(~R’s*1Ùôˆo`Óµs1g4³ÉF£7eb‹Çë Aó—Ùµ^èäSŸ~ ~hérÕ—‘Šu+{4ÝI­Å¡u0Êê6–ŽÐµ òÃ'6=º ÈÊÔŒ‹A>=cÄJòZJø¹ôªš³LM &¨:ìö ?ã-¿N¸vpÈ侉íÞÄá)“ï¥ãŸœ"´RCÎæäùèT!Z>Íž kœ‰‚˜÷„W¸¤|¥þ/äλ ¯/†¿nVÊÞÅs~޽ɣvÏ›Y­ü®.¸¿ñ¥<\ér¬6­&íÄ®‹¯A­\YÿVòÁúŒhOÀ<¸ÛÞìjU°»ÇOæ†Ô¼?Nc^1Iû¼Óê‰ÒGÒdjkJTty]SWãt¾Þèê¼æ×…9£žá¦ö~ay1ªï°ڪήÌ8иHc†@¢e\žh1áÚ´žZx~“M¼ RÐú؃bßþø” ϲRƒÏ¸øÍùYHwu p—K½+&Lõ=ŠÅý/IИž±¡E˜x¤í­Ó57ãG+Y›Æ„IDqŸÛ¤›i©óˆm’#¤Ì 6„ƒ’ZüëŽfàå[Á»3 µâɤT2IŸf*z”,»Àô…_5Áýª#[bÌ€*‚@•=Ðô¥‘×t/Ò}_Ì,džDæë. qTÔQ<ò}(€¦"ÃEÑ²ä± Ö°ü{˜4½ÕØ>šJw’ ŽÌÙ‰ŠzfþŒWBzÓ vàÿD™½N:µ K·È&ùØ•!Â[±øÆôêe[ý»öKÖ.HVèo^¯'™å—Œ*â&ÛŒ9–nõع>ÜA½½Q€*7µ![n ðIãÙƒw$ÚQK†î,Ö=?Å;/i"€'…¦B"%¦¶Ê"É“Ú6LÁ´[÷ØÚzpú~­½T ä—ùHŸÜnœ‡Vó;Ω»´©ªC]©¦//Ï)0x3èâP/z|@·g¬¯ƒ£s쓌è—M´-þµÍ;Ù(ûü©ÿ"m~‹9ߤâ…&U¾¹Y÷µë—uŠN—óÙffÊÿ9¨Ü¦¿S+qÍéÙç+âàqv:4åÉZ´èú—[ÀG5Ÿ÷ÃeõPÎ1‘¸m…ÀПÕÜä ±‰l ÙÞ¶£¸Ã9—²‰ |è7¦íÝÏÓ¼¯Óª´³ X—¤qþŒÀ* Kþª6Cm½m÷¶‰É{ÈÅâg=Øã!îÖþ6zÛ º›€8zögAzŠÀ‚Kï:ÁheŠ$L®7;Ï)Ûæ”i¬ø“,8fÃÄz¥ÞÎ&ñ>óå¢M÷HË/HüXxàÌx²å¦S¾b }/D½á¼ŽÌ½Ùu”¬0nÊä«êã™ß—ÛÃò…ß‚oÄÚ18îÜÎýöÇ(m‰±òsõ¼i!@›È]g¦aŠwipKø'^ÈÆsœ£ ÛAråâ hˆçEå™êŠªãu¼œ»‚%,¡¬0éyp•Æ3-ï¾”åÜ7…*ð¸oiÒE’^yœñ­?•±DÖ×2Ž’ÐzȾ¹6'ž3Ctž¤wâÜZ’È—Îòâ+4Hd‹0òMñ~NHÞŒ—þ Y±š›Ø4¡ŒAÒü7‰Þט4•8û 7V ÌbÇùGágÙk:dzw^2ËýÎ)+p’e„+³¼a€›¬ü$f#…:¶Ÿ¨÷G&˜[ÈO¤Å¦Û²<§íáÆÉ©2îù$÷Ež#¦0œ9ÏoZ §sßÓÅsdŽ=¥û Š1ë¶[ µ¶J|ôÃŽÿ(Ÿ.J˜è>Œ9³¿ Ê%#-”äYøñx¿wéÝ +ZÂËè Ñë‡ûÿ:BÞ.›À4µ°wΨh°¼¤VÔåß§ËòårNxr×4 °¦À5×Ûg|öĬ±çxG~c!·#bôO3æ":wY ¹ÇÖ M9³ª4@þícøj»*¯6’'›É¦QÉÃ¥eU|þMf…Zâ{ˆz¥‹ÅtñuÌËÀÂOÀ²¢Ú…§%§—M? ÄQI¢Å{ql7ƒAèáõ[ ÑxEìÿŽ Aÿþ&÷\a¢Ú% ž6?NRÑ1 }ïnÜE»±èŸ¼F‡ÆœêÍ"ý/ 2™~†æ¨ðöõy ðàÀPŠøýÚžŸˆäªçk~*[IÔjœîо#€¡.£t»½]¦È‚Õ²G™A.¤,i2wõôÉyÞìó® "lÙ’:çáÑüŽã×ó#SQ(ðâþúw'@7æÛsä˜í  ëÞü äuo6þ±ï yªû$¢‰BÞ0‘¬w`’á#ñÑqÎi3i p‘!Ó’˜Ž‡%_gú—ä’î5/ E1Lá¯:0üÿCµé²98Ùsî>šRÖg‘Òà1ôÑŽ4“ÜßmE³£¶¼‡©½â©Ò#õÅ n©Þu²‡òUoât{‰XÛšËÈW(´¬_åÞSÌ=Úrâo‰4Ðx;¤`u½RUð:Ó†¯iŠ’(nX›â®ùTáïO‘§Tʘ;Z Â3¦§Žô4&¤¿ÕàÉg{ø¾iÀ/íB §úUÿo¾¾ ~<…P‚ûƒf½î2üE÷­º~û8IåDÛÒ–›!õqmk¾älvjBÍmÛÎmõëÒÔMÂ9" 2,'Åž…YÅã’Õ¹»¦Hòì0ñÕa5œ_±îÝñ!Oö¦œ»ÿŒ ³šöÝ¿U â%ÞoQìŽi†ÄV·Ð““ië{•Ð÷yþÃÙb¡ÕÊA€š¿›Kÿíä½`ËöBu }¬¹ 8•v»?Mêg;Òžsr«m÷™K-€äXN-?ÖUFü lÐÀXâ–°ŸG«/s‡‚¢oØsç÷€˜ûðÿLðÓè­¸…q’X?Çôe¼« þñBN×%¬õ;˜Ÿ)$âLõu)áRP ›µ·½'™PY“à‚ðãïklWPâzú¢ýú9?ŽV­wCoÂS§ñ5_8ë°~›QÉ+}ãd’|òh¿ÐÿYÌÉL@ävAcš÷Ÿv Ð=ÿQƒá"Ƚð îR¥Eý4 á>³LIq&*ÿ.ÏÖ/L| õÛ‡•Šæ5Ìs*ÿ(åÈ×1IIŽe\ŪxÛk½%÷K\±Äñ‚¦…ì!«â<Ë';0h´~ÜaZñÐÕCI Mùªºý™úˆýç@þG¿—ý}˜ƒ³¡ûZñU!Óu5‚23¬#zFx§¼y O{÷8.5$(©ð“y÷ÅhÃv¿†ÞÏR–ó:"]åÀy&þß}RÉ_ƒß6µºáɹ|}³c™Äì6DØè³Ã”°3^¥V¹]Þ±ÞÍè¯Fé°G™—×6ÀšcvŸ.w^„Èx8¯‡ˆ7 ÌÀU¡¬ÐË#ƒgQÒˆ€ ˆ¦CYè%g ãyY MǧVþO¯A„7Ò4k&§Ô’+œëø^t’7~ÿæëR…û&ʺÄùþyú¶Óqëà‘1˜=Ü õ>OõaÖåÉjtß]BiìµéªV1 ²ÚsÓ±ñoµ¦ƒ”}¹ôC6ÃÁÉ|J[´ˆ‚á.õuÍçÒ Í{¥%­ÏiIòX?Øró ®Q›ÿ ±Tƒ·ùθ…omŸ>:ÈØÊ,ÉÎL=ôü˜ £àÚ Èõn¶-cÔ_¤Ð˜ÆïÑuW¯V T³©ŒÞ²'9ýÊU‘ë-ßÇ*1úwƒÏ»ÔGV°Æ(*I×£– EÍxÁ˜ñßT0?CZé®%Žå"‚´ú6ÈÚ·8ºú&r–󕃦k»†ÿlpøxy“«Ì{ZÞž¬¤Í$=ÒI.Næñÿšbg¦çšk-QîkaŠ‚r)½ºØÒÓÅAc&vœï§†ëjDµÏ!.ˆbS›±O®šXˆ(Åæ(½UÕ†EEfTµ4i;’V¤Äý6”›ùDWìå€Ë"5U’ªHú2tX͈YügÇôÚZÝ߀abˆ±Ý;bæŒËQ›¨©cº*¥”ç¹k2pÖ³ÐÖI“—?<#y§¦¤!41ÏÇ@lIüãªKE!ülxô5‹•4+æ†Eôø³ Ï Ã¾Z ¨d?àDÞkï½å¿ø“—]ùWcüADá0‡yàÌ•Eª\ÌE(–TWTÌB([©3ȘE,±}ºÚù¶ ŽÐ?NxvmnŽàgê%ä3 (È[¯‡réñú›I¤›<Øî|šy Âæ={ïêxSÌ"$lïÊýE½\GZ8Û?®ºÅþVPÁdÜ_:<1gG+É®%˜ŽÎ,0~Øsß’¿}GnlMk1ÕT ¢YËâô#«6KßÕØ„hjÊrmÙc¹!™‚IVnTÁùÀWŒÂëS»)~.`¡„ê¥áùŽüFxeΓTí#ÂR, {¨$ë» Ç´n—X=óv±¦´0x±Ä· èͬ“DJðeü/=2&h"?1i.º%›X3– “Ö„KAžœï¯´ƒUHFŸÿêZå2ˆ/Á)¦? çQNòòÆÏU%ÎD“4B3Êf¡tp+de1 •‡ „^Æ2„+«§R›”ÅÙ6n÷ª0»Aé,Vbè#—+é™pªK$vø p‚dnö!k„‰øL!DÏm$Þäð-Ú’R¶k¥v¬úP9×9)cÎxui˜aöʂ۶ƒ8ôý Â`wÒPËí²Y$;’·RçÿŸS-–z-ïÉ{Ò¾ásõûoç3R›Ó0…ÿjçbûm€fÎìD2‰ã•ã9*„î‘”© . æ™þ’¢2ù@™Â!¾:‰l(!ƒ³uv§Þrz¸'€HKóWXÛfaH&sPÒÍÙ\44˜é›ëÝ­@H‚ø¨Ü~½käð7ÀBj2\2v†x»©Ÿr-Å ¦%g7z|`È¡¢0W ¾âpÌn|xϨ3fT&ô¸{‚™Ò¬Ý†+õÇ#øû¤_v1À­PÝÙ%'ËAAhñq­ê˜*´&Ïäƒ"D“|‡qrvC [u³·°d,³†ñÜᾕ]5–xƒã®¹öóõ³¸•Ý_]°¹Ôòå´p·¦ª3í!*ªM¥ŠEml®.t¾¶#ÝæíõÉ}¢4NÜ |`u—®«w°ÂÙ7®Q(Ç.¢ ԫܸikNRU‚£ó b~zڤϲVñÑÊãö3Xe¬Iïõ™}ÉíMФð™H”;›VŽYøÛ¯ü*’QµšcZÑîm¢ç„>’Õ±LÃ9ZLŠf.˜eH øLÉãÇÙÃùÆñÖ"¶š•â&\ÙÕ„w5`ÒI$tW¡]#/08}A¨›wÊ }8(ÞÈÚ;‡Õëñøû­iÙ§>£õ2* ¯'j^XX_ðætÔË>“AOãâ†â]Õuž‘<8Ý*rBç~á¯Ãb’¢my†˜Ëy¥ý˜A-¦29.Œ[¶'f¢rT#(ØÅ»aftæ´$ÃÉ#FV9JKm;Ù–Ê/a?e ýpÀì(œæþÐïrï(D"G~ÔÐ0óµ¢ ôäHÑ'ô›Uñ¬Ä ìIžôÐM›æOyeÕ%«É˜;hr.YŽTÓ€r½RDÎÄäXÛêh†<ïƒÑ7èÔk˜çý¸[•†yé™ä“ ß‚lØŽê<@çÔeŸì‰ÒöÃF¤AŸ]3Ks´r ùÙ5Ñ$‚d)ìáI¨œ.åŽt,¯ h—ìËë“í•Vu”´aGvÃpeL-Fc)2Ôa„ˆÑˆ³Ò[Ðÿ÷Yw¬Ahé Lj7§Ñ§m6nþOÌâJÝ,™ócY#-5R~N&J†_“YŸÃBÝûÇÎ`›Ø°ä5&”‹óÙè“Fb«ÅÙæÊvn–û꾈»ÔãHˆ˜ ³l`ì`šÚNÞ";)9€õÖî¶3m5 <º0Ü9Yƒ7ä/cfG¶D6Aºn ŠYÊKI|h|[ø/i„NòèEí˸$µ|Xïkû£ÇÊ;ŸÁê=¼€]&«>:O&J>3o“N2:X&ôƒ_Žõòá'IZ2ŠÁo-ÄL]’+²BgWD´  öЬ0ÁŽØÉ\–MjEÛskŸÓ Š+MçO:/;Ðn¤Dm™•BbKÕ7ÖËiØ^BªÚRv†3…!;y>l¸ª§!#ýÓØ9¦cœXsü1 .Niz¥@ÓÎ b[õed‹ë²ôƒ\Ù+âÛ¤aX¥r´JTJÙP+}G™Ž£;x‚ã"Œ‰' >äõ+äDiŠæ4öè£2¡"÷:yíïËߘ•"+~u½Æ7ÑXWê¼–•+‚ fÞ OÖ9Òê1w¸°–2y+-côÙ0²_ùÜ Ø81s¶V»ûª›H®ª„ˆTÜÓ?‘ ªŽÁ)ˆ&P5VÚÝœb(þ³Ògzu^ÙÚ5?€z)¿\“~¸V^¢Ãy™ á†ò»AC9Aî¦VO?õ›H— }5vû2¦…„ÄGÊqRNe„7È!>ìÝO*TÉ·P¡xIJ•a2íoó9iO@Ð h\=ƒÊ"n<—›r¼Ë ‚k \Í—S}xE³U³äJLGâ­½ú£䨳uëeý¾Î@¯ýDp¼\À‰Cë3&QÞœc‡·‘W"‹¢n²kIÐò÷*sg7@ó® OUÞlô-¿÷QÓ‰Ö6‰¿WÛ­›¡¥3ά|îØ.ÐX¾xqmOI¯¥ð‘JÛJµ¤'ðn’"¯F,‘1-×N˜"eê¬<¢ ÿIÓÁzºQæÁ÷z¬BÓ­ÍÎ@ß̱’un TAFÅyy…¼¹L~{”e+!–j>á?Õö3Yá:ÒŠ#³°,5\(Àøx QgE&uB™&IÓÁs;À&ò ÚQy1P! ÷Caí{Z£©2T4žïº›(3åÚå½ù;:Lºj€È€çOÖ!'‹C€ÂªgùïA–ሴޡx,@¡âžƒ¥ë¹8æÚf¡Öw‘Éþ¨lâpg´Vû ¹‘»íýšTцhFFj³³.=XiSâpòÇJ½^ùj*!TgpgîçÇ$lû  ¿NZ¶JÃyy³lÚƒ¤ë|Ñ-RNrE± U~Òf”‡±6šñÊðò?û°>]JV9¯Ô‰7d,Õ7Ý‚‡Ìªç\ªžBzÛeJ›×v}aJ11u¼ÿ¯¤krm¬\ò+yôütÅTõç™<z’©T²OγdyܽmÝûEEiK°âE:ïöè)o™d!èèŸ-ßè Á³ìÀă–Å©¦áŠÝ%a^Ÿ?d‡Ÿ·ä› %okÊZf€}, r k6XŒBµ±WxäáµÌ×7+í¡¸îçfÛÞšÂñ–jõ‘à0ʯMµ,t»WLêwô凨.ýÙŽJv^!‰ÙÓkmzÏ6üæLcY›kÏø¸+üLÐÿªtgèSȱb!ÜÂÌg–šýö)}‡vkÌ6̺áù;‹öžË“gsaÝB¢ùGö»2];Ú¶u±œJ'Og.v<¦¶8}¡ W‡õT§…óíT&õ u'a^—Ûå‘ a™¦Ì’QyWç‘ï3PÀÎèN#„+šTIˆ‘?BÎOˆóÌGð¦/o:=4‡µyz¿Œ"æjçZ­õ.Á×ßæÞ¼ÎƒûÄëœ_9Ý™´A|57ÞÛŠIÉyÊ(µh®*Ò3æ:˜71õ79UÍú=ue0E7çÊøW¿Y2ƒô'«éy®ºö{vtˆ†íŒnª)ô1"¤²º˜$ñœU+!€ pBâeͧÃÄIPý¬Æùcª8¾›ÇÌ GB&ßQãµMŸ–îÛ¦d䘿ØÓçôÐÁci¼·‰.´·/ŽÂ¦[… õˆÖ¯Ž`Ã/üòûîL¤Îö¢Ç©v…;Óu.ɇ¢«Ý~æŽh²ñ°lÐþµUŒg½­È™ò‡1T¹Õa/—W*× І†qGX©zQ˦%É€HXN’vä©/x¸x™à ˜àRÕ›öNQTvt‘lëïëdõF‘ÍØÔ$µ÷]a¸‚•é-œSEnãuÓXZÙÕ…=w@”÷ÑnrØêÓÞ@ñ·8"éèúËâ–ÄhÚsµ¶t@Çž‡?’ü> ª׳þ:)ö›ÑYü,±ô~…/+:èð ¾ vG$P!Oƒ'rF‡~ŒÒ¢ßá{¾†Âзð?›¡¨ù÷g–`É&¸Í͹½ó±å–0 ¬Ä|p 8è¾³;"è?çΓÎÉ\<ÔÖ¶. ¨eîဠçRf½B‹NL9é0¸³sQ6ƒr¯÷tzޏãÛS"Žê÷Ç^H»F*v®Z¯ìA«IhÓ‘óºü>ÿ¦CYÎw{¡‰ðù5¢Y7„&m+j¹’·8€ÀÏ¿ÙÕxÛ9qºL9Ü>vÄã¹ègI‚ÎÜØ™ˆùZ_ˆjt³bÐ;G9\ýù°v ÷õº1z·6{ók¥fŸ{OŸ°’GÌJH·r‹…S­š‡(—I^œQ2bnËmð^pb3#OÉ¡—䦶xa¬ZÁÁ–oç*ħÉÔu–Pnpr›t©08waÆ1_Zœuô€Ÿ!Þ|I ûè‹!¥!ú òë´§&Þ2X«˜¢µíå¼VtC_÷溺…Iú¹%ýRYFÇß_e]’Ù¦t ýĘ'Öž®K¡c¢¢Kïu´¦¶Šuoc+T­xgTŸ ‚KëüfØÊÆV5˜É)¡n|Š ˜U«./¤ü{ËQÕ]S€y‡Ö{©ÀÒ®§ ‡±¹ñ ^]Nö¾ÃÈs»µžyØ«K³úÜèjaÙÁzgeç-–8ÆPº•ýí‰L’ß0µfŽ£¶ÖÀ³rÈÉE ˹¸“¦Z ~ÜDÄqsÞËF½×œ¤ïŒË}Wä=¢ëOw•? }ðs2]ú¦¬°çv¯8A×pƒ¦=¯Ÿ‰TH÷ [&ë¯CÚÊ,E9õqªgÖèçá¯ò~ÐÛýMo:•U’³ÚÎB¡VYÏ"úˆ “Ó!°íÀöáA–Þ9£•þj¢V:~6GØÔR<Ÿláít$êáþƒG”ˆØž{0Ívê÷’Ñ­.Xë/›F6­<É ŽÁ” Ö]aP…©°c\ç¤oýNšB£²Bextê·ÖIˆ¤q|³ÿæö8©Eaa3!ð¦Áûð­Ài—´n†i´H'Îߦ~¤{¤Cá¼¶µ¢>GÉHì—7t‡·ŽÃ• ànVŒ‡öýYÙOéµÌÖr„v³'-»~§÷ÒIžyo*Cï¦âssUä“^¯øÜX˜œh„=ÿþ…Ó4s‹œy|îÌKÿºÊC¡÷–Ò¹4ÂüPÁë#U×.†éî¹LÃ ËÆPLɧÁ ¿VدÈã’Í$‚àFAàâ­-tè#Ц~@œúþ|ŠC^äó›V¤®‹ˆên¢Ò¾g¦ØÌ¨\NdE[×.fqô[vnEmh8³¼’¶à«×îž “-h°i7JËÜ27K03µçMÛ)ù{^$òºrkÂ$le­Ž³˜©}’)e´ˆÜ!^„¦ÉÐh&HˆÁ×ʪW.W›,AÁ¹X̧ôuÀAÕÈZ²Ù1Y¿#(«ìD$,L?o'šÒœ‚‡sà rÊtŽ&Ñ«*hDbÜ.ÔFû{Ú›mF_j]<Êâ`È|Ã?‡Cƒ×¶¬ˆåÙmß*Ùׄ"&B즸TÕÞžjm6nÔQÖå_™íÜNO·;VÂE\©²i{µq Ûðßî®*´s‘ä~yp6aÞ?ßi•¶Ákk½„žyÑCÑØfp ¨·â‹Í˜LooícµÙÁ)j4J¡@U† ÞR€#㈗.ÏŽ× ðJœ’»Ø§j«Â¡Œä<`P}ÈYNöûÁ™là {^+â·¶V6§:J…&MñÈ¢IR‰²¸ß°ã|)ßöŠ´ˆ¶E‹ oÅkz‡êa\×K°ê™P{ˆÝçrƒ ¯å%G/6³­8c»W#§U—‘…&Ÿ²\û6Uv5 (Qt]§™_¨h«,®ÔÌØ|©{ðêºÀ¾õQÌ@ÓFtìQbáÎ4" «Z+è|Þêþ•1­Œ®‰?&ßê´<ßÿ.í¥úséŒób²¬Xi‡÷g´3é<íW¬}¤ pþŸÜB6Ѧ=‚)z˜Ñ‹ø¥džGšì‹oÙ¤·¿*‹WìÓ0¡É áp”²Â$»Ïª©m‘‘ P2ek³z-÷µš¹¡K›6æØ2„¿ÖÝŠøOº%˜>ha—=†hšøì÷â¬r¢ór?-[s穹œŽ\°$•5gúEöÈ>i+ÞΚNÇÖíÉXº‹ùk6“Ò ¢.=¡®Ä/UejÆ0‹èL»(Ú ;v{ô`þË?[b½:ÇŸ£õ`Í®m6þﶨËÃkôÀ“ÿ €=oQÜ\ßì¥Yt¨7ƒ:½†<—˜—ÿݰßœ%¿%÷¨‰²ÓiW6ÿq«ôRqáôÁƒÖŸ`:˜Æi¯ Lùòr㉜Ê~!Ò]+auL4€PÙð…þp5QöìÝï»%9ˆ[É÷B-ÝbØVe¿ºªòñPQM‹g…Žq\´Ø‡†(bYz{ÝKZ,$–@e±îa‘ˆ*»j‚ÿÏ"âÖŽG¯Ì˜½¿) ØRšƒ€[ #h†OŸ&v^4’Ìnðam{žúÕóèÁÝÌj$úªë¨K˜PEuœî4¹`åÒw>*ÃOƒVÿ§EîCu/¨BßþÏõ©iéÍb-âmì5”'7ÎLæ"ݺeŽüAcŠ}†±2ÿ 07]o0:ªå tf;_ÊuÙ³&替õ4Ò‹s ëöøýɑޒ´ Ûè]íT¶gùÛ9þMõÆ£õ挨ã¢Q©Ê*…ꜟ]F) I‡ä±Vx°¯'Nî RiyrŒ½n)Xÿ{êt÷ɳqQînXIwQÓ\71âÀï0ZÄÄkJ$Qw,= í>1¤î‹K 5zLîiÆT`Ü–Ð|¯-ùðÏô1!´Ô…Ó@(ó¹ÆùzÞYj}!…?6ÅÐ#£¦DmÎz#g ‰:á3½6ŒÚ·%AÚþfD¸V·j§tæ®H¢¢7C| µÇCœ9±îɘ ¹ãbH%«¥O˜sòܦæÿsÈæ]"Ûv_2IìZZ^/žG¹?}$x…Ýe1Õ?ñ®w…°Ë€áYCNáHOªÝÂ_§òV²».õ­ÿçaYhÐ_2†û*:BòWê&¤Z¸&; £, ƒ²{Œl,VïÔÌž!´0聾}”Ϋ(Ýó?PŸÁ[ÒãÍ—UºM5@W§å²k+2¨¦] tIuìöã»`Ÿ€H÷5 Ü¥ Œßü±J‹©ca¾ÛH¶ù§¨Ý šüêbI¹led 4/8#CŸ,Pcy “ÌS_Îmð]nuÃàHTµ¦WCxø/Iâh¿k+fÖæ.(ì‹üY×åø#µûš@`40‡ ñÛM ÀÛ Œci ÆkÝŸønÐüáÏBÝè}‚s%ñ†ËÖ| µ#݈µÃ0Ë¿½»ˆ¢é‹§PŠ#å‹.Þ­1Ä®Ùg+ kä°Ü“j`€6Íè1&°DØ‹+6;{4¢n¯C±k )¶ ñ!ÌWU©è{^§âµGjtÌǾ[J =ole¡׺Ã(”¯áW,mÓœƒÁøI,´k¨ Õq8\úžAÞú.f¶"È"R,ãÀ¸Y½HRMIV7`”Þ´9×@CFËy–Fè/Zp>°¦ÛcÏöåw…¢«eF‘Z›s‹lmúVdv¼ÆüVŸ¦î‘¢!ýáó‹‹­ß–fùþ´•ÚW¨;`% äj®YLa;0û‹T—)ˆëáÚ^èž-uÇF|‚†µÛ–5E_¹²zV…OŠ t$¾ž/‡Þ¡Àì“ÕÆ÷D„Dl¬\á -·RØL aáÐRÃ} Qá®çŸøEyÕ[>âdÂÂÖ2å{ »'€{ nMZ+ Eìþ<ì'~"+뉘ðêŒÇÑõ]™¸§:”1‰BÿHÇÛ¦òª¢»·ùAöûW±û¨eÝꋸ6ÏÊŽØÍãËU$-`ձà 3zêËLuP@­±¶¼É£‡ýÁ‰ ÁKØW/º¦: ÌÁ½~ö¸\@ÖŒ0D®îÛ¥Esú(€«¦f"oÈ^/1½ÑKý4‹,ÊÄN°=O]­—ϮЂ†¾¹j˜”€Ÿº¶Hä}¾8ôã+Sª|,,Û±‰À;݈Áx’Rè*ŠS;‹ŠJ.<›ÞštÏɵß±»6¾cNm®f—2iõuºˆª³¡l{DY[:®/ >L¹sù5ÿ\à§ö%žò5£ÇÅÄ—ÚN]òp+¦0ë -Ù«pʺ„”9o‘Ñ•½Y@ŽŒ‡]4Œv™b`4ƒ%È4æEÙ—Y—!.`fà¨ÔÌG‡Œ»¿SOê€Ë{@ÁwŸoKÝmèƒ1ÿvMûu°ÿÌ šÊÆíé!—ô=V¹gƒðMWµ6¡ïcß_V‚¯ QøÏ€êå‚ß$=¿zð3Ù×Rc0UeEbŸ›1áÄRå †Ü)0#ÄÈ`o–ë+3ÙW¿·ÄÄÁauVáÛrñè æÙ5cî+TÙÛrvËEÏ€p>÷;Ï·ôÆœ„€CØþ'0ë¤Hâ°yzðeÖK¿|s.Œ,Í’­Ë•ç`/¨W¶ç£lQeØfõkŠ—›§ûŽeSìXÂê7Æ|0ƒ†ÿ–3¬¿ãÏEã1óV{Þ,"Ùˆ°…Ž"Æ&=”a}ýÀ®¨wÞ¬KïÔeøú~-"wŠñP)¹>àï_ë9ôDÐQrhh“øáH‚ˆ•Œk§ulÄò½ÚvSjц±4rxV;0ÒÔØ<ˆfߥ|®‹>*z†ì/Í‚Ãß³áˆ#èÑIÛž§ÿð·9† ã.OŸ"?¡ g6ÏÉ ÆëYÁg‹}šÞà -X/xLé¹îußò‰¾$»>œ~c±ãÇ4­Oñ£S¬Ã* ó/Ï©”¸·8¿vEtµ‰Žþg'P„ÌËþpŒL]Ñ!Æ<ŒØÙ7%OŒÁâ=Ó¢S•= ir>²æ ‹Ï®îCm@©ãq†J©Èwg )bÀ”©ÊDéu€ˆ;cÂ2O,¬Ø°¹ò»l$-3l°©ã–¬<˜P¯ÇÜ~Áÿ·Ž«©t–³–²•½Ôâï úHߣި¡C;éþç@±Ž\þl2S´uRt§jfÒ¢óR–‡Á´×ѵ_”ʦ,@Xg];[}Î?IYÝ3²¡MÂH/Šf–*Í&ê%œß”‚œ&–ÂTô.þñýúm¿6´¯“•ZV[£Î&Ñu"†߿ⷹÖÛÓKŽ f.½íˆ?ÃÂ>;9lU#ÐR¸é¬7‘Ñò\Vÿ]^x¬¼½N{[¦ì¹ŒAäÂ(l¸…G'Ògˆƒüµòžy¾o¼!§qÉëdÚl%Ø a7r Ò¶ZZ ŽNµ˜$oÁõÁXœãb3ÊzMÕôÁÓy_3kßZD*¬Ô¼S#ƒ³Æe¦½¬!ÓÈÙc9æ¼úfõ¦€8vd߬i,Á`HBö`´ŠàX.« VO„ûÓ cgñð"Ù±yY(­p;)SãÅ“¡yÕæ¬}g7 Þ:Þàö\±"RƇ€ÐL^ò³Z¯-æöl´YcE!ME ,ІN )V¸(ÿ.I— ¿làçuÄrQ·lˆPß)ÃܬÝëÜAñO ›Ðë74’™‘çÝð4ž#å4¤A"æ7³ÓPwÖ{¬g¨ëÕJ<„†Fû<'$x±ùíjª¶;=.h¶JÀãÝNK÷›¢?ŽSê¹ñ¨ ^O2JQõCkÛ‹ 7eR‹º÷v_âƒÌ†”cʼñ]±|øªŸò=©g<ŽÎLêpü„øØÓ+€Ý"U–>¶„öf®>»ÿ™è—Is÷!ô/Æ­PĦ5M±S+„[ŽÀÔû/d÷t¡Új—¶vÒ;FòòÅÕ {#ÏȘ‰&þ „ X"Ntpñ£Ï7ãÏ*¬(3–n=ìUokxîcóqM(Š”®è¾˜šÊ ®0£m§ó6²Ú¡®“@>ñ }f+ÞRí,Íç´ÌÿÛ;Ö'2Ro7âYÜ´õŒ¸%jµÛÿëÿª+ó&ÊÛÊœ2Y¹¾Ê³•øl™=GqCÜ o—½Å÷K}ã°D­ÀŽ=ò7ÌךSK0¶¦ç߯—Ž3ù.œ¬é«o̽Ø—ùÛ~ò%«_¯ ØÛy?n¦I7;·ƒ„mCÆj/ÿ¹U¤8ê,²~³—Iéïj>W…-=‘hÒ!ÛŠ%ŠóC6~3øV¤y/Áöt„‹s¹#¢LÜ59äCæ|=f}÷üŒ±m-Ùo¦çÐÅÂp#¢¯uXZ`¬§<ÐæÆ@Â)ô<˜Ù>_ìYÝkw[ª ˆ§‘´'ùäê¨aA¹ùS¥Q^Pž%d7q|ÔîÒŽÄ!tº4ÏF¢íÌ~â~n;q$}ÃðB;ÕL¢(´îç~³wôÜã=#F^ºéœ#Ì™ÚQ~i¯Ÿç2N×Ë«D²ÅÒ†ÝÍEÅR®SnÛzMâknr£;µ¹PHléé :ÀeЊ"ðåH(†[´GÅpl\Û›ò¹ß?ý=sd(õ l=YO+\¹(`m%ƒlÕšƒ¾ÒBîb±ó-)¸ÄVO€Çîj†‘8‘Õ—¯Vyò@å~Ýé¡÷WsrrÝž…>Ð>`R®& n~™Ì—ñz°{#Fªô9-tet¼‡;~z?E3!¸aùu%böÐ&¦à©ˆþvÇ©£¢3ñµ}¼¿J­-\ñ˜½”R’[x‘[Kjý,Œ££&Ž!j"J§u°ÔC£(PXtkF·Ái.<‹fJ»ü#ç¼¹P!Œ§=u%‘Äü-Ȫ]>üw À<#94ð'våekÀ'd£Ÿ¿YÊÐ'Ìl&Í#³º Ž7!B$¤ÛêŒZ?´ühªÉ²î 8ò=ˆf$ð B=ð6B Š–úXkégÿ^Âpw|æô]¦çÃR†Ì¸ÿ RQ;Lbɇ¨ŠRßÝ´Oöºê/¡Çv—Öž¬Íq’ †öJó¿V±æU¨Á‰Ø‰aç GÝS¨–4)e­K ~ѼS,O '\µ4¢ðKp?­nø†n¾K7BpΪ+–-¬¶_™ÂmGvd@ˆñm’OÖcšÎ-nd&¶Â}é' –‚Ø“†½ *^öÝs²\/b,ÚÔøÏ9­Äsª(ó˜Æ—· þ6Ý%m–Nûz¯%÷ùó:©Ê:û[¿arNÈ{œ8F¤ ÕÐt_ ïSÏkWv1Ãê¶A¼Ü5·ËñÈÿxÍv¹„¸²†Ü¢}­Âý6€^ j¨ÎŠ©æ¹ŠV½Fmš¦ò‡û½Ì«Ö€WÐúëŒK:5R³|ä$'xVHw7ÿ—MÌê[&ýÃùœÚÑs¤·ax§ °ú9´³ô=‘»ÚÒL}åöP”S_÷0€e…þ}–}š4µOpÛîhSÚïÎkÀO$ë°ŸŒN\ä=ˆ<ÐÉl!E•õ%(ý¹|–çÀÞd¾°¥“+íÑmIµŸ(͵dͧU=­ ¿Ä zèkºf´’þn”)> •‚ËÜc&äÜk…ò÷ùƒ‰2nƒKdš\Ä n{“97•¯—Ý ÇÁƱÓOMK³'œÜˆÌë´´ÎhÓ¥o“:3Š? ]¹Å¤«è½wºÓ2[=ø]¦ƒŽÿKh÷¶jÕjˆ x¡l#Çúå\ÔD÷·çŒ“ÄFáu¯~Ï¿&²ðT†a#q8ûÇ]_1E©X‡N¯ÍEFär>ZU3µ=!QUsžÈ”G“6ÉQ|S§iò“öÞ»à0šªÓÊ5ëÜç „¦€ ΫÎýç°ÍSf¸lqòy] ?Eqè+éÑœˆ :úB ³,ü4d^Ú<áÊzMn¶”$æ¸{æ¹è¤!½ ‚õÛ¬Ûw7µÕÛÝÇ]°F äŸ6¤>mµ×=û׊Ë-¢|¤Ð“_fSmø€Ò~‰ÙÖ9P±Oæqë“ИjxFJ+2®pcбªâ”šyèädå¾'uoÑ:ÐŽ5õ¢ò5xõ´Þ—f<âÈäÝþ·ëÂtHÅZõ Æ?©§V%lÊ JS–ÕËT8Rây19ƒÖ2÷•4+%óµÐÓyÈÄ«ƒ[7ñå™uÊ1ÛÞâf+ÜFaކr€i€¤Ii{°Mþ ?V¹YlçB `o¸r” =¹GºY _5kÏèFø!4e ²l`“¿*E5VÞ$º~¡êîߖߦQ™î9P5; (¹³HªÖ ¾âΩ åMãªð%«Ú$'žr)º×?ÀÝáë(݃2€¾cÕlëÌo© ·ÀÎs1}ÉÝ‘ôQùYOœ 7{¼¹\Æ+“”brÿÎwæÖß(æ)€ÏÔ^ž j|©&4Ë|,´\½"0ŠüÇl"n¡‚u‚ÊÛÑybÀv`ìo&üÖ* ÂÝÆ:böö|ngO[>Æ:ÖÚ1">œ³ ÛÝ,ËÖb©à\¡ˆ68žq§Óí‡~+ Þªü·ÛÎÀ?ö’¡_¬¨\­¶„ˆ—6çÏè`Ü/{‰ü'O‘¥ÆódžF»Ð•$SfÙ»ÞÃ4ù‹ËÑÕKfðž‘åÞ¾“åÿ%…ù0 !מ¡zäð&Ò·i¬ö†Üôúk¦s¹.@—&Îa*Ÿ¿ Ü-œÓˆ‚í›KÝÄͦ8…±Úf»“çNšÕÝKãsIA>¡N­¹»ÍôW(´ìø˜A„½fÝB1+<é;Y§5¢³»(¡e¨ü³š9–”¡)LI,Äç¾3ÉÿmÒÂx׋ó•Ô_[3Cù“ïQÀÚUŽ"ÔÑÙ) g›i³iäÄ›ÛT¨í¡øæ™ÌÂ0&Ž« qÁÔ^^âB€¤mרD”zÝȽ xû¢£PF ÿÊ^½Äð2G«é{þ<lVEÿÞ©'¬ ~óæ$ eƒjº·Ð©W—ô;ŽÁ±±Ð6¬]O7‰ŠáÇäsNÿFå‘Ð%x‘H—£PÅR¶ï“VV;Ÿ¤Q]ÿ®›‘.Êb±•ÛâÏ•(Fª*Ú¬æåð,\ôÿ£Î¸dä°‘´J·ûŽl%Ê­5Þɉ 6ðœ‘v“dD25¢"´êƒå"´ÄeZ ùbïT_‘yní‚^<Ó%ÞcÌÝdËT˜¯¹(o)blˆ60è•ü.ü÷<ã÷§3I™·”;Á}D¾ßHú‰”yÌ"…M¶EÇëØŒƒ€{‚O¿8ÌÈv•<ÈÒ8Q53ÒS!)÷¦µÿyÃ÷XÂKô‡ØÚV?VìÎ Œš >¢Ž"¼…e’јçó‹¾Ê/“P9±äxw4Ykôk¶Ï³A•ÆSš Gþ€C¼{Í•oxGàê'hÇÈ Àâ×/\n(*:,ö©& J”Bš•ððMf>@"m‡l{KWMù`50•è ­ååÏnW–>e½Kuƒõ$-U*hŽŠ.Û*ôôØ•é·Ý“Ó5 ã)_o”` à=IÈøÕ¾WØà¯¢Èn–ÕÎûbP4­¢ã®’wçgÚ¸!"äü Re|î›)<ø`o×»ó$±xqTH’c û‹»—ú+ß„¤[õ©þ s~±’ØC„\­ðè®ßÍଋ–N¢a¦&¯x.²øKY`¨s/ú|¹«»%IW­o¸Ÿ¸ÙªC S—üœ©Ë"›¦"ýøzú5ÉV¨žê‡y·D3íÝ6<Ѹt=ÿƒ™<ˆíE[›ØÑ4ÖS m&U„'LÒb½FaM!$6¥ïgŒÅ§ÏÀ¿üu¹¼ç»Dcæ«0Y5ã—(´hd¢û÷»üVï&CrãOcé›qÄëÚk¾€£ZÅû z®k¢¿s+,º¼iœ~Pp§Îl¿L¡0¶ôR/>‹Ì$pcßá8K™p¾åJ¶L•i¦]×ú°ƒ—Ó®þÎÞ3ïX"k¦Y–2{%Èïn÷‡Õ(¿?®j_TDƒ7´+ºé­î¦¤¹g¹s«Ö(­Ù „ZrÁjf¡-‡_ë“#ê=åG+3uŒì¶Áû[T”2í#Ýa~6(ô!ÈEñÍ쵟ó$%ë+©û¬<_¢–­°gÌ ™ÔÛ¿ÙàÊ‘È[œµÛoÆÆõÄÚë.jYœ§?8ÿíj(^í·P ž:b¨»b׆[ðKf«Cê@ÓÂA¥üÞ‰ÊV#Œ­Ùí¡bÇ$RO3Æ1Yš“à¤+›ZÇGÑ´¦Œ´ëxä.¬ô¢´a4+9Ôá±DG£äïIÃ\•”º"€o=7ÀÇ'·PK»£u§¤÷{^¾—£àã7›Vé°äËÆè;΃PxZ®74að©q–زq¾G ™oXN4È`¶±)Ñi#è»æÚÏEp²oÖfÝM—_èë‡ÝÜø%î ý…ßðqü’ᢉ“nÜL5)´)¾È[dûc'=Å/· ¹#jƒ†î§Õî*Ò·Pߨi1 MG{~Ìkîßhè·Žãþ¶ÒÉ›âÿh @¹ç÷Îwméî¸ÈÈkÊgT€ãÌ _}„Éî½íñî«;ò†iOvux5÷—ºöO]”ù·4~¼5k¹pðü… *`…^ã £`G0uQ¼u .­2##*`ÃcÊI¤”ýý¦Ÿ®Vä˜UÐL¼' hdòÜ~Ö3qèÝœó1ÎýUC”5ý îø:ö£“Xm½“¤À†ì¨Gî8-Þ»]œqoF†Ï­B~ÄXx©ÚK ÈVIºyŒ²‘}õ"Õ‘±îüVy%«&3;ƒ,È™ ´Üû£mmIK FxŸƒLt¾)ú=\iÉÆÏÓ((\%»àà 푾gì`#Odÿdcá={ƒ†Ÿïþý&.KdÏRD½,ïMpdˈõªýq)d)%i±›šc‘’[f’þ^”¼V´‡¶„–£ñÝ_ÿssð£Lo,{Ã݆†KÉKã¾ß.Î,›3´QYY¯®èÎ_½¨À¨OÊB£´·nx“©ïçE DD'ó¢d§˜Ïœ5”/ÉSŒ\î’T¥ ½•n{Tži7Э¡ën=9êºÈ&ãNYñ¤}Ü}ø¯pþöVyqŸlÞïIOÛ÷ôê Ñóã–å¢ì,“V‰H|x¨²Ny{F¸]í¶'/qþ­æ»rkÉv¤¨l@¯Ý^ð=•;lP;ýOË@[VZÂIx-¨†‰Îx²Çí †ˆG5…μ;fÖ:j8Y}йÇdd/æ 2ó}¢X’d 4 6àêcTºù‡©›ÊÐtŽÅãV;nS6xÅhh=£ÂºõgÊY}ÇSY3;Ÿ¤law¸ ©Ee-úÑwuâê¥&Ÿî¿Ý]¦C"­±†Üª8Lg¬L[ÑGKñVU~œÅHZÉ|}Åø°°?‘,Z@ä6€‰+Eø€ZE.m!ÅÕ¹¹±=Äøsñuk•°l]çóøäB{áèþÔ”îõÒØØq óSE›ÎÁ¿Ö>Ò;­ú7¨BAêP (˜ÎeQÛ„ ¿™v—ƱEè«qcÍ”1ûm•Ê^§ÎpÎI8Ð 7‚VîË|øù™4¿owøU½v³ÜJ”:©vvŒË.©¬0¦¤fW ™ù/ÁÑhˆ´¹ùÂ4Ge ø<Õ€•ä Ežj#[nòß½¤ïƒ ãÉf¾ã|ø÷H’ÎXRNY[-!ìÍþ›÷‹d‹¡ÆÁ…Ê*–^sI4©–Y\PŸö5ÌÇrIÖ\(0î(þÚpþs± Ž|Œ¶ŠÐ²×•ó‘;wZ¨å¹,ÖÖlánx‰”G¡o’ âïNXww{Ò¥nù$¬˜£Ê¢Ûöm¦×CS+ýL‡^×½oÕXßÿY56/nXI?ã?¿õ°—äËZ§Eÿû|m Ü=ä^Tëª*» 9 ‹ðpE*¼»X솯¬)É̉@ªzðëO’•œ×‚ÍÀh‘>ʰ»HdoIqq 攌5¨Nf¯àé ˆ|ì;IRóŸ¿•(h]‡¡.lš÷W%ÊQý§#·£€³;m ÔmÊÚ+ràØÐÔ ÊÀ¯ÄçˆÖþE¡ègvP÷ ¬8±L§î)“Ë䵘¢€NX_.ôª}wù¢°ñ—7U.½ƒ(§´2ÃôýÝèx”™¡Ó+Ç–j î´¶7mÐÔ¬ÒeG¹Ôøñ¶ÏÅõ¤ºØ=Åw ‡É†×‘<³9j_~Ù¼&ÉŠâÉ4µñâý~Áï£#©–ÆU/lª'ÞÓÄ»¨; åùããÁ›,àÃv^^µù4lȾ¦^£«‰·v DàÚÕ#¸øáú…d©¶ß`]âûd”Þ¿xz% âå#ð‘¸ç›ÁÄ[·¦~cBÇip~ùŒgF²ŠâÙÜV›N’œôÊ­k•Ö7Aûü–=Ú´%‰a³ˆIr\[è€WV£!Øó£ Ú BŸ®í­0Ýkòý¨&Ô$>¬à¢ÿ9'éMSçÒö¶¿Oã–Dib™$ÎÜêx \ö’Îý‡6:yriŠ–¯sþŠ%ï6{*[kÆMe¨Lk~‚ÃCÀ¶ú*ïÔ<¸Û…6Ü W^Méž³ÈaµœW¡xV½n5 oc/¸q7¥I¢ü–¡~=à+ìÝõ¥rƒS¶ÀœºÊßÄ~РѤ;Ñõ¶ Ëó†Q!ˆ$zYán;…ˆKÑ¿Ètò’ßåp f²‚ªdÁfçÄKþHÍÝ –ÎcйP¸#¦:°M‚_¿ÑdXøòo”‚”Š ¥)ÀÏ`Àgé£ìrdœå­‘{_블‹µ±_®F•ªVÑœºã'ôPc&")Ž*‹åj³‡}l#5ôœE”'›á¦Á‡Sª¬pƒ×e&áiìßãà¦Ýçx÷⽎•O¡Uêm—_ñ2]öñ¿ÏÆÊ£ƒŸ’lfŸ!䨤}v`n€@JÃõzr»£©„¢†®?-Ò&^+ˆ}³k.?†sÓ]û°,˜¤{"§Ö£Ø2šöåâ/J—¯xC3#[b̧ñ{ç;¸Úh¡zþ\¡ Q§Qåwêz™¸™Í^¨#0ÙÆhaídI.ažØÜòµ…dëÉ.MS'~¡Æ±uŠÿhóÄPkòº·VÔÛGokÙ!©YÙêÍÐæƒ¨¤~+.[ÔÚäc"*ÐeK6ðŽ6n?–U‘Ÿ%ƒ6Ð¥'ÿqL“Ñd¹’ Þ/4ÛÈFu ÝÇÁOvâ’¹s0˜«’Wgf³$ÁßéxV‰‚”bvY&_*ÇR bÞ '¾ñﳆ8R:"¢ ¥Y{JA^•¨5„L/¤‰ûÊ-ÕÄŽ ÿMàp"RðUð?£Ç‹/W;‡ôæÕ¯ˆÃšÑ=‹óÄ~Úíd†VÜÁT QL„¸c$ Æ»ø#DÁ¯çÄ#4ëV•€ã9HºâÙhK!òb׫†Ñú£3jUòpW_U~äx Z—î³FK0¡†Rœfu¬ðán ŽEHü/`Ð *LO#4™à¸kl¡ ØY×T,a"bó pæÈêŒP¶–Áw1Éý§ 4^,#_ÇÜÀÀ­íCHˆ;‰¬»ÝÈ6;¼'äê¦ì½CøPqîã±°Òº•ÚÀq‹á×>Ì€²Â3`ûmÛäÕÍ _ˆX !'B°T˜š«Täجî êõ—ýå}³ä›´|à ßÓ´½Û,ˆxí;³(€•£\µè‚ó‹Åj¿ÕKrWo”–(š3¡fÖúšé·[5˜–êò°èP²ä0ßûü„y‚~`ʼµ¨íSý¯Z®‹ éŒé@> °3dÒŸ™© <5¹VKô=N=€O%µ’-e]¸»¤fYãÇ”}®ˆ ¶Õâ“ ƒÞükÚ“í"lñ¤¶U³rÖlt{雨F£`UÓn$ Ãa*Rî†s`Á£0ɯ©çQ!>„¯×Κ2"•D2+6$ã€ærÿ¼w“”á ®õ¶p›îÃi íY·)ØkÝoøñ= €@²³ ‚ u[çý¡kŸÞ2ö¤ ÛâifC";jì·ƒÐFZ†ƒ:éÙüî*‚ombpš`fJd²¶7ÕAŠÜùÑó àÃ3SåߣòéåËž·0É%ðƒ;fÔ Xc{in£ÓP!‡ÑMîû‡Ž8 ‚}ÒŽ°ÝÕq¿ ÷ŸX®=ZÇôy¥}ŠÆv'±¾¢êV‘ Wº´BÎ[ͧ ð]çOW*±… ±“Räü1Ùíz‰š¤ÎÏêbEo¡.rŒšýå„C.âyÊäýÝñ:ÅWµFNC°›OåˆÙóJjƒ„pÿUdÜ~ÍœïµÐ…>l„ýahL_åœw}ð†çÑ翚,xMŸPr9¨}ÉΧãO? N¶h1¨6cÝÙ5nÅá‹Æ"Ù"ë³/ó#¿ß‹ùãCòp•õØ`y ɸ X¿š‘Ѳ…MêlÞšÿ•mŠo†ìÊŽS‚éâËÕÈˬµ®¯¿¬¦”ÇMd(¤§r‘¶ƒ«o a©…$WÎZEìW†T.G4Ón†©lŠiio¾l¯A›çÝD‹Nz/;öT¦šÊÓÿëáV>¿ÛpŠ·ø‚L-ÑÆ£Î¸‚L™?Õ¥ãšt}èY½VˆqmB #Ô¡ÍG€lïv?Wðzqż÷" ÉÍ‹Ë>Øa¢îÜò-ÜŠÅìˆ>Z¯\R¡B«õ¡Ì§ÖD“›ã>£žyY–®%âè[ ýÜ 8Èò"Õû²rõ/ÖK½:]Xª[”/DúFÿ¡Õµ’ÿÏ ™&‡[ДR‚Îb“Õƒf+UÍEkµ¬D{‰òÍ8ÀYub’±ð…$ó1à¤è,³Ÿ8 ÜÔAÏ"‡Byiµ“œè¿˜R–}jˆ{ïôÍDô™ù?Ä-èçˆt€«åp4n×”];Õü…#r”6 !Ûn`ýà©~° 2X2ÔT :>"(à¤È’Ó)„ú›Ïj¨!BÈc‡ÃAý‰|îµ2PÉ@mNsÓ4qn1³®‘©­\ÁövZïÎhÿmI*HJŸŒM \ûëã“ðÎq|¸®=Ý­l˜XßV^†åô£‹â†™?Ì]÷'ïÓ¬ôÕ-Æt g½o=æ'LæœfèH»úËñòÏÈP(ÈŸ¾µÄú |C‹4YP„7™®S*š×[• )õZ+ãl4ó~gI¿ÌzÏ0تtÑh1–î1,Cч?k³<Òªz¦ºÎzú—O ¨ûèÿ.üRÄq›ºµÈÃ0ŠßK´Fÿ“Ó¦tòêý-@U—?ã{Ë’È’ðýÈq{)§u»Mž¡Öì2ë.ßúÈÈêçy¾PTÛ'^J:/såsm‡Æ16þµ-›V+QÞÝÞÒ©†ðÝ%ô2¦¶TÙIâ9Ãk׈¶°ï:‹—”½-¬,T3†ÁS:àÚFK•sÝ¢€®çÒœÛ@b,o8ŒÑ<ƒ­åÇp ’íâ”ì?»û#Mßö|?;¢Ñ™Ã˜©oæ·¤˜j…nX£I$Õõa¡c¸·ÖÔlÖ]@ hÕÈ!ÿ0Ö´‘ÆýhÿQ{3/ ]wŒ1]Þ†û¹x k¹ªe(É™ë+ÕÛÏÈe3ôxº£b%7.å‰=äÀ'œÏH ÞÂÊç¿òõéX~ZY"ñ¹i¡á}.N¡£û7›¹¼f{·´'Áâ«ð[iè}ÈF|·™Õ¯.Dè›ã}kbÞ=Â`bÝ 9:8)T !@}Ê3ß@<1å\ö>c¨RŠäI›Ö¬<Å\qžPQLS²ºç_²·R’ÒèMéà€"ÒEU?&fOÜ~úEÜMÍCsðÍ.B̃°Zö6A/Ís& É¶åRp ¢“݃xëÊk*Í"GÏ,giW¡îã>gÍÚQÔ1ÀB{V­.„(4Ùñ¦—ïLUÄŸîŠcm-X‰gåƒÏ‚‰ºjÍÑ¡|îùeì ËcTæ­!6`ÕsO÷YmAÈ÷Äßÿ¤œH§¬öðÊΊ÷>Éí¤17ñi¼8>éõÁn˜¨?~P<£ËNwþÄš-ÎÀÀ_4EÏ(H7+µ¢z ÉÞÄXy×× 0¿. ãµQv =xâ3¦ZHR·£SAÊŸávý½09'¬m¢„<¤ö‘ˆM †çfþ8sú„Ž)s»à¯ *št¡NÈ/y\«aÞpr,®f5ÍÃ<ã„6¬îÏKcìáab…i¾ @È&èJ-¼‹ž±ãv5 CšNšx QÌCYI¨VFùè¶¥•Pù‰‚ýÌ´vGÞ*u@U[JoU›qX¯Ï”CÏ,HÌñ—S4ÕðÇ-æ´!ùÕËw%æ 6Uoê5‘AFdÂìP/KêÌ3j2ÀÒñëÐlÜòÔ·ß@Cá-æºåo) ô¸òsÐ׺!F¯h14Y oYœ>Íq÷.˜?pOîž²WS/ìÚ2sf•¡6°)ø ˆ‡™ÝUÊAR¸{»K¬|•Jå˜nÌåxŽ SÂà)»â(†sFÙhU$@«þø‚9_Vòx4ÍÚ?ˆ`Fv˜˜ÕÂAΔX~eHÔíר¤Œo½Š÷™Ä=W'€J=xÏŒ¨è+x“«òÅéºUžf~\n3ª¹$\«PЭ·’2ªo–`ô+Á1o%Äd ÙÓÜ=¿)þîßá&ÝÆÍ´ÉŽþ=¼3iBR ž~€+§½b}43"'ÜNÖžcGáÛñ OŽ6aY\#ÌÿŽý+èq¡ä/ã'‰[‰£p„à¾cJ…Ü%’ù›Î£˜7}¡š›#Œ¸ºÁ"Rû·‰àány8˜Ïe8+l1P3ÖœíøÛ±æÅPKI¥ñtPËÔrëkÝnƒ°þ¦ë‘c31ñ]œ+ב$’kRM&9ž ï-5Mæãè:ìgVBÈLkò`gk°Õoi¶>U`¯ ññ™ ©Rçnq;÷V-<‰¸kÒ{)„Æ£t jú朩ýp¯f£HbÍ¡JUÐQ)H]¤Æ3Þ!4ÒH›z 'y{kÑbdGéx°‘<»1–öú»J·óý þ#P®Ai#ŽÈi¡ù'çO]uv Ñ“Kµdš® Š~lý$õ ¿ÏX2Ц÷ŠÝr"ÅöW¼Ï!õvY Þ’Fƒwûô/˜·²’<Œmv»o˜å~ zV•1OÙô@Lì")”àjqájàоdz3ãÅÚÁëvj‡o‡š»&çnБFDG7K{²âoÚ'èb肘?Ò Å7¼Xšþ€½ ýŽml 1"÷qôÇh*Ïú4ßsJŒDüØßq;²Í°ûíJOã׆PyôÆ'oŽ&Ó@BûuŒãœwÂ^FÌ@QZêuØU†XåHÙÙ* n(µVívZ1!²µäÊì2*ÙL_lÆÚR=eÕsœy¡rÇ­Œ‹8Ì‹­tÔeŸ<ækúÕâç´.¤0"’nR´Ÿ™‚k)pëÙõêmÃó\¤ñ•-ÝP9 ¶3¸0GäÓÆŽ¡…u°è°„_ "½>læ÷%/^¨I)Evö+Ã4ízCWçb+æ6¿èÈð5­rÞÍVËÿ2ºx[¹lnk5èól§©ŸC©–¦RB6I ãgI,׼ˠïbå˜ßm{è¡`°êdè·“pi€¼@€v›ƒÞvw;ÖŽkÓTìeCs³¨Î¹ÿAõn{æZµð,ûc€-5O õñ®´h«ûS6<æõ‰*ý 4“‚\•¦%Ž•>ë—qÖnvyô—ðr¢èؾÊQ&ê‰Z žR2›… ÏДZ' WágLºýÖ£‡LeOzGå¥Ì9‡,„/˜Ž„.CÜëÙÔšâºÙ6*Z?ôgXÚ4?vr™c$Ã^.ʳ'¶ &DLÃâÌp¾E£©Ô&ìéj¼jýÕ^ÛLsYÿ]Áð;§d*Tø. âU7e&myÒr´ £5ÖÉÊù².«íšüwЏ¼\šìâŠ|ïañ t}ì`’ÔÀò Š*rmŒÎmo÷zÇã1úÒ÷JÙ£P[y mŒ9[ÐÔyaj¬æ›*g²9ÃáÁÍÚä¼"eN÷/ C„àè|_ ã¾Ô|Z«n–£Z…ÎDŠÈ4{ôr¬šõÄif+„éS3‰ÌæϽN=7ñ–­:|>ª_62Ú§­­5åE~Ñçpº¬ï‹°XU„}nºØ¬ ÀŠðX\ËeÒXý\ÿOÆÀW«ãTv|e™•€Î@p¿œNäJù®} '5جbõ³}N:Ö]·ú½]cÿÙïÓ"ü®X–C5Áv´â×vß q„:ÞB?•#Ñ$³üŽ£Œ’¹À?˜ÏŒ6BRŦ’bõc÷Èwó+q貌jè1ÒÂæ°BÃ%¶`GNíD‚ÅbRÂX‚|nÒ[}à ¨phpßÖ²< Õ‘º·#¶|éÙ@|@WuGU"Í}Pl8'zlèqâfgîH™ýyŒKž9îNA”Ô¿¯qý1³6s°ùªn UÒâ~ý!BUQvàè±öB-ËLó{P›X]ë‡}³k"nGi5mÞläÑÀþDËú½åॢԋ»:JÐs˜Û: íÌÀDª{ýïâ+ïu³þzú—7’Œð‚ÚymÊ”ã!+m™‰½û>ºç…Œ;(’^± ³;SD¦Vø'e½øÌ¿f1mžE0È“)$Žá衎cK¬Wl¬i§‚ÿh†N5!ôµÓ&ï:HRs£yšI]PþŸfl÷ˆ‹æì‚¨ŒJV½ªœ¯E–}½Ó¸ÞíÔ5Á’æÖST/?ѯóˆšÑÓÒë1Ûºí¤æG2‡È@Óàþ³ö<esâz¹Ñ|o”|D•Êmµ¬ã•óqÇ¢ #áyj1Ñ4§cõ×Éi:j¬žXi’ßJ9تnÉ8u»ÊÆ!2·†„rí·~¯Z¦Ñ¾Z€¬ôá{ +£­ß%25¯éÇ•o†*oŸ—8‚*C·²dS@-¬Moæ+&tôtJ 38½f.qST¸77¢ñZHì“€•úm°Œ½4bV>á )U[–Æ.åùㄸ±×@ø¨ÈlÿjXD_}¸ióå{åiú±8n¥>¸êW?R5ØäÙg–„žU†\ó°L±ìx.‘œ x×” Ì|¤ýœ«vÑ!YцÊM ™Á9ï^ˆ)%ƒçŸØ6mS°Ey…ãÑ”d¶‚˜ Ü>±£Ð:\1^Ð_£^’zN쇫¸çÞÌPaU{øÒHÔÂÚï¼ÁrO¯QëÆè×IïXG¡ý°%âþÄϵ}Ðùî!ÂE³šèøÒÉÉGìu¤ÎO:nl_}ÚL]ô¹w–i-Yi(¯t¦GèÕ馻Ií¶•NÜL"{DÙA›‰œ)ËЦ¼ÇS‚»<Ùc§4j¢_tú £V¨(à×Íœzô޵¯wLM;¡æÍ-KILº÷LQ­™®àJ‹{õž“ζ׉Å~þžBYÁ6-œ©ßô2ìcØà—zeÒÌÆµGƒb™çÆí™+¶òÁ¬Ð F×% 4~bp5‚x±ñeảÈsÚÕ;§þçyçØ‚¤õGŠÇò´P{W”ŸmzÏýŒj4Jºå)OâYñ¼UÚ;ë­i^ëŽÚ| “sì£u©@5«èl6ÖšOFÓ™tUΜ7¤¥XGÀo«ÁçôÓzLÚÊHóIsÁ0s!SÔÆí,xWáʶHèΤ؋¯šÀÖy€T.>€,£aFO¡92 ðt©IèºÊœ5•Yùj@ç×¢ ÔiønÈÎóPmX‰aVVªÊÜ-¼6%Û&¨IPä.xËü¸z3ßï{oíÌLú´¢£š°…؃f0><8d ‘ëÍ]ï`zKñÈÒhþ¦ÐH"X]º=åCa‚¼ŸUƒ¨ q| ÊXžT D­Ÿ¼ZmÙÈï|»z``¨†«X³Uá)sß%S'«¿`BÎUxÐíõϳítôÄGe¸u†½¹íe>yX¢ M zØ ZåÄâ5Ú8!ëL-vÄ­Œ¬à„…ÅŸ+ÇŸa8¹ÓæXÙuë¬Ñ‰;‹r‘>w[ÁÐùñ‰{1ú’9WàááòuækÆ~°þ­‘²\”wüUkwÁÊ8ѯ>¬ôóé[ÖCÍßÍA0ÝŒêQ P(ÄÎ$Æ©UÐxo½Dõ‰îöŠà@>þ'¿P°£tÔ›Ãçz›-!<ÔY"ÐuÌ]Í`Çnœ]£”ñ¶j]%»GóœñX¾âY×üçۊɳùaÇ3§F/£Ýf9žœ²ål=³’³MRÉÖ‰ÞNØJW:T‡)P$€²y 'nÓüTðËÍé°ÍĬª™¥Ù©HãÒ›»ã8û„õ!sRï%>!ëö,*Ô”ðTRŠG;éu¡ûi*=Lç®Wh*OA>°¨”åÒ@·ÛD'Ž<‚ßD†þÎÂê7Rs`™æv›¯vtCû’ÜMÓÎÆÏa†Z‹,¥aŒHpÇe‡¨W¿í´¯nÙÃ't§U WÒÑß‚ÛÐ\½¯~”à¤p>nA·‹u†±ß6?åxïõÜm0AÁóþ>µÂÔÞ9È*¾þ}ëËRèHÈÛNq«§;Ò}ÙÇ„éG%vÅ¥éa—@|®CóoªËoå[*1"Ó–²¶QC1?ºbêõ_^Ð’9í™iÚñICØu0éΛ\%®õ[Ï ”á7 UI‚èïê4 gŃfŠ -Æîcuøª£Ü†!èçwB6ÌuD,  ãËó{ɽ†<U‘Ýs~Á!ýŸ- VHÆ& f0ÀÏpˆ.¼P7ó14š·BŒ.”Ç“HqØ8ø@U7pŒ8ôv8v«ƒX¨Ç,ZŠâ×& µÃBm²é§‹Q`ÔÒA‘j<ª%°.|nœ¥™®’?ˆ>7žjÅ¡n&ÏÌ.³{تömê›SÝχC€–aè\›âÎ>A‚muÕs³kÉŒ/Üi¡ÈŒOi6ùÝÚ|¸0<ýußMg,D² Ú¨©]újzO“¬½!1ØöÁ™Þöý(ô˜drÉêN©×FÝ{Q˜M秨£/JÖtÎË{H‚ÇÚQýf2„úr/–_báð‹x»1Ü€¼Ï]Œµ™¿¿×Š€Ê]Uwø=ÚXbUØZ[(X¡ö¢x"†ñØ+ÐGÓñÙV9CçÂ"ο»ß·´'9|=« ë½s!ϸ?ª X%ñ\'£…Ï÷ó=\(ïý²p6ç R"•k„¨ž+npzte? ÜÔÅ~'<ÓOé*¬m Ê»ç‹FxºŒ¯¨.ß(µ£Jü½i÷ëŸ ‚þ‡á µŠ¥-ú+a7ýgåôzøó;/¿¡*Ã+hÆŽt6k> è‡<Ćâ§û*íG°w-œlmp­ ›X;Àž¦r<¥÷OUžPweÕÛA[PR·FeËe¶á 5w=/ 6…É;Bg›§±r×ñ/§Öp”Ù¹%FK u'uÅYV1 ‰òâ—Q¦ Ý“ZUôêçe +bÊð€æ#£àZpWf¯)ј~Bß4¼Ž´ÅWt΢~Ë—VáXUa·J‚— ü’œ»÷òcÚxŸ‹ 4x~¡– —@åÇMšŽÀÅÖo=YWK¼§•swI8E›wÅÖ¹â3ð’e\b'h+i«}øÈz…ÖêW¯øuyG4W±¹x4G8G~­\"¾ôeÀöt¸f°±üšJÕ‚o,$fGš›œk¹òÞ´ÖW3Y¢Û±“mÊwÜ #ÿ%Ë;ÊrÎu.«Ê •xC´%‚½£§¤ÐyžÇØLòµ_]fh\#ÌS˜f\‹¾¼ÐèÂV‡R ~´ºêÂÈΠדÁÕèFdë÷AÎÜM\Ëlûbpt{é<‹!8Šx`ñÔjBƒÕ":lGµMBö5f`/'8•¼Tc©ajHlV6 HídWMî]èG†C+µOƒ…HócJ?âpDê+€PÿMSí±›âÜ‘Ž j%0=‡á÷á¥=ùoÜ'X˜±ö±LÎÁ:ÊlQvÕýWNuKDJª"ö«ð¢Â£âõúº%ºYr 5°IC÷±­Ƹ£1EÀh¾€abÐæåÍf;1T±6ÒX—½ôö­Ü?Seïx‹¨öòó3ú稾USSjK­…–N“<+ýî4rˆ:ݹ‘ÁduJñÕË+»?dÔVª…©E¹ŽÔ:ÀYVA•…s€Õý¨ÿÅh¥‹Í7ØTGû;ëò”’fž  P|º°WÙD£À ‚˜m™!yÆLÉK¯×¢îÅl·Ã387`öÿ®gÝ´8þßb`í\ë„Êç.H£rt ýîº} kf[î1ÞÔ²õxšùz=ª ¸¿5`ýõDC¬Ff¸Œ§ìžîÀù´§OÈ0²=^ÚíÜBïu‡Ü,½£3òÕ ð cÌ€û„—Ç™wuy®Gtn Õ1{hŸþ§¬ÔSôé&=@êéfHoe£ëæ_ÑbŽ[K·½1H%gœZ2+ØšåéX‹ûh%ÕÐZg²TiWž·©Ç'[ !ªU#¢°Pû…ð7¦+ÊÓ ‚H¿ E:¦Ä}w€añ ¬.Èݨþ8¯äöÿáÌ+JéÙú'µµîÿ IDZb|€²Àø"2Þ^.¸¾jqõå܆÷´#æR®žv&x|¥ Ñs1Œc¹ªÛ…^~;!ÂÕ¥\“êîÄë)]¤lIÅ “öýÜ’¶uùR/Ó…EÀ óz0 0fê÷ì¸]R^-QöœOõ~±]¯Q)u;cQÉë%àÃØñsdiñ«D.d›±ì…º”q/Ô5 ×OmƒöŒÞ&°âëÇ.Ij²ã¦©·÷ñÌ÷,_ÕÁþî¸Ô›¿¯‡úic«äI,×¾)iÎC gí!¢ÃƵ¢Yé¸4ÃÄÁÑIy‡z€å»˜!iWrà Ë\Q½ÑGX õ)€!ô´f¥ÓÎÊ~0ý×F“Çù ù—Ê*¼üÃËöíyr }y!«èx]}7woÍ4¢¨[Þð ˆÁ rÇ…Ф{u=(¨·2椲úØcF.Õ7Üìß2ec‡Šm=ä„Dò-±rN½aسyÊ•Q ÃH‚‘¡[/¨¿õ Bž‚hƒì“?Ü´6³…SÕUQèÚ4¶t^™°uòõAu·©Éî°lŽ+ZAeÐS R Q0³7‡æá<;Îá⪂ÀœØ|Âé-³½U¥ÊÄ™ˆû*$úûb¡‘¬¹UGcñè¶äV1@0òè¬Jì)¤p«ã!ôÊF[:¶dÞOpV!Dräú,e/pŽ.¤wœ€+ƒt‹øUÛ­0—3¹GHlÊò“\•ßñlÜïuA™v$‹Ü`Gº`º|÷– ´8ª¼¶4³ç-±ÝZ*úάaÁe—ÐE ¡‡ßгxU8:ê4·¥æG// L7¿_#Gý>Â[†éF;wãìÙ² ZzxÆ ãyk‡r”Ì( y½á9žÐoÊÊ•B ½2r”Ê [•<»VÏט…Å®`nb¸!7›^<3ROÐ]Mʧ*¡V@(ì &^½Ð/!ôaïÈž9&àbÕœûÅàSë*Zoß±²µ•œ;CÇätM)*gÛj¸¹v/5Eßš0Îð —&+ú(+Èœ9eù‚(õûüwÙÏf}êW}Pƒ#KXa(‘Ó6½ÛKÕ¯îvÛÊJ¼“KÈ»qaËHHÓKÁU2££úàUJ3ÓpG©J$»¯l’b.Åßã´y>Uk¦ävO ‡Ó$êÎ9àòã0xålý±Îk½&0øóº^(ƒÛ¥5¹hÁ&O…Œ[â—QMiÈDÆU‚ ALû/”eTþ–°Ùmœq»ÑU›dæx©nûqÂT¾¡àu!ѵÎ2ì'È8®°áã€×ŒøU]îÄô*Àõ°ž¥.Åø23 ?=úÔTöoøµÏg€ž;p4áê=©hr£Í™pYÄíµvÈHòT4ÿìðçŒZ¥„bâ#a´úÂ7yåØˆÈŒÖ1Ò·rß0j¼XbÆS[¨zÆçÓÚ Ãh2 h-†?2~ðŒFŸåÛ1'ˆÔYß E¨R–3e(±­•FõV«k%ýLAû|§e §M³Ö ÖhÿŸï+øYpÍù ó$`‰kq(‰½Î)ÂRMP„Õ0j®N8$‡)du˜[bÄ©ÚÖ‚Vm¬OêéŽJŸœFzRä@ÜË4îwdmz¢®¥²# ƒ0Jv}HܲhÆš |¡…cnN‹©’®€†ÐvxN¬d‘/³ðœ‰±¹K<)¼ñ'Í#–æqŒÂ‰›Ú3v6pŒ!²Ùœ¸|ö]Ÿk 'p‹›£ç(%ˆ–‡è­¿2)´Y& ¸(FµâfËm<Ü«ª¯úG (ûHû¤wßÃ`TJË}ªÕ׌Å~4îÄ®°%{€Ôßöãcßæa9ÒÕ“õ°}!œ –ô‹ájœÁ;`%ÿžñå ®!ÞcÃÑ»ö¤fõ°Õ¡ Ž›™KÍŸ‚WÁœdsi‚~Úù¥¦¨Õé¡ìÒÍBéÎS›N*¿9ÄŸH}µý_WO; o˜I>c×u† {Þ!UFð$)Xv›xKuصô¹JÊqöüÏü7A“×À‰Þ«¸Ç>{™;áˆð¡…»¶IP¯ÓÒ¿1¹A¥OÊ šìšbddñ •ž»ñw>ÛûÈ¢’u>Gå~<¡÷Rü9*wÇ]G¶0€\x4õ=™_° “IxTCÌÍÇÖ03€±q“ñ#,´Ú?@^ã¸ÊÙ uÚ)ÉŸ%âÒ 7É€öÇÀêÇ»œŸÌ¾CþÅ9‹zsÃf ú±jO̪QbŽÛ0ïQ°^U;¿Ÿ#;^`Hç!Xƒé…ªB ®an» S\dbïjå‹f3)·é“˜9Òákü•xŽž/ èÒ=L$/6ÖJã.Öº˜Í0ö´o2ö§ÛÞÊ¢ë'Mzýõç¡sœíaøé¶PüÓk/¢æŠº4wÈ.ùϵUËÿ2ÛB~8 #»ý‰] ŸÀȳ¿W4„ívÁ;ìD²Â>$ÏytZ}bf¹ýû5<žÖ;z2Õ[viø07c&Ûb‰æ[8ò F•?/e9ÿº"cb7^fSŵ¢åžø±”ÙÏM”ñ¨¯±ýÒl€øãéN’i”áõ<¥œuÔ4Ô¸[´âsd¿dÞ&‘´eþ‚mVos'„ìŠ]Ó±9Ë&Þ uK1v83lãR€‡bç˜ jzËz;£yò« bnãï|Áb]ÿƒ[Û„4l EÀ¡lÌ$¿;’´%J}piKÔ {=£éèAyèhÞ²•E©œâÀÇq • «^áu9¹*'æ+w̸Ч¹]PïVÕeÜz[Ekô¢7¢Ã |Wà{멉Vóá?ÅI”™bÚG–¼:d †½@‡¶.¥'‹Ã&ú2ÍÓ9¨»àq>‚ƒd>åÑýsk@X›Š¬¾©ãM­!•OW»à 0çb¿3{?…ñ%î0£âü™?‚¡¯òÒôOñÀß-ɤ訮¨q䉎©Cï˽Ü{äu€:›JŸvcJˆ½ñ‰!¼­ó @hÿ0Ñq"êÓœmù·ÂºF¾´Nö¡Ìš{-:6.æãµƒÕ°ËUóHÌÐ ¡ªQ’|)·‹¯MÉÒnÂÔååvÚGLÏ›ZIJEö›{ ˜‹ytµÀ%v¯¬wt*ù¯Dpã]¾Š.NJnã‘!²Tv;¾íMHÀø•w”î–ŠN}h2¤Z`ŽÎÎQÛƒH¬\X1V±Oú_|ÔÌæÀ_Ç’1Á*)»-ˆ”»9®¬É§±zõNQ§—§v™|zšmü:㈑ÐOYÏ5Üdí…öÒJ“D‹®pNU‡Í1«IÉôJ™H÷®›Á½–U‘‘ãžÆB\&E…´a=0e£¶œÆ!϶¸H—Ý2÷"./ ç7øs¬/lVðÎsêÃvÉv«¨N܇Çê @ &mlÑFR°å?ÞúšáLeõfþMhAuŠ1ÿÜsp5$D¢— i«ˆþ+ŽŠÿVCÞ¤eKˆd6!¤ìVE|+%y”a®¡ÿ‹vHyåö‚Mðh\×ÉÀ³bÅ!;~gkHÚÑ/!ùvªºí¤A½˜F¡5pCt7OÝ7 ?_’ÆJ-bñþ}'ÎHEç »š‡HVªÏ È›7ZùJr¿±Òù<*ÌÒ8¤ Úè9õ´ºl•Qº•JI.³CÝd½â S±¡a7Ɖ, ¡•]?¸Þ>ºÏóoz&"%þÒæ©Í¸×Lô+cÀ¢]‚6ÖBˆÞJ–Üà¤cû¿+“@ûxšœõqN yµqLòæêÉÜ’âÖ¢ÁÜa#ÌB¼:‘uì'8åÉ,â*ÚoŽIðŒß¡¤30¿{=µ´ƒà‹æ •T•ŸÓì\)@ò1¤ˆÎBFl+Œ²{õšZÑùoåîÝó¼Øî·õáÃ5¬è.oceH¼:³!——| ä´Ê89ïÃPèÃ8ÈÅ«ÌÁ\V˜â“¿·½Klwk‰_z¨|[\7k[ЧS¦¬Ø=Õ|Û wÓøWøƒU•_tWAóÄÊ¢§ €Äîï)iûóâ©k^$ô<ç×D€HÏ`Žß5À„•BGY'qR0­r¾ôê=µnš\‡H®G<ØÀ#VߟF¼¬&n_-Ø3‡šâ6œcÁ媲â?«¢˜QˆÍ¹ ¨ÜZ²”‡–³SZñùÖâ~½‰ú.¶ô¬ñÊö3fCèþK®"C»ÉŽ;(a˲Ø%.쿜ሾµGÀëÊg¥¯¾:8â,ƒÌN"¸Dä¯ýŠ*2Ñ$ެ ¶+m &š ó΃2ùʵä-ú*ÛÙ+ò¦Rb›¯‘ãD7´oÍÍŒµ3ŽŠ–ÅDf|€YÔÑS†Rfãñ,®üaÙÁðdD€bA«q¿5ŸèÛOÊ„„_aFX›ÆÿHgʆ•ä¤ èÿ˜úŒš>ñÄsóÎwÑ, 5sG¦TàèÌ0ù‡}#¸Mµ“+fþ®šfLJ¢‘€Ûòåñp˽ùV!}îû”â,RjrkžÒßßÍÿ–©†a¡-U~)ã‡ÐATfUQì(%9?¿úìÃoÙÐ8¡›Å°-Qù¬0I{²tѪZ£€ßÄ0¡ø ŒÕ©nŽQ°Ï„9Ê[T²ð«}ïÛˆ¤d0÷ZIój‹eÝI]þä¶'ÍØ[ÖÅ åMÝeÛ¿•“K¸Å `ð²râTPÝÁ}Ó9,ìóä9ÉqwÎØ·Õ÷~ÞÝE>êÛÅô(rù2[‹¹Œ8w¦oaz ×Loùc˜bjÈÚVøÂÿŒƒ;>“çr"]Äâ¯.nY…&bÈ_O¸KpÁM/ï°äÚÝCks®ç”{keüfË-("ùûçSÅ¥˜Á‹­šAÿhè œ$Ö¬ó!²ü©;Çgþ}·q¢ïñ\y2׈;(„wÓÐè^¾U´u‹Y« à›5¯èŒŽ|²_æ ÐgÎRi'Æt”"IÎûÜ)ŽËˆíC‰÷â3³½ ’¹îy^åg»½ §0sÏ%hÈõ«3’®P³ç SÈ¿b À4;› )ež€ð.ÖAü™Oj‰zër3`”R­yÖ°EƒK™æ.óü\ÌåKîbó½aøÃ^´ 3g5häè‡qä,œÌv …F+HÞUD¹eÑŸÌxôš¹ÿ¾\t¹*ÕaHðEáç‹  ã(˜ºnæßm…žé.±¸rƒŽ’D„µ%¸3…h5(×Âý™¡‰<~%ÅRêªH#g¹>àð»î`Сo§íV.‡\ü¡éÔ\â·`Ì« ?‰‡Ö÷Ùu².Xç’NÚ#!iÊK‰„£i¦q?M47ÇÔP•4¾sJÎ3ô°-BÌÄ8®”\cèÞ×Ä7½A€J“ãêû®2°Ä„½WI_…vQ’MꃃI7jÓ+×kç ¿È5Éj½_øêÜg¼œ2ªvwÉòèUƒ Ù¼?ú…ŸHˆ‡i'Ó¦5r–›L˜ »Ì‹á¼¸y(÷¹!¿ÈmïA‡êˆî2ݨšì.ýBˆ_ä+9é•L±Óo\ÜÉìúýU i¬ªOaó¸ ×Ãë½ÃS'Ù^£kÇëÊ¿‹ TýQ½³$/TVP¦©øœ~eÌ€O¦e^^Ƭ±«óhù9³||4W|]ÊcÏ0ìœ_|€ Ã69Ïv³ *<åÙQ8MáD“€J¨ì£ýc>Ýt«ÁÏÑÛ=Œ“›i`.¾Ë‘ D_‰àNo¿¦N5\†î.Hƒ!Ê'k€ùÙÆC”‰‡¢ÛD—ÉçÝ>£í2”h®¼·˜ Ýò€5x8ËB˜õ»†ŠP÷ð5²a³{• ÄÙ[‚A5ƒJ”º†î{ —l)ñ˜\8dúvjÛ%X+©FÌÒ@òÒ¼h<ÓoIþ–x€î@~iÝ9ÇRQß4ä 6ÒYØ8`H‡KwªàÃâ/¯÷—ŠÎT>úž\߃_éÈ2A!¤V5ÎÄ#VoÙ}µvp[|9;âvé“þVé¾i¨Y±°!k¦Ûs1Ÿü³‚g2öµ¸`%ò,<Ë?âÐ!…ì°Uí$€êðtxŠ#È»ÃÉó~(@ .f%>À®Í-›’)•6¯Ÿ³â&€Âž$ãÁ¹Z\ìÔû´ÉÿÏ,¡bЇÀÜ–!y¯¤¯ËüÌcÄù'LšZfºrRœÌÂѾì£3ÞAä©-<ò1ë±ãïµÈ„ó³ùnòÉÞN¥©m H6>ñ¦™õO›<F¯°Á”K8‡ ØYb ¯…Òî‚j9¶Xüê.å[51„ÉÆqB–ÉZ‹7®Î½M1»ŽçYölÝÎiYú² |ô“ Ùª^öþª‘ ø4aä.vÙÙÕÓĶºGkŽOFç eAÍzÁๆm4¸Õä¼çã +Ÿ²Döˆ-ÿmNtu!œ–>×2OÍYw+yK5 ]ÓíJë@ ˜[h%¯8’ŒB^«­y´Ú¯Òcn“ubwU9xþÍÃÓ¤ ïN[~ž¢H]äEÅüÚK¹¸“qxß­][_òˆ0Áˆö}P®¬:ü@‡è®¬÷ò¼úØe·H87MfhZc94°²Öܱ•™)fjn„®Ux&ü\&þ†t V;gŒÙ:Uo£¢€’ÏünÃoÔ¬úOÎæ´¤ ®æ€MX(´AoARµÈã “Ѩ¨“(RÚ¥ß4°ÉbcHõÜLÂðú7ß]ZÁ@£âš™wO³BƒÙ|xèÚëGÊÏ„õʉ>l›Ú<ý§j°æ`e±†N‹ð±vH&cîa˜:ÒåEèN ¾EÁ>·ð0DÏéÈÝ^±]º‰Ã`zk|¸euc:“þ’à+Üâ_ËI…¥ÿ²]öñOmœ°êŒöGt„ÕË*àÈŒ™ÌªÓK‚¡m»³ü8ótlàå<ÃøCÍFîã‡öÍíÒÆøãÂKFDˆB-Xu’£ÿW#(êÌ&•þvø?̲Ã!0JÜWÝL5cåqá¨ý:,qF´à]+VGÄÏÀ#7˜©Ê,µW |à¥Ö8—¯._‹µÚÝ(”Ñ[,WÎx}ÁPÙ~ _ÌN”îuUõ®AÁMm ñVÓ$³•Cœ…šõÕî²òݲ±¿í}陡µ^KDk‰›‘ûýeÒÔ6ïŽ9…æç±`}©ÔÖ~µkë9oM¥âÆ«zÝ® ¦)ºó¨¨vU'OÜ¢¼¶úK« *O/ŒŽZ­c™XaÜà#0¤p-iioØyu9í:‘OdbB°F–r߯a×ú ¯QÃ6ä•´},Ðeï·ÉÕ[Ùç.üq½5ß7˜–_Wñ Ö,C¬{ý*®sìLL‰¡’-îœ9-Ô Ý×ù+ˆŒñWjÑËÊÈcýþ­dÂÞf¹PÑkbLw:zMì 3¼3 ÈVüþY¾ì‰Q)ã[¾¦‰ÏôFm§ÄA,g[+_Â÷¨IÕ›%Ù†gôþÎmÙ sñR»ÀwªÅfüÁ€wÎ&1ÿ»reN_>aØâç’-G[¦Oz ½y/»T5\"uÝóg72”ˆB|­ëB§—Vມ:^Õï]€(4α±ôù¡š îmYr—ÒdV´Åï¨h§cËšývõ‚Hp›ËÀÉïéÖš¥¨¬²—/ˆ¡=þÐè‘3'kèÚÙ\3?–ÑøÅ4Z¾Ñk°´»ý „`,éf8Í-ÇxOD÷eGœö´äú·O_¼‘³#ûÎüþ¡Ç2²NÏ€|çh·Âdñž±'M("§oëE–/<†Ú63©ºê çµûYÖA5ØÑ_˜ÏõæOúÊòØ)«O€hÓÃ%mêŽOZ´ Ðpïß)ÈpƒcÊú9DA.?â?WšåÂõɦØÈM#ó¼úÛÞÜ(bW°`%ÇQžµ¿+'V®!±ìú%óÍùhC6 ³Ê°ÉÙØ0:.o-Wó˜¯>Ø.«f½$«ª&+°rµeöýM1jØ$dˆm{üãû!£9¤BÆ(Zú\ FJ<Ÿ…}|û7R.UÑ3ßT«ûKù“Ù“¬ïóbqj"³kdoôSX‡‘ä(ÿ+a¼€"W‡¥Ü%ð ÷«3šÉQ/VŠHÄ|\ó}¹•‰ÿQËótJ¿=X9»°P°üå Òì:º!‘mâÒH<…ÁçðÁï;e7«úÿÏD‚¨¹ÅÕS¾ûCÜÎóƒér¾ö®qey6m{VóÐöûÜ’ƒb«¯Òè~ª^L*ÀÝiÅM:D€JØ®":€âe‚˜É”ôê*­P ²é þ²ËêKoø9DüÈ—œ¶gI]ÚZ3‘Ž™+J$ž'HDby%,þ2s5rQŠnHMÛ:.ù¨ŠTF”®3µÌ Y;êíÒË–iSÂ÷¡b’_r&ý+”Ô–Ì8Ü·MB%Iv §#cH‰2uºï[sÑ#hªàp«!hT—Hjke~Ù5aBµ³—buwóÁy››E@!Ùû›?¤+ôUôØÈ/Mh ]JÏŸc‚VÍô…ÿdoÀy`§ä㡈Îjþº<xãBë¡—{@ÉØ€]3!_™()¦ý=<¥5;ÇJ¨¿¹8×X›Ä¾2ï‹ ß5† èI`ÕÁ¥ ˆJˆ‘X‡›æwÛŒ úÅQâU‡±-[<ŽkË”¯°*§\ÔR…½9p?Ý€©º ûƒn¬œKèóÓªÒ³ô«â®ë%kÖ‡tŒ±C‹9&:`ÇtP$“/æ‚9{›zqfýWëÖE&@`ÌÀsÏ”•¡2@¬#"Ûb,"«ÿŽgQG;šî³Ñ Ó…F†#0ÀçõiO”ùs=¤iìq`4¡Àfoyw X‰_×~Ì<ä…þ¯@Í30(®ÈšÓ¹¦á±Î¡?ízVäëd¦|Ó¤©­ |ŸùÎüdi`´BG@Ø@úÓ fwã”;ÈúnÈ`!Ðz~ýÀB[’•ÏäÂÖØç¢fÖBý¸ ‘c„w $é¼ã~:Á0$ö[Ý)=…?5b4îÀÖw5ÖÙô\3 °ñ´oa DÏ7}OÃ$”†—÷¼@d©¹EVû“\— dAí'ü$<—S³…÷¬(^Æ }lð8r¼>UÜ@`Ñe ¸V>z“…­>xøvøû×b^TQF‡÷Îg~n{ô¿^fhÑdbÂy'b€«Hná~ds¾º>Ô¤üÞJoùî‚J¥=I:Ö§h2´W2ˆÚñÖâ(‚Î[fxò«ª*_¥} à}i¥Ûœ&žaý™in¤"¦ÀÞ”D!¸þ/HÕóß¿ì,õr¢È‰ã`Œà–ÆXÆ e¸’65Kw­Ðó pkä)ÿMÕÎM|Öîùâ* [å= ÿ^A®"—²]°i‚˜ÄY ÿ>àTΡ@•,3©käÁê(‘”E­7<Ÿ¥™tG÷èO÷$íN½|Œü*’ì¹égöHá zrÕ!Â+×coùw™P¬ÌÔÆ™+ÈFønéÝ8þ|ªXДþ¾Þ‰JB©e”y­‹±qipc߃¾ªy: ¤<;¹ª„ê·»¨ÂA‹ Þƒ9ÜT}ldÿF!§;„¿ b½‰©ºß¶@.Ïdý‰5,H9³ñî¢ûïá³)aµTŽ&5@jx]Ž1™Ò·X£° Uví¶1”IK-Óõm¶F­TaøçÉÈ`%­rݵ<à@Am€œŽª0.E½ï`¥`E 7ô(鸔Öâèy LÓŒ4T½ížô}ýÈÏ Óv:!S ?‰Ãÿo’¯ÌÄE¨Îeoïì|l¸§/Û«º_)úfqFN9ËZhJü–8µÁÊ e¶ÿ $Rr¦Ì:³whL†!“V¬²|•,²©b€É¨¨¤”qìI$wíR‡á¥þXu2RºQ;C4ÅÜ(*˜Ò<.éœãmÝ»xv¯E2ë¹,Úm}9‚ Ý˜ß ±`DUS³Œš¾_¦Kä$ ácæ¯1›Y‹/¼ä¼á >U²Ôš8ØG²î§æK$ÍÙè-èsM›Ñ¯ˆ5ÒB(æ]²OµLþˆ.}n¬'¦(¬}Núµ>ç>¾’ä ç\¨Ó†·Tª2œ?oKP‚$å |=éE6U³Ü\¾ŒuËã?ÅÍEñÝ ¡“æC©\ý—rÔÞõ?žLŸ!,h ~Þ¸r½“uáÁ¹—÷@®]\j©ýëáö3g&ÇPk) ­Ð¡v˜vöÙÅmÕ.Ó!ö Éc-!Ð+šÑê­Üväð{’ Jv1Ó;é¨' ¿ÂöŸË*àrøö’#Ë{ôä/¶/¾Îq…]@ì‰ _QFm‚Þ»˜Ëî t³šbžIúpöQ'n´ÛY˜1âV›ÈRYæ0"ÒÔUAÌÙ› 5ÛÑâ>&sÙ?#™¿ØÅO~ìuþ*9T”ŒêÚN©na<ò®ÁÏ,ç©­‡Vߤëv¡= è_ë0kÈqù¢á]´çíF©Š¯Si?¿1 ø»úƒWkä^•CRœõ èX¼²aB#ŒD½Ò¨à 5àé':öv/×1sm®—ÖÿÚŸdLý¡,Ÿ¯£Â¯ñ?D~FWb*5tøà»¸xp¡3Y)OSáHàÑ®·ÿp×0—ÇšÙ{ò+‚Û‘~­¦R.9ÊN¾ÚÔ¨Qð~³@’µT´Ó|\þtb¯}f¦î#pu͢ݜz4é`édi® ñJ>E:ˆ·1&¨TþLÕ§…f.±éYÒKYFͦ¢´&Cä”e,iS8îdØß×ÍT#™öÙ SXÞ4_*e݈h;r¢Q'b’!z¤ô.“çGÊóÉVLŠï>`|;í̈Gi!ÓFþÖ1/iÕá¯p)¬Rk6¦©ùìÕ5ÃÒ¯ŽmÝ*z*¯Ø"þ²<Çh‰äú&@âG˜ËÜÙϤí³ƒî›}Ì ˜Óø.í§^¿ 3Ý¡2Œfr ["w ìø‚†ß(ÜóU³˜pv©+[Ä*¦æÖ±múÿ—þДllϸÃÊü4b °}M\7AwÙC—FQE©I]©üUcð©:aNÞ›Ð.¥-NÝž î!Uûw†ú2ä ÍÚ᣼Ñ9 Khb•Œn‰¶íµ}Ô}-?`3„wØN-§¾7N§˜w{c,ósìzëIÀý°"в-Z£#©>Ñ,çÅâjð“ĤR¡º6–ò Ä4¢ H=«/\ŸÍÛ—Dãˆ]-Ï (]ö'ÜÖíüPõw-’ýpÒÉUU!ýU5n«-@[¯:m`jž*».>)ø¼Žù—ð¬%ÀzT•Â$hä à`5eC‘ÝÃ…«­BºeÞNõK@Ôj|ãk3EñNå !+%ÔE& jQïŽ#÷*±šªtÖ(]Ÿ[acFòL k*`¯$ L ¹¬!JÐã_¤®n›n~ÌQèž§zÉòNQ=ªÜ\Û–_·Þ³¿%½"÷ôl5íí"åì͸:Nö9GfãÚ‡óBv¥Kÿ›(ßÃç`3Ùk³"•¼jÏtZ–R÷Hødõ ÔÊ™Øhg©/…{,|Oy{Úè83 ãûç¼ òó…UY¦ÔÕÝr`cÿÞ&s ·\Jŵ\¤„N„…%¥#™²Ðåb®/ï­Zr•ا !œ+R‹Í¯¡A¯BDßX‚ŽûE­ @jŠœ|.×¾P'ƒ™ Øéûƒ1ÿó¦¥oXÖù–ÅÔdðŠ.îÿ¬2Èb‹©R©ZáÛ<„%ÀmCyþ|UZ°í5h;Çt Ƥà2ª_€ )`,Oþ{ßn”èâåZSrùZ{ÙéMUÔ †Yõo7JRZ@E]Î@Úĸ ¨% SoÊæÛçpÿœ…µî‡ª1mÑ‘„n2{GÊ ³Ã‘N®tvðXÜý b qÂ!üÞ›µîk}…ÜÏ_PWí:˜œR&æ4’cTw>ÿEØWo øá„2Bjr*CÔ›NEõÎ ¿çkøçªa‚2ŽB•>ƒ‚¡¹›°òïT`ÁÀèo¥¤×w(µS1)BHœy÷û0Êáà¡Q]Q’z±ÚµxnhºŸÐ»þ¥¡¿ÄìØ­°¯<é;ÔÞ»F©¦áÂX¦æ×ïÏÜFuÿƬ Nu{ÍCŠkã–9lpO¤OñjÌslh" ±òÅ›>__šƒ-W:½é‡|Z2AŸy=D½ÓÔ„=D8ìÈ7j£É¬‹ó¼6u)½5B‘Ë%ט¾)5*®ÁÆè­Á·7Þ0 Œ‰e½G‹ðadtÏ7Ü\ÅóÙF[5\¼•µÐ{@âî}«šá G¿o4!Ì“»0¶y‰Ò>ûÁ” ³ ÀÿYUŽoRâ4oõÖïîwð`Û É§ùTè!_„Þ:7)8 âápÒJ¬ñ0$Řk6Ùk5kÚI—TxÁ¼–±¬u¿p¸A3”×»ÝOÞ` Š_¤’n‹ÖöÙ2鯿<¶ÂO~Ô@d Óœ{ ¼¯m„§”`Rž)íê§&b4CüG0’¨øÿ<Æí…{fjv õ^þãµ’.‚a’”¶A× w7d˜ûó&ý±ÄNˆ{›ÅÙ%ÊîÌ Kcg‚TÑòb!=/óú¢^-¯ì§®Üвgê3¢XŽ˜ý;€Ò(Ö/<Ë ©Jkad¡3-^˜ÜïQÅ)Gü’ T"dÉBÏ‘zì1¢ÁÌœòp%Þ³[À2ç9}&›)#" Qç`R$“¯Í or•WË2þì«>•ìzµQ$ø7G!G¾lª3˜Cqq†|R­ô¿Aq4w|5ûì0ôkC.Y+}µÊ%íãæ=e軜3å"®–òÃ_ {â±¥(ª^»ý:È€nÈ A‚eXŒ›iåøå¾ÕÉmÎn3‰îâTŽl{2peæuò:Š×žù³!d{ïÃÆ¶Jó™¤É«Ƴ™Ìx‘$Zf²™kˆ„¬}"¹-±ä°®eJð¶üœÇ“XñK“D­†ŒA³´oý©\7TmQûî×”+ŽìÁ*Á#ˆØ>±pøõžË<Á­M!ä7óßÚF€05 pu*òø‚E¾ÁÃþ‚Ä.µôG0B 2(_ÇK—P–©àIè}¤2v¥4%}OO+~#óÞºÎN2ÍJ?NJ܇÷ / •ÿÜn[g”ƒ¥Xd6¸åŒü¸®Dµ@ŸFç$=Ű©f­A?_ø‡üC]ò°ºtǨØp˜ÝGó àšÇÝŸ€à,Ö`¢‰õæV‚¬¶Øgm†·,Ö·bº^K™CäfýXWþÊÍfÃòÎ’ò»ÏÅ‘>H2fæ¤%¢4 `3%²7ò&Éͼ˜·Ã-€Z,…6p #Î.\1s)­VîkRo€ŸW·d…„(-“ìvuêë`‚#ŠDITۣ̕cÒ¶÷Ø]'÷Óaöµ‚ÛÌÌqxíÕÁ)Ðmñ¶ Í73×4…4 ¯¦§Ü:F¯Ã´+“ uC¯ËýÓø"ö$~üXÝèªm±üÇUje/Øn~óçDtÖ'cÄøåzý ŠqtFmq«ÅÆ sìDiƒí\ >‡é2‚„˜ Ü3—Bý"ä‡È@µåi®_xFýÙ/(°ÅÚö7±!{ä+È!PÇÕŽªàÒ¡µTI°©Œr=õ3°+)áu»‹ûÞ ‰?§KÑ'i-N‡Ì"é×›Dº»ŽÎŒ€R…š*ÂÔxQoÈ^Üá^*ŘY¯ôaýKQ+Z’ö^¥Ø«‰D·ÍW=TŠsëý±ho›Ÿ¸éÊõ¼0h1{]ÝØìEäJÃëG€öcД\pú–—ÿúð ¶ì ‰Þ“!Í÷z²\þ¨{¹j²E­Yõ /„½16Žcw¸Õ¶jã]*£ïÀçèZ×nlç9²í®¸l/ž+…7£Ç–”Õ;"z+ØÎ@¨!3°tk RÆÎY7 /µ™(DtÌX%GçuŸ#fªQ1P:¯ÙŒq²¼–àEÕt!Çúþøõ¹ux-ß|ZfdØßÑáæ¹~–Ë)©”iUií òY~ûƒCƒÂÚÛ¨‡yö¥ÌùIdºâÎ0Ž®%ÀéKúñ'M?Z†].4ñf!áÆfj'«ûÀAæ¸ëýÁ1v õF›µ"mº*¢³îÎX=3„Ì;Šò6pull`UKâ}RÔë¼…D4xE¤µÇ<½ÆíuÓÙ¬°K5êQÉѧ­A,ýØy*çŠ×ª%‚N[ì§ä‹2 !OÒz2£s£Ó½Ñ‘à÷É£Q¦pVÖie«%9³ßÝݘõj¸`Ã8.ÙÉ6ä·t®Ï›HžÊ-±µsÕþ$g 1v×Â{(á˜/r—.Öj]cãäQ ©Õ¦\\4>E¸h:w‚UóÊD àTöàs¥ð²f+EXWdØ“òwJiŸª® Ã£â»Ôyð!íÅ+ q>M¾ØÞ×(Ïx ¶üÓÑt2ÊѰëÅݘGˆ•ô—5³–#ÕDº“Aiª‹/ǽúäpõ;­¯’m@ËDs :‹¸âý)H@2¼èÑÔÿ‹u8¾Ièg;£?LwÙ™¹-Y\ú\.ª~v"6iN?„ÌË}À5«4b¬ó·©ôWÆÂÀj‹ ûR[S´[ïmÜl†éèÑ,hP2T þá äí©H Ó–ðÜÕ^ÛµÿN<¦|>í™#åÙJW›‰ƒ€ÎÆXhŽt.6·ûKXÝaà'J"v {³ËâžÓ£õ¯ÊQ¶\’pÛ)熡âHPËÅ¥is:®_?8Þ$$óM\‘*Põ{IÔp+ øÝpïŠ0]Bn§›€Òïœn(ãN~``äo#G°zARsÒL-·èžc¯ŸlгUJ¸b;`6!zÔFÃ7Xpfd1‹éùDçÙëdîµnñxz©’ÏsƼÿbÛi¿Á•áʼn žúw•ê g·PR ÒU'›ý)ü$³Xq'Îð´£Ê2°<€2ü!… Rn;zÛ²~‘`f‘Ô§ô;ŽðØ™O‡!ZS‹ÜEâBòTƒzSV»³éöZ¤ë-V”9£bå¾d#ß¹Ãâåú^ÎÍ…ßøŒnâ$^‰Q4 ,â;£ªV—CНL¹ºÒf»À£ŸCé^é@P·„l$¨×©@F»õ¿ý&2' £¡…”àe œÊhƒ¡FC“s‡NŸzô±G1l™áÊ#¯b[«+ŠÒÜù—Pg¤7XÁ¼.(ÆŒÝ^¢€ðØBµ`kÑmâ…@€en‹Æå ­ ö͘˜N–i† G0%°Ï1âä0¤þ´ãþcû Ÿ<å#¤e®±?Ô¡£¡9¢õ&Ï2[Gºœ† ”ÒÓTí#—Èü´çåÏML¶„O—ÈâðP_¥å1L7áSRÎ>åÀ\Ù[ CœwÑUÜ`–‰¼-È„\±ž8)†MJñå~¡žõaü¡0šµa=áëÿÑ‹4óˆWºÎÓA7ñ«×ù{O’,Yœ‹öLÃzy¬ŸfKÿ-›}—–š{ë ÊCüˆžtÿ!¸ "e¢ATWì¶7£¢E„‹ì:ó\ìusÐuvb0C1 ¥]þ°Àd¹# — èø&¹m(IïlîïJÍg=i$¯ÆÎN¤“üBÏ-ļ·Pbèý:s»ômÍD }–>'2”ܹe¯iIQ‰aI ”s¶k¢såV¢#BrsØŠ(ÞbuÝ¿„Ð?ZøhD˜?Ô5i›QX˜&¥ÖµzóDUù*6yEØktÞÏ›%Acëô½Ëâ‹á·À½u8Aã 1‹«8÷™ï²!úµ‚:ud>¤Æ!rQƒœ)*DÂe†S©BâwšŸ¦êIS­M{ΞÅ÷þåµ4·’éá/u7JÈÚ»~ÿÂYÝ;q‡ÇŽ™á¤Ð¸ð‘éuï™Å½zLíµ vª=lÍJc,NX[dÑœ6k÷’ Åû¢ûøÈlÚ)9Î^^7d@y…%÷Þ×G ¬„ïô%lcn®9z7÷(y~Ñ¥“£VÈ}Ü;xýË›XQDüYÖ¶/ àLb{c:eYÓº0uq"¬7*1‘⦞Tàò@>»|ƒž¹¸z¾7n ZÞ'Eå˜=9J'ßÙya\K-n¶#;ž/'šV»¹*PK­"ËúöVü†¢x@qÕ‘ÊŒ‰ ˯#‚+{7ªì•ÐH»ÛÇÛ§ï+cÐóøý€q²´Û–7ñÆgXš3\y­IkW´euG8póÖ-(EÄôhó=ê7„`ñL@yõôê4DR^ŸÆ',DCX^6^‹Ž–¦C¥0<ÚW%Ì–ت'Wb;òV†0Fz?¥&ž¿ë•=¢-3J­I›Àzÿ°ÇÒ¤¾ò)4ñ¼j¾g²¼n2OÑïíÞ_Òü<Ÿ2ÁªTÜÎk¶ëõŽº[ÑŠb–NK+%œøbL­©T¤<•¤Íøû€ö™ôû)ŒÓ‚—ŠlÚÈËÝJ ‹¤–>ìò ¼ÒCpmXé_¹³Ö•ç½ùªÿ*ƒrŠ>;Û>L`ÄTq4Àƒ×$bliHZ\ek:Ÿïô ×Ësë%¬=ñ“Qú”Cã^M*6Åž•¤÷sÛœ¿S$ôèÊY®š:6ÅÉá&îŒáîb´M,ój鈅F*ã‘QJÄ YU=R‘_4#™×îÄæ2Wqg½w~EÇQ©ÓqÈ)LÔA¯~ÃÁý\͘Så,ŒŠS h¡Û±×wOª»¤ídÉ:õÖr"DÜ^ˆ52ð8*½ƒ_Ц.AÙ•rÖ4\nø7ÙçöûhòÉ!54 ^ŠÃÌ lÀS”kÎÔÔ]=Ž@ºjõ#ï;¦p§ƒ[™ŒJ; FŒr¿æ yÚ¾LYŠ·ôç&•ÏF–˜!ÈD¡Q÷à çmÑSÆýEyh,?»Å‚Ôà·×a€YŒ½›o˜2ϬqºQaÞ§‰Nص)aîÀ¨m0ÅæàÀã½!ß½¦œDŸ3—Z>Û[|Ý…IìOxî§úÇN¡g¥ÞÆö{¼žÀb÷ˆø_ Á- ïrö7n&ÕtÁ–YÍ1 Fú{nÐÐ0à;B>‚íŒsC&ØÕ r³ÜÀÄnŠŸm¡|IÆ›n<¡y7‹*¿C Øéq[*§ê ܤ|,ŽRÕ36ü§ö‘E;4û¾ÖãklwJ±¯åêEì—aÖ_w½›È¹Mæÿð×Á‡¾ÿ«!}üäŒå]—cæyx ó Du‡Ôa„üšÎêÊ\K½•Êùz¥¡vÀS|·#èC 4öõù?2cq\¸r¯…‚ô¶?ÚðÁÊ+/>!;CðÄW;ô—¹ (ld‘YÌ0Æ\VyÆö}QÐȃGi†kÍ{>áä ªß½_´ËžnYáÊn^gÐþ¬›°êðÔ0ƒ2@) ÝÌ ™ˆþ™¦ip— ‘'Õ2Iÿ¢4ܹѡ•£èëŠÎc•_ÐXÁ®òïÉJbêçU@’Y`~+í˜õÊÒþ½rl´_e¦u;(ôÇ„òm(_Ü©8 Ô‡ú¼Î‹…u)3±ƒJ’‚ÙÚ3uœ,Lä ê» Ýã˜*C£76cçû£ï‹áP,8dãôéã'£1"šF"Y¥l¡íŠ89ò?(õ2÷d Œ1.zU€O8ü_üÚ7¡ø¢Ñl8½oÏÒÂså;‡¡ôF·9âX½ÈƇ•!Îáú¯LíRNûÆæ”T9VåÄÙ¢?úZ£kØ÷Öô{-dË <1Ìqá"Þâq¦Í÷è`»¸ÇFwa¤ÝÒ‡ÖqpŽOÆ ¸(«;Ž¥ÑåvL‚_k8P@GaÀ–æS™¿»ßÁ=Œ;W9†1«¿±…eqj¾ËuÁ«ÏeÙ@s£\»wo){ÉsõûMó¾–-ûÎÄuyª?Ò@´z2,}Ý¥aû3nFŒÐ }G¶ÈæäzÈpr:‰í%ŸÁÉÆQŒ*L)w–@§6o)¿æÑ…)ˆ ÷/pìKaꌌÞL~®|¡½º2e†°c¨w˜Í»ÅL¿º$m`q(ˆ¤öþÁ–×›®´Ý'!‡]’Q7AÕ³9¬/-ô¬ŸOH2ù]>¿¶ê¹8éñv’jÆ?r2=.E¥&¿Ïžèó€ï+†5 JH~¥Om:´^¨5vÆ VP²seVójÍD‘l`-wZlÒ–ÔÕhSç(ÝX­³±Â^£ "¤nCãUɨ…a©®tÜîLHzªHÄ“žßT±å’af_k‡ |CÒÇ»]×À…E7ìAh}ïqbºCQðŸoëª †èó‘iþÅÖy'LN&èRg 'ƒ4è8E-ê%©îFׯPsÅÃ`jàZÅ•jGŸç7Æ{ HDeIÏÊéaX|øæÊt¨ü9 fL®M9'Ö2y’cï1½g¥Â”@iFWý»«p€~%m&åá‘y¦Ñ’Çë²â‚aH'aà#Mk!ªJĦ rèÕB{R´öîßbRéÕ‹6ìê0ãðkƒoÄûmýŒ¢ŸÉBí=’ÎßĎɽ–]C¿ÏÉ€QÝ¥vAY®Ä'DÜôØóöY‡Ú.LMìmÝvmzojCïeãÁç”1æ ’A |à'FS2½ˆÃHÃ"~ûz¨´„áÿÒ 7ÓmŽ¢·t | ÷‚ *éoõmÑZ“Îë:RÑÜ1ƒ’‘8ujÛРTÏMv^a€|(>®­ì¶EŠL‘Œ©ló:*C5tîðrFr< iÚ,ìÕq>^¤Ã±4ã Gš«O†qÁ³ É”¹Ã¨}±iðSjàý&‚x Óh«¯ýä¢o„Š”¬ó׸1Ì Ÿí út>@¥vÚTõé_–xdÇkÑN*ÓÕÔÔ£ävqƒ—4Ù3Í·e¦»EZº°V÷'å]™\è=„£Ô¦‹ ªË˜ƒ‰ e= ‰ßrQç•!ß—Ç‘ÒÂ}‰V…€iæ2þ+mwF§ÆÉaaâTÝi>©./§uͪê~×C÷Èçý‰”ãOv˜cü\[]æ°ÊÔT®¯E]ƒÀ©R·;Ög—KSi>؉ÔÅc¾•äã±@±5¸ÚwÛ÷à@K`næ*!E;Ѷ l£¿›Å„Ž@³Úˆ»u£hYèMr_t†òßE®¡*stˆ7#°5ßÁa|éo"›h‘Ø@Ø-÷5VUœ^`1¾‰Çÿ-,8Ô†cþv-œüaò#,m1FX„\©ßVyÊR[`¸fZúù\MäÔÆóŠºŽä¶? +§A䯄ýË­ˆD ™ eqaˆr†õ‘ÑE&¼r/»Ó-/‰¢Ò»€O#8#­Œ¿z߬#ÅmH¤MnX¢h·2ÕˆrUŸú…÷ˆŒð“m"4˜FB4,õØA†«Ç¨Í‹%@ÙJ¼žË.&~.%X A= ]ü2J»D­ìYRý B<âÃ#6=#ÍŽÑùà-:£êÈ%ȧ¶õš~›`NQk¦°«ÙH–Ë<8þ0†;†åÒNO‡´â’­:E«‰µ„“JÅO;ä›Óâ"‰  4~ƌ†‚*Ä<¬hõÎ/íë¹”«"O«0ÔyÎ}NówDn± õ}W:ú©ºÀµírµO lb”˜ð)l?œÊŸ tÕõw®|ÔU¡ŒÇÛm힨¾KVT6qeÕ‚€î#·%S3%ÉŸãï²þ_g›i?ŠW¼ù¶lý©›úÒ–Wù’Ü9ÊÍB(!>î ˆ`!ÙŒõh sÇc: àx¨)΂„—óèûÑU¾Ôå©äæÿ|×¶Ô K\òšèõ#Õö  † Œ»*.ÀœŠù׿²W!¶¼ÓŒÓ‡p„%¼œŸªåQOÛƒyNX£ÉyçÿMr t£Ñ0Fê#»N%ŸyÿÉRlÛB`ðsÒ(ŠÍ¶hÐÎEÛf>¡\,§n(Óët^Nœ%RØd7sÑãŠäwèJ¡"P>“ò¨»ÉÑÂÍ×ÇO÷¸w@t‘ ½¥šd’ÚÏ×Ý6µåzŽ«VüUš½y¶Ä&ßûM2Ãäßñ‰I~¥4è+F÷òŸ}²óëäʪù™â(šO, &yrFý2´9Ä &øÙ{Æ&ê#,\V¶Q¹ÒwpP<¥¬‹_ëA÷%xæé¼éÏš>ŒšÂ0Y°cqÐ :a<!GìÒˆ,䱚šOf;v9´±2Å=œ‰û—Iq^-òÜå$ܪzAÚ„“°4,#2<~’Q[ȪºìO^]Ò@dn ^|‡t¶ ðáÈ4Ä߇ïÉL¬½hÜÇ0=y¤VÀžp:wÞ7¢ß·3s1|¶pÒN ·ˆ0–žnˆ\|¥)(}pèüïý8õ€ž„<ÀÞlH?É?ýu;|…µ¯gšzÂjV³Ü~ÿ¯Êé~§6ozŽ@ÁaL­éê}.Ø‘¢û‘¿(žSC’x³V¢Ã½QØ^¡—è¼8¥ •À!l†^òò00$‘í3z;~û­éZƒ¶Llã6!¾óÍ%Ž“Ï¡ Gè\z@åße¸É#õ,¦äZrL§ú·¦Ç¢, ˜Cg€Ñ_ZXÞNðŠ1º&¡š±›±"q‚•·v½BN·AöÞ`âM¼†NÈD.dsÍÈõF|í3,‰’|RCá-ˆéc'¶ôÄu¸Ë˜RÕU5£Y” Ïwë$$Âôt`WnñH`É|·±lùVÊ“ü—͵–å¾ùM“íG·ËK±Ý‚"³GDMˆ"(L0ÊÆiÔ~›³#’CÎKaË&Ÿl“]@§UÄÝYùãdwÒ´í´±8w»10ô¤$U+‰ d mÏ·Þ~lu)1ÓQ>Þ¤¾£m’½¡¼ÏÊ´%eˉX<»ó[žÈ1GÚÞa`Zع¥ÿjÔíj‘Z¿ ::¢ ·ÍB™ê›¡VÖ¿gÈwwy»4O½œ`ÁÃ\ÆH1l!gGr\zÉ×7xVß›ÊéÖÓ |ðƽ²¹Ûº“«±UW-¤kn]ˆ¼Y ò‹Î¯ò¹ïN¢é=`"Š Mýµ…æð7Ç-ýƒL[‘ß8HŒò¡º'¶0ha9¹±7_ÝÒÕ³KѰ½98ÏôW÷è;3#JäÔ’£ö2YéþÔ²W_ýu ¾&ÑNEº¿CícaúTÑB5ìY)‰¨i6ÁëÛE'/CK`£3‰Tùºd/°¥ÎΪP}ÛeàþütœC4Î"Ëß;rÐ|3Àÿp{Æ2v »XIÛ(·5%# '*v¡@Õ;XOƒW„¦öíK ]5ÓÌMv/Œjªí£ˆWÙxþ yê|Iñ®‡ ¾±Y7-pPÒ&,ïÅÍÈ›—ÀY‚µd==µx¸¨çцÏùðêš­Ÿ¹ç R™¢ûÈc³•éD¥0 îgÆýr5HHÓäI QÏŠU»T˜úUM¼øäIn?\É`§ ¶ç_įC÷…"õÅ ‹ÿ&¢3ǃ¥Yf$¤¦Œ"*•^´ƒHˆkWP>&Ø w²­\¹¦ô o$îov,Êëú™…=¸Ç@—óœVVÿw¬#㊜ÿãÛ^S‚üïËÉÏŸ9¯2¯Õ¸íó~.0–·e¸{ëln7;Ö<äL—roˆ@i:š^EzÁÑ4¾RmzŒOŽ<»µFäˆ+2‡Ý¦’Eg®Èî–Y÷žÐñUͳ?qI„‹Ü©7™T;±'nùâí0ä䳫ðGt§6€»ƒ„8ÐlÎ v0Âáo©Õ½ˆn§¦©í ¤v/e¥îó”…3t׊ìk‚uqö"aK@ûIt»£ö§GÓs÷Ygš‹œßfïÅ+.äjŒÂ…[A”V¾ùÖ¼/øÖýùŽò^ù7±Ð¦°¿s¤t£âÆ €ú²ƒç¢î)qòWì& ¿]Ö ¸ ›â“°ý5+ ù•òÖÆEõsÑ`x±ûÍÌä [¹ ¹tk]!ÿXR ÎčЮ?ñ!qæ§ØÏ ~ÞNÄ…tÏR$=„ÈÑñ ÀyØ’çø‹ËëK믟ETa`kâìÇúÅU«sÏÞçÕ­,ˆùζ„u@3º²r߬ŷ”î¹ÀD™rMÌæcßK™`)U Òbã\Sfº50$ô“>ÐÑÀÞôCoHA&O7$²<°}e™ŸÔ Jî ÈZŠY_Î6J‹w%a„sS«ïzW~­ØUAÖ?… cV ŸüoT/¯ìEÁ" ëڅ&˜×†ÀvÃ>kV´!‘yÎRsgx龺éÿóŸücI®jo˜ÉFâé]‹Ü–ð•¾/µ‘¿Êâ]ûân˜Caâ€xHsžðV`® ‘Ì_7¢ý+×òêkÿ †e2Ù~ñ:§à.‡`€° ß|%âá°mÅ G^l`Æo} Ú+Û4i3àÓ‹Çü*Ûf"àb^-]-ØÂ< ÇTœ±”ÝŠœGŽ™dÍÊÀaÍrù6\}çŒF# ’¶²ì‡Uz™hr[į ð¼BVt]Y²¾°Zv8ûŸŽ3—úR×ÿµ¾"mƒë†Íû7q¯Iß¿¨Àw8ûú¹õnSÕÚ¥÷4Yüu >à%-ÇdFY„ž«»©…¡\”¼ƒ¼x#Íõêïáë´IªMXçUO¢$(½¿i¬§Ö1z¾Ö²•®$3J•?ž‡ûÝ75ÑSŒó¯;0Ê4Fï¼& qM ÎQ%á²SéÆTÉŠîÌ\ vCo^Þç~« ^A{Íp$„ùE³Å§£Îeûå³ïÚ¡16nkZ™Å§¶5åuZts¹¦§nûOÃÖñú¼õ &Œq…c‘ŽkO¤¯" Ç%A³[ Ûû-D#í#,Ó®¾¹Û/ßLñü=•@´æw/)l+•Üþƒ y‘ÓüCª@@øý’g3V€ªMqŸ V½kÊU¥Á‹2˜©VžqÓ‰DÈüå9‡D@ˆð/ý~˜2.Ñ}MûÊõH ®E ´ŠmXœû=»¾A•€;€]`³%ÝIåáéبƒÃ©J8‹ ãpoSÐçΦ}E*½Ï!êh:PÚ¶Æ2?l×°càªS©ó †‰´µ6Ig,Mö¿x9óXîºèbem6á¼~oLJxÊÍö¨~š[ø'»)˜¿b†ï´‰B²J$¬ („tj‘{ß³ûU—ü<»¥½‹²|”ý‚‘1Fà“düÅ–rGþÈvŠ*·6éG.7$OO{›hø­X"Ñ$Z‚3ÙÉG¬<„'L·‘æš®-Að…ŸrÓó ívºÈµà²Í_/dù˜º»–X´ÖK¬Î¡çPA‚H¤ˆÀxŸ¹1¶Á™« —›F´á¤vÝgÛ§É~:j‚"µíǹ úqº ª]s/';VíS2ŒöA(åM2’œ¼TI}Mdœ`ïq„1 ”kë:­øã]‚Ðò4jýûn–þ^?d{Rv3º´ò"ŠQ»Ad!•yA_Á?>¶¥³.FPäÿ)3µÅ“h&­Êa ò£|‰ª½w„²^Ó”…ùUf¦¸52ŸÆ>Ð"´¤ÓáÐÏù1­çÈ"öI"ýÑuˆ´mBt~P×Q÷âoÛI4usìß6öè\Úk–&XGNcø”ümhá/ÿygõðñpkÖ(Þåò‰²ÃÒÅ‹£t"V\Ä}À’†“·6ž·x ³×Ù¶¬Nù¡ìÞ•Ú,g­?{ æËIÁ,Ï¡Z؃Ñé®,Dé´w2sþ.DŠÑ&xHZ1>rm¼Ù°#Ð9Þq(©HS¸üàrº/ÉC~®ÀðB7‚ÐOE@Žqòºÿi”Iœ7ÙÓÚI'&O©I‹£+Ëžà¡·À†-HBÒ hïò«bwŽ ËЬ 8ƒ}¡ 4ãwtP–7¢§iZIv\6ۑܬÔú]<ôËÖËÙ³£~ÊçŽðTwFs_TE,Ì’1~†ÆÜóFæÀÂeEkÕ'Jÿº \"£H Ö@a®yÌŠ¿**cD£“ ‚bÀÙü >Ä×Õã$ú2³¶RÏ—ÏË©Ìc,&ƒPÏdawòdJÁ*lŽ)ÅÍ߬+.{U>…»øz)‰ž.7.À D³ÕHïìÀ eìî0:èá7«Ò“Ò/%+—êr»æ]ÛR£Þ9Áõ¯E% ”E¬J¨\ wle¼Û—B>¯w¬cÇŸú0—XÕ†æÈzB›í"ÕÅ'ŠÔ£1Ñßänü­)úHé^œk&£^•&nË¢mS¤ßž¾˜Ì£Ý QËÌîÓpJbÒÎ)JßB¬¨[ù­<ÈÛ .sFtk&Ü ·ö\Ç’Ý_©e¶¨;ØlÞK~\Vq¢z-V8Naf“#OycóÁ+AFVÆãïþƒ@ë½±¿z{‹y6´Ç^XF³Aþˆ8‡±—⥠c_~3'Ìãé¶!ɇídm<šÈB²Tú´„zA°rÙûM÷ú¸«„|V´¨ P¤¯cx4Ï•þ &7¼d(‘d¡÷6I:•|EÐÖΑñ5HΓr–èëEi)NÝ$ãà¥ôˆ3¿ªfŠ>‘æ\¡ªÆ¥iø´t²g:O0ºïãßuEhè9 ”g8j»x »lóÚÁÖ| ïäÒž•Vö/7íGµ2&> ëiÔŸ[;=ú‘i\™ÛÌÜZT³ “¼tš#±-·òdƒ¦Ю®*ý’I‹‘šñÁøHIŒ²O˯ƒŒ”ùÈ\¤ËMS¦×Ål<)ê¼å&äêW„–7ïPž™¬º®›W Ù; à-éqègk¼Í\¿j“XéŽßæ}IøÔä‰ZÌà,RŠË §ùòâ‚ÛnãÝ´es¾e‹I±âõîF5´öµìÇgwæ–“±f’"” ²ÿÐÇŽêûÑ4z­L ú_‡eNÒt¹-b´RRU·ßï/© #^âŸngéó”k1Aá¹w[“똸ô¾¹JÙ½#›ô²QÁ: 6\ž¾Ò¾ ó@+’•?»¹äúF×ad©î ¼t­;ùŒRÄž:MèÇÑ¢‰±­óX-Bp ‹óœNûTð@:=ø¢qR'''™~5>iÇoÀ9îrƒCdî«™L¾Ü›ך,¿²xÝD@¶Ù"ë( ›hAÔ£MS|ÛgVT9¯ì5©ç*·,7ܪI¡*ÃîVÝ Tžþ¿5æÆ>§0 ÜÆüýH0:r:ei~^*ÆÜ37úC~«©<«ÝWª”cÕ+‚šF†‹Û‚­ ÁÇ'3pV±© 7Ï˽ô¾a:.}‘ª~Ô’±¸#ÖXð„ù¨¼;Óâ»»RžG·Œ7=ÌÏ›‹æâ:]A†XÿF8®n§ÿ!å]KÎþøbäÏûä@OÌ3f×›Kòs†™Z½jš=ÉwxŠ`¢.á3ÞïLšm›Åü²,Ž‘š{() žü™áÅÆEðTi¸Ùd?–D3 kCŠZƒÓ<Ãì¶å1›¨]†Vbæ!×&8¶Ÿ8±aYúFé n$3éˆ=ÿ±ñÕÐq!_#‹笀AÁ!ÿq}5Ó¯+ ]mºE±a»ŠÊÙ: õ+_y¸’¹=à…:ñýdEšJ«o"ÐZ"—$w„2T€Ÿ—´n¼\'…dGÆî;q•ª„ÀE¨Î3Ñ놋]Q‚¼ðÛ‹€)¯:ëT°¤zÏeH9K4ȉQWdAÐ÷Ý{Þ’[!³jŒ-aíò¸–’eÉ¿–²ç‰mø‡|–ìò‡q4ÄÚÀ¥÷P¬Ü\5˜?´ ›+AÎMÔÆÖF?ö:wôtìï9õ/¾µ/ —Jì,€=Œ ÛúNZ»7µ:Oó²Ï¼vàC$•¬+vá÷Í.Áy 5ÿ¥¦.ƒ[ÖA!Ž­ð;€îêo+žOÊï]ësÊ#[iäþº6 Á7µdZfsÔ”‰®O0ßb FÃA<Ͻ4uuLÀ§*œô<—ɦ¥®#%‡DÛ¼ÍÜÉs¯ÛJ¯…Ùnà%ÚëÄH—Ú0(чWF’/žqâ—i¼eA¸bX̃œú†"Ö…ñ¥=´S§Oÿ®TË+ ä«bΆ~Nü5¯Gþ\ LjvÜï’ª\ž•€ƒò tÜ+„VjáiªÖ÷JȆ‘šä<=›íQe6NóõÚ«NAíñý¿Ð°~Ñ$­Ô¥>i¬ðRvZÒ›Ž&TÀ]Ÿë€Ù®ª¨–U±láìiÓÒám ‡4³ôȤ¼ZÒg†íáÕ¹X–=~áœÆ'ä|ƒQêûŒ ~³„˜[3É:•Âøì({Áµºäo+*ÄômgÎ6ªÙ$GÌþ¼¸ª¹*÷¯ÛÙ“‚ÆÒ’.ÐþƒTÕ3ø¹Ý(žH©f=Ó¢Ä5G­óêlòð£Æ’8.3#ÁÑk·uôº…ÒžM8ÍC£äQJM '2•>—Þn o¤#ÀEµ"rµzCB(·½_ñÁ á™ÿäˆO2‡þPx­]“àU{ùâB½´®Èÿ½Lï<ãj‰zûŽ#³üºÒR5ÊKýß-„~Ñ,PfyñB•jxp3…×!ü×SÛĉˆu é™’}#¢ggïídCP05/ÑY¿Þ°‹ »€:ÖcŠjgÉl¥lÝwo¢ÞXN1g¥ˆBJrY¿ÙŠãUvÏCÊDL˜`|“é ®xFëù“㈌ qK> \»]¸)œ ×étÎ¥”†6ÞØÿùA/ˆkN‡'oWw¼ˆYZ~SùF¶”ùêÚ>'›úy6ÊNùV:±÷x'r¤À¼]ô|0ïÍ\ÑcÐùœá’Ä !I¥¨bª~¹ÕQν\–Úo“pÚÃ2iƒÜ±iBÒÿM|Ìš¼—¹Rù=I6-×væ± ÒºN5ÕŽUÞ4©ÿq–FíéqðüN‹|ª€³Þì /µØ©¿ç~ÿã¯yO³”íF÷w/¤Ä4ä'>VwÛÛË/NrÛ¶ö­sN™Ì0ä¬ïL·äÔ@¢,«®É·ÅÐ%Ȳ*G‰`}rš's²_0Ýß&šßîò3)M6oj•6šð£Ì\Œ ˜3zµxòÍwÉÈ ™ øšÅh6ëcx›I ™ßÏ; Ôš ‚|+÷¥M¼gtæŸPª^ßÇ¿æÙ>"y½•sÝõÓóûuÑvO¯9ˆâßIÑMF7Å!þ¦œŒÙ(«É(‹õ^Áe$^¹úê/aÌG»5gGYÇËä–—z>¿2*éÑú‰:rDrV³Št$“ƒð Ê2¦Ç¦ªžG•¡ôvå.Mdå⸠yýˆÌ»û?‚ì‹ì–ãF!’kȃ ï³Ýˆ¾ÿƒ†dÖ™vèˆÝÀPaÙ3¢)N!€*”-$•©ñ¡$kšƒöËäâbMp6­‡Ëeب0³DK蛌“ª´µ¹ˆÝâ§>c´`pAUCÜ–ÀR.MµVýiõ(÷hÃßÈCdxˆã)>™GCÕÈœøb{C$Y+,šÙ$aúÚ·jÁ Wû೬óm½´ÕM÷ 2¼´uæÅ•3_ƒõ4XT±2ùf™¯º11U‡fÞŸšN;ÑLéïŽ'â^oVÃαÃWQA)ÖB; ™@Ÿ¥^Á: … iæwÒóQÒq1Žk¢½ÌfÍè@ýoZ¤VÛ`K½2€8˜öreŠF7'^à ã+è/ãÕQTkVsÎüUNä†u3£ðÑ3k•êYmvˆVxc6‹ã0ܳA5Á÷:ë_>R"ö6àÃíqÉ×û5m^Ô;™"Å—º3 C’I°ZKn¸2$h°ÌÚùW¥­œ²ÀW{§Ï,¤OH(°fL•:@殩_Ì(šhæ™§Jôœ‡<¼PaáÉ´ÔÿY}~áP›†0 |[‚&ðó1;ˆ:àÝúZÉn`6¤£|òN§ÇÀ:ŠÔe•W`®@S?“ŽP¶ÍËþ{ýöñê­ý¯ÊÉX)Ê#Çe:òtñá%aÉy}ÈÇ›þq ³œã ö>¸(¹„Ä‹ŒÕCô0Ðz‹ƒj 9»S½œÉ/¯°¡ä{ç @–ãì‹}Ðlͪí÷½p¡ [ååpÃPš…‰ÅjS6úæÓ[!èþ /Û]I“U`è†dJh¢ë¦¬ãªˆñù•ÓËlM¦¨}ÏvQ.º(;Ìw[d66BÎ4M•Ø‘‰VøéRÕh¼µ¢},Ñd~d€«äSŠÈ=Üe˜âHÙuJFZ— Ýû]ÙtoÅ·{H“åé2]áÔJ̉$Ù}Ž!˜XÊGš£V‰îÆlÍ4ô3¯â›ý=L¥ülË)Z—`Ù줴:Ùù¯½L`pÑÒ>V  ‰gÄ—jS†º&y|`Íc¢è"Ͷ„í£Tè]¨&[ œD_µ‰Âë9‚„S%þ¦Î@Qu‹³`†ŒiEÔn;'F[å\Tã”ÎÈajZ5ûOÜSž—J]E8ÜE’Œ8†Í„ìÝ­ñp¹Êöǹ•ûç7S®Ç`à›ñìoX•¿±;tÆÚíÜÿ«ªX6KÀx±µ½¡ZÁ3K\D Á¥s;a9âøXKÀSB¾År^â”+é ºõN'3¥ ¢"ñ¨5³ZŸkçÒ àðh|™vCô3ó£Ü«­ê"u§OÆ0Fý‡iþµßp7È|C¦@Û^"íö_ö:+l”TÉÀ‡ºŒð¹În¤äÞÕ5C¸ijCbƒd†íڄ笹øóÝÊ„°qC枀)šUGíp±³+.ùB$–AîB±Ât†}´e|9D$D,e+fȯ^ÊrSÏ$>×”¾È„¶U`u²ÛlÖ½ÁnIH€úŸj,O,-bñM¾Üe(·uC€õ?ņ7ô¶‚ÚåE}P‹˜ˆg•åNÐöCEcùÈTåÝŽŸ¸ÝZu|èjE2 ÝGbÅÅŠ¸K¡bŽØ–".¶»'lÌžolÍ«€i™Èœ®4úkÆûÓä¼1dÃãÆõ#€U©Ã÷×ÇÁ/±8-CzFη]ñnîXRÅ~(›½p?ºD”[4úz1.qmulÀ•âGc†Mj±f¬9ºÄJ‹¿WèA†2AÖ†ÖÇú$4»n…±ýKŠí¯ó¯§;}Ý/O HCpÝÊ"fý sÓY[(⌉¥EÍðX>pÔ|Ь+±ó‰ø’3^ÄS—Ám¤RÄ«ø#\ ¨bÒ"nç¼èy£Vó³³fª®zqþÝ„`#i[Îq}þ¡·Ü™ï u¶µ= š)þè(¬¸<åŠhþ÷+P‹=5™µˆG»´nZH Ä­DÃ}‰··@?Ù3úr¾Ý7Yå6Õˆ wmÀ¹ ÿÈÒ[+ÝS×Ǹ4Øšáâ&–×iòX¸žÂ…ÿÚ |¢k Ê~Q£TØp=~!~—£(åxnmᆠ7§MO)êŽÀ‡S¿Þ(ÚÔ­ü”äTˆG`)ÄÊe©Ý©bâGË6ÙçJø&¹©8õgu"âQ£ãHHC}¹‡ë„¼85¤g×;çÒ,Sæ ½_[ \’ä‰ÚêÏñÙø\.ïcñF.¦Ï`Öøe¤Ý×PÍÄNØ{í¤ÈÍ7‚ ¶UÄNKG±È^Û¬ô"ô|ù ®å<^5WµR­c4£0Û*‘Ã6zÖ*ÇvØø)Òý;舌Q|L@¼ý—„L½ C±eXuxD°•–)TÿÈ«¤#{u‚ÎCVyo¦-Xz§¥d•RgõX«.òõ Xo)ý$¡ãtß3³Ÿæ}ÿãî{…ñU¤Á™ šðŬ**ǵ]¦ž¯õ¯½•bÑã!e9-ü̯˵}z†?W1i¯"„Øòöí|ò™ÆnÍcÝ0ÂK}£VФ9Ò`º?]T²ÞMÀGýØ¢4†ÑÌáÎêá•÷ùvÁ&$pºDâÐB;(¨f¬Õ&(èõ¦Ïo¬vy™}’-‘³ú¿¸üܬÚr³þü”·NŠKÀRwD/ùC‡B3à™]dtŠ^~üòÜ€Ô¬¶±åãZ¯7?qŠ]0o‰&-­W˜WIÞzÞ©ÿÙùSÅ10ÛØËðøh4†- é2¸ãq.¬—OÏ…Lv#[j7z]‡²¬ô;¢'EF‘aýtEX-Õù»-ÁÄ^bO¤åœÃø”g£Æø·, Фg8È#ê-Ê|ÛÉÏ=(ÀVBüù*âz~üÑ{>ÈFRŠÁ¤`»œRYb«¨-µ‰„ŠC °{:÷2‹¡ DöÏF8=Ä“\°ýîLîáþŽŠƒXþü.̉ü÷… Ð'ã­MZ¡48qõŸo œ™*ç€6bÇÂt»Â ý<ö¨´z"É;t_,¿¡Ü (È’¦RX]æ4g-Ô>kšéMÖKáb—ý+Õ|%>×±þÿ6ùü×¹„àu…:*`kâÅ»­?í\­¼¡ÅD¯n÷б [Âtþ5ê~7ÐäÙ*îñj““æ/,kÛÖ·%膙O°µÈ+À?~vU„®gÊe¦‚´=á/`²MÄ,ÑœÖ|ÇÔŽO ÁÄÂêtÚ06¬¯ …–xùË…` â?N—Åøœ†…6Û¾ÝÉIÈ82©_ZÓ>ZSHb—ÅݸšE§#PQOñâ«2çâ?]¦=òpz\R)ˆYÌî­ý­µèì¦Ò|=—ß-Ý·ö‚ÿaÀtjZ)¼hºD{UA×Ä~vß$î4Éa-VMYGwSð–iÌËiÎÅgÛ§*&n_çÍ.@etC¡¿Ð`{W‰ª)1½­ý@0.8"ZëµZ2Ö?´cúÑ9jÓî&Èãê>Œš•UPQ•£¾ÿÅ uæö÷qޏÙWψýç43ý(ƒÚ'¡ä…†rðW¼ )ù ½õޝˆ#Sá¢kK'Bhó`R,j©{Ï·‚¿¼ÿÿT A×Þ|û˜ÛíÂí§À³ÜkµÈ|Q› 5(„ýñï2»˜ló¶ß •Ï9lw×’í&|š] ®WÕ!y,C=Åý” „ÏÜ®žðŠ"±¾eHËN,K$—Píê׎Ƒ„šH’û1ªþ¢ m ÆYeŠg\§–Š_¼rØHƒ‡ÎE"qù|=r»ƒX¸3ÊYïùE[d¼º/3 R…*ùm•H!D¡ª‡—¢î½\‹½/í¨*ê”FúpÜ$×÷ RšÒi´tP-‚d„ªÔÊÙèëj;ê™"z¸"Ïi:]Àú4¹ Lü*Ÿ•µÒ¶sbâ ÏVo½ZÒžA@ÜHDó»UÔÙh_M0x»V‚‰ ]@°q-Ç6FÇW§aL¯™|{HÐ7¡ôœö9¾Øí/¡áèl'¹y+P +Æ‘Z±>`©Ü_ù„¯IßÂ8 ñ† f¾q«*|y!OÍ¥7xÞÛâuSŒ¨™òªa6p1Š2y صònho‘ÔÃÎÔˆüýO2¬lW ÉÜ-¤Èí)~NM|9ïpî¥tr«= ì,¯Bx‚!T„5ö0ÅïtšŠ#Ç÷!aC¼KH]ÞKâ*Ù”ãºÜ€¶Š/@°Ð§)ƒàG0bÈ*ÛàÄ…¹(»‹É#£ñsCükD¸CcÔÎßwÓÙÉ`¬æúâÒP¶ºÙ‰:ŠÞžfœ{ÑžÕUǰuL,Å/þhû­<ä›'p¨¯V¼E¯ íšküfùÆ])%‚ zÝÏŠõ°%ÌŒÌ+ïYgX:þ®O²` Ö}êx:DnêŒels{%®ššû8C¿ï†'„FâåMá0?³‡l÷~?ª} uÿÍØÃâlåçÛ>òCjýÜâccÍ*ÿ=Yãå%}7¦•eN·¿¼Á4X¤«3š•¨F;ž&nU7?çƒ.@tƒÂb±V™- L1£â1\É%ƒSBð¡°O»Ž é$Çôc’½>Á±#$¨·Ü6Jè ­p¹´ Àæ\F6ÌÆÖdfË”*š?åÆƒCôôëâ^ý÷[-ا™¸n¥Â¹5¬µ_ÇŒ[cÄ3/:Œ…y—¥÷I[¼½V;Ì´¿Å\5ôTnz&Ÿ¡£Âžä·œ2‚±Šýº/W£Á7³°»r˜i†"òfKý์9,˜ D†ÿM‡¿ý{‡Æ|Š3D°êLeYýýt”É™c‹O9”k‰N”Ù¨·f‹"¦ÖeœÉ¿ ã^´›gB¥Ô'L–w6*œ²£3Ð ôõs§ÑH¡:¢Š %Ç:Ü¡`]M“ÈD×P=¾+7F?¾¹äâ9ǧ %ªµÌ)“º|Þ%ëdô¯é2dŠŠHêý9̼FÜï´Ê†4zjí?Mª)Ä_¸§EšU²Ü"Žð—:ÐD쵯«óØ:\îkU7ý¯‚Fø¯B0ÃÎrú0-x÷!‡6,EêåÌSõp§7í¸v‘¤‘LÀ°si-P…ýÜ,Þv³-L%¡Â9¬„jô48·€Ä ®¨Qß¿Á]‘wg$œžm“ÉkÞ…RW¶Í’nZAOÑ?·ÉíëÁ!«Ð fûkö§6_O,1.áÜ~#ÄÄÞãæòb­HX_™ÿ’Rr(“J)ëjöÖìvú!­–ûŒ)ë¿=QÕÂÁ1 E`.%Qpm!p¡zp¾ÔÒ ©hE™ü‚|†Ü„ÉÈþ9‘rW˜+áÏlØÀ¸Õ‚ë„éïgûϽïVøÑ®½Î"Í·%83ôê¤V¬/¿Iu­³À:;ox« ²P5ûnm†ïä%F'ö)Vç£Ôdۺ܄܂¹¨)£¨7FöæÆÐ ¿ÒÏØ. }rüHájÅ6Wéï® ðÔËÂŽX.NoE¬¹èçÎ?¬æÓ s^ý)¾BÔ³b‡®`ØÁªÄ‡:<æË†Õp÷ãÎŽvèyŽ祄…¿vÍh§ãŠç} sìydÚ n“Iº0«‘ü½øbäµÁøg {þðí þÁù¬·ON* wãâéËôêmà£ðž¯yÄr²Š5CÛ#à½ò(jÌ`'ªTÞ;/^ÑÏÉWÁ‹|V÷kþ‘­eŠé<†Æ¼]ÞW¹¸ ½ÜÒ-Ãî±Ðè’W5Íñäè¬èYne8Šû`À·ùù³Mø |{<‘LÃòZ °Dæ0=´Û”åð'í2;™æI'‰[#íA2Ë®÷[ú|fóúﹿ[»oß½wœ`ý)¯Y¨–í¾·Yÿ4º$Dpue$â€ÁyÇëè>^8v(>Ù ]è$1|ãµ/£á I)ñgqÙž’}Î× ûÊãèð’"Ï"c3642|Æ­\ì°œ zÚÖZA”à×exTy#íF/Ʋçûº¸UF(-Ì ðg®<%tˆçc÷TBö‚*k!¸Ò‚¼°‚É)G¼ï·RQlý3­Lð0ÛëÐsá 8NXÏŽ†t•ÉðN°š@ȳØ$xÈõ³:„nHî¸%}¹½¥PF-˜H“\©Û?JħFÅr4°fù¢:K|ƃ+®Ë¤¿lìÕ)oðWÊy›Õ=”t —û“ú¯ÅÀî½ínˆüÞ·Õßüˆe Š4þ¿‘xY°JHùIŸîÎh%JåçŸd¦\„£oW¹Òë7ÉAI׺˰哟*GçÑN;s fïêÂàÞöšÔ•Pãø-)IªÀßýùDÖ€tíØÏúˆ‡ý~ˆG8°ël 4Uè·­Íšw˜u¯Z1ÿr˯A„”Ó¬œSœá#O1I’-ý]61󷡦jc#ûL·òŒŠh÷w<¥+;l÷ î‹ø‡$©mú1¥¿Á$†G@aŒüȼ­‡â»­²Æ1P"³ËaÉH§ï†¤˜m3»\Iÿ}Fª.*Íg4°©æàªØ2öø°Äp´gÏ‘ bÖ‰™9öÀÃ.Y£)úöH1¡ºƒ±—>㤆Â`#~aƒ!jrÎEœFSö÷}¤cñ;™ØUà 'í”°Ùƒ: 9ðD;¢Oµ¨¶)üÇ\çæÿ_§núèÃ9jJ.;ã‹>MËžzèuFRM`¤lŠìÔÌ'\:^ ZˆþQ—;L Éí¥¦ô°`}iÿ6éeduÇKòß^#Q6ÀDM¾‡Ò°½ÿ³smà }€-y¬ßm’•ÁìA*òÈŠ¾† FÉ8ĘÒÝ÷sˆ=oEsÐn98J'òæYŒ£æýÆ6KI`Õ×AsKu:Ö™Õ„vÆ+Ÿ+yF’Ï:lĪz7Ínìžß£±A– pw?ìÚ[VhËu³¦ä…Ke3P>é´ì+}rvª?" ÃGp¼~Pu-©JØ*^´»Ašþ&e¦vGäÊ|÷w»û¬í [:¿@γr;Oª£¢„óÔÛ.”ÕDpî.€êŸz~ó~êÊË`ñhý%ÌŸ4¢‡—úzQ¦Ò¥ð`:ð”—Šð+>`d¼óòF\IªX™;–«±ˆ+Ê·x‰„ϤÒ1štÕ$ó-Ë|Ê“¥ÏûÜRñßGísÑö&²V<»Qxõ-Ç=¹,’áõ 5ÿmÔðÕ—:bmFŸ³ù9pÆE%tðºJeT3䊯P}þþ]‹gË€“&OtH˜ä@NXx®R†!nfuè™:Xå\Nt¿ !4Xد]d¸•ðÀ2 õ§oØÛø­`¹TþXªNB;D¯ÐEù¦±à…KEÔ?@ªXÖ^M5¨½·:ÎBX§Báÿ¤Õ«åඉðó /!•béFüí3¤z04& H7>)ŒÏM£ÏaòüŽ—~ +ó È•Z/̪›'¨—*ö }Bz!Jb®yBa?4MyðD=ZòhC§C\Î%©F~çAÌ1™±¹&{jƒ ‘Ž6Ëâη,KNèS”Ü›¤&èoðsþ6Pœ;r×P@ßn1ðSZúe/1?©?&9\x ^ßÌ3¾á„ûlK ©>œúÁÜqÛúó0¤êæiÿ¡Ãú³­w8öŸ|A¦s•”ÏQ!Ö$õLµØå“« ½¨F ,²åKEZ„‹A—ú×5‚]Xn×…g ÿï'{Ü“ Hb?ûóñLÒ2ÕBçp]N„Õ¬±IúŒ8ì§¡UUw) ? w Õ¨í€›Ðýî\@ÜùaT-òïÎóf~†N2É)hŽ™‚Ns´ñkÈΞáÜ¡Ú ªËÂüNAgéðúáBšM÷rrVEB‘}=Ù4tÛŠ€úÚõÏÒ –.#Ìùc°`Ó-Ýí>ˆÞð2•¬np®DœM6qø:vk8è¸ÿ"’ð{ü F ÛVÕ>¸³s¡9˜8ÄÝ.Ô¬ˆ>+µï›ÂÛ峺üZOi©ŠÞ“g9Þ¢~ÉF$®Ѻ€eâ"¾ðŸe~´ƒ,ÊŽÛó›’½³÷‰á(s“BÕº1×Þö-w ê=Œ‰aÏ‹Ea‘#}J«H6g°¯Ú¾bµf8‡y¦6xêû)ú3Þ„ÿ OYßOÁP>XH‹¬xµ%w¬!/˜ä?nÀà«|Ò]j¡7îbÌMÇKÑ úµ™3JÆE¦É/Òwýó?X~O1¬'üPàwgñùVJ¾ãɆöp¯e Ë ¶›ÈýJ~0˜ò~=èâsÓËÃ^œk î ±ã:ã­Cɺø xOX}cpffJtN!M È­Å bØ>”SYŒþÊÜc’_ ç]6?n¨ÓîYpmN6HˆáM}t8o–l~æ§ sO^¬§· "úpÖª"J˜Áü^Øi!gß–_˜ÿNÉOÉ"•‚­jm/ jÐȲD¼-2ôÑ H’$ê`›µ>êzß›‘EØM2OŽÔt©ŒbzÙ¦À-¬mí`®Òß§á£*2”t»Ø~'°Bm\F‡õ9óÞîþkjäÉè’FáJ4’C·P ÈøF)òôωà£áÖzÙ0cu¨™‘?)ê˜Pª>`Q®Û~îð¹ªNaùnc¼•«ˆçªIy=˜µ¸*ˆý¿Tmº•=F¨"#ü8qŸ Xôºœsj‚*Öû–øßª`¨Ç[ñàƒ/// ˆeô|˜`€ÞIz†Ò.´0>Û÷ò5ÇdøN¶§‰kºÓ©þk&õ°wøe5í>H®Níp3+ )Gf$†â¯] x›Å³U²tþBcÌóý=ùå׆°]`‰kÕÌ&!sÖcÉŠÒ  ¬4N¼§FôdÆÙˆg•‰4{òëñä=ùARq+¶8[è"¹âÄñ_•ìÔ òZøœP¢ÓNRÚêgæ} ¦¥Â†jð›$y·Y€™ûi¬Ýj æ$ä aq¦4.$+¼|\¥Ôÿ_¥CŒrÓ5°}>qAòºòñ–¨®œ×£ëxbowœËœ1å+•hâ6þ¿e€è䥡DŒ©¹²{i(‡·`çjA1WFxWGSRë@-ËuûÝBQ[VÇÿŠD!q %w]rf'xrK^¥aåÜXÛÁ(rñ &¾É­¡R~ŸÃ§j§W£üÒ¼Oö ì}ù¨+ ¥ÐÆÝåyéèÔöÕ|÷éY¤Ø‘RNîÄD‰ü¸ªl€éi)¿ÄçÊÿò¡\ze¤ýÒ$\oqÁõ(”ùÀÖ'äÿZë­Ei¸Ehhû·i‹0Æ¥—b5š°qÄ*yíá®Äøý¦è%™Z¤(–ho=ô"!cßüØæ£`ˆ%+5ò‰.Ê•à%j×E³2Nç^–€I£s¤ëZ{ý ¿» îÐQµð¦~hcÁp¼¤šdõÎx®Cœ=ª”¡Üç\DD>M‡î|C"Lu•KP»¹•ÜÞD¶˜q;Ö¸UÀ< ÑjcW¸ëýï} ‚¥”³¬Î™U¼¿k˜úqƒ_AÙt½ó¾ýêdÑäÖâ=»®c™ÅÈ:!–¬Vd`³°xQ¡zãÛÓRÏÔ¯„»œO1R¶¶æ3Õ¬ G¿Wññö¶²x¨_4;3ü2Ò—>#D#·æù}½8ª¯ ¯zÖÃåI¼ª3áòx¬ª@ÞÿYÖUšòÛïˆ}¥am¶®±éú —ÑC§ï£‚§ ›u(Y8²ø5ÖŠr¦E·øÿqz7\çƒ÷ Û!› '%¼^˜¡ûÖÌ[èmH‹ž‡5ÝÇÏ5ðØ^’7çÑ-#ÆNãdN`S·OøQ^âÎÒì´2lä2‚HöÃËí°¥µˆ®Oû+»í–õªÁ„Õ¢”cM™¨¦„åwlŽNL„1MÒÕ–M3ÂOù¯Æ4Âêúu*X—¹3I÷óîEký£9Åâ¤m³†ytuwb„}[þz´tå=sÍ‘–¥9ú‡47ô½®úEF…©Ê¡xEvó:³©Ð}–‰ŸUŸw6Ñx!¦åG¦É µË%c5ã/²| ޼nZöÕ–hŽ,9¸@îË™P@P™CtŸúA:¶ôm0ÞšºÇsÔz’KQ}±¶[Sšß‘wèf: ÞH`a÷N8,ü7¼ÔÏ «¶omŧd® ÅÁaP‰"2i.×,Ô’ÐG™Òt•¸ÀröÇœ•q{tÓ௫ºWF‡L´€œ¬V€"âÍ‚ŸAY "–·|) ÕìÈÙWÔZ¶ ³û;µ0™éNoÈÑÙ0;ójhm¯ëWl’(ñàapÃövuaƒ^PÌ3ÁÎEžÀÕé婳½öË P½å{½PC>ÞÈ! Rᢽ¿ïcU~>q53cÛÐäôxwb¹K >q¬5‹ßzvÍÖˆ:lu…!Ž!µ‚ cW5žqÞÙ½ëàAiZ"»a­ë÷™@gÏhþõÎv9Íòö`Àþ«k”è@â¨Sžà9/Á aµcz}“³Ljiá¤Ûâßñ<ýT€7‹C¢Î¿€bw^2öáœ]±#GuÒ”g¡¼/DT쫦sâ²ÔôÈ~rÀ-š…Ù¨¿£³göÖZ³Zæyþ:ïii¨2µ]Õ¯¥{ 8Û{P¸ên q*ßÜÀÇ$ð«)”ˆ.¢~“ùCõÍŸ dÙ  5 ì­i)öG#¾œYY­öµxjóÞù0á IÜúç6ÑÔŸŸÕÎOtäL΄)Ø+GéM±s²« XÎ4bÓ’ýr÷»ÞXSéèíPHûJÝÚùªÎÑ0ˆ¼°¨®O¼ ,`3þ:Ö—#w*ö ÅìWÞ”ìýù¶ÉG˜ÿ'|*ɘ­½Å ï8šcõ£“ØùQLà±Zè+0¡ÉÙ«z,p’’aÐ}vÆBŒŽå÷×Ä¥¤šË÷Üœ¢C9$VÊЬ¡@Zàm"´úŠ•~C~çh#â½f«oÔ4íÈ[´×ÊÚTeR1üŠná'Œ Õ§ÐòvUÚhŠ?úå¶ö?¹ º3ˆëð~ϪŒ}¥ÄØV‡çît+­ôË« XwÁŽ{¹1£À¯%£%9YŒ4? 8vg‰ðœèd9æ´qqæ@ƒX’ ážX&‰s9GÞ;G=E7ÞÔsÓî~A²n„ÛøU½ùМ쓄•¹lBõpk.g:(QÕ5ë!Ûó {x’XÉ~"ëíÚÂ>òòvª<ØÇcu…[bž>´Õ{ZÔÒTÜù‹&爀ÿ‰"ÍBxBR?Ô’ˆáèG2¢„D3=´Ò]€K ·´UHÍ|R£†£)š?¥ºƒþ^N›Q—«uQ¡"¶Ì"6Ïc“…Ëþéq”/­Z¡ùó"Í\&îÚJ0”z6ädG0ƒr…É!.ã”$“@«9¤\«*¼–½:£{ÜCdòí¬mºÒþí]¡üo 5?LÀÙ`Pй1’aBš›$v[ø5ãàÌMÆ3æÛàÜNá½þ ìۜװÚ9¡Õ˜ÛrêÍL[ý÷ùP ^+óÝ¿‹>ÍÅz&=çüƒ>È_3°= ã7~ù{n&×¥†Z‰!ÎÓ³Ö, ;N·Š¨Hn ÆÛ1bp£  …-.G‹š.wù¡ç<ÑéL†1áVø*®t\òù²¢£iÝkøÑ3ƒlæd÷½xOé?®Ä.EJY:{µÒóÖüß'ÏAÂÈb=©>],ò:b¸‰ôwŠra°a3:̈ˆ^ÕE@¿èÿŽÄ£t ÿÈ‚%yû#_/öÌñe7ÊPµ±è¤Þn¡ôktzõ|é ‘Ïd7!zaóÙîŠ`r†ü*ûV'*žÚíUïNyË(IÄÁU6•¥:§’%,AfT­³€Ô’@B/úñM7[« ¤âôKnÖÚ‡ý|ÂeèQتj-÷³Ñ¨ÝD«AàJæ5@S6MÇ ‚ø5¤à|]öNÃÍó^Ë Tsº*xÙIz;ŒÁ+á‘ÆrEÈý»‚ƒ ”øY¤(}$¸ 9G<*vh—%ÇH¹coa P•É¿RË-ˆ Üɧå`¹s.[Y•ìÛ¯¼:pË–Xñ¯GÔ)Q$ m—škÙû•› ³Ñ_ü5úŠU]ƒËé¨9"»Þæ}!:¨œÿr¥Ž+ý,l¾/]‚t Ù€7f!êc¶òF¯úÞbîËKqߨâýgá±?J÷I¿w‘rÄÃjuY©k#~5Èû¼™Œ¢’ÛÔ5ì­û¨È@Žã´éf«ÓÞjE,Á7ÔÉ,e"œè'ÈÞDþ3`À"Õ¼9–Ux¼Y5K§(1"wTÁB#w- v}î¥ÙÙæ^Å ‚ú)ôìŸ.ÅÝ1fæ ãªñ$/­»ª;ƒÀf6®î霴ª¢‘É™jÔ´˜¿4±0 Hðó (joÏÛ‚ a$ñXŽ*‚Ê#Å—–¶íÔøéF’U-<CˆSÑÛ‘m‘JÎøûЩwŠLî` Åv,æù§œÎE©‘¦•¤Óîâï‰úEG@„kë×’vþCÍ@T•ÚÈåVŒQoùn|¡…p´¸û£ #EÒ7ÛÖ<·Ú¸ªÝMdoúK³UjmT鉦’`aaH¦‰œ]½Š¼Né©Î#"–ˆ¾¹½¼æÚâƒPü$ÒNb®&Lê~MTŠu᱄ǫÛg@Nq)ö©9 Þ­>礢ÁçaÀAÇáòQŽ^%ô4|HΚjEì!D‚±;1‡:áaaéž^•I”wBCô$§´AøF,çó’ý˜š|ñ‚?Ô/˜‘›Eæ™^ Rd…ú‚Yü@Çæ¿9|rPLçG‹u'Ìnhh®˜ çz·¼™VE¨?W + k=XÕoåc>7g/Xô1Cª[Ä™rU¯ËcºÃeáËE¸~e™›bßÌ$‘M”Îò™P vð‡‘/¯zwséË)c¥`:ƒÀNúxô¡KÇ®¬eªÌLµ–0I îª!…Vå¡Z/¡Ý8Ÿ;­W&'¶Å~ý«õéÈ‚÷Š:vÖoèÝ¡_-+z²Ð†û9ðK)NZ%]OçkÔ›¸ÞJUR'p;‰¦˜¨âë°ÅЫ¼¦mü:ÜKmi‚üã©ÐÑ5:1TæùÇëc~Dn}%ã¶ *õê’âxë,#_».¾7l_®ê7`}ÀR–¨¯ÞÈžbkÄ×V×™N8ÊVW8¨ùâØ©³l¤×;:a­swšÍ~ :ŠnÃ[7•,áL… x"„Š›‹hÙ§ÝÆèàÉ)ßùìެ̪¹¯ÝïeTL:á{°,âË3 å7÷×ÖQƒ vzi#Ýëq¹Ü­œ¤-©öþ·ïÇ»Xfú+j/9‹3åõÛ4~H¶§V©&D‹AKdgüHÀÝ‚ÛÒ‰w?qÙÔ0˜>E*,¨6ã…Ø0(–ì–®4ÿ§>Db°…$øgÿ…˜ oN“Ù×NÍXÝ:ò‹„'D¿"‹£HµØ÷)"s¯-¬"¡ºúŽÃZMÎÙ¦64ɬâ¢>'q¤'¿ÍªeŽJ™2‹éKîkKÔÔ_èsK˜®]ÅÖXÊ—ãÅô’öõŒŒ:°&½ÃùöOÆah`j32&wÁÿÉá¤'Åjϵ~ ãÏK¢ÜCüxcSÙ›¹w²}}ú¸7×ÿ/?"ŽƒÿSy¥¯7æøL¸g§á ``´¢–%ùßZ)í ßÎ14ò†š9)©ñ–<~Ÿ‡‚õ€bÊ÷žô¿Ú{wAÂ+~}Sól O"†Y\Êø$¯Ñ!h_ã¯Ñ¡–_uû‹çøÔÌ(ʳٿì©S7¼!Õa’Òbës¶ÁYiaý\†…z­N ‘ßaœœŒÆÔþ´®eµ#ÿLåêGgÅ+Ø/pœHùÛ‹e¶c¢1ár¶<ɱÍc"š”µ{gW÷CTm¡Õ3—t|Óî¤FÓÓ$ž ,«që [+ŒCíh‚%÷`>ÐõÜŠ–R—±;Ò¤ˆ%˜Þ¾ÑÀs© ŠÎ…ÔG­u$€„ÛjÔt»­$2ÄpS/Aº²xt[BîSêRý‘;3Mœ~ë·BõQ­(¶Ÿß¾"ömfóÚC7—2¶SÅÔß‘º(LûVŠRæ-M„ºÓÍæ/ýqÞ%ê-ܶXñÛ«Øp}Î!ÞߘE0!Ý.% u娬Hôyª§€ü–i£Ö eæø‚@5D0õQ„ÚŽË{A—>öï@h #(óM'ŸÆ1%ãVSÅOqä™ 1ðjP0ejÈ6ª{>7®û&ì§ÖïèNëw½ìÊ3]ÀƒqùÓ)#„®òA•þì‡FãÊ¢@¾íUM1–ê}ä Ë(·–mŒ¢nàó›%ÔΦh´ô«Ü± nk*-îÅÑu$êç3 µÁéþí,Úµã9oSU…_à!Óqmï-R=RÕÔZV®@©P<òqN„0z×N!'ãhÂbO"chíÉ@–®8ÔÓ G1KD—Z?Ô†®ùPU/'Pñ­A¢ìsbܧ ¢0ÒîÀZ¥¨ÅS‹Ž8bÞl;|uÇJ™£°×ƒÚŒYº¤Ê®k]êƒ}Ï`Ù|Ëå :œ%}žòü*ʙȀ:¦|’ü»›é?c‹ãtÔñ‘†ç|º—rw’›Ì´áù!"pÉ}ˆ)ÐãW4ðj5›zõ•àý&œ˜æÔ‚XôúìA¹Û^ÝÓ *.Ç¡óVƒ¢"s•׆S»BHQQ?øöõ@íZ  ·y…ÆŠOÂkä<ï)Ń<ñ²2]u!ý‡qA³-dºÞ²[Áú.âLäµm"qâ„Ô·J|‰}˜B={fT¬ÝžT-Ä·< §–8ÛÕȽoMØÂÁógœV»iTþòöbyø{øv_ ¥¼êYœŸØ—ju‚þQŠ›¯z gXg=hF³io‘ 3sMâk ZŠ¿£z;9HOÌ5±—¢ _ÎÍÀ› …Ê×f"†D‚ÐãC˜ ™g6°ÖXÐg¬5ðO¡IךÜ/vN¶“¢ÚêH.AˆÈ™cø>ËL¶AúÃi ´ZÛ¥"Š)ddÓ[[c+kÿÏ þh Ñ×Q{t€¼.¢×Š—Ÿ¾7P(¤Ù§¹µr)Ÿ“YX`–æcoÁÊäA•D'–ìv¯­Ðõo‹óDÏ dWì}ÇD&åP‰êÙbË4·G)U`’ DN{Ø_ï ™»\ËF®ïèôÐô)‚¸Ù̺šFÞøóâi-•‘ •8]GGô(úÕa5“òZ&³çúìèôÞ¥ZÀôO3=q^âÄÈ}O¾ðZéVÚgÔŒš¤¼3<ìIë³Y¬&se›!°+Q< ¿FÑd”äzh¢âlžs4•Â`ÄønÕ¡³A²©]÷¿^É®:ïôlñ„Òœ ^¢ôñ% óg•Å·Ç`¬17âléÀËþHD9aÞò¹¯#|Kq#ÈÞÁï±½NKÛ(‰ýoÁ:=|±pÁÔÙh†+Ar;¤õ. *Ùcmpúä—l®"þÁ·ôQ‡©\£yKÚH²,3¯¤î>舯Hqð'ºZ!·ñäçxÃnº-`Þµe¸Ùú«/fymØ„~èR2‰þ>QG›ìøcpc'Åœ4DŠ·¦‘}tIoJÏùÌ«§F„Õšº¥½?¦²š•ÿ½ 9%á¿ã5–ðÛÑžl,1z`%,›Ü_À§Œãç~ØYp–\Á/­püÔ]ªïo’;âi=@Î,ï—Szßì€é…ó–LÅ-Oü>s$‡÷»?a„Õ‡dn¦È› ˆ€ñ8SOtáýh2¹9¸¢¼ÅaLÙ*Þ—}x™—f¦™wãš7bì?Ôz3SÍbrH0÷C„UYJBaÔ‚•KSÎ(39È Þ‹æý}ÐY»K¯³mR¹\.¼a-©éàVàÁÆR°ÕbˆÝuÙûÈ|þéÔGAÿÅ·í².b/ˆÍ¬]i[9ÄŽbö‰ˆ²AÖ4z{\°y™›ÞœÈÒà¸*€¬ ®Ͼ›’:‚×Ý]¦Ìƒí|9 >ŽHí*"_ :¾è’q0làÒòF3™?æ5÷ç áßý©¶–¡5.=ë R¡€}°9½å$Êà¼m{§ ÐêB x±¿ÀƒàúwöRsssÑrjµHï1.6ì†ìØ¢¦»VlŽ[/5%q¶øfMAAV­ðy1QÅÝ™ÛC[ímò‚ÖÈþQaá @5¾Ñ×™;‘Y°îÔÉ{Ä“é8èXvhÈ(²Õ€_28ý0äi7Ã@×^ ^{ï¼¹òŽœTèµÍEù(z¿Aå¶öÕ#N`u­@µ¶#ís(|ˆÓGôh‹Æ$ÕËÅ<È^ñ=Ç#—û“Gß> hqÆ‘4µAKo¶:\,`BxúdJ ú=cÛ…•V+å2Ò'§x¹qË‹6hgœ·n±ó­Ê߈¨’¾h¤ýDÌ-z|ò1Í99º2%×8,ý;›áøø¿ý¾w=‰KÞ©À°æ÷TûÚ.ü¦® n{³D´^Ä}‘±½‹šÞ¥€<‚ì1€ žù€ÆoýÏëmÈÈϽ4æìH ò:Ðܸ‚a„*ƨˆáÉláͶ¥:ÖS¯2¹€>ÅN4ÔX I¤‹(—au±W4±–U+õŽ‚n¾ªóü(rÒ>°±ûúŸÙg“øÍ+ó‚Ìô5ÇÞîMóDb’\uéPÇÆßâa±O«*Š؆l¦­³¦Fô#í¿_˺SN#ŒQº9ÕyOºF/,ß2}© uä•ríK‰±T]£k°U d7MŠÅmÔÅÚ•ïë\³H&qu$Ký“Ð.˜ø!òЦK?hMÒAÇÚlס³Òèr€ÒëâsKÀ¹ôîL µãh"AÔf¿òäBÃÅ<ŒÀ窟Mbí’•‡Ö cèòòg2xGk/volrèɧ>ø„Žãörauîrƒ•.‰5óË¸ØÆ,Ûv³4b£áXϾ˜êËzñÔÂU~›îùO‡.B^*sûöŽùäz³‚aàŒÉwqbq4œ¼t…DHK#‰tO³œWÚU3"|ü’ZN‘êœD ä86LÇd ðuOÂ_%îLÇÞ¤nD¢H‘s#Æú™Ý«¾›F‡ò Ÿ$Bo¦ ¾;Á#øXÀºˆ–÷§G.³O•pï §®¼R:±òùw-Œö¨óš/Þ25–>}—h{Le=øØ§üj»,P=g­Ï¤y‰?NšØóe\„Ì\BCE‡Cޏ^°ê[ËÃM°u…ál è™™ïk+¯dD¦b‰†³û‡Ãš;ŽF­°$‚Á}:š³- 1Ÿs9©ÔºÓÀ'~Ö`¬ß [D§oJ]Gg?úµ5æ1Œ+8­ 8pžKóÎîth+ÅOÀt¯“bu2s¸0Â& @±GNÒÛ¶²–ªÃ#R3¬¿ûÚŸ9±…(Œ›æóñ-pòGp È!ê=óOChÂÀ‚§Cï„ó ê×úÔeÇý¶OG…)øæHl=ÀN*CjÌx&ZîñNøækäeŠÛ}ˆ áÒ2Ü-Ù# ,+œÊ:Úcª¸~|Ë;rPdúœJŒò ˜‡™~ñƒ™+ŽH4Z Â` ê± .×÷Êt¶n6­ «B,Ðï½Nǘ»bUgÈÍôÿT@Åwä¥'ZGg:ªïÊ Á ç^"bh`$XBÓ‡•ƒA÷|§ŠÅÙÿec’&ç^ ÈX 蓇o´S•§¤·I–†ë‚¿]‹+0;Ý×¢¢ÝÖPÏ­> «Š4)›‚œïΗ†ô›ÒæoaûìÖ¾AõHÊôòˆ Œ^×OÄWà© À(›7o¢/Ðf–‚²&’I‘ó¨#Z•úÍñ[•µDÁ¼:OFwÄØEÿc›æ¦,ÿu¢¶l¨V,_YiF"¬ó âàåÏ*yÂ}å©Yl;6M½“99÷o .)뺺nEïèÉØr›v§äô“IápäÍX€çd‡€FÅT‘ Þ!•NkÙ¼Š}¡«+‹0×p8×¹ùìð™MŒÊFnÒŒÏQŒçí×D啵×ßLçºñÎïH‚ÝõÚÝ’8‡æŽ0ø»ê¯M¶6ƒH!ô#Óùy€ã2ÂÄ&1oÔ–¬Ê¹8C5YTãè }.=a•`áú À¦Œ(è?gDDdyNç#H”þÍ"k«Ï›ŠB7±Ò:¶†ó± M8˜Hg±«G9x—¦3ù«MÁPªf}½Ä›Í®Ÿ°ëðÅž®ùžkÝ© ³æž¿2i&8óX  )­nstg¾Æ‡bœhY] )»\£‰g)j}ÎÙguš6ü?ûâ:`Úq\_*¯Yi{£±,‰b€ê‹8ÑC‰Ï«³~Œn¤.j ]pUÉhV xÁ²ÓWǽ´&‡o³È)29¼}~ZÞðíÒªíÜ a¸Ïh#ÌlFìº÷ÏsŒ;ç÷ã&KÓ ¹¢a8h¡î7Õ&¿G½ óP× w$2¸3û†v ¯‰]‘®{çvZ˜?š¦(†Ø§¢-­ð¹Õ’°Å¤ŒcKþ¬0ÆBzrõuËzhÄÉC‚²‚×[žäl³NA€çÚ@×mþ ?nUŒŸð•€Ý<&™æE×ÜZW[ø1B§øðXÓÁ•JØTäšÀ»%Pܰ~<²›é9 ·Óþ¥‘Ýf;o/^ñ_^_Ñ0e8܃Pçt³PWÎäKvÜG%Mk‡S:QˆÔXózR$±„—Ð'÷âùÕŠè%ÇgÙœ°+ô0GTzCnLÀM™  äa¨=Pk9Í;¸BЃ>&¥¶ó?6ªÆ`1)Žónü=ð?-|­ùHH4”±þ3\ßN´Fzr>Ú—Œg­åfj²¥8ñ&«Ö€^Æ3]U¯å¯ ñ°ïÜÂå:r¡ sõ2±Òn€Žiè3ÓøˆÏ¦ì¤)]+Æ–¸ ;zÓ;ÑÖ€«s½Ñ¸iqÿ£w0½ëZ(¼@§òbü,ôí´´²W%þ\íHðÒJ-‡„ a휲 s¬û·.¬P]bnÙ $æò¹™;üžôd9v8lŒ5#}¤¦ˆû´Í~7œdS&K¼ŸÌµ-~ 0$šŸCá;_*xøÒ[ y$¹¹@1è_µGà]cwLfÒ ó¨>%œê––W€ðJRZŸ‚i‡ó¾%Ƕ&㕇hkl|¯˜•ET!§»ŽÎ+üHGìÆÊ]aoý o É›d h& ìc¹f´¥ÐˆÈj;4A"»í®TUŸ¤Vú%B|dâŽÄ²BÆš!5>SZ¨ð{ìm¥ãKR¾×^ÕºW5k çfÉ»àeÎЊÄرSkx…UìXçó¹p˜TЇª2÷'ÌNënQ+„˜6Ê(CÅ­Pz»oÙ“QšëÖ )4hS¯ä6Cþq—‹µ]¸³àØç¬‡ ùÌ{`}kÜÔ{ïQ$èßp·,!ˆ.<‹5ˆ—äË3ÏÊT-­‚•ò{å,Cå5…î{Íie[½ó¯fJ¸‡.²"hÞ/¦iôA)zG¤‡–(zjÀk®¬°\¬‘ed/^–'¥D•Fë HŸHëi¿:nÉ£‘Æ»@~ôéJï•R9çÎp©Å#¼äÆ~ scÔ WÙÀÇB‘Do÷…Cmze¾r·XµF€.a©Û\x ¶üÖW«u¤pÅ?GUNnÈsxá`=¥´Ÿ”™{ÒüDâ¨l0„WªÉ H¯±„CémBÆ£™ã@Æ®‘À±¼;≠E'âqŸ¸×zÜÙ êOèáÙWLü¥“¤5x‚v,iºf¢æÊé2“$$jUpH X†b’t<+¸Óˆ0‚ã¸|“%뛯úé6"šÓb¸¡cäjûÇxýDµBuÜÑ«¨bá9Q\,ŸÈDŸÝ(pz‚´Í†Fe©ðzŒSM;õz,‰{³I@F9÷“ÈñlÕô‘ŒÅòGCÄjy_s¯>ö6`¨á N›_§âÞhoÐã>ò(`hëgHfŠþÈð©hîÀ¸žÂ)„ý¸­r[fìQmK–ÿMh2ίmôEl£™…Q—R§FÜK dõ–9àÍÕNÌ}_¼…ö*8rÆoð?$€Â‘΀äFdžœXM50>£ïAZÚdÇtøÊ](~ „0æÜdk?ÆÍÕ‰>÷ñY©é,>çRjWôGªåÕóª¦ÒYFE…€ñû†fê;_Â}G†qVOv!HK1é·òdáð1ÃÔeêG9(­èõž¸¹Ö—;µâ[šWÑrÙ®–>·G›3ƒQço/íé,ã—­P 2ØÕCi =üï‘ÅNRÃøt_'sò0DT1<.y3¹h?’«Ø®š¦MšD}üõF™ÔónnŽ¿/ ©q¤fK3v.Z= `šuvEJqîr”¬»Ûóè È16'¤çÜ4 ©&6kvõ'öC÷ ÌG'uÛö1zìDIEÕÀàH‡}$Ú•¹*8- vöÔ´¤Ói¼ðú–îׂ8)ú·¹lD‹1r]š <š Cö3ÓÀ"2DÔÕÍÉM/^>ñ4¾£ËÇdoyÕ‹Jº¤’áI’#BÊ3›ÏFÇn€Þ$¡KÂÎ0¼ ú´<ÅÁâ‚3‚z³ÉN€y¾x¨” )RìNA) ÿ]MC‰U´2ˆ†±µë†n[½~xäÖ -´ôæAô¥$Ìè¨`ÅQ¬+ò|€)ÁÂøôª­óØS/ žèYÅQ­uetTä¤Ú| @‰\ÒÍh ϧ¹}mž´A écý@»¨ÖûììßCyfÚ®í”(Yÿäì¦c×f²_&ø½0caŠg[í¤IÇÇa&ly+EÈÈÃä(H /ö; Fv&X>¿/J#Žwiôqû&õ–Á¶P¦t‘HïÆ£Ë?„×sê*ýݘ¶{ŠšÐŽæ3õªdQ° ¦Ôù"ó9}rÔ9Ñ-ÕæRà6¡nW$v·´íñâZHEFUšáqp‚ž®–&K^˜)L[1Î+ŸoU”–Ã6yº_dœU®‡-èl‰"ê@t!Ìy‘°E:¼BwÏ¡­œ`§ÑcmÉMcWû3Œ$+Ð)E0ÔßS™«Z™ ¿îÏß^³¸…Y˜ÅŒÌŽÓ–…¿Ã©q,ºô!Ê.ò²J·,†Ží éë˜Éâý‚õ…•ØmØ/éeê‘%¼6ä#Ë-&O‚Uƒ–4DæyÝWTÊßÞ»#ž— 0ŸcJ#YMÉ„J7}±€‚…ˆuFÎnV2Ó§ßÖR×$û-»t>òªêJ5gV}ñ)þ}C¬Žl«èö Ig7Ôª.è>æ+tÿå*…ʇmàƒ"˜LÍÜ\S+Ÿ5zØJí tT”—6“®RuùùÞ$—së•Üs/ÁHñDëïežz™ÔWؼ۸`š€°”~šO™î©>Y9 †IØ:°¬íf2;6.׬¶O€àø<Ɖϔ \Ý‹ŽbÙ™Þ_™°Xxõ?#3U2Cif™}*G#[ZÉ€+߀`Zç¬òH]?@=Íš¤–¯á‚W¬„rX5˜ºŽÔ*”–Ž •ÅnrI¹äóÁ¶Ú¬<ÀºnÓË.Û0 i1$ü#CsÐbO¼‰ÇÑÊ¡(Õnq+.µ‘RzñxÕù;ê‰ýñeI Bdº*Ò…ãé=õª”‚C¬äXDHuCv|#œ4¿‚¶FwtŽ\,ÏBÀœâu0&¬ ®~³KÝDN™¢–|ËÁ‰Ú!V ÛþÎ͸p¤0 "#ÖH4hwª³ûþx¿*ٓ؃J¨,¼wÆh¹\¤Ü̬ѯçûÚ¾oÛó< ~ùžjÜ‘iÇLsÒ¡€bDã<÷xôFÈßÒôŒKä.brº:Õ\È5ò$G1tgMP—kù‚N› ï®p?±Ó1pÁ²ì6¬îx¦Ì?gkõCƒ¢T®œý?aBKéë½%6¯yŒ/ŽŸM£4ÁÛš¡)½ÉÏ-%¿0m„ øLŽù Ól-Ø@d“Þ ü¹ Oú—^z„x?>ü÷a89ïìè•Tb‡Vr!)Ͷ°s+`PÇÆ¥+ÙÔ‡¹=Ø’MŠV‡2%{’XK³Jì»Å ¨qݪ[ʈ±µÄRfc le½~V3§œÜtºÚfE§»ÓùgÓÿië'Fþ¹û¾28Ú°`½Lø¯Ã™¸Ò´šc›Y¨j“6­=ý1š~ê¬_K²1W;7÷þŽ„Ñ}’¶ëéÀ Gê.Um¹NïU·‰œ«…Li6šzû´° ‚ vµq[;zJé¦ÚásßÂLê2sLã¤"`K{œEñ‹X1¨hv½â1ujó ïöžsÒÆÏê[jRn+·™Xõvû"m‚yúRÚ \Qµ¤•_vßÓHp=|Eí ÃÒ˜A/QÂÅ­¼x‡¾ç±[ XC°ö².'dT³‚ì~–u û”ܱЌë´J wn±Rؼ–ÄêkйpH"O}p{¸*•“¢ëæªÖ€/i×:|¨Lœó’á¤h·}zBâäˆ*,PÑÒ‹3OÀN‚ó¾Ý ÜÖD˜úmq2DÄ>r6íºñ®8XtÞ›ÿV±ÔÑWÐ×»òRH”¶>çÓÌËAn†!1Öñ7wI‰íš’[fBLT"(‘B“ÓÔà<6¹Tlõ\`¦‹mê’f–Ù;dzo’z–Ù…T»§>Å}-³'Èg“$ÿ¿½]²…Òú׿(óê–)·ÿQw×€EUBrñJ{#x^AA‘‚s Ù©sâ=n"LjË>ZG»8·CßífW‚±•WâCæì«Ö ÑÁ-[j˜Ýì'ÀÞ¢jD圭ÀvM fM›?…¢B‹qä*qÈ-‹‡žt¥hêq¥FJ¼Â%àg¥•p„S­2ªÎ#SA§*º}è¬Û„í8è±äXƒ‹<Ïl»²b…õ‹N¨®Fí >ÂA6*¡ã¸ä‹ ¾ÐÖ¹>O­ÉœÿÛô([£ÉxÛÇôÉeLU®àX7Ée'S˜ Ûªâø…A_Í„Æ0º£â‘JñJ#¡ „—꣑Þ˜õ|°~/z°•Ƥ$Z yn"`)€;Ñj%î‡hð,Gåã4°r· –ß’˜7¢èKÓÚÑN´ÆdÓÍ»ƒ^³#›7ÞÚqáçmœûg÷wt‘¢l<÷´Ý†^ƒåíÑí?äV ѵbXÝìò~ÊxôÀæ…Õ›²àöF¶Äè1XÓºâʶÈÙÁÓéâ}n?÷èÓÌ­b>—¨^<­& ÌAg›¶î¥#;Ìn¶ŸéˆV-üì$¢ûÄ&GÆÃÕÁ&ÿ£é 䑎àÁZäàm}t*\ÂÕIÆjœ©Ðœëœ¥.£¨ ¤‘½áaì±:¼[hи5y•™ˆ`cqn€ƒôå¬Ô1T CŒî:¦çâd[ŸŽûã³}ÚžöFÖ4w@ÔŒUÑFquw0?‹sDˆR¶^dþWÅ1Lêß·OxÕ¡IV7š.8Ðà#Ñ0Žœ˜jðÍí<Êo l¨‰:[ sê¸JÞjÉ!¡î˜ áI°òǦì”Ïíü·…ýþ0tÑà8³ß¶®ôè—»pÆ£+E\l´&zKÁaìMHTg¥œùËó@~Y,9Íè[ˆ¾/j⢕êUȈZÑh,ý~˜uô•µ…#©¯gبö?÷›Ô",À¾â$œñ(Bf 顊П8ë’ÖÕl-Jj‹´¯2ÝVIÙg;ö÷?@9ßÿíÒÕ¬÷ØŽ…ɱå’ëÚ{ûÔ~%ÛÕ g¦¢ýyg4³[¡PpwµIyi|/d`ùsõÈT”¬”çJü#Ú5Q†Å¶zÎöˆMC¨PwÙÑ»«Õ)' ¨ðÁD°˜ÉT)ñH¸úû“ö°ò?ÖÌÞSæÎJšÁ uým˜‡\N%O QV$¹º¾ó±WêäVù›kŒh—jg=ÞßòµçÅÀŒ]ç±å%öÉ\½§V{-)ö±øÇà³åÒpÌ}‡®«€/ˆå“Š2öx;wC)›:T1 °šß%c©DLwÏ®(ƒõ=D 5±pÐÎtÁ<>‡«jLøÏµWÏŽwÉØ¡2ƒ@”Òh*Åšm¢8—QQ¹¢¼µOå[äc®nÒvåAŽ*ŘdˆòžãÝ¶Ý™àƒ‚µëöJ©™ÿ ¡g ‰•òªòu˜}Ÿq¬ù ^]Ãh¿”$º“’XÔÌâóF—Õ;uظŒÏAes 鉟ålîÃìÌ ’S,…µ€!@ŽÄ^Ç þ厌ZMO¼¨ŸðÇF —o‰£Ç]ÒbIN:IXôRº”l_ä¤h)ãUýž ÿÀR÷ôÕ&Âù·“Gj¨R_oêc8éï©ÅÉå°m+RÔA Vø¯vÌTį–…  _­(¤áýñ©Ì*^ ®õHm;Ì2ôr/ëí„5½°Q›“§f¹”ydèâ¨ÍVfGtl¬Í¨©`Xu7Íü9UzXÙ =–VF;5´LKÿ2ð[¸£˜˜Ý€àÿ*÷{wo%•—ÁÛ{“M2Cù²M¥iÌà>GÊiIyµå$ qT€Ã°=þWRH‡i4üïÑëIÒ8;T×Óz[Sìfð,m(zµzjÑÀb#wÇ »ì~§XÆ+¬îDC³ªo‘ƒœH8á½f\5 m0q@GCNèÂ_MmŠÙÛ4Á´þjY˜Ö…Ø aP¦PÝÇÉʳ OÂMzš ÞBê^^kXS-ަœ#-êá€Ù°ð3¦È×e³®ÌÉ,¯‹ûÐŒáüãÂ=½·X>hÝ-ð޵Yrèjò F!ÔЋŠ†ö°ˆßÛ½pUüX Ýµ÷Ì"Õ¹ ,[¼#ÞN£¦À”pLÐÇãn³kÊÿXãŠGÕ‹éEå9|ÚV¿:+ˆæ5Á’óÒ‡]ÒîŠz;;ÿ¡0À<íôE}Îñ÷ÕóïÑtX›ý…`üG¨ …VèébÕÊk»Úèì) í`9MdÚÿÅO,%£žõQç?!üËö3<ëª=ó‡ÖAä‘*Ôʪ¸½ôai*Ê#à* ðóê_ƒ3˜ 8PÒ/ÔC¥z8õƒÐ‚ëJa¥µÎ‹ù/”xŸÔ·yŠ–ðýŠ+†"t „³ï®:SÔÅk ,!`rTUlÚ ‚@äÞÚòPô!!§šrA Ï\§lz‚âîÖT Sq~päc#Ö·I¢]Óúš.­”Çd˜½ýŰhð.f¯ÿäú5ÑÅòö˜)kÅ<Ø‚×Ê‘:ƒ’çïþ‰èÛh¶šR¨y+×B-ž”òÒHá‰CÆÐb«D2üð«J£W4l$ßà)ãàö#’™Éó[GÚ-üª¢É @èò ,¯˜w b‰&/kæ7)È]üBâ÷?Ô¶‹©´V]„Sö0¯Ffk¶¸Ä*“È27n&·JÔFT§*uާ-FVHg"ˆ Ú®xìTÄ`8Âq16å»Èeið¼ÝÑÊÊm—dÙ–#ÎGçH ŸtßXò\]´ø÷û€b·Î•[U Y« ÞEðÔfrav V9Ë›ðšsZzššdÈs‚_[„p´­Ò½¥PuäSTï•ú¢ìŸÃ ª‰u«Ö]íf³{tçšDRCŸ¬üeUè(p&Ε”}À[“&" 6–¦æEóÅ|Eyj¬KÕ%zžtbn¹cY} ݃çkô\Dçc|1Õb¯„í[ížH5šôIÀ¯†Ðá0¿ÍXýA¦zÐ.Ë&Á(2̶žÀ-‚o•Ûé³Q_Šìk`„4^ÎæpŒÆÙš%#¾º·ÿ¤èÓu{ã5‹Ð‚ÌÕœ©m*hç>T*§f¢årŠ+.¡i²Ýþ…þÒ;’EO§mB#ø4dZ“¡»¾àí*º•CÅ-*t9 AYéúX²ÀÈç^×lWŠÜÑî‹/ úg»ã€ºå' #†Ú/ñÍ4Ö^ä¦FT¢bÓ]‘f#¨ž“J¯–c{¿ç„€ ô@Mèc¨@iÿ]2¿ìFŹ:²ÌçrÐ’±(£é÷BË#x𢋊æ,®À?+ªp*FŠâ$:‹?XOnÀpt!°sÅXBØæxPŽž —‹˜7Éfï9Ñ0…~¢Úá¸å ½ vŸ¿Eckø¢N‹dµ;åžðf¤ñM‡>’­ƒ"¯|–iñ}9Õð׌]gåŽ&•\ÿÓÃL%~t. IŸ:+X+8b¶¦0[fÙW”€Ù[-œ÷ZË¡+ Àã‚ábíøMòz<@ËbX‘)euÅéTO©Ûvâ›&¯™e·Ê6Óº,½6W<ã´(° ChJ9Œ[ÎÓ‘œü(8wƒçåÅÛ­õR;_\õ¿¡j ayìn3.ŸsHÓbF!Œ*Ü߀ËUdy¥­”‹‡Âc…H¤'·®wÕXˆé:U[•¬Ú§}èø¹Á?a“ظsRM¾yº@[à&9göOÔ ™ùo$ÀÚO![K¨úšÃ´mü¾6Dëp»’9†?îGü°E˜)€J¶PHÈ Š²ȦiUä †R28(2™Ñþús°ð¸_s­ VéCùÁ?Àòz퀤!A£*‹"J\´ v†ïYä@†ÓŠqÓÕ1oºÉÐQ®Ae#™Ž¯­*ç¿ ˆ«rêrX:­fÔ´ñì =ÔHcb”ú*þ#±éhÇ>*–N qÔ‰wùõÙèùíÉ„wjIkC¦pœ> A¹±© ~Z£Æ.b?dP}üMV°£Ø1È&‡ðÞ8Ÿ3šÈ 8÷ÄywÜ¥_wà-¤û§]H™Ý¤N_Ø@n¡ZVÒ©Î*ø?„­íŒºr' Šÿâ^4ç2ªåÕûD¦ šRž!ƒÌ²›”ãdfîµíV±Â:º ƒ§ïvé™â–ƒ+µëYÞ1_­A¶•fêßS£pVªÁ·Nœÿ¿Ê@i–·¨É×DÐP[vÄo[FÍ´£“Û~zÕiß$ ÝD" à|3o1ûÛÝðø=ÆVó#ŽZ5î Ük“)Â~´ÏЧy¬¸¦duV=Ù¡«ÒÇ_«÷Øæb#³h·æq˱¨ÐG|P’ß¹lˆÃŽé;Ó—¦ðšˆr°ˆír¨ Ÿh„“t}•“ž¯¨åÃ$å; äcáä ‘ˆjëå:ððƒ5’æà»Etb‚•5Ù¬uP¡Æ{FkdMì]0»…ägÀ1ìÉ[U Ã>h½ÍÆ= ЮÙJ¥!èÂö:Áî,ê¬&ØRÞZÔ=Åëê⤅$Ÿoâ‡qåøe³¤ÁÆÂ%®Lj=úìªðÎC§ïØ¡]P"ÛÕ13xóù2º‰Žÿ¹³Tuéf‘‡V“Ï$™Ø`­” ŒX-*ûÑõ‚UWÕÖwDf­ =à'M Â6¥êÉàMdª¼o?€’G@òâï)ß@­A‡p/Wåy|¯F׆ܸ™€Äìôdi*:Ø—ëÅÙb-º-¦ Lì+ÌÐêz?Fë· ¦hc[&u%†æ˜h”‡…K}$»V²ƒüô< Y}GôéÚHZ¹5rW]™F>Ñ–·;³xêËË™fõ$\J„ÊÔ2Êõ$I…¾›f|VJÓèlבãsêÑq˶Ü_³„ó|Q:¶ p ²Æ¤yî_׬%ïaI€ ÷,ŸzÉMRâh2,0%ÂqeÜè-&Ü ÏåLòÙO%Ýóï¼õŒI-öÏbꄌß.!ý}ÂEg©5”L3qßö7Kžmò $h¸©JÚßHB±VFÕ˼:ódòÚ.úÖr|\ T <°™¶=Âû¡óFâc+ðTjÙy†y‚ÎF²Õ"3·=+?ÿ°c>¿ëïÖ]P×å¿é°|¨K°ï£{Qß,/x~˜Î¿ê¥Ë~y5Éüá]­´þ˜Ë×p5`tÈxbAS=M){©c ÎûÔÈß«#d`‰“Ô~-¬~UÖ 5"“_8 ’VDÿÉ‘¼³y‹ÈV|»LÌ¿—îÂ{ÔIK©)Uœ.q7gtDz‡ÕjçA¯„P­qCZØ=)XT¿!Óž‰Çõ~7‡oŠSâî:n¢Ì#køí&zø¨È´ñž— aJÈh!^~ðE¿ë^§ÎQŽÉ?2)d̸cª!àç«×r\Y:aí%& KÁq;µ/×Aá0»»eˆÒS/#ë P£òj,Ä_§ ·úb}&öf©«dZþ£ŒŸy½ÄS5ã‚òBm½9",õ ÞÎ&â7¥e°Aâ¸Ñ¦P«ò|j=í'ØÄ|›Kî¸s¡óÛËP=T4¸säæM¥V#ÜSä¹3}é°Œãñ ç¾_›ì¬xi(Ïx¯ZQO·¾¡<÷ÒVðv8ÿQfÄ;õF ýCÍK>#¢o®™ö›~+åß$ŠHOR|gö]¶ê·6GkJöTiY–$ì&ô äQHZ<ø?Ø—°•ˆ“Þ°0¥_âß ‹ÑÌê1d¼ŒYy¿¿G¤M4ƒ·¼Ôî¢u(%/Ô…kN'á» fY½0x®‘"K Žû_04˜pþëZ£>-!ã-M¡ÞìBÇNiôˆðV!Þl0âR%0«f¾¢æòj£Éf† ’'p~£à) ·1ý1,L{k¶ŠŽ…ãçÊ ·†9 E*Û’jÀk*±Š’Ÿ0ûïÊP!Ò$ ãØ;c’¢Q­òèQ|Â6¦]EM>Î~òÜëAñ s’©QçÂÆVÕ¬9W±(é_Ú’`Ázì7*äy~»ãv¶Þê¨;qîµO¡´eöNU!žïk Z htÓ×"äîÿ”ôÅJN¨•Mi#ä þ.‹ö@3¾†FUûcð`‚PV!ëݦΨä@•&_à®ü¨/«QÖÖ<l…k½f{yý\ýºÿF ñ¼ÒäcAóNuÝþsœ° ^åÝïZD£ŠÛ»9N›V¨^aÂÿ‹nu×c”ë5àà û8J×t ÷ÐBÜ—îO5Øäâ°o…Ÿ½‹/úº–‚²Ÿúoæ!½«UÔÏ”'JWg€C,%k³‚Üœÿñ%J°@Ý©•HÊB‹Ž-ã”\™|&)ÓÅŠ\ô­ÎnÚ¸žP2O¬ª@oÉøA²“@š-áa4ifÞ”Agz~‹‡2ÎÊ•¹ì–ÅY¯ë[ÆJTδ˜áa(ô—R:Š Î2c{I%È0LW¦àØw1ñ÷‡§Ðà%³†—ktlŽÇOä¿‹‡EfÇöø.'EöWÑ®BÈ8ùçmbÓÛ„»pÙØµB×;à¹OpÂy> ·l½¸rv%‡“¡!m %A1Ig=X_GºÛýˆg08jA\?‰kÅÌS›—ipEôaçšÊæ)nΦӰ%ÒÛ·RçyQÇÉ)Ûb¦Áeܽ7B&а˜‚R\X »ò÷ç’¸TñêŠæ¸»ÁOÛVg°Ãá¨(š -Üq£1 Q¥pëµá0S6ü¢Gf®ÉÕLI)ˆ„o!ˆý¬ ä¼ Æ7 æ+ˆŸ1íæ.q_Uv¥»¦¦àÆ¢Y³Ž[Žë´n‘J_5YK (Ðì{ßÞ¢ôyl¾«©´qükSé5ö€ÅC2ñ6Dm$—ËÕÈÓ`úrz.åÝl6PLü÷–ßýÆamdŒ%È–Šú$†6¶Ì-‚¸<‡šV%Γ7-X¢=Äl¬~šAdÌF)Eõ¢/6¶ !V¸#ঙ!zŒâc_Uµ&‘¹Ì¥4ý¦ßÒ×÷|qiæ½ÞïE=‘óSqµáêÝy¬ý¨V$w›Õ‡aKÓ°'Ë®/mðH¥Û¦:¨Jóc=TÝ£TG,ÊéÙžSõ¤Òç}ë§£J1ÔÛíé>°‘vܸí,Fy¸Z±º×7Ôº½&&f¸×ßÈö¤FK…v=Ö^†;ïjîÎQ…4œ…Vl ;yŽŠQ§Í—ãÜ¥šT3=È´©±vm<;§«L™±äú(T¡ú‹ç¦CXÞ%HÞ5^f‚HðÂz×HYï5y$ ´âE0”y(yÊ# Áw)æ¡s' «Š'ÏX Sâmäs6]ÕtIv)×Z KM.ÝÓ²Lµ±ãBµ«A–°œ&ÇË6¯™‚¹2O\'6ÛŠÕÉINƒT¥4Ì?ÂÛ‘ pO圯?½»rÕg—_è½]uÊ܈VH½¬WÞê`à¡‘^:ŸøÞ2ÊŸ¦Ð†åÀ¦i?ïJ°:|GñAY¨“8jÞ˘Êw# ¹5’0…îÙX¯'Óñ夛"CÒŸß‚¹üèø¹¦Ñ5!YQuÅ©Øt„že^‘+têq\/¼WèÒ€Aåÿ¾£ðò£P& 4œÃ V(ÔZŒ‡4`xƒLGí‘_dzD´eèThF§ßú›°ÙêRöœ_7O–R8(¡ÂÄXuñÛ 1tüKØßú1îèWÆ%þE Êìc`@KÔnh®æ™RÂH*{VàöÔ³i.–bß VEØÊ©Z%BEKsOD%ñÄiOÜDñ¹Ÿ³IÁ_Thà7KHzÀ|,Sd½|«XºE¼PeÈ4/1~÷3¯ÅI„“(±è¥BÕ¯œ±È—Î-…埅æ!*(ÍÀ·s‚¨³gžl–?‚g»;aöJ%jH€nÿ’¾ª.KL׋1úÙ/J71¥¶ôÿ_Ú3ZÁ,è$;d?ÆÚ»à¨VY­M†ïó+ï5(OòC§Sôæ¼h²H¨Ê`/_%ã ×ÁÚ‹¤l%aìèê½#/C ¶€;ãÏø*}E£Àyôú”k7ÃÑ+™=ðãÃXN"w¼1&˜%¶BE¨zf\_T‹n™¶àœ±âÙɵDûC$öqLšpûêŸz™ ´Dì“áÑ Èñoja5¥qo[•âì g6ù_è' 6-p‘îÀç±ðîçïÕWÚrIJÛµ¡cÿÖH:UL¤)àž±u…l<0M‚¥#0ÙÂtûl€2Èi±"8­U š©%þX_ý³Øã-Fùúƒ­0´Dkª}NÖNö¯b~Xq@~8ð)zM“«(ºˆª¼·Qí¦}’Â[ å„ºDgAûûÁD8LÁ…\yùû 4¡ÒÁwÓ3©'bµÙ —×¥¨‘/£Ef/´À´µVó1ÆôìxÆ“1ž—rAÍTEš`jk*¨V/åÈvegA{iàÀü’®MˆãÛØÔÁ,0÷•¬ÊH2®7]oªj¼Ðîw~‘•kòñ]³Õ¸×Çê¸âþüòY8{\lI ~dÐcë„oVØNãÈÊÂ~¾Ú/qßȤCb3“´f\Ò‘‚òO´´ªvëïc`-$jý‘ÿ5ÏM]ÎöÇ˳‚€N­JÍ<áè·v&y>jæ#¼[¹¶Ilé›MNOsg¶ÿKðå¥éUÌí$€^%„ôDÓzW·Áô1„ØóÌ„:¼DðþÛhGg_­wU$@Sre4ÃÖÑaØ/:ÝîÀk4œò@þF¼‹3}–¬R[öyj]§¥{0Ä“qˆ‘y\Ú«ú°cŠ™çõp¦®N¯ÅhY篵:Äñžpÿ#“\IoÂ,ÞO^¦„Ú\ÈvËšp5SŠ…/ÿ«ãt³Ú»ÿ¶‰ê„'ûÐ脳‘wR€É‘`Âý}þœ¨­ðc½pBû攬‘o[ù¦»ÄJ$‚…o[|•‘t󄯵þø3вɮ/ìw‰ŸÛ‚¾Ô~C×n'bUÓõ¨Þ.øuÖÜl{ê0LïÀgRÆvY{"HÀ{ìÀ7}»µŸðê—‘¨ä7u¦k•‰Šâ!ĵ:žS¦-%ñõ¯®3sp§œ'|©tý®6ü=~6¹ÕœCµ Ði\­©“‹žÿ0%ˇºû¡¤ÂÚ>žÒvŽ%><žž Åoû r­Ž®=0þM´˜¢!ÿâï–ëð?ýdˆ€J¿P³êOu"½3 zu9[Õ…½*.…"G«4¯[×Ï/÷2ó ÷öÞù×âšW=ßË+"6 V.'‘+‰0v%˜Lšñ£üØ¢E¶†P)7/Ñ®å—Ñj¹±Ò@ù¥@'ìÌJ,Ã4":új"ßÉ1LfÀ¼Ý±]Sê%ôßܽZ-à‰^eFÅ”î̲vjì%BçPDsÖ¼  ÎU˜fC©¨ŽûÌ‹ /Œ£ßöMQœC˜“0V -¦ö’‚²¯ Šüc6¼4XOàí‡þ;VM샮Á¡/?uO¯¸›°ýç<µú,Wþ¦ žœdèüW¢ÌQa„Uvr4Ë~ξßBä%üI€Æ¥¦êÈ7qV çªE`„Q‰ïãíÅÛG5Ÿ‘2î[H‘ÍÙ‰+š‘ Gaä^ŸFeµ|rm´e²JÙÍÓ=å³ø­Õ§âuBÅâë"GàÓ É̉ ý@“Å'ñuWOÖ¯ŒsŠ»xhá(UÐÎŽB{O¸cSeàf8òy%@æ$Vµ‡v¶ç'´ò‰Áúº{wŽA‡¬D»T,ˆ)€45 ¦f1»Ó­MÔyÅž«ìÈ«›Rc³-¼F=»Eý¼Ï’ékÈ+ÑðU±úÃfâÜ÷®·*C "½'3ÔØÂÑÙøýM’ûqvM‹ªa#ÆwÜ ¶í4/ª£ YæyÇšž²¿Ë‹’+Ùžù¾r:nݤûŒý£_f o£$`“ߨ@ùûQZ;V÷Ò Î[»,Þ”sÍKòËéµ q}ʼnͥ”~—¿æÞ’“‡iTH‰ëú†[4¨ŸÆy°›t­ÞYd~±­ö ´ÙKMßÕ‡õ%¯™™Yþ¶–|ІÁ° d³Q?õ|+ÈŽll§Ž¦6-E =õñ*н)Qcö¨;8ŠÒVèÛhJßYŦ¹(nFDÅe¸»³(Ž®÷7< €ÌtG*<ˆxeF¾$¹Õ|; Ùý ¬Ÿ5¨º¯ùŠÔI'6M8_r»OEm?l³`Æ_Ç:€Ýåm} /íµVU#Åé&µÁiÊÃè\K<°FWµµP2¦¬– î·ÎZzílKg’••úƒ.ïê6,Kù8l:ž?2'»uÝ”ßÖMæY™‘7Âf´Ëþ}Tæ Ÿ¦oÝÁaÊ‚¢K±¡6è2Q‡ÚpØw‘AïÍB}í„q’ƒYw·e]‘a´¨£¾ iÐHˆúNVÛ¿áè ÐB„á¬þ’¯žÏi3ŒmaªD"ä)}^j¿.9#r'Õ{Ðz•–&`u·YL9Dl¥º5±<Óµn ýۯ©v È:¤k$d¹Î M­á "'м,¢ÏOr馨¿øðOZGªXC¿Û‘hψQÉåpkÓ?Ù"CU·—×á#4ë§=á4"«þ=º6MÚæº4ì?3Ûƒ‡6"$bƒª¶—ülšŽøØÄ8k2K!†Átƒ‰‘lîeëdëQ%¸íZÎøÞµ¶ûçì`u"x_tÆŠ8$ʤU@ À¦€cá£cØ/'ÁÊë;4+ñØ‘×f×YMõx:’,Ò«‹¸kÛ…¹Öz½À,A0j=PŸº•çˆå‚’S$z¬¦5„[Õ`°;‚&'çÈœw~R;Of!?UàÉ3kµi9\ šèhÙJÁq¢¯á³ûv¥ø»š¤5r(eø|`²ïåâFF-ãbÀƒ|M’È•CY¤d~ÉJ|v—…IÖм!U©ž¡Q“¶Œºq̈kÛ`âäô3ß™Rºó{äñ;Ôª¾ì[]lH™ç)’Á™ðo–¶ ZVºüm p&ZáWJ„“Õ`ñôð€F w üà1T{Ÿ)TჇŒÙí·¾’Ù|@ÇZ”¹×›Ypƒ½ó<€˜ §9Ñ\¬­ˆOÚÙ„¹¹iÕoÛâ`†ù™!®Ý£ðíjcÁÕwïMw2 A°!ð W<Ö>IÔ¥êuñrË‘2ñPOߘˆ‘_M´eþæïBœš¡Ý\˜†ðIMålCóoCF¼lÆ®¬ûØ ^C§/¥K·{pçÔ M窱Ñ}G4Г\ÂÝÇò…‡}¦ ]¤\Ðm­ì— Çûبãä{ "ežÓ—^­;¨J§¸iןM áx.ÃV‘B£,w?b0öœD[jôc­,^iœúö•¢kæàD¾%CäKG¼àhšÕ ¬7¢BsØÅ¦L+2o´#¤ÅÔ`‹RCº©ÞŸå^…›ÚJù'ÆÕíËäp°²Á’v¯ý®È}ŠJ±æÎÖ{]X„›|F|TH½™=-à¨p´‘Yá–ƒú Ã{ÌŽE1wž>T3 Ao¼ÃR ¾ÅݯÅ%’‘ŠsðÕænõ9< Da° ðÍ´­‘þ_™j!ô3ÅeKM7ÄÙ½êº`·t›¡+¾m_$Ù˜žë¾¾)¹Óoé£{2ýÀHúj…h¼¿”2”ÈŠÝ,ô.ß›vt§Œ±gâÑŠ&ã¨f3)r¸I.Íàðî¨!¹ }£KÝI%)aäN¾/I.é[Ð+¤?é%Ûbîqmké°­ªß(¼spÕ¿¤$ߤR=ã•:§'c5Œç.¼Óùi0½ËÃã©\/¯š-b‚µ¢Nî³Ý˜›.~÷  sÑúðŠ*1ä¶11ë38XñÂ…*YV|‹ß ÇÓÏ_oëj3s#ñQRøa)q/¸†dψ™Æ WhVvˆÉ7' øy ·_V uÞch÷=ÜÁ˃™Å.Fš úÚ*%¿ÿ„Í‘XX —1çÛd,ìs½áiTmZÂXH1O;ð\G%–˜H›¸‚—lŒD}n5WòŽÆ ¾µ*zìì¼Ñ£?0%\þ?˜ëîæJ¶a ì/²ø]±¿4+m¹·z…ñÄý4 æ»˜øÓQC+Á¾7b†÷øB(ÄÅËõûHƒ|®¤È ’ÛãÔ)OÀunö£“%½N}0T̹s¾~¿Lc l™®G¥¯ÿH¥¨E”[ÅH9‰‰Ð—Ô"ÿ܇0î.*¢Èj¼Ñ÷O—6~¿žXí¬oÓ–C—JMF#é%§l¸›6š®ËG ÑÁãÊÃÃmù /a©„õ@³£Ç ¡½¹¿|»7TpÖÎ7ñÙÉÈ dËx§™fàôi›Kµëô‰±UÖÑvÖóhŽ‹ nëëOi²ˆ ©6‰iÄ2 à šÉŽ[¿üDÐJ§oÍ£Ù[‚ÿ&«X ,Pg¸É?I›n ·3›¿G@è5†ßæÒ%ÚœòЧk±$D›ŸÒ¹Ì n1ÿ[L“ØÜ7Þè.ôúû°€%¡_˜]Î0eì×—3k¢zXyZv)›­v:Sé(Z+Nû‚¤ÁÀÆl|hÕºû(¢¢ s¯þïøzqfþgg,âÒ&•Ši«åƒ„¹Ê¾–(.7ú}çŸTBwì÷†*ÇC[‹_ÍÉ¢† f¹ï_uû44“-ñúhÛŽ˜v ¹ÊÝÖõ^üíº[r3Ê;3rBB¹(YmôyÕ¨¾PØKªÞzÃÅÆQ™ì]Š1åɯ{Í^œöeKz<ßÎÉ‘¥¢È„?ÅÆîØ"×Ìè9œIµˆÔ9Nçñž~¦CPÃý\ŸE¥‰1Õho@´;ƒ‡FEQ¾+sÄzÖijÑÓQúG<‡º‹ÒhÍÖq š/Í9Ò=¦ædÑYúJiùcÒ ìI:tÃ^qh‡.5ìä­yó…†ïP–i¦š˜íQ_÷1ñëÑjh›`©¢\<6_òög2*ÍYÖ‰ËmÂõƒXb& ¨aUt´J 9 f Egþƒûˆ±OHŸøÙûkVhÕ^èk¾±I#Š +9Šì›@’°Ê,²û#T$q¼ÙúlScYÈLE)DUmŠ?9\žAÍwd“;†fl€]tÝÒw?¤†ë{Õ¥œ¼•prÆÇЗüÁ !ž™Nƒ]º "D;S«¨qꨱmdíMö´ÒSúf³^\£B>âV×*i-G(#6âÔKQ£6x®°‹d=¼Á#•vëŸ)&ëÓÒ¿MI¤Ù·ò›ïE»H£Ÿqæì=¢]  °Ä¢]o‡~¯×ežØ –÷8›¼$`ö£Áž®ø”‘Ÿ÷Ð’/vÏÇc wxO…1x°rpuÞ7ÃîÊӚ퇑Š;ŽüòK‚ÕZÓ2.¢Ë&ûœøÞ. w'¸ú¤7Èæ)8úFn×Y؇ýN_n¨ëL¨âpô(ñ¶u˜-å²%¡'yX/µ' ùm’K±É…ç;¤ˆ$fVpKðfž·pÉ}þ=¶0ùªé_þÊŸ—ÛÃ'h •­sàl‡+à>Çžp¢¶m~@z±vb–ó6¯Î~ªƒŠ[h[ÚôíãÑvdˆAQPEIÐù·kÛƒ¡Û+”Øn÷³•³x*ýnW»e»RÉתͯ“ÒYÂím1ˆàLó‰ /•®½X܈ÊÚ"‰&«v4„+Ô7øÍé&ø ޹ë~ðöB°¦æ,ô ÅŠh>î4‘{v§™Ñ[í'±0[çèH5Ó>gÆ…nóZNÍ_Ä=ƒÖ-ÍŽJÏþLÏ»£Pº²=„“ϵ<ãhÙ{às5doÖçõbëÚå«#Yâ¡å©eæt½ô4?`éˆRÀ!1ó)¥"b,V#S°~:<4ƒ¬& Td ¨qmW2oxàIwùý.!\ ô2m¨P„©²›Ü%&ˆ€`§Õ~w_ –Á»ÇÄð÷z&K•°FY ‰©‚šP\$Wô^uK½O¨¯2Ș@»ŸÞóË1S„béZ” Ñ‹U#OÉ\ág®Ï´½b¼ö˜9¿­2ŽV8kJQ¥#} ïìQèÂ`"DÞž€¦¯ílz¸*£_$¯À"•ù½&7R›¹Ä*¦ˆ„µ‡T󇣘¶“¼ÙYy4A*“ÀnâXUpAç°Zx¦ ®ê¿®ØŠL&¸ŸþuW™}ŠäR´}AÞgC6û@Dø—ƒªøhì%ÐxC…ò¡›Q±°ÆàÛ*Jr àj’âM„?4Ã{ª6†Å–j~,Y”%µedD“„l\ü„ËnÍg.3ëÑcù·eÄØÓXAFüÌÞê0楎)›NCT'õŒä@“IèëÃ[7Fryì=ƒP&^ï|„bÌRàÂ!O †Ü¯X3òwËðIŽº­E+apšJ›Nm šÕQ~ÒÃØêˆÝH9Ýßg›Q}x¨^A‡río@ùÛ9Æf„€yleþÐÔû÷„d{+7AúU¤Î)(ú¹ü ?û lâsš¦–lù®/FÖ{O \n>Y)•Ýçø" ®6"Š” ÖÊÛF½™$Ká%9B•ß_©×aƒ85R˜þNæÎ>ãñI \`dÜ÷—KÄÇ*÷ª–W"%žŽžÅ»í†Ðr½j>/õŒ× µ¸n ˆß ë©ø eÜÎ[y@’ùÌÛ)5H{XÁ ìgRôTY¨Ô#Kå®XGaêQ°™I¤V†R–óu&ýNÌÃ-¢aüêþúíáZ¸'`ôÃIÐAz¶ }c-±7ˆ'WLU»ñHŒ€ðEyÐ=&‚·B’ªÄ=Ì÷yØ%z®šˆ‚úUÆÔ¥¨«î´:Ç"XF1I¶öXãæ|DKÄZ¼2‰~eÊËLPÔ*mïKpU¬ÌòY<$\jÙòY÷QšZ…ô^Þd=*ÏGB?A*¾¼Ô wŸaÞÈßèƒÁxB¹b+“üs”H Ÿº`âHêj-ñƒ29â#Ù;ð \e¼+m®ad¤¨ëŸ4p€f\@Ü£x)7ò8{ãh‚û)¯†!’Zc_<‘ kf%$¶$’CSOM/øÇë¶ ;ÝþÔ0`T»Ì?XTÔ-‚ÉŸ’y¨~e{tÛ n}ñKÓ/¶=r å­ñ*Ö²FÂ~9êH (×™E“ú|Z¯Ó+pT›–)º¤ÄÚâ‘I˜:ë'~ûf,ÿ¾ê˜?áüéÄÃÙá+jròZ¦þõÍë&2füb‘v™Úý¸š^^ëu<Éuëô‘¢¼~*Öù Óš‡Ô¨p“7œUs=™õ.ì®ÝR\ôiÀGjªÇùA}ͨ„í[«…Wy0¯|üväT8Çû×”æÃÞTàúá¿T¬7iö'-õsïkf[fprëÒ¯:­Ø:$è 0zIø± PnWØWgkž bºn} ‹r¹£(çD#ï¾·ÎvÄš©mÚ®þTb}‰ñç)4Yü9øÝ&¤‚[+øý{õ$LÁ‹,xAyU‘Çü¢úc Ÿf+»W¤²Î‚š¼jJ¥èýµ##»„5ÞÁ3;ýy I7—:³â>àÝ­K¨€¶PDËÂ@¹Ï}¸™ÂGê)”î UHü·:>9«§p™"oö†¤dŠ_éæÓEÞ¿õ¼ö:ýoÃL‹Šés)Ðy³ïd`Ò¾ó¨}¦EÎÞ˜|!;¸'¿þ ÍóF$ß³qß]‘TÂÙ÷Tà{[Gw<ú²Æòï¨Ô¢IÉBvýÃÜ+GÖ#ïÒÞ|,ë7$² ²á›'c¾ÆÑGÍr4Èê˜ÅQ*`„xªøŸ‚+÷›Ëw`$ÊNt¶Q9&lœº‡öèÏ­Äç®aÉß^2 2܆5!³KÖƒú·ü>S&9E ¸àŠÔÖ!òÞŽÚ¯c=²ÒfÓðSfV ÿ³3ÎôÜ´fú3)€D›¯y´Í7cÂàC§¹‰á4£éãFXV“.žý E̯©û_é„R±:LŠÌ€l¸¿Žܽc 72;dí,ûQº¹ •jJY–Š~É {¨êtàÖ?Z…_´ºÎö¨€U‹þ§Ç·ÙwÈ»£¥ÁRÜcâvÂ÷—7#¤4M· ÷´YüéÝ=HÊEÏÆfÚ×û@ö®ÞèòÑ%@Ãnä ñQR;›F0ýÀM¬ƒò~Qœ´wý6î1´ìCg£'2…Þþqh³Jã{Çñß²½"Ȫ‚üýYð;&”g\oÞËw0{—} tÚa““ÙQ»¸ršŠxo« n÷¾ÔI&—ìp·U*D¯÷¶9ÖK"¯^¶Ç-1psnÎ.îÎ?<†ñ¹ëÇf ¡¡Ñývž9Í$ð Ã\Ásë㟄ƒ;æo*'qXÕÁ£83 ²;».8Ÿ×Åš'¬þM}åFú­¿ÓU4Ũ}:‘æ”oÖ,Ï?±Ð-—‚Z‘ >2äõA–êí8½".nÄX¶NÃ?­¨’i,uªB­ÀW)S%pÒmøÓÈ.èò!÷5cè.ƒ8T1ëØ=úOaazÀqk•ì畃à@é7±¥÷ý#øu‚Ÿ\yÆç`Ыsø¬Ž;.ò]âÞkuÑ7äw6sœ»„|êuõ8û‚ü&'Pq^Ø„Œ.±û$ùËS ÃØ–d¨6m6CÆ´ûŸ= .Tû^dma)ó¢ j¶{é/ÔÝûjß"hÌ!Šˆ€ë”ˆ›})u1pªµ¹šì¥‘é9R³¹^>bò¤?_ËøQ¦§axï‡ Dwì"À+]Ù*04¸i¯áðuã¶EãnÜÅ\DÜÛn™Åµ˜l Ϫ¸Ë« 1bõÚf5,ªA¢°[€Ã!—RÐL\ú ¶u¸\Ø«¨êxÆéðµl§5úáÌH£J¡ñTÆÂ—Êü·9¢†6v6´9ØÏOyNOQ/ G¬&áàÏèQÅûÎí¯'½Ü˜* Ià,4âìõ/Òj7x|ÒæÞãæ©^Ñ0v 2$YT/áJ‹zÎ2T€slS@ÍÚîžõ6¾Û ~ÝúJýfKyæyˆÏ'Á„,þX»Cv—”íw×p¥WïxW½Ž²eZ ¬øG”8éFn:æ8éG£‹µ?§ÿÇÚ•Â NøÞÑ,ú¯‹þä««?ÇWÝVÙÙ…ƒŽHxòf±­õ²S„,^«á å˜É`p(娝¬ù1`êÆ(­Ö7_ÔÌOÊtÓ¹%(§øu©“£PËhÇ"ÎìÀ§ X‡0:uñ›>Yùœq˜Þ‘(‹–º†ëÃR¿ÐòþÜò'´8k¥íwˆ¬ㆠ¬=¯i”ÆJ¼%DUóâÂS~'’¦Bºýël$MkÞ=¶:Q®…ŒHø¿i!;‘+ ï.;åvXÿí¦¬ŠRÛmÖ‹Oˆ®R5r¬ó:4½üÚ¡ïÛŠÔÀˆ!k¸RLŽ)*Ÿ¢ø:æµèˆg¹ÇËÊÆý!š@u»n&!£Ž¿ß†u+á[Gÿõ™ÍûÁ_0XfQÙÜw½Œœ;wõnšï4ÐìþPj°µª.ö,Æ«!FÜÒ»!Õw¡ÝÌ+fÃ3µË¬Ò8ã“Uµm¸âžœÈâËHZЍ°JáK¶­n«BVÜæi;Cê )¥‹]‡Aä ¸ h÷*Öµ¥–áØSúŠo‡Ã\çÕoK;þÌBº~¨ï p“V9žÀ£È•ôv‘H*‡?¯ô ÃêªU†‰¶ÀÞ5IqdÚ8¶ŸÓÈ‘U•/tFôp ™XªÍn8}x–L»°ìC:36\%áS'åuÙ(=…Ÿ¾\eÔøÚCh0\>Z“=ŠÿÊ\¡´†wM$ Åzç&ù„§ûÿÍäwÿ¼ðЛ*ìÁ$JZ’ªxëðÀÖpʪ#´o_>÷àßQއ²Ó-öh<£ò)¼s¸A܈P´—]p‹¯fa„ƒÕo'dÛY¢¸„ÔÏvB?U!t¾ÝôU°÷eOǦÖ«äDp§}uœž´ç”7ôÑÅåUg¬´ñ™Žüxô2²ãúcçqYq}+bfV§î~g)kÍ—<†3zøZÉ»¡â4̼(ýêµ2.qþ¢§ü.Enâ §Õäÿíý†«Ì”×0§¯µ:§Kå(P¸Ó¯ä3q›Nåáߨ¯{>yêp­û`´òK åäõÆSœc4â!µg&†ÞÍš¦[bÞ˜S-A,÷OÁ6ó³ÙÚhù¼/ßú³q­ÇÒÂõ±ù&€0çmîÎó`Tqf_bM¯‚´ªYÙH&.¼S[0Ád>^P/[ 1ÛEúÃLÀѹ |YöÁ—NêÙkøÛ¡®øm!ÇXªð`Müonà›tΖB.¨D6ʦ¥š¨ñ)ÀS†ò?ã~š¼t éßq·äFôZM šÝóNª‹G×Uд®}Áò„‹3Ùop‚.e¹ÔpŸèø4¡që±k£üä΢¬‹qÌ|ÝßÑ~Ît0X—¨³û«}˜HÉÑäL1zöM€Ö®ŒÛ¤ë‰ f)Ë(»/ßHÕ!pMâUÏ7Ъ¦ú`DÆÿô0½¨¦SY¬±Ìä_¬,·ñrÿ3¯§//síÕ[îÒбr*Í$›ÆÂæUE†D!œ „žzÁ)µXçe9l®ý7ý>';è©:'ã“ o©-•ÓqÙ®‡Þ4µn}¨zMr­{çœêiØö'#~Âei¤ÖZ˜9ChhO¾þØo‚¸ç“DÜBü£Ä—=äI¼ND<üÈ‹™È-’€ô1ÚÞù‹+"oíé£áö=á˜«å ŽÊ9AÐÐb¹¥¡z’“cìDh10ã‰,ê±âÚ6JåÞÚ©“Ç8î4(¢ Ÿ!ºÁ¯vk‚È ç·Å’B|[@é“|·<‹”/ö”g)jO»”ÿ2n6û=Œ »¥çHAh¼3­]¡NÆì^ Ô-V‡V?úÍ7ýÑ,ÍußnÃ9wÐtI îÔ3g.8˜j¯=çóµ;1ŒEwËxgß’Lû¿£^©¦ &9Q<Zíö&0Cøõz·Xð®‚~;e%Ûx·Fv]@´ÖîãìÅ~åÑ$Ö«½„õºgËÍ%€6^½Å…¾ç8…[L,ŸÖ% [Íó´A5£¡´gmëò-D¾ÂjÞº¿Eù®ÞÇx'g2L‘Ë{ð˜@d7ý73Q?N¢0üjŽyÊ'ß´ˆ×ˆÛnýï9ͼ>Záû:ÑÈòþ±Gàþzh£†×aí>I}\Z)ÅÕ ì:¿W ù´ì0k©R_¡V`XËR`ª ÒšÇy™ö)ôîÀÛÆ-õ"ìž (êl’;k V­oÊWQ ´‘˜Kiå#û (Ó…sÚÌ ¿{uŠ X[‚B¹¡8iÀsò$7»oq^QòýGp·émÈ¢]ÛÆ™‹=rä%Rú)÷é!h(ÊûªfŸWÙägçç½úµbœ¶o†wKn¸ä¬;»s¸}Ì‡Ý l ût¯vMÒ°VR€KJu±Ð±Éú1Òªñ$HåÞî]æ…İñq†åz[Eg’øÀ ûÒ¥ÁRm €ùKÚüK‰Ô.Š«iRU‹õTq„ˆ¿ÐæØ½?xöÜ?0Y´•„ùv=li é_«Fùlê3ÍEuéš“$c:ï–t&ƒßÞM”åç*p†ŸobÀ<¦ #|wøÿ›öÉ«˜C‘b1ðpµ —6 )}K~Â~Æä ó3ÌQ.ÞN_I¶Æ˜ÜeúÓP‹Íç-ˆ…j›‡¥gHcJn¹œ‚><ïô3ú¥ä©trÉýy¢L-—ËιJ·•ûiLUzôÝÎQú l©á3…CÛ1ëŒf€™¬]&æ íXoÌ<åëXã24(¦RЉ Êc¶§÷5ÂxÞ A$µ.Ã\’Ç ¯A³äŽ.ìúñ<7{iøåИ«]©ìÚÊÔõ—MêÜ(X_hfnDÂî÷%¡»O¼Ê³} ÿÍe« Ø”Y,ú„žÛ`VZžãͦ?“níÔ—›h}:d¡ÙûVº’Ê 7Ëä~A[#FÌÜ*ª¦Éð0Ç‚¯je2’{ƒÄ÷GþÂ=<-d'†´’Æ _Áß\! ªÊ3îE!§ÿC„.ÏeÚE¤ÄO›€']+#â9:KËTSïIhôÒ*+`Ÿ±NwÎŒãxÕ-•é‘–È“WUªE’6º(îᇠÄÀúý”ð+$§Büdÿ|Ó¶ý››ÇO4Et£%ç*Ôå´îÄhU°’ªñ2É|YÞõ¤À‰—XËu:9|EC[Ðp’;=ù>ˆ-ñ»%‚ÏÄS Ä&Qóלè¨CxÊ[*v±.fLŸ¶E/ößí``f9ï¯SŽà^V‚ùÑ‹bÁßÖÙ|¿4jWUí0èiÐÝT³«Ö_p Ô€Õ^XDŒµ–€qª[ã^™ïDz _7ËÏ=5݈¢C ˜Ùân>ª/IÚ.ÖhB)¡í€šf>t†ÀŸKíæP{o,‚/·¨×íÛzüwd¦<ªàà•*Ö¿2a³ð^Ë>Øb"[UUÝ.N¸ F‹0¡ »eŒÄï—»¹G‹ Òë¾L˜“Ïî»f{ZTã¬j±>ò+á¬r@áCyß=êOÿ—RP®­Å/0¿nôàHˆV4+ü ›åÊìÎc2«»°Ri'÷1nb!&ZÙcÍŒoØ=ª ÜARdi˜î²añ^Žd»Û3¢oïd¤äƒTûDˆÄ€oÛ‰FYqÐÁ2 \/ê©Êt§w*â—-ßè™zèqÈ 2¿U=‚Ö#{Ô\¼œq}Æiÿˆ|YsQ“€ö §ý¡ ipzxVÜž9/Ùà¶/[q5Glå:@99Ÿ oWúÒ 6´üƒïÝžl@ÊqTÅPµ½î?MlK-²Óžd§çÄÅNu·&CSÈÏR¢Í4ÚtµrɪIHIeU`ôrÜmt\tÀ¼RÊ¡ ÐR ø#2oÍkvÞÆ?çî|¾Y’Ëwû¯ÅìåO¡…P½Ç|ØlÕEÒ2$'bÀ6­ÉfÛü*°{µ|N~ Ì®2íßøV¾ ²=3»n{+ ¡òb™oÔ…vxé~ªµî áÖ»ñ¬HWˆvð”|PVÑœ¹CG nØpŸÈA¾=›«²ïŸÓÑ‘é7†«lAŸcìŸÂNèsÇ—±¿Ù·m×vdì£ðÀö}ÎFŠ]D5gü)eå_?”¤ë_úçiÄ¢¯ÐÆ>¬§ë@x»´ÂÚ þyX£n?Î_¿ÄûܸŠ#~ûQìäH4$i=-ò–bÝëjÕoñA2¶ñ¿šÓ…HV ŸJQ‡iˆô§Çô8ÜX‹ОËÖ O¨¥0@Ž ç[„ ¬ðr—·«*õùàðí¯ØmI§\#bøÌrÕÁàß5låì[£>ÕU°Z<%á ¼Çó*¾Ôn*^–—²Ö!Ñ)+²(©‘Z´3éš_«ˆ£dÌ Š¯ÖäÓÏÔÓ25T0Lݵv½N(Ù¦Ò_õ›8·„‘SÐL+þݰŠ3S.o‡¾oy­^}äÿ.™bÔz”!˧0ä> 9 VNo‘«úM»]Ù½ø_GýwȾ«úgùâçqýÇyM>5)Æ”¦ËõÌXÔÒ"†µßGÔšA¨Ý†ü§Z¾ŠjTI7WMµŒmˆaloOäM!¬.YWˆ¾luV[+õe¡ª‰^}ÆŽûÏ=íôËÎÅNÑó:n‘rX~µÉó¿¼NaŠ¥Æ–{Ã%ÑŒ¼ ³ÀvV4 !”¬À©ç„H/zõ7ÁQq ¤ ‚†ml sTvQNã衃PèÞ¸—–$Bu<·7Š•…·ö‹,JŸðœpï-ù¿ÜèGÛ7 wn'£ã¬niH‰³ÕùêKFOº rrȾPg£¯b»Ô~GÃÖXüòÓ€ZËðÖ}>ÛwìÀ̗ؽ°9w.Éij>~0ÆW¹ ‚ëøB3žÕRóV¸Évî(eµTœv,Š^à¿"××ÀšÈ·ašÇÓý¨h iKÎIÇŒ.…VÆ*k²S3FA– }} ¿™ïµ%/ÄåÏýô£U¯«ÞéK°ËëÛ:‰ã{Õý;løPú{01‘œˆjê:¾ Û»›h ô2”!jµÈÐ+ì¶Àu•ì|¸\&Ä)Þ9[¥,aI1«šŠlf²#pVuÇŠ& \Š!&õô÷J–{[㘠pñ4xh;(„üø¶"=RjÅ »™Àv†c^惪Ÿ=°”Œ8'ÀNõYTÇç…3šÅs©ò~TPÕVÈtHj^ÈiàO…l¡À3ð¹UM¾«< çÒ-%Êv’5w¡Ðô˜†:ÅþÍê{ŒKe ³ãJdaÙ[Ø¡µ¨nˆ\_Þ¿_Jnš¢ ¬è¥ƒþË’_ñ̲s=ç p±[ÌÎgAý|ô(—ÕåýËæøUÉ~Þ¿­81xÌc¡_ÎZÉbÈàR#i,A›Ô™¡„ګì sé89‘2¿kà}ÈÀ4WzWGÕÖv<Ú+QO"Ø&Òiš_Ó†ÈÌá‡|èB=žpGc­¡©Aw-Ë© !ë5^×pм°l>™“ï¹Xª Ôs»¶E› 9‹¡o,2ˆeø¦&/T_^›7ÃgœÞÄYѤ6KW§·ùI/4#7Ê‘·d–!¥$²ó©ž^KzƒJzËgcàP6×ÃjêŒ?´Ö%¾poÆ-M‰­)Õãˆõ=.Â~Ï-M•‹ÊmÏVÍ{z£Ð¬¾ù'×ô.®·æ§t™›È{=áŽ3±|›ÿ‘&‰éÒ`ŒPëUh¡¾äýG<§zÒ³7á¡à ÔÕœWNw°¡ BæÕ(I¨ø +’ >y¯ :`f@oO¦ÙsZ¿z’:gYf ú&È@JäÞ7¥¿N^}˜|ÈXØÈˆÄ(å=]X"\'ØàpÔ}¨.‚‘XòûR$¢œÁ܈eªÆ°?;-h¥’™DP*g#Т!ˆ o4ô¼ƒß4P«þzDU©u &Q”€±ãmŠw³ÿh+Þf(B~€C$qÅ'E49Œƒ¬‹X¨û>“Œ532‘È-‘ÉáL‚2´0nAzó=Ô™RG_ý€Sî³bC XüAЖ¤ªS9‹ªgª¢Æö¸Î´ä‘)¥£¦ƒ[c¤S$O²¶º2è±-ÏàñV|ÍL&°?œ%g¯n¼¾ÊU6“;8Ûè3tÐ V>ösþÅ¢Âc}‘¡2´‰Øeürb¾=fÚKŠO¸ÇðdåE ß ¥=‰ÂÉb~d÷j–.¼`oìFÇWµI{êÉ‹b,I”€3²µº*v…0ŠeìûÁL²TÛÅæ*¼Ñ?̆i˜Ì„îÞ-472VÞ&ÉFDoSÖ>Ã’¤2ïÿtMuÄí賤á•ô¤HkZäY¤¾eÝ; ï44íÊiÐHxõ¡èÐ6M aelþ‡4Y2xLn[_@T$I…·´&"JHÅ‚þ)ô¥šöÔÏßõ êÞÎÿÛ¡%06«3$Ì€Ý9È72ýPxë.Q€<”û‚UŒz9Y)ù2=„Qä"É¥9ÿ0 ÒŸ·‚–Z=ˆaNiœg“Ðyº \™·È@tkQ£O¡‘†Ú Ü á¤ÿ‚eH-°Mþç4‡'‰UüÂ~w|0¨1-àã1í”ÔêFí­ÿ‚Øéä`éï”§u‹ä<^5¦Í•Ùtô}æxvÁdA.÷Ê¡$9}£0…Êwƒw¹ÈF*N€áÝ ˜(Ïn¨Ø6Îkt<"ìæ—'>n©y\Û²ã‰)7 &~Ór;GÑm+Ó`^ºkµ¹´"¼qnÿw\kBwšßRVb´}m³è' ]·Þç$€J–韓2ƒ 7]ªý›»¢·^¨I'S@"籞q6öC ]%+ýð—MÙ5é»`Šä)²h†aàæï_å‰~¤%jv¹«5<ô,lí0r™TðzòãD®¥Ö”½âƒoQ‚þPxeCÈW8¢~ò§húp(ý›õÁÁ…f#‹Ke…e€zO_oôf^ë?€uݯ (S™dùÞduÖLy´_˜B;¨4ù̳„‹Ã!Ð7Ž´öÙÿ1v>Y€3£l\„wÈöa£ðNq÷²GøPd¡á–éI&¨SϬŸ)™fÐK²BÀr†¬‰ M V’lÈó4®æB(¢½Ý}o‘A›Ã…ªD#ÔÞ4çºìdH zÂ(\"û%ÂbŒFòµ”D›oJÛ?íNœßLû·"%;ðZè5ùñº¹_´1Ö(.2 ¯×þàÍ„¸k1uU<Ø›i?Nòºñ{ƒ‡y‹Æ’„¦~Ï%SvCôÛÝŽ+—ÌÉ%„ðx‰²¦EI€“G!'ë‰Qu™”›Z–—g]ŸÙŸ•h/b˜f»ž*r1¦ÖÄ£0 ˜§ªàÄóû½MËg¾9üý¯'÷ ¥±3ÓE†Ë5u§f¯2„=‡U´,··à®Ù~#»ýÙí$cý °SÚŸ5–}÷ˆƒ§Î?)º7e1ÏðŽ„Oað9ÐêhÔidئþøSÜEÚFwõÛÀ5éhåä«´¦{ƒÆ]tcͼ|ïÂQH\×BÀaD³nãDðÎ}•?ªXð—\6‰_-.‰Ë„¼ÎgI߀Äó¬fšû^PEÏÝКɇV¬¯{=ž{>æhÛïÊ&|¥ÇY¯_ê¯qQÉ}@º0Xº—в3D|T¼ŽsYC= €$þ‚_¼ŠT>d4”ü½.Gy•à’g5,ï)ç“„yV tR¾qÕì.ý4Ý!‘õR\ÁÈû™íôÅñŒ#Æ»Úý6ò»ö“¹¬€u6ÅGb¯Â)i ÙÿNü9÷ÅPÑ}m¼qDŽqWÎÍy¿Å9Ô«®Pö.Á#Óë\\µ­ÂksR±íÙør=‚W=[™©Ñ¬à÷N Р»_Tp5`P¹påõ]Ktæï^E„ãT/~чU‰euÐTAF¶ä´IÇ+n[E†JKW}`bÃÒKMÉ–ñˆmI•¤ÉÝ©"g}; œ“oÊ&-†^±#N‚þ¢ÐÍŠ¨ÝÕ^ïõhLF“~žÈjqáxULÕ!>ÑØç]9}2šSO±Ñ NÇ……ƒO1:0—fØäïØàå:öQõIÓÇ*ø"žW|ᔥ[|I[EspÌ3Œêñ2¯ˆÏ œ»Ú¾pæ f~¾ ­3êéßÊ0^R›’’ÙTé—ð$¾ødFrEC¾ôNóÚO} Jô2¥±¯š«Æá tyB˜tb¤>„í«TÕñê^ã]ð--sÃìÅ Mši¥èDJQø~{ê軽¬<=Ö.!%¿Šæëáëï©3¯]Û¤€[\MuaJ©yD2KøAªµªáîóü%)’Üg £­º¨Ê7­?BË*Ὁœ¸ûüý4ØÕ)¦m0þ:¨EZ.Ôz¸Ø r÷8×ùUgè#ã×’­juâWò×2`-Vj*ßWWQƒ7ƒºnŒ¤fñ8€îG-Ú‰ývñ1C<¼ äôß`õ-~ƒÑË|”ôCì„\ŠåFÏÓ/Ј?é nË8~n¿Ózÿ_ÙŽ8›½MKaQÃ5ð&‹ÅnAñ HæŽï @1ïCt’¼ÎkA¬¥N."2“ÍHt8‡R’áÛ" >ñÇÉ–"…ÿ_½yQ7laæî-Ö8ÙŠKw(×Hš’°¤¯åPBD­iݽªãD!ÿ«ê¢{·Ó‰XÕ\£ œm]Â,ç8z%ã€sRéFŠ!€Ý<#ÖV RŒ{+í>wÂóÓXE7Í:€¥'\OÎîòt¿…BÙG‰Köl¶Ç E4ßù…z›¹úÔèÀ±ßâòõ@€ï¹ÕQÜLßòÓi<³ÍKµpÊ»¯¬ã •òÜÎ÷¦üçi¿°Ø;,Ä®ÞèYêÕ‹=uþ0¦„ÅÑM;<ö‰RÿÂ6 @a(b÷ªp)ɯÆ,µÈÙ4øLÓÖd­å¿D҈Ж\\?„KZ‚Ø[‰!"Bö>7î…y)~^ªëÖžÑjÕO¾"2S´Y@§Éž;ð 2T÷'À Òh5~Ø­T«!ÐÝ¿+O{) ß’«ý©ñ¢Ðz¨Ó ^º"³¤ÉØ®P¥ÌKùA‘‰Ýô;ti eÆÀ¾Ôo|&¸»6ö‹¿cê<£¯'—¦jý¯K!½Ž±ä+Û‚^,‚ò²kG ø¦—ÑÖr4dY2Mž×Õˆ±æ¸+f߬‰ý#¦?/Áˆ2áGº÷ë »«Z†^7Y‰ú%ø9:_ŒÜo} ²U>t­ñþ+Ú‰Ú½‚—wt‡úœ k4Æe|äwäÁ{{‚i‰/¦óg¾"Ñ€ —Œ)½/GÝüsl© îéè}ù1+XJí—Á}*#+p>F›Á6éó K¬‡tJÖæ :·Ç˜¯QÓ§W<¦ÓvE˜+È Ë× —Åä?Á|¨ža¥CÀ+~8Õ.%èq;õÀ/Î6ˆ†—ûXF‡¨2U@܉"Á¾‘rl”@ê¤Ù€¶’;úAóm{ÂÞߺº…}´¶Â3[ÄÇ\Œÿ‹ça×–$3h`1 îø {î«8ÚÖ9tÃC\—‘‘Ä10 ›ð¸lõHôeøS±"ø»ïS¨è¦àÀ`mnÇÄ>fÄ`Éjí`¯!›‰M@ÿø.›~äìC0ùk çaA—\£°ў”U´f üÆé™55c§d5)ç\s g¹ÄÒÖæôM½,.Ѽ§Ì%çû–ãâÉêgžÛ›¶Þ•™¦œåÖêoˆ˜@œIʧ$µŸ¾ íd®•)0‰MIº÷tî·–ÚJ¿$ùæ\éY½ï9ÔÍmž<êeŽ'Þà ™Õœ;Iãâ3Õø—jQ~R\Í€D€§+E%ƒ£j=ë;µ 2}?ž½äÍ¢…Úø¢$=ÂÄG{ܤ86ë*ÄÉ?ØúºRZᮡ¥fÁ^\ yPîS>uüÖ44qÅ"†­,SŽ{Ûd„ÊKÈAš´iüZ(Z€wm¶ ¶÷FÝÇZɆEÀI Õ ¯¥·ùÃÜÑì’J3ß’RØGv²{€ªùœŸ¸O‰âêÓ/ùL5¡64(¢áµ­­ÀAKnå}šP$ÁŽSw+´h øòaô‰oèØJdýÔï"Ì,ä+$¬½ˆ%»û^ÉÁ–s ˳äÞß7æ$~ãÃRñ_Û W§)SM”OÃa\Zóû'¬žÙ±8…RŽâ¢$–¨wDŽ$;·ò5:϶ä ÿñÚZxíªiø6úT¥JþºSÌ;ÅÓÁeEÎÜÇÜ¡)Ÿ ó 6Ê.÷t÷?lÕi x*b—ÜKǸv³õÚÞO¹3Ï22U“`ÓÚ“È¡“©:·l’¨^„ÇMo&½~Sì“:¬¡Ånª¸¹;f†×Jù/ïhŸ–ñ¶I›cûz¥tãšÖ½ÚÊn}LsSÝÊÑ]RØé>wæ.”|^(–Âñ´RÔ4À…® ös¢}@ðƒòèž*^êªie¥¯[öÞƒŠCÚC(ä(ÍÀë%Ìy™sÄ}«nØñ ²ÆÎšÿ˜Õ–Q쳿X‰âθ2Þ©.7ÃE.†Ú1?è×EîcW.ý’ퟅ£»¯Ñž\ªzE€îËøÊ¥¾ÇiþTCf¤9fÏ×:†Nù©±Â —T-ÅÏÎí÷_e,[“·¼ûД«í"š^kPë\Ï“>àê„k½±|Jñ™dûž:-üæèN¶lh§Ûd0>ˆJr?ÄSó~?Þ+N2,ÙhÈZ&TªÚLÂÑšÁË×§Ij2ù3½©ÈîK÷f3*^‰aíóÓ†V“:ˆÇGÁjŠd–‰9nd†NPúTú¼ /†/öæ—Ti»Ø$…ªžðiiÕ©ÉclÍh#ͬöæ‰Òú?㊗Pc :èdùJÓqÔ‹Ù„›|ø*‚ S›µwÙ¤CØfWÚº G؃ŽÌ7¯÷+?sGç_c#Iðið¸èþ_Ö{ªrWpŒV®·ÐÂŽÛ«¼’Ñ5Y,mcÌD„ ¬§šÚÓŸèÒ•—ºBÉ`ÆÍ“Áqo ¶È‚¤8I¶ŠôÞ1‡ù¨¬(ûèÔ0yñ´-¢GÑôø}WºéÊy¼ŠbZhMüÀí€ b¼ŠÆ£Öx­™~õé47b #Œ)P¬µÜó\ñ´ÿº%͈hfnÍòI±³úó”¹ zÍ…r'?ÇìnÍ©güË»ÛQ3TÏzY†ì4âÑ»•,P”³$g«ºKµaôO(Yeƒe¬õÄ"Æ®ÖeÛyôá#Ž!ë¸b}Z€Åf %k—€»5mh(¾v©o´„†Óš9 ¼òOønòzœÉ s(•îv‹:ý;em.: ø Ï ”Ì6?ŸÄFjMù@ò(B‚aˆÔce.ýI×vχ<2cF™rЇáåî¥Â¾Õ:Ôwûr©®m‡1ø³«Á°%s%`yºvÁ ¢º:ÓEgp‹ŽŠì¸iÓ-NN›བྷ­|~•ûû‚ÊgpóΪUc——ˆó F^´3Üã8«œI1ëê½ÊW û±­ßŒî€8Huñ¢µ*5“7áUøÇ\èÊBxÇ>‘ ýOð¯&z;¢¿Œæ¤ýÈ›Çâí\„l¸q ÿ]¦ØLÏñ4°UÑ»cà»-Õà~1àÝÐm/JÖ´9.]öK‰úMÍ ³ÌòÊu'ogi­ø¶o…#~£œYä`9|µ%CŸK³®…ÁG]$Á)2úq½Æ•¡gM .^Þ"¶E½ˆGñ$ãi¹}#:áfA%(“S³Á~:F]`m{ \–?@ã(°ÞïÙ7Mñ Sz = fMòÀDdT1©\–´öV‘!ª<‹Ï¬.kOå ?h¼;ñ¨õj-]”ÎV%B¯8¤~¬»p’Jgs ×§/%1ÔpÙ’ê NgjO¦4 &Läà9¢ìî>'q„)À…_[Q=*4X¨óçl³aY ŠCbÍg‰8«ˆ^‹oÔÏdq0JÚ’lípu·ÚÝŠz9Nm »v0 ^~úì±6l¢y'›ÜcÚå&)8ãUY14j.œŽ=XÃÐQåU©ëÀ¹`½=ˆQ/±Æ1u¡eþ‰iªY^â¿“}_eGöƆÃõŽ×P‡Ïmä—LUDW3Ò÷µµªFH§‘àœR¬üÌJ‰4þ«$¥TN×øRQûPiÿ÷<³„¡Ì3fr*²”ZW ÜR_›ù†M奫ÞRš˜}èΣ§^; £ß#x 8™€ !Ý U–qRhh–Æ>.§õ}F)¡rm/Z‰Ü}-,/¬Uè›CU¡nÊó騕kb¥ú„µ>yø‹L/©Ó”ôŽP äT³$çØå¡7Q ¡Zùð÷Ây”}f&½&˜Ug8WILœ ˜è¿+ÍÅbܿ˸øáE™}ð¦à—²ªà¢ ÉÛÿ'z¥J¯›ˆµ¦yß<ljãM¬Ô±;õU_ýÞèY•3 Ó"½ ሎ $h݃š&C¼Šß»œµˆ%QQQ ø NÞ >ð…îáÌèŠ/zóÅZ´\cœ@׉i.“+Ö&©Ÿ{ìò­ÈôØÍ”V¶’¾ŠÐ´aÞ‰ÛO„僾ì,½íL¬¯Â¸êæ…ëê¼yŒu%„oÖ{ û÷.±ºîjÓÌXæ°XOû©½Rû>{Fÿfôó"·#¬€ƒ;)\i9­úûØYÙwÃj˜¶ŽÏ§ÖYõ³µg»(]I¯Gôå«$¿™q…DËÌš䋸" 3ºæ®QNTö²h(·E\/bÀ†U¦©ó©œ¹(¿RJShž{S…‡¥‹¡‹6ܨe]RHžÂYω¿GRÄ-k/XgÛ®g¿Sße½4íJA¯­xZUöõ,’;÷6¹ë ¤w7ÆNÅ[à[ŒÎÝ-ö¬HQAÒ§R((ó'R{úƒQÉ»goÃEn›úœE·¡Y-êÛk¡Ük õµÒeQo¸ç~'¨ùøÈe†÷„)8à ÀÿáÅYä¶Œ)t€Á?ˆ~É\„Œ5Ù ~‡ëµ?î‰NôF@Þ±–¬¬Mßþ w*ÄUÏb–LFŽ·9׿ˆÈ¤×]®^ˆ†ƒ ú6A1:õüí\?•Ý„ø¯ÿ×€†bü„úÈm,¨nŽ?«c<‡£^[`•Gí €D¹,2D1'‘–žîžLGÐÑ6¹šJ¶nã|ð'¶ÝKÎM’DàìÄÿ€ó.[k–èóM†-Pœ9Õ àØéoƒ6Œ‘q벬†B±«@š,.T}Ï.­ø í6‚MVZ8d§<ŽÃq±+£ó[áË»aRp³ Jé}á¦Û’ÆÄÃŒ5þÙ™N]6\H ª¿Vzä·ªZû¹ Í‘v,¡´Û÷O43{–û±b‚l²í¼\¾éb…F,ÅËb2×s[û€4?‘òØ{~jàÔvÅ o+jƒ>93[xÅÇeX¥ÓŽ¡*R’X­<ŒÀ•nyáDáàÉ TT~é_|ÅãÃŒÐÙÊ“Û Òæƒàù=ÍØÍÀhîòøãâôÅÊ~Df…<õBô³^ë±5 ƒòªvåÚ¥ôdöSý˜=-£Ä<”ÓÖì¥G`ÿô®¬HÙÎ>ð {(_Fû\Tv'ˆÕüzÚ‰Õ“áéÐGA ã´ÍaOØN¶ J£TæþãBÒë|X@sä Ž$7h5‰£õ—‘á//þ‘ý± taÚ6þËLwýµðN ŽÓD‘êB:CÍ%‚i%ÅTɣܣWÐu^ £zÎe +§¢?Ó%f ·OqÁm˜Ž­³müôÄѳìEb®Óƒ¾Æ+ƒZ m- C_b;©rÐ0Ê.ð„ü:] ‰²{ sôRÒ÷¹p…òꡆx¬˜XXHPÛ[§œóÍ…íst®–oŠd 9·FèWóÀRÄê˜ w™½¢¡co@nïïÇFv¨Žù÷¨ò.Ίxc’b[FHmÌJ'¥á0‹å‘'¿séFŸ(CÖ ¶brqǾ d"OA¯Uܦ. LZ<æ'  úŸhüÎWËãöf®óû&ˆÝ†²`Sû%?$G¨Û&Çõ [ô%Šå{o”M<'ÁºE­m9èêÌÄðp^=Ô…¨'À³”"|ç`_Yìz °zæ‰Ç…qn {Ï€UÒ{‹WBGV›ó~SâÇ*°þŒ÷ ß•Ö'@ð!È cåý¯7¼Ú4N]Ç0,«„¹Ò¯çðQ>W6Û§É«ØÌ þy»½„Êÿ“É,OP#Xʰ.ø…>Ý0¿|åÒ¨;·±Z¹íŸNê¥è?Šÿ}ú3…Úqõ3÷'˜¬s/§Xi}š/Jmë9늷íª3ú‰rÌ2zˆþìmõÙÁ.9cMÌÝÆ,¼WÇ¢}‰c‡O$ªV•ÆŠÑÎñ|/tv£=•å4lçˆNKAãÖzÛî'eóƒæS8‘%ñíën-½˜u ãF‰”ýefûŽ{ZO£-¥ã·ÅùÂ4Êvœ #Öá=rVð`Ï!bˆç±3Nß»‹í5­ºÑäN½¯bo0ƒ‚^¬ÈnYpðß®´rƤ†äÎ¥×ÑÿÊy3ž›±—ѾC¦Ê( iˆòRÇ0ŠŽ!!æd=Pºv±ÙÇ”ŠvV4ÓÅÙ`~3^oJ7vŸ× ¯…wÔÙÍn»|b-Ù—.jªÞÞüêj}.¡ŸÔ¸®†¼·kýÉ+ºÊŠ×Ò°}ÛT|fiœg&'2Ii‚Ê®Q|ÂdÍ@¸²ó1«õ’ÚÇBy?e2•5ÿ¾o-ŸsÂMqEôR#¡¼ið÷¿ÓHŒoŸï¢ýXjdÜ.tp5œ>K«:˜R6ÓÄ7 Û¤áEhþ ½¦§ŸœPÀkœð©)û×ãWÜ"È(×ýŒPÇQµ*ºîi}4XîgŒòÕ3×U ɧ¥BÇA|³qݨ¦qSDZó•1=ŒeI™[õ•EòÙÓ½Ù„ ¾4+Òô²ºN›É5öäcÅÏ¥åíxòdñÔv‡Ò•ùàüšÙ,r¡ÊY ©CµhË8uý$*{@d›'H›Ê•¦/äl‚8P­ïÉîO'bòý•K<º–ÈÆP„j9*L¾.quj8,£›‹zD†¼ØöŒŠM§N’2¶¨Áv2úÑU(Å×PìµAÒ8ðX¨;_ÖÊòĵ,=÷Ñ©Îâ¼ÔÁ?i¨÷ÛÓ+Ì!tb¶£\ðåp£4züÉãÐ<7ÚvÙvímÈy8ø´s”‘É®¼Kýþ}!>6Bá5¸ÊñPƒòAÞÑ.–9ʬÑ!„Vw;ý¶üÁj›­[޼WìOÙb·±ƒ©ÆCl2ê/%»!ñ|júêÌBš|­9¾>..ïáEž‹Š>«PW§8ÑeëZdK_Xáoö3¡YMˆíòùÈîSYz^(ë²c¯øik»AË;·Rˆ$¹Þ! z_šÁ(l~þ>ÕñÕõ¢ CóMצK{ ÖS ”èÖƒ_h½K¤oÃéù[ΰéÚÚ¢h¿R´Œöؘ¨êîuéI£yQÓjÉvrˆÞì«Fê¥ÌVj•i‚Cîš²]‚’W@œ<O¶…sv2»j™80c½§²»ýrlÀoðöýUUÛgbŽ( ©ƒ¢ZX·ßŸµ*xÕ9:'ï/f4¢Û»f­–®Ó$ÙÁµ  šT¤, 6ãôNFYcÌÙÖsá=W¼Å}sÙ“I=ßð5âk¢Y¼}+ê¦D£íùˆF®q· §+­´zT¹«ö¼µÏcPã]º@ kiÏÅ•? ûÅæAŒÙÎÖ ¾hB•EjÀRAë^—ãèÜã[™ÇÁóÍÁá„ÀD~ÌV$Ñ!)‡â¿|ȱ©¢ùÑ)ý‹TÎeG8B0aˆnÓê†ÞÂo/4ÙÀ}cùŠÜ^fdýyÌP÷¥+R‰o^·‘å¯Dp¨t$õY¨2×@ak40Œíb86j|摲ahI H Øö¹´>‘t¬Ôª=ñi+”¹½Õ" ¡×”İ‚í%Ö ?1ÑUQ¯.T`‡V›*(ÂΨl³wŠsÐ3¼4°1µ­Ì1½)hI(žõ·ž¾MQò¦AÐ |GÌíÎÈžù“’aÆz\Kã¢EÎËäY*ZÃûûVÆÎ5Ç_(¤@¢×°ßè:…>Ÿ4R%e¤’™é³åRwÇ^Œçtl¼ù/Ü ]¼9Þ›½UÒ{½jsHç‰ÞÈžË0ûŒø¹ŸŽ]ý=¨qž BVúÍÁç'÷§ÄCüÍÓщɊ—™+•·Ú”9Skƒ$ÔqOB…'+Y+5„(G4ä¤Q{ûèâ‰.ì£4-í¿ìýV…`°"ÚÉäbÎKß«}" ½³¹ x’cûà+nÄ¿ï8µ„;-Øñw1ÛhŽêב–B›‚£ñ¹ŽI„Á—ÍœÓcŠô©=1$ÿÐ-nªÍ›vàsâÉ $Áx{µn=Ò0ˆž Ÿ(†@î¶z|~Óñ½U¹„È•Îè!¸¡Ð6`œ¿gMêæS°!³(¹7 •¢#þ‹¬qY‚žé.ƒ"g#ãÅï…> §° Jv4:¦Jû²dÔ§ø¾‹AR•$´_¾Ýð!g`4·¡ŒaoòÌ—¸°È¹xE9À.>¿öÑÎa©Xƒgcõýºâv.¿b·Ö$Ú[?Œu5ÑTrÇÈðßþèÿ`¢ŽÈ–™´G¥0 ×Õ9YŠò'U³üx’Iýt`#7qÉgíOM÷­]” ¡kïp)‡û˜Gä”±|¦´JmE“ ZF­Žº2U÷ëj“¡ˆD!¾óQ«F¹æªÆE ß&Ã}$äܘgÜÂãm-fðx~¥>á~ÏEÎÜ-›4‹!ÎëªÏ(ÓI«Åšo_pV:kYs=|ß[dçȧU4F³ŒÝîYûò¦£¤%<_—Ë #’°kETÂf§h¤L†û}{â·&é®Õ݉sz ö9±åÒa%« ¨ŽLÜŒKSݬ›5ŸpM$ ó68§¼uæ?aJîE7fÀKºZ—t.US{? èˆp$ãÁ}#–ñÛdÝ(ò»ŽÒ,‹2°ï†­èY²yVŽÈ—þUYHV±±—q‡Œ¾™hZ)™€=ÔÖ’ZO!zú™"Œ±}[ ÂÚ[SðÉ.VrRÁñnçJÿñ RÅÖT{†¨¡¤sö/.ç=S@ž®s(÷|ûÜìYÿä 4:{xµ9kÚ!=êsJ"WvŠ¿€ÉsYH· hˆàWîò$Kh$Ñb’Àð,¾0Ú(·IAXÆÆ°ðÇ“™VÇ Çœö;‘X›Ûä­ñRëKUPçç@»oí„dör]µðæ¸×ÿܱ[Ûé|ž7ä|7i èdò%Òô%Mà¼k ¥ _2²–Œÿj˜È[ÀÏÀ†÷òo°S¼ƒ€¥C)èÚP˜~)¯ë5jn;—j&EpŠö}4ni¿°¹C#ŸzMœ »Ó+T¼SZ4× ÐüÅ“!W‹'1êàârpJbÈ!ƒ~?UÛQNü®XÅø$Ø-Qˆð”²¾«V# ÉôŸÀùòÿ˰ÛyŽéœÍk ›§~üXƒ¥ö@I€U6º…åAå›hmèÜï¡°…V™õôô´$O„¡Ê÷—ýâ *ª SW»ž¥W¡™†N;†!¯—Ãø3¸uGAZÐÆýúª;Ђ ÙGdñ‘¡¼ÎÐç\‰§f0Ö!¡Õ0Y.ƒ–¹È|ƒ ™3.DŽx7(_]bXËe9§;„ýU]I¨{uó¨÷ƒáÉ.:(Š‚•´x³\d-¢#Y T×̼®¬Š­ÂgqZÔØÆEù¾6òÝÓœ*»›O÷öÐd(:¦1¾æ­ejãfó&é¥ÒÛ8Ai˜|öäã 2®†>WŠyÓT †ÁŠñÆ.Ñ19 T+»·wÇ™}ooõF–Û2Þ5]ãB†ê{v÷hþÐ.º(j–„¸›'ª<¹hT1íiXJ°aÇ0ÙÜç~·•´Bm½\ÝX5ÍíƒÊLú‚Ê‚ ¼szšíÕyÉzœ–¼ï¯ñBûžu„ç­³¶P™Š·Ãhø†)7Ççâ”Ì”c+9ŠÅáõµ ‘mO Ö¿MþuëkÙÍ ¤G½›¼» «·TôelûÞÃÝ„±p¾psµÈ·H+ïÕô#oá”@…ÌhWƒœŸ®+å™-‚мÃÞp—‡¬¸êØo ­„N/ìá]EÀ9—mÁ–l³âŽç$’ݦ.B$@,f4å¤Á†ÖM±»`‘œÁÄM¥, 9^Dа/)# ß?öë*ç¨õR Í©¡`Ç?)6À<5%–ŽÌãâü,áVÿE×7J'¨`³òh×UÃ㽞@y2FOÍ /ÍdhrŠ!‘ž‚7Ý£ý­±|clªðq©š·Ü˜9:Ê7J¨õÈxª§ZkyÁ“Ä]ÂŒÓy†Ž–¡à2=¸wÄ¢§ÈBu[ÎÙìˆùxåAœ¸œõ¹ÁõþCVˆÁÖŽƒü½"#»^øˆ”õ ”cuãRàNšÉ[Ä¢y#°±x³5©“'y/UK#Iݬiª¹½†ä, +a¾ôßÝdB@7õ(d ½PûØHh Y|˜K*þ»Dµï…ïšãJª¦rao305—¤ÍÙÚ¯´ùãF¦Gãˆ=XÜ¢Cw™Ïêj‘£=™ê¤,¡›Ñ¢¼‘ "Þ ]™z„®0Xµ«8éù;‹JÜ£D”Òæsëì¤N­ºô’ì”·`#€Ä¾ôª(¼’Þ‰ÕÄa æ0ãxÅsJn\qtÜwqäÍÚX晦aÔmdϫ᧰ÃÓeõNµðÎä¡v©¦˜9€*TÞÌÈCQœf…ÊcÌ{ÀVd¸$<&wØBÉô'¡kß~ì[`j„£û†uÝwÕH–R‰oáÛäßË_˜*{ÏêƒÿyÇ:ì1[:Jr“Ò¬‰-¿ö€T¤úz½½Ù0•ºE‘˜éÖ‚ÅùÇc¨JÍ’S"4°Ö. ëÊ$X'~‰7¯ª%uSCµ ‘ÖF±|²ÈløgÁœ*¦¥t #pšëxåT…cø÷íJ±ƒ™vS&×T)‚e‘—êÝOqNÏd*šFÿˆƒóý,oàažS© {`Û ÅAïÕT gn®Ð)"¯š€Â YÍØ9¸Ó)\#·!¶6;“ž0†X[‰¶z€úÓÎúÒm¿î˜SÌÎ5dö(Oç*+:T¸A‰™¥¾{„–—ø n„>¶lq]@”BÞÒ,ö62›ÖUÈ}¨Jrõ\B^^°F?¤¬ÿ0±×ãÙ «tîBûôÓ!nXˆ† @㬙Sü‰U©Â»;=E2-‡›ë­Æ)Øì\B}å.Ïoš›CoK5KÄ®Qª}ÔöWj×Ýæ‰p¯@ž[é°miÜIßV/¨º‰H7G‘¸à› ¯êÜÓ/°–5~iÐ]ØWdfÒüõÐüvÂKû´€ël>šÕ¦mëŸ÷@“Ÿœf=?ºjÄT9SÐy¶¯§‚¡ ²4fm(áì™÷KE,Œp-NRÄtý¿ôÌåÂËW_[´le~d(»—’Kiêt[DrK¿Ò5 ­Ž3X×+R¦êdPä]þéØDÇôýâ'ýÙº†ã_^Óý¢Fì”Tîw«oâΧÛI²ÓJ ¥¬c10Â&Ÿ¿¨ÁÂß­\ÜN“`àmé÷£§÷ ÄYØ“}š#¶-ÐçÂøGô‘•ÉHù¬WG†…Æ.®î¡q`1«rC½ûëXrØS:Ÿ*{—ê\Ci%C -s_ئ}ŠxŠÎïJ®Pï™+ÃÂÜ*•ÄuÁ½©Øæª®òShàGü5àÚge³¨z~F“xüOœp€ïµé°PGMæÏšÜ ÉñÌ|#u“˜Ø³‰ÝÛIi\âÒ”Ó»gx…Ï ï*8JýÝA†SãüE&Õã/á9ÕEÍÁß Ê&“Î,ƒWEL™R(¿´Ë4P;n›NƸÎø”š4ìì¡$páUΕü>­~!nZ¾±¶³EöW/þó3#“œŒÐ|D¯öc¥#@ï…ø´ÀmjΕº‘†B‘:%JÚÏc·¯Š"0ð·Nh&µKM­q«Ê ån 3ƒ›šƒ¹”o±öÊjÛî‡oýÞ©àHa y@GÜ1 .oêÙ× kµð(íãl¿Êezêq4åc sj†÷ÚÐRn4úw0õåÎú·[rlDO/>ç)Y3tÖµ$|8ËF!‘͸fë5ËiíÚª Y »Q°k-¯ŸšÎþ/*ñµ-Å–’=»0~yt4ËE {ÂTK@“Êß÷q±A[¨=V¬v:…&©NÂÄDêÑ%£¬&¢ô˜¦Óꑈ.,OÆI<æ4 F°¹'d÷ ››EÞ:Ž£oÖ®Òí‡ËÐë”%´SeFd’d @–íHXŽý‰„Tx=Ø¿XMhÅ@µ†PD4•úv¬C àq† ]‹¦aøjÁ&Ÿ( ÑH¼= S’½ÓäìÁ˜tˤoº0!‡‹'Fu¬I©ù”PÙõTë^çÆü„G‰>¸ü­"$*<'Þå¶¼z›ÙÛ3êßqéù‘3NøëÓ?ój83Œ©µèx]›š\è)ž1kNH®0Ïò~ïœwoØ3=.¤$ìBjçÀgO³þùtûéÚñ¾8•NGgOnPV·Æ»‹ÝV¥™(=Úú"ívÿ3X×Å÷l…ÄåZ69l ž‘\ô Ú ?n?á–}¼ØÃù¥²yöN7sGçQ@)è.Ë}ÜV'ä"xé‡&E`º”98xÞÊxª*OÿW”,¼:~ñ¯¥îŽ×(êóq“¾Û75–ýªxê,W‡²´ƒÍ¿1ˆl™Ú¢l© “w³\À¨åvc§¥Ã;÷¬â6$ŒÂàoCvÕuP¡›€À$`Ý7S&¿&VeÏæJX| ¿oˆ°Ú^‰_y¨n•Ï:i,XJók¢Ÿ‡"Û@ò Xê1ò%@Oeú4 OAÓÝ)C‹#‚aíªPd~ªÀ¢ƒDw;U+JR–ˆçPY7Þ¦=“â¾ ý€veAÿ(mOËéóhJgx*z¥Á¹Z26,dhŸà›Z )­Z¥<¤/p‹FÒú§Ðg®ZÅøß*2±& ‹oæb­ýľ‰Á_¸šqºÓìVæ§çsäw}Èä…¸{>««(k§¿%]=´¤(ÂäÞ+# g0»C@v‰qç:æ¶Ö¯½¢J½'Ð`V žý ÃÍÓº.Éü °ƒŸk*Ìï‰Õ «4€3.iJj€®Å«’Ô¸Ä,üShDî ÊšŸJ ¾kƒI°9÷y·=(så ×EÇñ­ÝC““›Áó ’uDP‚Êâ5oy¿‹³‹µlÿ4óâ±ñt¡Ò?1 [gúßíö—†vZÕ>ÑÎDj@J„m˜™¬L“×õ©šÅpNî™nÜG9afb}±½ÔYÄ”¶Ü(;í8ë_àó[:Â5ŸGU“•cZ8ËÛýѨMÒ\ß'ä›Pz[Ùl ÅŒO㢴cz/ã…qö•.Uϯ§M Ðu@æKÑ=_‚ÌMÐLËHˆ@Ÿ_–”oÃûùQDX9ñç]Uù‘ó1Ø÷ÖÖüJE5rhì\&Ѓ´HÜŠì-NÑf}kxqF¯ø£Õ°ÀЇ9è•Ä£~˜‡¾ ǼæêéD#¾ïõåk¾WõA9CŠÌ/béj¾¢ u>‚ý%kh‘yÕô1ësœ0æ]¤ù€éE„Z× ­gm8¿’•I<•n/Ò_Í{; £Í‹“ï=ˆ ²&\WÒo ½§êÚ=6Â;Y¶¦r|Ã/ÆÆGdöPª³ae.L‚V²_zšüi|ª–™ëF˧  üŒÖ^QeԪɂcðk¸œ&ß)ꅆʧPá“M­LŽ™b…á¹ï 7ÆÑæ‰]ÿFHþì·«ô‚=#pqYXSX‰Þ69ã?É’/¬ã›ø>:)¬¾‘ˆO¹£ˆÓ —™ìžíÓ9×¥œO'›Wu¿Ù¦îz˜~m߯ún€<ü^Ù4{àû¸L×¢Ou `FºX)EdÌÏÃâ©yëdâÚF.ÎCå}BïÚ¡†R>Øè“fº¬!=¢å—ø‡õ=¤&$('ã…¾¿K5­Ô=eïä=1À˜ÙÑaŽ_#e¾>hl™†mê]’^>«üfº×*7Ÿ,ÝÁ½ÕÀíìV’,¬')ú;w;„¤‰¯pÊò‡Oq*ç= 5#X2wê2 ði…%:ÿ‚£]U‹ @è&Q‹¡œ.÷’M°yéêHž)`¦kšÄ¡WÝðã)íL‡Ä[ô÷?"MåÈ’aðyCú›tW¥èÕFóâ¸æhß¶Õ\€ø*5 S^JúD}N±RâøygzïÅÁ Þ# ŽlŒqtV;ï{³Z[Áå+Öp|@ÌShL0Á·yx>~„_øõ¤YÏXÒ­òwLÿ™QMËlâºß³ß…y,.Ú4ÿÈå†Â(o±†åàW4­RÍú!N†5 Y•(=«˜ež‚¢¢CÝÔH¡:ºÏ@nÐTó"8¡£ÛV³·úÅû¡ÌÉOkŠ¾Ž Êu|¥ÍDZñ±]je„°YÊÊÉ8{PŒ'!înzüÅt¿Ä)zäÈ]E\ þ¡c`ê>iܪ£ JÆ\Vœ|aW “ž¨Ö¨—DᛩH.ŽŽÜDZ¢X5õsh¹¤qµ’À}cEÀ5²ne†lS›vbjqQ1Ž 4ý!g=Ø<0^}biÛÝG5s©PñÌàzRŠÖ˜U•=ùÖì©ü”º*–È5Kæ{í–¼¤¨Ý”å~™hAAdbôÕ‹ç¾m°ÐºoŠÆBæ]ŽÊdî’ç{_‚E2g`=¹·±ô`ö¥C­žúm²; ˜Æ¯À´kÑQÅfz<ç5ÀE§<ÏxeðýJ` ½e°¬ê/¥,âUk©÷/ˆW©wÏlGJaÐïÆH1 DöÙÌ`éq…àJÄ(™E¹ZÒBß ‰«Ú¬—•°”Ϥ!|ÝT“`HûoñͼtªÓ Ü%º‰Dî´~o.cÀ9?’?¯n>–ÜÔÆßÖStkƒˆ÷v:CªLd;n«û݃ ³Roe;1Ó+×÷¸y2ź_|D³ÓàÑJ‘ï,{‡É:—N›x"—ßuj5&º48GµA—öX»·U°ºŠ=}-Âx›:ý¯iäÉe®”¸wµ²MÇsKÿl=)¿jq„Ç=Ôd~‰âåÒžnt dòé«}›ŽÜçzooƒ4Ic‘µÆ§Ëê‘l†´%«gI#­ø¤=‹¾¬ÂÀ·É‘±³”Ã-SñqUÛd¾lRtNˆMßQ×ufÓF¦Ïá+)§¿ž‘]‰0“\Ó^¢0Ëhõ✠æ‰-hU^®Ö h—1øKh«AÛwv¤u¯‡?B¥(UÑ1ñ…¹w,-\»wVM-2lÊ'ãüZ·! ˆQÍ)3`Ok+’!2PVVf¹üäwÓ({ê|.A⻫êCC‘Ńâ‘0Váܺèö»‘ìMœ¬·ÞÃ3È9É­²aFU„i%{ÈŠ`‹Õ&ÿl´KsäÜ «8gãw#ƒ½@R@ÆÇö±æ­ý‘þ{×Ç¡¥êƒ5cçà›Çîïi60µßÉzŒD90}F*9œ÷w ?V©G$0r  ZqóOÒ¿ðUxÿ¯›7Bø`›'KœvóK§Œ.﹃ÔÉ‘Ý*±ÇZ{ ×>™ÎE*]lcWvõÌ#…æ/@K³­lkã8P9‹oAýqSÍÓèpË3^¹­ã¡Gä¼ëdNÊESÚ4s‚›-(ÀãñÎa@¨1AÕWý6ŒUM®QÑÿZn¡ŸÉÛ<ºÐÂ@3dWSKÅH É==}Ð|²µØLöwš×xÚ@ðî+N¹Z7óÉ¥î½ùy?K€óí¨´T®.hÁÂlž<Óç8ì}„´ôÿÁr;SÈ¥‘ÔÏên r}ËžÂÓvΪ?_óSÍ­j jª1”nË»ðÞ;ŠUh¬-NòqÓÛÚ …ˆMÔ ¦£chôe·zåRž9Ã|oí¼–}çÖÝPžs€B+ÞY}é­Š„\Ëë 1¾ú(7Î5K„ÿí³a‰ 4ŒÆl;"ie#ʽV„xFD9°t›¡Èè./Yø…¿8 ùò}­ÀŽ#' g ¤úô¼ DaWK aþfáàæËÔZdszïy®Sß6š)İ-åêêeZ Éf?³_ÉÌowù-™\Ûð߯ V`‰ØÈ=qÿmL+!š6~¦±E9pöÕvâ/h¥ç™OX0s®™ô¿KÛ‡XÑ… iŸý‘%/³¶Ì$,Ól‡ßt¸=ƒìó¯|®iHÆòS2ž’‘ÒTµãD€â>+¦Ø&Ëø×KÎ.syèåeó4w…bSHw:¤ ¯'69@€Šüœì¶ü¡E-Ê1k'Ú” rîÛ«¦ÁZoktghÁÆèV¾pu06W¡0Õ¸oØ„´!˜&Š*¶Eá© Ÿ³PhÌðª¢ß¤Ýo\p€ðo¥}äR1õï{oxžeáƒ5ÑɈ6ÇŒØ4³¬6†˜¼Iʬðâ]“ÁÜþB 8Ï_Cá©ì! Ш‘{:7W¯ŠwzãBðä£á·|4dAdR ßö 2ò`¡4»ªŸ¹L^RLR?ùN×;-lIvéÜM{S Aùb›^E§Fë>7oUv%´Xf͵mÊtG±ÚqÙzkº´4÷¹/f‡ö õÿÜqþtÌ=7-  ¤m"*2™Ér±ýœV õØ•‹ELLßîñÍ8”!Ð]ï&Ù È%­ô€ÂÎQFR~è€wªýÈþÈ~° ÕÈi=Ýa› QC¶p;X*?V\ÐŽê'–âyUï²¢*¶AƒU<„*ßü0T¤çÈTPp½«öÚÍn2$IeÙË-ÞW¡1Ø9nݹtÕò>›5܈ȵÓ±ò«ŠòóŠTËöÍK ŒÅüpw"—æqÇ­žZÓ‡t'—;¦¥'½aÄH®ÞáÈ7…$ù©( j6ö? Ü·7)‹Å4¼.ÅkÝ6Àað®gc¿ä`LéÕ£™¤Ò׉p«øË¦VóÍ9¦=@__ê©¸Š®útoÓW>Ͳ¾'NÆÑª6å\hò uY¡Ê¹àÀ~µùˆzc³:FýSÖ•(О´޾:J!ßHç1wÉ˃ÉÉ…²¦–J˜z´(”Þ÷üÙmÇ"Ç_ñœH®dQÛ-uNBý©¢šŠ¢,D·ÑÐAÈr¿ÐÞ?vjY(€ 1[³èÜlfò«7~Aõ¥gðøý˜ªxTÔÕP—fûH×! À4ÅVß”iXÐM³» -¾ õáÄnŒ›Xî¿…>=´”"¯Üíž¹vÑ œÜ d/3"ñ+f„q6ä„ay:ý,)½å3¬•–äTŒž¼Êœ‰]̓ÙúsX}[ãá-ͧKý܈[º3’AÔ~&Z£ì×ö¾”^°vûU©Œñm¤Š-’ÄèDO žNtLøØ½†»´ˆ¨²¯ #{Qú{•y„ÌdÚ#Áš3møÚ%'òCYÙôq\Ó‚[ñ±bŽ­äá\1´Õ’NAP®Ñ8Ñ}Ç—tóƒl_$@¯¢G[­¶èB.~õ?*÷¬ûËû6\Ãn² ºprY0ÇŠ’õpüž5Üóhâ‚ÊAÔ¯”A/˜—nÊË+÷’µ_kÚ¢›¾ -w¼#¢™Ü»ÁNpöI?âFõÆ]æCÇKJõ0Õït‰üh ÉžjK&nó€¯Z'ŒÊ¸õÁ¼ù&°z ©ZuÓ†O¼:ócž-œ§D¿ª`œ±4Ö¸z$îûÌ.n™yvú¥MŸ–­¾äEˆ DZô«­åè$E^Ï,DJÚ炢ũÐç!ÌÁ,E‡ú ]gºuß~û§¨Ú†'‹£ù|¨ <ËêĺF®Ã\æ6£óE´R6vt¢fl(42Àý`s;­MÁj§(´<‘YŸ.+¯ªO¬0àøºs‚kíR§Ñ†šU¼Ë3Wß¹u¦rЄöÜJ@[4Ž~rÏ1½U–¤½Ø¾±EûÐ w½|x"aˆ&{œpA/ovÁC1þÑ3¶îyEji±®v*^£“YFC–š8×»‘à:½·-é#àe:¥Õ$•´&«Ð²Áh#ïá\à0&Åù«è)|wòÚ«IðëJú~½ãa‚]¾•Ô™ŸÃö¬¾œì÷AàÈ@@WZ¶<¨‹ê`n¶Àx[o²ÃÒqD;+q!‰¯ûÝ~žw`î !V8/ãxÖfj7Y]ÊPÎKÚ²þ*Yû~á.ÇòJë{3¥nT´î%wi¨†h»Ä÷Ÿ—Žì¡ ˜žõ±B2‘’4˜’žGñǧï¦/Ùùï(΢¸;GBø†øäÚŸÌÃÿŽÕ;ÜBʵ¥a4|h@J`UÝãçã´Æ;ávï‘Þ€Ç|xœÖiþö~И¦sܵ=Ç”óiGä~i®bö÷:ó$·¤ÑFöv¶Q.¼±Ó¡–(Ôu¸äÈ‚ÁÍäd ÖÞÀLÔ˜(Þ£!'T8öq¦ËãÚ—:œ!¬e§ÆWÿEËþRôûI 4š1¥à¶\¹]Kt¿æ_Jã³L'ª1›9óOè:°N¤Pépaœ£ž„|!JTê‹›ÈdhÁ"A±ë'>>–¡§Id`D¤¹©vT½o2{;Upa‚áøˆlÎ%&‹˜… ávC_jw˜Ÿ ƒS¼–• 0y­gC®õ{ S§v„l[4œ8‰[º=Ý»°ã=§­i˜3~&” Í-¹ -ËèÓù´I ìMô^Q_­æÚ×ÞL«îûú• óèTpAøàjq\cïLfÓ¢%*º:jë…,-÷GŒ,Á’ý,‘ž3ûaÊÎÇbà¹í¼¡~Ù1TM6‚t+zÚ>Clñ<5[ðÿ»Póž¸=ÕÃGZ5ÚSá¼–Âö#H¾hâq–‘.ÆÉ±ÁÍÐÑýÖS;“’jöõ£¶Ð•цÂiLšP'—g[‹ÄVט՜ŜõŒI þ<4PÙ8Këâ¥Ü=âæm¹q¥—œ+‡Ó¾­j‰˜P4<~3‚¼ * wo*¶e"ª=“^|z–\€›m»þß<ˆÅ·Gg¾¸8²-†ÞŒûªßÜkh@¸Q3M‹äàþàÅ:àâ–XoTæùêÔØJèõú¬Ëv²~4ÜÓ0¯‰VH?¶ÙôúôמÒUîõø‚,éú×FwcL©º]¼Ãh"{(–ÌÔ³Ä=ù§NÃåÉOƒpèÓw!%”´9Ýêshˆ\ÁfBwÊΗŠå.“(Ñg0[C><ŠGÑæŸ§Eöê²>Û§yw4FsÐ3€É[ÛqOã·4>îùâW®Ô¬*Yºgaž—ýú¡´£'à…M68—|–ìiJ|Ô;å¶PdDÔ;r®tÏQ-ÃÆQ€aôZðj.§1Ç„U«b{˜ ¦1©¥& ×¼šÇ##—-Ëâ¯/¥q­cgp3Þ‡¾àW)=½‘ç!g%;€º\è°ó…sæË~͹)÷3_X šz⛦è»óùœI Ùš†Ý—ºÀÞ#~ÝÉißçaF!¡Îø7(›<7/‰d6ô9 DêÊxƒ.¦hd"Ýwðg¸žþatÇßr!Ç8#HEqU´tåAy•tg#©F%Ñ ïvF/oL‰“ÁC5µÝ·*u\ ãGŸ=íÐÛ® C,%)a{0/.íxc›âÐñ<–ÖÊŽ~òMH‰Ô‹§‘ ¿¼D´‡^?mdpÈ¢ÞRUŸ¯$D8]ðw¼U|<ÙÎv8W6P%ßä5†Š( :G÷Êô¤âàêRðó¼íd÷ ™‚ÿã¯ÝcpÌ–†¾§UXåÐmÚ ÙÝ­¿®†Ô¶R¾ß0Í5%àlï³ûÜpoš(ÄrŒñŒqAª-}"šC” Ÿ^šzF ™Kø¥ Æ‹ë‰cÔ·ðrOe”v CÖƒ¿éœSåí 3?üb×r¤.‡;ÿí­ $¤Žvn1ª¬8C®C£w†9|¡×ûVÄžù­ô|‹³·ò"‰_.¨s¼è:a&¼þYët®G†)ípÊ`ÕY#'ƒ¦ó„11†CÐskÎJd¾°)ײm ŽÏøÜ- ŠšW•z þŠh!9™·žž¢Ëëré€;Ü-\–;¶€0•Qc‚kC ¿Ku´v-Ç Mût¬ŸŸ´!º(dKvªf“nL¥]̃7hHéìnKŽv­Òïš%•fBh¿äˆäÃ)\˜8]ËïDê¿¶Å?ðè+; «²æ_Ò‚©ÇÐÍ%4¢E#Åg§æÃŒ‰uÓ§@bƒqÚÕˆCjP$å‡9’¼£qŸø$ܽ–e*_,ä‘ÿóò;G_ ]BñWŠ”7±†éüMFÈÇîÞ–„šwÈ‹›DK¾wrù|ÍÍiœ’w¼@mSê߆‰ötFäöø<)Z*|èù£``ºé²BÔ`Û+ g19˜Yh¬Ï¾_äšykéùí1óD>ñ½šù©¹e˜:B†nÒìÐø¬1šµia2w1Eb$»𠹋÷`ÐK+:z‡K®ïr!‹q¶Â¹Z%ýÌå»G_  P÷ÞŒB™Lq(ÞÛV¬Ê¸ª{P»¹îhET ­ðøF1&G(NÃM”ã°6Mª ±Ã ý-là~ÓÓ1ëG± s\Š£(ï±µ]Döq^\–­ gQ¨RÁ¦!ÅTs£‘̺œ²Š в½ÍPœ—ì®ë#(œôÙ$Թߡ±‰Ï1Tb ðo$ži³\(ïýŽr{eëâW®ß}æéÌú¢Äb·¯£9³  þý¢]z¸¤§Öy#9Š”Ð†ðÈò‡\FA·ãØ€¯• {l3YÒîš§ÚK(Ñ«r0Š Žþ×;vÌ3rýšð¹Êvû¹§jþíý6Ó‹$#8RÈÛÀ¾ §Hó¹ï vÈÇ÷°Øî„ÛU[pzùÝ÷¢q¹—[Œ²ÊjÌ0Ø,Z¹ˆ:u¥(üWt­ì5F £ l? wÞè7%ñ)ŸìwÅšpÓ.éfš—±ÕÑ5‰qã8E±¹GU$öPý&݃@×ðUe¬ˆ°ª#Á¸®¿s`d‰HM+ÐT¯8c)N|9²Q$pˆ[å !䥞‚*§Q.b Ñ?ïèÜæ éâDYA"MfI%HhÔQ‘ƒâÄåî]˜J"~hдE*KÍ—2„±Æsh!O õåÉ^)øbì@Ê«³í.M¤qÒY”Aþ·ýˆžÏª—¨ÏK™^¤© ´rõù™˜JxÒùîz[”`–¸³ná• ¿ÄÎ=–®øDÜ$à‹Á Á¼ŽpK SàôU@°ÈÅBhi=©ÞhùEp»µ°%$f0CIP­ØfÆ8iôJxÖ“¤“ý€Ú`Àqÿôå¦1£²7Ödæ¼Z 0hóÉÁŸü·”£÷ÌKް´óG+(µ¼ˆB¢ˆÍ1"ú…¥ùÚ¤‚@ÉrxT¹°'rm<ð¯îõ«•¹tŽ|Õ‹£øø8m½ÈkRÛ€}°”4»^„™ÜÇÌ8þ½¡Oµ8 Á‡\{Á³s|5 À‚žãÂÂØóµ«qÝ—Õú¶´AcC€]¤uf¿£š ‘¦?!ë(d†j{äUŧîÛjT¨¸/žK€’{ÁGg ùvÒòõJcüÄ25 ˜dP“R;ù*/ß‹RÏš^ɇFX³T¹EÎæŸ÷R$8ú\,…™ÃN~Øímr¦žõÆB«a} è¿à‚Ù9µRîpÚò._J+u®Ê`BUgóßí],¹gð… K:Æ¡—BD=1õÓô¨&¬‚ƒ¿xõu ³Y1ÐXÃÐô¯˜ÅÄZÔøV­ð™ƒ÷—NVÕ‹—mq&°×"J½Ã¼ä_Å©þ(tÒ#˜K´ŽÛ+brNeÅÎ^¹¡= ä‘:¿2ÌX<”œSÚYŠÃ##%Ð0ïz£’XBïGãVØ·§#ãžPç’ÿŽŸ¡d}¨ñþ¡+gDÄò ¢SäEšôUŒ™Þû²Ùgu³QíìŸØ˜äWþ”Š=`‡xšæÇ;*v¶cFÆ&©Ÿ+§ß)êß›Uñql;…޵#æLÅÂ3o¡Åœì5š€rä‹_uV¢ËÕãvä2!+¶þk#éT”Qòn‚àÿñD¶~.ƒÔ±òËBq‰L¾ÚW3¯µu¦À9êTßh.ÉZØzþôvŸFÅ:Í ¨¾•¯Þò¨d¿ämñ÷K„<‰é¸¬Õ¾—[?” K ¾ê-EÎ?ß,G…jáúà| mã«ÑpªCžBß…1¡€ £‰Mý¨K^«Ùéâ÷˜¶ Ýã¾;n"fß#IJq<“ŠºxÙèò/|ÇmKp8ÖøÀöƒ4Í%vO„Ô0vÚG®›æ7{&F¶e°o•ÜñzõNǽ½æ ¶é_w¾HL::V³›¦ Ýí›Gt²á¤,7«ón†*¦1ß@¥Ÿ »YÊÌi÷ú¸î’ÔR>²<;ní¨Žw=µ á÷F—ªšpŒ€‡.ÅóßÇaÇÛÃsàßTø#ôÕwäŽÎpSý•“j|Ä—({‰¢·CØ–¦‘­¸ Ü¾ÿCŒe ™!›BPŒm›…Ì0KÓºvIJuÍ&˜ Uwg7ö=\rm¼9 uG‘ux@›aµÒ‡ê)ÁíåZ´®ö ¡õÏ`/鹨bÌ0ÎQTy|G(R†ª¯™å™©Ûœ…ÔYzR²ÀûL¸ÊZºVäg³Ë9.-¯ e‚»Á8GjnýŠÄ=Nÿœ´"ÌÍ}{ªYž­¦ª¥Zľz[›¶±™±í͠Хx 0&¬ï(æ Â4• [Þ¹³o˺¿A½EÒŠ¡î·?2ÑOK7//Îh[ÉㄸhFy{¹š"Ïî›_Ê–ŽÞ;¶:þzð;kò²¬ÓtVË÷ó¥k›]cö~ ¼àaZ¡¨ë/ ›Ý«lµKÉ…ã­4‡g®">*·Ð›Np¾X?'­+OBÝÀ¶m1Ye½¾)ÀDÙTgµ°ŒÔêo¤œp¸¢2CûÔ8ß½+É@!gZT4¶ÍAûï¿5îÆtÎb „RÇU5ƒøè”‹IáÛŽègðfÅxA§GÉôøÕë(g©ÐiDg…ïFÕš’,voß$}Î6¼ ¬«(«ð3àâf˜ü»ZÅ—akœû¤ÙöØF-–Ó;Ìg¾¹ˆÂÃQ«€¯”2t•º`U:~Âìa%{z+/ðÜTi݋ڢ}mBZ•І”|µÎ潿µì°¦m‚Àþ¡RJïÓð'mÏÍI…F·aŒ/2*{¾—>£Ögî(õ¸Ùdü3Z«r 0àçDÒ„µ  ¦vÝ,… ÄÛöYè‹ÕÈ[²@¦Ý…¾v¬|«¸h'Îs¢ø”B2šê¾ ö4ŸM54\¬Ú`¢U‡¢Tž~0˜qX 9ˆFDŒFTQ½ÄÅÞÅý T¡gŽ­ã)¿—€ŒDJÀ•V@IŸõ‡ˆC…0Â0Ñíc=™ 'C\×çBX©ç¬ãú7¬¨¤×—Vî_ðÇý E\ñÒ_5L¨½èzdÈý—goXh™oÃáRuy@l¢èí»Ü¾€bÉÚ¦vÑkUïÕ”f‰Ü@ÚÄYBnbb›è Ø”cè‘î›°] „hÿG®}S©œýÎ:XÔ× :”ߣ”«Hkaçòå'ùw² ì‡‰#g³ý’ ç”‚Ã`‹61ž´í¼£óy÷CÂKŸXÐ5¬,Ï2Kdn Y’Ëßö 1A\ôúÃЖ¿%§©ÿAÚ©Õ®Üâë¶xƒ ©Ç‰FÊnBN)rãà ĽöÂ|Êˉ"èxýúÊY$[;N/vÝŒÙî @V\B!ˆ9ÖÔ³hÖ»‡};䞬ò9 …?¦:Á%͹jRïÂ_n˜9…ê}["9¯W~§•ÅÄsR‚ØêO ~\sžèõ–<ù;8l¬m–±`Êñ˜èÁÒ Ÿž·íÓøûéÞ„Ó H‡ ÇèØ!UÈïœ)aQ³#”ÈX‚Çÿ;寙³vé1ÔqÊß¹¤R«ÚNxj•^ÉÕÖŸºE­xKù&0.uÙVéöšÁ|¼zaÅHBT8†­£ó~:æX9àpÿ€ÙØšýÏ~òÀ€ÓľîX+Ø+o]H:)…lGAExH|u*ª§g&©BC†Œ5¬8¡jj&FäÏghøVêLUQ2„.! lB´<±Ã+MàíàhÁ’µ@¤ªÁ^¢Z6¢*ë»]ÿŠ•Ô´µYš6¹ÂìÍwÄ7Àhº³°õοŒÇnÝ‚´%Àµß/Øw/M• ›¾ñÄÒ_\a–;÷ •v¸ÂeÝR¤Ò˜ˆ{é|¥ß#>’k_$PÙš`óTøbµB•–aÊ'` ¿ø_è‹…×ýa'a$hp‹¼õµ­jZv†[]ðÓqøPSD¥K%0”¢)WaW¥©lË!’}ínƲ¡:ýø5&&çÙTŽ›“eàÞ# ÍëOT)P*[Ÿyzj׳»%†glÜi¥¾ì†Á}Hnl(9”{ØÆ`w:D’\À… \AëØÃƒôîqÑ2îÓ«ˆ)8aU ëäî`*缤Fx1Ú$|¹µ7Ic:?!EtZ½zKò=â‹sÍ̳‡ÿ†{F“Ápg åX‰€á†ûé°ŽÞm$cïbm¶…iVÝAiÕÖhþ<Sþ»0xJló³éÂâ‡äšMàs­ƒ•oy‚© Ïé¡dsv‘àMðUNº3kÌxåÏl¾îÎ!¼¯¡eµIÐÜqPOŸ›"©ÈÖÁ˜y -yþë6ÙNç 3ÂiÛhKî_‰…ôÙꯒlÁóaLŸ·ýQSn£;èëøQ^#¸NÞéÿ.v*¥‹½)ú®t„ %¾‹î Õë.&»ÜÐký¾ŽG4·^ XE‰xõ¬!ˆ,p&úm“nI @z¸¸$¬µWH: ÞD¸jh †Ø¾>V‹•ëeæW€¿çÀody!F›5zâ/²ÄxKU¼½&ŽÁ”^˜Æ×“ ¾fF8úf¼l¹U­Jš³•n޵Cí¹ísR¸ÚšÙRÎAÀßÀ}H}N›þºÐ ÷©x=Ô+`¦Øø6é@ö«<Éà‰’9.ßw#ò•9ÈÝùFà™=3Ê¡“¼€€õÚ³yîAÁ ¢š,›O-6u™èNu@l]!©7lÈuJòP 3KÇŸVï—•ß BOÎ{Õo®LFÀ;{‚9ô©KÞÆÂþ,=òßúGø:§Õó_GM‰ =Á¸•óö¬,îÑ{Á çñ¼·šV"—´O\$s©Ž)Zû·¹¡pi¹5Ãð>1&°øÕ÷cN%q1¸>Àyá²@­¹o=ª-X’6YÿyM]oIjI¡Ùdm{˜ø§6™3V‚ù* ÐëKDc¿˜” bÑñDø¸n(àLû4÷yµsPä)­ÀΛù±ÏT*¿9àr¬zD"]f¢t(‘¤Bþ§?ŒqâcëEyôåL¤Íq=@æÕ²¼ªOy’iÙÕå ‰¨ÅG òº¼òi™£í[iJP3ã×D£ã(þ†®Ædsz-”’½íòb*„Ð@ƒ{U„j¸òÐÌ¡[<“%ŠƒRär(ÇH.Ã2úc,¶U»ŽÛ1hß.Pü´qÆs Óštnüþ—ÃPzÅ£¢¯ ` (øÿ) H'„l{Û‹™ fïGS6Aw-îd‰;sÊ.¶û´0ë×nþ->Š„ÜØí¼ ê;‚ÛÊr)pÐ è`ËÇ _uôÖL$,LKß uHT›7j‰¹ážî’m^IËá‹øiNW®*Å‘d¬<[ñYjz¤š„7’ ˆÔp2GÐê¨lI÷„ €F¾òSŒo]bˆ*¼£œ²¤ MªÕn=p Ú«Ó&£îU_Þþe}¸6:Ù7Ãü:HÃÁ{ nKJ‰/ä½½C"´¤ ƒÊ“0ÓÎY ÐnEe‰ì• y5gx¾Q›iÄÙ')}†Z6ÖØGÇþu>Ž®òÞü¿~TçOË.–Éü;½MÁPuñ8bû)>GkçÑBõZ‹~Ò„x|QÌ ÷´…?CÑä¾PS}?©"û”–Ó&k_4dªJÉ=¯ˆ.XaoÁ϶¢¨’¾\œó¼ªt®y ÐÚõÅx jM¨‰ö»+» vïJ JÇ㨡&x™¦k¸v _ߢˆýÝî¥ý}–XªµžÎíáוÁü‚6€E™€»Ñ¾*ng˜Âçç h`™Zóµì ຌg`#œd¥JuiO²dÖÆTþu}cf@ð%¬Š…@¹¿ä÷¬@¢3'=•ÃÄÓÈá:£›/×<–‡iì ùrËÓ‰UÖ‚&T)kìªX­pŒÜÇ<ûMѽ/¸kÈÏBÚdWë~11Q #ìkžwtL«ó¼\[ݸ.@%I ^Tg+[eDòÖ]¼ ãÛÿ€¾hFKª9<‰â–ys“H ß§û¿˜@vŽ_éöéû!‘oKΠ)«S·¼¢¯ÜI© giÄ=œ$Ћ#>ÄOBåµ4ҪŽ2f4LýZá‘mJ㨕úÛ%»¿1©äæO<¶ÏoaÄWôƒÀË ‚Ù³Ž‰A¿Wʼ}I0P7P­üýõ–#Wê›ö[H°n±)ç)Ôí‘·È…oëtÙf¬ÃÀ=Z+Êü^pÄÁ逭4fá´àP¨äéJYnÝÀÍTñQÄúþY}œ_>›M+I¿.{iF³AwÆ÷-þC~c2rQ4’šj¦²uçÏZo…hJ–‡-“Z¯R« É)wFmqŠd%¯m±Ž·i+à†‹%ª!†/%^–™â,·˜$Ád@šå(˜2@:ñb1OÂOðþKç-Á€ÃeH; öæ4EÐZäÚ¹¤Ê5‹'ÿÚ³Mޤu…N­Û“å¦Ûê?ÿÑ{ qUçã_5ê}ÒRΤ² Μ^[ 8 èНÑÓÅIXNÜÿ¥Xw+ qÇæ~y?7ž³JlTºBìɳÏ9Á9¡ß[Tmv¯«ÄkBÖ)XçÎ=xVÅKˆ0˜„°™·ÄÞ÷àq¹£jÞe™ƒ wëÒ³—Ô BTJQÁ¥?Ü·{’K•µ@A¬•6(qÐݰLnø §ÞI@G®:À=uinçÄÓÉÔ£Á?º¹áe¢rugå'UksÀ`‡ò˜(Œ 2'070ßá,Uá© V£“=Å¥¨è蟸 t¤Ë)Ä@±5úÞÖ>~œ»ÃéÐ[ËGÅ |ß9Ú½]ÊŸ©´dè%Ý3Ë]b ¬µ~,þµ?áÄØógÎYZ…lW$8kþa!Ðb­°âOQíjBŽ L³¥i¾/M?›] Æ3>9ÁÝ2,Q÷€‘$dׯ3[…fvy†Îøõ˜ ÍA Úw… *Óâñoþ2|H¹3üÈUúÆ ìW”ǬOµô8ec Ó ÿ¤öObÄ{7 7ûÆ”f–µžÝ€à^!ýB.É]FaBÆÊ1â-‚Iâ–ò7D乯þH±?|çœ+<ù©¡ÆïNæµ¥W‘Š¡zîŠ0"WæSèê¶9*L´T8º ¼ž‰CÔ“ËwyP§H\¼(I-:¤Œúýmv…o{;RÚyçÔÀA˜ÔŠÆw Ç0³µ]¦ ãúUûÉç<íEUo~ïHfMÎ7t0ù\ Ž)[½!„:ùü¯ «ìßZ\«#WðŽ{þ¥‹…¸l°ˆËq•‚ND*!ÓÌ`Ü£}Ç€ûVáÊC“Gü§uvy"¿´Øó ÙÄmqOTzaD¯¿/„n‚´`+z}ˆaµlÀÊðdÁöé?ü§'ƒè ¿={„õ´:íGãEF‹¾’H+ìÁ:?MUvÞ2™äň™ªã _Ö˜ž¥ÅÕ—¦Š´?½@~JšÇ®ËÏhA=ÅWñ: ÷ô6²ñmˆÝ ߎ±ƒEMßþe„Tß-Õ‡)Y—v'ûLR1úZ›¨®¾†. _‡Œ@Ëž%Ç]Ú{Áú¸EÛ¡ô‰¼ŒFÏF"SØV©áÂP_ƒ?^\ŠÕTá=w.:‡¸ÞIjNaŠãªÇº¡fepéåÒ´µKÎh¦Îª §3ÃLFpÕPËûédkO©Fób+Wè!uñ´³¹Ì¥Ínk€5H>«ÄÖ-¨cŒ¾Q$£Y$-ö•äÿì‹Î ÿ.@Õ†ê ²BY sÆ7c­TMúÎ⾜ÜåÚʰÁº8BÉ ¢O¨q„x&›*ñß§üóÈš“q;o²]éY<)+ÔYÆF•y¸~cg÷æ!3tÖlçøôÕô/ZÄlê ÈA'c,Ü'Ì\Ђ¡]›sžÒâŠþ¢µS]”ºéYmTÂõ·ÉHƼI/L xஞ[LT~¢IJs²¤³?µèö}U²@³Èî:ßÙ.Ù\iåöYµÉô„ÄU¥™Æ”TûäzV}¬äïDz)¡íqÝÆí‚)Wÿ;p}yøÚÛ}º“Áôht~¾†SþÁ1üÕ \þú*^Ÿekùx>ýå£ÃtN%+Ëÿýš´ÊÐá — ïFþˆG0wŠÜ7Ñ~ºm 3p{;â‘‹:¥ñ‰ìŒâàÙYÿŠÞŠö99çlØç:O-óê4 ¾ýlŽhp×D‹<æ"ü§RqI‰Øòuf8Cé>ÄÆ[¯*ÀÖSÒÂôuL÷„ ïKf0º¦S7ªN‹C/ï£á_ðÞ(ãÇÄqh?H¶SpÞ´$ÅÃZ–“1q”úÒ3¢Ä™Fß Ó£e3¸ÎDšÊ@2H Ѿ 2}Ëÿ¾)×ílà.®>´Ïݘhc ì¬[éL¯m¼¢¸¬Å¼£]—l“‘blmõD*ÁÖ^”ª´&â¼›3|„ð°^’¾0Nt =€ž¹ûëaö #RØ!è*?ë«}9V§’ÏnêFçˆíms$¨X•¯µª€·jˆæÒØ€‘c°õ™·ù…7<ÖM5ññ/¨¼ÌEÉC]Ž9|ŒwÆŸÝÍûâc´G¥ý(GpÍØt®@§öè:G‰¹: a/žç‚#*,ÌÂÏ? Á ÔÚvÄáÔŠçóÏ=@ ! P}ê1Q)øÕ»ÚÒY7›W¶(„ˆ'§ø `òêà G3¡s»Ëí–߆÷í5^dÛþx’Ê 2gíŽÊ5 l.ß“ˆÏÍóFµ+¹¼©ê#Åo*R·¡H,dXf´:eCtÙÔÍqEï*o)áDû#²+®;Ì%Ûö×=V?õ£f<1derÜ.¡žuóX7SVˆlg¹”¶-Uš`3§Ù+–¨Oà±î7?¯»çZQMtHþaÙ…£ÐHW •‘ÓCï ßBzzù3ò/+ökfõŠþ¹Îx¨&µlê/´¦tðù¤ųÂ"¹åÄ•I XÉÁv SM†$¹c¥€>ÕW¡#ŒlCš}q‘3îçvTÖEêM¥ ™©ž©dáK Ÿ¹®¡ãx³môŸ‚™ôXCÉÚ;B´_º Ø, —ϸ1¢íì#¢Ë<ÂSl8[ÔX1jîi97á÷éŽ!+ôÁÇ'qîýBÑí%®ÄÖ+§$QJÞž«JåÝ^’ò§á{ðâîÃW̸oâyüVˆÀÙ¾9Ìñ?µv Ñu–¶‘PãvŸô„/éVpUtà™¡8 ìmºðÿÒð~Á®?+u»”“L`wñëî{5€¢„â<º 9Š<ûŠ/ƤEØVÕŸ€4ÔU‘ÃK¼ ÔKG¢›ÙuJï:ñq|DT™)ÿ¿‹d‚ÞžÏg_ƒZÎå:þÃÿQ΄Œç4Ú0¥Ë‘ H¢UX‚Då|ëL͹èäµµ¢áG§4ò6¼L“g>­¢Â_ÍXeoðBù°ryûÇ!•ž¯µrâ%áìܘg åW4¬»€Å OS÷¥Š¤Z@µ›Ë•ÒÝ"âcçèŽt±–ê­´ÛUëÒ<7 ²?ʆW†³»æ…à®óS¡³4жŠÂ÷û¾¼#“£kÿ4^ÜŽ9þäCüòžÕ‚«Ë4Ê/ž‘a†(=€eMD|Í;êî"¯?ã܃e#L‚¬ýE#}tÝŸ(×>6ðs%‰Bn•hñ‹»M“˰O= ‹‡ngòe)™€éu$nòv#éQRÕ¢H1Ú|¿Zûw²EÎØÖ¸Ýéq Ð>ض/ÅÔùb šÑŸEhÌS¨ Ç©¨ásâìÁØ" Ÿùƒœrµúñtñ÷ñžKÈâ’soÎÏÕ¥åGì˜ë¡›2~¸æ&^?ޤzå~÷øáOAe«šný}u+¨wu-Mû3ÎoukßGŒE­îOÅ¥ FÅîÆí¬—×ÔErÕÖšb®±&¿¥|*—ÊðZü˜z7¤Š ƒ]ì:"ÍÕmÇvHÏ£^pY–ðØü©+˜D•~ý¤ÊÆ·¥žA ‰ÉnÍ¥ÑÒùåP±#*ÊôÔÙ#?Ót„+`’£dzߕ5ã#n¼Ð㟨ò3Uå¶þNEÊÂÄE›É Â$ 6)Õ§SQ8•1"Gx6‹Ì`€qùù¼XF,×Ó«–¦9:¹¦ªíú|NDò¯ù°¡\‰å 0“·+ÇiÊô©îríÁ˜š¦ {\—».)[ßžmHqðü9$˜Êê‚ ÊçÝ·AmªIÒ¢L¹™ÈÛCdÉ•;oÌ—‚^³lä”€× n˜ð·Þ²ƒ%ŠÈz!Ž©Ò☮in£=_±ü_¥+̶¨ÕZ“rîz€j›"Ú[‹-FÔúÛWÙjÄdîSªxûжZWgú¨^zNœël÷ Þy*¿¬RÌíò ÿçEqÆÛÁÝjµ{¨Ú·9/v¡¾˜`¤Zá'Uòeʇ#ñ3îü˜Ê’ѱ•Ș¯ZN”+§š@Ã̰Â=+ß‹êw6Ú1°Ï>Oë§ì•.p+2JõÓ íñ¯£—·âö 9ž·£H»°²–ƒä󻪖u­m­#d„ôö‡!šm¿è&1ìB1˜1´B6~‘\,z«:9–ªuNïSæE±ÿ±]BÖ/0gáj×öÍSP–ãHvÀ{§ÔVø²ÆÉëøÙqš3Í’/Rå¿á]Ó†%WCT¬»þä0i7¼N [Äãµl ä@2nüðSjÈD\”f}¯Þ‚±å”†êñ?×~RôcûþÕ=Ê÷¹¢Q¸ºÊ®ó™AËG”òÓV{PeF~‡"Hl®™¦´†ç0v”fhTA øª—@¹®î×ðÀ¹^\óHëBPíÈ0š=h ³ömXíJ"’±:üŠdÞ±I‘™ƒªkMÅ¢—âcÕÞ(q\ Ú úÛãVî¤ 9©ó»ÃãªØ”ê4½æA½±|ÿË—¢B»ÙÍ®kT‹) ¸s¡õ GDûÆ–6y¨ûç§¥‹ÉFD«o{Ȭ.$ÇÅ’ój*Í}Ï(b­ØD©âœ¨ Xlß;*×Ë©’p$Õ—“cú¾Ôc¶u~qÇŒ»è V%ORZŠ>Ì}sQÂòþÞ9Õe””IAbAÝ©Q ÷r?xµ®Q›n!FþæÌ-î”÷ǶâPh÷6)oU€Eö:ÁeÇwÀñ(¶å|5&‰öO¢‚*šDmøÄŠ”Eí8ƒjµ"û¾ÐŒryÛC'ÕÍAÄKµ_CÉ5ÛàLXàó•9Ç>éØXÑhϹ¤™Ä&›ªôó‰ ‚ïê²ü:À8Ÿ–9ÝkDxèõ­©)ÉÜ‘±¢§uKåôƒ°ˆê-ÿkÞXtE bù–}ãmH/Юdš¾ù#7•‚€Dœ£½8íE‹5(cºïq!ß0Løyµý' y|«…t·^âè òã˜àÚÁv‰†[•GÉ_†›q{¶ãßÁ°_Ilšâý¶Kòø”R³}ÀAšÊ»™Ò£ÊÞt‚sÖQµ-èT#VM4vó‡¸ßé|éõ¼ÉÔ“ 4š:-ó{z‡A\¯±8ä×ÈâÊs±8¹VmÖo;uœúf+§™UƒXÒíx~Å΃'73e41ÐG@\©¡r¨f0'}jX½eÀÌŠBe&FÙ^äJÀ¡À~˜óx²»„ò í‰Ïô?óù¿Ü¿Ë@Xw¿‹t{u±Ž‘KQ×™—ô=ÍpÀ¬lx[û‹TŠ/Â3€šk£›:h*ݘxê¨#9Œ÷ðøh}¢B‰ˆÌÆî›>“¤³XÅÈÆAœ¥¡ÎÈBîfñ`ñ`‰«#£Õ¿*•Y/r9ƒìgéQ¡å·‚—2å+åºkDèb±®Qb†19B?ÈrþA&70ôÃHÌÆddšQ”U¨°鹓è>2;Ž˜°èu—µ.íöóçw¦YPâ§À)w¾1!rñóáå'ý!)ÿ¾›<³rÂiÊCLÃ1òŒo›pžÁí·~o¨¥*Ú”Î|Ð÷ÓÖA­ð3e'C´âò¾½)±ÂÅûEÊhBÛÚÁTÑ)¢¸{¿ñA·Ñ?0…)_3_»4•GLICt£‘?.=üÓ8—ýJ<[:9.ØIó!Be0=î@/gv6ÕLIcÿþîÃÖøÛ ‹vµ´'x>km‡K”hIÎu#¾wñêC•A® xòUo½6ÆBˆª’±5ŽózÇR2‹˜lJ€…—ƒÕÂ2¹ÅK]Àš½ütù8PE‡Bi³Þe›+¡JðòúiÈ€Ç)mDÈÑ•F–dÊîsÇ ›'j`º$‘@ò§%:™×lƒ¿eö!†ù;Ü2þ'µžùÂè“ï(‹HÅIöw”¾¹nÂà:X ¤"È›™R L²ßÒ7ð[…2A<^@k¼Èb¶Îû¶‘ |ä#ý2ƒâ«Õˆ–•óÝ?;©ÒÀièf”%Ž0C˜S{6´!æÏ¥ën—¦ ÅâÙ°P_k¡rä]-”x+úBÉç´“†5»ÈèRÍÓXÈg7K$ü Ü«ÈR®UøÛ×M1"„ËQÄȤpÄ[Šk}’=åšÛE’×ÒÄúÙI"2t•dÇJÿ3]¹:%âÔWÄå£ç_W?×<‡µòF’\Ü÷+ÿÞ¡ÅØÞ&ˆ/ñÜS·/±Œvˆ1FºM„1ô¾ê£`¦ EP!Ï¡­vÔW3ù·«€)&;Àf¼Ê”;j ·MÁ~ ÄQ_"%ÂË&ÄV·óÝ!Ãn^áÐLЕ›¼5F|4³F‹aüªy´ž (.hÞõ„Dó&áwEQ™üÒaÂ|ÈÑÈY~qoê×h^C–ÎÑ”:ÿõQÀp¡}Q•Û4Ü;¨ª8þN ì’×-ÅÎö¬,•<}#Ü€¤¨,Oq:Jª!Á¡¿ýó¹GA¤>_a ¿Mõ­ËÍYŒªK¯bà‡9™‰}ýST—äÃwÁ]ýÆ_;\[_’˜íBšÜl5T  \s`ÕXa$£ŠhM¬!Ví‹’š²/«ÊñøU%ÊTc£®fjTïõºÎ<„åò%*·˜“*'•´Âtälb0ÜLò ºãráÖØäëÔ륢²’‚CÎIã}À‚ Þväð»¾ó¿`‰ i܆‘Ú„ìÑ,—ïÄ•n°ÏÕ,ÝàŽ{š±.ÏÅ`4ˆ:ÁÈWÏUXòà û¹vbÂ&U£óêTäÍ©DJSqÐ[ãÁñ.`ÉÕ[;‰Ý Ÿ?ÓEÑ¡gÓ×Ïe?}SMwÄç×½ø¶À‘Ì` -”…:‰~o×níJa-•D~бŒã ò™é+ÎxûcÓÞ”poïšl‹dz†©ýûLö«¨pß-·CvF¼g ‹ÏêÈ;…*ÍR^œ˜KYumaŒ­éSïÛ£aFv]U.àÿ„•Ì›Áº=†ÕcÏ+(õ,ŸK…œ”Ï"ÿŠ\Hº­~ñŒþ‡Â®}Àü2[Ѥ"·È»¾<Ézú‡ý« dÚÚù•è­‰–dv½ Óh¹ }3CñÑh¾2¢`TèìÊ'?Ò É° ®ÚÄS˜ªÁKµ¶ ¶hf…<™¾THYÒ:ÄÓ%ÚM„$=×ßQ?ÅÖŒ#+àïËcxûs ‘ñuì*Tt”i̦Væ7ÚCEæEEøÁÕ ç0àñd†QÈÝÿ§œ©`gÿ»£ü(A†ñ-¢ Gîòt¼€CZ½Ü6~dTmñ9óÕLGB»¿#n›˲çox‹ «Æ5Ø9‹•¤¢øuN¸ÊMÚ*©9Pzkd|Z@|t˜»º5M}?ï6ë^2‹½Csqy¡UWÞD‚"#°Å£R­z‡Xbaù{^•@êTbÈ¯Ì qF½™ç>Ä;P꣇CgÇ JY7–I 'Ù~>Ô˜ÅÞ…ߢ€‡Òˆ.WL´t´Ý@¿¡qC‚jx—;u£ÏÐòœ'eq€÷ªñ5 Ë0iŸ< rír ƒãâ²Dÿì´ 6è_EO%f«œÙ6¯ìÁ7낈¶´Øt Xw2Ì%šÌM­nT`ÕÕoPU-©e2­Tè¤è)-[N•7¯žpŒ=Ÿ’ßÓòöwüç Y¨øæ¢Y·Œá äôM®iÜB4Í]X é›VÉ9†ÓC–ÙÓ‡ò¢ »+õ®xÅ9¿¬@5îaþF¡(3¡ÏÒ¨dtM[c"Ä[yËñb¾m‰c©tÑãjóðŸ¤õ€¡+lëSí§+™”ÉþïÍÂkQ-[¢xŠžßì·ŽL6ž´HÄ—E0l#mÓ˜QQvÕÛ¤÷ð ­Õ"ª*š27þþYN(õKT:Þ'‹úãñ&ÛN¼©6Näé÷Ç¢þ;?„P`°fM“<Â` Ù$/ÌÓíÐõžJG=»ò‚žXßÖo'“ú¯Ç£9Y&ïÃi¡ÞBe²éÖº¤x‡Ó Ï^îÔ– û«ÈÒN‹ßQªlwÐ𑾺º¡¤ ²ÚR öYâOì@¨Ù4«Žâc¼NoÜÁÆ}” Ã4Œ“ä¶ov<¼zÆ[°ÙºYü&…e%~5ô µpþΉ¯yWrS2ÖB ‡†õWrH´æ+`é~vHåeDuFd˜ÇXŸ¦Ñ»ýÓ~oóqÈèî×â°7žžKäËÇ]µøÇ«2óS:èÌYÁsðËBÀÕ¢¤+Üø˜à2*Rynj¡ü§™ #"¼°áÝÉ ,ŒW¹ØÖ‹P¶¸¾×4LÚ N#óŠ$ÿ£?È×÷ÿo°lDÑN'[»Óv…¾dŠpš.s‡ú¥Y{µæ3³µ¸á·JøÛŠäu|äu,¢ÖY\à[0H À(‰•¾+/åVtW?ªkÔÃýø­æ¿'A !2 ¦QCnRóqÛËjò„U¶Rè¡Iç2ÞÈ ­ßµk;4úê¾)zñK~Åú^³ä” G’ÍXFë‹ÙGýðÄwH›Ö@Õ×ùÇÇeu2ÔÙôÀ”v,â;¼V'#^7N|^.ßS­À¬·pà9k¡ jµ.Zd¯ibüZ/X•úÔK¾rÛ’É;OŽdÕc© Û¤¿*䛤†+ÛY3JÍ힟ã+Ñ÷¶ƒw Âú"¡ƒÙ†V=ßÙ‘Ÿ‘7vüÇõLj;°c‹?žøÌª“¬<ZÁY „öæÃì%Wr%ÒCm“[ª&ðôQìÙ²:fœÉ[{/ý÷ åÌW—h»ðìyÚßBÜAbb# )vªIúwþy‰;rcTY˜YLjL ONö!^&¸7ŒÁë7 ]Mè…–þa1ùßy(¦²rwI.J Õ"˯¤ÒïÎ] ûרŽÙUsµstKpÜyW?v@Ëô™‡õGêftI&´ðÃHaeœ³ó·¢"è;k¤gsÁ]XÁîÁåÅoøl—.g”R%aêT#3–½ñÎŽ6/Ñ~¯$–  òÓ„}’ï¸ËæÎúÐëˆç—¿åjÿ„üLðmtƒýß@4ÃK–kÄpÿ_ˆ:„.ya$ô]5²¾6 3±fFõa1JÈÍËiiÜÓ"ÌÞû$nŒê!K.ʇæ†;¿)Ó¿èì„mTža‡Ÿ³¥™¹½ƒGEji§\êz@ŸÓqƒ“®*ÌEGT±|Ф_g¦´ä]¡7ùÅœ^4§·Úâ³alÃ7‹¤–1{ß *÷kAºÉÉØ lõœUA$úg%«n¶¼q­÷óþØÆGÛí‡æÏ ½C¾Ð+O9PKÒõ¶§OðùŽñzò÷ôq¹î{E~ŸUàà³ñBÂf–jó9)¦ˆ‰ù®1{úµ¨“ŸìÁ ú½Û̽Ýñˆ§:°þ/£>p…Ъ+œ„°Ok¹6˜Ÿ†².YœUÏ£çí£èmÞ†aJw,{k¶jJÌZze3…&©ÖßzY/Ñ•çî®ë€å 056ÓsA¨Ø07¤·„±_Ñy2G4– ™ÀõÖ׸Ä(õ$¤ׯ•íõè!{,cÖk‰a3 Ìhªá4¨â¯¶™Ã@ߺ3ù'iØ=Â/Ç•Ì<¨ýNêm£ žAh£EÏxËñ=/ïjICi÷RÃJDq>mÔ´.Ñ!=IxHžê^]ä©üµ¢¡…1F<ðât6´_ÖmÉoÞ‹(´†'à3ÙøÑK.íl]UeŸ tâ8x¨ÅÔzú2˜m qBÜ÷[ä˜íÇçO&M7rNß–@¼û2Û0ìŠwI[™%5^•8ÇöÖlfØñ¾!¿Á-s‰1³È:¨‹´ö»‚r!«ùÍd†ÿüòø5KŽ'E¼šŸ>d›1–’l ù=]M¶eœ›êSÍÊò ~„l56VXãvje,r‹0øÉoåtqŸ¾\GáhlaEÅÆïôbÔ– \~áÆ2¿%¦|µ"Ä™‘ýËÂâžÉXæÔöòÌBS0]`s6" u¬lµiõyd‚·'o(ìT«¶ZS®Ç£dqTåEsˆè„Ë!Œÿô…5ºþhÀWå[Lÿ1už,µÑ͸ l”­ëTK;Ló‚ÅaÚó6væ2-W4ÿí•hª‡x(ë!(݈žÌ„Ñ4X”€Vn§VÕ~ý‚"´3dƒÒôæŽ_ii¥ü«D À3Ðêfo±›¢Äµ «3/>BˆT?ÞR‹ÛÛê·a¾~Q«yØÐ峪!xjסg‡Gq¤¼Ìå$…²y—Æ;ºÞíB_T<á)uÌg\2·1SÅÕž6·ç2VµçÀšÈÑçqIó‹ƒDr'3ßÉéê=ù¹÷†´ëÀ»B ]øqÔ÷ÑXð2Gvàoí. ð–<œ Q~/CeÛY²p͉ѻJ’ïTËKáW_q0ÿц«0­…½Ÿ` ¹Ï'ÅEUrëµ ‚º3,ÂCÂÉ_¸D¨5­‡U“ ;.·y GôB’(xâ•ø¦ÀKNnÈ\aë®AA°‚8ý[ qsX–°ÿaüo•†1Ñk»þ¶ '.8qED¢dM‘7ëg±›áLæRs¶Ö y.ÜÇéÅì²6½¯q('S Gá,aF F\„±óGÍ n4Xô a¿EÐ^üàEþƒ®ŸltL¢²_û¦[÷¤¸8–º´ÑJ }>ÁÉ{®ñ•8ÃFrÕln\Gû03•è\?XP ‚³“Ùt×2äí…Ð@!ùÿ a‹ŒûaýÌkäoÁ*Én«–<ßVÂÙ$5:àg·z¼2~¦rasÉPæ.;sêrúb®]Éú~ÏrÎîͤ0l£X¸Ä– Ösóôñ¨n‚ÚaE ðDÕLou¯^³eU¼ï}m? ‰u º¢?~è'VÅÕ¦¤ã’(:ISÌi#á.jª½Ño›Ôœ€‚eCèî"W)ã¶|ÏØqÁÂíχ” ¨Z…NZ5GÍ&è|f,òà×bC›”& ²‡+ùŒ2¶…Ð *tE»økMì3ÄaàfXòÁ+J›/™Iîæ\ñókm)0#„Í [Ò'|à¶L2+ø-Òé ó*̕հ)bKÛ:LÙB\0æ9ëj¿ˆ Ra ßPÓù¢œå+¹=Í2Úà7ð1awg¬UtÊ—ý2¬Å»”nucëJ%1õwó‰Ä+±ÃdÕ°ñ“=`€Å¥A¯œ¼TU—SuŽzŒ-O%ì`Ui¸u{þ´¾R+¥$Õ^à(Q@a52„=Eñ8ÇÅýjýËÉp#@2ÇkA æâùõH÷ &_“d1£€BøåhÎ÷©þm;3Bô&B˜L1…íQ«IÆÏ}F‰"ÌDpÉU®Xû6’ªg¨7`°«µ[੽"ß–jŒÞ´¨¬ÆÝx$5o:ó8äsôÍA”¥|‰ÐÇvgxP¥&q3suº"¢~Z°qi¤×²~íñ“ +µ¿ýÓÊ×´9Jì ÃÆ¨ ü.ã?jE$,.¤È½£Mê6WŸ‰µ~ßD‹ƒO¶Ìïê‰ 9ñ~¶)C„ ²Ú'{Ô]€Râã#mOÚ/kd®ä`×¥Qp,ÀÓˆ}øë¥“B†Òrîô‘êìÙºøOÌ6FS„ Ó1¦|ù¼ß…ôwQ)ôƒÍ0Ù<ì±­{ Ùn¼ÀÀp€˜E…¢8½?ÎuOn\†5† ÜW ug¹y=cƒ„NUVÉBŽù¤o—6^“2­$¥C]X CùùD“yä‰V ó\¬g. º¼}‘:Ÿ,ε¶ GLå…Q²ôŽJ_ª BnÓ^~2AÌ$õðWÐççd•­«X®Ús»ÉWS»tÊFΞ)…¡5<Â':©ÑAHðóëoa-Ia¬¹ÔñŽ'¾“ºÖþF¯Ë:¯@aá†ïh e¢[~—P Ü­ÔÞHØC_k­üxGë€?c^EDÕÓ¥Ý]ÕXZK£F€«UŽÁ_ÚJ%gD”þr&;Ü®´½îk&Xž§pf[„ ¦©Bƒ‚h”æ¨FŽö¤ytú}Ø5ÖƒïÑ&´ÒmÏk«¦>  þê,oŠ{°/Ð0zèv~:jÛX¸ë¶±cXuÀßãÎüP¥ÐçéÙQzýÓmT^ybˆq,Yô=->{>ýo,|Kœ«/!½ N: ›‹Œ}E¸UÅà'®÷•ª±|³þ&JÍPh à×3¨à°î´Ôÿ˜®"Ý׋´g£Ûïh¸!ØÜ_ÒøÙïP¼Š ãÕpùÛ`–Ëh ¹ë´ä/Ú«4€uQìðocÎåÔDÃí×1ìö“:ÒÉ+®(ž0—Mr^çU>ßÁ[äµ¢ÚÓ[™8@Gì™|'L%e ñí—¬¬Û7¼¸ŽÒHÔ¾žÞo*k7“)›úPUËÐæI¾o¸Ð¼ìÑàIS rNƒ ÙHO÷¢ï!ų š‰æÜ)ø¦Z¼¶ð”—FÊM¨tÉ$9‹oRwu&&ʲ™.†“¨›6¯L؉ðJV:mÙO«Š1_oU}›¤C#x>¿#ÄÏ GýÉò®hÕE¯tÞÒâLR¯‰:ÉD,¹*»£mrAÏC~CpWs55°BG¿¿í]¸‚õÕûpU”ºÄGòLeêzBPM=]™Ç‰=n À@òéö¾ÎŒT'³óÂ5ïí 3ÛL:.%—7GÍ,ð©Ã|øÎ½N—ÍgÅžª=/`¨$¬¶!¹|Ò9[¾-þCËvÅ·é÷øÿÞ.Èz[é–ñJŠÐy³f:fm#À9ÇÊe´© ÐY¬GžEhIÃO–©¶°1çñVk†ó¬'žmOòãFÕÙÞ~A»2ržÒÖ#O4FJÇC™P,„æ{ÍÜoJN蘿Á¥޲ðí×âÐÌžüùíª~ŒÚ{@þwÏ«eHQg§ï¸Ö¾Ö…^ßù„ޣ˾~sÿÕ“'cH7xcÌtÉö.p#¤}pJÃ夎ö86W-wmÿ…KÚàŒâï Ïʯ±2;U‰‰N(ëòixÛ”f}Ò;«Ü°W+ØfKl¹Âÿ´åfK¯ÄÂâ@gÕ$çôÁ×ÐØQI2NÕÂ4¾€yØM¢ÏÍÛ~û®„6žXA»|xɲ3ïö*ϳø…¹¤§de'È‘­Ç–áýFÀçåê!AÔ¼A¶rÁ¢B#±½­P)…à³ÀƒçQÛ.ßš ð«Ä9&yÆ»á….«o‹Ot€äÊHg bg¸¾*±MY¬ù³<ßL^£¶3ágh‹7;Ín`rùªË§B¢©}âkQb¬M¥ PøÉ2E¬œÛbûw"ž<[Ù`.ÿ‘ü¯ªRË-òÐ *«¦Á ï÷·(ØTÏhÙñp,ØÛÌÇŽ`ÃÌò޼€ákçAgñÂÃý‰ô„]NÍ€äY®266¶jø»iݶøMëár܇^ûTƒsLÚíBóHq-ã.вŸ‘æ1©¾ËÑöXO%}Ãìh©š,»®‘ô[p†—¹‹ ÍY÷¦= …ÓÅôD¶¥¯ ň[{ …Ì9óZ½ÜÝ+OΩÎ*¦$¥Þ†®:“¾¶®j1§ÆQû¼QX­ÑãTbÅ5~~*P Öþë¯ë%=Cœ‘:’Ù–ƒx5õµt Ã&Ö`hm6n#"âôt)Æb>6×°0`åãìeÜݨ×s&ZiBJ¬~ŸgßDø‡ž¥cpº2[m7 ,îQk´ÑúNØj0Œhg° 2¡fÜ._Ÿç‘!sáŠe‡;pJ"A¸æÎe ©´ä(š–?8:àÊ‚@èRi™}×ú´¸<€7")ƯÑÇI‡“d¯ÿ¹’E~ØÉ8·&ÿ8+âê“J­÷ð›Úv0W±V¤öÇB`×U‚Ö\IôÊ“°T Djÿ¹1G‹E-üDç™Ý´ò‹‰]F¾õõÐ?Gþ¸ñ–C± D3ï™—ó£±Å3b’¸”VÐZÙO#; "“ä-½Ñ£µ£ÚUP~»ŸWÓ-s^ãwßÏŠØ;4(+\/æs¶–+•>Id;^ ¸gI1êçŒÉÿÖÙ$×Á­× W|¢„#'ƒæí¦ï¯æ›ÃdR3n­ "Süh 1„2Y™•qA/ŽHcJ8j$”ð¡Ë 1£§¡ƒUQ¸ÐqŽ»z×F þŸH¡KYá#.#Ë©ˆøyxÓI•ÿÜi8Ê6=ÃD©ёՒNû} ÿ$Zkƒ ó½|‹˜Q&8 \ˆ-ºá÷hvmvaŽ­`XÈSBõà Ö}KD^Fx«<Ѳ¼m4³¶²IfÍ(6Ò´rè0R¶< šèI£|pØ`VCçÒéß>#_ðþ’”Ïf:“+P}ÛøÄð1GCT^i9×ý¶Ò9úQ {j¤¢h¸ŒÚúVóç×µÿ‡[pAºL$ý…Ñ«ôqÔŸ(\KC]¿C:B$Ÿ?ýñÈÂ4?a0*¶,:Â` ‰Ô2Ý6Ê–Ìe$¯—_e·zÇ•f‚¬KÍ>­¥êÖÇêBÔŸ88Œ Œæáš_ŸV¼õp<ßì;ÿµƒÁ‹ŒÔ*÷ÏݤööA: “«Â€›)ë›g´©3¢V"Ĩúïç‘A8$š}˜Ó §o€„iæ¢îï˼h…TY–‰VTÄEÍgiï^ZQ~G﨓ɗ"¶‚&[­~4hzOR'+Ì3“šÇ4Pf­!tKˆ/LªÕì¦ì`Ì—Œ€09"¥EÆinpÚ°$h Ó!%75$Kîÿ(Ñ›pµ)Ú0Šz~¯Ó„Ì!¸ÊF/»ëÓ®á¥WgO>’ÚýÑ‚Óhsè˜Øo$è‘ÔúZ} ï(QªkRa b‰Ê‹fS»ÓÓùS©²$va‘Ìû,̘ÝÈØwH¶¯)ýI¨•óä™ÚÙè.…)ȯ³¬œ. Hÿ÷ÙÀÝå£0•¬‹ÍIø éeID‘2|ð I_À–ÅÊŽ%@56~ÂÍ| ¢à8ý×ï`ý²+HX†Í?–|GÑ„Æå: !SCÒ³Bõ’ow{Ç­„Ÿ™HÆdÕ['æÐn´iïF°±*:ï,Š’ø¤–ë¤ ì’\mívÿ‰¾ÎÇþ¶ 'Bˆ¥Ì.ª„ÎJYˆî’‹Cë²€ÓÕ;U]m^û ¤œ0’çDS|• ÔÑM2ÛÌÉ1{Ù~Ž$p¥»o¹É$ “ãRå®Ä\àýxÞã /ÍÚ®v¤aÖ›öwJu>RÐö¹ר5’¸Ÿ_,¨Ë½jQu›äX2ñ"ˆõåÙ±!â­á7 z°NÄ5÷UäöfcÌi°ÄtéÀ`› v6Vqó7S ci÷ä©íÛÊ<ã]z±øWWÂIŸ5ÇM'ý‘ü¦ê‘¸œ‘ò—.ZÈJ«?Æb=Áá«÷‹ÖBC)k²‡ÄTñûÇ,¶„7š*”ZiÙ>¥ÁÅ Ï~¼vyD0⨙tÛ#Q9üWHn¤0fO¾Š¤b#N]9óZRïåz åoÃ{‡”ÆÜL<¿¯ZõX²Ì¥ðoVλ.Úì3³P.~aŸ4`ÕƒKû”7~ƒs+[”<\e p´#áÄFåd?á('P*—F|üñ«q\ñÝÖryÿi¼§ß…ŽrïÕþ7u$Ÿz("Ž„_M„êA{1ÏtmµgÖ3û<Ô»èN+©ªE˜Î Îɻؾýàù³Añ$µÈ١ɼ¢Ÿ×J­¾<yy–«÷¶ˆgYk©åAŽÔç¤éÝh0Í-, æ\ÊÆeç5†ŽÄ:ºö2s¶Ê‘%#¢\Xh/&OMËmÏ€›+ØÈ&b'¯lÉç7 µïF×1䮸PqQ‡ -ˆuïóàšT(Î>¦€Xí˜|ã®Qœ´ù|çUýLYP•‚^\kÖú…ÄeýRX@b¤JaP)¶(?UQÓfçÿëó‚L1T{ IéîMz|Å-·dóùÂÛ¯h†$×`¶Ç i2v¢‰¹92V"yPÉulÍþÅ®zîŽ\Œ ÙªäR=³˜Ek œ?; ëÓ(Ð ˆuc:õ× ¶!àN•N.<›µ!8;%¥x¸§—Ã+´¤oPê!íMVÑÊäø¦Rˆè¬9ßµÛ ú•®òív㕎Ñ×M<Ðvc°àðõÞA_§‰îàvuý¿3•Ý‹e>ŠÔ¹R€ÛG_&èÌîdˆ z"j¼Ú4“64·FÝYÓÒ;¿n Ç›u—3ƒÛ®Î‘.\2?Ø#ǸKýI¼²~ã5Ã74AÞäÀ)‰dö”ÜMYf‚cêûÕˆo~™Å šŽÿ™hðÞDŽJ­/FÇj¦#¸<` ðJô}áæŒ5Á/;]6Y=²ïpyÚÅsoY'à!\çIò-Ò µ2†fdKÃqU”R°qRêŒ\„w™)Ô<^¥Î(/ÏÝï H[# £¤¼ˆ÷Ÿ—)öÕý}%7î^£ÎÚµy@Æâè$RAï Cr.À…]ã–9+ë,Ißœã''FÊ5¬hö_2 ¡ ÷ÌŒƒ#–&qÂù¾Dö¤K­bLÜÙåëéöò(N.;³ÙË Ê¢Ë’1PTI÷…Ùü¢Œ¢jLÃì0Öò(õ¯#$Å“«G·Þ´ûo§½`°­5ü³ÀòNNi“£[“{_Ðz,Ö¥l ì\’ Ë™ 4Úwzsú›TȽGò•’0…wx8J^ý©›Ô–GM‡+¨Á¨¥pŽ“¤¯p6ìv'ANÒfqDÓH{÷³ÞJS†—4£ÏI2wh3O踟 e;U—çCÍ™;yT"Ž¿Á*\S˜ÃóØƒ¶|Y¦R)̼„’bR°Øð¿‹Y, Û‚øæ^ÊU>„ÊC¨1Ž,§[•÷~›cÖï rƆãô±ö}`Øéu¤ûQ€n¨OÒŸ3Íì¬1›žÌ¡ûIÃA9c&)›aŽ]xptp0(e#KæÁò€´ååéEû}5)§u!ì>äwo‰"øã’ñA9lÆÉS]–ô°Û¹e¯ÖêA a¥ô–£Ùë´¤°¿tИ`QqZÃ:Ó}¼Ÿ‡³--”òˆ©¶*. AÕY2#¸ìœÌeõY¶ÎÏ;Ï"Bw·ô,9Ø*ð7,1»‘^ ÷cæ_ô€#~ôÍ7ÜKðä•õÿ—kF´@a„Eû½sK€OïÈÅ«èËPªf¾Sc#LëèJvŠCKÔfk ¦&òM^7AqY§ÒºxKŸ ÊÑ6áÜÛêðز|ŠaI²ÒÏ:¾¯º†·j0ú™å>1á< ØCº‹Ã˜càJx'פàëq°¹ëyŠÈv¬0 ¯Ö6v§ˆ*lÕ+bݤžN|ÎÇl×í ÕD£ÿžèÂWQÊl’/ಥ* «y›v8ÏÎùs7î=` ¢çðc¦ŽÅzò‡KÖõ; Õ –'§–31@ñõØ‚¹2÷L„ºÿ 3VðÙñ‚ßRÔ¼O¯‚ ƒ™à”sÓR™Ú3웎*ęաÏv$ùkÄïÌuHÖ?Ç‘¶PFZšü2„‡!è’ÿ‰×OnÓÏMZ‡ŵ*=¡4 ÷ñØ^±W€]âc5)ºf¦ŠpƽtåvMdY’yu7vµû¢§Ð’h0I¹ Ë* ôS¶!Rðÿ?rÖ``_’(«f ×Ö‹$JKBªÝ¼Ù™—ÛêÂ=³}w~Xã Ò·7Ð5,s?e,#Û´d¨‘Ïè[Ónæÿ‚ YTØ qÕCë’ìw&˜Á_Ñ'¯•,‚aóD]zÁÈÀZt o”„å7ŠhFWu2¦Ø*j;Fèê²}¢%‹o°â4>ƒƒÂ©õüTGn:ݰŸ8½ž&®GƒÇìCÿ”}\ ¬ø¢^bó ôÒ ƒÿÎΙó‹ðzÇZÍú0+„û6öxË¿}Á>G»k˜Wc’ žÜöç>¡‚EFi ùhT¾ {ùÖC2D-Xá¨X’cWÓCÙE:ºÙóVxQè™ì1öPØ@ŸFòÐ%+¦Ê¥t¿r6<µè ým¸êbíÙ“ÛÃ4gAÄ)v­’lî‘¯Ý [41¾"Äçñoµã¢ÿÅZbCCÌR.{!I! ñ¯ñçYô& óíaÞT5ÙKñªÉ8sPš*ÊO§]l~¦¹#Û_Ž5Ö,5ÌýÒ€×¼ˆXiL¨—MW`ëxÊeM=%{Š–Gµb/¸ú¦æÃxÛµ¥FË4ê½pÅrvʦô±Ej(•Ñ#ö ÿ×çÒ-ˆ Ûîî@d£cL S¬BcÞDl®èRF´ùc´õ§LèÄ P€Tɇ[©Žwëcäl²SeIn$‚Îa×n°°2kÈ!d±ÛÈËÅ 8äS6ÊQøÍ\ Æ=™~ÊbÈ^=«óím©ˆ˜žÉ´³\:›F¢ȵ]Ò<Üj–U£°2ÿl0ü CSÎjó‘ñ *âmÕË+Ys¸“_&Æçe„ýLyw&ÿý/Š|m ¬týr”ýGÂF WøŒ HÂÅRkíWT°Â$¬~/QÐÖ^Ös®øûú‘SöºÉËêìæ|¿åK®|‡·=xÛX±6–`±óÖ¾‰_Ù'M{é’¸ö–à©"Ǔ׺LJ1Öe*j`îÎ'h_ò}ü8U6&gÊÿ}’Ž÷RC_ISGZéùzo8TÝ^ÙË=õÓžÉS–•HÝniz„“ËÖ9m:È‹=› $Îò[J²<ŒlExî¾!ˈ“Ò†}ˆi6ƒYy,ž¨Œ²_† À#<¸ñKŠúS×ST˜ð…APÈ‹+"¬t ¤zì8mGÖeõ.ÀUµÚÝ 8ÖÔÚyœ]î­A›âú3^Yòɤ©C,Mæ8@^&–¦ïˆ-¡£6‹ôûNϪ)®È Kàf:y_6±H.äU¡9ª{ò°ò6¼Ù8šE´;§ƒµ€D‹ î€Y‹œ¨«nlúEžº ÷4tü7J§ãõ!jÙéVÒ§™¼Ý‘Òm&kñO¢Ïw´ lÏÒÑù5nöpê¢1¨Õ àªôeÃéŽÂxZe&Gm;XPâÿ’Û{“4åPû¦-Q«yö¨¢Äòf0©˜v X"c;’À›‰ê:Óâ1ÆÒöË~`Ž—õEË?8Ï8ƒ%÷Rý™EÅ=˜åcÑ–{ñJ“wrž`½*³.¢…á6”i95²/®~ÒØŒè#ƒÂ?ÒºÎÛØ¢ßYDÜk_©¡oš3tpŸûƒ'·&ýúLqù` <7i q+M‚YâB$ú‰†· ›8ìmíå­¼qÓ<’éšþøHúyZ¼•Òa;èþ¾¨!Ðø—.Õ …Ãæ=A@‡í;œ>$=Z¿y¸õ‹}Ozlo×è3²»Ž :Ù ˜Ùª°Fئ\(bû»6dhbþü~ÿö®âwƒ9QÕ#¯B7”o-ò.o‡ºl±ÚÁ/µ^u«j_9;³9ÞÐÑKÇÙº±Âêë;y¾Oª¶iÒb_£Å.K2–Œ›ªÄó¹Ìt=JºY ÜÕn:ƒÑ ù39VBìJµèumd€ªÎzÉ¢Â÷{ +ßåjÆ|Ç:QîâüŽ,Ž'G2ÐR¾OóF­ Ãôâ÷íÊ ¶kÏ {ÐtÜøëþ¿®> ÷8<@3›˜¬0]-jÐðcq‹s¥=‡K·Ö}#ä1ŠI—ßk´¨R$zé'øö V˜ÀWù|úJ”ý{νÊýJZ{W‹Wѹ¨, †©B°­Þ¥4À?Ë!œÙÕ0Äó]lªôq$ã Þ«ñ„ÿ%FŽÓ¦å wªtë£Ða~pp&Î)G«ýtñ¸2‹ÅdW­yq§õ‰ç,o™^ d\Î À–O:K•’ ÒG:7(ÿzHv¤k4‘X¼¨¼øÜ¹‰PWyr%&´=´‰™N*=®®VV l ÷0ÿïã†ÏÃ$íQ1KIþ‰ˆA½ò•Õ¯ 2c;F2u”K@ñÎd×¾;gåª_Ú‡•ÿn{NdJ¯Ü®¿ZƒžÙ9Àõب^RÐó)YŸ|yI‰ï°z°g?Z\š#²{`üG,ÑÒ\{GÙ@ú¼xÁRù7mG=“»Ë  Öv}°´ÇTZ÷qbìfc•äÖì7µ|þŠ×Œí^‰Cé-ÛSö=SæÃhýKœ£¾[Wþ|†6du0Þ±GùSW?̽¡ºQ?˲£àé9=L¹{L€Í~›ðjåeÓZ¹§ÎQáê«:+U×nús©áBìðÇsæ• ·NÏòœ×M>Ö^Fñü+nl/8 ª¨hU,Åq±´³±Õ°‚ncì‹¿µÍâ$®m »‘÷ÂÆ´Ð/—; Îw—yq·o±”VápzèÍX¼qyÈ “‡D$Öà3cƒÍíÂä7Î*|6•Iߘ³œ;x¼aÓGW|Ï*Ç‹*ÄÕ8‡Ï&;OØŽð`¸‡s<§­Ío˜ûžà õJ¢EãS9ò=El¨_›\c2àÿô-K?zýUKáõÕ mâ4ÒNWæõ#™eÐ0 9Ûå³ÄsãB²eóp€]ééšú'T‚ýiÕRξ 5Ý—Ñ^¸Ç£¾h¤%²®Ì¬¸fqòÐåzÈMóùDűœ;ã׉) ÞnCè˵ZıóH PüqÕsKM]ðŠžk >ƒ­¯f ‘ï›Ð%;õTVdê| íî¿Fö6®•ºÉÚJ†™p›§ÄAf~ªÞÀEgª¶‡DéˆùÃ!Ôi|ÛˆØ~­Ú?ÝÒ·”ËÒ€é8úÁˆÝÎ)—u·cp³4mêéjeÛ Ï›ß¤J¢ÊÃÑ¥ß6h[à¤ë»p ïx®^!úrq‹TÏ€ŽÆ+¶ÿpáÞ8P⎔º¥Â”ͦ*TP&GPx¬Äî«×Ì ÊT勈Ñ.Ì•5FÒõˆˆ–64ŵ‹Ê¹lZ"¸…;â`•Cž(1 ×¾{ÃòÔ§¨ÙN°1A¢¡ÐŒÏ“±½x™ÀŸ7Ç®Q©fXòš@­àÜéªõÖ&·½ßOt”Á ¬ë¤‰´÷MlŽ0n±ø¬Ãcí¸MÉ{}ޏ¾›Óûþoqgý1tüEA È7Lîö­£Š°ÉÊåÉ BcñÈmМz½àñpmÇ€(íþç¢ ‹»¤˜¿4Fª!SŒ–-3ÂÜ,ÒÄ2+‡°Rü½Z ˜°ƒÐsm)leð^W÷ ›øï)>O£}öd",ÿb}'ª)Ýÿ“m—Ë ÷ÉŸùX?“cÕ»&ûY—û†Ë;f¾úwP’„oü[íĽa˜à¸Dwä÷Z|ý­Q(‡7}ESÙB§è_§¿ð.û»On=‘ýÀ¿ FÝ ²•§ù˜/¹>Y[ÎB~$Q#éM¥VKLã„Ç™$T]Ì™Iúº˜„=pÒXˆwΫ Þ}ÚX²‰Î,Äíg«02‹ï˜…‹îºH/Òb"ou˜Àex§áo%3ÐA g}³ä~EmSà’eå9‘ ¤ž¨©Â€=!'ºÇ¾ª<'X * rœ¾š|•ó!Žöv©¨4WcyeO²;°[æjšàˆr5 Úßwåë×14` ɶhw­q!âú+=¶|!ìåò†¦W:L ™†x6†„Ãv z’3ÀX€ø”¡;Û] îfLè úZ£Ïžü$9·8¼E†…ßcì¸SKÓ?\“ÑÆ1ý ­ .ÃÓTÝ{ÈØÃîáÍT§+[ŲØG}­`Ënõ¥,pO¾HO;(9²¹Â{%à® Âfæt r‘“”Ù¤#ˆ¤{5ÍÀZùgÅj 05o÷=vÀ:_˜ôº6Ø÷5á‘ø÷œ«ntü,„jfcÿ½ÁåÅ‹†ëÕNOp·3Ú ¤©èYµýÔ˜kAS÷°qòôºYí@æÝænœ‘[Ä}èiŠßàr©öð´xŒ*…MÄ#2÷†WÚ®n£ dÿq¬`ðLd‘A ¢ñØm7¢ØËƒGHÙùx/¦‚çÜh<“EíPÈPt\ àºûñiçÉê6 ý£ãnê&IŠѳ×Yù ‹ Ô[á>²äp7f æ ¾ýäÂã€A/ù-Elæ¼Î°c¬«ŸUlÓC„lìú4lÈ[Ó°Ú ÕŸ²¬¢©¾Â¢+D äŸã ë:yVG¼Î)†pF ûd–@d;¨%22º*äª&ON[·àþšŸ%Ôx¤µºÈGšN[ÚDo~„Ó.µÖÙaB"ׄÍÚ;ÔšE3ÜÍQü†ºí¸ìÿË¿õQt' äøV›ëzüY@Ò –5„÷Òõ:*jóýÅ8 ZN·×óÕ(&¸Xa4E,±<Ìs/]—†•fD@õ‘ÜÞ] “9L N4³<eÊMµMTXâî|1 R¿ú²z¯½@Ò:•åþ…¸œ¼ÄàÅÊ>6¯ÑÓ}áÄðÖ‚´{hfm¢7 ù'©èd®ž ™—ÞÒhrú\é2¹vyáÊ£²µ¸"N?1¸šÈ‚ã' M¹3…Õ`{ݬD)Åv±ÇµÈJO‚ ð ïæ\öîZWf2í– Ên;«ÉΡ;ÒLèÄ}¬‚=sßűkN%8>%5¿4ȧªóŸòwØ:–üëúB†” ÉñŒ%©‚sA5ïô6¹BôØnº-$—¦E&Ëðdú‹ônĺVy+Éœ`\§N£ù+¤a9ÈdQ©É5ÌH9ÛÿM2ŠÔ¡I²2¥_/z @žšáL®¬ Â;±ëfNA½˜†Ð%Ùöîu,A v5“• åmJY°ïóÿ6åÝ[”݆ÒÊú´MIN€A6•×d@™…7 ¥rׂàÐ&÷q¨OûPô}«AVö­ö6˜ÄÈ€RshâóNøï¿RáÀeà€)ÐÓ‘©8ññaPg=䤓o«#6/ ƒ®_Z‡^î´r«”0YÜwÜ5ªß”t6ð:V +ó$E2üŽçÔûêÈŸéYM4Õ»8Öfâjš«B›¼çªG\µ5}uldä~ JJ_OG@)´?ÜŒ‰DÇn« ù›²”·•òqb ¶ÿÊÙJÞTo^lDñ VpŽÅfI]¦¿#OK§nYã£æ ûá(××Cgì<+@öéâÉû.9jåíÏ**"²¶N“-¶Ç$ޝS_:îN¬ìRò³*)øˆx Ý «ììe¨ÕJ $iÑŠcí¥þÑé¨ÉÞ)Ž‹î¼XýÙòBhj9zIžQèÃ=ñ¯½›†ª^¾ÑäX¼«zhr&GŒ‡ÓÞ:`#TýÕûCTáüuZÃ/¦PòÚèuq÷—‚ºíípBÖX«ß¹¶gn¦²w#ãšß³aßØÑ¨Ÿì¹†ê˜aîßl˜b ižÖÓ”Ò9ô ƒ¡iwĪÙCzº û6^cç`H1Ó86v¶¿ в-ƒ^)´i_Ìsý€¦Æß|¬ØÕŪi\X®óÞŠ¬^¢! ù@@  ÊjL¶ŠøíŽ›MéøÁ•e)G–’Äë%ºûvjK¥µ Y­ÿaš˜gøƒ©¬‰â{Êæi 6¼‘–õ¦L?l¾¼é%à"WµŠ˜Ìe”å¨/aŸ>³eJ†cs™¡N3kéËTŸîGü¾šJ-Dª†ëýÛÕùývcÒY>ÆïR¢sPd‚4fÞ@ejÇɶ@¯ó=O½âˆ]DŠÑÂÔm}çLê…|ÌÄû¡zV¸ÒÓuO¹ú6‡¢ï<Ÿ ç’Ñß”é‡r³ä¯¿ƒAsv˜O›ó”߈ ýù)O!aùrEò2òÌÅÿ¯úñARC^ê[9ÕVÔ—*ÍÐ)ß*ûQδXÒš¯îýw @&xBÜä^8„/oß./Lk¼™[£EÝx'À>ÓeA¡§¥[â£û T .r:;j™SNÓ/öüŒ–Þq@Ær6Òr[\Ž,V>`Õ¢Xƒ¶¡*‡† ŒÀ’+`KrJÍ~‚(ËTNxÒODœŒæòuÇ©©M«Ö‚ÕÕÖ<Ñ%ô›@4¯o`îit°òWÐ=b¸õBКø8ý_ùzo·ô´§ˆ¿ r§&HrN|Ú×Éæ-Á|l·Ç\w@ÖV¶‡es®³\ÿvö—ε‰ßººosÃYº€á5©×ÉY}IñU ?¼écA.Ý”€øŒÕáÝ™$ùú”Ù1¤Ø»¿±žžÄ]æ%ë–Å/¿^èÛDÕ(6ž;Vö ?Ç$1˜æ¸(Ì4¸¬íÓ>"} *ö7žˆöØ8sC î'"ü !QÅÑüM­ïÓþZ°KËnòØu¾Ï.ö †“ŒgЧ³:ù¶OŠWmÅ®¬ˆVÐ9õ¨æ ï«¿Ü3ÁÿIYô“ÜÐyÓH#cªe»¿¢z¡ƒT“ë·„y»e±ÎRêÛXœúrcGÀÎ[†´tE§+³KG@€‘œçLs~(]}ê„þM-u±à7ˆ­ùMDãË…ªªû_MÄ4ËEåG"¡;áŽi†rÖ[€ƒ¸«÷h8/€ƒê³mL¼çMeá‚`jûã€Þs;·ˆ-Ü·Ê×+ÉÞøSèØÕ‰¤²xQXÿ»v~Ô£TÞ"KÇâžPI±åáÙ³,ØÈÜ(Ž…Ò­®ª”Âà{„ ”íïaA[·Ípù·¸&éíH—…Ä •Êë¥û,Ãíe?v÷—0·ãõtŸŽå`CË¿,Ä¡­B§’!;ŠÛeÉ Ï•S E—FÙE7 ¶¼ÅÚ; èVÈzýIüúèñò‹½€säIÜr÷‘/Ïzì£3³#äå9?ü²TøŒ žÒGõaê«IçA£Sôç>¥²Í×ò¶XÖ›bÈò ¬è‚C~;Í€Ñæ´5ƒD™¶^õ“*Î Æ›6(Þ~Ú}7ÐÙÀÍ(¯Ð§Ïûûѯ°=·­5µ:èT ¿?lT°ÈMZü6³ÈøoéỎˆPæ•×®~„ Ë:àÎSF"”xloC°1°TËD ¬;&¸mˆ®fáBt/ýYäöé¨òÊG~:HRgý‹ ¿ûFQI_„ –4Ý`…2š¤Œ=¸=ìÚYh!ø‘ªÈKmæéžm²•>(' ù ÷J颃näÞG>µ+héÁ/…Y¿Ëߥѡ3î ž‰ðWôŠ:ª¾¤x‰Bpꇵ–? {fÖÐîC°¹Q`ï¾ÞïÄÙÌTÝþà¿MÂF½í]xйpÌ~¹Ê‰äú˜\áRÁ…Ã%#Ž`‚½³²KõÄ¢ÞʲNº¨][%–,,YŽ^[¨æA^ ñ:4¤Éý#¶ø¥»ÉtÉ€\ÏÛäÖ²sñ­…Å.1èÄ<1ŠÍ<„igˆ*•¥<¹TÿdW“ÌÍÙÙ‚}<ÀÞW.ŠùÐîauê-CnAy8RømÒ€0ИJ7ê¹aù&ÏÙí>ñšË@Ä:ì<£ ç £V"—à|!€>{ojëxŸ0 ÍRÌðâØI Öì`#¤n°xJÿ¥)k¸ÿàTÆ/ˆé¶ Ú™"ìI”ÃËÉ»Á.Y’ɲګ¼o" 41Û-0OÃM´–¸HÆÛYyn<ù+ ¯ßÄ7=HõšlíDóø¹ ½è4³ÂkÉ'Zúv×bÂðª$ðü^…¡H ½Ú ]ܼ:ÅŒ×ËËh°¦ô~PÙV:0÷Z'Çó3懜9)džî¨Y¨óe«„ÈØÌýäqØ\?ú!üW‡‡$.¨WѺd%”.æ¯I÷Q[¬ðl;akt…6ö¬cO M‰ ¾k‘+ þzäQïXX¬¸?‚íCn3àDôžÞÏI7åØÎ˜»ãçLö î…ÐDÍ&{©ÙpÛíÂT·AY%Áu+Ð^ÖëàÔâÝjYK[ë÷*œÏléæÈ/Fô ‹]Xü­‹×m¬ýx„Y-+Þ‚(ÌF¼äøt¢ØµeeuÓ] ` »¼ã¿ðx.ß ð“ɰs£ÌQÑ×Hî*—Ršð5:aÈÁ.5¾4ý‰î˜Ñ>‘ù¥µ.«H¸ï‡¹!sl!’hE÷C¿ñ}²ÏÖ­iVµFS¤Þá&fïrm¿Z׸¼4U@‘kTAd{ks>·WÙD…ќﱃerçýÖ¬»m±p“sÆÁÖªæ:]3ÍÐÚYÙý[qKô®VE0@1®­ ‘Žª5œõ¸™Iï’h¾^›ß˜º4íê«Ö",²µþ/66¤¤ ++v"-“K8ìØò¡–zCI+r¡ i vÆË7N;¸;xï)ê{9׈µ»dj)NC8`[û Ïõ0Ó²·ÑHY†Ülœ|”oÎ1Gbª÷GÌ"dК"Ü!{=2‚«E)Ѳñy&.Tøø^Fyµ&¸ÆW @¼AâØ0„Jðòµ€¹¬pàŸâò–—Ç)ÿ«RBg³<˜©\”Q¬ÎbÿBn0DÜÏIz®[EÍçr‰±˜d,ú4ãܧ”žÙ²Ï±4¿Ÿµ{p'K»Ìi–¡È—œù)hä*àô‘®’¾A¼c‘Ψî뵪<’c›ò€TÛ Ñ½™—&khú$|û=l(;̼,Z^lΉí¯/ã6id;‘7 A'—úô?ãØo}vÝ&ŽªMƒÐÓÆø¨,½ÉêŠg-Ūy@ÚC#QÈ{ýöLé6ŽÂù”ü´Œú‰´RjáD4؈¸4)‘4Ó\ ã‚0µz÷\ó»'£2¤ ÈF¤Ý]5p»+_£K#Ç+pá±FÍS‚f^›¼rNdèíêáéfªØÖ´3í#înÆU»„ªÎÍiŽ®»Ã‡2ök׌˜,°/]£?ØW=l+÷óTËãQSÛóCé{¯Ë”QqgûM²ºA­» Óè´«É,wö·BC Ð.ŒÑÁ©™ìcX¦°"cyû´¡4‹îÓ°zÐ…ð r:NpüÑï†Q3‰³¡î€(•+dmT-[)éyºüŠñ´p!!Âg[ò}¹”žÂOW a”Ñ'¾\­h•šãߌâоÙñÒå.¹Å€Zç4)„»bÔ”ç!,žð¶Un}ŸžYêrû‰ç•ŒðްuÃ&³"³Lk¯=ž'´a-nM‚ w‡Ççîµ´]æÀ+¼^ë1ªK3˜lh CR 7é@ÐÚÆº¦ÈGg€¤½»¾Ëp—?){´’‚iM%q]§ðuÀépÔpÂ_Éï H=f€h£H§8sˆûYàà6`ä[ßoc°$WU#[ï„óÞ9דHºº'âï`_,‰¥ð#àÄ'¼#Ý/œ„ß—;BÄ‘ÆìÐ$O¢zxÉD£ßâN1?BîT‰Jgû7ýªæúà¹÷‰ÍX'`|n/Y:›XaÜ‹³kZ~½Èh ŸiÆ¥ ¿Ýn{ÏiZ0uÁÂF%À‹Òì¦MLŸô0®¢ä¾åIôäöà* Ü½/Zˆ]@ñ¿/šÃ÷q` óx¦@DròˆÖÐĤЛËgÌêo&îGý =‰³©JÏöáFaÀv'À^Õ\ˆYë¼yÈÞ’.#kÀ£ÍиŽ{æÂê&÷Ù“¿¦¦Wn–ÿ…Þ,!ÝpSE^Ї÷[x 9qN[<í: >¢_Ù¸«Î—ªMøŽV@€ùrNŠ£DBXÅгl›‹r†Å‘åòÝ.±ãéVIƒ\œþúÔ|#]N>°çú5vñbØÀìXj>'Ó1´DZ?]p¯¡ -ä9i¨:´qDïcÌ6Çêï­Ž=B…Ñ\ô°xKv_z†faÞΚ® °ÇÄBUñV;¾tŒìôQ4·4™®Vw °$ýábíÕ‡FñºÊLßâS]Ò¤õŒ£ž52žiû¹HÍwbÚ|IÈû |Yì2¦rªHvLÊ 5ó²klå:¸hÂú$N÷proû”Êݬ×0˜zYqœÅú“Ø'ºxÉ8ØAd"êxäáæOœáû32w4-¿µx_ÿ…É4$Î*¿v´Ú’1­7óúsj!ö“ž]Y‘̵O<¤|º¹ÉT ºc¶:òV‰!ÂùçÌ È q"j«ceŒLp޹4¶÷²«† s`&Yé?I…ôŒ€fo–ú¯7+‡¿/ç«SµtŽƒ§n¡Õç"i"Ú¦ùLé½¼Oõ>¦hÍjç+©!dQ^Jaîyi³çÆÉk듳Våú¯æbØÞ¯„ñ²T1² k£,>X×fŸÃ¡Ž>'Ö&<í5Åz¯Ž>QÐ)² T]˜UŠ%¦(·ƒ¨>RösÀ”jÖGÁ=<ìCž2®ù@o6ô€’Dd§±’q|ä ŸåWyÏí·ÝäH©ÿÎm®µyN™—@0PîR×Xþ£½åý^{ ‚?Á*çdÎ1+¤4¡&©‘™W’Ü5îV&ma±`f ‘”3KÇÂŽàÆêYC4FRÀ,ªÇ³Ì«ˆÌÿýj—ÿ°´Ë•º³Œ\YMú«Çš ò$Øžè¯êwXg(‚Ò½óë8¯z\M¡ŒŒiÑdˆ+¦l弈ùDñMÌëx ÔÍ")Ö(‰«‘ÂÖTÑŒBÅcÖ\ý׆4s½#\M¹ñU?Cò¦6._ÃòÆÅ‚{yê¦ ·Ükè‘léNx³I¨›TÕЩ!GQ7] ÇCœ¤ö\gm%U “n­Ô”Ú^>Ösض\ùÕË•ëïÄ{{k¼§á ƒe#”,»x’æ@5ßK Ím+H_SI•ý¯4ŸLòwdߎ„SÂÁ†' ¶.bÇÂ\Ö$÷ïªÏd_¬¯l‡Þb„b‹÷g yaS…y%àÑoGÌZ-µä—fur#3 ·È·µf2ð”üôª_jnƒå~×+ʆÚgÉPž‚Uñb¹ÒËFœY {ÖøÁѽ­¦åÞK0¿ç¨“îoKáYT8ŽËñ×X5†à¹*O¤rdúyæNUô^¿€‰Ÿd€)³ìÈÜŽ®ƒNézCúà½Gû—KïåK¯±Õ}L}Ÿ³Ü5ŠSÕP“Ƥèd|äjƳ‡UãG!¥pê½.q×6JÜ4ÎÑô—‹¢¿Ÿ“gì{ä[h¤4N˜Å;ê|AN¯Vòº‚ÂouÆÊÍ '’yÚË„ôEëó˜Ì£P€DH‡%¢{vlÍsw‡ðW‚éÑpDâL[ø;ó]MgôåÑ´‚fY2[+p8if}XŽx¹û7F/Ô}E>XÚ²ÅÒ,ÂØÙGf‹.]k%{Úó±¿íèªæ¤uLPŠ7{ˆýe“Ö0Äྀ>f^ð.6TÁ w¥;eûÃ^é¥ú¾ _ª.V&ÑÝ"œ2¼£ êÛ™^N­ûÈó¼™mÃH¿…ŠÑzùª·NcêTFƒâ ñæ ¼”åw¶O0¼òä¶;‹ˆê˜á(ˆu ˆ„&œ“eutãtumhZ)Lo_ ù[$,À©‘PMÊ:BÀˆ}ÞϾûL6ØÃˆÌdØØr,X•wŒ~Hép±pçC£vO°²êdaÆÀSš¥$à u¼"eñkñÌ4àÚt… [wûÉÝn€l,41iß|ý¸›¨'¯y-ïÆå‹½Ì2“Yûcùà·2hf » ¯†vãP×,x)ˆÁñ/zÕZ–?[\ž¡¡Ö3´¾ â¸'ðZ6JÕ:^€·ú ÷„3¯Ó“X/˜$÷XS=Ì„N­Us&5Êð½TRæ5¡Vf{¢|Çcéo¶¬R¹G¬ZX’Î~ó Ùzâ"nyFi¾;ëur™I3©¿ oÛ¥‡í~ƒ.“|µíKp6Æ…èvÓ±FS›u1 ö,I;¨3•`© &æØiͬ#/¨_g'p¾µ25pÑ÷«QFÝû]š F®çnU˜ŽQG¿WSsP #iß³:zÅBA[Œ¿V,Ô –€á—”ÑUGiRD?ö¹Œ0”ŒC•©4†,[ÙE剿Ph”à©JI.Ä£ëñè1/ãáå.ñÐß—Î3Ñì6o"’V›ðž¥ôƒÂæã"#d—É‚˜ÊuÒŸ.‡3ùr6¹|pØo.ýì˶¯+ž?Éi˜t6e­1P.23¬¹Â¤ÄŽÝ‚5Á[ˆÔ[Ž!ÕÍi©Ý÷{9~éÂ~H×YòÍQx¯o)ëñìCuúh‰_$4SZùó;ï÷À¦ÖîŒ3áøpuYý‡¶œì”ÕŒ s,á±õçA¡®¶›¨5=¼ â?`Nˆª­|hl­5à+F’’Zxu5¥ ;ÿh†wpfCûã{qáŸuxÒÇêÜíY zfŒ8íëÀ ½Š°Û#$·xßB­¿»Rü4L`Çò ØiñÒ‰zVRìlY• êœõ¸\½[F.¶·}•æ°ºõÓh€í³Fð[„ù†Ž]tƒÓ¾€àêpqÃd(I"þxå®Ñs@zRÀBZ´^†ÇÕ‘©‚M;A ¶‹*¼Ê2+”ÿ d¡¹xž®a[V)8ä{½!ž;ï&ªßd’ʼnT¢´+Ï´£ja¯ÄúųÌ{¼szcnê±¥ˆ0b|(58žŠû˜Üü˜ ñŠocx«°ÝBÜÍX²pƒIqþ‹þk9kkG~pI[SÂÏ â†:ã]žé)Òÿ@B™¾ì]ÜÖÒÀ+ô寰µ§&½Ÿ2Þqª€Loæ0÷æýá©„Òì§”_<Æ­øÇ"Ç ð+[,²³é¼žDér–ãÈifÙÓ‘õ—8¯>×Ìg°Î›²ù%u4âÌÒ›÷ö é§þ ÏÉâà>˜‚ÆžÿÒ!OëXçç“bý9/[LCEl*œ?Ò\ãÛqn%ûˆò½B覿ª6u±ÄQþ4%…ÿæ:ߢŸFsÒ+²‚:)Š»ÛÕRýÞºšaÁÕ•YûÃp+äA#õÎ!VÈf2ÔBæ Ø0NÖ Wú A«iM>ÅÌwý°ë, áÏ/ô§\-øu*Y;ŸŒõy˜÷T>HÓË“?F¸äópŒ¬áWŸ~V"Ä8§"OøÍ=Ø"‹£”Çï;6YÅ|YþµªÓ]©¨ÜœŒNËÈPa ³ÎÅV MÒfJ h‹œuÅÊj)¡¸ VsÅd-èyè ‘ò)£øÇúâ »l6OsÖtcC€—¥ .àL M/—Yˈº©Ó*q ò¿ÞHVCGŽXuk•!ÿb×Ñ^ŒôÛ¬¨nV e4¯›mH·¤*¾$íÖŸE:¨›†°OŸ‡FÈ“RDš]£_[yqC} zÊ5ÆeHß ¬(d”¦~IËÒ­$¢6¥†+±‰QBZ%–ìáˬÉ-1kY»ª-`¼&5ÄŽÚ´ò…)Ȧ‹›Ê´ÁwÚC/êï±-¡(JdÅw•¯Œ³¤cjMlª'œJXrþþíAÏ) Ÿ§Kï%°zsXø`›´„lrN9÷¨^¯¾÷L6Åœf¾Ùþý¤†î/üš1¤V‘\Ó‰àÃN&[³Hb_rÛÇŸ»’ÆIáã:¦Û´Âç:» —ý\yµ”KËŠó¥±Æ¸ÉçÙžÁq=d}RuÓò+¨ëÄäN1F»nÒqóp΄·ì¼ç3ÆÑ&í¹±mˆDªJóüí›óvò‡tÜÓÞÃÝÁ `®‘w!Uè¤U¥òÃV®HhJúº‡D¥ÅÅ øNff‡ŽJý [ëˆÒÌÇ‹@`”rp«Ii­åÈ@@}ÅÑÎz±ØéŸ”²>ÖÓ*"êV¿‰XçžñÝ›ìéIxÉAÐß}©¯gCÀxÈyÆ3ÊÜ$齃;ÿÈ$ñ¸¯æ„ËãÃâJz’¦…ºEýÛzãÂ*8Ï ×0= ï‡ÌX­è2€LYÃ@ëVPX«i&­Âhr{•*¡S¯ãì%.Py030ÕOÚŽƒO@˜w·ª€[@>çâÜHzþç‡Õù)µôYx½µ—XE–OE§æ'Ž{{ÊõÝžv´¥=‰¤âÌï<ýK×d$%ñg:¹»•Ÿþ¹a‚WÖIø(ltá±PµZ°)ía¯éHÕ£]e½ Œzót>ó×ü6'õv¦«CT§¶ö„9ÆR;ìNPî¼|æø"vT tÍf…"4æ•<|÷ÃgÏÒÂmgï\4;€ù&õ-¼ßB(Û_c4’‚ŒÒ@6zýìš”°ÚH³\gfÔç;­M“eAÜ€ì‘irαœgÆ4£ì:櫸wNB­ù. ¸ kr4¿EÀÁÆ Øe]þeTW]=Ê ¸9=Ëþ i¯`‹ p Îtd”’ëŠp®Â)”¹4ñb§†œ½µLG¢½Ï¤:æÁĶ6šZV›lŽ-ÀœÌLñá­"Ä,tзLÈ¿ƒžŠäìdOU ë%”ÏA=‰ÒéQÕ¯2ÁG3 +.ö„=é'&¶v–?êÍ’¼/éIÙ³`¯†`×-q@!ÿ•©-aþW±ñ‘ª}sŠ‚4ÑH€˜ÑAÐڠΕÁõo“’SMë¯ßã³'Êäà_¯û~ºÑwtºô—OÐ…Ò¶¬>9¸r¨â2ZWÔ\Õ ò”™¶;ëáÏÕ;Tô¡ LÞm&»ú©ß R ç½È9‰âÒ¤ž*x¬¥§‡ý¹¬ÁZ(©›ÀYÏGP€,k𸳠té¢IÊÔu¡øšjí9xK>[>(ÜÈNö±ÒçeN:f—_åIKâAÊDºn˜Mݼ÷—jòaÃI„ÆD‚Š">ÍJÛtÅÀ÷¬Aà 8A¾(s²ƒ&ÝÜ—,gG”«í²Ø‘ƒ¾¢O›Œ÷î¤ì­éã·Aæ%ŽeA·î»0ˆ-¤½›ð¼ÞY7/²Jþ:Hƒfߣ¦)±èø;¤ZGLEñÀ¨õ^%_ Vf›ý ¶FhE‰«þ]›Õa«R…ãp<ûC[ê#¬•ìivK™z |ú/YèOãÐ|®îü¦48—â–ôd)ýÞÿ=!AŽ)(œ ùn°Û‰p©v-HÜ=åPjˆ,âXmmg¤H'†˜‘ôk*îFG}‰%²¶Ö]ãcè£Ö˜Zt§â(tu%>D…XCÜ´ìÁí9o§`;¨²É탮ÝBw¹c¢D“ü~®9¬ë—‹,7šõW©Uɯ>á@>…«|3m8`rýß^Žb¦Ÿ³Ÿc‚]Í꺽®6`ý¨§\ø¹ÚèÈ•Ù{¾ùí ÐNí€ÅÉ'tk‰”(d"OWEoê’ŠNöþJ†_«Çä5I*Ù´ ¤ °@ÎWæ8Ô`Ï9ÑÄc \x! ·ø½F(êa{l¥w¼~º½ÝNm¯\¦YˆfÍOçºÅ ,A@ "M¦/ë¼ÂKâ¨Ãœ{ôñ˜¾=ÖÁˆæ?e#TÜá¼( ÍA<± T[³Õ'bôùdo/ÆÁ'Þ—§D–í´Ž¡ŽK›v07pÛjœy„aSÄ'ÔS¡(Œåä´¬sN_½7žfç—Ok¡©† ÐŽ|ëœÁÕvÚèõ›s샂üÇ}ËY­þ¬;´Ol6žXµòV¬Õ$\¬‚ŠVíA½ñ:>A.W‰YÐæ¼Ú¨m¦u¦É/v(í-lsGUé~§l1AºÒå ³qüö0µ=»$I¿úî!jÛ‹jª²tf‰“xb>8 O÷Œã Ù%­¿ðÇ«F=è8½-ˆC×C—ˆ©—$Æ.2EG—ÔÌgÕ&ã¹ ¤æBž¡ùW¼0Œ§Å8A]2waÚoyátä<õ¾ð¦>!Õ×Séýisç'\–Ï‹ÖóüJXG¹oìûê|$éU•€÷*Ô äØcl þ©wSybL{/ôô(=¹†üÝD•”Ûëä¿],®‹³bYú ̯ݽØÒçi_y|üƒ¶/àÕ×OF§ B¤¨;ž³0:Õ`î@´Oª'N\â|0ö.’_+f>ö•‹T{yÍÓQ¡ÁÎ’Ë ”vרëzk_\:BÄx9"Ã-7î*Õ½SçFgœs¾]6–Û´B @ö(C¡H¯þswbš®™â´HçSb¨wDª±Ûg¹“®.|–s-–ã(>jÏãfÔ™Ùv¸ä^±íò`LÛ¬±éj¦Âúü“c2jtQi!qîGÈ:TPÂðÄîæÁðh¹WðU~#ráÛëLž¥µ¸ó,›ýLco óŽ5«Gy—ë›;"oS{ÐÃöSî_tæik*ÝCÈ–XäææHxêõÊTä1“1úÁ°*çcÎ@¨õ¾UnTu0y1Á,k3CœðDZªA‘ôWqß®r–ÄmÖmµ¹<)G£PøŸ8ÿµúK´ ÀÛì AEs‰ÿm]ZtNKI#‘AÜô+[ѯf1{øuÀ‹Ö)Ó¾ô©>JiËÌ%ÜÕÿf±ýÙØû5‡V†­}GI^Û[D¥¢hn 9«œ ÙÙÎvfÄ>áBU³ÛÈ"—‹Ãóêòœ‘Jž‡"¥½œõ\X´›ÉT†ôd†–œ£|3 ¤ÛÁ` 6S¸ºØíw³,ûÌ»˜ª× çã"’L‹ì\“så‹Ü•y¨õBé˪’ˆ7p¿'¨¼åt³†‹ÒÁJ3KÜÛ±«¾+6~Ì‘Ð9ï á6–1duƒV éûÂìýóÖU ù|Æ>èÊõGŠ´ŽkíHX£¦)åJ€ÿãþJ&›Q[ŽˆáóÕp×n9º*Äòæ>le+ø‘‡ba¾.u„!ðù°†Iî¡Üƒ½Ðý¬çA5õâX|Âü|ìœ}pÄßÝ<àfd”ï#;Ørü.£v-OŒ«M%âØÉfœâBfùL¿¹žºM‘[~!œÝXaúø¨ŸM¡®Ÿá§†zAEþ ÛÚg×vÛ»'”±$X¸dPP¨íD¡âI4œÓ{ˆ 3™ 0%˶ØËySPô@}­Öwà¼#…Ÿ“–I=çà¨à½™7 ª]ƒ´¯p5¡ÌÀ²s°l»r V¨+š2݇±3aÕ5×U^3Xu þHW|šüÞ»ó,bI œðü9ùÈÏ#˜.-µÍ³±3ãjÕ¨ë¦Ká(èŸÂÓPe×eFã\±Oð=wZëw*ÝÉ\»cU‹÷d¡>Æ¡¦Sg^ã^Ó=øéÜ6Åå•~¢.Ϊð*L«’Ã÷ïÃ6–LêÏ¿/4…ÇËØÌÓðä5›{KeŠÖOù|î¤!|µµØã$6.e}Õrææö$)ytÌÒûö}oq¾öíé\4€•L*³;nÌEÝÄš‰Üštq˜q£2§¡>«`‘íh˜þlœy‚_Í2‚‰NÔêxÝôœŸÆÄ [†w}Œõ̆û§ïõ"âcçFuÒЪôÖØ›¡ SÀK¨¯´ðïRÖ“sÜ(’éx^’⦙È—xw¿¬f°q…˜gÎ$[Úï³Xrô¥˜]Îk¸JßUz}Xöõ÷éíŒgR’[®)ÁõÊ´s;$^äè• öê¢åv¿1Ëñ0œPÂF±rzžÛ-líæ]'W¹ õÕyc3k_óxݱÃbbûRn&Âã571«ÊWZX²@4z5ÀÆmªm£[iØ7Vñäñè}D6Qì˜gÎD”>èR’{w„Ó¦‘½(ø‹›Šp•ê²nÃq”à[©H _[À²:‰s´z´¿~ô­€*ÊÔO±ïiTÛ_µ¹ÒõÍ|ºÂ9تÑe·{­ É[ãÝ÷¥>ÂÊüeÇuŸ¦¡)¾pj¶2é$zº~{š“Fîk¯ÖÙÕK_]ßZÍwã±e6Š›I4<¹(¤Œ'±ržz“ü⼇ YsJƒdÈÜ›1SöuEÆ.¢cU2Üõ]Œ÷Çê :/ІùXTi+Á¢ö®s4N­27ØR @‡$±e­¼–b@6ݦ`9êRC£E·ZW©@¦ÏØ\™ƒ4dnÎtÁ´ýM„ŸÙƒoAuƒm²à´Á¹F&xÒÉ0Ûi¬9e‘ϰ‰>îýµv}Fˆ ŒÑ¡WxM—‘lžS²vB:Ǫ ~ÂHüÔôTŠ–ô)åQQ°Ñ *ØTòÞòé ùZÿŒɳ; –KžŠñ ðè¢ü.ÐÕ5 ´93vÕ¶ð¤U1£Ì˵ÑjÇ ‰k® Þo4  h|çp¯ëõ›‰ŠÞ'~õ9å×<ñ<è,gÔuäkÛ¡ý( HÒ"ãü&8»Òžàøò¢SÆßŒÝ.‡™ðÓ»vÓ©š‡+!ü›§ûwRCËæ€mùO‰;Z¢¶îÇyàwäóS×Ç1¯‹ŽÁß#PGcúˆÇ©],›lÿÏ"‘QcN¥Ð(Íii-.#ˆÝ*oÜâc…mö‰ëÛšaøÕ›½ÉIˆ÷`Å—aœnÞnà£2·…Dî9F¶a$âÿþÚõ3l[ŽL\Mûð»·kÜÍ+íŸk{÷Us¶àV:-Á/lœrÚxVoðâdwÜ-±í(˜ïÔ´Ç@pøI—‘SÂqQ鄚—xî¶€¬s{öjvf*c)97ìo!¼¦z‘oaÒ#±õÌP PI‘£'æ+™gÄ_ñ•Ñn7‘ß©äx ãñ”Qäqó©WûÞkáâúvÒk´î~8 oÙ¾ˆÒô´±Äeá6YpÒpaªÉ˜)\YŠsÕÕ"j®&&Õ=ÎYŸîëË’ÞA½“ë¦oìÏÞ«%mr}@–:VîhyŠð©5óö×Q:t\àN‰¥ëôã2o½PçØ'+LÎ#L' ÝJ/bÒX—µô¦æm³ŒZFä¦ÙÌž l{þ3%)[}…±ƒg˜~Ëœ‹3k?Ö< eF5àp,.eÁ4ÞOÚ“ö¥\bZÓ\Ö…–—Ú5N:dQ!×½©™< Õ#wZˆ0òXî—À‡çéTüµÚ8×Qá–`Í3 >°1ËßÈÂÕ×rFìè·k¥œ"S2¤!7¬x}5 ³}xà:#ëÂ;tjá“ßnÿ¥R[u ?À¹R`€Èð+³š³²$Âà Õå#ä]| %pðÑÕëRüܪ¤#ˆH䞉;áDq§ÊÔJ("„MMŸOÚuƒ‡6Ê=êE9ƒ ;6¯9ß'…äPƒ¼ÂïÊÉ´­äm Hó?3vÇ—½Ë¤÷8FþÍ·“`΃EçB˜ˆõÜ´¤¢Ì.Vr»6U‡ÈÛ>ÔÞ»¢#¯åX„šyvŽÜ ÁÙúÍœZÖk‰+àwéÁn!˜Õwfhwõ?ö·Òóv5$òsÄ¥ŸÐº?:»}ÎåûÎÂÌ^dÕÆQ=¾9¼$«Ù…@JâA^FŒÙÐÅ; Î@êOàl)Óü(ñª“ß«÷alÇEA²—Šõþ™\Aôž5¿uyŸAcû¥ˆKÙ& j‰‚ ñÎd:MÑ•¸-Í~"¶Îa]ƒj—ì_<åýâ…¿üHÊ@sÇËfj?< ËŽ=îItvššÏ†•ƒ¹ªk•OÐ’-u­ûo‚{†¼ãÿXÆÃX|¶ÍSÛ®TŒUG(Ó³gàÂ\V)i_¢Ê†ª‡ëSK 䘂.©®°K뺤{þ_{÷ZâL¼†6ë”ëäïbŠ¿åb:ègqBÒÆÁŸ^ÎÃÌ>ÙxrdY å_-ñ¿›ºÉ¢BPáÄÊÙlÃùE4@±iÿ׊aBlšÎÿ…G” i’¾ÿôL„ó½àØ™ 8…íŠ3ÌrS6´ýo=.­dF@©Çrfk¹WÎ.r¯lÀûÝg½÷Ò×dæ$Ì:ÓøáíCK^ÓËC÷uÐBuºËÑ2µäAª ŽòQsªßû*WB¼ßüå.>¬zÿŒHÕ¸J".½n d¸©g‘W¢¼à‡TH™»™ko€¡Q¹„Æùóâúp kˆ ÄE·ÔTœóY¶µÞŒ›qRµ&4щ…]Ež5PCQCÈŸäÊ·D 5ìÜhÍX@lã¢iú÷ 5„ÉÌ‹ï™[(ãô2 ÈJ“L¼2Â% Ýe¥Æ§ÔûìH¾–ZD–#_0Ô ·õH5ESÆ6Uløúue­Â„wàFò-¡þxÝõp‚»c /ȇ#¶±Ôcªà·³€)1šÜ…ãCje,œ-JôG Œë­b¥åuŽç¶^¢78£‘N ¼s1?Ü‹âY˜BKEíiítuã4NÜf!›` ëÝ6¼R°=SÍê9B'rx¥‡«@T 9G=[½ºxI+tç̈R:A¿ï!_cWî¹¶Ž-Çç¡b ։쉺½ ›Á ’È„d¸xFdZcšç®¡~Ëâ±mš±“Û·“¡¢|ÊrÙ™YÞucøólÆbnZ¼[µáwÏ£\ó.i‡¢6à’Öá½›2OÖ·ñ²ÈÊFáä‘*2ž=Y⛺Õò’ õakUXøÀ6õcC¨JJÒfè­’Ìí¤…ÙƒxìüyòqvhÉ:8᱉Võ6ŽçJN/+TÐÚ/Þö—äˆèzhì»®2X)Û"íÛý$Í!-+ÖʳEYÔOcMQ01˜SVÏÞ+¯¿¸üDñ³Þ¯¡)Êž(„Õ yÒÆœ¹hZqí"âÀæ†`±ægCÚbzÙJÑ}4á¡"ðì$ØÔTQ—QKš.£³=€šûs`ksÕ 2%â&{i?VBòáGù÷È"'?š,rØ y>å÷ºÚ5<#®æáª XBð4_õUw^ J)cñ€u8°‘9h÷kˆ§ÖÇ‚6 ûŠ…è@¹Ú­Iú…GgXvÂÔwËîEPñ2š  ã€ áÏãi&AY\×@€ÀhnP$æÞBNð"‘yÙ§ã•r?áÚÊZœt ¶x»;P8¬ãÚ¾{ `Hë2øú½µò¹9Ç"ݲ`/xò·öí߇ƒ‚ƒÝQd.Ëkñ*j„KùXþ‚06“ãsºQ\$ÕÖñ’¢^ö"Ynü.r{²›ðFó…)»%²ÆVÅJÊè“XgòдXÖR®ôáDNomŇ–û$³Yý†p¥ÿµÈeÐû(ÓÊ“øÁ<žÀõTÆkÒUánÎÕ¬Bj9V¡ƒQnŠh°‰Þµ+”öé±@Úöü*ÞÐ…-u-XÁ‚–Nè?Sðßv4åÄód6MÚöy% ìÒc/ÏcÎÐ4ÎQYE«¸Ì¼÷¨ÿ•vlHø ™*E¡Ó„OhÜï…(ë5’æÍÆIp®Nµ`gÌ º æFu•›’!JL[>î’éRÔΣM¹Ò¨¸ ¾C‚’cãžg^~$.ÅæØ`©RE'…ø°™R-óÜÈ‘PšÌGÈð@·¥âY6ÀþD†q³rºZKÐõyøo½²1" >MNÜ€!ë'b§¼FÐ'xK¾=Í]+„¥¥A=ÜôËä{~wš h´ ìílŸtÇgÐ$®%; rç÷ÜÈö츓ãÌò«6¢†@3gò@š{VaäGvHú¾Èg†O#Ž’ÐYg¼Z0ùŸ!‰i™—-³hð˜ÝyUšæFðþTÍÜIã#ˆÆ ¬&XÀÎÀ ¿«×þmwUº >9,ŵK2ïýW•nÿ#²M[øò“žËWé×ÖM5vÒ¾p¶Dpý-?é¥4ÙÉ.†ZH­“ÇÌ5@pvþú{ã}Ú8'Ð9au€¢´nëˆF$uÖUÙ–œf`õ-ª Ãàš†®´­°[ýo!¡§ ÔNèÛò€2`‚{ß?BåèÙFôZÞ‡œòD˜èT/ô„Á:µyÖåÚ',‡æÆ…Xêwà#]ÿ\Õ¢-ÝãÆØE\W/<ðǃ\ÊTýŽù§øw m[걯‘¤ÆÃÍT‘|]èöÿóTÍà‰nSœæupŽêÉå¢ &‘éz'ã§å‰a ‡¾/è٠ljB-³Ø£âåTá%²k¿XZEiýl1tÕýj/DZ3ÍúkM¥Vú-ɆÎYàcyE›4c¤vðnSR—*cgõšO÷ RñÚiü`Eà¬,Å“L/Çf¬dº7®Ñ4bòO%¹ˆá&ªø0ºëÍ ì"ÜÔxhm=â¼uXrÎÙÃ×—ÄJ›'¸ ô¨®1pÝP’HÉ£•=!OÜ,!áj’;z”L–㨜¾Ó1õi ìÿ§‡1Îo"p”¸T–Ï'ù}1•¿Gü”‘ÜÖ^þ#š·01³ŠÿëiGg«”ð›a±9Æm^˜À6}šÒ9P8÷¢mÉÇ?ët¬´âW8Ñ6*÷E‡“4A-1 ,Gº*Ñÿxšú¹A Û²giMs}L²rú¦;>a˜Ö U±Þ‹$ÐPê ç9òC6ýt3'³“n›*ḭ́ ‘ ¦þB4Õ½ê d…`õ/ªývºø£–v4ãï2 í@å š\P2•hY/#7µï@ógéôJ²*>²Ms¼‚3 öÈÎÝŠÞkÊ•ñ4ßš w &zecÕYÍÞ2¯'º¾’‡L65ÄyUåCQ'g’è\ÿnÅõ v”ˆÉðÑáUøô¡24îUr4ŠPFq³YÎÌL‚æÊ‘Q´ôô:S ÎÙnãZDçìþ{¤üÄó–¯pgŒÈ·”m†“uÖìÊvS;Ò}ƺۘƒòÏàb:> ãñ¨ã¾r@Ç_ŠfáÊmsÑÍY(¢ÂTÿj÷Í1L‰ÄÃå C;R · _tÃËÝ.;uýøöÐÞY½ƒuýÉY!fÖ¥<Ò\ ±˜@_üP5`Ùm­¨Ò"âñk>;ûñûH@CÂ:TËýêT\ øÂ›†ë&—7¨ ™~¢'4õMsTw³êvȳïn2ƒK?¦îªÉÛ½ãù×36™¥7$« <¤l¿HâC‰ê‰ÖkXOÇ£$¹‚ £ãÉ¡EérèKõÀ˜‰zFH½”‚V–‘fXD¿í%L’ ÞÛ°Ÿ©ÙÀJº!âmñÌöá‹ýS莮€ŽQà'þd;=ä’TFédu|û ”×›X’•U<³žsråp´¥G—¡%"‡zÐ.¾Z#–˜]ƒÿÇl¢"c¦ö”ÄGÆšU§ Ϧ­‹d ¹HŸ«8D?›ò׆sîBÐJÚ˜,¸z T·DÉáÏyçÞÏ UÑuì9b^È7çÈݺx™eÛî ª‡«¸Ïóä×]èÍäDb@ ²š'ÖàÂhK›å].´ž–_Ñ] ,pþ&R(ÅÐõìóI…—Á7Ï^NÑŸÊî éJ,{Ù+È# 5"xK¾9nøX5‘kõᇠ<;?ÌJ•X"ÒÜ “iõkC}¹G*;gÌOŸòÞôZÈûÃõ3WnÜç•™¶”eYï"IСQ½{CÁGCTdZáÒl臕FýáeÐ Cë#íÒ¦„ÐKÚvø¶( :˜Cê€U¹`†óûlv¶ÅŽÔèšu IÞ ÆÖV+Ò·“%”è@.6Òöò¯ã!Õ®çY™’hôG“RrÍÉÄÙ~µÐTûLé=UâOoT7Ã\óȪ›üê: «)lMÑv= þH¤Tvwv…¼W¾¨˜ô5žƒ‹Òº»ØËAF3V8fñxz΢1}œtÑKºÞÙ\÷6€ÂH4t³7¥»ªðqE÷[ÃðAÚƒayª‰ ŽM¼·¼ˆ»Ëg˳C§¹Lˆ:” WP /^mòˆÅ˜ {³a Ÿß›ÓŠ‹oujß—.q :»'Ù$Ç´Þ•ã{…;„ñs)¼o6䤦)-ÃYìöÓ©äÌ”û±Ö´óŒP =òHqÁåî‰2ÀÃþ~ni®1¢dlßúM«c^bû¢ð…µÛÖ0ðî!P½Ž´ˆ¿ÿ4åt% eð•Gîì÷Ë‚ Ã̰ÇT“S‹{ïËŠ{y 4¸vwo_8þûÄÓ¹g:;¶RrMª@º~œ‰þÛÏ“ÐÊ;½f¯«wkAæ‹|âiRÿ&)ÅôÊ… Ÿ8¹Ü`Çî _uÏP„j¤ïv§ëŒo–»ÏŠêÀåúï\ ŠE…L*ø… êiH yƒtz“:/«ãok3][X*K®òÁB˜JäT|Üì¹c?eïË9ä7(·¯×šÒµ6Ä_â‘¥6¤!ó䎭Åi\Q,ý}Ç&á¤.Š)Ä¿…JÞÊ|•©Õ™RϾÆûßš >ÃĦpýX”'÷n|*å¬(š“ï÷”º"AOˆŸ¸ÿUU±|1ñ¯?¦Ÿ¢šÕÔ=GØir Nx,sŸ:8l œptÏ¢¢kû²¶²“Ñ™FCãõM÷~¼D ‹ŸaÛaÙÒ¿Õ5˜YôÕ· ¿È_&{ìZ|Vó4Û«™A.(8(c·vÈÏ´¦À-Çò˜„ ³ÃVDð zªÜ˜`z== "?ìDÔÝ,23aú¯ žýH|UÑAcIïˆQ­ZìÁpÁŽÏ}ž3è4 d”†åÆDlnùêâçŽЂxB/(úIþÚÎ(Ó“M{ÚÜj«#ôJy–K;h± À·ÅjŽ0µx%é¢Wœø«=«ÞÞ žk4ôg5!oÜGšÈz«bnæÃrÕ1ßã™ÿ²ø’Ý·(¦D>Îbî ø£ÚпÂqùôý?õ/ãs™Jù”å/aâYÔ$Òrì;Æbß=¦q ù?cëéÐXOXÅ'缃:ÿÇ娱LëPÔt«•ŽUËpmwxâ#kƲ 2a“êZùþ …µËˆw€Ú;m©þÍT ˆ1= ÂÀ(ìùÔQÒÌ…0£BaþCÍ™â(Þc¥®6tMç”áLÛ7“1Fjä Ô±¨rLÂ'ó^uår¸pÞ»÷9÷Ä:=H÷`^ßgaäýê¤Ëd¥TZ»v‹¹ï½ UzÔƒÁØâªu>5‚; K€Gæ63Ý$íÙHR¥N´ üú¬k­ÁѯºØ¡Í WÙžÑðÐ#ó`ùµ¿ëʥʆ^v±2áŒCÏEÎVU}K¤Ù é6ËAÓøÛmÔ›u¡yŽãû2ªDË u9^§·­r"aÂ:ÃÃ3k‡k¡S°i¡§R¹áÛÒì ‘Ñô&~‡‡a³Œ,¯¶q(„\†EQ麨l(žEìèvÂþ,œdˆ CçƒKšÖæÊ¦„·] F ŠpW½À¡&LP¢’dÌ(Êæ”ËÆëm½FÚréõaB7í´îû¶ïŸ1îæ3‡q¬%­·[ƒ ÀË ÜiŽªú2† y†[H*O.a¯é:ôÊ"Z2³êcC97@Þ¤° „Å¡,©€çáëãØ–D§ÃÞ‚û_‰¡Ð`A!òè ¶L&b¢„ïy#k!âMŒy?ÁWXˆLS~©¼Èü‡€*% ÃÕbuf"( -ÀÇèw­¢`t5¾C^Èà}ñظ+Žáû¸°Z~};¼ño3>@á°ïŒ¨E¹¢u0µc÷‰„ÇG¢Œ£úοå¥þ·tñ‡ôVŠH¦:“š*B1tL‚Y­E²Ÿ‹°§Ÿj¼ñ C5fÐNÿ^˜Zk>ºB`_Û3+>}³°§æåÖÅ1Âz®;^4“ýø”ùŒ›U¿ ¬ê"ILÖOsʈ+¤P‹Ú®ç;;bÂdv *ho¥À¼ ‰|­Yy|Œ}ŸXäñÆÅ=žÁ<¾D²Ð%ÌÉ«T­îX—Å/ÝŸ%¹5cyþvþŒ¼• …  fÔ+Gktî4R\Ipõëa×,‡†Â¶Ìéd¯Ã=‡Rà·êÍQM™.Òú2”LTçÂß½aV&Û-*Â÷Þ9[D¢nÍjÿ™«ÔB:…»ÜeôáVÉ <›â·? °í—ÄíWôVfìZ„ÓVp'Âõ£(/Ó¼}€«7>‡#£]€j_£9X[7l„Ѹ'SŽÆ»ãúC e¸ÿîéÃNiéö¿`DҖɵb8]ºHl1"ÂïÎ2ìHé$2‚+ê¿ ç°·¹:Í£°ãUšX@ _ b¯÷˜})Ú ²‡›äâþ/“ø:å>eóËÖy LB|å¾£­×ãÝ'å>,™ùô1?*Ó»sË ¼'ÜZ¼¸_‡ÇÈÆy°î¼çÈ1¾é-¿„qY¼LÀ|$˜Š*C Ý8ÔÈr}æZn ±šKi¦²TGq Å]Ç覆ÏßlCi Ó³ê¶h‚"0¦…`ƒWýéèÏam•êKYº¤ÓI'ä—ß§Y“þš-9<ةڠ3"Rû—~¥‘ C6zÆÚ =FmÌóǹk@½ ¥Í¸á(€\yÏ\ „-Ï9¸Û2ÞÃk9s‹÷·Ð0¢æþBbTÁ³â~Ï"Ê+†YOöb OFËôA°#Y=‘?!L€þmù§!Ealÿðt;ÜÙá»Õ­‹Ø10SweM‘ë¬Ä€H‚й––Â,1b¹‹ë¦²gÍúPŠ ó¯MTÏNÁº×<¢S3 Ø3”ÿeka€änÛ[mLF:|…@º½"{e€pw!ƒÝªçì¤>¶÷9 *°Äû(N„’Ô‘jDfäI—HUÛ/  D¸@jƽ‹Lqú þ^¾]Âê­/Jcf €ö+ÿŽGÔrwÜò§ü?.Á¹F6SmšÎlÑùCd³’cY0 ,„>…‚Εþí´2,½_ ”Mv~ðV_v¢6Z!H„ƒ:¥"”e+Hqo,ìß<£íJ¢Ð¾€Ã¢ô‰{†xjÜáR7ÿaÁi;¯ªSf‰•†ÜJµžß鿇¨|¿6޳r;‚ü_L6´–g,Â~¤ÅH“¼Ú…zÅ‹)k“¾[Å(’5Ï*sj¶©ëƒA¼7P0Ñ¢î¡nꪶ˜ÐݨÊÞº•ó»ær15ºÖ—A¶ézl/elf—jA~£•ŸÏ©!öNû5•0ì7[7áôR€žÑA+Ør€1FÎup¶]œmôy•îÅU.†×¨ÿ9ÿIkká‹nUiM¶*í0ëß¼=Ù\2b^ñ÷ßWºH‚µf%*¡^“Éá–ßÁd$@ J#ý°5ƒÖ"(ý~ãáïfÊÞ›^&¿ÑRº·y=s<ã|¸Uñ¸¤[±"¥ÀÅiZ¨f•’§ÐÁ¥gáý;ü²¶{L6sÃÀ@¶—iÀÇ”áU\î˜7fÏ8Å2w”¤•µµ ²D™ÜE– 2û$H÷DZüD™:¤ú· 4lLÈO¥àet3w]ʧ 5;H‚ýâÄ‘³Áª‡ß{wÛ/½QeðiCnÌ­ðã7Ú®å ãÍÌXà¼vUô¼¯ÿáªêXAÀ³ñ·îJ0Å^[Û©ÀˆÚáiû%kVËx»o‰m6ºéS[±WŽÝØB“UqW]Ž ÝGî!ŠëmÍhû÷˜ƒ õkÃÑI.`¤«¦ë9Ѭ3_ ^Äk> fÇSz=ÈÂ]òÉòÏÜûÒ•¦;üÇ'px¼ó¼}íMú–Ù€ø6ÑxÚâA43`-M‚=^ðCªuQƒò¨mm—=Þ2!çt0É Æ„T-ìZÀ–w!¬Ué»$ n ‰ÚYjx?w¶ Kg_aê˜ÐiçÜ%\<ŠÌ•»ýŽ‹>&\^áz§­Hì#ëÖÏçrIu´8ý¹ç.§õ¾"ìµ:8iÙñ¶1é Í¡R$x&o–)®y°ê ÀËIò$îï?ÁJ'µ«õ:¨>šPS4Àì)áùŒó»©¤ïщ[ Z¶S®>—ú†UÁ9;Ö€ª~ÖuE•s!%äNd«"ñ+úTcŽL¹•ÊÖtz:¤šz`ß”ÖI'C¡0j€W(lôcþSðî|ë{Î%ä8»pM*'ßÌ‹^çlšÌw3Îdûù|tx†Ñóû³±kÍ‚ wh‹”NAé—Ov8‰ìôðï-‡J¶Áv.4®FjgÒÈɪ‡r×§1CWç˜LGìKW^àºÔ¥JBžÉu“±g]ö©¦ú÷. MJÜñ´ù`Óó1Kä‰ ëègÄúÑK.S7§‡‘Á@FR¥¥ƒ…’‹ãì‚ ý‚ü{Ó~N©å•sy—r@òO Ÿ|â@ÿÅZÂÚ­°9Dk­*Õ}…VóC\ÒÏÎVƒâ(!šÔ&Þò}¸§îÞýËK;ñ~7‘dÇÞI.jŒ•ìä4_nä ²„/[ýQºm²¤X­ô·Ál«­D(r-x¿Ò×ðˆÌ‹ÞÁxYóEñsÉÜò(ÌUÒÞ—<E²3Iõ™IʺB Ÿ"nâ—Î ×ýu9?ôíÀ(‡ˆŸ>•°¶ÌÆŒ¬{ 3n“Em‡p³Lø›³Ùª„¿SôÅ$éõ߀|Ä%kšâ0 l2©RàÔ°‡nð»ÌæfdîøÍsƒ×nLý ¸]̆O?&Þ…1Á¿;iWŠŒ4ã$Ú^(Ê); O÷ª7»í»in °¥ÒÚ&nq- ™ÃK>ÏèÜJÔÕ—ºÈ‹Í82ÿV†²¬þJŸ½ä•bPîÀç(áNWÍ…Ó@©°èÇBau®ÞnPo‰QGã¾éæ23­ÿÎ,üW0ÚMÏ¬Š„ßiì :@å ë¥C†ÄQªq·@ÐðÓ+³üÀ"+„pÄØpäÞçÈ@c‹Ñy˜k"¤ƒE`±ÉÂ&\Ü‘ÙK¦4w‘È$q œÖ޽íJÇH‚oÆÛßdð¬Ð}µ—ÑÏʱ2Ða.¹g„Õm÷‡/ $÷躀/bäÛXÑÇQ {7xç¨ökã›6âºþ(¦.³1ÕåŠ äªöyY´æ@´Œ‹i³Ù™ÛíZ²ÒÏ@ˆÍªª™ÍÅŠ'pèÉë,mì¯OrÒÿøPóö•5„r¢lš^  @{X`Òþ Ú¬,‘ªîVŒa1¹Óà€{ÞdÄM«ÿꋪhô)ûÐhà¶î8©ˆ÷q˜¬v! Í}& ‰"ÊH Ú˜‡ËõXàåLz«ØÐ%Ô\0ïKÖþéчP[¡êÀ£ÐᵉÉ. `?AeU·ð¬‹[ñ-P«ÎI—™§¾ÌrV W®Énsý@=ðâ«´ž°C´¹Ë„E¿Ô4+ÛÌå><,½Yb©<îMRcO¡O†Êì·Ë\u'ë°íWž‰Žö ï‹»è¶uâ—µŸ¢ß™ï&.äBH%šª¨æà ß0Ë…(oQ¨%Ö;­›4ã†!LP7ç¿Ï±W.·&b¢ˆ(ÅûÒwN˜”EÝ9î¸HhÎÃ<…s­if¶´_R êA½ˆ˜hì™aRg•ò™·Ìª×ÚPóÊ›ÏPVøb‚tÚùy!†íT $ñ¯žÔZÚw6Ò² Jëæ@ŠàÑÕ厲9K!$@,Xß–gÜ‹Àú‘|}€#\ª;(ÑV¬/-Î .ý¶gŽß|ø×úÀ€ËÚüÌSÞ¡œEu!ÌGu¡‡×NÔ}€G½wIJm¤IЍùBï‰ËMá{Àø»ØÒ½8¹Ûí+6IÑ_/®ÑÖ§$v#йÔj½¥«îÑ•†Új( •Ç’qú€ýˆM¸b×î±ñ™u\#èˆP¯Ù¶ˆlÆòÅ·Oœu”•ÑNhþ\ÅeÁ –Ũ€ŸëOú©'¿×ï΢rŠåäDº ¬)9.sÎ¥OWÿÞÂd<$ØÑ„Ýdqn¹tGº¥µp¨"²þCDUÈ ÕA²Ç?Ë7ËÕ1Î(ˆK´ X˜ãKŒI] wnCÛ|Æ1°LÁ ¤Ì¦¸›…¿SX”õž_£\TÂAÏ‘®™»Ù*3›µ’®ŠÝï÷'sUšÕôõë¯%¾”¦F…çØn¿šÐÁµ¢Æw„7 ’¤Ú¸~Å:íôßv ݼCM~×ÓϨ [?´ˆ?ŸÌäÜ9†wh2‡¾{uúSXa*¡ րʂfÒÊEˆ>áDL· ¿±­Õºþ‰]n¼µÝ£ZjD‹ÃŒfV zÕ¾«ˆyåŠô'\´dãûì¾JÏ0Ü[ùR¹¹Íñ ^—›O_¢ÿ÷yeî”4DB$¥ÞÃ|Ķ£«¦!ǧ8`„1êÇ#¦¿&ÓÈ<ÌÒùòhú„,±ÜþÁ¥¤.dð Tˆêôª% ÍÐ4ž/…ž‰}iˆðSr”2z×k1ÌßxIºêì:tš!Ã×Rš’ðQLtgÊ»ÅJÞmÚÑ©KÄùÇ’‹ó@æ±ûÿ\aX ç•6âËiuqQRy?¯º•x ²L-R]Êgvƒt„OÔ¨ƒÏôC)Sù‡LZ…¾•¸Oð5ˆïFlüPá)EE2ÇŽ´Õd¾=øC6Í­£½€ÚÉ`'@úÂ97_Òc˜ØjšJ1 5Ô¯^ÆjÍMçñåÉã¿ÇÊŒS¸Ç–îÊBé¼ePýß½!%m8‹wd'YгÀF½:_ Ø:Ï ° „Ý}ر.Á&~ôIñ°·¸¦úÿg¿K|²¤Ñ#;°\»Š_p¢ás<øt5Wd]¤®¸­!݇,Ox‡*b¶Ü^í4Á&~¡x»à˜{ (üíT¸Ý¢6ÕKÚøÅêxÀœØ6;FÐE:ê{¾SÀ£´±Tç˜Gb¢;7‘âøKFÆWMûÙkŽË¼|°E„gº±¡=v¥Æsaç‹õÃmEŸLVÙ²~)VFòŠfQ`ñ ƒ‘h°EîÀ rQ˜€*úQER˜¾xî/ü_uù¢\Â>ð»¡ày²™Àû#ˆ‰DۦĜ—FœJÇ0K1ÐRVHƒ«@¤•ÕÆv—5`1`·Yç¶òãìåèJ9BïÒÏ Ð 1¸•W5Ý|óíàkëy௯qIž)æËØØHùõϬkjòücŽq 9e°§2€kèIê<ä®Å’EWTéø¸óÓÝEJÙƒº©º>´+æ©%©²à†E¨±L‰E Ýœ7;0È›0b‚dÇqC‹ƒð÷{ÐÅî;¾ëÝû ˆÒ‡(úË\ªÛ!|Êa Ž®EÕl;~ëyõH?"ùÿç\íÐ o<°¸ëçlÁ²Y5ätrV¦ö\BÔéº`¸•¤½©ªp"ÍÁqÃîkµ}èÿ¨¢ú:Œ}fo¥]sKk9Û’¾äü”ûï³¥ž¶'t¾K‚¾_+܃…1ÉU^ÖU Çl̃Q»ÐVRšÉÔéæ C´R4ò-¯ÇÄ^.zq$ú{ŒS6¤®ÅÝ4J¥|×àÚôp'.µ×J@5™±þ.½a1Å7°\gcín¾B`­ø¿lUàhì´.a¡bÓ>®ø“Lšùå  BÅX¾ÑŽôhô¡Ì „)*)¸ñjˆçQŒ¹+P,…u°F=/ãVP¹¤ ¨—)ª°ú„çiw”Çþ·· Oçw¦ã*Pt‘pê‹ÂGI­’ÅF¿mÛ ¼¡WЫ“n;ÛÀ±ìDŸ“B=²snL.¸¼XV$ˆï’M«­·-^1‰VX¯¸dƯù us+Žà{+(še<ÀtEÅ r[HÂ,ô8Îþ)HAÕ0ýV½d‡Æ*•è„ySýœbOZ ´2½­Äu‰Þ˜æp¦>ÖñŒé+cÐqnËž°E &óB¶Ñuö7˜6Ùå]‘NK»¤0WÑ9Ý0”ᅵ_1ut‘šs…WÛ²‡öƘB—‚Ã%yÝ~Ôqj,J,—y^»¯"n“2fí¬W¼¥GàÐÄ k«„:)¸õ‚K]lXï¥Àq`;0p’`Må¸-³]–zF‹º¥?˜†ø; f鍯ðÐ?½ß)Æ :Æk`éÐ?G€í)‡ciwAí~Z%ï$+¶ô‚ ½PPœoÚh€GzêlÌ»˜è-¿.ò­)Ë{³V¸ºy¼þú-ÆË„S»44‚ãÁ-sݵÂ} }¿I¹Ä¹Ï}Z'û_oC7„RQÕd×ogšpödÅPvc޶Lß¶#—ßÊà·aqKëã4Es"qéFOºüAó$Ÿè‡Qvå¯`%\ÍLë‹T¢S±’ŒoC²÷¶¾plÕ±b# ̓Ãñø'•hÓf…Ãþù®1ÁÿûÆ$œùsîy ¦9!Ñ/Ê1gÐêô"e-5b bÀ’£l¿p}`’(W£ ÌÈýDµ¬æâK‰öÕ¿¨åzW®RCGÍ («âÞHSØônFÙ°s0Tu®Ç«e´”jSr¥àêÀ ¶ÖÖ6í®¥Î‡T¶_œª]ùܾ¼ýp_&2q¶JÇzœ Cé¿È¨¬´w³å®Ås´h}PÓôÆ—ƒ¦vbaÈÁ±R²Y»¢>XxžMÑ;S•H"MC:+Óç›]ô#!GµŽŽ€×Høl¤— ¾f³¦^9vOäë³¢¥iº0.]t‹…½µµÔ:Y’‘k𶸓ÔØ®\mƒ3,ïõWnäf61IÏñaB[øç/TWêQàM¢­ÿçaÕê8 !‰n?&CA;äædbÝ,i.EXùh[¶ÛdÃÌGá:fo©DÜðK‘W½;j6qV¤²±8 ¸V—Û_#4)/åÈ%ÚâtiÀHÁ¨yZ6×£—½ýÍ)ûñçàÑj¯á áË@8´gq` ‘CpQìä—ˆ©Û—¥!¦iŸ|V"ÀüÑcØ0aÏ•`Áþ¯uC…RgbÇ’TùÓà”C"W @®åE+Š×|Bä1œ{†ücc˜ÅFKìkÐ,ì'VëÎH€Žò| PÓd#[ÌÃ>Ÿ]‰<ïÖ®ê5IÝHMµ·©šM±ÒëÆù$g.Gààûƒe¹8,p2KbËàÉÛD·k>[ÂHçJ”5%Î`§­àMžs-Ex Ý­b¥¬ FMñÝO‘G¼rŠ8ñ·ÆÍEç ‚•o³¢$%£îvØ'5có“5#‚% Âe™ÙGÈØ=3e„«Ênl£°%Ïtö ÞEŸ-Á=ˆä-”~<¥’% ‰òF6  7‘»aRˆI+‡³F‘ûg1oN€¦ÏËO>/a òè÷å¦m*îB<ß"Pâ`’„(†3:1 êò9·=2»ÁaSº ±$rÓ£ ‡;€töh޽>Zp“\=Zœ³š_Ï+`õψ<ÇÖÂ]¹nŒuíÕ a•èHxR[}®„s.ЇA?—<¿ô¾ð\*‘ì“%5⣚íŒå*H‡¸òô1¸]"ŒNJ>¸¬nßþgж·»«þ²¶Œ®É{)g¼²¬àKŒÇdÒb¬A>ç;}Uil,;è ŒÃtáfͶ,HQ–Ùak­Úü¨Äaæ<î&@d¡¼£-÷>c_!Êlfê)onƒÎ<³mè\c3„“Òdž hU1—ÔðÁÆ’=ql E;z«¬Àé8e§1¶fè©®}©5dîÜ©Ó:/v!› ‹!…çßvaÀÎD×å5éüý!lG y„™ÐˆUó[ ZŒ¾¸°åÈcæAu$eÛóoW}’EQÁûj=ø ÿ’nŽ˜è$.2ÚTî,,-Qõ%Z±ò|v÷àZÚ%3»(¥Iõsd»¶…)—èÖMgÿG@ÆÑâ&u“û~´_´l3Ô¢ Mfó@ÝËåƒö³é«æÞ—¼ô½y&F#­G•£1C&Þ¯h´Õõª[™.¥=…ƒó^Ù3Öÿ™v*nFÁùƒ#Å nDÙ—$!03à#¤È`Ù@´¹u9„Á^¹úØÇb®¬1Oƒ‘·²FZ^ØŸÔpF—à:üc`³PRp.?îAbiS©Ã§K¶´/Æu}ð; ¥kä2£{ªúG«5v(²$ª>O¦Ã‹cz :÷¼}FûvèH'(¹KiáZß… óŸgöý¨u˜n:,À yòÔîUw«i´Æ‘*=ÀúÆ«sdÛþf),d9ÃØ¬IµÞrb«7vk‡ìþÑå©Wù úÒi¤ °5bï³3‘cWù¤qï7'\ÃW&pÇÔT‘8Ï쬮ŒÆê0J›ZýyJW7•Ñ·;Ï™”ÀhÃ@(Öò:»°& ‡iZCæ©è0gšw#§ßgÊ`ÌO “÷½¯é¸m¶ÿå½=á¾ ?$;XÍsÔÕž¿û·ʇj¥n*q‹µ‰´Z‹ß€îb‰p¹eÚ#J§wÑ(éõ+áYæðnMå¤(w;î0}öII|ijWUKžÅ5 ×_¸P©#ÙŸ^mè‘ïJƱé; ¹ÚñË'°4îŠH޹=jÌ¥/b/Ù>ÆÞŽ +Z÷€åã¾$çÏ ó¶Mé­3ðüÌ ¾cŠú[DÆh¯eOí)yGø^•©SØyTh—6Œä˜uy©‹é–2Ù¼gÇg”4°™¥ Çf° pá,Ña²±¾ÑYÏfÞ¬mö“±Ï* O‡Ÿ$95ä!_Öqk˜/Fà&K²¢[ÀÕ¸Yïãß·Éý—(ÊŸšf( %vÆ££=<ºõ¢#'<ÚŽ2漨C­GL]DZDûç”î¸ °Ñ²ÈpLîûŸó2çÊ_(³¦0ªï&R†˜‹ÿ˜cNo™Âª'+š}äÝÝ0`>Ì{Í¡(©½m¯¯/,Ø"ÃÞlô/o‰Ú{)ë:¾; Š;)µÁ¶…œEûþ)X2.Ü’%ü[a¤/˜ñ÷}½¨H•û¬rYs ¥‡82ôBšdE ¸Ã{d¾Là†7A°{û㩟¨±‘Ó¼é >iE¡0‡w¥Þ3ð*–\Ec=~Ÿs ªÅbfµP»x-r¸hÐà ¶*8 DÜ„¹‘Râ u\þx)Æ„aÒº§y¼IÕ•T)ÁÖ6ªD"tŽ/s„ó;lîSAJ…¨Î½K&¶„XToŽ1Ž^„x  [F˜R¦Z7°ý@1×%¨@IV±¾qpsÄEÐZÿºÿ"5T€l¨BU*g¹Ø õÔ™y aDU¼{©Üî•îÜ9Ò:Lÿ‡Î&¤û$ŒÐ³g:™%"Á/E4„´L†Ö«¿cóz?z×c¶+xÍ(4J‹‚w¶Zsn‡½VæØÏØ`4ñÅL0o–+x!dæ³~zµðDti©fºJËdЙ=§.rcLH`N 6®u¾ž\Æ äÎ-³{ÃLd¦~Þ„,ˆ”=ãÙµVÉェ=›Ñv\Ì(¦`ý…fD`M‘©•›W µå´·ÖÎÔO,ÑzêòÄØ¹–¥:fºhötäÔJÇÌôt­3`·È=¬l,÷ ›=S±IÙ“2´ØúÎ1 nj-qGò81¿N^ .pF@v2v‰Äݼ¢ k…84@ÀÁroÉÐ=ÊòÑÇ%ñüØAðâzÍŠ' ŸTRøîƒm_ÎR˜˦E‘>ËHÏ͇(ê]ư3ªµ›bK§™—­\QU›Ë ŸØòh;«2º Wfæ•Ç”¹!4ƒZÄ’°‚áø9æMÅþí”xäÏëÉ@„y•ÅdGxh»´aÑ›óf LO2±p–1d­Ùi5¢HwÒžb¼n•6¾í?‚%‡Æ±›)$~z¦)“ Dïáו|¤È²l÷8É/ihg}äL}P|iLþÈoË!°¹x×ϰ›Œ”®)ãI·›Ë²ùáå=ùðq„üeÏ…bCê ñxå?Œ€ó6ºŽ4ì˜t~±ƒSî‹Oê<â¼ñxÍ»Ò9ÔWwzz3ü*˜è¨š¾’Á +-n>` ‘)Ë+öcp=K2ù÷”‚ BôÞ ÓŸlÕ°AÓð@|¥¡c†±qþ¡^T•Ì%sJ ýï,NÞ™ n°³òl/kWRÚššƒ+~ãú4ÿüÀ†äYDìŠBù­­Æwpn]›Ú¡_]Ÿ¹VÊ í>^XŸ}aßDÈ…ïÖ”½”pSD5‚|p"S$$)›7bǶ­mö™¬,m;ÒtÆoW…óγÁZÍE\Ì# ¨ã²ð(Ú§Àè&à¥Wàmû@GéÈóË醸s¸Ä3ˆ{ÀâEÐG1PœÆ—­ñSÌ£ö~öŒ¦È£{’[÷ø; ½ ^³&&ÜŠ4w|òöÅr5 *éJï=“JGÇïÍLãµ5ŒøÉîÖ&éÆ4ôøbÅ"öe±¤¸ëÛFýcLJGÉ(8§fÐGCÅ7^¸xGkAa¼·¢Ð\¼Ëì4¦/e2V¤¿I…§dôUjh‰ ø PD^q›*£ò)€¬æ¨‡¢ó Œ!ë6«Ù9ÝxkÛäè”Õ[:Í¥®Ã¶ðŽô¤Ó‚€ ã Š“ݛӥ#D9tr<ÒKA·ÛàWO áÅÂj£S+\×Â<Ö+]ö2£H滕ĕ|׎jÀD×ÖzA£ÐßúŽù™šÿ¬Y躴»Ù³”ƒw‚âÓ•B úôY*€8ÇUDbÖ±1×TõðSœ}nÎéLØ=5w_%6xQÒ,c˜³õ@@Òˆ•ø(‰-!GM‚O¦‹5%Úªàèq—UÄ<î>B TW„Ìšy¯¼ã¡ŠW-ýÚ´RÛZ]žSËþ—­Å-"ø7ŠÎFÖvžýøY3ºCž;ÃOœ'èü*Ýl´+—3båE¡Ï%±›í¯_ã­z;-sâWn(ØôT¦Ï+èï7P?jªaÅ“gÔtÒ¿`/ô{áúË|,Qʱò¢ ÎŒhü™k;ä’ ³!X ÂÑE››ö…àVÉfz  •5uiÝÆ¬¾%‘¨üa†›Œýdu3ËißXÑ_ýØZÓ ­M¢£ÜîJè:¡T4ÁÕà‰,j-ê(©MÅ™)¶U=üÅõÊ:ð@ŠÕH˜…r ´ïÔ/2dµêÞ7=Áb«õCL%/’g…Çûªú³!# 1C֥ʯÕÍ1ÿɘ’™uœ <Žõž$ígI7i} ƒ<ù,î)¤:èiÍnË/8eUHaóü­ôS´ Ç,)––Vr!ö²’•Yà¹jÉ¥p0êÛcH2EWMÉ IGäý×qsÈÎîÀ½ `¨ž—žÒi·v¡ûøiYM üôWqºZ<òȾéZÿI‚Íߌîês¹áû‘@þ¬«q€ âš°ì.ç·R."S³˜öêÉ<‚Pv€:K¦9b¼Ÿñfù!ÏòIŽ¼Æ›6ÈTªòýŠI¿> ΄)ŸÇ k’-[¨2~Ð[Õï’ê¸{ŨŽâÁ(R­îË[dÙ°´…?ðÔDTÑ•†°õºª‘o<¥ÖðXöqAmžVæUAÈn ˜lÅÂÏÏÉG&鱌©EË à8S»6§¯U˜û(TíŠò\A¾RÚ²únØs7ôÿOnt(~ 5O¶Ïiã‘í›Há0Û7WÂcÅ`»ÐŒ7° ƒ[œ¦¶S Áä61 Š]Áok±^Q3ÛйŒEä]r˜©ˆe‡T牎›×_%ü4ÿ¯<a}µ{ãÙ½ t­‰îGF™œŠmAò{ÞÓÿ­¥åðR)«Äb¤ ÉüzxŠ!¬©MžalFôåf¡ß-ç`ø@ÜÍqÎ2@Ü>G!ÞÛ¡ØïþLmw߉”À˜@mÍ>G¡|ر^b»@ Þ>*.”¶µûÍü®uÿ'ê<2,Ä1§ªNÍTB(³9‰MPzU~âLxñFÇú+TO·?H°Ai\iY› 4%>å­~5¾”fE%jæ¢3ä*V»ºê0ž?xVZº’õ°ÐaIX?gÒÌò¯Ã'‰ŒŸ–¾ˆd“ؼaËÊâ2–EËʺ'u2ˆ ËU]ò4§ë•gnØM-ôD¡)SdbK@ôß À¼©e|T¹ßD¥ªBô;ÝÑTØ …ÝÄò…!0?ۛѭ/HZÀAÁ„y^ž‡œ(>V¡?úeÌU8÷ʼ– Um£¶„¿`Uòí†)å6…ͬŽãÆâ;ñf|¢äC˜º“o¾!> vÐU ÓYÚÂP×mñt[¥ä„@¦Eç’ÔF:UòÕ$˜'L¨JiÜewI4°ÁHr<9Pu·¸ð€e¸­IF 0X¤ûFñÁ/Ô{ç„®ø`]ð?Œlô4¿3§,¨±²OeçT\òÍ/ˆÃR4ßv_0²hÔÀxWFvT¾ÍK…íˆðK/‹ŬZ~>ÿ€™v}+²wÍ; H»H^¿³ÿyNŸÞ˜Úõ_=!·(ßî¢XTá_¯ck:Mô¦…­ ŒC¡í‘7f8ï ¿2¸ŸÐ¤Å(»­¤Ö,0Uf+çÇE‘ ÷ø z3VÉÿx½í Õ„ƒ=Ó†pͺMgk»Íì{n¾z¢»ÓM%—­…¥¾+(‰ýqìq´ Á–ILö4¯·sHÀã@Û¯iì¯Sœ'Ôe‰‰ÐeAÀv!{*É÷÷o@¢^GÎËrm^œzŒuÅóôfc11JÀât³tŸÑÕ¨óPí­#P틼ßÏ|þ)FïN5„1Õ KÓíh’°øÜHŽud:0ºulWƒ¨Õ ÇåM±¬Ý΂H㘾IªÓ' TWî âY}Î냢wSx×—Kök÷o!d¨>Ã6K‰p}!HÁ8Ë×¶ï_ð’óR›ˆo¨*ÂÝ”çdEQ…“Ïl=­X,+å€ë)…úŠuÛ¹}ߤ ù³â,ä€r,o(T˜]Îÿ‡‰IÇÍÙrØHšÊ›ö_aÃ/k}p›Wy«T‡öð=ÀþGŽL~T¿9÷¼7ý¥Ù%Ò(…§4"TP®j"ƒì†YøSEÎqÝ”—ÆÐ<û«7‘3‰~„Õdªhª>*HâiÑ*½Å²º–{&øÞc|›jé…dUV$;j8¹¹ôŒ$ he¬B~çœÎ¨A܉š nªÕSÒSB8šk‹±[í6·f*¬ddCcµƒ~ŽÍÛˆé_’gn•ÞFp?+6ošS”„±Â¥Q*22l¶S C$ýdu›ÆAC:¶™Jëø@›M³VvÄô‚?ƒ^Ï×b;ö”ŠÍa…ÚŠm†ùñœùr•{=ãá°CTóZ,€{f÷wÊ®!L«oÉ´ò¨© l©üM¯KuëÙ–eàU€>î PÐtçójaVf–KS±D™|ÿx¯0nP*HãHp0Lˆ³þý÷¤§a§EïEeaÀ}|¼³t0c°ñö¶r´‰Ÿ–/î °XA!JNJfXJ€GˆEþgˆ@›hÊÕVÉ0€$ËÚýƒ-Ó½ñTû¥¦u¬ß³6à) m h BªHGê€zXt¤}ñ»ˆýÐÛ ˹ Ú xm§iæâ&ˆ) {ü—tš¶å/’¬*¡¾vfâòȹéæÄMœ²2Øðí)å‡þˉBöÀô>7_%øª#š3có6z3Õo—€¬ Óe7Ø2e‘Kµº©@]Çí¶à*_Íß‚‚ÅwütõX5¼”G•–º{ÂŽ\ԻȖÜÛŽ—f!µâsòg }‘ðVì†î©z¦½Õ—µÒ"—P¯äÇM‚#è4c?Q¹À½¤¿†ÆZØ_žcsã™Ø8…×°Ö“3ärD2V§Bm^OLB°ãHÆf4ÃLÇf?xÅ@2¤Uî}† Š€ sï's!»k^²J§1ÞæF]çÜúâxàó:áå©YÍÓÔ:âé•]©*â–D#íX7ˆ÷E¡ËYHeú¥Ãaœ2Ê¢eµæ´ntî‡ù±0yÀN¼IB°<ô™Ñ“-Íìä+á@š6êôÞD¸%Æ%jw.cÅ-~%hm¶9KÉ–*¿R4°ÑF²¥~Ïd% ︀K‰Ýç°O †6-ÐîXZA¼ê«‚S"Àíhî@݃I²g!‰|? w«,>©zH2ÐWFÆ?xî,]èÔ嘼V  Az`bñ)kÿâ€^ªÏ$÷Øë¼tGáÒŽÒ5YËìú¢Îµ¶ÁjNÙ-®£<_e ÁßÚ[wv.©bLq {rgD È¢µÁÁÞÑJaA)/4d”Ù¿±€Mä4 ÿŽ Yܰ]tù½™ËU4o†àöèºëýåŒXWcá°ydÅ´ág¡7Æ™AœwITÖJ˺ºë<•4ýŒ©þy?ü€•ó†™=‡ƒ Î +(eþÖ±˜^Vt€òŠ+ñPGÅ *š;ÜŒU®Ú%c¦…†y¸ÞsîBß!àÊm€y—’ô gXŽðËŒ?F¥±ŽÚìOI—¿´î 4@Á¤Ö>è†Ì†y3“µ®LV-Ð…¶®D—@KFÙÚƒü !"$3Ã*ãTÒå³ø €±÷š= tP:±!É(j¾zªdˆ¢~Ž^W©»MŸí´õ1~í«Ül­§ž—çsc³Õ(âq…üqîûfŒâa©ßzX°ç67’ôyoYÀ­6àTmqRW²+(2ö«—w´…³¡sò«‡¼ ÄÝ&Â`Š=¹†)A ù–GÎñUž/…—hæ?—$D_ ˆeIòS¢Y –¬B §™-†§aþìKÝJÏFÂ2NT\\J31·¸™Ž;ýZ§Ï}Ù }Òž îòÜ.G+µƒì(šròô*™WæÖWÃpRáÿJR{ f¦û2%ÒŒˆqk5§ö± X°VÉœjfw.ˆhÌåQŒX:·`\áóÞ \eÑ£À)´¦x~0,¯w·I&W]’¢·|æU·^ d—(&t„¾þ+ÃuW³ÈM‡+ÝBäu™g—®, ¿›à‡¸1çÓД92læ_ªˆ¦*TéºçG¼m»è¤ ²F ð‘½/äF Å—õaM8×»J6jšûòSŒÿר¥Fn›iÖ_ät»³Òè7½Tk~r3"­Y?˜;û£ÿÁ¬>†#ù&fz+·ˆì%,¢‡s°Pï±EÓz_C#\Z Áÿœkݤˆ¡Ë|×—²t$}Õ¤t‡Þ!8¹3_ÞsÓÞÅübÍwžn“+½FxýHÿ BÄádzd!”0ÇÑÅϘ„².z,¦ÙéônLÅdáëÂ|5 -öØï«ÿËdÿY°t{/J«=ÈFaK_zé\Þ„™]sz&¤¨ó¿Ú¨ã­äñ´uL´ÔH­¦\L¸]Tñ‘Âoǽ‹f²C­Ü‘*²A•»]³ç,Œ2qùÙ¬¿9ÇÛ:aŽØþ°IKÔ8Z#µ_Œ¦A¡á¿ÒùÍv/;SäãJ°¶¥¶LmädL^À󎚟îmÿÕ†*¹œÓªnÎíWjŒSUú0fµœ6öÖÊËUÈ(a³¨¹Ìr—Ëi(¹b ŸÏÈ|Üv sù2gqAýŒol‰ë >õ ܈;Ÿ[ÿ|Æ‘ÒMìù›q{ô|ˆ÷É|ñr;!ýG“¥$8Sõ­±j+EQd3^¾©& -QÅ8nKò_‡±•ÿIµ}Šè,±\ù6ž¶^·/„¢9Zzæƒo~ÖWbLû¤‡;úlÀ1lÔµ31r)¾Ì’\&vž—ÙìFU¶u ø‚;·p+¤/*MY½Ï’ï¬ûF¶|äZÂR”¥Q Ú'½la5^GF.?5ã½RûŒ›l… {‘Ú‰Î?Ól°x)hhºMŽî±BGêJ28*&â/†*:®O…Y9Ï \r äcåvÌÇô7î•‹­öZ—Ôëù‡·Óê­”^¡w[B3ô\8ÍŸÏæA¤è‡k¯†ˆ$àÒ’TO>#VÀT,éÈŒX[‚¯Zc/9ôÙ¶!ήßÞnà*jkÑÒç²Ö•y©™‰e?Ú?¿®®Óõ©Do'µ^ Tý×ËèNY_GCÜ 2‚;–NsÔžðòŽwv°T Íuз•¯V fr8º¬ÿ Awÿ {N÷û¯»×³%âCXI€D ÅÓ—úèê´¬8U꽘aÑ"….Ry K\’gE5ó{²hÑxs¹ðUv ³ÿ÷í¤j™õ¢`Œr0 Ó9›p¿-ßgm÷UV†Ä ¡¹îšû$ Ø~*rk@“(`7Ä6Âx;³«é™ž×®ž ÅJ_¢1­±‚¶’,ê{á×¢¿|vü(ÞÛ*Ý5Èr/Ú¢ØtÈÈðÅ0@CÇŠØ®FÀk‹‰0/:}ñL±SúúñÝ÷LŠRƒÜÀ^M@L©øO‘0Ô•cŠÃ»¯öòL*šeîìüǨV‰}QˆCîWGHV£éú<þØÉ(pS]6yÉÛ¬ýöò¢wÿf6{Ï»…,Q™J EZ€xãÆëŠ2Öii8‰îM®i Ö–‚ÒÈ}*ø@îËE˜fZ^ýÜ@0Qñçíƒ50¯‘ïUƒuãø , ~Ô¯¾àÉ$}3áWê!jnVÃÛÜwT˜V­¬õÏn°Âs½IýÅCŒƒvüŒÜ y¶V„ކ¥`±Ó„UäŠËQUpà œ`þ©ÿø dŽŒÆ>Ð?íE>‘ÂÍòê¦\-î?zI¥I0–­Ýwüù¿k¢ÎoùŸ²œJ6@¢³Hvü¡¬D'w<×sc[ß3‰ˆY‹°¯WÒrâÌï ”øiá…ÚÀ2VÅ'îjDÀ¹Sßz)ÇKýÿÙ¾9ùµg#ߨò†‹Ö%¯EØ‘0‘å–g!Á27ÕÀÀ€Zj8S“Nœ‘ /€}¯‰z2 ©&^‚jÐ>?ÁêF8ç+‡Ô¶£i^B öW¢vÁê@W\ƒ1KÙóÝ+±i‹[Tð¹î«‹%  ¿ØIñKAÏ-@çÀ,s;Jµ(šJ5CúO"ꙵÑu¯2øÊ‹çmÒ,-åhC1GÎvH×ë»Fàn­¿u §kg™i¸Ù¶%üÉs^òÆtK"«üA ãùA}l66eáÃ>¦´§PýzM÷WM‹o„eñÇ0쎋Ð4œ*Ù ÷±/t^zæ/*µ1¬%yˆÊMU, ¾o²ˆFj§{«ˆqF¡,W/[Ó‘,00ð7 zz¼„w¿ïÕÞJ¿>sâÉ—E~3ƒý€š)Šw€§JÞ‰ËOö¾1„¤ ÐòÆú–}5…‚ ½ÏD{Çt@þ4º‡ÉfÚû™žkŒðõ˜·>n§„šNÁÂ[EA²Sš#L¦º]‡ç¢µ0¶Ä•æ¬köQŽÈåÑ{»æ€˜!Sîih÷Ú‰ä°H®üþ®¿°þC Ìwý\ÂÁ_~bÉOÂMÓ£§j‚c­a¸N§Rô|·åªÑ8¢†øj?ÀR7µ’ ßlcrÌ¥Íî ¯Ç‰ôNU¾)Õ;ÝN^Í0aßÑÞ_N|‰‡„§ñ#Ä@PØTðÉ¢5`’Ï·}Q¸ëMçÛqû¥§ÊØwÞþaåŽoWylþ®<õ˜xÑ 8ÀíòàÒxeSEÁ±Æ W©óÂå‰Íù¬u\A]ƒC…2 П‚Ž.GÄÅÎݰd}=¤œþKn§ÜÕê¹Ldø/+ñÃú3'ì“fÃx‡¤¯“j)ÞÏG§ñɺ^‰/nY˜1ñETù{~fž[fpHÑÑÍ|Òµ @"è\˜ˆy:MªŠSÖ(t¦wñ“ž˜W¶d_iÁ‡™Ö¢YIÍÂx®¢¡Ï¹çoPŠfg€ÀqBÅã î´öë°*¦X†.ë6Œ•n$„~X¨,¡þªóM9pu VÓaþ»a¬íßJ0b›±Òi?Íà*Ü5lG­„¥‹Ák¸Žê]ˆ:­‹Òi8Iâ\W­ìªeì"PÌnÆ3(T¥ñOÂY8§oî¤?Õ”âYº2„êü¡9!UR/lXԥʩó4G|´ €ˆX?¾žµµfN`³æã»ð,½l ÂÙ5p·P™Ñ.cÒÓ±AV{j Z¢ úº8U+8‡—vÙ ¤…JÇ.cã=`¯&2½:tcy¤ ¶Usò7)DXÔÎs–†FÏñá Uðü_*¥„·M +B…üc¦¨_(ΊÁÞ¶vIîþ34(ûEMEŸë`NµQº×­y/}ÙÜòÁ nH÷¨˜u/å™7Çv‹¢ý6³‡b€µmxDª3j»{ÈÄ® ¾j9½¨5ÇFF÷ÍxÜyí¶ý³=«ŸLZ+/6n||i_)ÞHœ£—¸!É<+ ?b¿&>0Y`¬eIZÂŽ¥ÆqA¾¨ûPp½ÀuRÇu~Õ$nû @ÀàÕ0¼NÔUÁþÛ—& ©l+ÍQ\(‘- kÅË1êµz2š6tìhXJÖ¬òçìw( ÂñVÐõbâBXÞãpˆÄž`¹)ÉFž´vürDdJáþ1íÃo ÿÔ…N š1ý$^hö9Õx)ĹÀ¿a6˜1’aånD‰ÔWw7Îb„‰ž\Ãõp²káì©TÀ¬CO0sã¦WÀ¾zì¢ð{ïîªáë!ª¡¬¢MÍ”Pº@œíîR|kw™.tÎ$”ÀI­Îúj~Mà;JP£.´4CI½êÌ}5´žfšû| ¢ŠY—Ëô™®Ý¼¸†—"b*ñ5sZs‘€Š1Nø+âl·¼¬'¼§M·/s–ŠÛÄK¤¤â« ÷‡â@ò¸žmBöa®Û_ÕQqÆ…f§¹£¢ÍíüØ#ÒvçŽAãÂ.|Uî·6&7%û²ÿïB‰Ø·”†´¾VmÏšXŒÛëÊqÞ©Ý×…C¸¡Ë@…Z_ç–å*ÆõF!¶ìÅ~¡E¸½§¤Â‡gáÆT•â+P9mNéZ ŽÀ`’^ózƒ„ui#²ªÐ ´/Ðè%÷ÕÅZâðéÖÆÑÆtyj™÷²È;ÞÞÚöèð rÿQA=‰ñ¢—îÌ!–Cˬlr!‰ŒbÔžVcky6¸—ûÙ42*mº”c0 `ÓÂñ‘·PƒM¬¨Dwô ?§ÇƒxØLBÄý2M¡Š3͸£WWé] r}ÏÍkv»ÿ ‘N%Hï°ü ù÷:Ûaé¹6ºU#7O†øåð©Õ9¾`e-T¹È!mæ\Èõ᧬}£¢…LAî±Rwo;úÒÚTëyæJ²ü¤`šó fÊa§J…‡`Tá­Àëª;m^æT:•<¡œmñ(L˜%áè_Çs}ñDcÈš›ñ‰85Û7Ô·’êTÀ&~ˆFUvÐ'ÂÏH¾®±O÷E¢ qÎò©U§E>†Ö¿„E÷ŒÝ.­¸j)œ9wg"¿…odLÕ2>¨´§{Ìh2¤€L ­¶¶>àIò$#¥*¶ECàPgµ\0MPDZÜq‚Ƙ&¼wÓYrY8¥A™2þó ÌhßÜ$nm©Žæéþ!Ú#®úLAÖá®u£ªö.©3æÐ¥s‰]ÌWØúKÎ/•ý˜Vþˇ_ßîÒü/`_Ø<"â)¢èÊë}• eœâ$/ÎiYÿù$†£ßæänr™ õ’|BdpfcÈF¿lØÇ<:cØ!ìD:î•E³Ú°@$ '% °›ô"éŒ%}üup*æâß¹Á†Òxê4 ¾ÿ ˜í^î:@îÓõYRôÔæäÛ W¾øc-"†ÆrQ‚BM¤åè5;[B®%úü@ç#„év¹ØÖ}è¼ÅÂøgˆ\=3çÌÕk â3Œt-¥šÙÕ÷™,?̱æã§4ªiâ•U¯«'ì:;m%hµéªa1£·r’ÈS-¯5 ÅB®È ¡¶³UúJ<Ò#ç–€Ùy…|Ϫ«óö›¶ëg~ů3ŽíÁÙŽFUGtmlbIB*­F¼m…oظ¢„„œƒüÂL˜u‰f Þu.™§IéòiϱÙiq=j±ÿÅCÉu4£Øª¯Ë¹W`*ŒrÉñÇ)À›‰L¸l@Õ"a3ƒJ.|ÜRßhQ—À(^¨OxRˆÈk¨lÇü­²ÃHµy½’?ìƒ[0@Ü[´3V`¾’ PhW[/âÓü”˜qº“ù èÄó¾ìÀºV¬¨-¢'qbF$.a³áÎ{›'Õÿ‹nBá–îíý½ ªN(Ûµ8é§NyŒà®lS4!XU‹µ~ðÂ¥¦BuësPß7Ïýýÿpð…v” «?áT†sñÖå‰?’_,IÛY¦î4 f1_ƒbñs ÝîÃ÷ýNȇºSÉt&Þ*Žß !”R(^™v`ËÀæ«fÁ ƒ%x~]Úî¢8[aÝ®*)ÊÒ2VÐùîBâŸ4n½D™²°þPö÷²É¨ ŠV³e=K–ôkR®«Ûi]“|OÂV’—\þåʼ½3®ß[ârDN:|:qúÒ¸àŽ„räk1¸¤ÊXæÔL^&Žuxã_ÈéÐð2Ä7)O¨9®Ài¯\æìP†áµ5“§C›*'ÇΉ;"’l!Óí¬‚×¨T*XhN ç’ƒÎ?A¬ª®Z³ÿÚ˜+ÐÚãÛ¾Â~Ÿ¹`D»+$®ë#2oð{ÿç‹€kCéé²ÏÝWÜgJ)J8S-%»V^Û~$‹¼WKa tŒVÔo"ºô“¥Ang†QSǯ­ÂÀY=Áxáä›6L¿Ž”ž8GhXzÀ%ï]pÅ6ñŒ—@£ ^ £]yle·•F»m„-i«c0 ÁäæUò08®$3C—ÄhV£ÄÇs‚¬A …bB®Nv ‹5ãƒó}%‹‘}»jÔô”Pè%ÿ½öŠÔ,;Úb¤þMM:3Ü*’§ýè“”ÆÕG{ÁcÑ¿®ˈÅG18¸Æ`¦Ö¬¯T•ÌºŽº2XÄóuüZéhÖÔ’F‘qrØýþú¶ ;Óé™å4Y¸v {+ €?¸pñúgH˜öúô0ÈB4Ž) ÈôÌÓJa_EÉm:)ÓÂ3Œ° ypü´-Ru¯×éuxt#U|n·Çï Yû"âßF¼Ë/\k "QÝG ·Õ+…‚nSª)Ì@»K ²YÒ‡!,Vx†õÙË`I÷<°˜ë†!ïã uÏmp,L‚o‹|A¶¥*Ê%æ¹ÑcÇ`j¯-> uÙ\Z \›øhLŠEƒÚ¬ ë=%¢±ý0¬ë†AIRŽHÕWð®ùFöšùØïÛˆƶ$ºvúÁupOjcÈ‚…ºÔèv€ˆ)€Q `vìw=g0UðµT'þ©Ècžü°×bØ–!OÜßÛíòFß%"ES õ|Q¡Šßø¥Ó,¡ÇL;oÞæDmb½Ž… Q^ëVuQ4ËYÜFnÐÊDÖòÌÕoÅ‘-ÿ\fáðâ5mòî»dxx¤+j&ùí£Í7qì2DÊZÏ@´xB?иUÄAÅ]Ÿt›óc9ó|‹Á“Žb³ß{È”œ¦îgWT° ãýðîL÷ÉÈT2ä2 ~ñ¹s6¦ÿ±Ölþã€d‚þÒ>ô}Ž`G}‹i4®4i?†‘Mþhsí$ÆO‘Än±s4>S%³ŒW£EL€Ž`¸h'zVœ<4·“Öwv“ïĸ"ÛPÙåôùø…»¹Aáp›±z¬RçZËW ƒÐÉNÊIc- aéfR¾Ôä LßÏ÷ í|ЗOH{A7ú©ÉŒІ"â·DJ*rÍÛ>ÛaªYo¿×Öœ}AþW™I9¼ÛÇÛ–`ñÈ`Þzw"ކgïgxÔ²©ÙÈ€Th« ^ëÚØéßÕ|kMæß£0Ò~'÷ $j¦Ýf•ŽÎ„;ÔcJ —`PîÞ Bß(r©ŸJlb_½ýlq|{œØðH~¤6–cö«&fêsÏf‚"QW9Yd dØfa/i.+áû.w’@:ýäÌg.wÄþvF›þw¸òÃÒöß¾ðœ1†ˆ: BõGÚ›2'Úït_äÕà܆ß.õOØ/æÿ4¹ù.0[&Ô©ÊgòQŠYJ³½ ˆJÿUâGÙ ¦GtpŽèöQñò Úû’2±Ñô@Øïk•q‘HvÚvsx¥#Ngy[ñP¿ ©¯‡l¸0›ç¹¼[ºNF‚ÓM‘{Çr/wéèõ)è?ZÌ )wþñKŸæ÷І–´žšÕ¬Ÿu’Éu«e{K_j'“sÒÆ³]­µ'› •kFÆ;6#-Í GX îu¹nõmmbqò©Üð{x~¿â1o¿ @°Ë!’Ì€Õ÷™‰|ahç PlÛÉ`c‰»~¼»È¾¸twîÓ/‹ÍœˆžàÊþ+[š\õÇF<°{hcûèWì§¶nô=Í3ÐÖN×H#f®È‘zšÆ\rJÚë³ñ$Â,5Bišç}À”Ã-ÌÆ+ús›+Þoœ¹© ÎÙ÷TÑàûè~¾@EXáwŽüȾ#™Wy'ˆ+ •hy':OŽòýIKÎŒA“ÆŒI넨Üå7™-²<ß.N¯ñ0À}HƒÖÓÀ!Þc]RÐ6ø>[mïüí²û%þQ¼L†‰ïÐ/¥¹–ðycrQ¢~ÁÙJ̈Jó§S×Ï‘Bƒø aÐi·{-U’ðã×.Pêi£lŸjcyá­Làã@³ÞMeQ‹YV8W¹Õ”Î72@¼ÀÇ×7‹Lüû:µ¸nôo—¹bS©Åi* á"ÿiá¿ÍûiVŠÙó¸ ½hÒcxÃe9P{ú 7±>™·œâs¾¡¸„¯­Ä6õz¨ç…„3øÃ“¯Àäú’>7ZÁë—øwy!øÏ}°Eû;Ÿ&XËØ{­^úKÒ{Õ·¾ìõÒúß HÔA%l'| b*—t/ír÷s’¯Sû Du4í»¨“¿!S_.Ë{Ñfoas›é˜*ãÜðt5¶0Ý>”#éˆB±3¶rrQS–FÈ}þX‚ÐNÖ Pt·A>8Ï®î\¹öšÒtuËëþ#—»çÈ~¯dwø/:‹Æküi†•ã^µ†yŵ’žòkA(ç¡¥¿‚µ†D‹éHf:¤/öñ•5Êx ¹CM²¿ÛwÑA}É:&®0ƒG7¨§­©2?€Zš…ùt-;€,ôqÑôšg`‰ºH?³KÄ‚ñ.(ˆô ÷Ô?5{еß1NvH+§‚nÀV?έ†]QàÉûk £Q\È Õ‡Žz¦í|i LhX#úFŒG•Cú7ä­‘°o\dÑ„­þwÎ …éÁËìjʵª±Ñ©B¹‚ ãHÓS,Ñ ë`àýg|›OM"«ˆ:•;z˜iÌÕšs‰«¡G”òùPÐÌè0•vø8˜G™)¬Þ'ÒÌ, °Þ~ÜpLdÉóS]Ú8Ã![€XÀëa˜hjÃ~–•s`¬—7GHÙnY¿ˆ:ö"¢ŸØ¾Q-Výl]∑œüTIJûTë·ZCUå{]FnÌ™6õ/ÇÄ ÷u.I8ˆßzl²}ÙGŒßœ¿ê\Â_&¤Ð}}h䕪_—/ìj“÷ÕZ}ôeXðq¢uðÑÎØæø*ì9*÷ŽÉl¹u+߯ÞÃÛnm¿"Rî6q<ÜÜ¢ê)KЊ»a$oú›Óßq®&œ•.n>D/RûYÂ{x*;¶\ö±Ô‘ÖÔç b3‘ÃGÒ’©¾Þ÷“”X/ ÃÓ‰f~! LTfÛ½h2ÓÍ¥D–Þ‰ˆ¡fÞ»@ãè☥okŒ>˜&ìeÎSZ¡¿žwÖ+CI½b£fê›<©÷gº'¯Ñ@ÊØ› :fshÛ\¸2W_ê~ÚWu«¾£°Ìã•A¦Ó;®Œ¼d?ã’Y+y*ÞŽÖ@ÇÜ1Nžå B*ÆxÇ¥¼c\ÐGÐCxè¾ 4gÍwç°_ ÉâJ>£òå¦çzàܼ¡Þ\N£v}31£[jÊ Ï. À®Ì Í= ¦J e»šðÊ œ¾ ç:y›t4Jëð zW+ÙËîsƒ^¡±3áײڨh~ó¡ÄµÀ°5|5žü<Ô‚âö¡Àìæ\-ƉŠ.^â:zÔ}0­ë#¹ÄóÓá*Ǩúôî“ôçý²–.ŒÆ‰ ß2ÿñx#þlõ}OÕ)7»–H£¡îàÇt«*}ÿSZÙÖø!”KÞP-‡öbº÷Ñ[ ГUì*§è=Ö÷F&iñNÏ–u4\;õoúXP{PúK*ÀX«^ð©0ÃÿM Ûn¹úyEo³«¬ 1kPgÈ=Bô cr{C¶e`7{ù¼Ý'èâ:Ly²f/ؠƸû5ãƒÎåÈЬá)xkÂz£üóìKÿñ¹Õ8J—T,Ñä`G»GøæRˆÒFé¼usάÊ$ õòKœw ,ÏZHœeü€ÕX/¡ ¨"p#ŸÚkjºµñËxìeTÛŽc.Z7ÕHËhò”ílQ¿²‹ÿÃÎ6Ý/$?VR¿¬fèâ&o‹›9?+f0”ƒU1EÁ¬Ì”·#¢¢T ÆTšxcß ‘‡öð«ff‹Q]‰C­º¢àÃõmœ»Éeðtš#v½ä1 ¦lÑ~  ãuF6âß®µ·ú®~ë™Â‘aÝÖ@ÿׇãu$Ú¸`ä w*¿.†Yñ´¨8½˜hÙ )Ìœ0;ò85^áÝó̧ÿt²àÝWü¦ë–xŠMÆ\AÙ~>WQX5*´>-`¶FÌÑs:¡}ù&ç ׇ=Í74B/¡è šÃ¶|#ÀFº6ÅPØš¿F6ð÷sÿt ò—rÏDĈq æmÂÞ0ƒAS–P0ƃe›¯ û¹rÙÀÅêM |òY×E h¦5j´x] ƸãriA¿¡DÀÖE‰/¬(åŸóÍÄd÷ uèAèèÙ|=ÂòV^fÐÊÎGçpýp”å×xçpXÃo^¼â‹ó ¥$T/P@^?ýÈû½ÒYšNoç €”°æßšúý€¾ŠõO tžzGM"¿&–³¯Ç¨ ®€1Éʼn?ýOÆÂ!­¸­ûíäj™ŠÇ<w;Q¿>¢Ä”›¯`1îg"’É{Ðù¨Í"îšll¶o§T»¬Wã%e&t¤~(kD0’;eƒÓøL·%n±÷|F«Ìä.…‚ÌÃèºNçÉGè·éƒyF¾‘Rœ9®- ט“ÇT5ƒòœ¿y¦P£‘ÞAl0­É^ ˆÀæú!µRÂRx|Y"WxèÀœ3² ؇™Çï·•+ͽ’ áÞ½‹³—$ÈLX…(0Av0^â×óè†Oe/V¾©‚˜s¶Ë%-ƒ ‘ •@ôŒÊiH©ç/&Ôe‰(7 ózz&ž4¹+i °M7*bjp²Ø­W/höÕb·ø3„.8%’ §ÔÕ çÇ„›ýXxYXÙÏÄ8‰Í´–EÁq…:O¼ *ûS.±Ë¨~Òh¡úù;qÝûIn žÂûã½+@Å"ƒ¸ÆÈñv]p’asX] 0KæPRyÙ6?£3êUg¾¾³UpŒÁžò—p ‘ü0PNÏêO¸spŠ¿ÇcjÄ’ü_Žq^ê r ÂŽ~½«n¶5kÚ=p‘E!>ì}ª—dlB²³ÖQ«5¿Q+YDÎ\Äü®ám4]ð"݃c!º¤´]#/ò ûÒ¨&ãC41C"?yÒ:燱ô¥×€ pRCš¬"¦`GO ¢!¬{e÷1æšÇýÒ¾;æŒFbÆ6¢:¿ÂȾ¥áéŒM„1ÿÚÝq’&þc/þG˜–ÙÌ"/ë¦MöÄWçRñÅ.rEêg"a[ÝÌ ‰´`'¨ƒfiG´á¡m¼YݹlÐ|Ѓ¨™ç95åWšÍö² ÌŸ2Ö†ì‘3M¯Ú,°Ò8myü‡qÒa¨•Q†:\¸®ù0¾MÎÕU(ØuÆŠŒ9íªw’ÁÛ>:7‡1“5»Æa(-O¬% É’¿+ŒÏ=Äz•mK‘eÑTÒÊqÚ,iVvß9ÅcòN[¥>ú¢ ¥çtyüÄßAi;ÕCñœcÁJ.s)Ѥ)-Œ@s›.$2ÁÞ'ÚŸ×o9v½¬÷ ¦ô ±–stT‡rsÎG™¿"€+$A*ŸÒOs \#eTk@d{‰`&G>Ú7ª‘@·¦R~]ñß¹D“Lë’ss_Mz/ªâóºO|zý% ¹7†d‡Ä8“‘n¤#§±QzhŒÈÏâÞ¹séO@~e¶À05•édÂ7e#Lû8œˆÑ¾“±ïR!ÿû¬y›ö÷ÀúÚJWJ-Òn;J²ÈKOP±ßïÚ‡¦1@]¼•Y¡ø¶aÉÙpYmX•šçŽÎ€‘A5Í›Ó\J€p¿™I¯ÿ´;h&®ñ*”Âîõ“3(pz-:×Y»ý.“w?äš<Ѐ”$D¾94ÇvV[¬ŸÓ;ðþ žhH~†PêàG&õJ0|ª:ÕŒ"‰È  îœ¶T ÕºcV­NZ“l¢m%äþÕNùÅAöþªáÛ!aèjGÑCeû©ÜçÝT›8EfáαîEÁ²Ã÷wéèMbÅß'øanñµ0¬·d”@V*ñ±5>™eC}LÄ·Hâý!B¤ž¢Lø–kÚ:ôž9Ïýi`&ü‡…q×uhwà&u(9¸™YøúrÐ }ÅËhùµ?eHQ»nÄBç'î}sCUY7¾OÄŒh°³bRçCMï‹â£Y «.«Á!@a †•…úC /–•U¸¦:²µ€EƒBßÖ¶´Ûq#ïƒ%S½}#6C’s½ÏˆN='z8‡öm“'Џ¨ùZY¤1Ùud°îù-àJ¿c¾uÑVW±JfÖŽ@(­5¹ÿÆ¥ãdf/” ý“¡`KÄqõ¹ÝŒ/¿ßfH¡àBl¶ä³"Øhƒåœ¥ÎËüP6«pž7±™Î‚ûGYs»C~Ñnà Xó?Ntü‘˜›+eiœbLˆ‡§qLÝ-, ¡ó·É´°ôߨ0åJD2ho& zÜðëZlO©^SjÁxyjímž®~y@/nŃzÞ3W°šËœ)&û˜Q…'P LÓó]™}hZP¾$´d-Œ”=BŠAç£ õ ¶²JJgvð˜<Ö.µçµÂ/}Ê~Š™(8(ߥàSÒî ®¹9 å°°Q^×¥czúšPí ÉhçïP-S‚‹¼@D‚nqqã’Â$Ó®‘ÃëêŒ<Ñèwu…-1P¬ 1Y¸£ß:ç8ãŒq…Ç&9PÍUoû Ôücþ8­¯o†0Ž —߆44¶m”2I·ùäÙZtªêÿt7m3ª‡€žVtbúµ#fg_ó°ÅŒì ³»á¿¿ÿ‘²œÇãfÙȾ’EÁRWp&¤“ÝÀDœ@(1NÉ¿û2é%öWð–6oÅRžs‚ï։¼ÑGyUò#^Y‡—×y¦L81rí>¼&²’…L2^óÊØ9‚>•ˆÇ,bV($+¸'mÏ»UL)A>: ¥.Z*Ò¹ŒZ©1ȃž~¢ÜS„á(L›Ôz^‰‡9؆ð>.ô&0ZT‰S†ƒåÜ%ù^Xjhè•!±&lR7ùìÔNÈ žjõ<{Ë1V¥¹ÎûŸÁx#ù”Ó&3Rfù:}\…La$É'¹,Ô¹>ž(ǤKgŽ8D“xb<;÷/hW B^}³3‚‹‹t(yPè=(;¼k`ütÔì6–Í`NêÕ"ùÊ,]2`—wø \¡sMä~ZNª§ÅòèT§uCûfNHãB 'IŠ®|ïA{¾:g <+@Ô™ÿÔB™¤³ =Ù1]eØ=:©¿å*8†oâÔÌCͦ7á!"Ô‹…ÚÐI‘*˜½@®‡ÿB\.V®­­ÆÄ£’†`¸vÊ¥­”‚IüÊQ\t–ÚÜ>Ÿ®åÉßJKæTÍKøqXÿÍ[̱Rbé†÷Kûõÿ§!ã¹-Þ.ߦ¿×‹€ÍÙÌ™¢7‹%m¨2¼>:»Gç@§D~E6‚È-èLyPrŒôûL_ú0'øÝ¼ºàÕÀŠÔ>Ëœž:OL*Ü­Ðõ5ÆU9Ö¿ÔË©½M$ìÇå`Õ¬£ ÆUÇÓ0á'õOèÔV Õ˜Bòß&ýa_’XNŒB‡Bû*h}Cµ¬ˆ× _Ï'$]ãËgçÉ ëîÞË !™È?rCÒ ÒÜ6¾ê`ƉÙ+%ª¾ŸÁÂöè;Jp¸fåÔ„YÑŽ ¡Âny[ëó¹Ë½oRkEH¦âÒýÌv”Ð~§’5¬¿ÄDm¹ÉÃx~Bî°û*ü1K0PbªQ«³€Ö V[èùà=XaþS™“t„'\¢ B¿ç ×n3ªÃXø •ýËQ¥G`\ôÆGŒ¾µoá²íã²A»-I²ÊÒ'ކÞèÂA³<ìÚ|9Õr‚öB;¦u¡Sn]¬VAQl…¤Óƒ¤À¿IkP|£é°ÿñZ‘ËmDŠ#foÐûRJ¨áRú¶¶w½s¤¥~¦Zg¥`ÜÙ™Úÿ3ö>’½!‘1R4¸æ_CÁn'rDF,¯½›ø­N\q†¯/ÇËk6s”êEŸF}«1€VÖ“ýe¦ˆÊïrE ’Ýz;›áo9ø³?%› ¨œ¯BP%{`„f>9%j̲UBÊ#ÙRx úŸÄMQ8kÇŒA’šË“ÅaÉlý˜ÔÒ”_»˜ˆƒ9Ãѽ!| k@µV‡f‹“pu&¸W¼l!ºcµcÔ#_€´U7YÖŒ Â6_Ÿ[ÿ…ÉÁ,–PlxE®EyÞµ– K-jnüb9Ú±ÄtïGÒÆS‡âhmÆŠ%¦RÊÇ£g”­MìºF»©?h:—«ÂïzÁ/¿.rÐæGL¹É@••¡ìÏv+5 ²¥Mã3ÅQÓþ⬯nzT`œè¥qÁ r-üȈÒÄ ÔÂ{£oõòô™Cª»¥ç N—Úš²ÝÛ‹Ã¥3;ÿ& Nì\ÕǙř]_"«)’þÃ@µ«•›°3ô«æ´Î 9eòšëÇÛÞGú‚c§{ÔP0ý¢5m1Ò ÄnæçÈ­GÆ’øÏPÜ#ZE¯&䤅ÄRœ­–ŒÄó™Uâ_ƒiåû€‰Näžï¬„©º. …qáͯ9}ðñÖhxØ`XUéõ šìÙlO׃dú$8¶Í,Z?¶äGË‚Íé«ç–AŸö)Ël¹ ŠþØÈæ«Åý°Çt€ötŸoÆi)£žS«yÐ cK‚Ô¦Þb¿‹pÚÌB3ÇÆò)%@}8”,<‡Í!‘`ac‰”GAQÙÐ §ý,¾ìøÎRÕnK”ðO-¦+ÇTbZO «¶*÷…{–ybCMÓ¼×Áƒl«w©ªaf´±–Ês57üFÙY 4Ω"t¥¯ÿ I¼iéÿ½µ'í¿©¸§Ÿy,¹• ékøäx›h¸Õ5A&@hÛ¸hÔ°ÉSÕæìQ¯ ¥Z2”ŒT«¤ÿÉTcǧ­é ¸A°œ/"»ºÛBë‚;SºŠ gëÜg¿ö1é?{IU*D7qs+w3÷äÀ€°'à ™×fF7ì¦c-ðþ By½ó>÷o¾õ' ñ„ö[¥‘oy¦¬wZºRÄ|¢è×Ìß‚Æ@¼ºëóãXW¥;Œ³V²öu¥»Òi Ÿ3t˜òŸÔg¸ÍêH¥ÆT ]gk¼¬Ta¨õX¢®ll:a…Øâ ¤žä ´$­-åÖZ[ë˜ÃûÌÍI ¹#³«ðëÂñØúd%ô2äÖW±R"òÈJÃ`ÒŒOþBÁb>ù;¢Q¢ú®4oÚØJI‹Ë:ý*`M81ÔPâ,ÊÙ¯ÑÔN¾Ñ(C“(Ñï ¡.z$*€>¨ó*¬þd/– âs¿Åä~ûï=%+¼þ&eù×Mt1j…•Ó¸fÿ¡d¬¢µ!¡m!À£÷÷R°:z~¯²ÕÔ’iº˜/O{Uåec]ˆ WSKº¼Ý°XæCÏîQŽ›­ßD_acÿåT¸Æ0Is?!/uÂÕÉÒmËÖ8xÈx¿ädúŒÕºÕ2=hŠÇQ`uØ eá¨õŠÈFC?lIÎÀ튌wа—ä©7ŽÈz317H4c Ëö„¦TcRÞ¹ çè˶¨£¹cnÏ`âµ·!³œZˆ¾ÿuy³TfR7ôIÕdf„ dþ:óã7™ðxÖb¨ñ[‰p½²A•"÷ä¤ Ÿw¸j²˜‘+V¶j:{v‰7@‰­–:5/øN©Þ–pž³Š²…Ñë©hk_ðe‡…G!ÊO_Gˆh=¶¹gøöGÝßÉí„á$7Œ4OQÏØä—ïÆ@Ò% €€0Ð“Ó hp¨2œ••M‹-èÈ‚ÑW­N!àf¾"ËU©›‹(÷/†Ä û¾ä„è=ý³¯]ßíQÂ=V®¥ƒP’{™kWì‡òTv°™¸•{×Zñ¦ç®¤H÷›³½šÆT|bq‹×F¶\Vâ9'y8RÄâ׌‘”UÙ°­„?£KµîQôƒÕŸLÑYþµùOIr×ßþ…Õ v®‰ççÛ’£ÍÕ£ô,0"&°¢š'ËÔõÝ¿Ûÿ/¨qô…éãMÏ&“’> ôšG¿c-<ˆÌ-Ðl1m¶Ú@rKŒ ±È¶p)è²ywaÓø¤`ÿÈ~éìpÃÔ‹<¯‘8³F(è".Ôsüú‹ÕŹ|½pÚ½=êÖ¾;0L H”Óã °¬©hûÓA> |._ÀŽ£1_ _ ”Wß/zã½oW•þ»gçé%,Ü{˜DkÐòü õ8WŸžëü0@ìƒËÏÍè~x µCš=U©;À s@AQÒ6š>w.«V…e2,0Ö&øŸ«Æ” ¢“Ñ‚°#óPá.1”¼q«])ñ¿åVD*fˆtò®Û#Ò¸]ûÎs&þéZ·N@¢çÈÛä$Ùn $ŠÂà{\ÁÂyÝ·Åáæâî_8=ëTª†ü¥Ç””¥IÎÓJD¶= KR»Š¬$— ÏÌG0†¹Ã+ 圻9©“ÿôÅf%Ãàb¶˜”‡‰7‡x‚–Â{åF9 ¢^½ߥ­Ú±d k-²øÑ[´0œ»€pØÉAEÓ÷ú4ï¨4huÒ1ê{íœ-Ø“dbó\S:»à¥GTœSå+í`ÑäÝõÿÜÄœ /¶OFnmÕv˜Ôsú~qjX}¨~âèQ·Ü:äK+á®›¬KL#[{ðʉù-Y0gó÷¢ÙëþR!™œ=ÎFèKíP'Ø^‰âÿ{ÒiNX<Ù¨ëüç¸ÌÅN?S$#]žéà8@ž¨ô4ki¦}! gÙÐò[°$š´Ñ…mšžÖoR${Q3>ö dÿG¥¨KÂÛ¨3uçQ[mô üD‘c0d @¦ú^I€^Ú¦c¬¦8Äl·ÏÑÄÓ&PæÙÓ1h×wê³'Sº˜QÔ‚¢'b·QJ™­iì®2æÝs_ ‚Sò–rLWñlXxå=òˆZð[£ÿ¸ö´}— º¿Ä×Ö¡V¼Nwížc† É„˜ûÆÎ?ËkÈM!ޱϫRC©]MÞ4*üÜxÿ¸#©Jˆ²¯sÏeR¤bsŒŸÊ6´)_k3:‰ðx†‚²\üÞB Šò^0$n]r ÁS©ÎÙÒoÐsÅï­žkŽI«”çî•'AÑzÉõE:$G¬o&s;u5àY©î›r:½0“¸>׬æ,žãÂçW]W‹Ósvþˆ£ùsàP}® žR$¬üüçöÈ3Ùˆa…GæÍ7u«Lo¿ ÝËBžGnÈ£þQRš#‡ÖeC‘ÐJ‰߈²‡ç‰EjlÄÊnï€'xì3>:³íÏO·s9S-xíyVYq¾ Œ§an °Æ˜.~ø(Dâ*äi%_[ øw¬£‡V+Ãào 1 ¶?Zßçƒku:ç@ú8Uˆ§‡üA=Ò‘z ^þ·=¨U/ÐØ¤ÒÌz¶ŽÆõ’LJŒ!DEb=h”?k5,;jJ‚þÞ•(íøŒýßÜ—„Þç|¡{„M½¼o›?Ë\¤ê¬#o¾D=³)_6åW0š‹¸Å=ïÙøã%f v’  ¨·òFP»Œ* œ1£€ðÆ›C0ç(¥ù·ÈEáwÊè’ÏòÍ–/æÙ ö‡½OàÙUC¢Ë³¸ÆÏC@7£Núö>ëûIœçÄÞ’t3¥hàEÝuåaËuÙ8Æûó–„u­¼{l¾Û¥´œ¶œ[ÆÃÞøùÌ\W&—^ö#@‘Ëào_Á-/ò?Ò»ëÉ0^v°ŒHø ,‰ŸÏ ¬¡IAäNK·ª¶ wßPMÙ¦jÕË´œ³NÛÝ•¥ n©u¬Hø©Çf™_IaÈéÛ/Œ›ì¦„‹Êcuȉ5è‘?Õg«®4‹ÖýáÆÁè%gezùšžÿ"j_…>5'n-' VF’1QA±KŒEËkU$'ƒ-Yè„€è`Zw2ãÝü…аX¸ÍDÞU⌺ÝË6Æ–×±e·“ÜÙçx{8δƒ « Þn᪬ùÖˆÞ˜I…Ñç‡KqËàA›ôtãÀ-Ö'®£ù1CÓQŒQË<½GùoÕ¼4V¤2¯›À_r=˜ìUw£Ý]9ö~„)S+߯ý£*Oú}’£LUì¿Wц×tì>ìuUú=ë OJŒöüÀñçç*Ë›s›n ›9t*š!DðXŒt‚jŠÂ^‚žˆ<б¶ô´•ÂYNئŸ-|³ÜÛD¶!¦yx[^iIñå½1Àlò2Ù•°ýfýd-dmú¼å¶F ”çÔëv_¬º7ù¡jä¢>Œ¹¸è`Ë&åñC1XBm"8Ÿ–2vL+3.ŸüÞa*çóïk‘wàJ^9ÛlPƒ«Ä/ìÝ}”¹ýC–‘´s·Ê]!)£î¢kþµÙwT ¦3ÄnËLþžÅ ðZÝs“²xôöÏ")­ËæfíÒ_ôKL ‚}X>ü@ ï}¤–­ü@Ãl³£yé’ñÔþl°7ª{um…Ú¤úQ®S2~; aÿŽ´‰“è9Ù·*2yNV³ö³‘rý*> LâGØ3Á¥—Rã^Òæ±~nØ}W†T`øG@rÜloµ™…O: , ¼@þE»3¦ôý»)lñÏ…‘F]=`š5g8"¢Á}ÉöÖ7Åyæí8jÖI»ƒÓ­îEÜWsÁ*‘77 5²£æªuöê>Px@gÅÚ€NB ò¡ïY»Ýpê1ïè(T“Y¼žFÔG\–X€ñá+TšŒmë•—bb[aÐs÷òh!>'ð°µjî)Í>iü0¾M«&8P¦ì†T0Õw(‘ãéÑA}Cð7ãp¤½ˆfê=„½Úݵâþ˜ªÝ(߬36KKÈCáÁ ‘ +¼¨ìÖ1¿ð‚¦ º 9¢f{‡^ße,¼|ê•í¤ôñzõ ´×O¨£lôy0 aŽ¥ ‰o_#3ú{½Oü\–ìH>”Ó{€ïÌñÚn솳/5¦‡Ò¦”hR}|›öã5iu¦(ÞDíúX{ca«à1³n ÙÓöÅ$»ávbÓr‚¨›òôiMX‡!!k¬ó|D®ÍëV±Q˜³JÈŠ¡hWÚÛ fò(þr™‰"ô-ŸNsî_Iî,½iAÿÄ´1šýÌ´þ¯+Mzñ°È}бšHNÿ¢1þéPÆ*ð²¢Õ#/$®GFë= ÊE¯âq€Ñ©ºTOD“#LÆ.nqÓXF8d܃·žü¹YaËYù%Ðß¡ÝÄÒóëkSu«`½Ü¶×ßì=Bú1S{ÀÕoSé`^œÊÈ%ìAÉ5wsìšÁ™|XBi·³sJT]rvÔD®IðµáI^*|ÊÝΡ>PìPÁû€°&ÃV½…Š7Ìdè1üήÝ“nkÆbd¸ŠõKŽÆ,n…Í’½ÝFë¦ ¾”“À«§âH¼¥fN!ãÞÂã$ÆvI†JFrgÙV´ÿ#'#ÐWŠñ¾v%^€uîJٟצúê‚Þ·FÒc'ìm¡.Q(Ö.£ºmA·ÌHŠ'·ßжD_Qãu¡×-¡Zù»sÞÆ¹üœØ­®Ø,l¯s”™Å¥—(ê1ÉØjÓaTÂÀLýníÎÍÏëVû«Â4‹È4ãÿÇw¿š+✒;Œ9Ù$l'õ:ƒ¡×-bî ™#ý´|PÇÄ@6à³sç}Ù%0»'Ô¤Ül™ë¨¾eRn,óÏvKëM¤jDdxúή×!Øð”©¤± ÿRTƒ¥üÊ€[cY$›a/êäEdõ…ý®¹f|DÜZ½bΡ’àû¿ržê[0E¦í<|l©ÁïvŠ‹`ƒãã7ðP³-[ÒH&pÍöÏDü Y)[UoR›OÈJ¦8›lÙÖµ\GÒ—qñã~ÚrOhZ©¬ÖÖF‹¸Kô•HÒëõœ-?DŸþZë7ùˆ¿þt´¢Zc¨„ÙŒ =7ÅMÔ–v”n²îNm§=µ!„<ƒ—"*” uQ†ÏnI£ëˆ8œi¯Ú¾®G̺À,ø UñŸÒjj:´ zÌqiÖëÝŇrØ¡aVãþ(y–8Ïh¦…2”{&|¹Ï¹ŸØoø™$É/UÉ»½4Œƒ ÀT'8.Ù5îê$ê_4()÷²/êsKG/3ÂȮɀe¢GýÞK2Š Ñ¿é6òÒLf·<jfÔTü„¾Ô•ÖUqá꟯ÉБšmWôDbÔˆÏRVIúCOëi¼ñï,‘ϳ¡î0ËëF¦çÓýçÚ1AÝuBŠý¯³(f¹ t Lž,XÂ*ó–5‘›xvaB–C­.N]o+'cô±†@óþœU¦Wá1(>ÓAåÛ–¸ÛoÃÝ·%WÑŒµV ZsܤJål‚½­¤1Çtoõ½aø¦º”ÍÍ›9å­ÐÖ8gƒ/_¯åÃØ8 ÊØÚ:ÚÜa êÝûîQhìFÓq?2h¢cUß<øDÐXrq‹}ÙL€*À_•—2EÈÚ|nÛdYh²ÎHÈòDr¡®PE$ôwV8対]4%wšoRöÕݰÈ~´ØlI˜gØä§3Çg¯ƒGÛÏìª÷ãpiýÒ¾r¼8mäÏÇ:γHŒÏZoJ[´'U\úòG@u›`ö­ WM— ÄU`5 éê¾#Ìeï§©”“A¥Hu¤Dì #8-´8¹y¸Ô¦¡¬Ç VawV‡F¦+ŠGuXĪM‚JÅÉ2Ïx•…m>ôã+j¡‹½wº:úfHínõ—ÙÍÜ`Ünz`Ÿ”ÇÈÝ·:¹$¤ŸãwR¦ºOñãºÌÜiQ´QÛÝ«‰~âѕx.hï׊áa¸mpp{{$ƒ…lƒµ–`4ƒËÙ™~ŽbIðV½Õ-›³Ö ç_òÔxS@oÿ®Ç‘gcL ‚’ ëŒek~zhŽƒ¹$ÈX«\xŽL}ñÂGE»N´r«7Aõ $Ja2Zç'«L_°)f—òF ìiÖáΛX ¨Æ¶s ê\÷Ìˬ­AìÊjYZ"æ¼å´öÒùö5ÖÑÂÞ‘…|~ÏB;à?ú{v|Þ¸ùÿÅ¥’þb_ÚˆãþÔ‡Ù3ì,çé. _¹Ñ…ðøy,Ë2±" @Êf¬qõãÊ<ó¹7¬O„ÀÝqéñdJÕSŠ`//¾yj6*&}?®é«ç}[¥q®Ml,¦Êž|"ÖáuI&”nðRfsì"acG¯úQq;ˆ1H®"[(€˜ƒ–"~Å «îÎÇk IÜ|pÎIƳ3ãsJ:‰tÏ/­‰›G¬òß´p#.QNø÷¶ÇÅãëÅv¾ýsäŒL´ÈŽgÙè÷ øƒíÅÀ¤5ŒøœøÃ¢Bã2fÝ æL”‡l¸™e‰Ïˆ /ò]Áò§$k¾†ÿ“n¶ª€w˜±µÃ åô­K”Y5m÷F‹Ä" ÷UòNO ˆi ÙÌ)”ÑA_97‚ÖÒT À]/‹°Š»ð…O¯Ã–€6€2(„%8ôp`Ø0Lr‡”£ðg:ä’tuƤ;&ÅÆÐŠ{×zÂftÏXOš E쇽ëä-“Ðß ²ó‰ÌYmŒ,òjj¥m¡!!Ý» B9t'}íóGé_ÄÁ»{%Ñ÷–5H–9rdú:죻ºmåƒ(0DøÛü>^‚…¡…ó›ZRNÔdú•"ëÍ®š°€nòœ=ô?#{üå?źČDÞ$ÑWx·±v[C©$ ‘áݧc“žKé%tØqÊãOÓÜNS»ˆ¡û5Ç ¿ß8Ê¥¿šZèU»«uø?D¥Þm· vÚIÕ7KO·„`€z©ùæä 3;dÍsì’tg•’1†í—¿"`2ÝÑËèÁÍ^P?¤b톜3Ÿ…µIOjt»“p&q=º9n¸È¹šžô^£á€V)bppÅÄ.DúÐËu@.'ËÔeÑ ¬ tñ± KÕ¬³™…»Ý ®KKJàÏE]¦µ£¡ºžRôd0«‰£Ãà2èH¢éÁÈ›æЕÍ6“A^5'a%îõ•õ‹2]-¹¼Ä¹!ý_›ò¼IØs©/Rîmºx§ ·¾WèYõ%'aP|µ"àuú…×&Îfð§äÆ-W_%¼žÁgki¾²òW •—¥¤ÞÊoÇm¢ÚªI¢g»ã AM|pw‰4Bh@¼9Î0 ÀAúœ/­-ÚàIÇ£ ÓÞVk÷U-­”£å9[gµÆcïè®,¨js<þ/:/A/#}°K/‹š±°½å´¡ÛQzÚÒè³ î.)° ifH=¥C Ú®ÿô"Ö›íÈ%—õ'R±Ÿ,ªõa;çQuX'!>Mí–…åÇ ÷”b×UL#>Ž´PêÏ~ ÒßͧµB©X-T†b«›.LÍœ‡Áú<|[Ú„è6Wàoœ züÍëZä>;.–ë÷NWMgWu¸M÷Tî&›‡jW'Μï¡uÑ¢ŽìîCüMëç•VÜw§ƒ‰['Ãr—i{ç_ÌY¹_àšÄ`™9‡Ib,v¦ð’gŒílà˜Æ}£ì5KÒéâfè¼Q6Y/+mÝDP:øÂåî•/š# æ´H_áO×*^ Uï¿G3sÖBÿbÈŠWbuVFv—P'¶Ôš%±l¯r€‹‘ÅD\Í$Iš”‰ÔòÎ|·ÇáCµh-ìA\ƒÝÚ»p¢0³‘׋të-_¥0ú­Bï<ŒŠ¤Ll9(ϲ µbëGÅUO¶Š_óàà N÷vè„–ß©A…£R…Oºjޤ¬tK)[‘›i¬¯/².ÿ^ºcWEÑD…Rk±O”ÀŸÂ…Ô2œ®ºÝE‹¬ôL¢Ì–ÌÐ 'ó°Ò˨ã¦f;ë~‰–ªýŸ«1ucÖ¥U'éî§NÚÒìKÎ< xEVàÝÅ»açâakm¬ŸXŒš÷À†(ǾÖ3f’}Aeº|_´ª?Ê×Ì{ÛoTüÌÇø´ :!Œjû£d^5?¢/™iÎ;¡–úm±0&Ënr-¼Àx{ưuJ_!†I¬)K#" ]9Àé'ß{Õ‰¿p_µBË ¢_;°†¨8š}e'¾ü¦•0æ»”#aü)Á”ìšÒ?S™ H-.Õû?c¯‡p›Ó§je[]G+_éP~6ªG›é¬þË,&üÍ)¼nÕR—ô¶Š=$ǘDõ¸éoZ¦£èG¡¨5­o2ªjLÚÝçRªbäzÂûžpk{´º<êÃ_Íiƒ÷×zÊä€Êu¼çB09r²Õ¢ÅJCžMÛÚãɱ£Ø=[¢¨Íx—Ý@õºÙí}6r:¯öù`»I=MÚx¬kóp)ñË:óŸ|¦Åm#ß:e¥–ƒT•SÌ‘?Qé÷€*“µýÁÜÂaèZ`õ$ùÿ‰,M³wÖ4Í!.:2,1¿´›²´ÜcôLÿßyÎ"ûJ´g7, VÓYæúwãv©ÇQùSE 3LØ¥VË;%¨’AïºpH2›žµCp06»Ú¨{K8wáNoq6ªLÿç" ®N°ÍÞ ºrF"¹ðx$G±/–öc<Ù£u‡"¿}Í]dάjšs¸fÅ‚^U«r„A‹¿JÝWÜü ƒÒgiÖ~Ôeå‚)݈(940ÒHî•M(Çç€vƒ é³(³:ÈCåO´td†2²(-›)½&;¥„æohGP[Ýj¦ÇÏ™¸ÊQ¥Ã_P˜`¨¡–|̤*žDJ›%RL³•ÈíäžJ˜Œ1)ÊÁ§ êA Ò²ë=(ÿ”â$BëÖ(ö!Áí÷\ënñiQ0môZެœñ( 5¼¯p>¡sbömšÈ ñD¥Õ!›Æ™Å3Aåí]™@nñK# óRL²7ÁÏ)wÛ¥]» ;´y‘«icÚ&ŽÖ`F]l?©÷ÔèWþE V‰+ã¿Êaw´E{c‹uéœ&— þįíÌ馷½a­œ›Ò¥®¯ÙŸÍà.Ûf­ñÏ6'Ù£oMšËgxýÑçJz7̽Oøk“µ«…è}ÎN“¢ðÄB¼R¿›¼Á›²_\2XtÛÂZ$ÿÓþÀ}¬¼kU±w£ûwŽÞtËßsA=Þ°ã›ZB³T£ FBP2o?)®=>ýïË xÎêcâ9V¦zб_ht]>i}ÂCä/:áâÁÆhÌŽ[êA>aþCºãP7öëñ­@âSŠB\, +¡ËL•'ѾÑà£!ª¾48'â#E OÚ„ÖËåœ. M¸•* ÆÉZø×VóðXT'Á} ýŒŠ8S“9ÆBŸ?öú»„ô®+¾jæ¸~&±ï“‡ô+zÀ \é‰mzâZÓG­üNQ{a*<›Æ¥ØÎz [Ôhu…®UÏ&äì*Évb cfy}Øœø´ÂtpTghŽ€X¶­m€ü¨a9D?—û}…â‘”P*ê7²ˆ^çK¿€¾ÊOW¶ óEáÚçìvœèÉ&IV$×Ü?­AÒh%€R²É"_ËZˆg™š`b~|ÓY„Mø°,'¸8Ÿõ©a–†¸Y)„¾9æ Ö–ú*³Á²±ßÈ"×4Vó‹¬eb%Kx|2¾h¢MyÀªí\*–9NFY«ÿB2vIò§†þ}êß!žgQg—ˆwnŸ¨²rz? IÂüJp ÆGÅÅ¿+E±MÚ7LKTçŸi=‰èHbRGdµô¤ÀT·B‹ƒ=„íÌ|i›òøGÎSQrج˪<$¶ÉˆAª—‹¡1b–Z’ÅÞëÕü÷Õ©\Þ›iÛaÑÕͬÄ1Ê«k›È´ç˜~VÔ;ÖQûJLíêdtþzù·mo¼}TSïx&;¨E›‰vÌF  Ý£ˆñ¥Ði´0î5ô]¸òR޼¸›-u‘)eÁS“ÇWlµ³wˬ‘éܸŒÆaŠd¬òØ^nGë—« âÐϬÅEvd!õ˜yí¤üÄКã•nÖVãîåÃVÂL@ )§zA Éæ¤¬àwÉÂ$¿œîÈðÿï<3¬ªê`@ËÝ•¸,±¾à¢l; #Ã&fÔjí’1°ü®¡Ú ^¢!N$0½¿Ù›k ÀˆO„ìˆa_CÔ¨V—#R3#"Lj®’—l‡â”øG­q¬:tDõ$³9Í;Ê ¡|ö?踕Ç æÃ_ݪ¥·\N=8¨ÿ'ä« ‡Ù±:Wg›hIü*lî™ÚARk^rò««q!`,N¾×*=¢Ëƒ¯Lòž…èü—{Ý"–Ïæ8š7ŸDÚ¢wî{ÒÄ®ªËÇЕ+,g8Õû¶í¯¤²,ÝÕýΦãõÞ„v¤€Ó0ì-Ç P\2ê)rßuqÜ×f=ýÔŸÂí/IA°¡Ï½k! p¼Ü´‡íb)ÕÙÁ¤Ãê̇”]ŸjöýwVÛÝ ;±%ä)À”–0Õȳø6‘´o»Î¿€j9wÏí3xÎi‚[Ÿ~e`‡#å©húŠ`„e!:¨39* øÏA}OâY©nÒµ™E¼V,k¹”Ÿ+¢§ Gëøh¬õŒ,í|8`!À…TN¦ÁøÜB=jýö¦ÜV°\-òþéx––Çâ¦Ìr=t5ÁŽ\ÄÛ-ÊD×v°zÝ­—} i„Ðr:õ Zº6NÍ:]vЧuš°fš¶Ôu Ešg&ï¶ssçû†&J¼§r+;,=Ovun‚éœ!•÷ÃX†±·ö”+íjãâ^¨øhûïþù2¥Èþy?984Wb8«âdIaj›Ð<5t0à ä±YCT¦<üAHM°…YA§¹‹šÆeYÖœWòD>'°Ç*-`ž»áýITÔx”x«8Ö’ wϰæqWwôN8…FSh2”— ‰ÿãÚqÈ8P4©Êr;Ê`ŭд=ž0 4YqÎ<¯Æ²„&DÏ£·ŸØ§ÊMÌ]t!uÅ«SrQõC¯lM2$1ºUëÕä—KW3.N‚ÒõŸ,qï.tÒòØÁuP/FzžáØÜܽ5Ýsc¹S¹ß§å'_íྑ„3¹DÛJxBj‘óÓ üÑ‰Š«¢`ˆ ®»K›ŒøU§ºvìSbÛ–O*´v ìKSˆ¹ñR/9^Q.޹i„ýí•ÀÄþ˜Mî¿ W„>öü]Ž+²Yn/U°¿ÐÕ€«ð ÷_\õÍ‹b9]µ}™‰¹… r ³OßÇ6‹¶Æ´÷³ÿÉöhD•’ûµ#b êÖ~•¦Â0¥+îÞY3–ZYçó”÷P嫼+Xù£‡·qÕÈôÇõÕ¶|«ÞôùÂ|ü©Ð6·rÙµLàËÑiÚé‡7e<·(”zlOÝñ!ß‘¬–dÐ<☙’êv“wgø“Õ€ˆêj©ÙÍdtÓ°XõâŠ&ݰñÑùA[9}0ÐÐ-¥¹‰C²»\ûœµ<½Mgxq>nl"ÞÔ©Ï8èåb²¯Ó ‹èœµµ î!©§Ùê˪Pmz1sÛwìQ ß`IîêVÜ"œÌE)Ïb2x†ëc§•³d>–Ðé úÈÁÑøŽ }J`q°µ®oŒAø“,ifŸÃèä© r³çå à"§¡;|Æ4òi?±›üÀÄ(›³ÔÄÁo¬;Ã\š;†UB)]ÖpT/‘Ϋû\ÏD‚7.%tNzçµG—+õ$ÚÛf'ôoÞf³é,—P|"yŠ·(Ç8ºÚÊÞÚ5«]8!UxðY‰W¤Ìý—¤æ*KÌÙ%¸¬_Ôç{Se¸ªÌlÔ§+Þ]`5·kë"Ó¨M>[#Û}—»S’{µ.Š¥*‚Ì}Ó„/Ô5–ÿEΨÖØ²§ÈI¬…íÚ¥wyè Ü #…í£óŒèkÿÂQŒ% /CÐÅ3”VÊlq¨ßH•ÛÞµT„WMœëúLxP )‘B]Ÿ>T®"+ÀÄxÈ@¿·~Š´Nö¡80A`q7JÚT" ½-¤Ã!I¿Tñɲç¼Ò-Å2(äbTÅ»¿t/E±F~o7zâh:L†B!óO&8ºè«V®Kn—Œ£ÂLygHs-}†’BBÁW5Ø™\޶‘jwH¶$oæ„m¾åèÊH§ªJ„b©Àa`Ž5 Œyø:–9ÿ.ÒêO»Pzì¶L;öTbõC¬«Ž‡c%G ?ZH4M .%Bö"ùàßö!ù2Ë"·M!õµ2I¶2Ä'ä¢t”ÀÆBn<ÏÌDOfÛß/»Öïskz(+WÜ9¤V*ë®Õ#Eiÿßw }•ÖÕ?à!‡üÔ‹=ŸæÑ#OÈ­I[ŸF‹"Õ*›,gö׈´”T7[ö Ò¿p}5tlÙpž çF‡øI²†¬B©nˆliƒ’¡Æç9PnW‹ Uz>Ëñƒ’&AjëÒºñ¬V¾•{ ´Ý)¿…®…tï]¢Joz»1œL­gN¬íÐŽ5¢‡š9Ëd4êö=/¨Æ9\”ÂôCJV-·w„™î€íð¯åÚ^6œÒÂÙ¶u_É­xÃrœpnµ°:‡œ.'‰i¸ÅñW\²ƒÛ¥Â¾d×%ꀠ t`úžðó2Ž‘^ð´ä‹XqyšÛ›ÆMàÄA/B/”ÇëkiÃ!2ûŒjô“/5«‘$œâ¡i0ÑÄ߆JIcßÒç(@õ6ËÍ k׌ҔÊ›ÕxŠòlQ½MÖP…z4^»’L ŒñÓdÞ¶~X¨1„½YeÑÇÈ…zömf¯¨¹”Úõ ŸÚµ[fs|2à7”Àl)_‹0ÌË=¢7ëÂ@øÞÅÁ«„`~6€“$ÿíî/Ë¿uÆHÄÞ&ÃËéõ@7W\,bZH%$/$p£WÕ«=>V èûçÛ ÆFìëÒ[wÊŽNÄ$´4MºY$}Þj™ôÀ«ò}-—ku xT4‘«µ“ákæ„Ë#ãmÛ¤ãq½ŒñFàÉõt°1L¦l¹4.µ|É›‡& d›—vJŒi§^P`KÍê‹DéÛ¨ÎH®sšIuÈ:Ö„¶Š¨¸®D8E núuHØ.ª1Ì„HAµ6ÛN§¡šy)šß/ÖúK½G<œQÜ; xÖC7ù~²yR`¬%û0tùø€§¡âÚî>¢çFŸÊXðˆc¯Ó< Îû]jMÔ5f¸­­°±áƒ½Sº˜ÊüÜÁ!ŽÍðè—È‚–UôR/¹³Íš™è€ƒz2dn€EC±8Ôß„Kžï>/³²qüyU=õÅs@ü4#À`–³+Åç|«D­ÀoùÛ°$v ¾0I5ÎÔöW%¬­6 åý ‡øŒÌÚÆHË4É;v Xàd‰Ž"Œðçõ`?²|óN’ùZ<ÇìÒË{B3 ¨&ÂÓö‘éFyÊ·=£ rœ QøÎC70í½íá”°¥qèçC᪑Yây•kÖ³~4ÆvÊsŠÇ•Tbmï oèZ»3\²rc´Y)n¢j¶N²û¤›àÔ).¬ãµR™í„>ø'WT¦v‰YÏÊErP[ÂWd˜€ÿ<Ÿì1°F~«ƒÃ3ÆèN”8ˆe®u5,qûdÛ@o:åm…\âNU•MN šP1£²4­ôÔ2œê|+ÍŸfn¯;MCØá9u¶¢YÉ‹ëìûQ»Iu)Ø_.cñŒ*V´K¹SÏj{†Žæº|l<ÏvºUŪ¨hy#4?#K…Ä4M½“ §ùxêË(cŠ.ìJÈ}ÂYý•E3Ížtå Û›ÊAú\4L%\_ý¥1{pç¨!ìAÐ}Z°½ÀxÛÒ×ë%ÏÝBËýÊ D﹃8n ëÿ™*ß¡Íõ³‹Ã$(8}”:N Þæ“«¸Þ2óÁó…%ݧ?7xƒ E0¢»^…kôðj×aÍœCYòXÏóâÓ.,² y…ÐL/‘¦nØsê³À t¢ÐŠ ×/våµó.=;¬êò:¿Àʤeëb¡sV¥«gÉ—æ—®ÇÜâ¿háýi x¥ í+ pœÉ©ÿaR&SV¬ÜµSÈcïIôoïÝvØöþ®,披I¯oöaxÝÙé‰Úó¨áÃ'øP9]"ÕBˆ'MëØqežTëv^8M …Äæº‡þû•eÅET›¹c!*†?Ö¹òn­C °>c’ö¤¥õ¢…ä0Úƒk{r\Ðxä]xoõK‰òçSÁõbç)t“Ì;¤™_˜1A‚îÎ4N·±¾+3>Sß±¨ÒkQi.Ìj;–½‰pι|ØÀ°f\¶~¡&y3´ê‚îHºn¿<®Â¯u tS7Üþu¹…Û´"=Ú†î&ù?™{iR ˜®Ô`qžûb ¦~'ˆÇ1%^€¶NÕÈ­ÁÜRa²ÈÓ).|ðÓh˜ÿ˲Êê-{qj eÊÒµµ(óJÅC`Òqj8¯ /a")‘Ø7T²Ä¨.ZÊÔ æÓvnlž˜•TA"²HxĤŒ›ÜѬ (ô!?DGÒ¶+§Õ”k£ Ì¥^€ùïo€l˜ke¼˜÷˜vôÑ ?…ßÞUB01!Jš¨?ðqyß÷гÇÝ-õœÅﻉÈñ)ð—®(l¥Øòøb]s= <Ãñéyß®Œéìn­ÌHñ ¯$Ôgfç•mÖâQ²¯ &í ßRàçK°×ŠËu=îÖ°. >EŒGƺ>ÿìÐ"æšCNwjOâQ¶Û_lT^Œ§{K*Àdð ôë$Ûà!òŨt»’?Ę£%æ…h1¡ü+1m Ö‘.¾F3Dóz¥¾–HýImÆN+wsš5…b]bˆ„M´}ôO%|e~wú}wò¹!NÊ󕹘¹£.NZ-‚nÞþ£ø¬Ý퇟½Œâå#Ý<Ý(žHÆ]Ý Û¯†ˆ…’ãS±)å´ûcB7iG—*2s HÿU±û´v…y[Xø5õ¿¶2—®XÆ×sd˜9ÎEg p¢¸ôÀ:QÔ–Gu~;}‘³vëòpYsDÃUQÚy’öH^Oä_Äh7µ0†¨C n{27_‘éA’»·(Ï70ÑêÈx8ŸØÆ@ùÍ ~Zç:±ìЄkË“‰¤ðc¨i¨‚H¾®2[âŸaè8¾àµ—ùe mýC@.pÉ‚ÕzT—›ŸŸÍNÆ}ûp´ÞsñŠšš:öÉ’7É «Ó£xõ Üfž»àј[Ô-Èúr cÒ „>ìÒPßhÄžä©Ðá«ã®]ÃêÆØÝŸ)Ÿ¾$_jU.äš¶Þ‡«fIé^pÎWÃr|Qcî üîš«´QÍØ€—àPæE dZû…R!ËÚrWµö(v/(ç»D9Ë Øï;zäÀu¡gë(\Ö VS^N,íy4?ã‘® á'VLöõ¦ûw›OËÍX»•f&niRÆŠs™zA£&p¾ïµ¥“ëkò“‹x\±h†ÚR)‘3p@Èdbs¤Lä æþºEü„o‹n(r"I°Õ(‰^^êx§éž§ cœfC4œÛßéqëö}å^ÍU74ZÿúäþþdV2èÚ²#±©œ.Fû3%bêü¬¦ñ™~Îø«gH´á5H‰'¦KØÜ£·¿|já/”jäÊDü÷xÙØo¤ܺp‡g‰—–äèÌÆGö-é@TFêh£äÁµžp™Â;ïÀ6avô6 ë„Fc…Õ³é•ê«mÞSUIê9Ê`NíT5xµbµŽèBÚß{|t!ŒfÄE##ÕÄò"n(V2 % ÇtŒ ´Û4´ç3¥Qàâëût zŽHMOI7ÇâÛa½w±ÓÒ‰$ì½Ðê¯ç,e# °pŠƒ¼sé^@–œ.Æ-XÖ9’*d~ÓÔ Q¥#{O­ztmÍ<§FX‡t_² !#†Á•W`cûؘ\·›:dRn•N"Xÿ”!­EmäRÉcåžø/Ûra‡Ë‰6Nh¶–»1“mbóêE⣚é゚#bé¢2)úÆñ0H§ g ö¼yFN:p»y¸Õ Ë}Æ%¹G ài•×d­±xZ÷=E’ùß_äÎJjþ"÷Á½:üEoZQyº©S—ÈÀò ‡ÞMã¾ÕÁýÙÞÀ 2\…¹…1êî£Å'ìM{UÁ|fcèF³ ŒWzg¿«Ü2wßJK½.Ù®lúMØ6=2Ýg¥Öß6oÍæy2Xô²šè¹Þ<T ¤lúHòKœk‡+†6¿“*VQYçÞŽx™".ÛÕq ÖP´·³t)Ÿ1èÀ³ãž¯ÈfúÞ¯W Án&\þ™¥6å—ó½åÈ|!¼t©~ ÆsM{3„uQˆ½–daÉ¿6•&ùt@¤UÏÄÜ/€pQçûZ–÷·`Mjã%ÁÝ›È@ØŸa+Š8ôÞ$TÒ…ˆ‘:´Ò¦Æ…E„êmCOóG7®çÕM’«Û¿G&x^,–nçºu#â’:žX²mÖ+s›j<(š"ª‰M'È/L¸™™Òvçs a¼vóLUÉNÛ-#I;äIú4\Š2åØTë\í$“õEÑ@ ,Ò6}™ŽÄ&°#ž x-5sM èéfÐQ?H‰@Ì{kïÓñ`Ïœ-ZPiC°&ˆù‘Õ%kqµ£ªÒKT$†L7ƒ-’Ú§<·@¼ªÔ>¥²S¥Q·ì¬4±Üì-P. d«MßUd1 ߘ|’ÿ8›¥°Å«›—¬ñ= ¾ë‡™¤Àáwe}é˜9/ÊÕ¿n>ß/¾zpg.Fx‚¨xëÉ@B>N¸û`s ˆÿiª¶~”oô<ÛŽ\qRþÐÏÁ»îvShåÏ}&.Pº† uÃ¥ØçhœÒbs·à*bv›£tK+›(}Û9Ж©a™x¶Œ\Ðĸö™ýÓj“Cê…r–t,d ;+Û@W§ÞkT©éˆƒª#䕿ֳ^ÍMf.ÈÎVYwšXŠÒŸô<²¶­€Y.Msšûh\®›øÛ=³w›ér á}µ¢Ôi ‡Ìÿç:„£Ø˜ë2¦Îèhئ)jí¶pø3KOˆF÷CÉ1CÁ,¶`W7ÎÊM¼­2 [$W$ý„œ’cD”Š=YYRúb_惎fżðæþ˜(EªAo¦#—¥gdAÕÛT ~`:»7oq?Œ4AïïW·A·ëç¡® ±_½:}8=Ö=ȲÒyÁžR7ÿšîŒ±§* ‡’Ô! :w¦ÈÕ–ˆZÞ++¹ˆ{£âÎ ø(ZcˆŒ'™`,Ã3ûäD”±¾ñ<ùª°üå¯^üâØ©™/³ŒCU/vjè]ª½ l¨.öÌ}žý³õ‰’”§‚펟/*½Ô†µgïÅíÅ»¦[¹ŒS™æQîŽbáÁÑ“O9Ä.2z3Xóükª 'ß'ÆE‹¥+gG+ö{#‘÷†™ªg‚ûwÐ ÷ýº>Cá‘ñøÜ@¥ß‚4¡I%ÍÇ @ÖTJ¢Ôu*ÿ9Ð{²”‘D"Ñþ¶ë'ÅðŒ¸ðͺ|ctWÓu«¯þ’šž°Ù¥˜dU¬>ëíšeÕ<µh WDòh­Å†Þožå–;_ÉŠ<¯¬ ™Îù¬ë´í épõŠB¦ü¥ZãÕʰQ ŠÄê¨ÝbÈ$)I:ÅÓÑã±85 ­ð­¼Ê©ìÌò•wofcÝ‘'»ê¨s®_òIƒ¦òß4Î2î c—ÐÏM‰€·|-4«ÅК†¥•ÄÌfA;§¬¹%Ë':E¡Ü†‡æ”|(8A×d…èU'‚1E¹×)œK>©È㯳…I[£m]¢>6gðÍVp`«U×g¬2¡p,Ö¶ÁrMR²AÊéÈÎá£$/ÍYà™9«üºW›ºÿx©¶.œ E²Q’(Õ2ý ³ñÀóÀÆ ‡Wm‹Y‘zçRx­^®9dÒ6^¸@Ï6“Ü(ág· “Y1{|[ØKÐD]2¦m' ‡!}æÞwɉÔeØÑ’[ ]Üi‹(âÄmOúr¸Ë¸£õäPì9ÉQû@IÔ-p°ª#§v’Ÿ¿Ž#ÚÈb#xC}ÿ…f¢OXŽ3½âꂎ³¶*( X"õ瞂ΠTòÜà ˜1ÝœìÊœèL¶á£Óg-ÊòÂá5 *S&´¨ô"Ù:¨æoªˆûª!ÌÒl£ûõoí¿\èØJïƒuF¨ÄY¤1¯ð1á×ÂeW’ Ø¡âØU×ßÜ©…ˆLVjï°Û÷…zöˆ[åãð“v­É‡à5ûعœrK¾ÿBx ^ ½®¾¾—«IaMå4;G/L:‹j2Íáµg»¿Ób+’M¶ÊJ)yx¨?å«—ts£/“¬­)s´Šn€E&&;zC)+×|à7•&‚§sC 6²:ò$›!³é?Ù¾ŠÛÕ®…D4ݦîiZpšZèÿ½®Äf3ï¹}ÜY þVÀ¹¬±—i ªé{³CQù5—x}_[µ_KNN]Tj±Ceœ…á”![Ï]É›·€}oŠ•Pi¦E«ú AÏ9Ó¡Ø,y7 Úý ñ0µ2Þ¸ªØRÊŒ¶ë‡ÅCõ£; ›€Ì’ƒ•½ŒðŠ dæ‘møW(‰‹LuݵntJ›+ÿ. ø(“„MÅ!+q}(6G3ö\Y L& #1ˆå*êé s§èjTÈË´ò;Ÿ‡$e­¬=' Ö\ìÁ2 syzuzó—Ö –çi²Ë,ĽҵOUmŸX¹š ¢E,‚¨­¨å$ö²ï8èŠ`›¶ÜΖó´8ú†OæÅ`¶;˜%XwŽ ÝFÝAμ¢k4MÁg_)ÈsÒƒ‡°)’⢡0»y‚“«'ñ·O¦Š?&‘"z)غw‹1ßÜ)f`žÎâ|JðFLËšzJî™9áFؾYÔ’áÈ h&ŽV*j ·ëýÃÉÌs¬îäª`Cž TR]ϬW’5²Ƴl-Sv#Ò…-·À“â~®t^8Yæ6Ê(¬Ó,šÃÐ)üZuQP%N«+w§aâ`Á”jRå^¬î¼s:™ØÇ¿½CkÊí^Šò¢¤Šf[P²ò¸áiºP×;ÊCJÈ\!`ß2ö\á½èM—yÁ(u•„¤þ§ñP#/K»~¢Pؾ̢ªó#oŽ É)µ‹#‹sdqe¢¯£oL Ì ,¢kd&.Ä1uG\é/ »ÔÚU<.6[Å:l·à!íh{«†³"ØÛZŸÝˆYw;(‡ÙF ÑQñâÿaļâÉ&PÀ®‚>uÏaàêxƒ¯¥†JšdWEè¸:„®Òq8äPàXÑylw) ~åIµîî Òï ]É~gm¦@Bü¦×h}hÖ:« :bXé:Âk¾Ô ˜H{AõD‰ÆÞ€RBÇŠ­µrjq¡]J ½ ‹2ps-ãYªG_R^-•8„~°ãÌ’¡Û•~Oä뙬 †Ç#©ê*ûú;ãxï¼À-Y{ƒ„N0k{ÚåÏ=8KVºë’ˆPÙœõ·2 ^xè©Qó!ù÷Z…y„ÔÈð*^A¯ILuŠI|ì糓jÓÍójãÕJT .Z.NÞÁc‚dƒ’üÇ,iχ‡Û2˜åYÙ>žÄ,þM©<«xW«5ÚîùI ÃQu•E]²>œXF”Q5yÁVATÏRäÒzm°¸Ë%þsgËÂ1›÷^wxãÃVcÄjuÅß·²ÒÉpõe‡¨V­ù$Ž©ˆlÁhAÄü1ùÐæÏþìš?lÛôæ§¢­ûÎgÔ–Ñžs­Oj…š"÷À‚?×d9ÿÜó Þ4ZåAÒ°ÁÓÆ³[Â3DF÷“¿¡ó¦”;ôí;e÷ÖbAù’8F§®Q^^Ñ\¬ûGÊà.J Óñ²ˆ$?ÛuÆ¥ï·,}½7!çqº{@*]jK±ûÖ‰€—å›RÃ9·óo”Äñ¸nüä4ÑôDÊ¢Üñý~T³ ÐöÂÃ;h)ÎI“³*DîÔQÑE"¼q i‘™-EI”¾àôĬg°„øtˆ$&!Ò'æÛ9 à6žÕñâD”¨øEåoÒYU ó -b¡s0}6râDÍù–Ûi¨ôÀ±–º#>UÞõš”²1•"øle†¥¢æ4rCyÇy5E1ЗC›ª–¦´œ læÏC±ósÉ­5”dÞ{ÿ™`®}@*L‘rùœñYâ¤Þ^m]¥ù‚îR;Î&Ò½æ¿sÊ6ñH‰ÕtBª¹òJß┕š{„×w|ðYUJžbÈs±÷ÕÓ.^’¨ nÉlB…b«TŸ›—rÝʰšÚÛ& Jƒ×Ý©P”Ri¢?Î.Ð¥ò¬RÜ:à>É´èÞ|6ÜEJhÔW]ƒAl£LŒ¥“Ѷ½ËGÓnsÒ­ÕÃfæå¶ÊK>ÁÙ/p§ö¤Dä:²*«ZXÉLH‡+¶W)ãu½.!Åh¸&GÂJƒ¦æFÒ|õå£ÈuAŽÀ¤)¶oÄFOíb¯’ÞÍT§Új¾Âäy2ÿÞÄ_*r)K½óG{5ÖÕM;¼èÖfĤд¦§Æ½ÁqïðÑÕ[yJðœ¶úèN­š#ð$[èxØð{e=\pnNª€ÄlÏÅ9=É#‹´Ó•ªí T'éK¸²‘¾Ø€{Ëu\L$x= ½¬ÚÒõ¼Nýô˜õò/Í(gUí¼À¬ŸD‘ôŽ_!¹M“ÁÝjOè#VZò®£Ã”§úÓªiô wn¶“ŸrØhI¯MÒõ0ÕP,è†Ð­wrüinÉõ„ƒ/ÈÊû;q±1CK¨/¯Vc¸í‹û>Bœm·†xÞÒÒlþéø„Oš7º™úß™Š˜CÊ®¬ Ê72¸¥s‚,vrƒŒU;k›èl®9y;il5ÃGé˜=rç±Æu¼ŒœÈ7æXq‰l®jùœã¿¶mk§|•™°"Ö-îÖaÛó(§+ñtß\qÒ‘Äÿ&ÂÒœÔ]¦œ¼YD+øÈˆ[ƒšu!èVŒî±9Øß=¬×.@7€íô寠KIõS˜E:­ý}‹UNFôóÌT§%99^£„¡ èÔvã\ÓæÖ’ððóÐNx'Cwlp#~´^?>$Nâåï´ڭѹá¨È!á*å'¥ÉþåÌ.ý"‰G53ž±-Æ·öob·À•·÷œ–g‚V9a©}ùŒöÓÞæ¢ã`Ñ“t…"\~†||beìñÞæî7²I(Yê~Æ8Ó5¾ ¥Í(BQ{ˆMŽVȨ—š `¹÷ÌÝ8•­B3¯±‹E°4¡c"Òÿ=JÅf¬,z’“râûh‡ðë±0£u÷}è9Y!©woÿ@Oþ×CˆL‡RUø«"îõðß^÷©®gùn)J÷d1´¢,Iˇ +…É, ⃚ó·Äó;Z¯=X¬þâçœf/?£8€jÙMnœîÄ÷v1öÜ lNÓ :c¿¼ä WÖŠBÄP=-šy¨°ÿ-RǨ‘ÏãÝúmÏO\k"ŒPÒ¡ÌgF\­þ—yr‚!µk83ìÅÝ(ÍWfó Ì0¿žßß91àfkøõhÑCé#S3I¨'0 çÁvì{AÈË]I»Ôy·“Zß$Á•O/r« ’?™ù¢ûÀ1&¡…AÈwÓ‚TŽÛþYþ‘<‘Sƒ˜ô$3ß)Ÿ«î™àGU™Ð"’%7r«ÎÍ8"& O^¿¬ÕÍ[‰î€x-Wd>ô4ÑC*i~²0ÌUžSchi[òp|BzŒäŒÌ!P#B_ÕoG ¨ŒQ\Õ|ëa :=ŠøVO£m8Q2úˆ ñô£$ÕÂÕ¬¹ÈŽûŽƒ-ú~“ u…%ê&Z¹Œ‚·§Ãªh‹|\yO'¹ Qs™§pÿ§Qö©ùV j^C¬D ‘\Ý ¨{sˆ²¦%¤0Á³Q kÖã^h­„Ì‚ÈL  ×jWcXÖêåwĸf ©Ÿˆ»i´;lêúzìÞ‘ˆK´ì`Öܳ)¡,^¿L³üçü=f­Ô 4©—êjÑ¡ù¨6·Vƒy{î~yùÀ¦=E}õDW"1S‰ðrØQ?g„ô0S%ÖìmL½@^‡jE^J ³¦Ž¡Iû.±¸›7R1⻈wë?ã[Ê5 g÷ïF+ÿ>aÝ–a J¾Kw»G½ô°½}s×QöR ^Ðïb?¶;©h~ŦnŸ–”Z6Ç––÷8Ê´]Yb{Š ›óäêóÑÃrØÝ„¦jnj©|Ÿ:8è$ l£ùÂ:1Õ¾vYû/À]Æ÷‚;•(ýz¬ØÛóõKþsôìWŸÎ©¨7^ò{Ê^„¶×ÞÜžQ¹<Ò÷}û˜µa@Óf0BXÓ"§I(k;PsŸ`±ê®U:c6cFïü7Ó#?êÈå¤Yø§ýÈ­ÚV•àÒ&oWÓ„P9;ìÔs½P^p%ŸX[U{ÃÑ‹×.©©ñî²ÁV1–Êùå-¡xƒÀÿï¾55>òfýà6ð­ýáææâV”ÂO´¼!ŸSiöw°ëq2ËJêŸSÅ€îÆ_áoÅqý(á{ÈÀ’T}\‘—;â¾f5Ç»Kxß:ù¾ýëÓ°ë“g¾'zz¼2h<Ê‘<À.V6`CR™ç£¹Ì¼VèF•‚²¢ß¸ x@Uú=¿#™K¹IÉRLôÜ‘™ýx}@Ú d^{ G-wT•¯Ôp'[P)jÜ2™|’8ŸD[°å§½ˆ±8ËÏ·:ƺ¯:á¦µŠ“ÔÍ8­H»FkÓ8q;œ¥{ÞëwGV¶È¯"ª~Žj°uPœÐ i(XÄɧЉEÙÙ¥¬ò£'ƒ¢X|Sù$±Flë|àРxšij=y=Õ·ÿ*ñ²þ‹‘oW¦;Ší %òè¿l¯¡Ò÷îzàéІ²ˆ–%Lñ{Ð2¬ÄÌ[ÝŽ÷!NâyOg{6e1â5N T0Ú«* gIsl4M4~'ùÝ”8U€¾Yúín͢ɚ]+ùÞ…!æg&xD¬h9ýSI¬ÿªP _œ0†mËðŒ’ÔU½,‘$îï8T`ûÍÚ3ö„z¢œÄ‘®2„u1 ‚»ýs5†8Ô:x|R-ôUÀ{r”Á$Ÿbp•œ¥|­ÅÔ™g'[pÿ¦z¶îäÿ«¬*2 ‚¦Ù­ >WñÙ××¶õjoÂ"ÃËŸ'´ôíý ¦»†ƒ¥»ÿ¬+,0*ÁÁWHÍdÀæþ~ø°k’Nx—„°“•r€¡|”ªÚ‹qD'F×åÝ– ƒ"½HÔðkVüþõ}=|wvÔZ«±èAÐZIoµYÊU”o˜Í‘Ó÷Çgœ—Ù–IÙúiéåô}×–é&¹ÆöXm ( íâäEðª@ß#Œ–A^‹ÚîÝÉX¤µ¥µ÷+cs¬R£!³"çVìo1ÂaR‰…—;ïe¹‚|¼¦‰¡É†ÚC"®gQÜrëJsJæ"‚Œþ ™·&ù;É.<9aÕÈ#!H¼GF ÿ-Ó0™•L›e^\a&êß·S±P}d´áÉyRÕs'(ýÝè­˜S¼'9¿$¶V$œÉ9l<—Ó FN²”r´!R’ÁíqÏ/¥ž½mßÝ$7àn‚Š´CN]aa®Q} °u:”n–Lö-µ¤<Ù?49ûQëff†ë*Ç!¡`5$kQ=PzyÝS€†.ø£ÎD›€Ž½ i½5©âíT_˲øÚGŒôî§§AòY:SaÛø“²*'˜º£µç"ñE(+jYšyx‡ü ö–‹Â•ìî's;uÛ}¯"£T…øs7IBØø·Äÿ†@o’‡Øæ GùÆñóWT1šk¦MZ¶ºWŸb.ÎèŒac#ý§¥¥°?˜`ö:2¼…·Ø|‘«°:¬+{ ÃUÀ.-5¡)矹éà¸{:),úXmÚ´Ç¥POu4‡Ñ‰1îí“L¤Ê•ÓÜ)D˜‰,—¿JÐ :#5ÌþG#œ­Ž<Ìö¸“ž—»Ÿ´[ýåâo“.oÔǰV b³3ú¯`Ö´m[ùwcSx…FxìEkÏõظ‰„r²æ™ðíóD´Q.pýƒY =³ÇÜlWÕÄÊ€{ôJõ‘šNrêr’säégW%³(Ð2Ó½”ËJž¯-­Óh¨k¢´Ž”U·ØÝ§;U~¸e᥵ê4:fLÒÖbaLIŠoÊÙJÊVwŠýH‚Ã<"Db4­olþŠô€ ;¼s:ùèùÑgyF‚¹ñ¸˜¶âo§ª±Í9Mß o½×ŒÏÓO‚šœ5Q crfqpŠ!Lð¸4o9ÖPÖÄ u\=®À™¢”uU¶ø‡mâ••*S¤‰žLŠ,Šñ…gGxM6Püç>Ûn÷0UéëQn'øç‡âÇm¶°›ár¥^µ`q%/P’m1³¸÷Á4¾ÑV«mßò$!’œëx ˆPkppæ“>>ÀWåѪM@…ú[4ÖPê·2ùàÀbßoµc§¨2!I°ø«4¬ûÆw ‰¨‰†™´Àö3w3?½8†ÞÂÖ¹ÜpŠJ2åˆÊ­½gv[¤„s#QÀî/ÓS R•Ë2Äò–²G(Ü<\ì¬8¨{¢@‰+ºÕ›¾¢U‰äÔ šv¯è|{V ËÅÙ¿ñ$NYÚ¹&Úhòqý¾õ`†!‹V5õ´9x ß/.Ï9#Sê|½Žn(Ž—X.Yr/f µ,Oå%àG-Óúà†u¾°{ Ýn½Â/رÄvìfÚÇ­ša6ÎiÖ•n¦C¸jÚµ=­Ç”/Í#û~c-WelzÆÎbtm Ë|&mw•Nœ Íùgsú òÀÍ-ˆ&Ý“"CJb„³QÿÂAm¤v¯ÆvöžÓµ^ñs1WóˆÜÖ<*À„¤/«µž7SwÒ%-™à zQ9m¸•í^MÝB›¡&i^P‚YrÑç­ïu³d_ÀÜ{`/ÑÑåµIü±f wPh.FÛñ]Óœ¶™>#íŽ`ñ8˜yéìíBåT>Œnÿ±˜Y¼Œ1"7¾RÌ‘æK‚4ºm´¾É•qI€s{ŒÕI‚<Ôv¨Ë3 ÆÐ‡©Ä¼ß?÷ýøþø:Gqfé i»k/éu »±ºm%vï€íȠׇæüQÄòP^*(–ºfÿW,2z-¦úPëAöÈF‡·%E$B{¡Öð|Éîö,þx¹b±Þ Y+#‹Þ•^5îâÍÏËuáßDE-j²x“oLÂ¥\²*ƒ§ðšÏm'Ú àÌhÒÜ÷œSžÔb÷’{´$ïD>ŽÚc²"ÔF)­@û0Ž‹rS‰cµâog>T8‹Û5B OþA ³ vIrŽà+ÕoÂk0å7ôäVªæ¶­†Úþ*jÿYM‡«ʃd(céŠ2Ž6³i&¨¢àì(@Õ{ È¥ðm¦U6ó†Ÿfx‰^d÷4²‘Û©Ijú/ í÷æ&šãc×ã“¢®® ]XYë±CÎôsN!çæ“`°™Íx·Ñ¾JB¥ /Í2A@ä5Î_U’“K]/zFYïI3~*”´ÕÛ¤õõKª¨ÏOðPé“l×1¼Ž¥§7Îü*ã¨æ£]æ>úŽC§_ºmìFÐ _{ƒ Ÿý:075,Ãü~®Äœâ~ÇæêB*{._o`kµÇo‰ƒ+K¢”`A0ŸµÂÍKX\ â0rÞ¹ž?ÑŸB›푟ß@Uùfùܯ´_{ùßuÐ"ó~,|ø„¸ÉÓá’cØü½àÓ‹CkF½U\ ÌKsx(Ÿ2žïXòTp6tþ¦d5ÄhË *_Ïcd®ùW£ñ ô®~í_ŸËJ"iSô ¥KMiÊ@ùWC;išºšðûä†uàêÝçŒ|cæßXô¤¼ú@ƒÝ„À‡ïeú7 ;ƒiÒøb©þ-9X14Œ9KZþÖùhg½’GI1ßíÕ`‡ +yOšT¤ô:áßvŸ>7—j¯4$“LRCpªO”ýiàØÿD‡„Â$XvFÝ£Iïáãvd¿9Áwa÷,k­-fKmA™=B͸,<žÞ;H$õ1Äf˜é°6˜-R4âÕu£²@_%|‰&fïÝmœã•*ÚH+PÎ £ÞHðPóþÅ÷ý<Î z5ÜÐÅ ZÆZºŽ¿›ç9”P_²#ÕH¼SÕzk£AP•ŽJ¢ 6E¹]Ïí/3“Ül¤þ··ˆûÂôt» :êòé(Lz´®ãýiŠÊ Ã3ÏÍ_[­Ïr[ôìª7L—›ýU¢ St]ý'ˆ| ¦å›Ž^’¿T%ÏäèžVD#}EÓ=}È8s Ï—g_„óm¼w\¦1ëý½G«ƒ7ÿMG_j_ÝŠÅ#iöN1hŽ_YQÔrÅÅùîì“aÓLZÙšÒ–kPs•#£‚òò9}ÜUЛȬÝþpûÜô€­E ?Ôª•k…i˜d—®%ÎFªêá”(©r©>ã†L—·Ú·Á;ãûE2xo¥z­9ÿebQ¯­tTe™˜©Áé~Up Éf§c´td2¼WHÝšÖàøp­m RefÐ2ÕÈ[ôD$Èë“§”’ósv€¢³Œq°èÀAë²£ÿPÚqÀ•Œârk;IƬϳqæœ.f ¾ÀÁŲüç_ÍQÅYŠédx•ÐÖø>™s´³ŽƒKu<§Oc@ ÖŸž÷NËc§ªüpæ÷ï Âó £±V’aNJŠõnZ±xÁÅpÆ1å´ÖÝœ½ ²aÌ k¿VªMÚl¬ªÁ§¼)'f¤×„§RÑ`Á’õ×Hë5Jf£K0ø×ß…(ž¾••Ñ>ÎŽ™­\y?L<Ó‰Æ|l°á"€G\„?û;Ú§Íœ³ ²ìHSQæ`ƒ`­ŸÀŸ¸ mh…c$!ç¬eÌ !¬—OBñ¥Â ƒÙqß~^¦ÓóñÀ ¾¢jèr%æ@“OeÝd·ÐŒÇ6€ê÷šLl¨4@ºuóö³3õÓh SÍ•;ÕM¸Í1˜_¨Óß7Õ¤½€jÈ:þÒV,Õѱa Ù>ÉzüïéúL؈áýY¥`Pë—µ1²;¡™ì€”Ï60É»lT"Iuœ. _Ý;](ö RLîóUô6ÆCZ˜©àöÒ›O#´Ð8µÝÌÚ#¡)MÖ”ÑÔ”G@Ô~Šáâšp ÉÁa Wò¯w¹U­?®i'H®3‘.3‚_9²jŽèعînmŸ–«] ñUâ´ŠrˆÖè°¶…‘Ûaîņ¦FïsàíǧÊÃ^¿ —héÖ<·8·Øi†iÙïGšvr8ÞM±?$J€­ÜøòC’ Ó’( RÍÅÓ¸L\`‚í Qœ9(([­¸Ð2Qi7‚t8߯êû°ýê´ .ß^nÑÅXôÓtø$`@!Žö|½h:[qŸOŽÇYi¬‚í ö’Ýc!`Û„øÆDV:Žù uLÙB¡ŒìôTªÙUªœ(¤z,\/>8ëúø‚èóÚᢠh¾JˆbŒïÛilŽ~¿™LAÊICÜéjXþÁé´,e>Sö Äökÿ“5Vh­,M.͙͉±ÆøÕ§ˆè®,&"+—½Š¶@ N¹7J¤ píåV—m]Oé6½vlÆó ‹\[¦2Ý\¦FÝ]0Í.aMVè„ÙV.ähûüÅê—Z§nK»bQéî×Î`¤Öùeðq¯©g×ã#h=›aÄA³>Õ€ég”¶P‘:ðvCˇÎáª.~Kécm5Ýü^Ðešòj~ÄçPøÿÓ*m Õù„‡fé¿ O¤zeßhgû­×QR^•ž»nØe®H¯ãY\ƒÂc!ÉloÓ÷5ú²¬‰fý/Êíl ­´c=`ó!³P¸XYl:}kØN݉•†ëNY4Ò0,;ôwÓ‰aÜ}Ë"zl—Ôj7¥`9D…–LL ¥¥ßC¾ÇH¶SŽq¶ó®Š.O[-ÚÒUæÆ–àf­Éþõw1Yúì6žÁï寺þjfF²h-LÞM\¹‰´â}Ckäºewh_¥ÛÁ/FcغÓÇM3ì.^¿TSå€ÛWÕf¯©= nmË {Œ‹éªDM»¹ŸÁ¨^êÚÄÂ% úfGìw!ß!-æœï­uÜtheÀéãT0ÝmÍ8!C4,K‚YsÕ£zåW7ü…= MÊ~QE ñGj—0ñ»®d¯Ê2¨8õ K!$” úY“w`Ë^á³÷Tp±äAæ`eÂaÕO¾&M=1z/ Ä¿û{»"Lª[/ ›}fCÁýh‡LîE!tY1|ÌëAYÉè¾É ­•¾RrŠüæ|% å—î­´á!^íä0Ü©ÿÌ\fnGÜw’Ý™¶“ÑÜ5d¼2lADEªÛï®éF×°p[öÿÔ:Zm-ª_Ø# ,p̧¨Ë­ZéÉ J½s‡üc% áü›„ˆ-–Á¾½¾xãŸÀDg\k­}iHÓ-mIå—:‡3÷b‘ÝplØ¢YY\¬]>‚:«hÞ}†„å´=íç¢z늶×âil>ìÎáäZ>û·±âM–Zwé”éŒ&ž9ðšÃEû]óúLêï&7+ÂŽë!$»X/?;¥Â;ùIÜìÛÚkh-D\Û’.Ï_ ?¨ã¥Æì¬®É´§0§%+@èO¹â%\K_¥};ZßÖ2Oú•ILæ²Á×)¼Aöå{ÓÁlœBãz›jÐÆšÒ#‚)ë(=ûAr­V ÒCÈ)š\ùcà'ˆCM—3¿ªÛ‰aÑW4¨á+aƒÏœ89Jï¥yw{tûªü¸ ÷¤‘´ßú•ŠÄU$ö~U/®pa>§Ví5?ªmt†qˤÁ’ñðËÂ)^ [Ú:mÃÍÚ¬=âí y% ÐÇÌëjD?µû„æ,ôHóÈjºp6 ˜õ-\%!ËR¿bOÝs»u~^‹W'Uk‹ºÌ])ä£Þ‡“í™l>@‰±ßǘdÙ¹OG6Å7Î&a@¼L“[ZZUÆ£ÇóGÒÙç!§–ÀÁ‚ñä îfGbnÖ€õÍ—LG–DÛJª>úëÃ7âûÈQ}?¸Âù³xT=1n:¦Eu´®2²ØN\hxQ “_c”ÿø…é¦ h3¬)ˆ%áöÓ[”Hï7œ/v6…‰ÁvžêÍÓcÄ œPtp À¦ž^`D´Ö¦ çù"ïèÿ`!*×aŒj`~Ÿî ¢q¶e~vîlh.FJ:–qh±‚!ð¨+*‰—9ÁÒ.¾@–$Šì¸±r©Á`WÝð üÐÉÉ=#Ef?x1Ânj›y1דŸÈv€¨vec-o$”hŸl••îùſўò,§6_Nâ—9QOå»-$É]E§e '“oXƒxD•ÿè™= ËŽ/:ù+Àï×ÁUamÿD\‹aQÃò@"J3#À¤Ðú9»½œ>› œºi˜ÙËö0 MÔ;š‹Îð k庬•Æm;}* Wßítì§)ðG¬Q—ô¢x½‰2_a¶Ô7¦[G§Zj¯äÃÇ=@õdÁ„oﬕŸžýJÞàÍmõª Éésï9ý˜ãÎ :öÜÏ]‹ƒ1·y©C;¬XY¯Q²• ê{b*Ñ%Ì8G`´€s¸ ÀVãÉ$Ï©Vì£>gh<)›ã<µyAB /F—óGhV~ê¡â9”œ•Ö „ÿš¢=7A þwôèæ‚Çìî<Ù²¼hß‘î óíQçs8+ø‡¸ZðSÊû$‰N(Á*Ÿfz¢ée€)ŸR}XÎo~É&´©§ï¤¯ßh?옌풎Õ!OÄ*:×Þwä:CâV›W±Í†h ­\ƒÃì÷¥E©±ñ5N?…^Å=BRÇÐîÂiÆ/Ðö%LJõ½Ãü?L›Ðž§ÿ:I ˆº®m¡Wâçó$ÕpúÎü67÷ª,us:û‚GáZ†â6Ÿ?m™4;™©ä\êµg”õé)HîÁ.–Ò\C|Ñ¡ž”ÊÝâÄ#ÆY8WžµExY½“½·‹cþÿ ¼Ó›O¦-i>eUüᘱRÊšº³@>õÞÌÍÏ äš| ”˜%yïãö[>ö?’çÝÕË’_µ)ò?ô……ÉGš1¯ï2(á¡Nˆx§‚슟¢P¬ˆŽŽ4túRjxÂÜ£e °OX‚ûžúÝkLy²« Ê D ]0çó¿ÆÐÏ*í‚w„¶7â½sžª-ÉúAø+UëìGúZOf›a!vxƒ*â|Åò W8JÍo"];ªÑìÈÚÿ¿âOŽBÝìWã½éèJ$IGaóñÿõ¶YºNâœÃ‚ˆ²]C§Ò>}ìÉ¢j?ÛŽ_¸*kìï¬ê,³'È£˜ŠGŽû›åtØÛE ¸ Á¨¤_f+6O ¹Ô›Ògã•K°B“¡ÿ  õo?iÕ!ŒeŸ0*®¨³—‰«Ö¤˜üFŒ êßD6—ÒSç‚t‰sXE[4ëë'ôKiȼBØ€Š/³# ¢ìðcÚØÔÊh;-* [ðß&d'-K/˜d¸ø˜H¸”§–Åy7Ýë1§È%’–ì´û礞:!rø{µÝX51ëãhlsàÊ?ðIØfvLt†{„vëQ¾Q÷“«õ€Ñ(9Zt±KôþÖ–º'hæBÈâjß®}ŒÔY‡K¿” Ó‹oæY£dWñ„÷T-PVž!1“ýí+Ø Aðf™ì³¾d«Ù²`rß%¡º&jK´Uë±8¨Vr Sô;œgíÏp,o–5zß…ÊGt_‰+ÿŠx©‹äÿîǯȣxã‚à“K#:Çc¼\rÎ877Rç°Ÿdº/ɳ¾“™Š0«Ý¤…”{8 4QÀ®.­VûaåÞâ©ú¶Ìs*ŒõI¿öʼ°d‡NÁ‰ƒBÏ¥§Dö="k2/jha±Pm‘ób«ZϨpð§lþÇE’ß"¢/\‹¤N9Ød¢š5Cêº}ä æ£%¹“1êÐ|º®ùÜxÛìÿ&`å`l"5oÙ±»bvÏÎņ}P öÀ¦߸éf˜ŒLJQdâäÕNöŽ…¾°à“œÁ{ÊFãWaç@ì·Ä^1]Hl|ìîÊÖòw¼óÃÇ!ßhü ÇÈ^‹š'ƒÙç~,ÊR5Ü‚ÜZF½^¡°ÈªöNŽ"cÈÇ¿R¿²I{×`&ÌæD#sÀ­!ÅÕMbûýŒ€Ñ`¨†R«üÍûƒ|—j˜d‚Ä!@®VÌ#v©õ—Èh§Uwãÿ]Þæ„ÜÔ>Ktš_l.r2d Ù¶Òˆm…ÿhy¬´­îGø|ZP±íô§—ñ¹ý‡S @%ŠŒ+gN÷¹ÊÉ›BÞZÂÅØ#¸Õ†QÞ/Ž ÇSánaи=†?p_õ™[TUCHå%m13ÌÛ-FeêæKžR™˜;›ó{Ûè×Åôü÷úéå@\Á³,Ôí‡~ÌUþL;z+ÆIÁ«Š ÷®ÕâVT—ÿ½ òq g<`Ÿ¼ Âÿö¾8ÛVÜ1ÑkM²õ»v%€b!ùH°ø¯.d’l‘,ФkÕÿRÙ¸^ 3kNÛZXž)âíœÓfPo{ìxBz)öü‰Ûe=ב-Ù;_¾¤M>ðó)©=Ì ®úºuî@/eÞEIƒwíO9oñHŠ€£îLù¶ÏGñQžzþ éŸvzWÔò@¹|3F} îÏ´pMþ )”¨þY›pNÙ¡ÙÜá­²aé÷•@ѾµÞÌ RD™;úxÒzÀÕ:†Ð¹Î6¦³!‘—±ž>£ÔK€N! 5š†ëÖ9n’ BèÁÈm™ßìYˆKz„-(;˜nVöêåsÞd¿á ðlDÿ&i?Ö4­åi›$“Úe#ë/4Ç…x0­an뤊« û¸1L§ª8:œ g˜7†²Üçu´(ìz%Üœ^ð£&”g}¸ùa±YZ ¿+ISÇœ©ÖÝ›?ú¦¸Ü£¤ó‹yºq*·Au{Ùþ .Ú"ë ÇvA›2][ÍtœºÄ¿_û+ S“þ TM.Ðßé÷Og­8Ô2Ñ3@©l({ey1ö6‰5Îow[#•‘^TH÷GÈLÞµ¿)Ó #-qWcôÆå,:ÙöQ%,c2B4•)ê¶Fah¼+Å$Þ|ù›r!—%{ûg¨D=¹ë»úët’éU R†œü—·ð"Òqp=ˆ>¸©ñådð 3ÎËE®£è¿è‘½¾?‹Ê¿›Øº ãx[mSJ•µ+Ò œS´1¾`™ˆ-cú/£²D°ŒìÌ·Ð@㟋õQ‘S¹ -x»*Ôü¿g“y>qµÙü]™IhÿÔóIa‡*èРKâ÷"¹º‹>ox«KP¸%¹sìÄØ#Kµ±ÉZeò@Ì8¹æ0 t©´S™n°Ìž—ßЀj¬œ²T—cÉi¸Ù(;BÀƒ;ÙKÝ~Ýúɉ¯Y<Õ3Ž™©¤šì(Ç\.nn½[|Úùឥ*I›¸Œ†€n §FÕ^¯^mPº €•á巿ѲuÕßÄcÊ©jBõÄÔOŽ--!Æß0‚Á²»œc”òÛÖ)ÑÉnÎ4ú áðeƸ ´ WÔøËä‚(ˆ Z7ñ <˜óGZû­

8$µ'Qj;‰4\îƒO_ï—îo73\äõE[Tõ+LNõ¢÷Šìö>¿\\ô²6d†Æsׄ ˆU%€»7ïñ(¨Ó¿£G§oXg“~0XÇL¡VÚ.S¼~´aS>l-¨Œ ëW=À£"Ë3î ŸLrªf÷çužÙÓŒž´¨WhµëúSÉ9…œÓ€ÀS‘FŽþT~Å6/ ÷x×sÙ›«V=°rl,ñDm}i/Ødx¢p—C©áÉŽg\`t‘Ù»NÈ9œ{M2âDùó §DÂHPšøº¤ýURèêÙ﹃0§ãÎþÌ|z}P~Xâ‡'L¼¼á²ï,­CÄJêsDg“ô˜CãUù©^>g/·ý™ôÉÃL¼˜uüt6q`¤È¯Xq)šF±4áKðÒhµM~¶²çäÃJõ‡Xr1xÔ¨X›ê;«}ÈÉ]<¨ÿÊ·û=EMBå'œV•¬]ÛXNS3û}ŸšaÝLª‡&éÓyŸí¯òµãÏèoó'€¦ìÖRaiJ7W9™²e²=ð÷¦ÑNÄr(p£½'Õû”‰)€p íGÔ¹¢DdáÇÞ”f:Q×óó¹:—Û¥a¢Ú×òšZÔa¤ÃλX¤­£J£€tÔ”Ù®#JÏ·)Áà_A¥üÐh+õ)ãOÒtòyÆá¶?Ò*ÑI›¨ Ãgâò 5­Û=ÕåÓ‹Ä܉é…%ÅÏü8göš@ E|/‚ô%œ¨°O¸k:clå%1¿åß.À{Ží ¤äCÊÊ©cT80è@n­&úgÞÙål@cªæ4\ÌægWðSë‹W3¹»ž³” wæWñÀ~÷jkM’ÀA›:U 5f™ÄÚ¬¶¨·mBqr3>‹àN½“å#/^‹ÃDaÞù?§°âÇï{ʬ 5¸8<.‹±Ù‰Ì ±†A²ÒK$};L™Å¯ÝÚZXð<ÁÌfˆd à^¯û‹mÓW3©ŸyYN"®úÞÊRD~.âN9¾#Ô®ÞX—¡Ø=á†Æ™²é:®¼Ñ`h[ “¶$#· µµ"W ÒÍ,Æé°¹Yt¨î^ðâsƒTæóN}qÞùºßp(瘕^ ³ª‚=ŸDx ‡·>oÁ²¾æXáf˜GÁƒNó¢_käõ}S<‚ùÑz‰vKç[ ôɯöä±wÎKÛ•bÓ^ Èœ™ª•a¦º=> 7F.E>ÖÕ2Ý©0fèC$L~Ïǹòö%VîÐ&^[h§à‘œ¥0sz!ôÈÐ`æßZc²€î¼d‘˜QFð.„i¢ó ðŒÖn1ÅÜ ©5Œ.@í½¦ÙHsëñ Ûîú³Å«# ®ƒîCýPuùäßϦTÑ J–Âjz×V·@KDb¿Ð>ôýP&k¨]È1›Ÿ_(î<#jÝc\r=“ óäÑ8Ë»2ˆrx `ó£ÍP¾}„\µ}îà ¥ö¥ØYûBÉuiÛBi0ß,.‡ê=w „”(:,•ã.&UmüáßEFŠÝ¦cGÎ{ÖHv¿¤àT³;B²åšÖÞý6„“IÇÀ>˜¥2p}z5ñ10ûå‡ 1À¿³Z¨î¶ Í–‡ABaÎI}gGÚ0ÄgõãnV‡€î’6\¯®ÔØžÚ<ìÄÕƒa =Š)Ì@BEp‡,u›(Å›%gÂßüáž”š5ùìsßA²ì!¾Î8P( eê“¶eíKÕg 2HÆ›üd†Í+ŸúByêTŒ˜/M¦:>nJß÷Ã-¶ ‹6åçNRØÛyvàqtRU%‹s'$Þ€Ür<œ{„‹€Äx›4Å•–F!áÜ ˆìêÌ9]Šô#´H©#ã­….¬iDW-Yz„*>¤kç£H”Q—I˸õ.rú¯q­ñBïƒÊ ‚C0Ìq†Ûà©™Êô}jDxc¸'ìrÅs%¬Ä(¼ðŒeĬ‘ìIóU3–¤†áгǼAÍhä®ñ¬:–òãi¡´nÑ›î­Æÿ  ±ÝÉj½ëŽit‰Ež¨(êá1‚³ð¦L4 E_‰î]ú˜:(!ß…¸ù}Ô½)·â¨Ïê‘¶éžy0kv=Ø…À¥ÐêxbÅø‚`K5Aîq‰ù+^Hm®±"[ÜÞqùçÉ]âœíðëR•$¹ ÚÒ“Ž™ð•L¥726<38oº+É0’BÑœÂÒø¬ÎM)xhûijߺڪ-9©s¬t´¥jÓ䶺u&[&Ž"$EìªÆ^A†+ës˜ÚFáµü-t=†§èÍbLr»—›~+øåé%Vw§¿äø”BGIÕ){-EÊÎxßHbáDé'ÖfÈ]€¤øÓØîA u ¸Õ܆µWëV[¢ðeTZÀ¦ÿ%ï#Þ f CÏÓ–S.‰Ež[:ÜÊÀùJ®g’&ÏJ!?”ãùãU{6ED]h`GãsS]õ„¶hÖ×@«é®%ȉ·%Ebá—öûlÄ¥ÒRaʶÍH5wÿ`°ôw§6ºW\íÕSPK–!õž®2ãTÊ5 žS2}ޏQ}azz,ú‡£åÛÖrÕPFÈ8o)ëÑw*¤àzò&f=ñ—·º†$Ú½ð89‚Óšlªù©ÌD¼Íz(úl;íß½ü§[‚†xábÀìÍqB$­ÓNmaR{;4‚yðÝÛJ‹4¿¦µñºÏì`ÂK¡”œqzUx”úÊÉÔ‡Y"ÏQ#êýWß&Bì-u¼(Ïq´Ó¢Øý³\¾+0œûFiê3–ŸJÇ…8‚‘ R`þ{ù©Q» žÚÜÞ¿˜׋¹:3Œ›€°£ˆ 2TºcSÙQÌ­ñ(‡T6kHšDÂ1R©‹Û±Û„ÐáÌëÆé|Ãø5mÜä…ôYc+°sì”=0j4í׺‘8ŽN;ÿSàÜÕ´Ø¡\¡u,©XDLÉ•7E¹´—Ê€˜Êçˆji¶2I- >üðî¨ÞÛZ1„]6ì)¢ÁÌÞMEľ³·N{ãלÒ#nĹ÷ãÅ’ªÌ"¶1|þ/Ã60‚gZ]`Ô •W` +ÈÏQp­AÛ5И ™ìW¿1Ò©ÜP¦ž,rÍìÜ×CÀ0â;s’O³ð°zWß0‰ykò:ÞÁØXz…àAÁlóï-¦7²<1äpk¨Ê|[48Pä_¸‹ôÌ”xd…êTûþ Ÿ˜ªQ'Cxt÷rÌKö‰çÕÒ)˜Îasé™{tb$c=?‡2Î_©4‰|,]æþ8æÚ`;1U=i‰;UÈ“þ ] DÒÈ…£f?Áwfè§¶Õ2Ç*‰@«ÝÿªÚèÞufãHŽÔ¿reœVqš$8&Þe€ø+á1=ÝĬ†¥xLj6ZÐÆ=Ç„Ï×ðIã ¬Xj—ÖîÆ jñ™/9€J{¨€?5¡å'š~¬`ê#5ÏS Ô›½ëš|AÕÊNrè¥ØÉ9€-ëNÕx êlMWhÌB%—¥/ÀûØ£ˆ†§‹UÌq¥´úSa>[¦Ã‘NÆ#¿7O>B ¬ÿ1‹Æ!½Ùò†«›/Áõüóÿu~,ôŸŸ• Î¥©[«ž.koäDí/am.°Dw ºdãDØñSS…mEIm²Ò×Õ¿é‰Î²ˆìã+.QôüP)m‘k‰yUwíoÖxf³(ƒ‘˜cþ(#:{Z”d_J“q–RR°¯J$¸´€¬v`lÔa„›jGj¬ÌY¥Ì½"¢sº Ë!Ëð^×XÈñ9y×­°¦~bOµFsŽïÜÁ~FxëFÂêSšâ¨3‹~ºe’°j[j‚|Õy6NhïC`¢)xýÃÑcO­ÕûÒ&¿Gö¬\KÒÁÎé©ë1Â^]‡Þ°ˆ>¬ªå‘õÔBY6þC–rØ P?º<íÆ,m}ðr,ñÚf`tqA¢§×]5ŠÉ޽æ OæðCŒƒìL'=«`rê:# ‚¨ÔŒh9º ö0/Ïì=osˆã „LÓââE©F"û©„¯¢ûÎó–oÐÉ£ïa0rÉènÕîAð²ùãÕLxæ[ÿ¸UÕÌ{õª+€³H~^R4É–w %&)ö—GҚꜘ]‹ÌÇÎàê3õ›±}Ùì>$Ý·ÇÄ–²¾‡1ˆíìCv°¨S j[Bõçjžg¡XC,Y F¢®]!êß1ÇAˆñLžÉ¬‘Lº™\ÿB÷6É~Ýbg“HÓú]½KD•“fų’ÈîïO¬dI‰Õ¡/›ô·sqúÕëOÌ/MTÿM“*õ„süZn¿u ]ÉìÿC’üTó ÐµcžÇWbü[wt¶ÞŒ§­BæÇÔU­Ó¤³‡0‰ó}û™ÈS\jD,£©fRÄ IfSîÖ´”#ï˜p˜b»¥añðä!.ë4Ow·*±{H¼Þa£I(Â.ÒZ“çÕ¯ÔZ~[•íÈ'n'ïU^RUã=²~ìÀ¤Ž§ÜSÏþ÷cº:„zÜó.>1ò¡Šj^Tž÷9T*› Ì0AjÈ,h,^¼ØÀuV œXÃuÔLŽº-EAµÇ4Û>µßKÝq“»w{1ÆöyÙ Õ'7RË¥Ïs3ËÕ[Þ 3zLÅSÀcÑ4°·Œƒ|´~_k‚‚a3;ÔJ l´ökÏç£Î /€ HH8W‚( »ÛçJÙˆmÈ6¾²Ã ãnù7¸d:G¥{<¿4µ>F¥þôd :±ÁÐtùYåà¦k®¢¹´æ~™Oý³M³!z5ZJ†hT‹·ºÙëN•sw0‡?t2®°C^A@äÞXœjH‘ R4yÀ2 ;ëˆ_“‡©0bÔ“EG¥n9î>Gµ9¹û=÷nÜÇÎZl“‘6f¶È·Î%Ñ"A/Ñý¬i JÔtm\¢-D¦± Ƨç²<=.ÄfæÆAïÛcÂ0èwàUC°úƒ@Ñ ¢’3èîOm6! ×dÑžÝa󸌡ªÍ]¾ûüðò¬béYôä÷¾Ã¦VÔmçår´:oo=øG*ËÎO™Ä b¼Åf,DSççí£…#†ºþ@(>w/¿YÎj¥8•ïêímë/¯µrZA{çþ£¨ ÑË.§†s7º¨)’IJ§ïxŒEŠ2˯ÙðS³ê)Kñ[$CánÚ.¢ÅSç'tV ‚H@ˆþ\{y€dVºf+T—½“cÀ—$É4Ÿº0ÎP|£à}O·;¼)d pÏ.;yV )Kq2/ð4Ú—ãµohfµËÎý|J .-Ê…ö=†Ö[ÿSnäü\ÈÙ;ëöyÿçA»oÔjDù88{þ+ÞW£äWÜÕÑè¹wH_˵lü\0wÝN•5\®ç·i&É…¢6aº³ë¿ô¸1¿‰ õ¶àó0ßp¦*á‘YÏ!ŠHè÷þðT&ËäK\‹æ3 êóBè³(åLŠ}xºc@ß*ùDÃw®À86/„~§D}]"j*f:ýp¥7zꚨç'I¤ÊýKÀ'U+ÒäØb­á«dª–RÛeºŒä£a+’‡Œ»Ë}&LÙNe+º÷*¹ m™CìXŸÆú9CWµ|®¬ìâˆ9¶þƒE¡ÓCma_²^œÓ)œE½3iSH§ü `üqÿ›É=QšÑÅ9b Qýƒöšv#§[Ž-8Éžë§ ˆ& låªsMxb>34¾OM8ÚI7•Ìž™1M_ŠÀ§1*f»ïª½ÞW HtÞF„Ž_E´™rA#;cà‘‹šý0 »Ê¨qãc kÉÃ*~Å2a¯iVïê!øàòø|SŸ"Ä*´Ò¿!£‡žÈ Qÿ:‚(/gB•–Rn> ¿OqëƒgJx…O®¶ñN»Dñ 62Fm1‹d^ :\¥ ²Ò™O\9ˆ?M$!µ»Ò§/QÏÅÏÞˆ¹Bw`N¶ÑÑ7ì¯ÿ"†*]ϤԵÌ]f«‚÷ÔAV¾n˜v[{>lÞ¶ˆ¢0žLȯÔr]ï Š6á>ƹ/| ¶ßoõÁȶsaíì·©Ö”¡ ÿ>AšÞþx°œ—0b`¦ ÷u)ø¸ø¡‚[0· €êÊxñðÃÀVÑ™¢ ªàÀ$;>ÚËA£­vîÝË2uÁ),EÍ ±Åc6Ö~Ĥ讖odfÃ4£Ñã'zw™”{x³­d1¤]Ê/LÔfš‚RTHçðqk“oçD‘ŒÃ„„Š |. ÒaþÙ^QXuƒ“ßÊkñI^ëôœƒ`#7_f•¸ÅÏÃÒô<3H21uŠJ*ÈmŒ;+IÛíGU“±ÕmòÕ][T£ü¦ˆh¨ù¶#cÍÐþ ô‹<ö÷j%…Mº¸ÈÄ™¹6µVp1B­-O¡Xøú}rYè9à·´‡(Q2ƒ~uDðs„ÝêËHCÂŒ‹ê´åûRM&0€ÛÐPZƒ½ †ðϘ¿*àŒˆÓ'Bê|b Ó3¶±Éøpº—š”ìr§<,uBŸùÜЂ…ù­Ï@9Š¡·²Ñ…¦ÅéKÔdªNGPì˜~®­Øã…@·ŠÀafQZ`w LL½X¯ƒ|.«Yfâ§p p:þÓ#‘¼à}Æá>ÚªºéñÌ·¥0¾™µéclOémÆktgvêûôJj_µPJËËÔÏè¼oýRJ…Õ'è)BxNwÎÒ`ÿ¸ x96¨¡” íéq'¼­»p¸“ëZªÇ…;;6Ü®€wzjkjÊôrÙ×ÖÙ«ÆÞ3…õKk Ü!#‹ƒÏ9¥àË£n¬¥¹®Ë!¶u”‹Üó …WІwÍ8Ë!‡%Žv…J%ÈY¦c&oFij‹«Ê/Áã·Ð}ŽÊõ|<祽ÑÀÅBUSõyH(_µ]Gßòˆ@¥­\Ëžºñ˹¶{ðHCG”sÀ8è[hRÖORM²6=uPá‹ÿn­‹ò‹gè`Q<gxYÑÌãb¡Ù‘±C9LáÔ.1×X+=bÁk¸øüˆÖï-üž/ßt|§§1¥æ;ûIƨKã/Œg ë±1ËßQts»Ê)A“lïQïšg©~Tac7@ìpˆmÀk`Ñ…ÿmÛœKòlVI­ÁcxMOþÀÁÖËæ“#º·)kÇ,qáîGôâMû0]4ïUÕ8ÖRÂÌÂÌ—CÚ' #7og,ÁÞ’FƒßzÊ1Èü0^€>YÃäùÎá«;š 0´G”ÉöÈ&*ž<Éïcˆ“Õ”4RßüÇ'ÌÝÐñTXÝÎÚ¹»ÀëôGÐ5öŽÖ}À˜‹?ÞW© m0KØö¶ü"b±Èz[a‹þªŸ·ÑòÛü_O1X¯söÂåª0T{0`ųóSv¬4EÇÃ>ívííèø˜€«/FþmØÆ~wîÐjèÖY>›ÜAß·É3gŠî!)ƨ‰ÝÃ͈ÞÀ©AÊ—£îˆîpXè õC/ì:Št·UJ‘ÞWѼý@²º!˜öŽª`ryÉŒw ñ¦µù—·¯•ñ‰šKKãè÷aš<ÞÕ¢ç.ýÕž‹<ŒP'A$ ¼,"œXX?µ#šY~•s]%Jп³«)²±òþÿ¶T U†¸(ÅrözR5"¤(|­Ð©î0¤Ž¢­\ebá 'œÚƒ›pª‘î´&“t©o<ämè»K‘G:o8jèY/Q9^.Ë–?!Ca^nÚœý7/I½$“»9¥¿làV¦¾ñbÖ]ßDðWX&ÊÃh¼£[ŸVüÚõ½N! í—›Ì{‰`ól¼™™R³ÆŸçj±o¡"2u¥¡{ckÕTf¹ë]l Ê ° æ}Ušå²¥r¥>ÚPçˆ_¹žÖ‰4¾Ö-Stkg*´F–¸  ë»å‡~íUzÉâ´ ~óRûì9?æxçl´ÉMèú'}¬µ’.qЖڳØ&n½­åäÁw}zAOª9¢[îr›Gõ Zp½Ç a7Œ%æXÈÑ ßé¾å[,Ü¡9ÎÕ”óì[«× eGå?ݾpm¢ƒ„Æyc)ÁG*'¢îáê vµ·ÐÕYvÛò…k“á¿W÷ˆjuU0€G9ÎblÊS ¦EU²%«hþ`y¨Öâô2’ƒ01÷‚’qŸ•ÃQ ÁYHˆ;jFìk•ÙëEÄ^¹“øå°ïÛÈÊXCéÍTÓ@þ'©ßˆÃ.ª%o~¨7˜É¡"…lŠÕãëÃ÷âf·@k ~yðû[Q‹tj<¦v ˆ¸ †á¬õ{bé´TßäÓ¤1è:($Þœh+iDÍÍ) ÒB§_²†½Bª >HåHÌ{¦ øÁˆÖ€7iGá×´"!ÁX¹p̺ÐÎ:+ÑÁí«É•¸¨"ÌÛÄAfÒòÝFlá#ì{YÛPxnÑA¤3æÇFC|@¾øn”ý¹ìë#€¥¸õp E¼ïœ7žÜræi„ùÛ!ùÔʸ›Ð cçkUM!#³äG5W¶þxWbB%ϱp59;ȇ€:åPEÈNoÓ 6 9³œYg^è éi%¢dZyÀù"XBè§Rûƒê|Ç ÿ{ÍŽÜ…w½¾õ—\¶×Ô )~Ò°ÄöïUåœÌÑâ\˜Dq¬B[Êj¥˜éïöªVLSÕÚ_=¨aéOE¹ßéÏHÐÿ¦ ©°”ψãú½²¾×˜—L_üÊKÚƒ/ô™>¿MS·C6²’8s—&<ê“C`ˆ¥5k2oÂ(É"u´¬ªÊÇ./ f°5ø•”²DãþB&[ÐdŒj¨ŸàB%² fzl'H­:·äP7b,WJ€Ž³ó:\Ê-J{¶ …®´”mýQ‰º_ò7ÆÔ»Qr$ …$š• ‰É@ˆË®ÓÍï ®ùûâ$w{PIÝÕø$ ò¬À0 cY1Ìæ¨¼¢¾ÖÝB±>¯:ÇÙT&[¹gÏß?}c<-·tÕãõ;ÿW„‰ÙIL>Å\Kt£lÒQ°¢â ¥XÌ–à:€-dãK»¦¬FéD‰ê ­ÉÃeRè».åõi\_‡‰'ß+_€#ÿ‡]\ÐÊ–{ǼªBŽßOhHïÖi\ó$­!*xëÕ“)¾}?@¬&a"Êߘö‹Ù€¦ÝïÌÂ1Ð9«ˆŒ1´GblK3ÅKài3^ŠåÕËB>µ½Ñe[ áîÂmÃå-ºëHMÅRÌ+²ñOmcùµE¡‚òÿ5Óž.¹PpxûŽh”}>»ÉB"ã³ @ƒýÚÔÑ!®'AŒq}YáÆtÍdùâË"2•áynö€ˆP¨h!©{×;tU«œËü´á˜>/XÅò-%5Lc'9ìµ@â÷LMú*2ü:.»ž<-³§ŸÅFK¸ºnÙÁ#½ ;áØd‚t_íGKéݸ¤NŒÀÆ å+9ÿ²ÖÏæDåŸöÊ0²rfud¤¡h«ï)éÈ*}¬”‹·ú‰†«3Ò ´6O^èðVoÀCée¿õXTÊbu2ˆÿ\¬¼~Ùö±dcn½ë·ª›œc?¾_»•’˜?”ª/)ê< £«$’|çԜܟ H˜x‚ò^ülÎOòBïÃüf9%W]ÍGº··}[¹ƒ‚:7Å D”·g„ê„q—øÏ#/gƒ|q´Dmi-9:/}÷*¾ |á”-ƒªÿ»º Ë[ÒÑD®4xèO¢1jú¦ÎE JГóZ.YN­»Â¨öÛʾ›g<0Ÿ}ú„gÒУ…@¨¦8~cÀDdì”Ôż…]MtíµHRCpÌ[ßB„´ê;¬Ÿ,«*¤¤n$Ë (ñíV?jд=|õg÷jëà’­+ùik[¾«¶~è(ÌÎ%†¶5¤i¨)No@'©_¸¯3 (deXwä°û’ÓV–“q,È…$ |ýÏLÖÇÐa3Ç 86¶NϾßaXƒßB;'ÿ¸P¯®:à÷hÿ OSè,¸ïø~Œ®FÙß•hÉ.[h uÞòøsåìâ}\©Üƒj©ézÜc4â/ˆXÛà€Ÿ–²ÌXó'þÔùëå›góQ…ܶ'Ýœ’ø³gèçÇšu’Ÿw‡+ŽÎ³FBìçü`‡fe¤ ì ¶µ³"¨—À”»T©&©d–L²XÞ wÌÅ8 Ì‘=u”VüŸG‹`êhÎM«Rs®ázÄíÓ½&˯:à£vûFé ! X:\8N u‡CR|i£žrå‹ùÊŸ¯$±ž-ˆ®‚pàdïúË•¶„ Bì Ý*¸›]š³<™%ÈØB’µ9„ ëxðrwHJ9`<Ìõˆª§XéiŸ¾³>•‚-8ŸŽˆÊ¬uøçÅtq/å`ÕÀúU¼66%Ò{$Äâí<^ ‡ºGüýGhl…çÚ$”R^Ø®ï-øwSbÏ_<¯Ï1=ÖJ¯ïZhü7»XïAqÐOÐ[Ý+tZ‡JÑé8ZVý\ÐÀ©ŽY EM7jk¿‚7/¢Ð9©¬P­ˆnn0¬j%ä¯Ô gk¿çÌ.ÀB_µ’hÛwÚv÷UðW€*;HbYý…“L e¯¯"08,©5^ 9¿6aý+Æ(a· ƒQ—Î’þZé‚&òçÁ}í‰jš¯ýq+LÔœiŸ)zUPÚîˇmu¦2€"näøòÇ“­ê®¥šn?¾€”éH^V;Z5>‚Êf*=kcûuf¶É«>·S¤± ³eû…K¢6+Q¼ÚR¾»H) ç>sH…Ä9Œ©Ëc¯^!Åsi›ÒŠdÌ´lîäWÓúP§2þˆ» êÞ;œ\,ÓUe½>b=¨!UÊÀÍÿP½c'X0¾ÆŸ N!yÐî5'Á(×Úöɬ·ôý%<8#xVW’–Ó›Rf>¯w„D<è¾âx)’œ³p\ NytD*þ‘vˆE-Z?œü¸Äqe0‘(ËÝ-Ë¥ÞçE¨‰c÷ã WI̸O§ [?Nþ I©“lŸ¾ļéÏŒd[£gîJ[Œ?2çÀX¥†¦oG[…êE²žj)VÂvO;¦%E¸ù‚&±Ý…éRSˆê±ò- ]ëÂo>nCÇQü Ø;|œ²1ó:;%?kPÎ)iyör cÇ ¯ŒÅ±–­Fĸÿ³ä2¤ø)ÝPn€K‚<­©½pRe µU¾.ÀÖyÃðczWx;ék7¾h»°F½cßg(!×û“ªä8 ÎØ›™æPñ˜Ãÿœ——¥W] Ÿ2&k‰«s}ÉgÌDºž ƒ›P¤íFQíkCÿ|ƒdZ•cÙè—[þZœù“cF`WZ³…ò&2֚ĈÜ_g¾(¶úv%ÒÀ> ÀsŽÅjpu÷Õ¶K}ÖQhW0n=ÍÉÄ&mDæ´¥hÁÒïnsœ©¹"*Û_Ø=톿™ç]e¥º–¨ñ´ÕBuÙÿ¨/øÂ“ÄQv&ù“ç"ÕG½°(2)˜ò¡7ÌÌ×l¯Ô+e0T÷²ÛïwÃöT±Ðá²×–ó»Ô¿µWƒûh&²g®z1>¡kdhfõÌþØáÒ.@{ÞN{˜¯e]8ú/Õ%õ÷lD þÝÿT=Ÿ4S®[B?’òrw(€VSÐ}ûƒzŒqûh«åV‹âD†Ù ,®WP}t¬{À«ãF=øÏe¾ÁcU…#*‘˜¤ðLʤ·ä6cZÁæ1K„(ŒÀ fîñcôW/aeSUú?v +¥”m7Ø=aJßÊû]Gbv–!ýïr¶µûO¢úŒ•Y³¬05´Å€geÿ—ôë žÈ]žn$á‹“Žž]ø—-€ÛìúÌ?–­H‹Ï¡¶VûëKd_ó€„(»®tõryP´›ðŽ(/_¬«Ò¯âîc9wþ%ÃÙ›h»óuõ d‘1ç`W2¥¡Š£òhnÊßl]^Ïy%ùìäÜzÅì:„H‚¦iyûÉ}ÅŸÞÐ/ÐçtdÖ¤GT_MxýÇšûè} }©k2Eãou.øe´\@ßóÇ/žÊRúvXkíÐà³ÜÆRB™ã!•þZÜäO³¨ZãΘ×c2DVQp‚Ý*¯&B[2+?CÛÐJn›ËáíB¸U»)ûJ>¸TÁ}Ì}­Ë¸î°y©±^+ÚÔ˶y )“鉢hr4ýHØÐ B²ýæb$Àc¿~álСªCÜ´wî²áÅVO"æ+¿içÝe‹Ã¬o7p­yŸf•°”(óc=òè^0TwTü;%•£;åS—ø f›¨Pûèæ¡Ö«ðL¾Ub9?Ä!j§/¿sXKÇ)+Iäܺ‘$òLÚ)Õá±ò½{iY¨£ñ#úÉ`8 …žG@³©³¬B VǗЗلuU©ï|>É}׈Ÿßø¬ `P&ÿÓíú·ëkåXsõBò!i”˜t¨ÃZ¦¿¨‚?.ËŒºïž£W3™e”0ô?ü§lÂ/Ò: 0á“YVÐxã‘Ö:» ¡QHK•‘ÔÇk;ø¶Ì£® ‰¶àÅÐyÖÙ$Øõe–/ñœËú1¦ü’ØÇ Ž £TP_ÆÁÓ» Ùd¦BçaIçÆªöºT#ŸÒŸt¸+Ï<ã§d«h5çR{nX¸î…´^ü‘ûÀù³¯óp†­SF($2¬¦(ò°%B²yÇ­õv³K›¹‹4˜X="ª€ùf7†Ì]¡?¶lŒËoØ-pæ½L®‚±³JøÌö䜑Àg×­ª˜d,¢ámAÅÐïŸxn¸½_ðZ®eG}sLÝ¿Öq­ŠqÓ.—U§j¡Št°Ý:·ºÓ“ çj¢Mh)a¯hrÝüÛˆÁÿ¥ pØåµ‡àÖQj«óHÚ,·MA"XÉrë«—F!gZT")Šõg+ í»„m©×§ÈQ­Äzï”aåÿ*OtþOßm?_Öà¸gP7Ï•ežÇÏï÷ä_²^*ô•¢c'@r²ˆ<üÀúb$Ê»˜¿ÖX6¹”ñ…cF—8^ 2´õ;]2CN­—¶Ûé¬lÈIÏÃÂŒ‘î[÷J­­\õ#{ný5{¯v¿Œ¨Ï1é¼é~·—¦§—•'R¹-¸wµN:½› ¬X_kä?dÝÂ`kÞÊñgBGƒUaýI€[˜ÑõШӿ}‘9ñØŸOÝ{5PÆÊ‹'5<™Š™³.G X%'ùP~l$/äæþ^œõp€²-Ëmy¯áRQU±—|³¤Rk÷/£kõm^Ö·õgÀ-²˜iýüɲ ÖM·6VÑr‚¹B\=¶Û0“n?hjÒn­|ªÀ ŠwÍï"<ëR¨0±æf5ù¦}=¬T‹ƒu•mV0uƒqÊÃ1Ë´{ë´rK¬ã{R}šL.Ñ´¡°e<üX™ÿGO.TØ4~¿µ2ŠcÔêÿ¥-uÁ=¤¼…÷Ë}áÓŠ€R ÖJR¨Ï¸‰F4 ž:íÏM-`b=c!”¨³–8ÏV|·§A½Ü1û°¢fŸpHÝK¼[,~ã|'jÔ>{XîYˆ–~•8Ö^™úm©‰º­m€´ ÈÈÌ—xÎõgV7ý4Ê;+N•ÐÑym Gy/‰|÷M\lEµ‹ŽsWš åÑU¸5±“ véñŒåî{ Š€úŠ©$ñPæ/—´rßWIѼëÜáðM˜Ð–PL»tv†ë™—IeTUE›ÉÃ-Õ¬ƒâ²ß3GÜÃH}ÅÏá¾I›Îæ’aWžŒM{š¬sSBެqþ›ÑÔd®Ü?»Ÿ‰¨­4´9«´„°[Y_n‡}ÕC,^ÑYQ1ÕÚ××€aK´#Guå údõ®)s™ðÂ='`Îâ;‹Œ¼Q¯ÞcÖTÕ—%1±U¤ÚgCwîÎÞ8Á”|Vg…”üV„¬Å¦¤O´ íXö'–;ϰsí΂Ôî[ 딜g†ø˜øêí×ÁHÐaÑ|?Åøw×M@'Î\‰ËDÔA1°ñ;ªªmÖÿóJˆèü!¿¯Û¥A/SÙ£p¶úfn'ŠÀ±{ÎÛTûuõ"!#~ÎÏ^„qð¢z[°ÏÆzÍ|²kXyVdk<>{ ;‹ayÜ@Ùƒˆ×®qé=ÝBó;Öxp=¤âîðv䂱gç„fÒÀŸH»ß?z[×§ºÀ]±/ =/öño»ÊÖL‘°ó¸ü±+ZJ5ç3‚T iß ¯ªÌXšžd"s}Ñ’RF¡ì ‚ïmͺ>Š÷?§îßeu®EÎÚÔ˜W0Ûê9[|& 2&ÇÑ %¬I 4 $–.¢]j ð‚!:÷þ4.Áƒ!næsN(À/Å¿aF‡EÌæ·ê«ŽÐà`˜ÈÓ ò˲,ŽþŠ)ùG›²qÈ„§¶í!HÒÂ’9bÖ=…ßÖŠ¶þ©äý·žÃ9°g11AZ¹ÙÝS œãÿO÷ÊLÕ+… #Õ‹%#+×´wj{6ÏaY×YJ}Ø!IDí à¬ê,£Ã¼©Þ݇ÌÂòrr¯<»k8~ý1¯„°@³ia&g< Ó ß:·p!ùÑZäm©:…–p‰ïTv‹~PÜöÏUbл^ÀtOž|­ûb½膱ÏȦ®yеçDLôBöRbÖ˜}ÏzWa¢ùÿÓØêä¶©!|àb·I[^¾úz|px†(~‘ËB–º|D~ÁŒlèRq5Qœ1GËÉéBöM‚2nÞJß>ß{äQŠÌ‰úúuŽÏ‹ïæ³®wÕàêr,ËþNÎrïÈ“ª€Oª÷JæE ŽUÍÕe1Sñ%±ã´T‡¢'hEâšÙÍÏÊâ #]Ÿ;™ùk :VC|c­ƒóÿó ó$…Ûe•ùÜ ­šÄ¶¦ü.K†À7ÌD$ë}:úòàÁpÊ\ãw ?Ñ":r„Ìžo¨µõ‚96'„KÙžeosÞŠš× 3,®×ž_ë@Ë"JKß`ä Ëíe1©i+ê}kŠÎÇÙr{ëÀ.QXßMMTxíÈê(ÉA%æ>Åxlœß>‹÷FË_Ñ·šà×놼z:[.«ààÏÞ4³Ò»g>ø´àuk âû.f.TŒÐr¥·ßãeõ±'ª°¨‚#Ìy–Z;]jÒØ<ɧóÖ]û`œH÷U^#f‰wó¸ØHâ8Opê»aŠÙ¼x>]è0`5Ž¥“H‰®vY!W]Pe]z’r¿fÍõÓÛ´ey¾þk°©ÕHì•g,ËÞPb <­-*ñ§×¹#ßÑ=Ü~o@ýW¥‘šªu‡(uQ©U*1:é(°9é¿¥éÙÌÒõy}†jÛù£2‹–p ¥MÔ²øð8ua‚Ü2+l  K‘V†pÍwñŸ?| õù9‚ál™ç‰ÿA ç0_€'š[W½ë¦=iØN–âr(MÁBª"j–^$¥dý&µâÓ2y«¹ùoÍÏ7LxŸ)¤¤ò¼Å1€PR¹¡u80›ưè],cKËœå¦Eœ S²m;“—²Ú}¹wƾl?5%­þM [XíL©è¶Z´&È <8íÖëýIôÍž+ªëâ`™ª$‘•4Ò:ÈY¿…åq½ÁrdÿAxrñ½È+ÿ§çȦ˜r B\p¯ÿÀ•ò9¡-y`]gñû#sb&ò_ñƯÅJ-†¨‡šNèö$I¡¼F{ô@Ô<ÏxËñá‚~ù†^•w•ñ8&­Åú¬@ûÛ<³U‡S]¥}·zJÛ)Iu—¿Ï°»ÊfÒŠC‚'°µJOW—)HþÜG`úlœ§2n[=h¹ÍúyDÅaNWÊ—B ] ÌF¸±}Û7õg„%ñãåzu†zŒáG mkHèúÀÜŒmï =Íw Ds@«ã¥iM°£YÃhòܻ޽ZOxþJÕ‰F2¡D©,#€Ð/ÊÀ­j†ü^Ž‘æ*rŒ„Ë$šô›¡Ú„q£">¿dínãâ“ak5FUD‹M8•êË#µ\“kKªÐÚ–ÃVz2šËàSõ7ZiqæU„)šYLk÷æž/Ú\ËÙöM«S•¤ËÀ¦.UÔ%¹ÉS¸ûŠMúú宂¢GUÛDÚÉ,b¢4Zî€A… bb}×/Ì^ÁèŸÅÍò™¤%–bjÐ[±’uá¦LÔ)ý 2a¾üÔ±.z ©5*º¶AqH;¹dƒ&sŒ¨¹y©Mx*6Þ4äݘ¤c'_3cœóÒH¥\ß°¶žö¿à.LÛ$°>³L˜Ø±øÙ‹³î †y2“ ÕÏ:&~ ö­É›9tw$D^襓 õ‚ `«"WƒåšÚ$ýüÏMu°’£÷¥_Ø!moG¼Ê¤¤zñ©T4~åhn‚I¹øï¬ —€Pù¯ '™â4+Gú„*Ša¢+üIŠbÇÝ˺PF3¦Áûå5âíaÅuä˜ Z‘"¿ …oQËÏÎ~ß=HmbDe4òú€´NXYfÑŒ^?G‚Ö_– î3M9ÈŒÂÉÖÂ} ‘"{ÄW}£Ž‰&˜]?mãèB2u^e)ù°¬,+ÊuNȼÍ4w`— 9àîŽýVû·Ã¯,É€#KïBºÃò<©Ñ! ÑÊÿEïv)k%M{à3h%€ºYO™ðžÞ¬ìú[An€ÞÑfŽÌ "$·+ëu| JfÌ·ÿþ…ú»vá®g¼FõZ–Œ ºrºï©Œ|9(ÊEÂO1cdR0û‹ôL>4)bJÞþeA%aÜ·-“Ð31nLžYCŽn+¿®` žãg²¥²©^¸ðVv+F,DVá[r(þâ#úé“"=+0C…alùˆ ØHѽxpœ-‡ß…èðEíd5ù'a§¬tà1=üôUÀ®@ì2 c¤¨¤ñàÉ "×äMªzm øþà>á>ËqÌÀ.Ýð,ƒâøC ìïz2¸Æ²“8Ï÷G®ø€‹ª`©Îl29‰‹ã[;1_ Ù­^ê‹n€kgýû/„Õõ|YMûœa…ÿ†Q‡1-6kA Hõ‡ý9G%J~U=û“»P{EäÊ9´‰ägàYÔí+Kn;+';ÓNHïLùßÎyØ~ðÙíù€ ©`3óT<™ñX)烈š3ïhP¾I(]•ÖËâµPÙ©ë}óì ÷„<Öb1Ä <ÐXðïÖÞ¡…Y$;]oÊ!ýVxrß¾%±<’5ºŠÍœw-Ç$`Çв·dÉÎ#VzÍ!VàÏó·j¿ ø€LRÇ"Ok$“û0`S~ÝÞEì~#<ÆQ@· –dýd•9¿è…™^ÜMýkû64(Vî ÙÁHÀäöºH”-ReéÒÍëJ“Ø*37N“•dê*y¡éðÆ8líÈ¥¤–ß®C¹gœ9èI}Ú‡„•ã?yI˜ óD˜žÿ6¶»©O‰JÌNéo>•!ð„ næ0‘³l—8\o!¬i#¼â~&!ö™nÅσ¾ù޾~¬–Œ7C}>GYcZeXseÜf%I 7š  XüztÔbõD%Kh~†ÿ"¢ õ­+ð1 ”N(Ú§i;|Œl±qGÍÌŸª²Üd3Á­Rò©Ù Óæúf®Ã??°Ýºˆði<ö£Ò° Ijå&=Š[Ò ÉÏÌÁ°bÅx ¦d-Þ‘Ïf?/Í?ÎÎTÙÚÐÀÌÞ¹¤5A³¿9—ÈwËkÕ;BÝ#x€^_'ªK i§bCJñ˜ò¢æ;Ã¥OÆ/fx†ci§ƒ‰L +ý,ÉÛœu¡Š¥ ¡ÑBÇÆï畨ˆø”ÒÆ$Ñs{†|õ]…YÚáãl²0¥>]€ß7¸•ç­iÌíWE•ýF•1A˹N-5ÒN ­‘RûsgI†çfa7BAmeÉÑÊÖrp¹÷Beú‘ö¥ÃgºáJW ™%E茟2ä@Õ‰3ŠË(¬µ¼‡³¿˜ö@KE:Œ£µÐ‹¢*ø{ç.}ßçXÄlHªÂÝ×·¢˜lj™,°{K­ë¬iNejÉCéimº›*¹0%ÍݬÔžg™t¿Ë½ùØÉ§§Äñ­-)¤‰*œeð-9Mx‰1d'ßè|Ú>@ÈiÖR¶Å ÃÕØ!´ƒ:•ôý»ÀÏ,B^¹NrÎ4P€ª%™öˆêÌ¡×{%Îgô’Ö™rî?i1ä Qz–,Yþ¿PÅxÁ°YÉ8²ôÔ£a²ÜÛã² _ UâGßÅ-ÎÎõrÑ Ï?›ò«¦§Ü´µ…,Ъ¦¨!‘sÆNmošžüt¼ptDÑ\‘*®þÒ¤†³ý# æ5äÄ>ê>0z9`ry¡ÏYL¤R<‰{ŸÛ*$o©?+Tñ†ä¿‘ÆQû_¨©Y5÷qŸVh-5½TóZáîl òÿ—†Ïºÿ¶§ÊÒÞ ±Ëù…¾O¿âŸxmqPõßÿ™]o¨‚FN ®dǽU¦«ÝºÏO‚ˆÉ¬W}濎WÝ߆C¬Š¬>Ø3ØñÉàQ%åbr7ò>¹Ë|ŽMfè¾³¸®Gä'…üP¤?ìöæŒF"ZzùŠCÙÏjßDGK˜À›—e³ÝðwíÊ,\o\ð3V°ÊÉðy ¹éÝ;÷†š7ð'3}^ NS`³&Ó!¬ÒQ¼¾çÐÞ+Z§ldî“Êÿ]¬Üê±[06ø¹n r“Æ3-°c³2„Ƶ äÈò*i o!J`}¸3£½uŒFŒhÕ9žèZÈ4 7ÀP˜ãË/ìP§fu¹l"i5Î+°ÔT"túÚ'jß, ‹|·çò›é}é9V'Í„™êJ{¤ªDM±¾bÊ B'ò׎4‡¤øq-Õu7)C›:>_„%æ!æWõŒµÂã8ñ(˜+fÕêM n!µÇ¹LâCc"Á3Ýv³˜ÒÍÉa®®û …:„¥·½³v¿ï0ä«B8гAI O ÀYñ$æžMk*ª"ååŽuñ‘ƒh€±—œé ]ˆÊøÔÒC ãŒïËýe1 Lò ŸÁoÒÜñ»¿è>JŽø9-z "C,˜_ÃÞ¨Ú¶«Z.;å o|«k²áMiê®3‹U·9U«ÿDÀ8ÁIJ?µ/Ä ÿÈ×ÀÆÕ¡¹ü…;ìZW$ Asjj·Ø«:*m +™ÉíTfNÄ+ϵ!¯Â<^™s˜9Yzø½PÿËö®ã&­x˜º¿ÐÇ¿¼ä‡4ËÚaB`*®_+õ”…J¼±ò6È-“Ù…‚jÌz-¾…iÖn¾/«Öi‘°Q/Б]©3¾ÀE]w{6íý÷Ç­lv– ýÀ}‘XGæ/4Ô¨‹Ë-†o ÝÐ×1×'ƒrÄ6Ëí°¶LгfT¿Y±—.ÍYH«{¡.uîÛ—ÊP^ '\ŽÈ÷.öÕf&j±hô¹ßbœpÛ¤‡ÏvºÅTe#É älÐ oéîÇ]Ð&¼4ò3‘» <ºoJTOÚx‰×ªãè0wˆ†Œ¶’¢ ©5+œœ§¤6Ûñ€·r“‡O¸Œ¯Ë…oüõežÊqú¢≮2p÷¢¼¸ù`0ÐÉhý=ö–"Š Û=ÕØbúW~>pªÄš˜¹ö~õN0YΦ9Ä›íz‹iÎÿöK5 I0@>‘"!¹ÕoüPt37àÆë‹WÄg2ªý߬ßBÀò¯ö˜Õ20 ¡ ´ªŽÎp¿Hr¯7 3’˜¤ìvœÐÎoüÔ´ë¶ÏĆÆ=œ@¼„JºäG øì äC¹±®­§ÚM5O.¿„1yw ²àéìó}ãpr8'lÌåPz.´¦Ñ€Ã[Ù2œ—¨Ø®‹,Ÿéw“ %*±-@îaú8¤õPÉR½H­Û„AgO-Äj®7íÂQ!;Hl’ÍïÓ-4ÿŸc#î¼–ëîD-ÖìÀ ¼*n‡~,ªcQw"Ò‡ 6äÊÓZ9 9{°Æ a}¸Ûœ¼´3‡Q¬ {pUÊÕî\°Ùܦ}“²V–f)åÊ«§ Q‰¼qQ~ ·upP[+”‡‰¯“Kqq?ªåSï‘©¯¹áûfÓ*ÿ§2*÷F!<µØûà~¯|¨ë´:À~iwA`rKÛ*†˜0&¤? ñ¯zP¿Éübâ`kN7nqŽ(¹ÑÁ»š¢ÌP[=Tí1tdƒ˜I°³_8¢iï‘R3«Ö*ímcÞ‡xÜ‘¾íƒPÒšÛcª¼PÒû9}IH¤[(•9Ø ûÍ"’oõêЦ9Þƒò~ö þx5ŸSs (›Š¥½6ftÍÀ«3دÞˆ‡È¶˜Õ")éIc—DÚ¼•÷æ·Û9I7ó!Oõ¡|Ò2.ÈïG=*ÿê•ðÁf…é2oebœFºú±d{U;3´I]ú‘-öl¸ð½V ¸2$§È­š6¦ø·æ´f#ׯS:¦Jß$ˆ£€\¡J1é¾£µ·GÔØ}jH"Ä Fíï*Míï…Ø¿æÛJ'ÄB(Ì* –IW=¤jåÜæ¸»-K–1¡Wç_šG‡ó½ËTÚêø/f%õK¨y®[: _Ó¢ÔÎ…DÛ“šÎ+Vˆýêñ?È}Ë‚)l…`h0>zÙl’4â…‚»ˆŽöó+ÒòÍy9º}§0`Ä'åÔvÁ€ó”ôW1[/ÆÑ£x/¬Ï¡õn-è(SaÄBÙûp çÔFL†4åÓ„T,ÐOÙB2ÀÌ7E“ŽÒYjj!Î%í  êy2žŸu¡­¡ãµ']‡&Æî’T´±võêç¡´¸Ñîƒü?…- ßÝÕH•ÿŽç¤é7C­ö„Tx¨‡³kG 7°ÑŸ¶ÚBP7Ü)Bx©ãî꫈³¼a~‚Gæêª“ØŒI$qöAÙF¡4äiH†Ã"Siö&ÿ’êû}”@Eá&«ƒ„ñHc²%¥ô×6eûQbcØÂ¢3•IÑì·ì1í>$$˜‡Iõ!Ѻ0ª —AOG:ÜÆÜ€Êø‚‰no#fr‘±Övçß”K é]›„´ÍDб™³Â`öeqÊ”Cÿ|I®ŸÜi>Îùgål ……&ÝÓ7‘â´¡þ»±“ÊJ‹Ißß­Viˆ]Y€¼À6XÕ]¥–=|ÑÛ,2¯¼‹¼UXÖ¨ºn àæ‹çãÎ ò\n¯o·M2QYTªÑ‘šXÍÝ­\ymbé¡•Ùü>é)ãÅh(6öŽæÃ>½Ï-˜·_h¤%Ižxºƒç¯W×ô‰åTô0óûÆr}”K¹Ø:ZÀÀ]4åxju<¶Äõ3Hþs-xâ‹Ì“+i˜`€]­¥hA ã¦äIóçTYãöëÛ°å)i;*b³OfãaMiÓpi+©^N´N›w¨\wn%0„Ó¤­1{ÝÎÑ?ÆÊÕ«ïú0wÞNxw~é|ªYÎz;ɽȺÀt÷¸ã&ÃøKÓ‘"ºøá”»NÍ6¾ùŒ‹¿`•«ISE§÷þÑ.u(©ï7õ¤y M1O­âÏïA–N‹˜S¾=£/k7äU$YÝ©Œ QÿÊgòÕ Mi}Ú#ù…\öΞ8)ضnÊâñznਨ—•ƒìw<}þ¨f!–ò p@1ë[Sôä=ÞfÅßÒ—:÷‚SÞ먉¹Üø‘Ôï“ÜÉ ãÚ<Œê¶¥VŸ^aË8/lpQ¯ ˜kH;ÎÁþ…2ù‡ÝE]-‡&ñ`-Û‚[Öd ¸n£´O@ÊÝjdžÂ´[F ‚™†öT‘¡'Áè,¸®ÊmëÔRŸþG^6¦ OQË‘O!O5ÈŒòÂQÉÜmõKÜ.SL7Ä”:®Š{µ„æ¿Xciçܦiª>îÿ}(k 8§NÍ6R'"iÊFlXò8ÕÿeÇmž°Z3‚ÞÎ&µÔñ®s°örZgãÞ&DÛýFM$‰%ÑÚ`ÕŠT¼_jɤIÕ ¬9 %¾’©ƒ! Áî ¨c µt;kϤ˜)Û¬±ê ¼d½ÓÉRí®NêÕ¶~GÄ%ÿ0z«&·™¼¨\B~öŠdTûàëR†Øˆ&žé¹Â&`áb~Êɶ;²²°y:îNLvøáÐÔ>-9g+„øtäçRþ ¬úÖ‡œ&#ãü;(oe!:¥pØ*–Þ×þÑák©dIlSîèÔ§ ˜¹42p1èxHž Ú÷" +÷¹½yéATÚ.É1uè>£Ž~õ¸øM ¤Ü%܇ñôaÆa +‡Õqw/D$Þa0ι·õÚÖû‰Ÿi“²òÍR“º#±Ù<Êô«Rz¨«nö· íɦFÓÏ2AÌ•³‘ц«Ä¯Dç~fͲ#eQéÉ–n؉m¸XEï½Ñôé@tõ-‘fû)ö¦¶Ç ½ºK.⥘ޫ?ø³ìŒÜpŧ8éž_“ˆ¸º#þ”@Ä>ˆO2 ­r€Mã¦9ŸMùb•6²ð®Õâ±Á ŠÑä3w®ÒukÙB8“Ux:Ëöº›øÚÃð7&ér€ÁÉÔ`ø Q‡f*ª»Þ/œ‹…¤™g÷øJq%¢â dp¾©rS>qÕ–6èL^²ª @¬pmd{…ßÉ.=’h®TuÖ Þ9­þ_H Z…)¼²€¯;žÞ7îЉø[BÜj¸“ùWÔµ˜+ëÀÞ€¬Òd%dÊC¬7Ὲ²ìŠØ°•È­mx)p“Ó¾OÿÓV¶J×l™²†Ìr·¸¡y¸Ñ9¶S)¼tþ<¹ÄFA£žo÷wÿ‚¯l†…Š]ƒš2È…I+Np1/ÌçXcÑé9„Õœ±¤X±jÞÌü5Ñì½²ŸoIšéhµ2¨Å ‡ZÔ$E˜å™ àêr}Ãó¥3æ-cV +Rö +°h¬­ˆ‘»S=„ŠUS˜PõU£:aVRaº‚_ãÔþQ7 šÏBΤ߇üh C½ÇW…²b!¹x±SAš¿ÝÑÐ*tYØX¬V¥!øí³Œ¿ù²Ðédð˜ä;CÀð‚åþ„®¬­9éž« ù|1Þ£PQÛ˜B!g¡FëÐJ²:>AêHg¼ƒÚ`¦vöÚïF`Øé„å¤"p¶¼aïuL› äÀŒ¥>[b C¼Û c _ÓœmRPg4·Õ™6®gSÌ’9ì ,®ÓÝeÙöÓËÔ_?,$ÞQ;(=»]GђÜ…²š%ËPÕ:-f˜c“‘‡bñ1€ÕèÄRcžÜ;¨û`1VWR5Ä]mfOòzxYtA‚„ nñz> £sppÕ ôBÀߟµæì1›ƒÚ­nˆ¥aIdŽ‚U:½‡½Rñ4Œ8c˵ó ˜È•ZE[“ŠGY •"7_O‹=ümRe†Ý{M`„†Þ¶¦^óeÆîߪәqŸ÷°6þTjª¸-k-$z.ö)º'Tñð ônŽ2nBŽ<ß6kÜþý–ðPE¶—~L•òM¿ú‚õ°ûa,è¤{ž®>m¦umÄ ¾ê\U/ ôÜãEš«{ØqºŠb# ÿEgÀ(™`ÐZÒ-ØÃDµQ’F%®;õ‚{¼5%©™ò¡¿Ûì·,صpð¥’^ñùGq×2ˆ€$¯‰ÙašúáðÖ(§^~ P YNAMØyß‚PøS ˆŸ‰#|¬¹N]ìú•5fŽåzø1»Xïw%MÎu„‰ƒ¹žíê…ùòµ sYœsÁ¾¼×:kQ‡·Òþ’\»ÀfçžSmqd×ŠŠ…™ÌŽÂ”ÖY“c™Úçxbnæ@Ñ›xöÍÅ©M#ÁŽ^éT±Z—Ÿ½*iY{v“¾:òâFþ^4“$ʸð\ܤÉz1´““꘳pMRFu%úVŸ— ­#õpÑkÑË%|’Èk½¼¼[y{ȈPï2à1œUÌIŠg¹²ùçÄ ¦Iw¡›’§ì)ÏÛy‚ ŸUÒµV‹Õæx1x›sf¤[DyziƒŽLœ$ÒEOPž¢Yë3£‹Ôc°`û¯ s˜@»¢Þæ­¨÷ŸåÌPßûÜ dA1ì üéöMluÏè¼âƒJæu Xÿ+ࣰc!ÝüK ¢w2UâÕŒ38i‚Ûë¬Å߉`Ç*Q4·ÙdÚ…,Hç €h18$oïЭœG<²÷£ÈÅÔ¥€Ð»áùÛ7\ ê¥%§l=òÈ÷Š"•Uá~P!oq}³CjÛ_»K[;­uñxê.9€¹¬\9ɧÎi€D~ÓT‹ìá½Ñìq[®ßÚ ©ñ•ß%lǤ\îX-ÉN›u‘‰&KA•ZIKoRRœP=@~#å¾dn.ñC ®xHvz)wxõ’ÊL#µ«Àú”ÊE¢D–•o¶3Ýq0Wô©1µW¶óÄ0ÿßp¸øÛÁÌóó¡žh/5‚T+!ø»¼¶ú }6PP•«M›æºdãôe"©¼=‡™Üdý9z “*˜€Á£é멸`ò•ë¾”ºRÀo7JWCŠÏ&Ùvò£¶i±Tµ&g:”îYWòþ4 î'B‰Œhxƒžv dǬ4îæHZ«®+”×ö‚èçÙ›Ì2]/c`N–t«³l¨¹ç˜E´Ÿ •Úæê4‰P˜ÞÛÔ¶®Å´í½ Ð}wƒÍÝÜXp•Ê=ÞsÅ¡,öµ™Íiœ®âÐDzÚCèÜ™]50AqÉ;0)ÄŒK5NE×0bõeqá ÝŒ ½Û~@ñ|q糧E‡Ù9€4†‰"+ݹUŽ´Àõy`4Á/ù¤âFwÕë8ô<ñ,ßäÓ+í÷é[Íç¡[ÉÅmç4–3vŸp šì „æ^® ,eÙ÷+$t"ìÂÁ€¬«Ì2•®töîl¤õ X²_B.«zznõSèZTâÉF¨Ž9ëüâ—îs½/Ûä˜`J½þî1Àn›$?°=õfë4`“gðþÈc',ôª£!ÜA‘Ïúã4Ã}âXñÓç\ ©v8•ZRCfÀ / ¤î×ÚÖØƒÄ;ˆ· ”51T¯zi%CúÊ‘J(;àÌKd¢½¬ËÚ~I5Xí´|Êv)qz^ )OîP¯‚7C:úŸ^xOÍ*xÊáà×Léð ªø)–‰> …ê ;CL[;:E"u¯¥‡¾I$êÁºdõnô{°€(ÓéÇ2-¢• ‰ÙlN–Ú4¯i‚dPx=h#|ÿ®Œµök PïŲDxZüA²Š1ßl.eZÉo[és“qG¸諥˜Cv÷ ,*9¦~Xó]üÝ{Rcd̦÷j¸qÒ#÷rž›ð“DúRÚwK Ü*ôBi´QLˆúS ¶\‡¶\r<„¥¾ç>‰tvh<ãs\[<زQ^v\›A ŸÖÄO‘·¥sË®I§݇ö9­ŽÚ¢„ܶ –hUÉ«ÀÇâliO·®ÝPËٞݴzz§7Ž °Ò•"8UâMoN⇡ØL©¨Í) +uêE]¨ñ7”“uÄMxÜÒÛCÕÑ5С(VÑO½BõQ4+ W) ›—/Tr¤½¹N ;½iê&Ûµš­3 [ûÑWrhaátØ'™!/Òð‰ °êŒÙÇ׿$œe˜q@¢DÚ«±9êGca«¶ŒhÃâ?N΂×<È0I}l<€Ã§VCb‰¬p«ÈÔM·×_2¦Y±¯V^>t7tÓQ58Ð×ò 7»3 Qƒ7ŸîÅõkè(觯±”IâÅ@‹êÛ¦žÃûC ;3$ªù¿ý`ÌÞò¾BדÍÀ+ÞÇÇ.…^\®?Ê ;0Š!ÔFŽ¥%>XoëÖ gº8íà?àÚ?¤í-ÕöH†”à8tQGMÓ–¨ ‰9'ƪ5D`Å!q^¡O–˜IѼ×ývú,µ×äßZ%y¿û¶ªÔÐÀn[oÕÞ÷þFHIt¶í2ånJE‡lŽ#r¿ˆ–gIvs¡-Á—”(ŠùÕFƒ>íSÀKýez€=Ž˜)8Úþ©"€4…‰k%(EIQl#ÊÓhÚ͈ïÏQL×€¢jù ­t Ô€ ©ü­Ö.Ö™íàŠêæ¨+_|xæ‹ aª~Wô¤sº¸+ž ,A„{("R¹ªDÉÈl/%²ys­rlüXÑn»äÙä_W}!÷;0lG÷›k×’òsjäe£œÀq·o0Æû‡ö«Žì„SÈ“azd¸œI¥+‘ûaJއ\˳–™¦›‘vnrÛ6øµZΊ˜ÓÍúŸ%fZ•'ãë~5ý7`vÓèqª„,J‚ô/pŒ¬Ÿo;£R´J¦yÄ=‚½Ý n’iâ NF"ÅaáDÏ•’# ¨É×Þou´¡Ò_6'[‚²õÑi âÜÞÔ5¯×RZ’*×Jââ†;2쯩ð/uØŽ6·èiR–F!H¥ž×ïd ]Óìé.ßò Ù¯ªÃj€·ÇM×õ#£á 2Œø'ç/×B™>Õ'رX–‹I¡5ÛÞ_ó+Î,`°ñrÐžŠŸòÙAíUÛa5Ã}¦2€²;Y¢ÁqBØ.þ™®¯rN½­ ¸!•Ä/ BŸ‹¼õލÑj° LÁxìŒ1Ni»½0``¢-µkóºKä¶»~ŽãêìZ®ë}©¶œ˜?û÷ž\ãMûósø†¶.¹Þ‰ ÿ2œOué.ô†:º¤Ÿy².ødA|:"ÜîÑ µAªhà·íýgäÉ7ò÷±:A‘éZûJ ïj¥§³NèAe¥9´Ùp ãw¯z/­ytUE$}ôÓÐQpœpýkò›È±OM]vï<¾äÓ°—Ø8 Äz޶‘6»RÒùÕËnE@ ~N‡¤ò³Î€–¶^ΚK¬fDÛp5—ˆœa¶}§¡>ƒpµÒQ튦X°¦%ÛApMЙK/Ê›Zפ…ÇwPCsÓ~Zëbœâ°qÅùÚ²»cž2§±S‹o_Ê(¢µ}…ˆYu×u]—í¹˜Cˆcb£§n»]®-µBÞ•ä#(€×i`Öç=ƒ0S¹‘tap…$D¥Vj â‡"fÌø¿¢õ¤Õ8ëý(˜Ìóþ•¢Iè<'>0 ‹YZNMF/src/0000755000176200001440000000000014661566507011501 5ustar liggesusersNMF/src/euclidean.cpp0000644000176200001440000002401414661334302014121 0ustar liggesusers#ifndef NMF_EUCLIDEAN_H // include header only once #define NMF_EUCLIDEAN_H #include #include #include extern "C" { // NMF from Lee and Seung (based on Euclidean norm) SEXP euclidean_update_H ( SEXP v, SEXP w, SEXP h, SEXP eps, SEXP nbterms, SEXP ncterms, SEXP dup); SEXP euclidean_update_W ( SEXP v, SEXP w, SEXP h, SEXP eps, SEXP weight, SEXP nbterms, SEXP ncterms, SEXP dup); // NMF with offset SEXP offset_euclidean_update_H ( SEXP v, SEXP w, SEXP h, SEXP offset, SEXP eps, SEXP dup); SEXP offset_euclidean_update_W ( SEXP v, SEXP w, SEXP h, SEXP offset, SEXP eps, SEXP dup); } ////////////////////////////////// // STANDARD NMF: LEE ////////////////////////////////// // include version for both double/integer storage.mode (defined as templates) #include "euclidean.cpp" // define the exported versions (for SEXP) SEXP euclidean_update_H ( SEXP v, SEXP w, SEXP h, SEXP eps , SEXP nbterms=Rf_ScalarInteger(0), SEXP ncterms=Rf_ScalarInteger(0) , SEXP dup=Rf_ScalarLogical(1)){ if( TYPEOF(v) == REALSXP ){ return euclidean_update_H(NUMERIC_POINTER(v), w, h, eps , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); }else{ return euclidean_update_H(INTEGER_POINTER(v), w, h, eps , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); } } ////////////////////////////////// // NMF WITH WEIGHT ////////////////////////////////// #define NMF_WITH_WEIGHT #include "euclidean.cpp" #undef NMF_WITH_WEIGHT SEXP euclidean_update_W ( SEXP v, SEXP w, SEXP h, SEXP eps , SEXP weight = R_NilValue , SEXP nbterms=Rf_ScalarInteger(0), SEXP ncterms=Rf_ScalarInteger(0) , SEXP dup=Rf_ScalarLogical(1)){ int nb = *INTEGER(nbterms), nc = *INTEGER(ncterms); bool copy = *LOGICAL(dup); if( TYPEOF(v) == REALSXP ){ if( Rf_isNull(weight) ){ return euclidean_update_W(NUMERIC_POINTER(v), w, h, eps, nb, nc, copy); }else{ return weuclidean_update_W(NUMERIC_POINTER(v), w, h, eps, weight, nb, nc, copy); } }else{ if( Rf_isNull(weight) ){ return euclidean_update_W(INTEGER_POINTER(v), w, h, eps, nb, nc, copy); }else{ return weuclidean_update_W(INTEGER_POINTER(v), w, h, eps, weight, nb, nc, copy); } } } ////////////////////////////////// // NMF WITH OFFSET ////////////////////////////////// #define NMF_WITH_OFFSET // include version for both double/integer storage.mode (defined as templates) #include "euclidean.cpp" #undef NMF_WITH_OFFSET // define the exported versions (for SEXP) SEXP offset_euclidean_update_H ( SEXP v, SEXP w, SEXP h, SEXP offset, SEXP eps, SEXP dup=Rf_ScalarLogical(1)){ if( TYPEOF(v) == REALSXP ) return offset_euclidean_update_H(NUMERIC_POINTER(v), w, h, offset, eps, *LOGICAL(dup)); else return offset_euclidean_update_H(INTEGER_POINTER(v), w, h, offset, eps, *LOGICAL(dup)); } SEXP offset_euclidean_update_W ( SEXP v, SEXP w, SEXP h, SEXP offset, SEXP eps, SEXP dup=Rf_ScalarLogical(1)){ if( TYPEOF(v) == REALSXP ) return offset_euclidean_update_W(NUMERIC_POINTER(v), w, h, offset, eps, *LOGICAL(dup)); else return offset_euclidean_update_W(INTEGER_POINTER(v), w, h, offset, eps, *LOGICAL(dup)); } #define NMF_EUCLIDEAN_DONE #else // END OF NMF_EUCLIDEAN_H #ifndef NMF_EUCLIDEAN_DONE // START DEFINITION OF FUNCTIONS /** * Euclidean norm based multiplicative update for the mixture coefficients matrix H * from Lee and Seung. * Also used in the NMF with Offset algorithm * * Note: for performance reason the dimension names are NOT conserved. */ #ifndef NMF_WITH_WEIGHT template static #ifdef NMF_WITH_OFFSET SEXP offset_euclidean_update_H ( #else SEXP euclidean_update_H ( #endif T_Rnumeric* pV, SEXP w, SEXP h #ifdef NMF_WITH_OFFSET , SEXP offset #endif , SEXP eps #ifndef NMF_WITH_OFFSET , int nbterms=0, int ncterms=0 #endif , int dup=1) { SEXP res; int nprotect = 0; double eps_val = *NUMERIC_POINTER(eps); // retrieve dimensions int n = INTEGER(GET_DIM(w))[0]; int r = INTEGER(GET_DIM(w))[1]; int p = INTEGER(GET_DIM(h))[1]; // get number of non-fixed terms int vr = #ifdef NMF_WITH_OFFSET r; #else r - ncterms; #endif // duplicate H (keeping attributes) PROTECT( res = (dup != 0 ? Rf_duplicate(h) : h) ); nprotect++; // define internal pointers double* pW = NUMERIC_POINTER(w); double* pH = NUMERIC_POINTER(h); double* p_res = NUMERIC_POINTER(res); double* pH_buffer = (double*) R_alloc(r, sizeof(double)); // extra variables in the case of an optional offset #ifdef NMF_WITH_OFFSET double *pOffset = NULL, *den_addon = NULL; if( offset != R_NilValue ){ pOffset = NUMERIC_POINTER(offset); den_addon = (double*) R_alloc(r, sizeof(double)); //memset(den_addon, 0, r); } #endif // auxiliary temporary variable double temp = 0.0; // Pre-compute symmetric matrix t(W)W // -> allocate internal memory as a upper triangular in column major double* p_tWW = (double*) R_alloc((int) (r*(r+1))/2, sizeof(double)); double* p_row = NULL; for( int i=r-1; i>=0; --i){ p_row = pW + i*n; #ifdef NMF_WITH_OFFSET den_addon[i] = 0.0; #endif for( int j=r-1; j>=0; --j){ temp = 0.0; for( int u=n-1; u>=0; --u){ temp += p_row[u] * pW[u + j*n]; #ifdef NMF_WITH_OFFSET if( pOffset != NULL && j==0 ) den_addon[i] += p_row[u] * pOffset[u]; #endif } p_tWW[((j+1)*j)/2 + i] = temp; } } // H_au = H_au (W^T V)_au / (W^T W H)_au // Compute update of H column by column for (int j=p-1; j>=0; --j){ for(int i=vr-1; i>=0; --i){ // compute value for H_ij (only non-fixed entries) // numerator double numerator = 0.0; for( int u=n-1; u>=0; --u) numerator += pW[u + i*n] * pV[u + j*n]; double den = 0.0; for( int l=r-1; l>=0; --l){ // use all entries (fixed and non-fixed) // bufferize jth-column of H, as it can be changed at the end of the current i-loop if( i==vr-1 ) pH_buffer[l] = pH[l + j*r]; den += p_tWW[i > l ? ((i+1)*i)/2 + l : ((l+1)*l)/2 + i] * pH_buffer[l]; } // add offset addon if necessary #ifdef NMF_WITH_OFFSET if( pOffset != NULL ) den += den_addon[i]; #endif // multiplicative update p_res[i + j*r] = ((temp = pH_buffer[i] * numerator) > eps_val ? temp : eps_val) / (den + eps_val); } } // return result UNPROTECT(nprotect); return res; } #endif /** * Euclidean norm based multiplicative update for the basis matrix W * from Lee and Seung. * Also used in the NMF with Offset algorithm * * Note: for performance reason the dimension names are NOT conserved. */ template static SEXP #ifdef NMF_WITH_OFFSET offset_euclidean_update_W #else #ifdef NMF_WITH_WEIGHT weuclidean_update_W #else euclidean_update_W #endif #endif (T_Rnumeric* pV, SEXP w, SEXP h #ifdef NMF_WITH_OFFSET , SEXP offset #endif , SEXP eps #ifdef NMF_WITH_WEIGHT , SEXP weight #endif #ifndef NMF_WITH_OFFSET , int nbterms=0, int ncterms=0 #endif , int dup=1) { SEXP res; int nprotect = 0; // setup variables for enforcing a limit Inf on the entries double limInf = *NUMERIC_POINTER(eps); // retrieve dimensions int n = INTEGER(GET_DIM(w))[0]; int r = INTEGER(GET_DIM(w))[1]; int p = INTEGER(GET_DIM(h))[1]; // duplicate H (keeping attributes) //PROTECT(res = Rf_duplicate(w)); nprotect++; PROTECT(res = (dup != 0 ? Rf_duplicate(w) : w) ); nprotect++; // define internal pointers to data double* pW = NUMERIC_POINTER(w); double* pH = NUMERIC_POINTER(h); double* p_res = NUMERIC_POINTER(res); double* pW_buffer = (double*) R_alloc(r, sizeof(double)); // extra variables in the case of an optional offset #ifdef NMF_WITH_OFFSET double *pOffset = NULL, *rowSumsH = NULL; if( offset != R_NilValue ){ pOffset = NUMERIC_POINTER(offset); // pre-compute the row sums of H rowSumsH = (double*) R_alloc(r, sizeof(double)); for( int i=r-1; i>=0; --i){ rowSumsH[i] = 0.0; for( int j=p-1; j>=0; --j){ rowSumsH[i] += pH[i + j*r]; } } } #endif #ifdef NMF_WITH_WEIGHT // take sample weights into account double* p_weight = !Rf_isNull(weight) ? NUMERIC_POINTER(weight) : NULL; double beta = -1.0; if( p_weight == NULL ){// <=> no weights beta = 1.0; } else if( Rf_length(weight) == 1 ){// all weighted are the same // NB: theoretically this is equivalent to weight=1, but may be used // to test it in practice (with the numerical adjustments via eps) beta = *p_weight; } // fill weight vector with single value if( beta > 0 ){ double* pw = p_weight = (double*) R_alloc(p, sizeof(double)); for(int i=0; i allocate internal memory as a lower triangular in column major double* p_HtH = (double*) R_alloc((int) (r*(r+1))/2, sizeof(double)); for( int j=r-1; j>=0; --j){ for( int i=j; i=0; --u){ temp += pH[j + u*r] * pH[i + u*r] #ifdef NMF_WITH_WEIGHT * p_weight[u] #endif ; } p_HtH[((i+1)*i)/2 + j] = temp; } } // W_ia = W_ia (V H^T)_ia / (W H H^T)_ia and columns are rescaled after each iteration // Compute update of W row by row double numerator = 0.0; double den = 0.0; for(int i=n-1; i>=0; --i){ for (int j=r-1; j>=0; --j){// compute value for W_ij // numerator numerator = 0.0; for( int u=p-1; u>=0; --u){ numerator += pV[i + u*n] * pH[j + u*r] #ifdef NMF_WITH_WEIGHT * p_weight[u] #endif ; } den = 0.0; for( int l=r-1; l>=0; --l){ // bufferize ith-row of W, as it can be changed at the end of the current j-loop if( j==r-1 ) pW_buffer[l] = pW[i + l*n]; // compute index of the stored value of t(w)w_[iH,l] in column major den += pW_buffer[l] * p_HtH[l < j ? ((j+1)*j)/2 + l : ((l+1)*l)/2 + j]; } // add offset addon if necessary #ifdef NMF_WITH_OFFSET if( pOffset != NULL ) den += pOffset[i] * rowSumsH[j]; #endif // multiplicative update temp = pW_buffer[j] * numerator; p_res[i + j*n] = ( temp < limInf ? limInf : temp ) / (den + limInf); } } // return result UNPROTECT(nprotect); return res; } #endif //END ifndef NMF_EUCLIDEAN_DONE #endif //END ifdef NMF_EUCLIDEAN_H NMF/src/utils.cpp0000644000176200001440000001527214661565723013353 0ustar liggesusers#ifndef NMF_UTILS_H // include header only once #define NMF_UTILS_H #include #include #include extern "C" { /** Returns the pointer address of 'x' as a character string*/ SEXP ptr_address (SEXP x); /** Clone an object 'x'*/ SEXP clone_object (SEXP x); /** pmin in place with 'y' being a single numeric value*/ SEXP ptr_pmax (SEXP x, SEXP y, SEXP skip); /** Apply inequality constraints in place. */ SEXP ptr_neq_constraints(SEXP x, SEXP constraints, SEXP ratio=R_NilValue, SEXP value=R_NilValue); /** Minimum per column*/ SEXP colMin(SEXP x); /** Maximum per row*/ SEXP colMax(SEXP x); /** Test if an external pointer is null. * * Function taken from the package bigmemory (v4.2.11). */ SEXP ptr_isnil(SEXP address) { void *ptr = R_ExternalPtrAddr(address); SEXP ret = PROTECT(NEW_LOGICAL(1)); LOGICAL_DATA(ret)[0] = (ptr==NULL) ? (Rboolean)TRUE : Rboolean(FALSE); UNPROTECT(1); return(ret); } } // define the exported versions (for SEXP) SEXP ptr_address (SEXP x){ SEXP ans = R_NilValue; char tmp[15]; PROTECT(ans = Rf_allocVector(STRSXP, 1)); snprintf(tmp, 15, "%p", (void *) x); SET_STRING_ELT(ans, 0, Rf_mkChar(tmp)); UNPROTECT(1); return ans; } SEXP clone_object (SEXP x){ return Rf_duplicate(x); } SEXP ptr_pmax(SEXP x, SEXP y, SEXP skip=R_NilValue){ int n = Rf_length(x); double* p_x = ( Rf_isNull(x) ? NULL : NUMERIC_POINTER(x) ); double lim = Rf_isNull(y) ? -1.0 : *NUMERIC_POINTER(y); // backup skipped values int n_skip = Rf_length(skip); int ncol = Rf_isNull(GET_DIM(x)) ? 1 : INTEGER(GET_DIM(x))[1]; int nrow = n / ncol; double* old_value = NULL; int* p_skip = NULL; if( !Rf_isNull(skip) && n_skip > 0 ){ old_value = (double*) R_alloc(n_skip*ncol, sizeof(double)); p_skip = INTEGER_POINTER(skip); for(int k=ncol-1; k>=0; --k){ for(int i=n_skip-1; i>=0; --i){ //Rprintf("skip %i x %i\n", i, k); int is = p_skip[i]-1; double val = p_x[k*nrow + is]; old_value[k*n_skip + i] = val; } } } // apply limit inf to all values double* p_x2 = p_x + n-1; for(int i=n-1; i>=0; --i){ if( *p_x2 < lim ) *p_x2 = lim; --p_x2; } p_x2 = NULL; // restore skipped values if( !Rf_isNull(skip) && n_skip > 0 ){ for(int k=ncol-1; k>=0; --k){ for(int i=n_skip-1; i>=0; --i){ //Rprintf("restore %i x %i\n", i, k); int is = p_skip[i]-1; p_x[k*nrow + is] = old_value[k*n_skip + i]; } } } // return modified x return x; } /** Apply inequality constraints in place. */ SEXP ptr_neq_constraints(SEXP x, SEXP constraints, SEXP ratio, SEXP value){ double* p_x = ( Rf_isNull(x) ? NULL : NUMERIC_POINTER(x) ); double d_ratio = Rf_isNull(ratio) ? 0 : *NUMERIC_POINTER(ratio); double* p_value = ( Rf_isNull(value) ? NULL : NUMERIC_POINTER(value) ); double eps = sqrt(DBL_EPSILON); // get dimensions int ncol = Rf_isNull(GET_DIM(x)) ? 1 : INTEGER(GET_DIM(x))[1]; int nrow = Rf_isNull(GET_DIM(x)) ? Rf_length(x) : INTEGER(GET_DIM(x))[0]; int nc = Rf_length(constraints); if( nc != ncol ) perror("There must be as many elements in list `constraints` as columns in `x`."); // apply each set of constraints (from first to last) double* _xj = p_x; // pointer to marked column double* _x_last = p_x + (ncol - 1) * nrow; // pointer to last column for(int j=0; j=0; --k){ double lim = d_ratio != 0.0 ? _xj[p_i[k]-1] / d_ratio - eps : 0.0; if( lim < 0 ) lim = 0; // apply constraints on each column // pointer to current row in last column double* _xi = _x_last + p_i[k]-1; for(int l=ncol-1; l>=0; --l){ //Rprintf("Before: xi=%f > lim=%f ? => ", lim, *_xi); if( l != j && *_xi > lim ){ // constrain column to 'lim' *_xi = lim; }else if( l == j && p_value != NULL ){ // constrain column to 'value' *_xi = *p_value; } //Rprintf("xi=%f\n", *_xi); // move to previous column _xi -= nrow; } _xi = NULL; } // move to next marked column _xj += nrow; } // return modified x return x; } template inline void colMin(T* x, int n, int p, T* res, const T& NA_value){ // do nothing if there is no data or fill with NAs if( n <= 0 ){ if( p <= 0 ) return; for(int j=p-1; j>=0; --j, ++res) *res = NA_value; } for(int j=p-1; j>=0; --j, ++res){ *res = *(x++); for(int i=n-2; i>=0; --i, ++x){ if( *res > *x ) *res = *x; } } } template inline void colMax(T* x, int n, int p, T* res, const T& NA_value){ // do nothing if there is no data or fill with NAs if( n <= 0 ){ if( p <= 0 ) return; for(int j=p-1; j>=0; --j, ++res) *res = NA_value; } for(int j=p-1; j>=0; --j, ++res){ *res = *(x++); for(int i=n-2; i>=0; --i, ++x){ if( *res < *x ) *res = *x; } } } /** * Minimum per column */ SEXP colMin(SEXP x){ SEXP ans, dims; // check that the argument is a matrix dims = GET_DIM(x); if (dims == R_NilValue) perror("a matrix-like object is required as argument to 'colMin'"); // check that it is a numeric data if (!Rf_isNumeric(x)) perror("a numeric object is required as argument to 'colMin'"); // get the dimension of the input matrix int n = INTEGER(dims)[0]; int p = INTEGER(dims)[1]; if( TYPEOF(x) == REALSXP ){ // allocate memory for the result (a vector of length the number of columns of x) PROTECT(ans = Rf_allocVector(REALSXP, p)); colMin(NUMERIC_POINTER(x), n, p, NUMERIC_POINTER(ans), NA_REAL); UNPROTECT(1); } else{ // allocate memory for the result (a vector of length the number of columns of x) PROTECT(ans = Rf_allocVector(INTSXP, p)); colMin(INTEGER_POINTER(x), n, p, INTEGER_POINTER(ans), NA_INTEGER); UNPROTECT(1); } return ans; } /** * Maximum per column */ SEXP colMax(SEXP x){ SEXP ans, dims; // check that the argument is a matrix dims = GET_DIM(x); if (dims == R_NilValue) perror("a matrix-like object is required as argument to 'colMax'"); // check that it is a numeric data if (!Rf_isNumeric(x)) perror("a numeric object is required as argument to 'colMax'"); // get the dimension of the input matrix int n = INTEGER(dims)[0]; int p = INTEGER(dims)[1]; if( TYPEOF(x) == REALSXP ){ // allocate memory for the result (a vector of length the number of columns of x) PROTECT(ans = Rf_allocVector(REALSXP, p)); colMax(NUMERIC_POINTER(x), n, p, NUMERIC_POINTER(ans), NA_REAL); UNPROTECT(1); } else{ // allocate memory for the result (a vector of length the number of columns of x) PROTECT(ans = Rf_allocVector(INTSXP, p)); colMax(INTEGER_POINTER(x), n, p, INTEGER_POINTER(ans), NA_INTEGER); UNPROTECT(1); } return ans; } #endif //END ifdef NMF_UTILS_H NMF/src/divergence.cpp0000644000176200001440000001370614661107704014315 0ustar liggesusers#ifndef NMF_DIVERGENCE_H // include header only once #define NMF_DIVERGENCE_H #include #include #include extern "C" { SEXP divergence_update_H ( SEXP v, SEXP w, SEXP h, SEXP nbterms, SEXP ncterms, SEXP dup); SEXP divergence_update_W ( SEXP v, SEXP w, SEXP h, SEXP nbterms, SEXP ncterms, SEXP dup); } // include version for both double/integer storage.mode (defined as templates) #include "divergence.cpp" // define the exported versions (for SEXP) SEXP divergence_update_H ( SEXP v, SEXP w, SEXP h , SEXP nbterms=Rf_ScalarInteger(0), SEXP ncterms=Rf_ScalarInteger(0) , SEXP dup=Rf_ScalarLogical(1)) { if( TYPEOF(v) == REALSXP ){ return divergence_update_H(NUMERIC_POINTER(v), w, h , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); }else{ return divergence_update_H(INTEGER_POINTER(v), w, h , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); } } SEXP divergence_update_W ( SEXP v, SEXP w, SEXP h , SEXP nbterms=Rf_ScalarInteger(0), SEXP ncterms=Rf_ScalarInteger(0) , SEXP dup=Rf_ScalarLogical(1)) { if( TYPEOF(v) == REALSXP ) return divergence_update_W(NUMERIC_POINTER(v), w, h , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); else return divergence_update_W(INTEGER_POINTER(v), w, h , *INTEGER(nbterms), *INTEGER(ncterms) , *LOGICAL(dup)); } #define NMF_DIVERGENCE_DONE #else // END OF NMF_DIVERGENCE_H #ifndef NMF_DIVERGENCE_DONE // START DEFINITION OF FUNCTIONS /** * Divergence based multiplicative update for the mixture coefficients matrix H * from Brunet et al. algorithm. * * @param pV target matrix * @param w basis vector matrix * @param h mixture coefficient matrix to be updated * @param nbterms number of fixed basis terms * @param ncterms number of fixed coefficient terms * @param dup boolean (flag) that specifies if the update must be perform directly on w or * on a duplicated version of w * * @return the updated mixture coefficient matrix. * */ template static SEXP divergence_update_H ( T_Rnumeric* pV, SEXP w, SEXP h, int nbterms=0, int ncterms=0, int dup=1) { SEXP res; int nprotect = 0; // retrieve dimensions from W and H int n = INTEGER(GET_DIM(w))[0]; int r = INTEGER(GET_DIM(w))[1]; int p = INTEGER(GET_DIM(h))[1]; // get number of non-fixed terms int vr = r - ncterms; // duplicate H (keeping attributes) or modify in place PROTECT(res = (dup != 0 ? Rf_duplicate(h) : h) ); nprotect++; // define internal pointers double* pW = NUMERIC_POINTER(w); double* pH = NUMERIC_POINTER(h); double* p_res = NUMERIC_POINTER(res); // allocate internal memory double* sumW = (double*) R_alloc(r, sizeof(double)); // will store column sums of W double* pWH = (double*) R_alloc(n, sizeof(double)); // will store the currently used column of WH // Compute update of H column by column for(int jH=0; jH < p; ++jH){ for (int iH=0; iH < vr; ++iH){ // compute value for H_ij (non-fixed terms only) // initialise values double tmp_res = 0.0; double &w_sum = sumW[iH]; if( jH == 0 ) w_sum = 0.0; // compute cross-product w_.i by (v/wh)_.j for( int u=0; u compute once and store the result for using for the next rows double wh_term = pWH[u]; if( iH == 0 ){ wh_term = 0.0; for (int k=0; k static SEXP divergence_update_W ( T_Rnumeric* pV, SEXP w, SEXP h, int nbterms=0, int ncterms=0, int dup=1) { SEXP res; int nprotect = 0; // retrieve dimensions int n = INTEGER(GET_DIM(w))[0]; int r = INTEGER(GET_DIM(w))[1]; int p = INTEGER(GET_DIM(h))[1]; // duplicate W (keeping attributes) PROTECT(res = (dup != 0 ? Rf_duplicate(w) : w) ); nprotect++; // define internal pointers double* pW = NUMERIC_POINTER(w); double* pH = NUMERIC_POINTER(h); double* p_res = NUMERIC_POINTER(res); // allocate internal memory double* sumH = (double*) R_alloc(r, sizeof(double)); // will store the row sums of H double* pWH = (double*) R_alloc(p, sizeof(double)); // will store currently used row of WH // Compute update of W row by row for(int iW=0; iW < n; iW++){ for (int jW=0; jW < r; jW++){ // compute value for W_ij // initialise values double tmp_res = 0.0; double &h_sum = sumH[jW]; if( iW == 0 ) h_sum = 0.0; // compute cross-product (v/wh)_i. by h_j. for( int u=0; u compute once and store the result for using for the next columns if( jW == 0 ){ double wh_term = 0.0; for (int k=0; k #include #include extern "C" { SEXP Euclidean_rss( SEXP x, SEXP y); SEXP KL_divergence( SEXP x, SEXP y); } //define helper macro #define both_non_NA(a,b) (!ISNAN(a) && !ISNAN(b)) // include versions for double-double storage.mode #include "distance.cpp" // include versions for double-integer storage.mode #define NMF_ARG2_INT #include "distance.cpp" #undef NMF_ARG2_INT // include versions for integer-* storage.mode #define NMF_ARG1_INT #include "distance.cpp" // include versions for integer-integer storage.mode #define NMF_ARG2_INT #include "distance.cpp" #undef NMF_ARG2_INT #undef NMF_ARG1_INT // define the exported version of RSS (for SEXP) SEXP Euclidean_rss ( SEXP x, SEXP y){ // retrieve dimensions int n = INTEGER(GET_DIM(x))[0]; int p = INTEGER(GET_DIM(x))[1]; if( INTEGER(GET_DIM(y))[0] != n ) perror("non-conformable arrays (rows)"); if( INTEGER(GET_DIM(y))[1] != p ) perror("non-conformable arrays (columns)"); if( TYPEOF(x) == REALSXP ){// x is double if( TYPEOF(y) == REALSXP )// x and y are double return rss( NUMERIC_POINTER(x), NUMERIC_POINTER(y), n, p); else// x is double, y is integer return rss( NUMERIC_POINTER(x), INTEGER_POINTER(y), n, p); }else{ if( TYPEOF(y) == REALSXP ) // x is integer, y is double return rss( INTEGER_POINTER(x), NUMERIC_POINTER(y), n, p); else // x is integer, y is integer return rss( INTEGER_POINTER(x), INTEGER_POINTER(y), n, p); } } // define the exported version of KL (for SEXP) SEXP KL_divergence ( SEXP x, SEXP y){ // retrieve dimensions int n = INTEGER(GET_DIM(x))[0]; int p = INTEGER(GET_DIM(x))[1]; if( INTEGER(GET_DIM(y))[0] != n ) perror("non-conformable arrays (rows)"); if( INTEGER(GET_DIM(y))[1] != p ) perror("non-conformable arrays (columns)"); if( TYPEOF(x) == REALSXP ){// x is double if( TYPEOF(y) == REALSXP )// x and y are double return KL( NUMERIC_POINTER(x), NUMERIC_POINTER(y), n, p); else// x is double, y is integer return KL( NUMERIC_POINTER(x), INTEGER_POINTER(y), n, p); }else{ if( TYPEOF(y) == REALSXP ) // x is integer, y is double return KL( INTEGER_POINTER(x), NUMERIC_POINTER(y), n, p); else // x is integer, y is integer return KL( INTEGER_POINTER(x), INTEGER_POINTER(y), n, p); } } #define NMF_DISTANCE_DONE #else // END OF NMF_DISTANCE_H #ifndef NMF_DISTANCE_DONE // START DEFINITION OF FUNCTIONS // Internal function that computes the RSS SEXP rss( #ifdef NMF_ARG1_INT int* #else double* #endif px, #ifdef NMF_ARG2_INT int* #else double* #endif py , int n, int p){ double dev=0, dist=0; double xval, yval; //int count = 0; for(int i=n-1; i>=0; --i) { for(int j=p-1; j>=0; --j) { xval = px[i + j*n]; yval = py[i + j*n]; if (both_non_NA(xval, yval)) { dev = xval - yval; if (!ISNAN(dev)) { dist += dev * dev; //count++; } else return Rf_ScalarReal(NA_REAL); } else return Rf_ScalarReal(NA_REAL); } } //if (count == 0) return Rf_ScalarReal(NA_REAL); return Rf_ScalarReal(dist); } // Internal function that computes the KL divergence SEXP KL( #ifdef NMF_ARG1_INT int* #else double* #endif px, #ifdef NMF_ARG2_INT int* #else double* #endif py , int n, int p){ double dev=0, dist=0; double xval, yval; for(int i=n-1; i>=0; --i) { for(int j=p-1; j>=0; --j) { xval = px[i + j*n]; yval = py[i + j*n]; if( xval == 0 ) dev = yval; else if (both_non_NA(xval, yval)) dev = xval * log((double) xval / yval) - xval + yval; else return Rf_ScalarReal(NA_REAL); // only add and continue if the term is not NA if ( R_FINITE(dev) ) dist += dev; else return Rf_ScalarReal(dev); } } return Rf_ScalarReal(dist); } #endif //END ifndef NMF_DISTANCE_DONE #endif //END ifdef NMF_DISTANCE_H NMF/src/registerDynamicSymbol.c0000644000176200001440000000034514333176413016153 0ustar liggesusers// RegisteringDynamic Symbols #include #include #include void R_init_markovchain(DllInfo* info) { R_registerRoutines(info, NULL, NULL, NULL, NULL); R_useDynamicSymbols(info, TRUE); } NMF/NAMESPACE0000644000176200001440000001154714661046324012127 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(.DollarNames,NMF) S3method(aggregate,measure) S3method(nmfFormals,NMFStrategy) S3method(nmfFormals,NMFStrategyFunction) S3method(nmfFormals,NMFStrategyIterative) S3method(nmfFormals,character) S3method(plot,NMF.consensus) S3method(plot,NMF.rank) S3method(print,fcnnls) S3method(print,foreach_backend) S3method(profplot,default) S3method(register,doMPI_backend) S3method(register,doParallel_backend) S3method(register,foreach_backend) S3method(scale,NMF) S3method(silhouette,NMF) S3method(silhouette,NMFfitX) S3method(summary,NMF.rank) S3method(t,NMF) S3method(t,NMFstd) export(".basis<-") export(".coef<-") export("algorithm<-") export("basis<-") export("basisnames<-") export("coef<-") export("fit<-") export("name<-") export("niter<-") export("objective<-") export("residuals<-") export("seeding<-") export(.atrack) export(.basis) export(.coef) export(.fcnnls) export(.getRNG) export(ForeachBackend) export(NMFSeed) export(NMFStop) export(NMFStrategy) export(aheatmap) export(algorithm) export(atrack) export(basis) export(basiscor) export(basismap) export(basisnames) export(bterms) export(canFit) export(coef) export(coefficients) export(coefmap) export(compare) export(connectivity) export(consensus) export(consensushc) export(consensusmap) export(cophcor) export(cterms) export(deviance) export(dispersion) export(entropy) export(evar) export(existsNMFMethod) export(existsNMFSeed) export(extractFeatures) export(fcnnls) export(featureScore) export(fit) export(fitted) export(gVariable) export(getDoBackend) export(getDoParHosts) export(getDoParNHosts) export(getNMFMethod) export(getNMFSeed) export(getRNG1) export(hasBasis) export(hasCoef) export(hasTrack) export(hostfile) export(ibasis) export(ibterms) export(icoef) export(icterms) export(is.empty.nmf) export(is.mixed) export(is.nmf) export(is.partial.nmf) export(isCHECK) export(isCRANcheck) export(isNMFfit) export(iterms) export(latex_bibliography) export(latex_preamble) export(loadings) export(logs) export(match_atrack) export(metaHeatmap) export(minfit) export(misc) export(modelname) export(name) export(nbasis) export(nbterms) export(ncterms) export(neq.constraints.inplace) export(niter) export(nmf) export(nmf.equal) export(nmf.getOption) export(nmf.options) export(nmf.printOptions) export(nmf.resetOptions) export(nmf.stop.connectivity) export(nmf.stop.iteration) export(nmf.stop.stationary) export(nmf.stop.threshold) export(nmfAlgorithm) export(nmfApply) export(nmfArgs) export(nmfCheck) export(nmfDistance) export(nmfEstimateRank) export(nmfFormals) export(nmfModel) export(nmfModels) export(nmfObject) export(nmfRegisterAlgorithm) export(nmfReport) export(nmfSeed) export(nmfWrapper) export(nmf_update.KL.h) export(nmf_update.KL.h_R) export(nmf_update.KL.w) export(nmf_update.KL.w_R) export(nmf_update.brunet) export(nmf_update.brunet_R) export(nmf_update.euclidean.h) export(nmf_update.euclidean.h_R) export(nmf_update.euclidean.w) export(nmf_update.euclidean.w_R) export(nmf_update.euclidean_offset.h) export(nmf_update.euclidean_offset.w) export(nmf_update.lee) export(nmf_update.lee_R) export(nmf_update.ns) export(nmf_update.ns_R) export(nmf_update.offset) export(nmf_update.offset_R) export(nneg) export(nrun) export(nterms) export(objective) export(offset) export(pmax.inplace) export(posneg) export(predict) export(profcor) export(profplot) export(purity) export(randomize) export(register) export(removeNMFMethod) export(removeNMFSeed) export(residuals) export(rmatrix) export(rnmf) export(rss) export(run) export(runtime) export(runtime.all) export(scoef) export(seed) export(seeding) export(seqtime) export(setDoBackend) export(setNMFMethod) export(setNMFSeed) export(smoothing) export(sparseness) export(staticVar) export(str_args) export(summary) export(syntheticNMF) export(trackError) export(ts_eval) export(ts_tempfile) export(which.best) exportClasses(NMF) exportClasses(NMFList) exportClasses(NMFOffset) exportClasses(NMFfit) exportClasses(NMFfitX) exportClasses(NMFfitX1) exportClasses(NMFfitXn) exportClasses(NMFns) exportClasses(NMFstd) exportMethods("$") exportMethods("$<-") exportMethods("[") exportMethods("basisnames<-") exportMethods("dimnames<-") exportMethods("objective<-") exportMethods(.DollarNames) exportMethods(dim) exportMethods(dimnames) exportMethods(fitted) exportMethods(objective) exportMethods(plot) exportMethods(rposneg) exportMethods(show) exportPattern("^featureNames") exportPattern("^metagenes") exportPattern("^metaprofiles") exportPattern("^nmeta") exportPattern("^sampleNames") import(RColorBrewer) import(cluster) import(digest) import(doParallel) import(foreach) import(ggplot2) import(grDevices) import(graphics) import(grid) import(gridBase) import(methods) import(registry) import(reshape2) import(rngtools) import(stats) import(stringr) importFrom(BiocManager,install) importFrom(colorspace,sequential_hcl) importFrom(utils,.DollarNames) useDynLib(NMF, .registration = TRUE) NMF/TODO0000644000176200001440000000133014333176413011364 0ustar liggesusersFeatures: o handle missing data in target matrix o NMF model/algorithm class for MCMC based NMF o function/option to run standard consensus clustering, i.e. with a different set sample for each run. Possibly also use subsets of features and consensus matrix for them (memory issue). o incorporate silhouette values/plots, notably in heatmaps o support for other type of matrix-like objects (e.g., bigmatrix, Matrix) o import/export functions Documentation: o improve/update vignettes Technical/Internals: o change plot.NMFrankestimate to screeplot, remove class NMFrankestimate, change it to normal NMFlist o Switch to the interface defined in the package modeltools NMF/inst/0000755000176200001440000000000014661566507011667 5ustar liggesusersNMF/inst/CITATION0000644000176200001440000000327314406066043013014 0ustar liggesusers## R >= 2.8.0 passes package metadata to citation(). if( !exists('meta') || is.null(meta) ) meta <- packageDescription("NMF") year <- sub(".*(2[[:digit:]]{3})-.*", "\\1", meta$Date, perl = TRUE) vers <- paste("R package version", meta$Version) author <- c(meta$Author) url <- sprintf("https://cran.r-project.org/package=%s", meta$Package) citHeader(sprintf("To cite the package '%s' in publications use:", meta$Package)) bibentry(bibtype="Article" , title = "A flexible R package for nonnegative matrix factorization" , author = c("Renaud Gaujoux", "Cathal Seoighe") , journal = "BMC Bioinformatics" , year = 2010 , volume = 11 , number = 1 , pages = 367 , url = "https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-11-367" , doi = "10.1186/1471-2105-11-367" , issn = "1471-2105" , textVersion = paste("Renaud Gaujoux, Cathal Seoighe (2010)" , "A flexible R package for nonnegative matrix factorization" , "BMC Bioinformatics 2010, 11:367" , "[https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-11-367]" , sep=". ") ) bibentry(bibtype="Manual" , title = vign <- "Using the package NMF" , author = author , publisher = "CRAN" , year = year , note = vers , url = url , textVersion = sprintf("%s (%s). %s. CRAN. %s. [%s]", author, year, vign, vers, url) , header = "Vignette(s):" ) bibentry(bibtype="Manual" , title = "The package NMF: manual pages" , author = author , publisher = "CRAN" , year = year , note = vers , url = url , textVersion = sprintf("%s (%s). %s CRAN. %s. [%s]", author, year, meta$Title, vers, url) , header = "Technical documentation:" ) NMF/inst/REFERENCES.bib0000644000176200001440000010516614333176413013764 0ustar liggesusers@Manual{R, address = {Vienna, Austria}, annote = {\{ISBN\} 3-900051-07-0}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, title = {{R: A Language and Environment for Statistical Computing}}, url = {http://www.r-project.org}, year = {2011}, } @Article{Gentleman2004, abstract = {The Bioconductor project is an initiative for the collaborative creation of extensible software for computational biology and bioinformatics. The goals of the project include: fostering collaborative development and widespread use of innovative software, reducing barriers to entry into interdisciplinary scientific research, and promoting the achievement of remote reproducibility of research results. We describe details of our aims and methods, identify current challenges, compare Bioconductor to other open bioinformatics projects, and provide working examples.}, author = {Robert C Gentleman and Vincent J Carey and Douglas M Bates and Ben Bolstad and Marcel Dettling and Sandrine Dudoit and Byron Ellis and Laurent Gautier and Yongchao Ge and Jeff Gentry and Kurt Hornik and Torsten Hothorn and Wolfgang Huber and Stefano Iacus and Rafael Irizarry and Friedrich Leisch and Cheng Li and Martin Maechler and Anthony J Rossini and Gunther Sawitzki and Colin Smith and Gordon Smyth and Luke Tierney and Jean Y H Yang and Jianhua Zhang}, doi = {10.1186/gb-2004-5-10-r80}, issn = {1465-6914}, journal = {Genome biology}, keywords = {Computational Biology,Computational Biology: instrumentation,Computational Biology: methods,Internet,Reproducibility of Results,Software}, number = {10}, pages = {R80}, pmid = {15461798}, shorttitle = {Genome Biol}, title = {{Bioconductor: open software development for computational biology and bioinformatics.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/15461798}, volume = {5}, year = {2004}, } @Article{Lee2001, author = {D D Lee and HS Seung}, file = {:home/renaud/Documents/articles/NMF/Algorithms for non-negative matrix factorization\_Lee2000.pdf:pdf}, journal = {Advances in neural information processing systems}, title = {{Algorithms for non-negative matrix factorization}}, url = {http://scholar.google.com/scholar?q=intitle:Algorithms+for+non-negative+matrix+factorization\#0}, year = {2001}, } @Article{Li2001, author = {Stan Z Li and Xinwen Hou}, file = {:home/renaud/Documents/articles/NMF/Learning Spatially Localized, Parts-Based Representation\_Li2001.pdf:pdf}, journal = {Convergence}, number = {C}, pages = {1--6}, title = {{Learning Spatially Localized, Parts-Based Representation}}, volume = {00}, year = {2001}, } @Article{Badea2008, abstract = {In this paper we introduce a clustering algorithm capable of simultaneously factorizing two distinct gene expression datasets with the aim of uncovering gene regulatory programs that are common to the two phenotypes. The siNMF algorithm simultaneously searches for two factorizations that share the same gene expression profiles. The two key ingredients of this algorithm are the nonnegativity constraint and the offset variables, which together ensure the sparseness of the factorizations. While cancer is a very heterogeneous disease, there is overwhelming recent evidence that the differences between cancer subtypes implicate entire pathways and biological processes involving large numbers of genes, rather than changes in single genes. We have applied our simultaneous factorization algorithm looking for gene expression profiles that are common between the more homogeneous pancreatic ductal adenocarcinoma (PDAC) and the more heterogeneous colon adenocarcinoma. The fact that the PDAC signature is active in a large fraction of colon adeocarcinoma suggests that the oncogenic mechanisms involved may be similar to those in PDAC, at least in this subset of colon samples. There are many approaches to uncovering common mechanisms involved in different phenotypes, but most are based on comparing gene lists. The approach presented in this paper additionally takes gene expression data into account and can thus be more sensitive.}, author = {Liviu Badea}, file = {:home/renaud/Documents/articles/NMF/Extracting Gene Expression Profiles Common to Colon and Pancreatic Adenocarcinoma Using Simultaneous Nonnegative Matrix Factorization\_Badea2008.pdf:pdf}, issn = {1793-5091}, journal = {Pacific Symposium on Biocomputing. Pacific Symposium on Biocomputing}, keywords = {Adenocarcinoma,Adenocarcinoma: genetics,Algorithms,Carcinoma,Colonic Neoplasms,Colonic Neoplasms: genetics,Computational Biology,Data Interpretation,Databases,Gene Expression Profiling,Gene Expression Profiling: statistics \& numerical,Genetic,Humans,Pancreatic Ductal,Pancreatic Ductal: genetics,Pancreatic Neoplasms,Pancreatic Neoplasms: genetics,Statistical}, month = {jan}, pages = {267--78}, pmid = {18229692}, title = {{Extracting gene expression profiles common to colon and pancreatic adenocarcinoma using simultaneous nonnegative matrix factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/18229692}, volume = {290}, year = {2008}, } @Article{Zhang2008, abstract = {Independent component analysis (ICA) is a widely applicable and effective approach in blind source separation (BSS), with limitations that sources are statistically independent. However, more common situation is blind source separation for nonnegative linear model (NNLM) where the observations are nonnegative linear combinations of nonnegative sources, and the sources may be statistically dependent. We propose a pattern expression nonnegative matrix factorization (PE-NMF) approach from the view point of using basis vectors most effectively to express patterns. Two regularization or penalty terms are introduced to be added to the original loss function of a standard nonnegative matrix factorization (NMF) for effective expression of patterns with basis vectors in the PE-NMF. Learning algorithm is presented, and the convergence of the algorithm is proved theoretically. Three illustrative examples on blind source separation including heterogeneity correction for gene microarray data indicate that the sources can be successfully recovered with the proposed PE-NMF when the two parameters can be suitably chosen from prior knowledge of the problem.}, author = {Junying Zhang and Le Wei and Xuerong Feng and Zhen Ma and Yue Wang}, doi = {10.1155/2008/168769}, file = {:home/renaud/Documents/articles/NMF/Pattern Expression Nonnegative Matrix Factorization$\backslash$: Algorithm and Applications to Blind Source Separation\_Zhang2008.pdf:pdf}, issn = {1687-5265}, journal = {Computational intelligence and neuroscience}, pages = {168769}, pmid = {18566689}, shorttitle = {Comput Intell Neurosci}, title = {{Pattern expression nonnegative matrix factorization: algorithm and applications to blind source separation.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/18566689}, volume = {2008}, year = {2008}, } @Article{KimH2007, abstract = {MOTIVATION: Many practical pattern recognition problems require non-negativity constraints. For example, pixels in digital images and chemical concentrations in bioinformatics are non-negative. Sparse non-negative matrix factorizations (NMFs) are useful when the degree of sparseness in the non-negative basis matrix or the non-negative coefficient matrix in an NMF needs to be controlled in approximating high-dimensional data in a lower dimensional space. RESULTS: In this article, we introduce a novel formulation of sparse NMF and show how the new formulation leads to a convergent sparse NMF algorithm via alternating non-negativity-constrained least squares. We apply our sparse NMF algorithm to cancer-class discovery and gene expression data analysis and offer biological analysis of the results obtained. Our experimental results illustrate that the proposed sparse NMF algorithm often achieves better clustering performance with shorter computing time compared to other existing NMF algorithms. AVAILABILITY: The software is available as supplementary material.}, author = {Hyunsoo Kim and Haesun Park}, doi = {10.1093/bioinformatics/btm134}, file = {:home/renaud/Documents/articles/NMF/Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis Kim2007.pdf:pdf}, issn = {1460-2059}, journal = {Bioinformatics (Oxford, England)}, keywords = {Algorithms,Automated,Automated: methods,Cluster Analysis,Computational Biology,Computational Biology: methods,Data Interpretation,Databases,Entropy,Factor Analysis,Gene Expression,Genetic,Humans,Least-Squares Analysis,Microarray Analysis,Neoplasms,Neoplasms: classification,Neoplasms: genetics,Neoplasms: metabolism,Pattern Recognition,Statistical}, number = {12}, pages = {1495--502}, pmid = {17483501}, shorttitle = {Bioinformatics}, title = {{Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/17483501}, volume = {23}, year = {2007}, } @TechReport{Albright2006, author = {Russell Albright and James Cox and David Duling and Amy N. Langville and C. Meyer}, booktitle = {Matrix}, file = {:home/renaud/Documents/articles/NMF/Algorithms, Initializations, and Convergence for the Nonnegative Matrix Factorization\_Langville2006.pdf:pdf}, institution = {NCSU Technical Report Math 81706. http://meyer. math. ncsu. edu/Meyer/Abstracts/Publications. html}, keywords = {60j22,65b99,65c40,65f10,65f15,65f50,alternating least squares,ams subject classi cations,clustering,convergence crite-,image processing,initializations,nonnegative matrix factorization,rion,text mining}, number = {919}, title = {{Algorithms, initializations, and convergence for the nonnegative matrix factorization}}, url = {http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.89.2161\&rep=rep1\&type=pdf http://meyer.math.ncsu.edu/Meyer/PS\_Files/NMFInitAlgConv.pdf}, year = {2006}, } @Article{Boutsidis2008, author = {C Boutsidis and E Gallopoulos}, doi = {10.1016/j.patcog.2007.09.010}, file = {:home/renaud/Documents/articles/NMF/SVD based initialization$\backslash$: A head start for nonnegative matrix factorization\_Boutsidis2008.pdf:pdf}, issn = {00313203}, journal = {Pattern Recognition}, month = {apr}, number = {4}, pages = {1350--1362}, title = {{SVD based initialization: A head start for nonnegative matrix factorization}}, url = {http://linkinghub.elsevier.com/retrieve/pii/S0031320307004359}, volume = {41}, year = {2008}, } @Article{Lecuyer2002, author = {Pierre L'Ecuyer and Richard Simard and E.J. Chen}, file = {:home/renaud/Documents/articles/stats/An Object-Oriented Random-Number Package with Many Long Streams and Substreams\_Lecuyer2002.pdf:pdf}, journal = {Operations Research}, number = {6}, pages = {1073--1075}, publisher = {JSTOR}, title = {{An object-oriented random-number package with many long streams and substreams}}, url = {http://www.jstor.org/stable/3088626}, volume = {50}, year = {2002}, } @Article{Hutchins2008, abstract = {MOTIVATION: Cis-acting regulatory elements are frequently constrained by both sequence content and positioning relative to a functional site, such as a splice or polyadenylation site. We describe an approach to regulatory motif analysis based on non-negative matrix factorization (NMF). Whereas existing pattern recognition algorithms commonly focus primarily on sequence content, our method simultaneously characterizes both positioning and sequence content of putative motifs. RESULTS: Tests on artificially generated sequences show that NMF can faithfully reproduce both positioning and content of test motifs. We show how the variation of the residual sum of squares can be used to give a robust estimate of the number of motifs or patterns in a sequence set. Our analysis distinguishes multiple motifs with significant overlap in sequence content and/or positioning. Finally, we demonstrate the use of the NMF approach through characterization of biologically interesting datasets. Specifically, an analysis of mRNA 3'-processing (cleavage and polyadenylation) sites from a broad range of higher eukaryotes reveals a conserved core pattern of three elements.}, author = {Lucie N Hutchins and Sean M Murphy and Priyam Singh and Joel H Graber}, doi = {10.1093/bioinformatics/btn526}, file = {:home/renaud/Documents/articles/NMF/Position-dependent motif characterization using non-negative matrix factorization\_Hutchins2008.pdf:pdf}, issn = {1367-4811}, journal = {Bioinformatics (Oxford, England)}, keywords = {Algorithms,Computational Biology,Computational Biology: methods,Messenger,Messenger: genetics,Messenger: metabolism,RNA,Regulatory Sequences,Ribonucleic Acid,Sequence Analysis}, month = {dec}, number = {23}, pages = {2684--90}, pmid = {18852176}, title = {{Position-dependent motif characterization using non-negative matrix factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/18852176}, volume = {24}, year = {2008}, } @Article{Frigyesi2008, abstract = {Non-negative matrix factorization (NMF) is a relatively new approach to analyze gene expression data that models data by additive combinations of non-negative basis vectors (metagenes). The non-negativity constraint makes sense biologically as genes may either be expressed or not, but never show negative expression. We applied NMF to five different microarray data sets. We estimated the appropriate number metagens by comparing the residual error of NMF reconstruction of data to that of NMF reconstruction of permutated data, thus finding when a given solution contained more information than noise. This analysis also revealed that NMF could not factorize one of the data sets in a meaningful way. We used GO categories and pre defined gene sets to evaluate the biological significance of the obtained metagenes. By analyses of metagenes specific for the same GO-categories we could show that individual metagenes activated different aspects of the same biological processes. Several of the obtained metagenes correlated with tumor subtypes and tumors with characteristic chromosomal translocations, indicating that metagenes may correspond to specific disease entities. Hence, NMF extracts biological relevant structures of microarray expression data and may thus contribute to a deeper understanding of tumor behavior.}, author = {Attila Frigyesi and Mattias H\"{o}glund}, file = {:home/renaud/Documents/articles/NMF/Non-Negative Matrix Factorization for the Analysis of Complex Gene Expression Data$\backslash$: Identiï¬cation of Clinically Relevant Tumor Subtypes\_Frigyesi2008.pdf:pdf}, issn = {1176-9351}, journal = {Cancer informatics}, keywords = {gene expression,metagenes,nmf,tumor classifi cation}, month = {jan}, number = {2003}, pages = {275--92}, pmid = {19259414}, title = {{Non-negative matrix factorization for the analysis of complex gene expression data: identification of clinically relevant tumor subtypes.}}, url = {http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2623306/}, volume = {6}, year = {2008}, } @Article{Brunet2004, abstract = {We describe here the use of nonnegative matrix factorization (NMF), an algorithm based on decomposition by parts that can reduce the dimension of expression data from thousands of genes to a handful of metagenes. Coupled with a model selection mechanism, adapted to work for any stochastic clustering algorithm, NMF is an efficient method for identification of distinct molecular patterns and provides a powerful method for class discovery. We demonstrate the ability of NMF to recover meaningful biological information from cancer-related microarray data. NMF appears to have advantages over other methods such as hierarchical clustering or self-organizing maps. We found it less sensitive to a priori selection of genes or initial conditions and able to detect alternative or context-dependent patterns of gene expression in complex biological systems. This ability, similar to semantic polysemy in text, provides a general method for robust molecular pattern discovery.}, author = {Jean-Philippe Brunet and Pablo Tamayo and Todd R Golub and Jill P Mesirov}, doi = {10.1073/pnas.0308531101}, file = {:home/renaud/Documents/articles/NMF/Metagenes and Molecular pattern discovery using matrix factorization Brunet2004.pdf:pdf}, issn = {0027-8424}, journal = {Proceedings of the National Academy of Sciences of the United States of America}, keywords = {Algorithms,Central Nervous System Neoplasms,Central Nervous System Neoplasms: classification,Central Nervous System Neoplasms: genetics,Computational Biology,Data Interpretation,Genetic,Leukemia,Leukemia: classification,Leukemia: genetics,Medulloblastoma,Medulloblastoma: genetics,Models,Neoplasms,Neoplasms: classification,Neoplasms: genetics,Statistical}, number = {12}, pages = {4164--9}, pmid = {15016911}, title = {{Metagenes and molecular pattern discovery using matrix factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/15016911}, volume = {101}, year = {2004}, } @Article{Pascual-Montano2006, author = {Alberto Pascual-Montano and Jose Maria Carazo and K Kochi and D Lehmann and R D Pascual-marqui}, file = {:home/renaud/Documents/articles/NMF/Nonsmooth nonnegative matrix factorization (nsNMF)\_Paascual-Montano2006.pdf:pdf}, journal = {IEEE Trans. Pattern Anal. Mach. Intell}, pages = {403--415}, title = {{Nonsmooth nonnegative matrix factorization (nsNMF)}}, volume = {28}, year = {2006}, } @Article{Lee1999, abstract = {Is perception of the whole based on perception of its parts? There is psychological and physiological evidence for parts-based representations in the brain, and certain computational theories of object recognition rely on such representations. But little is known about how brains or computers might learn the parts of objects. Here we demonstrate an algorithm for non-negative matrix factorization that is able to learn parts of faces and semantic features of text. This is in contrast to other methods, such as principal components analysis and vector quantization, that learn holistic, not parts-based, representations. Non-negative matrix factorization is distinguished from the other methods by its use of non-negativity constraints. These constraints lead to a parts-based representation because they allow only additive, not subtractive, combinations. When non-negative matrix factorization is implemented as a neural network, parts-based representations emerge by virtue of two properties: the firing rates of neurons are never negative and synaptic strengths do not change sign.}, author = {D D Lee and H S Seung}, doi = {10.1038/44565}, file = {:home/renaud/Documents/articles/NMF/Learning the parts of objects by non-negative matrix factorization\_Lee1999.pdf:pdf}, issn = {0028-0836}, journal = {Nature}, keywords = {Algorithms,Face,Humans,Learning,Models,Neurological,Perception,Perception: physiology,Semantics}, month = {oct}, number = {6755}, pages = {788--91}, pmid = {10548103}, title = {{Learning the parts of objects by non-negative matrix factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/10548103}, volume = {401}, year = {1999}, } @Article{Paatero1994, abstract = {A new variant ?PMF? of factor analysis is described. It is assumed that X is a matrix of observed data and ? is the known matrix of standard deviations of elements of X. Both X and ? are of dimensions n × m. The method solves the bilinear matrix problem X = GF + E where G is the unknown left hand factor matrix (scores) of dimensions n × p, F is the unknown right hand factor matrix (loadings) of dimensions p × m, and E is the matrix of residuals. The problem is solved in the weighted least squares sense: G and F are determined so that the Frobenius norm of E divided (element-by-element) by ? is minimized. Furthermore, the solution is constrained so that all the elements of G and F are required to be non-negative. It is shown that the solutions by PMF are usually different from any solutions produced by the customary factor analysis (FA, i.e. principal component analysis (PCA) followed by rotations). Usually PMF produces a better fit to the data than FA. Also, the result of PF is guaranteed to be non-negative, while the result of FA often cannot be rotated so that all negative entries would be eliminated. Different possible application areas of the new method are briefly discussed. In environmental data, the error estimates of data can be widely varying and non-negativity is often an essential feature of the underlying models. Thus it is concluded that PMF is better suited than FA or PCA in many environmental applications. Examples of successful applications of PMF are shown in companion papers.}, author = {Pentti Paatero and Unto Tapper}, doi = {10.1002/env.3170050203}, journal = {Environmetrics}, keywords = {algorithm,nmf}, mendeley-tags = {algorithm,nmf}, number = {2}, pages = {111--126}, title = {{Positive matrix factorization: A non-negative factor model with optimal utilization of error estimates of data values}}, type = {Journal article}, url = {http://www3.interscience.wiley.com/cgi-bin/abstract/113468839/ABSTRACT}, volume = {5}, year = {1994}, } @Article{Hoyer2004, author = {PO Hoyer}, file = {:home/renaud/Documents/articles/NMF/Non-negative Matrix Factorization with Sparseness Constraints\_Hoyer2004.pdf:pdf}, journal = {The Journal of Machine Learning Research}, pages = {1457--1469}, title = {{Non-negative matrix factorization with sparseness constraints}}, url = {http://portal.acm.org/citation.cfm?id=1044709}, volume = {5}, year = {2004}, } @Article{Carmona-Saez2006, abstract = {BACKGROUND: The extended use of microarray technologies has enabled the generation and accumulation of gene expression datasets that contain expression levels of thousands of genes across tens or hundreds of different experimental conditions. One of the major challenges in the analysis of such datasets is to discover local structures composed by sets of genes that show coherent expression patterns across subsets of experimental conditions. These patterns may provide clues about the main biological processes associated to different physiological states. RESULTS: In this work we present a methodology able to cluster genes and conditions highly related in sub-portions of the data. Our approach is based on a new data mining technique, Non-smooth Non-Negative Matrix Factorization (nsNMF), able to identify localized patterns in large datasets. We assessed the potential of this methodology analyzing several synthetic datasets as well as two large and heterogeneous sets of gene expression profiles. In all cases the method was able to identify localized features related to sets of genes that show consistent expression patterns across subsets of experimental conditions. The uncovered structures showed a clear biological meaning in terms of relationships among functional annotations of genes and the phenotypes or physiological states of the associated conditions. CONCLUSION: The proposed approach can be a useful tool to analyze large and heterogeneous gene expression datasets. The method is able to identify complex relationships among genes and conditions that are difficult to identify by standard clustering algorithms.}, author = {Pedro Carmona-Saez and Roberto D Pascual-Marqui and Francisco Tirado and Jose Maria Carazo and Alberto Pascual-Montano}, doi = {10.1186/1471-2105-7-78}, file = {:home/renaud/Documents/articles/NMF/Biclustering of gene expression data by non-smooth non-negative matrix factorization\_Carmona-Saez2006.pdf:pdf}, issn = {1471-2105}, journal = {BMC bioinformatics}, keywords = {Algorithms,Artificial Intelligence,Automated,Automated: methods,Cluster Analysis,Factor Analysis,Gene Expression Profiling,Gene Expression Profiling: methods,Oligonucleotide Array Sequence Analysis,Oligonucleotide Array Sequence Analysis: methods,Pattern Recognition,Statistical}, pages = {78}, pmid = {16503973}, title = {{Biclustering of gene expression data by Non-smooth Non-negative Matrix Factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/16503973}, volume = {7}, year = {2006}, } @Article{Wang2006, abstract = {BACKGROUND: Non-negative matrix factorisation (NMF), a machine learning algorithm, has been applied to the analysis of microarray data. A key feature of NMF is the ability to identify patterns that together explain the data as a linear combination of expression signatures. Microarray data generally includes individual estimates of uncertainty for each gene in each condition, however NMF does not exploit this information. Previous work has shown that such uncertainties can be extremely valuable for pattern recognition. RESULTS: We have created a new algorithm, least squares non-negative matrix factorization, LS-NMF, which integrates uncertainty measurements of gene expression data into NMF updating rules. While the LS-NMF algorithm maintains the advantages of original NMF algorithm, such as easy implementation and a guaranteed locally optimal solution, the performance in terms of linking functionally related genes has been improved. LS-NMF exceeds NMF significantly in terms of identifying functionally related genes as determined from annotations in the MIPS database. CONCLUSION: Uncertainty measurements on gene expression data provide valuable information for data analysis, and use of this information in the LS-NMF algorithm significantly improves the power of the NMF technique.}, author = {Guoli Wang and Andrew V Kossenkov and Michael F Ochs}, doi = {10.1186/1471-2105-7-175}, file = {:home/renaud/Documents/articles/NMF/LS-NMF A modified non-negative matrix factorization algorithm utilizing uncertainty estimates\_Wang2006.pdf:pdf}, issn = {1471-2105}, journal = {BMC bioinformatics}, keywords = {Algorithms,Automated,Automated: methods,Databases,Genetic,Messenger,Messenger: genetics,Oligonucleotide Array Sequence Analysis,Oligonucleotide Array Sequence Analysis: methods,Oligonucleotide Array Sequence Analysis: statistic,Pattern Recognition,RNA,Uncertainty}, month = {jan}, pages = {175}, pmid = {16569230}, title = {{LS-NMF: a modified non-negative matrix factorization algorithm utilizing uncertainty estimates.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/16569230}, volume = {7}, year = {2006}, } @Article{VanBenthem2004, author = {Mark H. {Van Benthem} and Michael R. Keenan}, doi = {10.1002/cem.889}, file = {:home/renaud/Documents/articles/NMF/Fast algorithm for the solution of large-scale non-negativity-constrained least squares problems\_Benthem2005.pdf:pdf}, issn = {0886-9383}, journal = {Journal of Chemometrics}, keywords = {als,mcr,nnls,non-negativity}, month = {oct}, number = {10}, pages = {441--450}, title = {{Fast algorithm for the solution of large-scale non-negativity-constrained least squares problems}}, url = {http://doi.wiley.com/10.1002/cem.889}, volume = {18}, year = {2004}, } @Article{Golub1999, abstract = {Although cancer classification has improved over the past 30 years, there has been no general approach for identifying new cancer classes (class discovery) or for assigning tumors to known classes (class prediction). Here, a generic approach to cancer classification based on gene expression monitoring by DNA microarrays is described and applied to human acute leukemias as a test case. A class discovery procedure automatically discovered the distinction between acute myeloid leukemia (AML) and acute lymphoblastic leukemia (ALL) without previous knowledge of these classes. An automatically derived class predictor was able to determine the class of new leukemia cases. The results demonstrate the feasibility of cancer classification based solely on gene expression monitoring and suggest a general strategy for discovering and predicting cancer classes for other types of cancer, independent of previous biological knowledge.}, author = {T R Golub and D K Slonim and P Tamayo and C Huard and M Gaasenbeek and J P Mesirov and H Coller and M L Loh and J R Downing and M a Caligiuri and C D Bloomfield and E S Lander}, file = {:home/renaud/Documents/articles/microarray/Molecular Classification of Cancer$\backslash$: Class Discovery and Class Prediction by Gene Expression\_Golub1999.pdf:pdf}, issn = {0036-8075}, journal = {Science (New York, N.Y.)}, keywords = {Acute Disease,Antineoplastic Combined Chemotherapy Protocols,Antineoplastic Combined Chemotherapy Protocols: th,Cell Adhesion,Cell Adhesion: genetics,Cell Cycle,Cell Cycle: genetics,Gene Expression Profiling,Homeodomain Proteins,Homeodomain Proteins: genetics,Humans,Leukemia, Myeloid,Leukemia, Myeloid: classification,Leukemia, Myeloid: drug therapy,Leukemia, Myeloid: genetics,Neoplasm Proteins,Neoplasm Proteins: genetics,Neoplasms,Neoplasms: classification,Neoplasms: genetics,Oligonucleotide Array Sequence Analysis,Oncogenes,Precursor Cell Lymphoblastic Leukemia-Lymphoma,Precursor Cell Lymphoblastic Leukemia-Lymphoma: cl,Precursor Cell Lymphoblastic Leukemia-Lymphoma: dr,Precursor Cell Lymphoblastic Leukemia-Lymphoma: ge,Predictive Value of Tests,Reproducibility of Results,Treatment Outcome}, month = {oct}, number = {5439}, pages = {531--7}, pmid = {10521349}, title = {{Molecular classification of cancer: class discovery and class prediction by gene expression monitoring.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/10521349}, volume = {286}, year = {1999}, } @Article{Cichocki2008, author = {Andrzej Cichocki and Rafal Zdunek and Shun-ichi Amari}, file = {:home/renaud/Documents/articles/NMF/Nonnegative Matrix and Tensor Factorization\_Cichocki2008.pdf:pdf}, journal = {IEEE Signal Processing Magazine}, pages = {142--145}, title = {{Nonnegative matrix and tensor factorization}}, volume = {25}, year = {2008}, } @article{Berry2007, author = {Berry, M.W. and Browne, M and Langville, Amy N. and Pauca, V.P. and Plemmons, R.J.}, file = {:home/renaud/Documents/articles/NMF/Algorithms and Applications for Approximate Nonnegative Matrix Factorization\_Berry2006.pdf:pdf}, journal = {Computational Statistics \& Data Analysis}, number = {1}, pages = {155--173}, publisher = {Elsevier}, title = {{Algorithms and applications for approximate nonnegative matrix factorization}}, url = {http://www.sciencedirect.com/science/article/pii/S0167947306004191}, volume = {52}, year = {2007} } @article{Chu2004, author = {Chu, M and Diele, F and Plemmons, R and Ragni, S}, file = {:home/renaud/Documents/articles/NMF/Optimality, computation, and interpretations of nonnegative matrix factorizations\_Chu2004.pdf:pdf}, journal = {SIAM Journal on Matrix Analysis}, keywords = {ellipsoid method,gradient method,kuhn-,least squares,linear model,mass balance,newton method,nonnegative matrix factorization,quadratic programming,reduced quadratic model,tucker condition}, pages = {4--8030}, publisher = {Citeseer}, title = {{Optimality, computation, and interpretation of nonnegative matrix factorizations}}, url = {http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.61.5758}, year = {2004} } @article{Gao2005, abstract = {MOTIVATION: Identifying different cancer classes or subclasses with similar morphological appearances presents a challenging problem and has important implication in cancer diagnosis and treatment. Clustering based on gene-expression data has been shown to be a powerful method in cancer class discovery. Non-negative matrix factorization is one such method and was shown to be advantageous over other clustering techniques, such as hierarchical clustering or self-organizing maps. In this paper, we investigate the benefit of explicitly enforcing sparseness in the factorization process. RESULTS: We report an improved unsupervised method for cancer classification by the use of gene-expression profile via sparse non-negative matrix factorization. We demonstrate the improvement by direct comparison with classic non-negative matrix factorization on the three well-studied datasets. In addition, we illustrate how to identify a small subset of co-expressed genes that may be directly involved in cancer.}, author = {Gao, Yuan and Church, George}, doi = {10.1093/bioinformatics/bti653}, file = {:home/renaud/Documents/articles/NMF/Improving molecular cancer class discovery through sparse non-negative matrix factorization\_Gao2005.pdf:pdf}, issn = {1367-4803}, journal = {Bioinformatics (Oxford, England)}, keywords = {Algorithms,Biological,Biological: classification,Biological: metabolism,Computer-Assisted,Computer-Assisted: methods,Diagnosis,Factor Analysis,Gene Expression Profiling,Gene Expression Profiling: methods,Humans,Neoplasm Proteins,Neoplasm Proteins: classification,Neoplasm Proteins: metabolism,Neoplasms,Neoplasms: classification,Neoplasms: diagnosis,Neoplasms: metabolism,Oligonucleotide Array Sequence Analysis,Oligonucleotide Array Sequence Analysis: methods,Reproducibility of Results,Sensitivity and Specificity,Statistical,Tumor Markers}, month = nov, number = {21}, pages = {3970--5}, pmid = {16244221}, title = {{Improving molecular cancer class discovery through sparse non-negative matrix factorization.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/16244221}, volume = {21}, year = {2005} } @article{Roux2008, author = {Roux, Jonathan Le and de Cheveign\'{e}, Alain}, file = {:home/renaud/Documents/articles/NMF/Adaptive Template Matching with Shift-Invariant Semi-NMF\_Le Roux2008.pdf:pdf}, journal = {Science And Technology}, title = {{Adaptive template matching with shift-invariant semi-NMF}}, url = {http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.143.6846&rep=rep1&type=pdf}, year = {2008} } @article{Ding2010, abstract = {We present several new variations on the theme of nonnegative matrix factorization (NMF). Considering factorizations of the form X=FG(T), we focus on algorithms in which G is restricted to containing nonnegative entries, but allowing the data matrix X to have mixed signs, thus extending the applicable range of NMF methods. We also consider algorithms in which the basis vectors of F are constrained to be convex combinations of the data points. This is used for a kernel extension of NMF. We provide algorithms for computing these new factorizations and we provide supporting theoretical analysis. We also analyze the relationships between our algorithms and clustering algorithms, and consider the implications for sparseness of solutions. Finally, we present experimental results that explore the properties of these new methods.}, author = {Ding, Chris and Li, Tao and Jordan, Michael I}, doi = {10.1109/TPAMI.2008.277}, file = {:home/renaud/Documents/articles/NMF/Convex and Semi-Nonnegative Matrix Factorization\_Ding2009.pdf:pdf}, issn = {1939-3539}, journal = {IEEE transactions on pattern analysis and machine intelligence}, month = jan, number = {1}, pages = {45--55}, pmid = {19926898}, title = {{Convex and semi-nonnegative matrix factorizations.}}, url = {http://www.ncbi.nlm.nih.gov/pubmed/19926898}, volume = {32}, year = {2010} }NMF/inst/doc/0000755000176200001440000000000014661566507012434 5ustar liggesusersNMF/inst/doc/heatmaps.R0000644000176200001440000001013314661566501014351 0ustar liggesusers## ----pkgmaker_preamble, echo=FALSE, results='asis'---------------------------- library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") ## ----bibliofile, echo=FALSE, results='asis'----------------------------------- latex_bibliography('NMF') ## ----options, include=FALSE, verbose=TRUE------------------------------------- #options(prompt=' ') #options(continue=' ') set.seed(123456) ## ----data--------------------------------------------------------------------- # random data that follow an 3-rank NMF model (with quite some noise: sd=2) X <- syntheticNMF(100, 3, 20, noise=2, factors = TRUE) Xmat <- X[[1]] # row annotations and covariates n <- nrow(Xmat) d <- rnorm(n) e <- unlist(mapply(rep, c('X', 'Y', 'Z'), 10)) e <- c(e, rep(NA, n-length(e))) rdata <- data.frame(Var=d, Type=e) # column annotations and covariates p <- ncol(Xmat) a <- sample(c('alpha', 'beta', 'gamma'), p, replace=TRUE) # define covariates: true groups and some numeric variable c <- rnorm(p) # gather them in a data.frame covariates <- data.frame(a, X$pData, c) ## ----figoptions, include=FALSE------------------------------------------------ library(knitr) opts_chunk$set(fig.width=14, fig.height=7) ## ----heatmap_data------------------------------------------------------------- par(mfrow=c(1,2)) aheatmap(Xmat, annCol=covariates, annRow=X$fData) aheatmap(Xmat) ## ----model, cache=TRUE-------------------------------------------------------- res <- nmf(Xmat, 3, nrun=10) res ## ----coefmap_res, fig.keep='last'--------------------------------------------- opar <- par(mfrow=c(1,2)) # coefmap from multiple run fit: includes a consensus track coefmap(res) # coefmap of a single run fit: no consensus track coefmap(minfit(res)) par(opar) ## ----coefmap_default, eval=FALSE---------------------------------------------- # Rowv = NA # Colv = TRUE # scale = 'c1' # color = 'YlOrRd:50' # annCol = predict(object) + predict(object, 'consensus') ## ----coefmap_custom, fig.keep='last', tidy=FALSE------------------------------ opar <- par(mfrow=c(1,2)) # removing all automatic annotation tracks coefmap(res, tracks=NA) # customized plot coefmap(res, Colv = 'euclidean' , main = "Metagene contributions in each sample", labCol = NULL , annRow = list(Metagene=':basis'), annCol = list(':basis', Class=a, Index=c) , annColors = list(Metagene='Set2') , info = TRUE) par(opar) ## ----basismap_res, fig.keep='last'-------------------------------------------- opar <- par(mfrow=c(1,2)) # default plot basismap(res) # customized plot: only use row special annotation track. basismap(res, main="Metagenes", annRow=list(d, e), tracks=c(Metagene=':basis')) par(opar) ## ----basismap_default, eval=FALSE--------------------------------------------- # Colv = NA # scale = 'r1' # color = 'YlOrRd:50' # annRow = predict(object, 'features') ## ----consensusmap_res, fig.keep='last'---------------------------------------- opar <- par(mfrow=c(1,2)) # default plot consensusmap(res) # customized plot consensusmap(res, annCol=covariates, annColors=list(c='blue') , labCol='sample ', main='Cluster stability' , sub='Consensus matrix and all covariates') par(opar) ## ----cmap_default, eval=FALSE------------------------------------------------- # distfun = function(x) as.dist(1-x) # x being the consensus matrix # hclustfun = 'average' # Rowv = TRUE # Colv = "Rowv" # color = '-RdYlBu' ## ----estimate, cache=TRUE----------------------------------------------------- res2_7 <- nmf(Xmat, 2:7, nrun=10, .options='v') class(res2_7) ## ----consensusmap_estimate, fig.keep='last'----------------------------------- consensusmap(res2_7) ## ----fit_methods, cache=TRUE-------------------------------------------------- res_methods <- nmf(Xmat, 3, list('lee', 'brunet', 'nsNMF'), nrun=10) class(res_methods) ## ----consensusmap_methods, fig.width=10, fig.height=7, fig.keep='last'-------- consensusmap(res_methods) ## ----demo_hm, eval=FALSE------------------------------------------------------ # demo('aheatmap') # # or # demo('heatmaps') ## ----sessionInfo, echo=FALSE, results='asis'---------------------------------- toLatex(sessionInfo()) NMF/inst/doc/NMF-vignette.pdf0000644000176200001440000202035214661566407015375 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 180 0 obj << /Length 303 /Filter /FlateDecode >> stream xÚµRMoÂ0 ½÷WXâ‡'¬)Ù´NÚ§¶õ†8dm袵Òr@Ú_Jƒ&6i²äg;ŽŸm¡„ë»HD ßÊЉ<Ÿ—³¨«‡@a¤8“ãUA]ÂÇ8’˜º ÁÓy쇎[iSvâ^&i0LF‚î˜Ò„˜¶®ór˜õ{½A±¨gd®—…w¬Zo´U¹÷V2{—…º„#t…®»ÌÓ›¨)%"ŠþL´,cÊú߉²rS7ÊžËÓÙÜÃ}âÐÃD›©Y曬1ÖGJ¹U{söx;÷Ö‡‡—7yh«R•q{ÝÙ™\ÉW]êF«úè«k±;ï¾ÐÔØ¯L6d§³üê†<v|6 ArÊH$¨§¦'4Wið *Pà endstream endobj 201 0 obj << /Length 3087 /Filter /FlateDecode >> stream xÚíZݓ۶¿¿‚ã¾ðf,ðÓ“4µ:“¶IkùÚ—$< ’S¤LR>»}‹)RG_|™Þ$ÓéŒÏ‹Åb±ßTàm½Àûæ"øÄóÅõÅÕ+-=™%£Ð»Þx2…”©§R(¥¼ëµ÷ƒÿ¼º\è@ùEu©b¿kêËžëãª+j7ÕÕüüþ»W<8ä+B~{i?ߚ˟®ÿ‚½”—Š,ŽíVY ’Dz ˆ,Êx§]¦±oš–é†Ú„JÝZíI ÌHÑâ…LEÅÞB¥"Í$¯^š*?®±“®h­'Eš¤@ÕBKíŽtÜÛŽQ•zJƒÄW y3xU1ïE"ˆo¡#!C'”ë]ÑBZúï‹meºÎÐ[àÓ*ñ»–!ÝÎb—{à½õúÑ_!Ð;m%¥iaÊîAÒä•|agŒ©X„ñ€l%ž’Ä£^â¼M³uû-‰„̼Xd‰N‰„Ö"‰•§E,#&#ïÛ16Éá„þc½¬­4LǧÎK1:u³u‡ ÞQ2˜ìÅÔ$.CEÒ¿Ýö<;&[ì¥Ù“`S'XéçüØ\J¿É÷— l~KóuóÖÞûBf¡H•ÆÀjs¼©ºnèj]Uf›wÅ{º-ÃÀïò®)>ðøÕe å]uuSü;wº®´=2ÝŒ´ì2,/·Àêvû–—wɯ´dɯÍ{âÑ”õ¡?O¼¬ÇÃ5íkp¢Oʰ ?y&¿…cIúVö€NN~½£ ²Ì¯o.QìÿlVöð©ïà¤Ñô$kÒeªI:ÃÉ+‡;¾^:D{ÃkÛzïV´]^­ófíÖ’ÂE‡2òoéâvب( /Í˲&²·Eµu ± Šù@ÇÖ4,<ëI­-Ê<.¬J@™K*î ºb{ÓíÈ£¥þºuÄv¹C*x…Ù6yg/'ìAn¿œ«z¿ïÕc]ôð)»˜‘2[”|U”¤fÚ¹{Ê«¼üØíSV8”ci pí1/‹¶¸„Àž:Ø3˜ú½Ï«•áÙ†V¼ý>oÞB¨rÿÛ ã|¤®ü™2½nçHXÇ’c‰O®|â¶t ›&gnëÜ[%BGòo¿’fBÁ1M¤aMIkâ"=Òiu8Ȉç `<8oÊbe¥Ó2âéþs{2 ­ŠÎ<³¦óçkç"¥§D<ðf‘Pðª«ýÅ;¶õg ì":ƒg¾õüÆ;MŠÌ£?I6Š·0KeèÐîGPA"¸¨Ä“!‚®Î¼½w±¸ --’QA(èBAHAF©‡ ¡U–„X ¤JSoE‹è¢—gà…a£Åi§¥¶³¿q:³~nŸ–ˆäöË pX}Gw¥r»³Cž¤ü»xmo¨¿}{Æ(ñ(†t÷X…[ã¿ñxµ÷ÎôÂyßR†è˜âf™TFÄl¢51‡ÔãLÓ¨èRé…BªÕy„T øQêð¹22Š›Ò0ÎÒÙÁ™yY G> ªQäcç•û>òië NQï và–¿­žÍÙ~ »ÒÞ®_|÷²·e†OlùEQ•uP]±jgœDœŠ(Ö=1,•ý1£€— ô†-x¨ãD8Öôˆ¼‰ ²žXѶÕÌŽH$U8ìøŒ*ÃDBu‚hŽl”Š8È®ëbŽj4>dzOæˆÙv¿€²îøÊîK,ø´9¤ƒà“pß?G>ìL« y¯O*î4|1¨økÏý«¼1Þ¢÷„‹‘+¼«Á2E†^ˆ+#»cÏ_Û0)‡jGs!#V ýbÄP©þTİĤ¿"ï^1Z›–á­á¤®ÉKô…‰ÔÓüCË„CF»3kž¿¡M>òx]À¼´iN‰8"_hZáRLˆ!ÔáTÍÿQ6©‚Y½í oí±q#›Aà™—­I–ÜÜÎ yÕÉZ—o¦6õ•~K+qÊULbÍ+nq´3"ÉÏhœÂ>^ö×dçYà¿,:@gr—=C»š3…Ì_Ùœ0—lð˦>Ú¨ „ÂÍÛÄ6'_5_œØÌ6õ蘆Ìωñù(m3k ù6Ư´3åG¨Jïh²±nÁ9„%N¹¾Úšõó^Nâ‹Adœ³mÊ5ÀSV„P¡VÕgµ†[ñtnw„ó›¿é«>ö»‘õF" b/DŦ`ã°É~ ¼5&qG”› ¥ Ô=b˜ÔäKïÍÅkg¹“̓”-¤‚Ô•³Ë™ƒÂúõ°õž0œTÆ 15‰à3b<]û¶BÆ_–V‡žÍMGOe«-J4±¤t˜ŠGÜ؈FpgÈÜ Uôìxe:ò œ Z UJB”’ Ö_´¤)`qÈ ×Œ¹iê=òнÀ=n›¨½\>ÿþ\WiycØlë¶@ýÈ âŽ=Ñ}Ñ4uãƒÐaäÿ§¢ïf‚l2¶9åð¿Å<>s¢l)%SH‰œ´&U#p¨ 6IêEˆUÄœñ6P¯‡ðòùç{ ̼"Jaóˆ’1cž—}Wl’¬¨p`v°1{k€ŸTQ¯ç¾¼D'ôik·Ž‘s mÕLÌ68/‹ìîÊÿ¶÷q"9×äy0}™ÁÁ¡Ú!ѦŒ7õ´eGG>‚|0ýÏU™3}9»)§.«óõo¤+eqÓäÍÇÇV{¿BÌàAæÛ—’SVê'‘:ÅŸ»é)‚y Â_LOýéôT¥‰m¨¡ŒµJ<Ô:Ç<5Þ‚$ʦn4®«F¤VB¦Cª°\PIÿ³¼ ª¼ê¾/’YÈzÜà¥^².ÓàrÓ)e^3½Lš`p³`A °Úf¢ ÔEÙg‚t!(9t2íîÙp|O¦ºpg7íí³««†ë$hk„{a‰s«S`âjyõÕ¶©‡™ +…‹G¹¨2ð ¢û2,%²4;˰&šA_Q€O¤åŽS¬¿ŒÃìNj{ê^Q ÞZ’i­{oo\{€3Z‚$¨ùLU n×ö8†ËÕ¿  É™*̤€:‰„„¸*î¤oŽ›}ûuÓÍ%€‘)FN¥ÿÙšeË_{úvkcØ*Ì>;û½E‡êN?ÒNç˜jUÀ׌më,ÀÛãM»jŠ“TC×5ûR ×PÆhýäö3^Pv¬¨Žõ‰w=EÇY=õ«ýfA„ÿDdZhf¯¡#w`3Rjh`êE`˜ã>r¾I"a(™³1MCg'¸•Ó.¯(鵉nÉp[ľ©ÞQÙ\4…iÝ7Ç-Ïq›Ð%¶Oçºï“w\ÎÂ?4æÝ·f‹j@Ú[ä$}Võ]ê”\é¢1¥+X1±.ÚÕ±%OÑÚ¶´v_Öhî¶(K™Š »+ì:Ó—¢Ó¾0 ä-ÏÜÚÚs´;]ö¶·¥cÑmŽ¥ë “˜êýž¤|¬ŠndæC/ÏKërÖ"k QÖWCûÁ°ƒY“ˆCg§ï~ÜF‰²¾‚‘ûž¶þá9‡´*ó¶µ¼¬ R©°²â²5Ÿ127B¢l¦ŸàÎz ¡-Û¼`b˜åo&ÄLYw}ı>Q ûe{ö®Å@]GÓ»/kwx–”Y7f¿Hq`t}ûvĉC* ÷Ї£ã®ñеû6€ä%Š÷­m­û÷ZjI] &øÿk-Ä))‚^“\òl¨bG¬34â H#¶ -¿Î»ÜM®ÏôäÛ¿&ÕÿÕcõÍ—¬0ÿ÷ ³ãam»‡4¶®”‡k³) NËåø÷kßÂÃe“ÝÕà3·Zé_,ÍDÜÈ~þþëò@ƒ`qýÎ ÐÑGš“Ï''‘÷2Î` É´ÌБ!2$î %LXBkT¬§¿ß™û­‘=l›’Ó{Iy”HûEí.é×JTLQns…h{µjòÊÖR±vµTvª¥(ƒÀ de_Þý¹Ò„Ý…Û1†:Êi-úßaÖñy*c5ÃôÐ^A;?—e5*™òE÷r7éÎÙt‘>¼O ¢'È´¤üºnyø%=”ÿ„~ƒ#¡–].^ÙS,©H°¼Ó/qší““~ŸiØy«#£ï|ô¹Ìþ4c¦ô‡Nþž¯Z endstream endobj 5 0 obj << /Type /ObjStm /N 100 /First 832 /Length 1979 /Filter /FlateDecode >> stream xÚ½ZÛrÛ8}×Wà1™*“¸_Rž©u’Q’ªu6e'[;›øA–èDYôRôN²_¿ /²­¤Ê@ì>}ºÑHKB‰%‚G,#ŒÆ4a‚pF Z\* ‘œN‰T7ˆb7ˆRbÄ1øqKŒ¦„;â(¤q⤠BF™$©tDȇX É…„>a‘’0ÉèÈ«’Fi Sx0B”¶¨!ÏR¨‡<‹‡= =^15–hF8gŠh‰Z©‘. íÑRÔŽpE£@ +¿†™r äY :¼!°|Šç,L Rެ"‚„……Ì¡†IÜÂVSA’ó&;Mð'¤`Ä"”‚±”¢á| už4¤1 ™ÖO›¾á@´3øBRíü{çÀRp߀G$,f•Op¼©ïoF؃W¤…ßH+ ޑΓÿH+<¤…[à"ˆñ ºÃ?Š»Ê3 Þ†›pŒü¤”ö=¾ ¾ç ·ÀUÊrßðn‘gaˆo¢9G&i®½OÑä2ï#ÉäˆiïÓÚ€8 µo@²A”0¸M[ ]ð›¶’} 8?da,TXx•J6bÆ¡nŽÛ†Ã pd°àŒòáOcè ®‚5 Çç0.¶ÌÃðnˆæ|\(;:>&é9I_åïs’¾$OVÙ´œçË„=%¿ý6zòIŸùD)ý‡/þë‹ÌE¸œ‡¾¿žî ¼½ 2Û¤¾óÅÄS_| —ŸƒÔOTR__…žj@é‹Û¥º±Àw¼õEî‹e(² Ñ4Í¿u*ÂÐo›£Æ±•eÐÙŒÿ_‹º5¬›Ä®M'¾X#¶4Uò¿øâzÎä®ü7©y xØä‹g› ­³U1 ã—ÁŒ»¡×aTcI2Gíšó:HøkSO㥻ž"„Ür³ûm„ñf÷ä^ÐS§™‹W±’ëaân¯9bAÐ46/Ûýe§ûfÿ°ÁóÓÎÌÕ2Å?ÄÄ÷¢˜|ì[Ç_n˜Åñ½%«ì%š·eÃó–°_ìßÃv‘–άÛ:“o²3i —wÄ_˳8Ëì‚ìµu"@Zôx*ÆÕ’g‰¾Iþ[Y~¿¶ðÍ"tÐÞ„¾f’]…Öô  %osÂy/Šï÷wÇÞùqØ;­“éy°{Þx::ßIã‡È×1¨_P«8…^ÿ ¥ƒ·îÁ}yå{˜Rq?ÿè­F ¸kËyË/â©Ü@ê}t·x~oP¢äqØ­j J>tR\Å»¯é½÷ʼM÷éÖRÞ ®fûL>Õwä)bW7Ê;û”†Ž› ìÝ^ïªm:ױ￷ƒZÆ;YÒƒÇÏÞÖÞ&‹ÃûËæÐË–­hï:öBÝ2íÎâ¨i¹Þ °<8ùÁ´ÉŽ-Ô<$¸Èî$îÑŸ™5o_~£ðZ´¤…5Ì}HPɯ±lÚƒ¯I·ÿ (²ÿí&ê,N®Ó:öÊUºc¿¹j  ÉÝËö£’ýNVl‚äë°ƒô¾ï˜®â}϶•,šŽÕf+^'±ÑçžCíÈì.¨YÍÙä^oS¾e©a Ÿo¶ráýBmàœßËXë¶ïÀ;顈í'é]çàî´ös1óŸƒyÇo9´h\Ç‹ñj댺e-û2H½ŠÍ;ȬîÙVDfõm¯Wñ:¼ì{´ ò'î:Þo^Ç©e½õ˜Ç>ÿ¨fLv¼DŸ…©-˜#Ï6&ì›Öä#?ˆÜ÷½Ðýw–5PÕdÍ»´UÏŠÔ|-XOšN=¿$¬këœÅ﵊x9ê{¹ýÑW£äŒ¤ãyyá¥Ò÷ßo2’¾›|ÎFé‹|YfËrå?Ïú‘£ô,[å·Å4C—që®Ól6Ÿ<Ï¿‘~Œr8›M¬d‰u#H* T5¼Ö²©ý_ü›TŸè(ž ËÛÅâ¢k˜£Dkš¥£qHyq~3™fD¬‡¿›”eV, __þþ­|u^NÊŒ°ªc”Žañ”Œ…ÿ²Xû/´VVž¾+òéyV’ørLÒ÷Ù·’|­dù¯Ûd¹‘•ž,—9$~¬¾jzHþ£æºvëÚѺfuÍëZÔµ¬ëúyW?ïl-§®]¥qÛ²Jÿ(}ž³¬¨ Ó‹ôuú&} FØ…7r v8Ó‰õ_K¤ \òÄ‚r<¡\`Øùíe ‘éßç˯éÉñq¥ =©¢;=O?œ½ñ¿'_Êòfõ,M§Åd™G7Eþ'ä'yñ9…s¿‚è_ßžŽŸdÎZ ©´´ÃfÕE€mLBu@mE¢8ß@}B¶'äë«> stream xÚí›Ks›HÇïþဖyÃÞ¯Ù*;[¶³—ìÉTxy8N>ýÎ03è²Q²6Ú*Ifð¯{ºÿÓÝò¬¹åY'ž¾¾½;ùå3 à ÂZw3+ð,Ñģĺ›ZíÓ,u°K®.…ó÷Ýï'@üµgåsK½¸¹·ÁV0 (¤ò.žåB0 S7Ž@b¿t´yþó/õ}ÌsX° dònõ÷ñÖU ·²Š‹=8AY.‹ª›ˆå€¡ý‡};ŒÈìÏ¡v8王²g<,«œëñÑõ²'Ž‹ƒ@^ˆçúÒõonŒm ónÛ*ÒÚµˆ1Ô¸ÎÒ”ÏÃ2~”–¨ácû*,óøIâÜñ‘°P™åñ7ñ5ákðßÁ8Ìå0H‘Fú&™ Xåý¢å¼À¯–Ѽ´ñc›ôÆ5þwi\Æa¢½õWÁ»à|§såÒ ^ÞgŽ+ü}ÚŽ/"½º°·S÷§J4ÕËLƇ/*>”™™W©zq}u®> ·û>¯a_¾l_¾M"¤«‰ç³,_„iÔÎ{ÌC#áöãB¶ßÛ»ÙsÞť·å½Ln|jÅ—j…,ÕŠôÿ'ž?.ktvßМ®P±xG)O_Y*åù¡,…ֈ‚‹¨M´/ö,6²«OêÃiXŠË–ñ…úivjRó«®Ez+ÒD—ñmc%B‚מnrÎÙå#„ÂÚö¨-0–¡‘éÐØ¤ðP]ŠÆXXKxKË^>B#±B—J zF<‰j¬—a:M4PâŒÏó¢JZ ‰zD  ¶Ài¸gOe.M ^!9E²H¹[<Ô“Gñ_ÀÑó‡]È ÏPìpw‘r»÷¸9„Þ6Pf_›-®=RkJ±·¥¬leYFÆA}9m˜7qõm'¥§»”;fl”T¿ nkïÃ&°žVE™-vR%þ˜ez'U40N ½âĶ3~ë$:ÑÖ™¶Ð0½…¶Ä…½+'Àóà(âÞ±5±àºZð<ŽÂd ssúú± /^×aa`#´Îã'´†;{®JML¯š+éY’\qG›UiÔÅ”:.)p@´[2™)R_‰3Vü°Rgh…SŠè˜ö0f ½#Yk<æa’p›£lñP•uðhwÆZçÙ;F³aª‚4ªâŠ/²ü«Añ”çݰÀ˜ë ¬¿Ó6z¢®…­¸-²gYÎUIú^½ñÉ´Ó¥RN;:\?«_ûÒ<´«Q7U*™•ñBGäì¡Ó5ñ ïÒ‰×ï-&H#&.ãù½Úùm.û´Ž¼M­,K×j¼Q"¤Ï[I ^¦êòø!1jV[dyÔ¸ þOŵo†zÇó'U]z 0š~^2¨²LSõ¬;:\zVéÛT ÖO J†…éçV™Æe>‡`X>§M>ÿ¨Ú2²Œ]Öˆ[Ã.è­ºB|h‘Üô¨e” óelke‘Rp¼Ç5ê«| ùϸ¨šÙ!]ó’ýg]÷bu/ØñŽjIA É÷LèùS¤¦ÎžJ¡Y•“û¦¶ë«© …¨ëÉ©‹Vÿ‹ÇƒtÀ€vÔ t–ï[Á ƒcÀéÜqtH:A+MþE“¥î[³ƒÈÜ[LA6Ʋ3ì[Û@+½ýçiNe3µ(—Ýé°¨rÞ§¹úÂ¥# Ð3§Á߸5éá2Õš#·N ËâsÏu¾#J­”ürÎÜ]¾†¼´Ìáîù¦œž ¬t߈'í‘~2ª|ˆÀ ¥‡šqˆÕ ´oS“úþ‘–&<À"VòãÍô±V"2N•ðCe…T€ª†ÅúhøØ!ÞýC˜zñ‡Z{® ვ¨Æ³ïÐ(G¸åE¡NB…¾KgÙæ¡À„`d~ …¶ýÊrÍ7×¹á3žóö˜w÷mÍÇ›?­‚œ$žß&”b££Wÿäìîä_W*å endstream endobj 280 0 obj << /Length 3194 /Filter /FlateDecode >> stream xÚÅZYsÛÈ~ׯ`ž–Msá°*©²½±“]¯wc«*©²ý‘ Ã’ä¿§{`†QZm6y‘@`Žž>¾þºh±]D‹—g‘þÿìâì/x² ù¤~ªQøG‹¯î^©ÿîÐç¡–$‹C*@)Àë_x¤¤I¥Ó˜}®÷BQŠ8ÝŒñæïµœæèárÅA;oõ©`‹3ëE‹n»Po^ž-ÞÉ9T>6–Ó7Às0X1 DÛÄJ¶ºíP錛bÈ˪Œ¿x÷êîµTNU¹wû¼ÞWzÞºÉS˜®†  ðöNn­~ ­ž¿Ƽª¾ª»{9±è®Ú®6kÕµZ€CÞÒÛ•zMT¶Z§Y‚çT_{´> By@pÕŒs}ÑK}rÐA®ót1˜†ZJ¢hŠºP4Ð(âL×$ç>Ò¸¢Í£þCv¤u¤š:¾n›¦Ø‚äŠ{*Úøc>tåº~±Ì$Ý¥Ë …òsI‡J2’ÎTlKyòY&Aî¢IPcôJ]$@à7£´œg+mÃ…%0CÝœ†ëËô@`yèÄ%([æ$J´Ãλin¹¬gòÁ¦u|tìã»®·»v¼öK¹mŠa(n§T¯ÀàJ—ÌfÅ@—¢‰.ýãm\ƒp3âR%bü‹J=^8Z6s4c¾ØŽAÌó÷QD=‹da4¯±÷•„i6-Ò´Íj2Ò$\-ôéy*c  õ™ü=ª`4Œæ“Þè!tÉXŠCDg¨ÖÃ?9ªüè9a&)_X£ÞGTøT…‚ÄfÃH˺)Àü`ðc ‘yrh¬Ø5V±Y»÷ÙcYonz¼-c¡˜€ ã"Šƒ?ùÖMÃHLÕS¤}¤QÿM‚ÛòÑ‹3¨kR×K_Ù@Dèúé‹9¸Fbƒç1ù©Jcpª8S½Ü0ð½.nÊÚFÇEÒTÁγøþv`Ä·šc‡¿(±,ø „ç§2À·h2//""Oí 4¬…0J ›¨±×»¢+|a câl–ôpÅ ä)²D˜²éx¹wEƒÿÓÓ@q'Ä)›}χ™˜%ñú/ÉBÊŽ±%‰Ã$Šï! ?…IiH2v;&1)LZ*+Pärº°Y›qPcõ’]„,øk£¦í;pv˜§§)Ї¤vu˜(ÁÖ< YLÜ &÷Égsf™8¥\èfËÞPÒ¡hLÅIq‡,X•¦že=UX¹7ó€„ä¤U’P°ÔŠ!îÃ&Ó"uÙ`,ø³’Õ9h´kû¬H„–YmÁ¹ìH(Â)Pˆàãl3u3#0„]ÙL¹ÚhL©©-צÐííö ê«®óKeà ;e̵á\í± 1õ¬6MMÙȧ˜.Ô¾›©Âðir~:ÿÓ‰ k4Œ·~ÓˆÞåNÓå¼ý¥Þ©¾Y·ÕX7“«ya“žYXåÍpÉ‹&ßDY(ÒÄUëw…Ž@xšÈVOá”èÙ…º†ìP•k­a„Y¤¨6’‚Æ(~¯Gês©Q²Ç»†ŽêÙ›æ³b.®pLE>ê#ÀòsÙ#Ã±Ž¶:¾™ÔÆ0¢Q°’$Aߎtµ8 zà…y…mIÁ5 Ä©qMxnx£ºmüžŸG»œ•)¾ªQÊaH^AÁÚävÉçc¯—@;s]tuïééñˆ‚5éÌ/°e<»<®yêö>ý>6;8"&Œn;_2'™v›4çY É–‡JßWX᥺Å\al7MbY ÞÛK‘‚%ÑœÂÜÎ'#fáÜÍ0v¨)Éh!hðº•7L<àq»®a€œÇ™ÓÕVŠ6¶ÔÊÅÍD PaõSöaL„”„Ø^JÚbÀT^M3¦$µu±¯um·Vn×µbÜzcÉìL¦Di˜@ÔyÖ›Â(™aö ±}ˆèE?5ˆT±9ÖÖ“ÜtœBl''=†‡d®Pne;,¡§tˆnÅ@î¶«Væ±u®_@N-eu¬Ÿ"’Ù9$¸žÒ‹]/­DH »¬€ rbŽ…ÿ¹KXƒ ²0OíB2kPR:—.Þƒ|ÐÚðOÕaOŠþÎ»Š Âæ×¾²(L1gÎeŠ2Ç3•÷B”óªT¡Àéù4<7cßxÉoì•ÛÄä÷&ö·‚Øâ}ÐF`N· ¸n"í':nþ%‹?_œ}Ö/¼È‚¹à®4¢ –]×gø€30–ÇÈgW,®Îþ¦^[:{0ðÒL¤Ód¹É?¿ïÂ(D/}è.±º|°Ë¿=~·‚‚f•…iª†ýÑãð1Äçäž/¼þK¼Že/Â`+qXñâ,u/õßaÐÇ©äq0K¬Ãýé‰Â óÂvªoë€Jb"\Pðu@ÙmÐïü½§ÕãX½T½¾q56Ó;d¡Ê y¿.ò^¾Ž–¿$ÃÄŸ±=? %ÿªn¨÷ÆÖÝ H‚ Àq¢*3<×/gpÚ± š¼(éê2½š~gˆ¹áìE tí~ÙêèZÝvkÊQ£õ¦Ä>õÚ[xCZ‹£_‡P.žÔ.ùøÏRàólòÖ§7žyJ5Ø*¡“/&¿ó¶× Lc,µ¹yÉ Q²»¥ç˜$¿Øž>óÔr‚f00&Zÿƒ’CÚ²FM!áÂ0º HIäÄæÝ‡h±‡ß/ êÎÒŵZ/ éÙÕâ­Ág3>…µa£3•ì:¨Þ æEì°Ì@ƒ:I±ôç‘1Õº‡ˆ®)9!á´Ô‘„š€ ) ÍR·Št1-TXVS’´N81 ‡üþé7÷6k©|Mg³–uzµQämÿd1›«”ãí8@¦ðoç¦ì²³Ÿ tWÞ­øž­{·!,ÆtîÙœ† €[FtªŽ\¤ùa¬ªË¥ü°ïÓêUQ^V6ºÄë€ÿ¯ÕK†QR ^ø‘ €“ð;@‡Ý:üÞ ÃOƒŽÝúJk¼ò7}²¹p¼ÞxûU|&Þ?Þ…§Ïü‘°Ã$5Tƒ¼¹!À²›»|qç:,ãN¾<ÿèGgŒ_wâA1å#N'¯Ú­oS! 8CÚ[ {Ëä™|%D Í N ø•=eú\RÒW2'¸-äï0€i% FÓûc̯Pÿ!¤=ú/ã;…g§?žb(˜/ÛyO|ãÏYrШæyÓÝZïÖEÐÛ±Êñ5pùM3;ù‡zj(œþ–ȼ®ÝØDìªU-6˜²)ú²Ë/+£@Í×Jrå7émªÇOuVú,m¼µÀ~m/Àé‹<¶Ú÷‰éuLßÖêû›vØ5EoÔ™¦tÞõÖw2꫃ç¥î|«–‚Ì+¥&»÷ûú€ãשïëƒÐ½‰M A‘a`–˜Ýì1€ÿWLw endstream endobj 321 0 obj << /Length 2950 /Filter /FlateDecode >> stream xÚí]“Û¶ñý~ÇíL©™MüLÓÌØ_œØé4¾ËäÁñ%AjŠTêìë¯ï.vA‘4ïÆnÆ­ûñ"‚‹åb±ŸÀ®Boç…Þ·!?ŸÞ\<¾Š3Oˆ H’È»ÙzEèe‘ Â4ñn6Þk_r±"Jü'Õ®iu·?˜Å››ï_E¡WE¥øYè-Eȼ ¯þòÃÕbE‘_ž?²ï;U«¶¬ª;z5 ÷«…ðoQæ+‚ÛfU©½ü&!.x!`‘Ðkw ^}{ EvÊí€.èCÝÁJ&°`û—0'þjå>s°:éj£ë³Ël©_Oª^[v¤ßl z(»V¯•ó‚A€‚\¤ÀŽÄÏŒyiPd2·"â°yqÖÛBqP„‘7@ú#ˆ*Íüç3Ed÷ "i…xÞ2ŽD€Ä–d 4ÝíËn±ŒEê·js²;ÇTåe»§7Ó©#º½¢Áí"IÀNüŠrÍ7«Å0þ¦Öh˜NoOõºÓM=#œ(‹ƒ4Ìœ”¯f6›YáæƒÅ2-¤ÿT½aâ¦9Œ¸lu‰kñu}fÕÊ'Ê£@ÙX>6 –¤Öú—PÄkK`±”EŽ[ýé/>šçKä FîˆfY¡·þדª%¸æ5­Xqº9vú ÿ>`§ £ûZƒ]‡Žz´„[Eƒ(À *Ô†(u M¬›ÃñÔ©ó:V&YD¡IJ\ŸH$›²³ëHéo›–÷8L’ ÞŒ¿¼y$àæ#{¸Zä-`»[«nµzgèOŠ‹E<Ž‹0a”¢Jé©jÛ;ÂSË*àH'(ÒÀA‹…a6… fþŸ÷¨ü"‚ñGŒï ®ÈO½qÛܪc¥!º`­Ò5I)Ëç†,RN4ôeS:@ }¨‰(rÐ ãKkÎo­ãîÐAϳ@}8B"Q5ÎtèÛiŽ1§,ìtÀß¹qK6LÞñ´ª´Ù£/ ø¬1ðÌ$$»rÛ •[ˆ-†qÉFÒ$H²b,N€ ™$ó·myPïðã¦}K ërI:朦”-ke ¨% nÐèJÈ—÷&IKOLtiÉì0;ÂÎ Q-éaöMÛ°£u«IN( $ñ=A€¥!JÖlj‰`Âí–6hI9êWY€ÏÅñ‡f¶%ŸâÛØ……1€Ö:µ¡1y£3…Ü­h·<õ¾¥Ñ$ÑCÃKÃ@ä½uÖ‡m š1ÓâJ²N,Cÿ -âd=åžLEÊ,È 1¦Ú†ÐbÊ<‚ÜFJHãÕ%æ4a)g¶#ð–%ŽÃõ¾lË5œ“fö’„A÷Ùê­]ü˜¿ŒC—?`1b¦l;Mg;Ãq‰ìÃñ\îJ]þ¨ƒ\³gnQa4²¶#ÑGቺrÆ ÂI)ŒÌcbBa cØáà£Û@p6 ùvðk1§ÀOÂ|vsñ+{¡ðò,…ðd˜«Ö‡ ÇÌŠ,ÓJÀÖ3¯UÞöâÇObæã7ø90S`> ’ =Hó”0§ÀW|»C›‚ËE>"Hq¿ƒ÷ Ò>ŽÀvxpëÔÎðáÍã“xÍd†¯‰Äß‚ysâ'áØ§nÿYKù5tgò³šQ™ 8°’²@[Øó_‹7¤•G«öT«îÄ3†þ£/aG8¬”‚±L3Àº‚ËœªõÉ<âÏšíÖ >« ¤üG£L‘N—ÌÜ’•Y‚.úojôj´%µŒRÄ50õ¸=Oâkõè3ŠöcýbâSAÓV9æ; ‡9Â]c«×·øŠÞáRNpô?à*ŸL_p†´Çù0È o r´“ ?m_ª³£E}ݬàrÎÑs3>×Ui ›øÛu×Âeow÷—[Ô7ú2žQøc1_¥7sÇÅþCbè¬ýÅK§ {?;4U¹5ÝæAô¯ûm°Ç­÷êP~sï7 „¸¦þ®Ö¯Qã9ø!쟎x9fìþäÉ[JB}Iã[~¾ççº9ÞÑèOô¸zòòúOª£Í?”ë½®Õï7 \bTóŒA_ô™SrxÝ5Ç×M][ÉëîîAq“,^©îÔÖi|™7E\>¾Ò ^÷4ÔÆ…[¬¿X­ébW¿1¼² áŽYwz l~i±õc÷÷_•#þùáò3ª‚œôÿ)ûUò¥¥í|œ¶û#úÍ«Ÿž1ŸŸárɵ¤i ˜’DáÌ5bn a–„Ë•iÌp.7JQûEBö8¨nõ/áo>¶É$ãbT Â÷ZÙ’Œl5-.\…^t½>³â©d‰ÑÃô4lVVsŠÈMSm¶6ð‹Ü3]Šnøy2©m‹b¾¶Í>œí qê ÊzóxvI)Á¹ûrÕó™ó ÊŇ+ÎUã4›‚ïëãrðµò h)ƒT$çb9ÖŠéoÛæÀrÞk.RÙ+•`7r|!¥ ßt¥­CÚb“"7õl9àXzEÍ®•Ázhœ¦þSê&•çfFO¢uD j^hW5+[’ØA×ÃæI<¨ÔÙÂWDu_œØœi¦sOœۙà*ë^ïlÉ4÷7h‡Ëcm`½²²†‰µ/×®”iÌ›‡/Ir^+ú~Xiµ=ò0†BÖü¾-×\O¦‚".Ý‹{ öMÓvå°òLEé Ù<µ³{<¨²7Þž*ªë¶ÊœªÎuc >ß´v”b—é€\#´ 8ÁaIJ!î ±/|ž “(齡Å!ÈZ¶5Þ¢¦ b›-`—ªe†:Çßaï-*ÅVöe:ߨ[Îmðç?> stream xÚÅZÝsÛ6÷_ÁIŽž©P|ÌÌ=$smïš¶Ók|íÌ%y %ÚfMQ*)%MÿúÛÅ‚2)#úHš¹\,ö·»?@æÙmƳo/øÞó÷ Ož‰¬à™S’yYdóåÅ«7<[€ü»Œ3Uøì]ÐZfZ*x6ÙË‹_<¿ºøêɳ‚VÚìê&+ +œÏœÔLZ‘]-²Wù‹êýåÌ*+òTý¼«×›zÕ^¾¹úîâ뫽é%gÚ™ó¦/Ó Á îhúënÛVœoÏVÏ™%Nj/7e»(»ÅåLI›ÿøÃ7ŒZÏ˾ŠB°:<_l›æºœ_JŸßϾ¯êë¦ê¨gQ¿½”.¯ºÛªW_¢Ðåõ†:·}Õ“¤¯—ë¦"é‡Ù6›z†&‚534Þ²jÝÔórƒ£ú>…Ê·kxú|Qnp8”Üt«%µ^sÿ¯¢",:<ˆ…ÝÆMæYw›Qãço/²WAAr.¢a&†‘ÚÏE^µw%¬fA£mVqT4)صªcW–²¬:°¹‰Æ¶‹ªK®ì5f…¼cÑ7jìÏœÙLk˜¤/þõdfÁËÊ=&=¨ ¦‹8î=L¬óߢ®)<3Vg#Ý×\óÄäšÐâ=­V0W¸LJV=L+ô Õd3ÅŒ·ÔóSb.Á™&ƒØBª Ÿ;¦¬[W$þ5~.2Í VÀçlTh*71 šûÄ,–9í³‘Ö/‰±ÀÜLÇúíq +#™³&³Æ2–ˆfé`›Ì4 E12ëa,Π#nŸá‰(˜L Nûõr&Œ|7Rf¥牕Ò`Wºç[ð€À;׊Ď(X¶‡Uh°>˜ß úkoCÆ3*­w†RâÔظlöÀ>>túb ¢ñ`Ó¼˜àâÛæ÷“¬±—^…´Ì8øTrä95ìøø»±A3) Æaiå8ñ«êûTÜ;f½:;îÏ›qâ$±n^‹ì½‡›‰‡^%lÇ0qÇR–L¤¬&\0h¤ú,1 (¹é€uj,Ø€ëHëï‰%†À…dÊ; 2ãøVÅn¡|êEïSñ=MÞé´ñüñoÒÁm¡FYć‚Û[f q(ºgÜl;N‡ƒÑ}64>ÞBÂgn?¼u"¼µ‡·‚}2À»0¼åÞ?W7U‡œéiÊ vÏ£ü9qº™RDs”Ò‡i*ÍÑ)𓤢ÆcžŸLEÓ°Ú˜§ f§óP-|䡨Š<›ÈCñYmçM½¨Êøº¨ûMI´SCl íD1ÑNlí„°É×—"Gö©EñÀ>§D3Á×&´3‘;9TAëÁ½žqeN›>ƒ±éã™Ûœ˜þ’ÓN  Á'‘XI¥¦$}¨^@x:`_ŠYÞUbˤ³ÈwZ¿¤`ÂøCq:žÖ¯r/miÇ$ÓƒÀ8ÈISüЩo7V(µÉ–Á9Ôù£[6Òúë+Âxë>”¹bçC­Ûç8=0BL‚î4â¥O£8çÊ™3NV®Ü˜cd7á/°¥R&–€‡…D¨ðƒ¡rÀ&±ŒÇA ¡Îê"àR‰0]}ñLfæErc! 3ü`@ߘ …ý0Äá ­ö!nϨó.z>¦Î‡»Œs‹¼8¹Èk«! å'ymàL9œîÛŠöÑ2ÿãªõËU¨©«Í<ŠÕ^:™ÿ'm”•ôˆª‹ú5:ÜÅ€ªu×ã}Z¬nèsº¯ۨú²Ú¶·‹c~dÕŸiéò›UGô-˜FFÃÂ-iãµ>Ñü ©•$©þØT--_q ჻ŠÔÔ,€² 'JXˆ› Ã…uÿèFÝÇKnbY·øM86ÕFõ²¥çêúrflþ[5O"h„@^ä7Ûv¾!HsŸ_ÇÃt¨ˆùú¾ê@>`: ú îªÛmSv`T A¥Xªj¾[b´j´mè{Œ0Dãš¶5æËw5Ö%l¹u,­i¾YuŸ!-þ÷®loÏ/øgàVïñŸÛp›–è´_u©{;g9¬ï˨QLH‡Ã“º„ÒpüR;ø?kÐE€à°Sk}Ùo¨ùò÷mÙUÔÆý|öý˰ €ú¹^w+¬×.¿Ã é8UHè Î…o¨Bº<òt_‡ðˆãÆôüžÞnvsÏWËô/X`Ñ"&ÁXà€ï vg”ÏïªÏ€¨xåq.žÜÉx’yø'Ž#¿—ÂŽ‚\ÔÌuøqP«\<GY5ùá4t„ˆÕв6Â/ŠË*–‘ ©i¤·«ÂyÙÏ«üjøkXG>TàÃf»Œ3 ´¨ß›è>HßG銞Û>™gêv¨~‘]Í˦cº†³:ƒÓEN²\ì¢kH¯l꺔 Çìá'šop‹©úsâ#²éÛºzGm¢<ïWËŠ$ÕƒC¼á[ØTT€Ú°©Ë¦þ³Ä™{ê퉤pŠ¿æº«oïbH¡´ÚÚA¢Â¹™M  áîä`÷5+´Þ+DmUM[“M†ƒöà-Ç¿(ÀWí.åÓg<ÚéÎ:ž.ÉË[t¹ñ$t(´ƒ°˜¢µ'YIú!mà %æŽ:äQ¯éªrñž^Ö[(Ï×MÝß̃° Ü/Ëjs™XäÍš°ua«¬b:\¡“U~’~[A3DìŒÌá$Suø£6Ênºr hAjÚÝ“(ÀÙP|vX0$=PZµ˜êf†ËQ¼£¯)³¨“|!÷ @6íÀŽ&)i‚þnÕÅia!sTèÀª]11À³ŠÉ7¾`ç”Ä8B°­›Ílï‡-aËlùÓÇ3›)§Ç#ÁÛÃHNOœG*nЇS’ƒ6†2>»jÓÕ‘žØ ´vôëq®‘…z9Î6/ÁŠT=·pÈßet uù3ðÅÞ:Д6LÙ½ ->ñ†j°·Ëð´ ]ãË{j×!\@¿-1=¡3M™X˜0.Äx4x~WvåÈCªprà3»+©˜â#u€âéed%TuÌ}Í{/Ë ‹*®¦¼-ë6”•ðy´CGynuC[$¹gÞ‰éÅÿ0ÁdR7±&NѦ&yJAÂ`¿³ñ_Ì®„[°f[dã¿As_x–æ„ x% Ô ðKŠu¸ÏÃ;#V(¨Ên€œcËéëûšlçÌ ÍbÖ[ÒÜ‚fà:jëàÿ¨á×°/ ‚¤ ±L­@BãíÎãøºó8¾/ú³}íB3HyŸE»÷…?»Ïø÷Râ(;|–ý´õárõÿêm\½„Õ‹xñûEtÙ+ñ†OZ¨Oðm¼tP[WË'± ŽÙД‚sPkýÛÅ“¸¤ÏõôÝµäøŸ$¤`¼lÇž¹±Òÿ»Â¾á endstream endobj 364 0 obj << /Length 3066 /Filter /FlateDecode >> stream xÚíZMsä¶½ï¯`UË©’ à§ã²Ë_¯]v*^Ù9¬÷@Íp$zgH…ä¬$çÏçu7ÈáPÔ¬T›M\©\Dhht÷ë×ʆ‘Œþ6—¯ò÷§¿< < xx>þ •Å™7þË’ÓÎ'Iþã™Æ.O{i¢­½80*J¬·Ü>£þФ*KRO›X…‰×ÞúÙßž´“Çk÷1$cì=PQâoœÆ"9í„ä—çÏÎ^ØÀ˰q{çk/ ¼DÓ+ÞVÞkÿO‹ÓÈD~StMY¼+ä-—G{],Ëu¹”·mÑ]Õ«Oäå×@GUµjß­¨µxsþÝ“öŸØ„^#K3·ÿi'$Ï^˜l´ùÀ;ÕZeQ${¯¶ëWE±zòê•Ä¿QðäùufðfdˆTä»ú¹?è Ÿ¦…þhó?a'°Ÿýtê|Ï9ß§õÅoŲ“—z-Ïå&o[x›†üxÁ–æ‘ÏH•©/ôsUù¶è¿’Ã=&=ø4˺ÞUË®¬«Ï>âa=6t'q;=:ÙÿuÞte¾qÊäÝòJšeëyÓÖÒZ—Uñ_ ÓrUT]¹Ä6ÿhúXýþW°æ?3'Ñ áÿGýÇ[ãŽü¯õiœÿôó7nŸƒõœÔ=¿9D¢(U¤D_¿ ¼ú¿c·K½–Ú‚0½÷ 4‘I•9 U³É(ITІßw‹SÿuÑ.›òšò kxoõĪXù¤Õ³™ÕãHiâ0w™Ób“}†VYŠ+‘ù¹-&Â$ñ»«‚)h`»ÛtÒI‰˜žy%Ï—Õª¸†N©_ U-Ðp’_!úõ–ñY5Ký/ª|s×–n! ¬—_}Á^9t¬›z»ß;'çóÖë[ßCéÐŒT±Öª4н.ë¼í0±ûZÌþbpÚTã:w-1–«™[¡ Œ‹'I¿*‰™”¿ã+¼ÌimK-»ºiÕ|,Øޝ?<Pߥ”2¡r,ðh4üXWUq™Î& ý¯ëÝņۑÿj¡¡Õån“7ÒñË" a«]/[,%Ü×™^}~å$.ò–Š)ú6ß\ÖMÙ]medYKÌäeÕðUç/XœÍŒßäÕªÞ–¿çŒ&Ü…iPŒÑ«®«—éÌZÁÍóê—¯¥qÝÔ¼ãeÑ N°›€CØÍ}Mã¾-A.¡¼›îʯò.Ÿ£×nÊÛš9i“d~VCÍtnbêžñPú°-˜•·"D^JÏa^ñÒý$='¦V”Îíæv»ëJø©|ocÆ;cÙDÅE““Ũ€+>Î;‘âÝ`x—Øè­ôñ1àdá¡6þËNºÉP$xCÓ›¼µ»²#»‘DWKß8ˆ¨eМƒ3‘$±ƒ¶´ZF[H{¼Ó(”Û빆g7¥¤$ßPoä¿cHlÊ\\ÓÍMúÒS| Y3°3KϦf‡ke"“M_UÑäƒ$”v úáÃ…ÅOźhŠj‰‚ï~tG±JSÛG7î—õ®kËÇ –$´¥õŽ¢- pƒ9´E°0ªñ#PAq¶‘ð—âí(€½(oÉÏR„K±"è÷8¿âÌ‹N®t9¼VÒ1¶½ èkÆw8±ò·â;|r'=½‰ÿ¥t8O•ñ£›z]7Ò¸ø†w>b›£I‚/ï²äÃØ€›c€Wd}ï!3–Û˜8@×PR((jZéçø qá‡q6 q&¥ÆªÉIæ¦rB̃XBÀëƒßâ|.vùi)6ãd#=¯§€3%c”‰‡Hø36'8íÛeM¨´ÆA37¡J“Aæ—™YR˜ñ$ú͉¥ÊÀLv¿AV(f–¡R~dÌbÃÁ4}\L£Ë›K rëœë B§BÿϦZE‰Óè|‘Z?gâ`uä›Oàý@óq!Àì+xÊŽÑ`LÞ:þÌIgò¯•ÐéÛrâHû.¨[7UífÓ/¼SæàÆ>WPV²™óhÍWºaÓvs¡¹¬7»m%'yI©yëð´-´$lM™‘Gjyîz`/«É'Ëœ’ß^6ì €I¼€QJ‡½¡«ízÎ2h3Ôî&OMx9ÜE3\|e€Ö =¨\éKB ªôÛza5òtŸÆøÙì*iÈ™&ã3Ùeªlêpæ‡ß×ôW?BO*ƒ]ù"4Š€˜ ’1vàÑÂWØÑ.«Š0äºäÀ3§ ¢ }à ±fÚBË܉®Ê„ŒR ¿'E©ÆSIÁë"› ;t©¹ ŠýßàÁì4týk-1'_ÿΜPlU¦pq9ãþ)ÙG>ˆ!ÿÜŸ »IÓ=ˆÊªu“oçmqNw¢Ä¸g¦ƒ]¢ÁvßÜ^ƒ–¶ðÀWE73c … àöOѹdÝÍÓÊ`ÛÁ¾,q¬‘öQ«GmÌiðï©€Aãc+&*L¬TÀÑ>·|»BÀé ú3XCÿ#Œ i!ÙCg2ÃMÚ„¡1¸Hb üi; “#*ºÎ{ºÖ¿Ê¾­ë]#ŸoóÀ@ªá'o?™sD»ÕõQ)eR˜J"þµ %ÂÉø÷BÌÍ5•RóS#[e`Å(j`‚cIKÇ©‹I\ã9"àŒõLöŽ–Ûùç‰é†®­âšbPåýsLué =Cî°˜D%Ž:ßsK(³Ïˆû& E6}?Ÿ¤Ãô'sh½ÓÇBPlÂ〞D"Ðûƒ:Á~qÆ£(MNotŠãuO qä8DÃ(…¡~{ìì Hx`<{aÌû›Œ¹¨áˆU…’‹”LH‰²¥¿#TÁg:Ó!?â…sì3‰@èÛü}.*É ¦Lãðˆ,' †²Nbÿ=HmãÃCÒý!i3¾E¢~¹™£¡¨qÛŽ.Xœ¸ûÎ.óÀ¤çTНs¾õ›YAv`„rÄÝôr×oŽS:'~`tM.§é *ñ[w±¼,‰….¥³î̧ŽÜö5Ùs·c5löùŒµ²LaÒ}0žÚ¥×U9”iI*ªcû¹íèo8'ËÓ¯áÖÏ/À¡ŠnnÉ1»¿¢f7†Z. å½rt1;$‡W~|cÁS?ýº"œK†Ç•_$‡þÙ?³=:„Cw‘€ºÌo™Ø+Äšö/eðà‚:œÏBœ}=t‹ºc—ÝO–ú8³ÆÝ@BÖ]–R)‘Ø罬ø]I=°¨l5j™J^/ä^mBülâ¹rC~rÏ…©³uDxpaê|Ø…•±¾ïÂtäs®„dkö5õ‰ÜÏŒ¼—ss´ò6ïº Î@ŸË¥Ç®›îKkr]šs¨*Ç΋:=IÒûÎËu+c¬«°Ç‘ʇj;øÒçÍ|ñc2&’}‘W7ýía——GóútQv=ÖU5œ,§}`óCDx§Â4ÎØõ³HËÔ¯úÍóPÌjq6`Àçì6TfÇwÛÉh:&£¡»â' ¸íš|ÊAãzz¹¡u¢Ò8:έ2”×Éá‡<º%Kàj@] ›þg•øH‚ê"Á×?ò%vða£Rí>½ZØÀïºkúÇÿ 9»¹¹Q%!@@?†¬v” TÝ\žQ°¡Á–Q°µgM±)Pàœ±¸A]ÚOrµÀ[·ÝœQ %Ël7 ;PíÔí.†=õˆô ÎŠŽê0Sáh¥ Øé8f3sšñ¯4Ò’J—GÅEÐw“oÜï-¿-—M7tט“Žw"Ä¿¾°³ô@ñ¯úã —¥ýÏC쀾*Ÿªbuøépó#%¬Á÷Gê˨¯/'c>ºHÉA”Æ£t?2ŸzˆPÄM€Zš. îiÿ‹v2uóó.º endstream endobj 224 0 obj << /Type /ObjStm /N 100 /First 905 /Length 2929 /Filter /FlateDecode >> stream xÚ½[k[·ý®_ÁIS$çA²pÒ:NíM Ãv6†QÈkÙÞz-¹Z-üûž¡¨Íj½+]{uxqâ{îpgÈq¬ê‚‹5»˜Çâ(’‹¥8 8Vqš“K!¹Â„cq¥à:FW“ÉUµ#»Bš¤!íNÁIÉ8©.FŠe'Y\Rœ0—’àM’Ú+ìÄP;ÁÏ줺Ĭ\¹$w +eLxMQ$r‚°ÁÇ$ŽR¶uĆ”²#QˆÇ‹)G»SfŽ*48:Žœì;ñÍÌŠÙ±˜&Xg|ebu\X8CWÁN ´ÈvRÙ$Ip†W¢±o—ä Æ>…¾†qÂNC°è:BXušLu’¶·Kq*ö.©˜'IƒÓ wµVü„iȑ친ŠÝa—ÙÞeÁ{4›µÚIv¹˜ä]®xu¥Í bŠÛ B}¥ÍWfWÌ*. ã+L¥H5õGW2´Žëœa/æaöƒ' ¾JÀI^|N©†.C|Åc`5Ù¤åìð °@`»SͪL€Z3%(‰ ‹Ù "Lj 0ÐI³4›úvÇÐR2(ͪAmû‰A`mì>¿Ú½š€cP{Rb‚ñ7Gˆ$21I1²=a²Q͆ìµ1ãs(ÙY“‹Ä£˜ÚdDãžE²3±³lØ %{BíW–2¹2}þÛǹ›>X,–ëÉô»åêõ|õ"À=ÃËéÓ§q˜/'Ó§ó“µ{˜¾Mk)¾Ys,þd¾à1a÷ìâÕ2§?.ÞOÜ¿ßÞ0}p²>].¦Ï¦ÿ|ú£ý}õn½þxþçétuïÍrõvîW÷>®–ÿÅ;<.§O§y»Z^|üÏéëo”ë×ß~;Á¿Oðöw¹ö²›áÇv±…ÏR½bf¶ðYÕGÓÉ%üîþ}7}榗ϗnú½ûê‡7Ë寛{úÚÝä°âjò÷ôp"seƒy¥úùj;;=_Ÿû›•÷avzöa¶hcNo–ÓŇ7÷.Î端¿=â«· cGOƒ‹»ú‹_0í'«Ùâ쳓÷³·óoþñó£»­\—|hî¨^C>–uöósSì¨ß»)¶§nú¯ÿ‚˜ãr†]U·¸8;{yÛ°Š€a‰ŽãP|Ù‡ˆçÞÁq˜>Å4î‡æ-)!òøŠ¹6H9[‹¯a„›>\ž-WÏ`sG›GžÌÖëùjáÒæòo¿®?[ÏÖsÛÉôÑr±nÞûÈÒ_è=²”\×/ŒPH¿@:ˆeû‹¥Ÿ ý6“BÞþbÏÔí3ø%†í/p䘶¢MÚå|$nßcy"^JÃ/i#ß:}²Zž<›Ãrñß?rÓçó_×îå®õ?[L ‘Åz¾XŸcvÛãfòçË‹ÕÉ·AÛ­Ÿç¯Ogß-uÍInÐ'G˜!ÌÿÉlÀ)›áͯÎñrãEÉhÑæ˜û±ôãFF‰6ÇØ©©¹»<êò¨Ë£.º<îò¸Ëã.»<îò¸Ëã.»<îò¸Ë“.Oº<éò¤Ë“.Oº<éò¤Ë“.Oº<íò´ËÓ.O»<íò´ËÓ.O7ò^'o•ê¯e¤©ˆ/‹øšpOÓ)ë|Þš·&¬ÏFFã+”­E½)'…èŒCkö±…Ö`\¼ºD2 –ÌžŒÆf$S¨E‹øÀñ0–4dr‚‚žyc–šÉ£Ä9Œ…FÀ’A ´–þØÈºâ“9ÆÂ#`!$+¼„ÅŠ‹êAÑc‘°$`].Ù[‰¨„©¢æ¢#@‰ìÅ NR+€&žòµäãaéAE* X哲Ï(ºQì ,#8p DåhŽ£• tH#é¨%©/ˆð¢Åçû€H®PP¹É˜Qàˆúl¼‘ÎAE³—J¥1ûlU_‚†Po‹ʘ¡!â ¡¼2šEâ­Ò&”Yé°ñŒ¡œÎoë@À`þ$¯MyrƱfpñš¸*UPmTŸshW窾j5RÕìZBö%æÃ³EÇWgˆ¶kiÆÒ’gµ…üƒya†“À JÛÛëÎT`’:Ä«iœúªá¿0W¶ô‹üƒ4B^HœÁùÈ¡4µUIŸe¨†FH ­®j»°æH¥m_å:TC#𜠿ÙdÎÆٗÔë¨üxëà!ù­«@½íh'Ššh¯ƒ X:ÔK*‘@%ª–CácúS×H„ûXGDDòVÛvθ/{"Çn»Ý±/UDI§½q÷Op‡íWi´ŸwuX .#÷û>â––-ÐeºißéÊ.Ö—n(•O7”ò]7”rßÉ}c$ë17DX­Æ²N!DJØgi;½ ÆšsoñÒ¶›¯À ˜:Jôìm#ˆÁÀB´õj Ì7‚89]Ï}øëchílþa¶€ŸòñðP_Å(×"Ž*²A±†_ã>8OOÞ-OÞŸM¹îy˜ äk.€8dûCÇY‘xp”-Š”"ûǵm °=FDæz@h‹“l `ÑD£¹êí{Ìíå—NLFѶjÏöªŸËk±Ö•›6©O•z—(@)^ÖÊtÇ(зUkß6­}Û´n>Ïš¬6Ç£n—&Dµž´[w‚WÒflH7zÂü³cl^sÈhÕâ Gÿ&BZBe­È”xŸO~7_­~ƒCæ#¢A Òú;(Jâ 4ß]Ü5TíÎEÁ\S„ЀdF)ÀØ!âËÍÌr={u6?&a±•:¶®Gðm®‚Î Sµµ7…R´ƒ1n'²%qÈ^j¨"JˆÛˆæ·i}Zþ~úá‡ë6‚PGiPÒΰ=Aûú8«&-6ì÷{ß’PŽL„Ý£WCçNìÝéâÙiÜÙ ª·wñXkoºé"ú4ܦ;†[êmJÔ¿ÍZL7ÇÔÔÛð+ý¸É)Ô»}^)ܤè+Y³°‚•€ŽØÜ+[sXÚgÖ?Íç°êxDƒ­ñSJò­]7f/HN¦[J²7¯.óõqy·µÇÙÖ a ŒÅtÏ`0Lú‡jÆÖéÄH«ÅcPGÒd¬$6ïÃòdv~r1;»÷3lz¶X—QEªVÙS¶îÀÔ:vmË(mÚ;a³×óÙu&{WóRla‘¬}×ú´ T›EgÚ›8y7[¼=2[ ·Füʰ¢ÚÖ[y@ËŸ›.îXÁÇ­ÃÖ‚`ÂЇµú%U {ÝêÁÙ«ÕéÛwë»ZÍ5Vë…ÕDk·¶ŽyÔCÅrB°~€}¬"]Ï 4,ƒÒõ j˺\RKï fýÆ"`‘ýÇ ²Z™EwçÕŒx{Ý)M®ÔøÅþ/ߨ?{uµb' _ɼ_šE7ý—;YtÓ¢94‹’ÖëY´÷ŽRï¥Þ;J½w”zÏ(õžQê½¢Ô{EI·Ï_ɦÿ¸• Ì endstream endobj 379 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚíZÝsÛ8Ï_áI*OcF$%Jº¹>l;mgvo?Λ{Jû Ø´­©,¹’Ü6û×@P²¤(mœžÚt¯±ù‚øÁq'ë‰;yuâÚïg'ç/½`Â9‹|_L.V“ÈB2Wù“‹åäÒáLMgœ ßùc*¹£‹U^lãl¡Ë雋ŸÏ_ w±H …‹ÝÉŒ‡L†­ý3ºéL†¾ó~*BX\&yF.óΠ…N™o-ÑÕ>I«Yb(<'N×y‘T›mI³qaÉò]•l“¿ô’º‰åøüÉËñÃ&Y ¼ MºÜ§UÙ¦îÔ-“u–¼v¹·ˆ3\R¡VFs$¤G¹›Îpûz9ÛCSJéÄÙÒ6ðËs¶¹Ù hউ¶ìhVÃü5ÍÃáÅk½µógD k‹$NSKiŽ ¾Ó¸Xk¢+qjå,ã*ff·Üc‘çu·|±A2_8y:åÎRÔ›ãGkÖ%ä+"¨hw9Ø®ÈÌ!Ãxm `¶pì2² Ì—U’¦v {?õÁbI_¥uô•=2$X€÷”ÉUj×^á‚k;·\&ÙÚ¨5ëè¥H/ÚŸήÀƒö>Z/ŒZ^èù,pѬxÌæøªˆXà‡5U•Û†ÿÁûÛ³kj¿5Þ|m{¯]ßÕlͦ3_ºoÍ!_lGãpIZ;ÌW«RWCûTœq¯&]äEQûJž-ínl~N(¥Ë‚Hv=#ÙîÒÆýâŠ.$˜‡<@9¿ýú¾óÍMSpÒ¶G=T÷Y¼Ô1 PÂasÆlÌ_L. ™pÝÐRP°Ù°”ãçίpiròã$´¸&IËœ¾³¼¢©]}0ÇhÐ\I J¬"Ö…•“&SNK*˜ãÎzènºÚ[7‡KÕ¸"Ü5äsÓvgžßØ#Û®~ªeÈvй¡_¯öÙÏûŒdí³” dÁ ß×6rî³7. !âéÅü?/$zœ…ž¬ ÿA`ÒƒM´>Ñ\7Át.ð·l}ÊþàQ”/.NÞ k ƒ„s9ŸønÀT0YlOpØ!‹‚pÂ…bðz²:ù÷Q{¹»~cP2À®/ñ3RDÙœÛ×¶cWxl•ð˜rØFÙ0ÝC÷xþuQÊèm¢ì pÐ1·ÿôhæ*„ËÃ\½Æ¯]©?HÌë‹5âÙóÑø±ˆƒâ Éõ=‚@ ná\ò7!ß;…géªØgº:µMOp×uNù4=M Mµnf¨-U‹^ù•Î’}y:~bƒ–Xz k±M˜Ã|VÂ+ujWžÖ=¡:-gpê¦î-²QÀ%—ì2±¼Ìâ¦g8—Àè¼8Lb7=Ñ– ‚"¸fèYg%¯í åùKÙËÂ;–%Ý0IÀï5¾ãØÀKJ3ø`ÒÈ!㦉ØÒnâ÷5 }•ÄeŒI-vçôõÞføÇÉ]#h/|öìùw‰ž÷=ÅQ#(t½Ý.$ºîP}6ÜŸãÇÿi•"ÅIˆÜ ˆ…v˜â˜‹&h}**uÂoù(²Þˆ“‘‘g„Êæò½¬³Aj€©„EjÓÐ1‚<Ü %€À–&ÈБ=Œ`Ë %ø&;mFã} ,CÊM¢©Â°¤ÑCVw †m\Õä†mf ¥[ù¶Ç ]x€î"7Ë–š àUkÍŸ *‚®ð ðb "šfÁÎ4œSņ,üÂ¥4µŠ°ø«Æl¸,ÎÞRK#Ìy·”§Dn@!ÌH„aäÔkHh¼ÊÓýÑb-ÉA®j%tÀC® O¡ÈÄ”¸y$WŽïº®'ª ‡B€£ ŠyíºbÁDL¹¢¦‘!ñ]ƒmˆµþ¸+`WFßÒ–“€`WEòp¥†¡âŒ–±)VØžÙ,À¬T2p|Kcd$5i¡W‡øÞƒ#$ë¢A%8âS.àn¨Eü€ùÒ;h 1Ëð6–KòÏ…8ê«î¹îK³!U^PÃ<Öf¤í%*ìq«0Ì.À¦ÛÌ–æ<Ѿ¢œQïæùÀ~aX,¨1f¶â1¡šÂÅ|ˆ ¼As@ï?Ðæªz—:wŠp¥ì0ºñЦü¢´§†@½úž£± S> œk:NÁCÆ•ªâ~þä Áín5²]ΛßBP*tUB³é5F8c¢½.¶PG†8AáKpð¦&ðçnêã¢úcÉ ° Àz8Uª@{'룹ú…e [ B:Š 7 §CN àA÷›+Êhý Œ¸}¿~ =1ÿþ wÍóM¡“êG¨½d"P\¿Ð u“²ßHô·ºÚä˯åß•òÓY>îýxüÝĽ1JIP¿ÎF0V¤ò©üoðGûû;܌Ń»wWÀÉâ-ý,:¦het«³C(ÿ:^ö%ñw4ðâ›E(‡Ðw¹¨µÁÔ Ä¦je»Šy¨;šò_]fü 8¿Òß³ð„?†8æ‰LÒ¤6€vÇÚçoºHVßóÍ-ô»}Rèßðïâ…~pºÜñQ;}–äWq©OÇTàlÄ”Â8>ØBWéõŸ>‘UÔ1¿WbÒgR~r>^Íûýæ0«w#²4—=b‹OØ4ŧoó‹Á½DyÕuit½×ý?I€Â#,òín_Ùã7ÿä S`†Ž›68üF许GõðÀÝWò©³ƒ˜QEŽûŒ4î6ú‹‚•Úïö99T˜LýÂàÔNúcUÄ [‡Ê³ôº÷^4%c3Š%ãoŸªï=:•ñn7nj… ¸½Þ’Ð\èa—c^’qCÕ›1ÝMÝîn뀴o^ˆ6î«ÁêóÁôÂæ¦µ6Â̦êfÿõæ<´ÿ{ãÆï¿| ßM ñ–1ŽÂæ-9r9ñ·ÄxãˆiJ-QþgE©{ŠêZH¦Ò #£‰êÛ)¼MÒ×ü× áFÌu£É ð™[C‚ðȰòââä¿ÔP8Q endstream endobj 388 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚíZK“Û6¾Ï¯`%©2U!x|x7»lgSYWÖ3®=8>p$HØ"><žìŸßn4 ‰´Æ%MJÉ$ñ…š@w£Ñ@ 3é€ï<›å JÏW/Îxxßý9ðæ¤”L@£DI–Ê,˜­ÎÞ¼åÁ>~ý³4¸±MWÐêP,ƒ‹³ÿœ=¹<ûæ¹äAƲXÆÁå"©b"ŽƒDFLÆ"¸œo§“©”‘ _M¦Br^¬„Æ@=œODÈúõäíå÷gÏ.÷©%9‹ýÛÔR‚¥)¨%ËxBj]5}e:§“`Jº¢b2™L•Ê¢P‚dÔ, Њýµ¦þ¥uN´+Æ,®³bIj;c¯ˆËaïú'.T»‘£ ‹”[§’XdLGéCÕ¾ü÷s×G2¥\Q3©6êK}·aã¿Ç¿É°b1‘d¤Óå$Ua~U‚eT,Bõx2Õ\„?Np¾›Eݬòjæ>¶è)¸Áë2'°ô|†­¯ ó~‚ŸÝ×+¬ÜR‹îÚ±^wŪøÕ·yúõ×T(VëüÊ:ØÊTص˻¢®¨?èAíÚzå9-¶¬Ñà|hkki¥`lå²nŠîzÕ2kY¿œ¾y%õhè¡-Ý]„ÔáwõD‰ð¸%:ìjzÏŠÎ8ʵ+¬Á ÐðÝ$¡KGD5@êhP×”©twjR÷}an¼â%"'(( ón¢5JxÔùª¸êÌ*ƒ^Ölí9õ-ªYÙÏ‹ l»$Šc‹’–°š:ó×¼…‡pb«95„‰Gi}^nZ<& ¾…ÁˆÁwž¶å˜xTËÁÊHÆ…´à,‘ Ò#™²,Iƒ¨" ,`-£Ìá»çjÜçh_ÒȪnÓ8 q:þ/_ÿðÃ)§9¾{š—ë0*jªb–ÁÚ¤d¼î(]e¹*a:ڤ㻷M¿Éþ —0šÖ]ηYáž,죔ôØÜ'Š*ºû $ÐǰyZWó~Öù»p7%–Ï™;\MEš²T(Ø…ðËË1áæ. á,ÝÙ—8Dwßê@Wê¬yøãDI—âS2œFaŽ/¶žoª¶|½-Ú±»K–çf‘÷x•æìïÁ|¢ìÚ»}o<3&Ùà¾-jßÌlÎIn@€çrœ…âW—‡:çÕ;§Ã‚ÞÊ]VmÏ9TˆÙþCMÙ…B·Æ)»,寔]${ö9eÿœ²NÙÿ*)û=áû(e(žÂ’»F´1 Û˜ôÇ ïæ>×–'†³‡oYVBµZüN'"ç'\/v(êÁݪÿÿ½‰ˆe€a1ïŽüÏßÑÅR”lñ”çÅœ tuÿ7جXÜÅÀR6 • BawBµo!“'L ••é®kËvŽ˜s[ûöy7ê9«Wë~ûK Ýfp-e¡¿çue¨Ô·î>Êÿ–†_ýö„•Rþ‡(±aÕº³,o~r»“Ûv|JìŽnß"¼}k‡ýÚÁõšÛG7Wgö–š~í@÷{X‚iQ¼M‹¶³„w‚3wc¸¶FåöAÿ8a±Ü$eœVlc–G{ÒÁf›Üm¶/©Dù1c´Ð>žI éæ&ŽÁ^í‡â¯ô@*4ü­¬¦&eN±4M©w6h þÿû±Á’ endstream endobj 394 0 obj << /Length 1573 /Filter /FlateDecode >> stream xÚíZK“ÓF¾ï¯PÁE®Â³óÐ<´E8P¤Xœ\²5¶•HÖ"ÉÀ†?Ÿž‡¼²Ö뵩rØ >XšiõôôcfúkÉ8˜8xq‚ýýéèäô9ÅAŒbAE0šG(Ž¢@R†°àÁ( .ÂwZ†Va’×¥k½Ó“&+õàÃèå a8¨fkœ¿8 .€+)¢–¡Ï’AÌ"Ý6NÁ8¶iÜ´¬Üìór@UøÙu«Rê/—y6ÉšüÊÑëËÁÊT'á$›zj3_Ù2+«¬™ƒV§ÓVüЧÖ:Í3£K0$Î3CBP̽g Ý€.CP&E†ëô9p\{CÊ‘Š…ã¦ˆ€C@Çá/0and™bac”œˆÑ–©(¬t½Ì'q-> ‘(ÄTì$ŽŒ¦T®Øv95w&®[Ã,¹g{óú¹ç_.SV;B²ðƒÇƒ!á__Çà¤Eá$OêÚkw4¢ü™Z`†i¶IsF@mÚ²=2NàéÄO3/óÔ«2¶-›¹ë6­ï1‰ÀEMcCšºq+‹ »pQΣl=^få caš4‰iác»LÊeãúv:Ã.:s«±ˆÝ+,Ù›DX¾¬ƒîÕrö‰{q>|ô;…J"LHaØ!D“âÄÐ#ªP,U@™Bƒz:˜ž¼ÝK›Ý-<'Ät%ƒ+WޱG;oO«îÚ‹q F°ÚðfÓ½¶+'H9Þ[¾dÒt¹1ƒÁA`9ûD'¿Ò—Y¥ß$…®/“‰¾w¶ö/Šâ®m”ÖHNöƒ§Y9Njýà<Ú_83îºÚ޳Gt9ˆSB,´É%´á§½… % ‹¹Ù»¼ÝÐ}¢>:ÿãÙW1?Ô‹nJ`1þ¬?ܦìÃvâµ3Rã!½ìÜ™yv°y¿ÙE‘€†D9 >ØÅþø÷±Ëø¦c2¾¹ÛŒæÚ.­?±©µg¥‘Aà8 ½¬×%äà³[9¹Ü:LT7铭ç:i–V¯Åx]ôØá,ÊêÓ*Yüí°­Ò뤸ÌW™ÚÅæŸu“dy½Ýêâ<óƒÇ1t³]@ -;X–ÅVöó7/¼Þä1{õÈuÚ&BÈ·¢(V‘¢„¿rý Ey"aÙÆ&b*•ˆ9•)Qn Ô‡­^N³ºIµ¬0ÆU6i5äÆ{e®[µ‡fé21~tãx9’#¹uÔ¯®[ŒxÓ9Á[Œ² ñ­±bž/k]y%꫺х­óä²ÖémC©HŠû©àXÆdÕ&”øáÀÌ—JýzÎ-”¦ç¢Á \¨M§øZ--€¶ý‰) ›Ãã-*6ÕŸLýÕü”%îY§ÚT(h@i³ÂÆ*p$bÒ©ŒÜÏól2Õæ+–”ž¶Ó*¹V·XÂÔ›qKÝB"‰$:uËêÜ×r€J‚°ºQÄ ¦ü¡ª°ÅŠ«c5p¬þ/ÕÀ®›f§jÀ§Cî$€1­+ŽEÇ·wT†ñŽ" Ç}G Ö¹7•ßµqÀŒª‹ÚHêºÉŠÄÁ6ŠÃ&©fºq€\e_\ÛÁ7h\Ã7è¬à›tð H¾A£ig˜é…ôîäou ›ï¢êîòö—Qêq²¸fªÜûo6Kh9„äĽÏeQ ®‡÷«ÃzVá$7oþ äg3GÿºAcÉpä5ñ»KáûŠügtEùI Aa?ò£°gd¬ŽÈïˆüŽÈïøxòû™{{:¾¹m{´ëµòxxÀsÁ¡žU‚½vgcz¸+ÍŠC›d£„å;Àò òáR»W ß3$án|»Lr¨Þ0œ‡cÿ5z9-«Â½Š6 Ôæ‰•ºöCýŸ ìWÜb_hL“ISVÙ?ö²ç­ì3NŒ˜²¸4’VB0ÆO_¹öxY($ä /×Ë¢Hª«MøS AØ}ÇŸ1AG7þ‡ A÷ø‡‚Ÿ+¤=ÂÏ#ü<ÂÏã‹Ç ð³sÔßGèöŸevŠâ†LZ/Zç}OHFÿ¯†B› endstream endobj 398 0 obj << /Length 1943 /Filter /FlateDecode >> stream xÚí[ÝoÛ6Ï_!lª`1+Š"%ëÃ:ôcZ`…‡>¤yPd:Ö*K.)%Íþúy”c+NgQ’µn[<žxŸ$ïGºa÷‚•Ou²ÖÄÏ÷¯÷:<ø¾ù$©·úi9ûÄ­8?ïQÐ"ð¨—Ä$ Ô'<^>ß3ô(LH' á,ö”ô¦{n¥ÊÍÍ ( <‰àS$9ûDà|1Þ{úŠ^ BBá§^x1H¦Þxâú?îxÈý·µ’øô¹ÍÊ¢9ÇÆ\fºURc+ëxòz¾h99Àf1Åïfæú›LÈÆ ‘5ªøâÝ@ UŸ9y¶4þc+Ãcð,493Ÿ©3¼OΧ¯ÂtÅêÀQJRÎÑhÝÎç™:ßZúM9AÄÇ€ฃíe0c†Ö$xFÎÑÊXuõ€–<—úu]¶Ç`LÄK\¯“Áän¥a/£BÐ&nÁ< ÄCeÕ'Lr½È”–•ÔšgÚ¤>…œX%組™3 *­}ÃͰ¡€Á ì?ùs8’€\E,ä( KRHã$‰VH#΃^L¯’`—§™êT,ÊYÝʦ‘NEkÎÑ™…(.u1%c]}ÑS?!! _Õ5!4Ñš®1‰’8NÃ'ÌkƒúüJõèQTΙù¢µ:Û'’•¥3±Rmu­—9¡—Ã¥ÿB$­ºti%<˜«,ûn„L\]Ña5O£È¦cœºtü}jÂ#ÌŠlÖì(Œ}Œ˜ðu=w”…*j…ÄOU½&þY)''®·vCäe¦µÔÝ+r×°6Ø[TØa—~C˜dMÛBdÒÈI~mô@Æ‹ÅtdÇàÀį[»‚ATœ-«Ñ±C³8õÛJ· à}©N -'HÎËVCì‹êä‰FÊÂ*Õ´Vó¬Êíë î^ö·{aË,Ô‹V±ê|?a>¨ÏÒÀwvªzÑï!0ODŒ_¢k™åyBý7R9™gûF[|nµ“o Ú…‹™¬jÔbQäàÈêÓ}NREv\Úwz‹P’¦ü&!Ó‘i5?BðivLÓº­Œåiб!è` Øei&ŒZ6&’Ô¤QÖ ý¤85šø™70ì@×Ù|QJý[9h2r¦`,¿qvá†*-s¡‡ØÃ¾æ’i–7&EaËóÏŠffž"¿”¨C©ŸÁHQäGFàö¾° |Þ½ì4Êa1¥?ÞýºÁe4 ‘è8L`·/Tî¾}9¾\ƒFŠÎ(¾TƒÒ”<¶‚“ jš1³…,2öh]U»S¨jyCþ¸ª*Òk»Á*W_ÉÏm¡ä»l.¡ZÈ壳…¦°ž(5H£‹Ò ÇþáEQC­ Ò€Á+lˆ…lÊAÁÂó­7ø.€9næ.ï&tŸˆƒßÿõrà ¢6è•ñ!ã„ ¾Ü{î î:Áß*ê³EÙ}€¾meØíÉôÚ?ë§!5EÏ™ƒLysßÖÆçÀSÀ€Zg*¾4­r¼FDó1 "/VÀðF ¶FÏ®½Ò*ÆlñîT~³É(†»ü…Q,M.p\g’åƒÚuQWØ^¨tÊÎf‹Á”cV”røÊÁÄV´Æ^x†æOôd¦¤^Üé…±½¬=ƒjq‰G·7Œe ]h'ùF`›,y”¡¯#ð1‹ÒÞÖï`hÞ8üZž?VH2J8¿ 逜¼ùž ã!IßAº¤ÛAºoÒÝôê²wo¹Ò¹ÛË—†„›.]Éw¶½KÒËËHv‘»¿Œ\§¬„å¾=0J¾l»±-½zṘ6éìVÝr>”¨…~}¼¹ïyà<>û¿Ïƒ®ìÜMƒ­Lš=ÄqŒxôÇ1ñÚ‘†HÜiCK ˜‡öqyq̸ðk‹9ÇÌ Q®Æ¾¦Æ®OörS.°UWPPÙþE¦7Êû™/ôвਹ°´%ü<«ða•rÞtÃéöxŸúæÊ—M'Ëi2Ût+ ƒdZÂÐwo_m‚Ð)Šb ¡!ÂÿI#(w÷Ñ0‹…äZK2+=cdÖàU¶iÙcóà®B±a&„–à‘¬‘Ö  Y¼na.‚Û²É*Y·º<ïîãOH |.:Y›¬¦ I‚è«VG,¾Æj;¼¹ ·÷ìµ¶tgX=uNa #ºé–ž1_Ë‚·|( [ ±~zŠwº*Ûy¥+OÀ[`g‰'*ñïën• Nx´â; ¾â; ~ ÿdËó„åÀÚ¯‚§…ÒŸÐÀ‘º-ôa H&P^è[ü€vh¬ró$±À’Ã!ÞÅEð³A5 ] †‡h®¼ünßáN—ùßüü–Ýþ8æ–Ã:<ÌÿЏŸàìÖ©áœ|t«¤¿·#‡0ðDSÀ …;¼¤Û* Xí_K¼×” endstream endobj 405 0 obj << /Length 2141 /Filter /FlateDecode >> stream xÚíZ[oܺ~÷¯¶}Ð^F¼èô<4@|Оô =qŸÒpª˜s‚½°oúË:Œ@܈žZíÉAÎ=C¸U›cÛá6 O§”wLÙ&éÈH3=utyÓÒƒæŽЕ٢#ÛnC©K^„!Ý $nH¶Ok Aj,0xª4éÕQ[]Xж*·ÊŒ¨©E®©wçîö¡¡*a<‚`ŠÄ±Và=¨¢X‚(d23ž”û3‚©Sáxì—º yLK&Ä8åéô?³¿½¼¶KÐ\…b¶ó$`‚Ëeãö%8yıKüã¬Í½&^¡ ™}¯b¿tT½Ø{æoõç¡hõÏY¥ÁåúÙéÂñ"1•âëÌ}¥IͽzS4h¡VÏ+ü;ˆÑld¶hâœ5’“ÀX ¾…îËÛ%uøaÉýò—¿½]øq¥ÏjwLÔhÅOWó‘ØÀ ظ…'¾ÓËM!RySÝ ½¦Šq×@'Ó-ùæx8}]c¾gfeÖvw–¿YÐnÂ,£§^ÙxÒóðÑ*Í?ÎPUY{»´ZOSê‰W_”^”|rG¼S-?xÏP D±ssÑêËezÚešF©ÝÿÝ}‚‡ã³¼Kß~ô®è,^Žè–òØkÙ ªô[bzMEQ÷†zX J¦TÆÊST¤ÜâSQl‰tD¬¤%`ÈÓÖæÒ.žÚEÝbÜ®®l™PY¶4²|‰í­ðÊNÀ›ˆ=Z¤ÐJ¤œr#@'¬\Ž-éƒzo¬ÝíûöïΩ¾2éÝ ÏùÎ"·¶ïSQ­¾{$²p`ÊB÷L þâ¼G˜û:/ö·HÄÖ¹ ‘•WM[ô×Å‘sP‘¾$§dÜ‚Šo†¢ì7ˆ* ¤8NòïñBD8h%qˆ¤,†cV?îÏ#"2nÄsI£ƒÆ¶AèêK±ÓµdTød¨ÖwpaKx±ÜŽJšQ£’çˆDI‹Mš®Ö®UÂFdÈÌbgkußšð;Ûu€•àþ`òØarPŽO:ìîÝ0ï#ö{0&œ´³·ØŠ®ÇLæÆõ×Ekû2Ìþ\a:a¢2y¦1Ѭaœû°J%Î'PsÄuHŽÄíñHƒ]ƒÐ¿@»Ú´dºeªXÏ’ú«ùçÌ•pE9)àÖ ùOmèÁí&`Ë¡‚ö}ÛTÔñN[VóìEâýšSv •6…“ª#«IÈ™IÈB!#œs~< …Ã]ŠMŠçPpØåÃ¥  oƱRy n4³ ¢ºi«s—3²¾­Ê>i=eç7¾gê3Ñ feù\N’‰âsŸq&âï*ÂUÀDÈ_R!/©—TÈK*ä×S!Cg캀´ž»ïõP_A:Äwñ°õa4÷)è3Ãs!n\Ú€éîǦ¶KþSâ@ø| Ùã̰‘4¼*°XÚ,¤ÛH7ûVOʧ¦þ[ˆú7{œ‰ b!Oá%"XÛÏÂʼnCTû/m/—e endstream endobj 412 0 obj << /Length 1727 /Filter /FlateDecode >> stream xÚí]sÓ8ð½¿Â/Î Ö‡-»;ø¦ÿþv%9M\’9Â5sN]iµZí®öC«* \„^°ò­¯Öºö{ñò$ð`Àƒ¿»Ï I”x«_ƒ9î…ùù„G½X’€ROÒp*½t~‚pÁb’ÈØ£œHyµö¦'ìÅÉîÒýxÌç““Ç/Xâ%Àp?™zI&„rèeÞ{ÿáÃÑ8d¡ÿž~´…ÖF'¿FH·éÀU°Â$Â3FdÀ,g“QÌýj4æœû]£m£™†ðÏ«²™Ã(‹ýªÙÁó×/lCWU·³¹íNëjng}Âàíæ¨&íT1~]•ØkUéÒ­ET±:ðÐ: ·QøÝŠw»EkÃù‡€†eƒß£ÙÆ6`2Œ¸x}8g¦›z`߆øssÖ4oïªH{¤”hsJ¹:غÿ&é1àÆëEî“7—ë´µjjÿ¦…jšSHäeó %Š×OžjÕv éSÛ…p6œfóæq­ÊOŸoÃnÔ|Q,Ióx® Yó&üüR’XºRýMíªóÊVÏÃrûoÏÆ®:KOQß•å}Î5ÿ5SxìÚ·©g\„ÃrœIA„¤ÿ«r\$1áTÜ—ã÷åø}9~_ŽïWŽ÷ye·¼é3¬ÁúÈ%k¬Éé}E~_‘yE¾ÐG_‘ç<âŠ< G­þËc¾¡wî6dgú? )ÜWóËj~y9?ÍÛE=…´ÒŸ-^W™.N7b†ò{—M›­/ ¦ï~}`Ðw¿?0è»^ ¬Êü+¸z^4Û¥^ªNÝä…»t¿™­³$ȪùVÍ\œ¿t|Ó@ü•;”1ôMBˆkiœP'2’¯ÜÃ…$ „–J‡Ž&*‘J)©µP iÊ"ñq+¯YÞ´ªLÝqN‰užö¼?™veÚæUùl+ ØÔ<ëjÒ΋$œ’dous(=ýî©t#‘ß`¾BWÌj»]Mò9œ¢O7m§À×ૌ(ÍuÓjw Ö…Z4:ÛDžEæB vÐ-¢p¶l ý„«*!Öã”aìâ#ðü ˆ¿tMkîœâþµ @Y1o\5 "d G^÷.e¦-Ž`«É—Ö$·é°˜Ê{œ…JñíɧQ{(X´XWü’g ÄÔ?‚I·U+ À¶bš&¿Ì‹¼Å™×¥²“2<%ŠÒáÏrG‘þ×Òv–~߀5 ‘øàÇfçÇ"!1„âµý¿4kêÒn±Ó¿ºaFÁ6„åÑŒ9ÇRÀ`ŽB4\ÿË(„ÅóB]7/“MÁgWúŠVõ'‚|Ǹ;µ¶Tí&TeqífºKÝßZå¶Ñ|ˬiýÕ‘YL9•®¤½AÝ~~4™jmÏ©ÊvúÈ{!üwÚ‘[^œf6H[hîøy§öŒ?Ù‹Eð Û¸¹å„:¼%Ît¥gåd}~•p½Ÿ Sðæw Œ¾Nó鵩½¹tµ7wa~ …P6ÃÛ_æg›=(^q¡1bï‰>Q)EIO ””Y¤ƒŽ2÷ËI«ù¢k ËŒB ¯[Ë€¸íµ°iU;B=)î ÞDWᤴàÕD,UÚy¸yÒï×ÓŽì—\}+žªúª›k·¾ÕÉê©F„$ i P™ß  Ù ¬DF‘^¡ìB`ÀR-¶¼8umËÝAèšN zc2Ì@ æ©j­á¨Å ||‡ý™´Hbµ¬kЬMòã("¡dë~4GtE›/ gÖuWº›}£ŸëyUk²n¬,J4Û„€ÓÇpÊ×Î&'ÿ÷+J· endstream endobj 418 0 obj << /Length 1823 /Filter /FlateDecode >> stream xÚíY_Û6ßO!l*ÖŒHJ”´h 4¸$¸»4‡Û¸èCšZ¢½ìé#J›nûå;CR^Û»vk´R´¶¨ápf8œù‰äDÁ:ˆ‚W‘>_\<{ÇANrÁD°Xy¤Œ“H$Á¢ Þ…ŒpBgsJ“(|>誟ëf6çY¥f4,5t†Íi<¬UÛB“…¥™½_üûÙKí‚9ÍÏr'û­®u%»ê~6g ûÖ?o6x(«uÛéþ¶6W@™íqRó©”§$ÊSn¥6õê­RåêyN(´<ßjhŠ^·SZHßXÂ# ½ÌÐàAÞž•6½kµcíTßiu7ïÌc‰bF×!\Wjð˜IaŒCƒ’<ñn÷Ža¥!³yÇáÅq‡«¶ªZÔóQ[¿óö¥Vhq JGn ì”ã(†®S ŠèÑùHÒõ¦R5Ó°Wå5Úv'Áî·o  ÀÉy°ûo9‰gq¾X\|¸ °\Q@ƒ Ö˜Ò@ÄްúE}ô˜e$O³€'D@w*X]üï,c~û§àLyН Çÿ\8ÎCâÏÓ½ ‡<"#™¢~[AÅ÷QÁN¦ã kI¤ ÍÜì?ûl6OX¾£ï]ã²iu y¤ðÒɦlëKߥ MF£ØšÒÜ•—~J„Ú$¢1É!^瀴)<í3PLØ”†ƒAèHY(Ý»Ù8T*ô÷ G|œçnLï… (xŠE" m½zéazÚ•ëðzV²èr²º€óàHÇk#îãF£Œ£ëÞ8b#kå1ÍÏoÒÀ¬'°›šîB÷°M!¹s:ò|ªÈDó„ð(;D¦8äüÏMTP|M…’Ì1ÐŽS’ ’ù¨Ö«©!élù¿tA~§> ºSo °ÍFê“› ͼÆy ÿã"표ìËçº]J£.§œÀÕùÂ9º[ëzh;΢n‘ÖBá†eÂ9|y¶p‘ÁŽ’D ¦n2æó!Ñ _Ü|ûbâ¢ã²Rìd%ƒ‡=ý¸÷ÌŒ4˜Š÷>2çû9œ´´‡Hùb>!*X þS5%(óª­†åÕ„!i§ÂÿÔ `&Þõ~9&ÃN.qÛOlM ÓÉ~nŸ.âà:aGóúL½Ônß ×5ƒ×‘CÆw²kìa_ðHoÃðC×cÒ¾}§ýäîÑ«®ÞØØ¥Ãævï0 ¼QÅ}QmÊ®“÷®‰›s|VªYÃ6ß¶é¾ZË=¿S¸m·[ïŸH{¢z]øqÆ=KµéT!á¤Oö†‰‡©Ú£Ó·xÁÅöôçLë¼~Cœòýnݘ^I'ûw­Èá|þÈ5¸»û4× ù ­Áßyðw|šy0Ù·¾/ì`¿øïò°|ßÓE%¹ví7ß¼\éþ«£!Škçe}Ó–ªº>éÈê@‘é˯N_)Ùð™÷¶±(:ÉçNmžu²ù¿ÀO²‰7Ñ£pžeÞ™ó?U/ue®O¦ð¶š0û²ÕŸ6FáU¸cw{µ“ì7o^y»iGüõ•Ÿ„ˆÆ&!Ä·æTÅq”$¯ýå¥brÅ2©"–ª˜rÊcQ”¥ÊWe^”ù2{Ry©M/›ÂçHåˆb´w˜ÿy=î3Š€EÕå Ñ“n\§4æäô¨¬Ø C³|\Š…®cŽ)ÇbÓ`Tç­0÷Áµ“­*¹1êè20<¸ß޽*8òDtÛFúôW½{50’ ’%;õ4æëio†ZÁ"Éj[P+½höuÓö·è³Ð] ·Æè¥®tûˆºÂî}¸*ÇúñV5®…—À€Å¶\¯c©)uu¢Ø•´ðÙ0û›å¡ØòC Uo¬ŠØ‚8RñÒŸ2Êl¹ ùíåûS f+PCÿ¾êÖa©K„kÕ`Hµö5±‡aH-éØ¿tµm¼‰¶¶!§t4/xt.’îf‰”{Åo–Э‡Ú—ž¸žæ4",æãµÉ‘b-l{AMfó4£áâ]ó”jãTÛ;~ºPžsN ñ~ÂX§æ‰wj.¼S‘ÒÃ÷ÒÑÀ‘äû¢Ð•#çút£{-+Ãï:íÂÓ׺UÛÕªtü£§÷„,=£áX ÂCù1OvK—Oxô >wÑñù^)É\EPÎÂï@± d6„m)÷±¾ÜÿZ!#â¡.¬~Ô.º#ö Ö¿  }ð[9y0"ãÜ}é%O¶·º‡u$0ÚÚEnì`r$À#)ĆgvyÀüÊYÕÊ@²¨1”RJ’4}T}quÞÞƒá[¸ÖÅ, ûx‚æÏ¾XlÜ«ÏL ßï«Ȳªü®ÊCd‚ ÍÁ†„ˆÔ#÷˜^,.~žÀ. endstream endobj 423 0 obj << /Length 2703 /Filter /FlateDecode >> stream xÚí]oÛ8ò=¿Bè=T"VüЋëÃuÑf»H 4Íaqh÷A±éXWYÊJrrí¯¿)ËŽ{»î­‹f×@‘Ã!93œšÆÁug'±û>¿ `ÙþJÀDÙû­µ“¶ÁÅ·ƒˆqËmmzpK±·äô}o³[«øß£º3åòàÙtgMµº:= -YVäƒöfUãC»2. Wzhgv8[Øú1Ð-š;üz`Ã÷ñUl}¥óÑý2Í7œîr8pn·;úÝ£ß=úÝ£ßýFòÇ#Ý+ñðC^òWyü·hØ“| }ôYŸ9£Ý1ڣݼí^Ço7ß݉ÛÖ{*ú­Î«Ž1o¯è‘~9z\lÞÿ'¾  ç.*»°ì>öê ËzötqaøÚ´©k]Þ•]— ˆñ„>¯ê[h¶W‡#è…ù·®Ø·¥ò¥9»¾èÍS*óXÅòüÔí„òEƘ+)¥s• žœSý}.’"¦¹”Ótžå©ND6ãy#…üeZÆüŸˆy‚·àt~ö­øÏ<ÓÏaùò,—ùJ•Nr'éQ‰äy,µîÎ$ó5@ÄB¦ €ë^¹È²ºñó]7³B<äÛÿ š³ØÜ ºÔ†—Ã}¥Œ9 |³öÓ /, ñ,°Ø8¸Î“à.@ð»`ÝÈr{¡Äq²¼`ʹrhÿÁ&Êp­²€ –Äy¦ƒepíW¬™±âk08ÎâX%08øy¡R1†å, ˃)ö ‘W›àÑÃLÑhªª5p:æ!S»kˆ]sí ½ÇB5®{ßÉáÁ€‹-VGâ~œ¼µkåõÀršdb ƒ¨Ð 7öÿ¸<][â”jIKØAÀWfàòc{n/†¤Lg2·Ääq¬Õ½yþ”îª@ט+j^L{L‹iÚòs1J-Ü:á9xtè_è6$ÈÕ è¿ËšóR†Òåð¡¶R’å’UŸ¨Þ¹-R‹éóùʺìË¢¢ÊÖ¿°Iz %T>Û ;O)Ê'Ù¤AŸ„•Û ¦¤U+㨙7-–Eß–S:"nå—wÂ?ï( çƒAâ¥Çýa¸f24êÇ£hkßþô;ÍHâ©f\óíŒ$­2ñWJH ˜˜ç1!é˜tLH:&$}1!É…¯ò³Ù¸x4…T_Ôý#ªcà]] B]v÷çdƒ¢-í5],ÏÊ¥©;«¿åÕ‚OÇÿw ¯›l‡ðÑð/¬œ¾ú‚dO/øóƒõP~ÐñçÇ,yù§¹I_˜bö÷”»ÊîÐ `àùêûž?2ÿm^ºP¼¢ßšªK—÷æõK—&g# íºÝÀ11à˜pL øíðá-þÁ\ƒîúeëx(•pÒõñžrÇ{?¬º¾q·^ ï8ÖËݹÞåŸV‹Íc¬\¿°Ð³íx˜2Ça7…}òúѾC¼Æ3½L0C`êÉø}oG:ÌЯÚCEè9€èÀ°éºÍ·§Ø«!Ô™ùsU;|zÜ ;É]MÔX:„ÊÒô Û7Ägš"ÏüY^©”eÛï’¯Ü[\; €¢|[ûˆVxd™{ŠG²‡ƒ}iY´ïH…?—,«âªr¸ø:u£³ "4C±4wÈCÓ~Ä—»P‚µ²ož¡CѺôLÔötÛ?9í£á¶(©Ðíº*µg¥ôOØUh'+F+‡–©×,zO9^\Ž$éö]j×û—š½ÆŠ_¦2£’ð1Ó FÂéh¤Ò‘÷n}ñêN)Áb¨@ ‘$»÷{ó0>qÊ++Á`2Öy²}bÿ_Ù#. endstream endobj 433 0 obj << /Length 2424 /Filter /FlateDecode >> stream xÚí[_Û6ßO!´/6°fù_bÐÜC€$HÑäpé®@Ó­M¯u‘%W’›ä>ý g(ÙÖ:ÛlPç6W?슇Ã!9äüHóä&áÉó ¿O®.¾{¦ÓD挑ÉÕ2q½‡§àV„l ƒÏ`¢ ãˆö:º·ƒ‰ÞÍZΤP4gŠå½ìS9Aúnø½å§* Yº¡œ%Î1‘äGÇö*_ûv“Óú{P}ÜÓNÃÿ~”H$û›'E}·þ›SvàòþÂU0·µhzH爈ÂgöG ßÁžsÂ><¾·p›¯gÜ„µkú=&’ð«×ÿ|zâ$Â_täö`S2LÁ‰#zòÓ-Ê‘;˜õ 7u¶'Œ¸ƒÞÏàîöêÑvSæû٠ݶP­Oîá|û¼.·×—'œ›ØõU{‡ês&ÓCq æÔ~átòùŸ¸¶ïáeì(&ÚSáædí~¶ %h(2ÒðÛo§äžþ~ýo?ï(S/é;/ó¶}DéW/Ÿ-‹îgA¹¿‹‚,a `|B½E¬x æ÷Ý¿ñ¿†¨¸xš•üúÕóGcpL‡£ºæé—Ô´ä–+k­S=e&\ꤵ™¶;’¶i*…ËÜPOqé¤Îú>™o›¦5°â5¡ £tÄ3²b ¡õû-ªµ‰ŒE,]cõuÝ|˜fz]°ÚF$&—°ìºv§È‘>­=ÖÆÀ>ÆYˆ½¤“ŽˆK2¸B$‹(š!×A­`¦4ΡO¼[4ò”-"¢æz„Ê8\m,©o7Û©›aÐ =96¯p¤’ÆÜÐ"º ¼Àpk>/ãÍr´ ­eÚÌÁ¶ØÀ2|î8†GšÑ†eÁ·PÍa¹Ý0½C«hå@#þ}ç«E»kéX+™„ÃpvØÊ1I0µƒÍÂeý"„–H8&o„«]©Œq1 zOI>ÁÞ~‡s@Š •E‡¢5Ÿ¼èˆ„è``굤qú†Ì*¯%: ÈûÆ Qª¸#¥q 0ÊÀÌ,ýÐx€È•–\å£_ ´eS¯#øÃ#;ut-jĨÙU>ÂiÃR´ ùj=ž»–q®©¡Ð)af!P*ÉóJ‰ '¸ 0l‹‹XVÑ÷-‚Œ~3¨2úóP›¤ u4¤Ðñ2Ò¢•à‡Ö Æ®N0HØë :¨ÛSQiÁìna½Å´ö¸¹Ç++eÎ áðC…sLÀ™q*J.YªÿR˜¢ràC\zÆϘâSüÁ-ø²°êuìusDÄXZñ?ÄcDíßoÊb^„!Å,óßã Rm÷à'Ÿ>;Ç~ÞÛÿxoÿRw_úJÀ>ø+ô󮪯éJÙ¦“;ü_CFH+MOÑÖ)Ó,Û]d2³ 7Ñs8À\öÄþšº¿S‡ò¢íñA߃IHXFAy‘ 2G§Ûƒ‡Õñ‡ÂêÑÃ|ÒÖQ™jå|Å‚¯Qè¶>ü´åcmKÍŒÚîá³ñσÀærx ÁâS‡`BŒö«º &²Ãƒ&Û?Æ —î7DÀ‹ â‰ÌÃÕ{Ȭóþ½„{BIÿüƆ—DU» ¡& ûpºû R(ôïóõ¦Äa³¾v¢š5yõöØ=.pZ1a,– ¿€¡§bi|Å ŒÙMy£iFú!|†¦Ç,FÇ—Pñ]Ñ­")˜Sßà® ©ØQ{ܲ¾`z5“ŽeY„Ÿ„=¨ &ü/î‹â endstream endobj 465 0 obj << /Length 3022 /Filter /FlateDecode >> stream xÚÕZ[oÛ¸~ϯÎKd fÅ›.öᜢ-zºi{²)º@»Š,Û:±$¯.IÓýóg†CÚ²|IºPˆ©!E‡3ó}C5ð^à½9 ì○Ξ¿—°$¡w5÷’À‹„dA¨½«™÷ÅŸ×Íd*¥ô»eŽ å¿©Wý5Éy•S+ÿ¶nò¶-ꊕi×ߨïk á_Lþ¸ú7¬Vã g*á ‹Yìk;jG'l¹12†ù¸Õ)½™ˆÈÏ[zLA-ûußѳˆß]ãtg¸@à5 —o`×<ñB–D26+(¦„ò$ yHË$æEg§‘B0:L¼é`8#µUäqέ›Ê `R…ÞTD,Žc*˜žL9Úÿ8‘ÜO›tµÊW q¤ý¬.×}—v`Çö€!oÊc&ã„fºšÄÒ¯áÍ8ôÛµÙ{žÏ¦ýšDtbqä§Uººo‹–ÄwK8µÛ n¨_üŽïz•?›LU˜—iKb €à!ãêð98g¸9C£‘9yX ~¬jGdÂý X«pþ€$Bè­¼¬ŠºIm,Àù?ƒœöpÌèõ¿œÕ[™"‚ÈLÂÝã4«òc9UB¶›([#0õ8ÄB&ƒ£6Ë¡v|´¦Ç2%· )$1×s€mµ4’—?µ$Jeo'§X¥öÕÊ®°´‚ö¾íòÃãD$.`Lnó) Ìp äŒc·0f±ÚµZ[¸¼œVyÝ·«{¢„Vyù¨Älf…hµŽpKÊ"1ã·¡Õ.ž Íâ$Ü 3ãˆÍp¦yY7¸"@l RÌrp Tû46[h¾ì«Ê(`€ø|±ð¢>%Ò/ª p‚ %±ºãÈ&ÿ³/ð/#.­ZسlJ›Õ=õ©éUÊ<Ø6°Ù®­Ý¨mdœ´ÌÎÌ^'¾2C Œ”ÿÙ ¨T0AeD93CƒèWÞvôhp†y(ZS*[5`žcìž¡àÖ¬nMCû–hÁðíuW”Åw´„YµëA\0_´Êúf‡>cØÜ*&þ<ͺº)¾›£Mk-ýõUu5ý\T³'»Cµ¢`Hp/QìÏûo¨»µîjö7£y€è4fBwCy€êPgŠ.bJ—…åö]‡ò8wßZ4ï©]¦ÆcLØ[QLY9¡q‹.ÿfù7êÿ7Ï:ñ3øa†º„Ê%¥ëba?‘¶µ`öŸ(Ä@¡ßŠwie³˜´ÖIpà\¦G㦱6Lô&„˜ŒâÑyÞWÙÒ`B]YÑ´hÈacê©M*Oš@/Z·ô)åjA±1Â9œÃ¡ÅD”ÞÔ¤Ñ|XÑ(ß$ä‡Þ{”‰ã6‘† àFî³ïû³´¢FºjÀ$wDâ–"Eøµ‡ ŠÐU”¹+~!Øø®o‹ÔÞ€4‹¾€ÝhkaÀ¾¹maîtlME,ˆävkG‚/AÒÅh cÍÈ·?\N’пÂ?ÿ|5™†ß¸zõâ 8½xs.Ævxã6š´ 6dibÈÉпq$qoÓ4]"9B³y‚ ð šý:f[j¥ÎR£+&…úQúŽÑÄb.Æw;ɺ… Ð± ÑÆ>è&ii[™á ξ]ÖýÊÜø”yËÿŠÓÖÎa XäÍ®á8 öÕhÉÛbQå]gŸÊ¹îGB› ¡p ·ö¿xyò ʹdŦöþ#IX¤Gõ£Ñ+Èå|çjA=ÝW bBB lt¾\;d *÷Âmy4} x½ ĺ;ÚlµÚe qÈâ+M kÆ ~&Ñ€9½óC䀓E[Mx üóŽžÛtžÓXS(‚Äðvl…MQ•¦Œ1LÄÞ™þ9‘“’¥ôóæÓ[êͫ۲HNUñmuˆºÚ‚EúUÚ *Äìnèq®E¸¸þ(2HLi‹Ò[[ýpÀ%K×kê0i~/ÒŒú>üF‚ß=¿­ ¤5:Í ½Oüûº·+SÀ.˜`ˆŽ:jò”~ ‚‡´tþŒúÚ­`ê[xº¤Ÿá,‘pÓ”¥9&`iȥȷIY§ 7Y·É‘=Ã’0<ÂHBÅ„’à®[Ò²%$"Fg²…=šóÃäyª§è±3Ã"{I ‚Íå¬-žA4(žI@ÕŠpwÞØ€ţĿï4#¸#³— ‹ÕB_ã]º™Iá­)%û=‹ñ\’ȯmmÂõ³Üâ}DDÒŒ¡rºÛ~í.¢ºÜøFŠ9°¿—8b†3mL°ËÃr;ž þ’]¢F™òñÀÿbœwæ¶c§ Gsÿr^®‹óSy5–LÉ Ð­ºŒµûnîØWíûø‹LpÜDü݋̘)>õM¶~ >E=B›ý{L´‰a‹ð{º®ŠÃ÷˜æõÇ›s* zD”Œ/¬/>¾= ç ¶ÃŸº( ÿFQú=o;*cNV¢ÑA‹ŠUP Ä”7!ñþÓ¯¿žTÙë0 ð«“càCjL^@ë¨Ët¹»&¤qY1¿·½Ë´s­œ®ÄVvT“/ D:ó)cK±k¿Áµ,Û46ù SukßåTÓÛš_ I 2Ì]–ÑJS'ÒÔûƒ˜Þ7ðÈ®‘„ÚtX¨IS¨ÑÍ¢²!á#Ý,*kiºh¶’mBRãoŒ(¡;Xl}åR¹÷–íNþA—#ƒÒë/~øèË=;épDâªÁ¢77|ôíx°º —;×ßnBΔÞ,|cß æf;~ûêêìO±ÿËVÿ¢,+Ͼüx3)š{wfT ë&Œ'ÈsWÞogÿ¡ÿz µ§!À#Z4à,€Så`‰MA™vRyPmF§Ïï ¹©€J: cÎRÌßsj•úáüp9Áª¤¶—iµ°£fx_ "8K¶‘Bí€H#È“üeÑåY×7VŠÙD ûJC¯„Šž¯‹®uÙb´Í)°\=d!T!»Ÿ6¥ß­Ûw[_¢f]·n_àvŸÃvŸgMZ±f ¥7p”¼Y'æn—ÕÍ⹩J̽ æÞ_Ü…lo”šŽj-Fßã~‚Öãø<¸›yŒâ|t?ü?v)þ ÎòçéŒ×Ï&lÌ 4ÝÀ˜ûõõ3}fïÊáA«ëÿ7#jô#Š‹'³óˆ î_eŒÐ†¥èˆH"G’£1âü³¹ƒK endstream endobj 370 0 obj << /Type /ObjStm /N 100 /First 884 /Length 2648 /Filter /FlateDecode >> stream xÚÍZ[oÛ8~÷¯àãÌÃP$ÏámlÚn/˜)4]`.ȃãhZï¤Va+hûï÷;²[v"»¶º³@RÖ!ùéÜIòVEÞ)¥%E&¢eÅ>  *‹6ª˜3Ú¬2á÷`”5 ÄÁ*물IÊRp# ^Y÷ĘÓc ÊIN”NÄjŽÑ‘eCR“rÆJÇ+gY:A9—1M2ʱÍ#’ÖË›ˆNF'¡DrÊ%+R. î„UL–À[ò@ƒ“Æ9‹V¦vÞ€’0F1ˆI“t„2“|¿ ¤ y ”å5øåbc°Vvè°t¢X?"|8;<P0gx¯˜e%ƒQ«8Fül0<ƒïlæä¨Ào€ßë-Fyˆ )ï@ÅÖ*O`˜÷«І$¿dŒs˜,ñÌ"E â`¬t’tðÒE3f(:4Aæ†@C7Øb,Ë:Îa’Ïó*DÌʳd+¯S³|°G'%DëÒ_-äË3:ù@’%HÆd=Ô!™(ÜÅ_ŒòBÄ/JÈ¢ˆ•«dd!ð>烟‰“p6ªÀ%†‚¥(ÜeÐd1þk2©ìD£™U3x=‹Áê¡w •Ë)`f|†5Ú _o¡“X_¬Ã|;[ãe 57—v[E;­Éxðk­Ð‰¥X¥‡Y,[Š·_>–ª8ŸÍªzT<©æ7åüK4WÅËâUñXþjT¼)'µúƒ£Ó:¬ IÚ`=Yˆ.ï®kLXü2ýUœŸ5Óç“zZÍŠËâßo^ÉÿwïëúãâÇ¢˜ÌÇ3=ÿáã¼úf×Õü]ñq<ùkü®üÇŸãEýêéù÷?ý4ÂßÒv!Õ¬ô0pÛ<¬€ÃÎ5˜…Î sOÚC >8í(‚î\©âR/ª·•*ž©ï^þYU5–+µÿ^D8¸[×Ú½‘èœ]/ÉÌ?ß´ÌùqÅœá@…„ÅE‡œö0[8Snùø¯Ïõ‹Ëz\—¢øaT<¯fu#ûçˆ÷Ð%ÝsÑRkVò†Ûäp’-%ÓhßÀøìý$–¸zƒä1®H²N¿z1÷à[-ŠtOLGðyÅżš\–Ð%|Ó³çªx[~®ÕUW/ þ˜0«ËY½€–e.J¸¨îæ“rÑä³ÍO¯Ë›éøIõY5jëá$$mHl!}¨ãÅxŽ)$]’7š¾Àâ’¬ $I™¥½(6Á0%· ž‡A0’ô±‰÷èø¦÷¦¯Ï#ÈjI»9I‘D,.ƒvçõøú¶Ô´ àYí2­M2ÉK‰´qiHÍî¨_G™;jÞ5”Dëü†f«˜)í(f '*f‹œZh)&‡¨¥È@åÐDn¢¬dþa€ÈñõL2&”e(t–š<"ª]Áëƒób\‹ßVÒRÒM²FI… a/]°È>‘ï£cÉEQ˜î£s–Éi?âNFÕ»—Α¶‡4¶n°è8þGL×¾:–·Ž)Ç[æcËîTcãÖØüiƶåwL´i|oŽðà Úfµ§‡£ÀâîzQ6i’Fm5\ p‚A ¢Å‚ÊI$q0–pË´r7ƒ à ùÛih'iéd=k=ÊÏoòg¯Ãúvyà¦evãèÉ1‘ßæ•ì¿d¦²ù'dïoÙºA“6çû˜5“TyQGPÒ'ê F?O?¼D4ŠÚ+2G”sÊ…€ò[ZD)=cÒ&瞼͞áµÇâ²µÜ& ºÙŠÃïœz‹ð_Ê ±[NCöqp2qœµlDï£#Ôå.¤ýtN/Ø¿ÁʺîéÑк@µ?ëvìo éPûcË;ö[»Km›ÍM ì‹ã™e¿v'{ÞF’A×§mãÅän|ûÃk|þx&‰á€QDQ{µÞ¦Æ$É‹ðÊL’s®ßßgï†-æØ…¥MzØbtr,¢ êo‹ÌžÜ£q|ÊáWôŽ]Z{]n’Iº‰ô=„½d–e Ï óÝÏè˜[Ç*;¶×IQ7lïhsK»æŽ1·M6ÆÃ„÷ÜÑÙHM6:daþ¨w8cG;ìvöDïÖnbq»e5W£èµu^ÍÃV’œrjÃrèupÔC'w_Ê9üÇ€…€—7*T#'¯²!@rZgàt÷•Ô-ID«œ;HI7Éšã`øÐ‡”t›9™ ~/E®6ì&ÓAê»åaäôÉ­œŠ»·B{6VOû´ktªe¸¾½-‡»}@,g¦ð}Ò_kô½¢pëCʪŸ²ÂÑj¹XÕ‡d[šü9A rBƒ¼Ñ#`É"tL.¹yCTž×ÓwÊÕüËpâDòkœ]ƒO^‹]£ï•§RžHÃQ.¯È¥0#Ï=H¶å¹æÏñâloµxgµÜDþ£ñ‘ÁW {mñe6y?¯fS|Æp•­?„È{ürãÁ~ý½¥!ï¤A¾"û¢YîÆõÙ–g—CÇËT®HÅ WQ%%Å–K!©c»Ü×O‡“¥‘nJRÉÃä469¹¥ G{…É'yµ ‘Ó »…¿÷r{E©ÜœCÂô¥”ÍÞƒGú!9Ú|/Û¼—ÉA¢#¯€È©³Sû€|“Õãƒðö)û¦oÎ.RÒœ†Î9^_¼Л9-Ö=òì´\i^#ï倛̎–»q+$rå–lèE²+KáM é¿æG endstream endobj 488 0 obj << /Length 3047 /Filter /FlateDecode >> stream xÚí[ÝoÜ6÷_!ô¢,F©¯9  ’4-®ç$î¡éƒ¼Ëõꢕ6’Ö‰ÛþæƒÒJ²œØ\$=öŠ"GCr8ó›!5òsÇw^ùöúäôèás­T¤Q9§k'õ8PÂBçtåüæ"jáIúîë}¹PÛæ[³ðT¢Ýj׿UÙ,~?ýùáóÀ°ñO&B%)s9ݘŸQÊ͸ Ýv$îGü©¸¢jЉjè lOPa{:¶]¥ƒ®d#Lè’ºÚeuV¦˜”…ŒtG˜•«9n©Pñf¢6öymV3\“D¤2ìž8æñ¶›¬åY-³’«ÎLÉÎg—5 p#Š‹1¢Ñ¡ü± ÇXrñ0 $Ë×\[•ö¹ÊVФ±b]vyyÎm ÊUŽ‹`y4\Ý€,šw¾Ôfõ'Ú› Øßp=}áûÒñЙðìßÒŸ<2ZY*u Ë2R4÷v¥0µÆ3£8y0£7`AÜ È}Æf¡£è66“ÂißqcZ2©# øô5.ëÛg|‡zSV­±4[Øï`Ýv¼¬5W-³Æ6æå,RDlñæŠ(• +&±|YZ+Z4¶ÒvÓ-4ެ+ˆÃ^zmÍÈÊ.­–š¬©Ê‰Bfغ852ŸŽPDpPåØ=èºÕb«pC–$»]¶Änß/ÂÐÍÎ5 »:-±Û2´n¦õï7(„(ŠÝŒµéÜL]W»Q„M£j­Ý·M‡ü¦Qî¶¢õ[™!)ز§Áèï“Y¢ ödùU)>gS[ˆªœáוL:£‚ÒõF%Eè÷ ô`7«dôöוê›y5_ª±-ÁøH–’m)[\ý²´Í¼P"9²áÀê,^›jk€Q owµ¹@=±ŽÈ>šÙÆÁà@Ê:ºsb‘`çªòxä7´»Î–mU#ÿA!©^r+ø÷¹"HF‚ÔØ*‡A\. ,¹[eÀIƒe]9ùŠoê‰&Ú™‰Ì’ÀÑXÐZæìl+.L¿‡ù \ïö©Á=öZ&vÐã{SÎa-,‡pPƒx>_$Ê%‹íÐûÞV}¤Ác²WŽa€Àä£Ñ:h¨Žã°Jqg»PhÚ5éê4"_ üÏv9g+‘N¶B,3ËÅ”£Âœƒ÷Ÿ R¡Ãþá"©:_Î ¢{qÂÚF°¶{~È  I–‚šº¾dÀ¶~Ž$·ýÏN)¶‘\éi¾t-[²PhØ7W%W¦i¬Å‚Át,ÞkAGù"MÃ/zr_öjÜAðT­}æíÔÉÓ`aßðìo8›°0Ò¿„£1¡·Ê…±þ¢­/½qTIî"wÑÇ‹GÏNpÙ|G‚ ¤Bé„h¼Šåöèƒ&ýÂ!»>B]KB磃ÕoœC£Hü—NMT:M¤¶dŸ'|èI¦:F´ý$N­säÍTT ¡TàƒšõÕçI0"s_ÄFd:Ô%" T”8K|º¯õºêb\=àÐ÷ä ºêGu¨\çà G;Çb®¯™a!Ó+S(†•‡§¯ŠdFxÀp3™ê@ÜOœ£W´VÐLÃØÑ"Pµøšþ‡ååÖ™hˆ…ÿžSªD”À5T Z±Df´e'i¬òLÔÑ&ÿúäk;èãRF`} |ŠÐ¡ãa CùX×Ý*ëŠÚ–€ Ý7܈ð¡ãáƒ+¥±MÅ%Ë–oÈÒÓ¡ßÁÚ¼d6m7°sÞwÓHì~’ùÚ«ç‚g§ÃÁì‚8Rêé^ôñƒ~0#Œ7z=<ðÔf¸Â~<¼ÊòDì\˵ߌ¥bŠ¥mÕÍê½ë¤cW£cÓ´|£ùòôäm3-à3QP”W´ éõùʱ¥3¤ó:ó6{F£#-tl·ÇÏ>e[Øü^w3˜3©œ‚Àe²qÅ*ói›ºãc(0ìCBß¹MŒÄO®.ÑÅÞÃL‚㛜⤠÷ÐîkÛWe¯ r¤ìP«&oíþ‰FØòµ°‘iÁ·´G¡}bG@.ŒCp“±ŸŽcÓfÂ@gŒ†·ÿAæ±Ä躵®?` •{>Éš³nxP6ٴ΂`ܯd¼c—ï»?í¦ÚŸ[2:3Ì`Uqíû°bÚº½QFqBV¯íìxš“Ê×x¼¢†A×u<òËÿXÐz’—ÀÂʬ³}Ñò ŸÈa‰7¨DY_ÚBÅWr`XÈíõ°›Ä;»ÅbÏ­ïmYÕP݉¦®ÌÎõñ?§s:3Ÿ›ÖÍÿpº‹guDSÛ&z±Îù\þN0q‚ö“¹–Û;G{Ó¼¨ŠýÙñÚ)‰R}×HY¢}|¯0~×¢Ç]Ò·%úÆ–‡øs×.ê¯ò=>z‘Ê÷»NëLÝf ㉠\­‡cä€èhfì¥m°¯Ë†NÛ<‚øªiò³ÂÜÃó=<ßÃó=<ßžwÉß Çm3®†Äƒ7Í& l_žQ%tòUbºGÙ{”½GÙ{”=ù¿ˆ‚óîÔ ëŽR¶»º:Ë0>½I$ܾðþÅXÝcí=ÖÞcíßkßÿ&áö¦”“ƒöI0x~‡¯+oÌó-©Ç#U)Ñô_ƒhû5ÈO9½µN”{²P˜Ô&1yBºë¥¹Ai›Ñë[$yJa9¿:ÇÌÃ’? ÉøvYì›ÖÔ×GÒ}FBY‹ O£Câ—¾¹¹°ïÌu¹ë}Í‘ E—ÙfVÞ~wŒ9e©ÍrÊÁ>©9{&ˆ)ŒxC¯°¹²­ÕO'Oís[Õ¹‡!Е\›ñ'?°ÍÐFÞ/0õœ[ö]š}hWþàE«.WBw±•ÍÅE¹Ý©'“Ü:/âçtÈeHáG…à)á·ß}gõ?S4–8‰jëÈ(<Ço- çÍÑ+NP¡‚6Åœ€iâ©#ƒDhNôiNûa)bxÚ—”e/–&‰´YPÌ kÛ]óåúäúpYg¥¨½…)w‡ytaêþ×,[QÕçÑà 0MàñU úôœd·b6˜~x¢íç<2¹å*€ôÿ–Ò“[ endstream endobj 496 0 obj << /Length 2178 /Filter /FlateDecode >> stream xÚíZ[oÛF~÷¯à¦"Ö˜Ã;ƒöa›Úé.ǵ]ìC»((jd¡HšCÚë¿çÌ™‘EZÛJèX =HœûœÛ|çÌÅf®ç[öÚ}ÓÉÒÿåÇ#Û‚ ¾Û÷`q[ëÿªe¿p§–·G¨°-nE!³9·<øºnd¥Ë#,÷œˆÅad9g¡ ´ k~ôËN¤lÏÞ- Þf~äÁÔ²_-¼>:9sm+ÂÀºž[±m…³›Y¿¾O|Çͳ\¼§ä²ÊØåøß×ÿ܉"p̆®"öÊ ÝÉ™¯c[Çe1'R²ùγnÛFÿÝöíÇݳ>ràÆZÎýB¿·mV‹ód)d•¤âÕñÂc²^ŒæaÔ)¢±ßü˜•ÓDŠ7C2p¼ûà.Š;”è!M-{…jpeÄ  ÑäCòðÃ΃㢴™í#ø]ú…4øõ寧[Ç΋2X[”Žë37€æ´*w_”Û‚S™&fâ ç,ö >i€²}?Ô"i¥“bF‰ZÜd²µ)¦ïç‹P"Í[U;ÔêŠjŠŸ8ȳiÔCãÁ¬~J‡™¨ÇXšïnñSöÊ×ð÷“ñZÍ ›¤n@lÏ5Uô,ílÍRO;fMü„v14giþ¢¼½Ð’:ÿ|ö,¶ž €&âȬn5œ•ú›ä9%îËú«¨%eZ™7”lÓ¶®EÑP¦Jjè)tßi’~ŸßgI“ ­Hâ¨g†XÊ“¬M’çŠÉ´aƸJÍÙÚz ™ä_¶9½^¿ÈãÌv=Ëå‘:#6y4ïÉ®ÈåkyM¹©ì}Õ•™ïYÞ‘yúÊÌUÚžÿ¿L³âdšÈÅJ*0(Ä{Tý–À}’ÞÏ:õq¯þVëT€ÁeÁnÿ´q%V—séâ/­ZÊó`S7‘.Jªó±ÔÎæíùÕ§/×W:dËËFjçõöúóÅÉ2I`™òÎEsÍRY‰æjr§¿Å†q'‹R6*€y:4]ꆙ¯ÂÆÉüéÍãö DðºXé,ô4íó™FÏ}{t6Ž`&%ËŽ¼‘`éÅØuFM–äXæ®-ü§8‚bûÓRþ×úÂúRgt…3¥.L胰‡òÀtZÖ:BQ¨‚9Þk¡Ï¾ºƒ9ÿ|¶ ÕBfÛ+T«hįc¦¾ÑÓ<¦0¨ãÇ”.JM4-~•¬N0Ý,Ò T\,Wøæ°Àqº @²u]BR×õFK¤‚¬ÊU¸$¥´`dT@þ0¥S·R擹 £°GR(RÁv=Ï]/{%µÊô ³²Ðýî°6¡4ÒC2\‹\p ÷V®!©*º5ìÉÚõXh»«;1p($F‚p=—ù°éëâ "²=²?!í«2TK¨µ%ñH“ -e«¡2÷Ês Ð%Tߊ]éC×,ôF¼(C7Ög¿z²DÒ¥ÓPRjýŠ™îÚV£*&gï„‘å²jûñ—â½9('äà¥DjÖ‘†qXÇ” ÝŽç8¸>iÅëÕ¬ãz=ÄÏ%ò~ÂwcÅ0M”é ¥ò„8DϦ8j{ v£‡»_(hŠ™˜¶7àŒop¶c²&ŒË±n͉bvJ¢Ùä[)æmN"4š¤B•Håwo[ãI¥„9P½l(c˜›îf ÄJ©hôF¯˜&º‡!QeŒýÇ`ÿIÇ6b³¸7,„3ß^-„w· r<æÄ+X"Žmz!Ä> 㸻/W\… ñ#)ÔSXHÄ'ÂOMY=¥“£>¢Þêpè‡w€%›HŽÆ£¸Crˆ×%zÖ•Œ! šzeb‡·$˜ûª, ú䀟ë3ÃÏÊ«Ó_6É-fQ´’›aÑD´!rvìU@{þ÷ £xìýO–­Œ(d‘ÝC%ÖŠYRobňwEÂpåý€Û‘m[vcEzôŰ5àý7_q Aùþ½øÚî¸Q¯­BðÊCˆYÜëëëëõ7V~ç¿ûB`-&Y}àè£Í²6;:\(™ÞÁU¥”Ù4CŽýÉÑ&ÐÅ—ð‡Køý¸½ßöüÚwŸoÝï*gïïÝ¥³½µ}î¸ÿ×wîemžý‰Þ¥ã¬¼èøqºHP Õ'‘Æ¿´ƒVÚ98胃>8胃þ†šôÁAç õ-é /¹è´Ÿ|ïÚ­‰zŒÿ`Òá™ëûžg7÷qæað„žtv€Çcp:0~C;`>­‰ë3ÛÈ‹Ç;|z}ô_ö&ã endstream endobj 502 0 obj << /Length 926 /Filter /FlateDecode >> stream xÚíZëOÛ0ÿÞ¿ÂÒ4Q&jüˆxZ?ìH“`úñ!´.TK$é$$þø]b§Ih A¶€_.ßù¾ŸsG R¸†—k·æzrÐ! 7+©PñšJ–™•$¯;¬ ˆ"Ïń °ãP4œv¶Ã<¬\I®°$…;Ç•,Ù|u›J~tv÷™B ”0‰c¤r©Â”ÃÝuCñíóÁ×JêS³¹àÉUI#Xâ:ë &ºz•çw¹{WA™™k˜MÇ•Ul* .úAÑÑÁ¶€¢óát6zŽµÚ˜_b‚äî>'…3À Ʊ¢]¼ÙNƒ3͸Œ´!â+Kœî"+#?6ãxjxõ~{½ÆúÉvéëZwÒ—€ 6‰l-ljaS ›ZØÔ¦ 6UˆAÝm¨ÅNÿ9vòƒÀ9–AYn¨K'#=‹'C?¨ 6<€ˆì‡$@X_/¡¿"¦¨uƒI×m?Ä‘î¬BÊr’礓“"ÉÀZ? B\åÃH÷²ªÞôÏ~ÉÓô÷þ,w0±ióƦùÑá~–Зóp_MõSpWwëà‘Ž·žlGº2{8]W}e5Y¶ @Y”©õéœt¦eá‡PÅÚÖq’"l×17C8%Œ¨ö$xÊÁˆ1§·Z ˜XN¢ãÔdI·|Þc’[€ Â]òví Y}Æ~åŸ[ó&%%åb=Ч7Q¬§öH;™BDf0Srú mȣ‹:ð‘iÀ÷½šú€ÏËü9´> stream xÚí]oÛ6ð=¿BØ0LbU%JêЇKö¬Ãš {èúÀH´-Ä–\}¤Íпû bY‘³«‡=,Lòx¼ã}Ÿiß“aäøƒÏz¹·äÏ×ßùl80þý^ªRgøI˜càQ˜ïÎÜÂw„“Äž/„#£Ø ÓÀÉ6gƒÄKãÄ‘±ð¢H8µqg¿u•¿¯üÇ]úÈËë³g—ÒwR (çz᤾ \Â*wÞ¸Ÿ>›GAä¾úé’'z½¬ê¢]mžÏæÂ|÷Ë›º+Mûåìíõÿè2ð9ÂK£hŸõOݺ-¶kÃ+`Öô¬£Óñ¬rÓsi̻Δm¡×¼÷¦ÑÛíúþí±ÌO€ùì2HÆCa`Œl÷šU†Sñ¥C"<ÏãÉ·?¿º@1©éê¾i͆çm±•@„ï»]cê^§ƒƒf­·ÉQ ÷öT"íÜ÷|_ à)â‘mGž}@9ÿ;öαUmt¶zžWW¿ü‡ý{'Ó„Ï ¼ýãÞ¾šØŸ*M|ì]ë‹£(Nì¿°@9ð-eEüÉH¿Øñ±d1ˆ‡”_üS…¼8ô,¤ðŠüO/ÏcžI:`©âÓ³ðg¾ä„ª=ø÷ÑælZ×ÿz–^©ANvp=uÃ7â-O®_ÿzaÓÊ)Úî÷ž]†±Ã×lÖ©§ Ç¢KÊ€¾|Ñ€ºt[”ËÙ\‚íÊðd¡³jÁ°W• ªuy‹7‡Œ4.*‰'“”iÈB¹Ô‘"Ã´Š«­®õÆ´¨v\HQØÂC€†Gf“1{ ØËû@*/Àþ’¸× ½8z¨ê¡LÝZ¾An~÷EXš1ÿr$n·™±{^»ýÕ« ^š‡ƒ]ï8ó »%Á¾´Iº¦ºBÒPë†Ä”&º^š–ç°]ð¶Aê~WÜá!SZ*<ö×´+bàæ¡Ì{Ò3á¤~‹4îÉeÕfSYï‘FéïbOÄvn²"g߉¤ ‡›'’^$Ò§Ì“xAöä@ &£Àmë{äJšÚeZÞÍ"MKgšs ÛõŠg›jcï]§×E‹-µÑMWÛ]2)òZY@mhK˜fÌÊDp†¬¢«Æ°¹•ð_ެM„¤$׳5-/áº]——:˪ڪO†,2€Û)Aޝ (T¦.´G¼Eè¥a¸Ïúʰ§Ôy‰dÓšrEÎ °•FFDHˆ7.yÏ^¹_Âám/pÎ ºgBêšà_;ô´¡Úbn±÷èegDŽúÖª›V+;ÁäS7–ûƒ7órR?˜í(ãÖOì)õ Ÿ*©½_ì¿£dÕlo W÷kv¸™ÊЇhí2HÛôY.„ê§öÕ éšç<úœ³êùû®eÆEÙ`&YÛ0>­m@°¾Nkv›n¹„Ð"MÃ’4 ã8Jy“ÄÕ@áÄ#.߯LmÑ,~ì¾¾º²d»º\n!GXå4Se_cüÈ*pŒLfË@¬‡|sLèÛ#YcäÌu±¼'~MÁ;¦åñI­I(m‡µ†Ç³ªlе m®J\0Ž€º°^Ût• ýéj xÒ€@ µ‡B[¸äfª^Pݧg8¡‘zÒ§¼5UÇ÷³¾â²³Žfó(åïIªÕM«‹’E•6ŒPÃUAåý2×í)õze8ÊÂ`ˆÐýíò–âǑЯJÛV“ÚnÉé–6ü¶œšoIÕ ®íîÀN C]I.d—}VY™õ–!f¼Í \ÄÇ.à™&:^fr(|–÷ xueOµ«¾°pùQa«ÍÚ°W”xktÊlum09‡ÐåUT‘†¡nûY\a¼Î‡‹R}õáÍÃÚ”Kècväéz°bK "FDmn8¸L U6±°ªÄ¥ÈCž"Q 9+X}*t›âƒ7ù 3‚¦‹öîȃe®ëœWÜÃ*9Ò0Âh A7ë{Fà¿CÍUkN&–t³Wµ@âveajQÈÉa¬{¿%‚¾\̧¤°­3jFø6é˜ÊÁ†?t¥?GMF>/ññg#@örÀ›nTHí So‰mÉU7]cA†¿e^‘(~ß(øãïÂP낤{•[ ›þtVédåþÎÒå Ž )Ä?†ðdºµ_4v‰HöÌ ËÌ0 t1¶Tpçm7¶ö›¢3„+Ϊ’Ü ˆ *ÕZkbÚ#îæŒÞåíGÍè£$Ê9òÖ;ú ìÓÿ~pqýø'„4ôÀuÆ¿ @ÆUðmã”? œS`ÇæÉXÂg”0âÖÿT±÷˜‚FÀê!$jŽúÅÉ^,mÛ|4ýXƸŒP ™*Æ™~mÞuEm^éi 0šÿœ," `¦PÓ½ÞJ{ ¦ýÙË¢ºöä³S p~> stream xÚåZÝÛ6ß¿BèËÊÀšIQÁÝCÒKŠÛI|Om´2½ÖEŽ$g³÷×ß gdK^5ãj Á!ˆE ‡Ãá|þ¨$:4^0úmï'¯ôûÀƒ ž_½âã•„'½$‘Ô^¬•HTêåÕÕ¯¿Þæ~Dö4ñgå…*q B¼Ò{õv*#‘Ê ¥A}IFàic4Ë8_ó@¤Qêç)ñ,ÎÑIbHéE ÕÉ¡JD'žNEb¤×ZoƒªŸ¡È×îœ2’økø5 1žÐ€ïåêêÙkˆ€ÔV‘·ÚxiàÅ22ñVkïW¿Ø,~_ýxAúo Ζë_vaç)‘ä·öã¾híÏYe»]–Û¿ÜYdªà5LCøœ4!‘ìï^Í]ÖÙï.y€›ó…k4w9ÓØ8OˆNøÒ(ãƒ/l_>^ò ?[x”DðL]3äó)‘„¯ÞýóÕ…#Hâ_ܲ2e¥ÒFè˰ËÊÍÅ’æ¤,‡—RŠÔÚ~W6ý¥SÉv}Q‰v°ÇE¶:1r0=åýÙûþù½áÕêÐ¥RìIЩv¨WPÀcCs£¡›V0áÙ›Jzÿh {½ýŸ@C¨"h )ižÓñB–Zè$FÈPŸƒ<ÀË£%\m&, ”ˆ¡9?¾.î÷­],µ‰}ùœ“+-Sa>äÖ+ ¼¬/š–ÈÀo6ø”~¿µDh³úÃóÅ2ÔÚ»ÏÊ¢_¨Ä¤¹ÊflÖÑ’¼©vûÞ®inÓ6d@óí¾îx®ii`³|¡bKoŸ&ò³ro‰¿Ù°öz¤½Ž¤HâƒúíÜÁr`Ö>¢‚`}ª4׌:AUà>ª¿ªšÅ@:Bý™ŒkÑù½%}ZsOhÇîø·å‘Û¡®6—¯Ú?4åþîæ‚mØE»‹JœuHáç— Ñ7 Õj(Mß,N“Á7mûÎBÇøfm¯`Uti”üŒwÒâ“-•aÀê®±„Q ×àn_ö8Žü¢#ZF÷šÈÍÝb Xã_6ïiaNäeÖuŒ)Æ=R#’$PÅÏ?½ŒæÐà€zÌxû ©Œ7Êh€ê³¢>¨öt»;ça·uÖgbÓµ~f?ÇÔÀúPô[Û“9"¸‡Q,LjÀ¼*ž:{åTà ¦ m¹¯ê$j?«×D%l¨F€—Í"6%"ÒêKˆ-=¢Áí ÂÚu~pŠ0ðßô´wVv ÍO-‰”ŒXÊ¢ëú¸'ƒYƒ%º彫›± /³Ä=B(®ýÆìXT`ð˜ ?Âè<òHÄ¥<ëçHÛÆ9Í;Æ>8ç2Ñyâ~_Yª#³v „JV ¾oÊ™sèPDÊœUÿWÜiý禨¡#ãç³IÅû¥vÁ° â”ëS2 -¹'L9¬æ(Êõ”CtãÚ…o“jµ¦ÕÎ@É#€ð³þö–^8árqÙÁâÀÞ%XÉ•w&Y¶Eɨ‚u¸¡‰ÐY(h\à•¶ƒiþÒ†¤ÛÛg«en`ÐbœxIó^xöZ¦ ÉX'CΘ ò´ˆ$Û[&8úmè>wø…Æä[%˜îaì€{’2§à^°¨4ÿ˧…VЛ~ dØ÷E}?`h²Dh@ã”WdTeBl1ð4h½5ši˜ò7ˆjØæ- '즜K‘“å}ÓÿæO¡8GÀ•ç}¹&ÞÒfk^Þðv*kš„œ\#NÈêv‡ÚÜÑtÕ´³¥ò´ÞšË#ž–$£ø¼s¨ÍÞk‰à,È<[fvµo±ŒŒ&T¤&y²]»"­änB 2¬§HÏõ¢ÈJW´QÑAòj 2&^}Ú'8U%&a6ùȚ‚ë•þâ¿¿Ë(2_ÒÝOm<ÑÓÏX„:õ$~•OÃqxcˆ·‘8t/I¼eŠDjb{g+l ©³wê£é : 'ކ9tÜѰL­‚8ðZðó¿–Eà9-‹Ž˜7o²A«ºì‡ê›8r_Üá‰_Üo¨9ï)8'*ª€ùÐ/mÇ'@èÛM5=¬À‚;çÑþ†/LF(¬Îpá‰ÂCËÑJîÃ>äóç]É×49 xtp޲¼awÜî‚„ò¬†T¤ñ2xE_õY®K¼ sšFÚ?VÉ wî“#-/Ì4V€pI‹Ñ‹6g´9ÈüèÛÜñ«æ+¬ ›@‘†z¥“ÿ¿‚R§Ùò( $Y endstream endobj 520 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/estimate_rank_plot-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 530 0 R /BBox [0 0 720 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 531 0 R>> /ExtGState << >>/ColorSpace << /sRGB 532 0 R >>>> /Length 6224 /Filter /FlateDecode >> stream xœÝ]Io\Ir¾óW¼£Ã5/—·]Õph °[€ƒ9j ÕÔÕ6ƿޱ|IU‘UÅ’ÌA##"3r‰ü"·Ç4ü4¤á·á¿oþCÿ ãnõÇ’å¿Z2ÿ÷évø¯áÃÍŸîÿóß_ oïo%ŽCüyÿÖØ?ür€ýËæÔeøß›¿üu‡_oÒðýûí&I9?ß/úfxåÖu·Ô!oÓnY†4×]Éër¢‰éß ïZÆÝ–órÆÝTZÆU°Ìg’ö79•Ý8ýþæ”L›šè P—]Ú‚€ÒA`ÉlxPš–º[W«àdÙÒn®ÂO)ïri £DÝvÓ$”Ž«Ô¨I(%º®†Ñã¶«±VJ‡Z•º›c­”Ó¶[bÃ)Vªn,Bi˜æ]NÍd%ƒÅ[ÙMsã+kThŒ¡ÎJG‰yÝå)H($ò8í¦­I€4¾¶™Æ[ùç\6u0v]vym¶­I‡•YB£0­L£Ü\vËH´•2¿)…]c&ÒÈ­œ–°îæi˜¨-¹‰76ÞLâ-‹.»iuîÊE›ÉUD‘0í¶äzu·lž«"Š2• kT/Úúöæ o2êÐ.ûPvy¶Ì>ÄYÕ4X ÁmUF0¸ón¬®BrQ$P+N¦·ÐP.–«"ªe‚ kT/ڪ槼ráèÇ}LI¬’òƳO!‡iî²^Š K4_æ¥ñËŽ:Öt’¼UZSÆu·&×—ݼyÞJ‰4ÊvA·³u™iˆÏ6÷1e⊧y–y)ÏÜ@>b…’òæ]ßøË¨ó¦ê%y‹´¥Ð,XšnâÁäy ¥y£lðat£ÝZ—<–]Íö1…Ú–¦„±îʘ¹X÷6¡ÞŠ4ÍŽs㯻qmº $o•–”¼­ltó¶ð áó‡P*-e;_ìrÝh7×eÜeÁØöó0,?’¿<ã4vÒ‹Áø°þ•À8Ñ„D³…#è™:ž«¡µÒA`š:TݰöÖf¥±Ö {ƒ„bk“ö ÅÖ&ì °6-¥ÃZСV4°J µR:”­‹A@7(u‹€¬Í d ëôÒªh ê´MÐÚ$à .a®Ñ$h€'†·ºUú¹`̘±Ó®LÍ6 8€Í²mc¯s(M„iiP*Éã‘R"”z9-aæÿÖ2aýg& Ñ Ô¸–¦BrmPš)ómu½¼[gÏUˆ¥Æ…5ªmPŠvÙ‡ŠT`-Ó$™ ô@4(5®€¥émúBBÚ| —Ö]š,W%”W­^´µƒRôc€ÒLÓ.Oó g™¦äZ î@(u¾@¥é*…¼”&švyp¨n¢)¹:Lƒ Pj|³Tu;»;(ÅÜÇ”*)œ% ‹æið+T€Rã+Tš®Q’w€ÒDÉ:6]jÛµå-T€RçÃ.èF»;(…ÿìcŠÎ{ glļÜ Pê|J×%y(#‹ë²YÉóV*@©óat£ÝçCé1ˆ{¥%18]Œ¤Õ¯¤ôs x¡dƒ‹%iÐ ¶’M¾] +ÙØ)‘3„…膱Z3ƒØ”—ݲFˆ5¾!nÀêÕ¸A‹WÞCkÙ™·­3…lõ!šCu•lì5wËX%CkÐØ\Cc‚nÐk¶ˆ›©X€€ 5±5ªŠ¹) X68|°èæEM`¤õ6#ay€¥4Ôå¨ÙEɸÌ%÷[sÀ\šæÒdïeÉ}^yóË žÈmý>a[eP?l¡L©¶ȼ¥©Du«†Ó³€¨À+­xIÕ•ß ƒ'ˆ ý]òkhNSs®¦CóN¶üä÷åà© ªì‹8®MÝ`œ*^g ê2q9èù½a8xÒÐÑß%¿àäíK1‘KG~£Õ e)OmP`_Ý:ö1Eׂ€OZ‰–äðªT€nç+4C×(É;B7Íïujºº´¼…ŠÐ ¾Ù¥ºÝ=tëPŽÐeCÃà3O:ocà ¡|@3t’¼#tën¢ëR%JË[¨ÝƇ]Ðv÷Эn¡›ÖÑ’|fDN˜„ŠÐm|…fÓUJóŽÐµ©.¡BnaRºK¡íVè~8}t»_˜@œ–•µíCq³Ø&ÿw¾„§[[ª£¿ÏÖ «ÌDªSØ&äW¬î(Kyjƒêû¢wOØ vºpp¤Çy™7êïÍ»Á†Žþ.ù5ïžh„ØF¡çj!¿þÞ¼<µAu‚}wëDœ{NÜsð¯9‹'©û)<Û¸â¸ÐSBs nM->¹WS“Wwj%‚Oƒ óT/ÚÚ9´Gðgž(“¹Ô2ïf÷8%‚3ƒ«¾ =’kðä%ó0½´›gÏUˆàÆÆUk lí|X.¸ðºÈ™Lñ0Qˆà¿Æ÷4=%$×༄Ieq½" xä*Dð\ãª5Ð ¶žq …[ÀyèÌÏ8Iz4ƒgÝÈ7 %¬Y°´„bȲ oJG‰J)SP:JO­%H(%(F]SPZ$hÔp0:jF¬Ú$@G *p # £Ä&{èMBé£GNf7­Ö%Ø­t¬YyÐ:å‹Öá-“$”Žäq¬˜„Ò*±Ê抷ŽÒ±fä c8n%ªàp“P:JÐ| §W ƒDå“pþº;z:´_föRE;ëôÜå½Û’dYõÞKN“FÞVN<|:¼c–i&˵•R Oay¦ˆŽÇj·3»„’©„&M3à/I—ªkT²ã*OeðB—æzª•å­”H£lãÃ.ÕíìÖ‰¶Ðä%^â'iž"Gb…¦=9“Ó2oS?Lãs–ZÕÓ*è‚òó4O‘0Ñu%Lô¼ýHÍËvA7ÚºT‰ÑÃû¡c•édœô›'JIyµ29’%¨é*¥y«4Rd§Åt)°ãSkB©´–m|X Ýh7견zD6YÈä)3@|R'Çd Ïn>– œxÚK¥ñ‹®–UרÉÂ'O) ¹®Ì­žw¶ ÊËV¾Ù¥ºÝZ—šä"KyŠ-U2KNÝåØÉýÐ¥*5L]ÏÛ§~¤å”K!GKÐű“Ï-~,…²/v¹n´ûdq¿Àö˦ÍàZØž‰d5@\á]á1 è Á»ìK@ÐQ‚Âòò»¡ÉÛ Ú% Ƀ„"u“’ Eê&$?v€eu§)Ôk–F½ìa5S:JÐbi Ø:àr«;p:Ø­3g³8$t>jÀé ¡^Þ$€ÓM¾ãæKOc¹½8`2ë’ìë;.'Z¶¥Ôp9ÑD2\>á$ ø޲äòEÙ±S.? ã˜ôŒÅù£<ÿDLsç Œ#/½ç¬1›Ò2­C‚ª*“¦I(%xç­ ¥£ <Ù,3 ¥õ¸¨ò(l‹:¥Ã¢nÊÔÖaa :JÒ”°8%6‰o›„ÒÇo{ZÛ/zH»AÇšåQ]Äj¦t” yD®±˜„ÒQb®ºmJG Šjº^RZ$ȶ°ôëNo KoÐQ‚¦³9ä:Jð쯞*$fŽëÃòô“‹s³×–f]•Ý×÷n ¹„|Vò²ðYÎ{/Çóǃ€:Ëý¡¸Ø°]0P³Ï¾¼p»Úbƒº-FhŽ©sÓÕšb յńõY[lhÙλ\7Ú­ôD„Œ%i¥}L‘ê‰Ìâ5£ï~£M‹]™¨yü’µ é‚’¼UZSÊÆnºE*hy+¥ÒZ¶ñÕ.Óv£.$˜Vëá}L°HµŒ² ·~l<”v)H£ ã>Ž1]£$o•FŠÌƒ¦Kn¶®ž·R"²Á7»T·³ua„Í6:÷1eåŠOŒ¹Uð˜êïcyó–f ^ϱÀèºF-ÞÒ–2s„麕—ç-”æ²Á‡]Ðvk]fÝg @ž"›83¯ë7Ûàq?ô  ™º4þÂ{’® Ê7€ y[ö©Û-K yP¤n@ò ¡HÝ$€äGî4êJ¨èX3¾-ë®t”°å¢I(P·Õ3z°[çÅf7P8HèlÓ$€ÂAB}¸I…›<Ã% …ãÒûÐe·54ëRÒèÅlã8#5Ôõ¥¶•»bi~ìB˱rrá5‡—Ãs@wæÏk+GŽØ¦áøë/'ñà­=êV’—#(Ê™x×ÊI2Ý®OE„­O‘íCrÝ*p»|+Á"ãk”`º |+ÁSd;Àue«Àóö­/|ØÝhwE 7ö1¥Êé¿"9·ÒâH*DΗ(ÁuA¿;`)IN¯Mw”;–÷è7¬lðat£Ý]‘´)Éq5ÞÇCöºh$à|‰LרÑë‚ZnEð–ÊâQ¨EvA·³»‹"àû˜2ñž<óËGzP!Š0¾F ¦kT± °ž’ù¶‘ë&¹{ay'{Õâeƒ» íî¢xð>¦ÈZHÎG쯹¿ÏvHÀù%¸.¨jgñž"GÌ®›¸O=ïd}îeƒ» íÖ(âðºÆAq ÎÔÓâ^™ä®£F±ójã«Ç›.¨d?–2nòJº£ìZÞJÅÁøj—éF»»¶)+qx%GÓ88â fç‹Ç›®Q’w˜äŠzmº•Âó*ÌÆ7»T·³»›†œ§È¦¼n†ÖmC^m|õxÓ5Ê7äì‚n´[g„ÃoPݳ Ñóøâ¹yeåŽv¯­ö®Ñ½|÷xÑ•|³ÕRFvÓ­·¸å­TœŒ» íîg¤âŒ0É)™y%Y—“{­RqF0¾z¼é‚›k ðM®[å–å]ý>—•m|µËt£Ýb‰cŒPd?Âpší/ŽãJÅÁø@×b„Íî{Ê*5·øb‘š[ü±Ø-dO”o–ªng÷ƒA"Ø.FX8#Çé•Ï5ÇW»ië8¯|‹T·E ¸ië)Unaš®îµ˜Ýv—¬lðat£Ý}Œ ÑwŒød`vœ¦˜cYÇ•Š1‚ñ50]¥4ï#Ð[q]úoMž·R1F0>,…n´û‚†ÞÔ`øéã}v¡¯ Èw‰Ó;ä”cüÙ}÷âÔ*x§z°pþòÅ«×77ùO)õG^¿6ÿr†ü’￯z3–üèõ~xqÿû›O÷·nïï_¯»ù·×§Uýኧ%­N\Ãm‚ïÓî‡ F»Ó°æ·„„ã*íþéöþî×?Þ¼?ÐìÔüá5ÕïÓF–~y#•²ÈE‰ÐHý¨|ºÖO ¿Óz¬ôËÛ‡÷úøéBkŸû»÷ûøÇíçÏ·Ý(z²òžêÒ÷ñ´Ã…?g†ÛøjgÙ$ÔçFzûñ÷¿Ñ÷ùîí—®öHÕžNŸFz´ôg¸ZÎr±³µÒ¯w÷¿ß~º¿ûøá€ÇÐL†ªßi,=Vú3<ŽÂR¾gãÍô—äi˜¼øŸ—ä_Ë7Ÿ^þuxýÓÏ{º¹®úﬖ{x°a@ÒWäñ!iüü‘rã;ÒîãGÊîÞ‘vŸ>?>#í>|¤üî)ó­‚Ôyaðè&rûyB/êÓm’y¨gáœïcŠüPi ŠåTEy#4Íz²&/ùc™Ó©šü2†/Źæù[Ž¥DsFÛ;d Èã@Àï>Ò}ýAº/€˜D÷Eî è¿rõQ•hÙ]§K†UÐØ]2žv— (€Ý% `wÉ€Ø}Óå·a­#»ÍÝ f›¾ºÍÝ f“èn4w7˜M¢»ÑÜÝ`†D£ùú`wÉ€Ø]2 v— (€Ý% `wî€zn Ó²\¾Z]ù" —J³Çrº¨:?Š¥¨êë8ž«^6vC¨ç³K§ kª¦>]úZøüê­î×qÙI|ŸGôÏ%ô ¥Høóˆþ¹D”°çýs‰(aÏ#úçQžGôÏ%¢Ë~AV“~uæ{ùÚÐóɽ¤Ê|tèÊë¹ÊA&Ý>!úkt°ß¢íoÕ†¦÷[´ý­Ú(a÷¢ú[µOuεÀ»yº0n¼Éù…7<`A=Ë÷kT};}&0õ*σúé3©ó=ÍÔ§ëötæ^Éí##ýGG$n‡„}d¤ÿèH”°Œô‰ö‘‘þ£#_ÙQù¦åTåΨðéö_ÆíäŽÐ2:|FÓxIüQ'³aél¸foúÃóþ!zè xÞ?Döð¼ˆþ­üV>ŠÅ+‡Ðm=ÝïT›_*ºß¬§»jÓ"yrŸßÎ-›oM®}eøuq¿EÑýi } |ûSÝ_¦|ûKݦ|ûCÝߥøÊ¾ W]Fë÷J>rrÏ™›^ Jœzv™øc_ªFí+öœÙ¼ûÐykyÿ°y÷óÀ·ïšwŸ9ÿ골úO$vÎBQ&*ŽÏgÀ (/GP>=VeþÜ¥»ã|íhXÝŸÓ×m]f_ÓßÖm\û˜nü´nãú·t»Oëž:_ã_?tF4°ýì†NJ}'(7yZºð¦¡œLÿø’ֲË7o?üôrø×4 /îþïÍ绢³>ü=WŸôï‰Ww3Ò×xG©Èeºî®VݹÈWÝs,ºÿùöÍýŸn‡Ïÿøýöðà{ÄjÍŒ_\Ìr@¿âgouÇž|=>†gÞnÚäŠéJëµažä° ßíJbw5âÀƒˆ'ÌyoöèÕˆa˜©Íª¼)Eê?“OLz—Z`®²â%÷5«¶ø|±ys]Pš·H[ÊÊßó1Ý,ßݵ¼³—×Ê6>,…n´ûíÍ«s»—@k]OëÞCïèOë^~‰‘C÷*}¬{½£ÂŒS»†Ä©¿5qšÄÐJÅîÝ]£²=³ðùD¯ë޼Áçy »×ø° ºÑîó»¯NêÞC)Oê^þò ‡ýÖ½ uO˜qb÷š!1E_khóŽX²u¨Ð½Æ×î3]£$ïнi+¼Vu]}­ay º×ù° ºÑî º—–è¸=õd÷z¿zZ÷.‹ü)ï^¥uï¡·)O˜qj÷˜"õ·&&h­Õ»@©Ø½à£û kÔb“ÄSfÞþ0ÝeâÈÊòV*v¯ñat£Ý±{Ï€úƒÛÛü©¸"/-']3¼zswÿá¯TÊ(Ÿî”Rnï?ïî>‚ØEF Ô^üðñöÝ»»·w·>¥Z¥¥²¯kaîo?ÜÿñEI_3^-8¡ñ÷B’üÍJ Xÿüó!2(˜£°5\®¤¨.õã1ëÍÿ&º` endstream endobj 534 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 540 0 obj << /Length 2031 /Filter /FlateDecode >> stream xÚíÙ’ÓFð}¿BE^ì*™'rÖä üæz.@¼6§MÛ¡ERŽQ9D?w Jˆ(Â0ñä’CÔ»ÝÒ Õk¢u9_ž³¾µë¾ð¢ÔôÜ6ÀìsP,b’X´‡Àgf;»êœvW?Ðlgèxó2äªëòjG53¨/7ïè½3¯^K¯9]W’Y­‘º–*¢#8©ÐÛöEçI:ÿ@(xL×ô«\:£­Ìt†ÍIªgß9æÞÎI ƒ”Í!Wþ7Œ' ì ¨áqCæ|P¢£HA¿m  4¯i§´¦FÐЭ·I4ð øþ ÄÉœWD{v¥ž-¯,¹©ãÖ4æ, £ÁQŸýôä„/Ãé8Ζ<𵋖¿ô4°!ûå™S@ ™Z†ø69Tú¯V>$Ä1è´ ´ö ‰ô`þØE»Û´´W7ù&¯LA`”ö.z§ï$Å!Ò<‚¡)Ñð}‡ñN$ûãQä4ž½õô]‚§³ë>Gd=`YùKú6'B‚2I<`AR³§,m`;NgYÂHÛìB[Š'ä¤í\RÓi ·t\fCZÙqâÄÓ ž_ÙŒò/ÀVÆo‚”~µ Z|tRä.e"N½ÃÝÝn”ÿ'$T-Á¦’èð¸~É¥" wË{oKÛ&ËÜÅRÒÅr0ìmJQwôB©¶1HL“·N`xwùŽŠ æ+ªXÑhA ÈSéŒùHˆ’IøŽCÄ™}%,ësè ÑÕÎÔ1Vˆ ¸]wU¶'BÕ”@ÙõD–˜‘1)í%°ôBÑŠUi—xêÓ9€o¸nïoÆÊ«(ÃiO8k#ÖÖ´- мõЯq£´ÝùKæoÎýaÓlúr¸”ÄKßÝ•9:Ù 5H:ûò·Ð2Ù)CB¶²•¹,Ðà‘vQ µÉìm. ÂЮZ4e^<ùеÖfd؉åw¯ê¾Èü-EëïÞA„1l3Ïßw–œ ò± ëèwC)úóÀm÷i÷‘«CïæšÈˆMØÅ~(&t±7†§> /ExtGState << >>/ColorSpace << /sRGB 545 0 R >>>> /Length 38285 /Filter /FlateDecode >> stream xœ¬ÝÏ’ãØyôáý\E-í…)â?°ðBã°ñÅxaG߀<1 ËÂnéþ?œ“™¨":³5¯Ü µ=ýë·Š< °X 8¼ý¿·áí?ßþç»åÿ~óùßþùû·?÷|ÌãóíùX§åüs;Ö·Ï?þòÝòx>߯ulÿgy¬ÇÛüÆ·ÿýé»·ß«­ío|ÛžqJm~œß)´ý1¯¡íãcÙS[Û_ûv<ûÚü8Ò}8ŽÇsömzN!܇é¹=Æ-´axLá>LÃòXÂZOÃñXÃíœÆé±…µžÆí±§Û9 #¬õ4­gºóó1„µžæsÛ~¹ÖÏÇ1MçckÚÛãlœŽ÷GØ4Ÿ[<ݳåÜâi ,çO÷l=Æi ¬ócO÷l=â£}ÚÎ-EÓ¶ÅGû´ñÑ>íK|´OûíÓ1ÅGûtlñÑ>?‡øhŸŸ«{´Ÿ*Ì۹͞϶å†ùÖ›‡gÜæavû€—æü:ç? Ô(Zk=6ŠVEË £÷FÑ‚ÃèÅQ´ä(Zs:ŠVFÏŽ¢uGÑÂÃèåQ´ô0z{->Œ^Å?±þ0z€­@Œž Ek¢EˆÑ+¤hbô)Zˆ­DŒž"EkbÀH± G¦-zÄè=B 1z½GˆÁ#FïbðˆÑ{Äè=ê1yÄè=B 1z½GˆÁ#FïbðˆÑ{„jº@k¸BR¯ñI¬Á,5̤‹$±–ÔÚS|ÛíUƒZ¨I-Ö kP 5©ÅÔBMj±µXƒZ½FµXƒZ¨I-Ö kP 5©ÅÔBMj±µP“Z¬%µ8ÔBMj±µP“Z¬A-Ö jR‹5¨…šÔb j±µP“Z¬A­^£Z¬%µ0“Ôb­¨5LgJ˜5|–p¯ñÄYç £¦f Ÿ'Ì>P5}¢0køHaÔô™Â¬áC…QÓ§ ³VÔÒLø\aÔôÁ¬ᓅQÓG ³†Ïf .Œš>]˜5|¼0jú|aÖðìá†QÓG ³†Ïî5~È0kE-Τf-©u<ö¯|ð9kP 5©ÅÔb j¡&µXƒZ¨I-Ö kP«×¨kP 5©ÅÔb j¡&µXƒZ¨I-Ö jR‹µ¤g‚Z¨I-Ö jR‹5¨ÅÔBMj±µP“Z¬A-Ö jR‹5¨ÕkT‹µ¤f’Z¬µ¶sGÉïžVõj±µT½Zª^-Ö –ªW‹5¨¥êÕRõj¡&µT½Z¬A-U¯–ªW‹5¨¥êÕb j©zµXƒZªµ4ãÕb j©zµXƒZª^-U¯kPKÕ«ÅÔRõj©zµXƒZª^-Ô¤–jE-εT+jK6æ3T½Z¬A-U¯–ªW‹5¨¥êÕb j©zµT½Z¨I-U¯kPKÕ«¥êÕb j©zµXƒZª^-Ö –jE-ÍxµXƒZª^-Ö –ªWKÕ«ÅÔRõj±µT½Zª^-Ö –ªW 5©¥ZQ‹3A-Õ’Zk»qQ-Ö jR‹5¨ÅÔBMj±µP“Z¬A-Ö V¯Q-Ö jR‹5¨ÅÔBMj±µP“Z¬A-Ô¤kI-εP“Z¬A-Ô¤kP‹5¨…šÔb j¡&µXƒZ¬A-Ô¤kP«×¨kI-Ì$µX+jãcÍg>¨zµXƒZª^-U¯kPKÕ«ÅÔRõj©zµP“Zª^-Ö –ªWKÕ«ÅÔRõj±µT½Z¬A-ÕŠZšñj±µT½Z¬A-U¯–ªW‹5¨¥êÕb j©zµT½Z¬A-U¯jRKµ¢g‚Zª%µöǘß=­ÔBMj±µXƒZ¨I-Ö jR‹5¨ÅÔê5ªÅÔBMj±µXƒZ¨I-Ö jR‹5¨…šÔb-©Å™ jR‹5¨…šÔb j±µP“Z¬A-Ô¤kP‹5¨…šÔb jõÕb-©…™¤kA­ñÜxæÃU­Zª^­«Zµ®jÕRõj]Õª¥êÕºªUëªV-Ö ÖU­Zª^­«Zµ®jÕRõj]Õª¥êÕºªUKÕ«uÕ‚Z׌UKÕ«uU«–ªWëªV­«ZµT½ZWµj©zµ®jÕºªUKÕ«uU«kP몵4ãÕºjI­sWˆïž¾jP 5©ÅÔb j¡&µXƒZ¨I-Ö kP«×¨kP 5©ÅÔb j¡&µXƒZ¨I-Ö jR‹µ¤g‚Z¨I-Ö jR‹5¨ÅÔBMj±µP“Z¬A-Ö jR‹5¨ÕkT‹µ¤f’Z¬µÎeŠg>\Õ«ÅÔRõj©zµXƒZª^-Ö –ªWKÕ«…šÔRõj±µT½Zª^-Ö –ªW‹5¨¥êÕb j©VÔÒŒW‹5¨¥êÕb j©zµT½Z¬A-U¯kPKÕ«¥êÕb j©zµP“Zªµ8ÔRµjýëÛÿ|÷›ÏÿöÏß¿ýø¹6¬íËóÛÐ!k_~iÛe^Ÿ×޵·¿Ð w>|c>L,ab[Û_·X¾OÌab>âçÜ2}11…‰cnßãýÏ÷‰1M¬í{ÌûøážŸ ÚV+ÝõqlÞ¯ÇüåHå¾s¤rç9R¹÷)Ýýõ1mÅ»‘ÒÝÇHéîc$ÝýáÙÔ[»}ó2|©ÜýñFJw#¥»‘ÒÝÇHåîŸO«ö¯ôÜÝçHåîs¤r÷9R¹û©Üý¥ýEíîs¤tÐÇH騑ÊÝçHéîŸ?Ž|)Ý}Œ”î>FJw#•»¿íg™ÒÝçHåîs¤r÷9R¹û)Ýý­ýT»û)Ý}Œ”î>FJw#éî»§ûçOZãX{¾Ï‘ÊÝçHåîs¤r÷9Rºûø,÷t÷÷¾õ—óIõ#¥»‘ÒÝÇHéîc¤r÷ùÑÑ•»Ï‘ÊÝçHåîs¤r÷9R¹ûü¤ÚÊÝçHåîs¤r÷9R¹û)Ý}|0féîc¤t÷1Rºû)Ý}ŒTî¾>b¯bŸfÒK_³}>ÿ¶ée&­¾ÏÞÿlǦ3i žÏ¶ÄËÖ? õö‚µ5ÀvÕÖ3µ5ÀLm 0S[̔րÿSZΔր3¥5àLi 8S[|˜Hm 0S[ÌÔÖ3µ5ÀLi øÑ¥5àLi 8SZΔր3¥5à…ÎKkÀ™Òp¦´œ)­gjk€Ë&WŽ‹š©­fjk€™Ú`¦´¼ki 8SZΔր3¥5àLm pIÇÚ`¦¶˜©­fjk€™Òðq¥5àLi 8SZΔր3µ5Àå¦jk€™Ú`¦¶˜©­fJkÀ‹×”Ö€3¥5àLi 8SZÎÔ֗¨­fjk€™Ú`¦¶˜)­ßX_ZΔր3¥5àLi 8SZ¾M·´œ)­gJkÀ™Òp¦¶xÓ_m 0S[ÌÔÖ3µ5ÀLi ø¢Òp¦´œ)­gJkÀ™Úà µ5ÀLm 0S[ÌÔÖ3•5ÐéÍ•5ÐLe 4SYÍTÖ@3µ5ÀÉ’µ5ÀLm 0S[ÌÔÖ3¥5à©W¥5àLi 8SZΔր3~ Ú©dßúx6¾ïûŸíkü柦·áíÓï߆öwoïà¿Ç}j§ÎÃyz¾}úï·¿ùí?<~û/?üíÛ§ÿüî?¥•æØ³½|ü¶µgrýܲï?Å3~õÆÓcxê«òƼß{Ö nH;oð|´|ã¯ÚoÈûŠ´5ÿU‹:­{;ñ¯ÿÃO?ÿü~Gì¹<œY¶¶Éïw$ÿùÃ’Ú³È8¸¶sj¿ù}ÁW½-©e˜7c>Úoj¾õÍÀWý+—tÜÛiSmøó~þ?þù§?ýé§SsŽ)'‡ci§c÷ûÑ!ïÇ®iêÿºmcÚî3ËèfÆ…ÿó·™ýéf†ùíúnãí¶­çáfžkÿ×Gÿs¼ÏL»™Ùùíº…Ã|ŸY77³¯ümæyŸ97Ó÷£ÿu»/3[ûQÍ̬ۛVb?Ÿ¼Ýf·}öåà­Â}»ÍÈÑ×™þ¦¬^»o/3{{š™©ŸþKÛ}ï3“Û>{߇Û=ÁzÜfV»}FÝ“63ÜgŽÕÍô_"ïGŸ\oÑã1Ú탻oÙ¶†·™ÅmŸíнo3Ë}fwû¶Ïoz4ìËËýÏç(ƒÛ>[·oí1ºÏÓ}fvÛö·öºÍ¬nû@WÍ|qÛ·/l][ß«÷µÿ9>ï3‹Û>[ßCñèÞ‡õ>³Ûí3ìÜ2xL¼ÌŒíy”™Á^°ô5xÎ÷™ÙmŸè¾í·cÓ9³¹í³â‘6·5h£ÛÌáöɱçmûþ:3µç"n[³¿ÙdŸï3‹Û>+VGÜm½Ïìnû¬X±þŒrÛnѹýŠÂÌô{²mh×ÛÌì¶Ï Cº Û:Üg6»}úwØûÏÛ²Ýg·/àDH²Í·ýgig嘙gÿ>ý§®m^î3‹Û> é“Û´Ýgv·}ðÄbmÓm­×Çàö…eë÷þèŽÇ}fvÛgY—3ã}fsÛgéO}!cÛÿ^f¶öÜÄÌÌ ÑmæyŸÝöYú³ hº=×ûÌâ¶Ï2âûô·__ܶÝnŸþ[_½õ¸í?{{³–›y¾IíõxÞgf·}ænȶ¶=b½=±3»í3Áþ×ëíxzÎlnûL0¤?ï]oÇÓv”Û>SÔl}Ï[Žõ>3¹}a‚!ýˆ¿ÜާçÌê¶ÏÔ·Ìö|ySîûÌa·îý¿¾Ý¶ùúyñ6ó¤8xï63ÛíƒS(» ËzÜg6·}Æþ¯ñld¹O‡åñtÛgìÏx×þçr;ž¶—ݾ0nÛžÁ,·ãé9³ºí3vCÖþ¼w¹OÏ™ÃmŸqYÞô¬g™o÷gm/Hš™y¢lí¸2Ýgf·}ÆþŒjí·p¹OÏ™ÍmŸ±‚gWËíx:líÝ}f¯”ö{µÜާçÌäö…±?Á3²e˜ï3«Û>C7—?XnÇÓsæpÛgèG쵯Þò¼ÝŸý¼énGÒ>3ߎ§çÌì¬pTìÏçÛñ´è¶Ï€£UßJ÷j†£>ffpäéG‡ùv<=g&·/ 8Šôç½ó¶ÜgV·}êÞ óíxzÎvû@Ýþ¼w¾OÇöÐr30¤?‚æÛñt|^/C¾Î¸·^¾Ïlnû<HÝþzž_ïÏ8´ #˜ÒvóíxzÎLn_xv V¼øv;žŽÃõâÛë öÐþèžÇ/nÛá¶Ï{[;ߎ§ãè_{bÏé{Ä|û™öœYܾðìN<›ŸoÇÓsƾ.öÄköý9ìü|}ŒŽ“]ìÙø `¾OÏûº˜ýÝÑûÌj·Oß2šï3æu±ÿë‹£ðå5Úþâè¯æKm¸=Y×üíj ö"SÂ7®{[;|Ñó¹Ìò¼¹f#Ž×©½½dd§ì…!8uLé{a¿{ýêÃÔÔ~‚ôSø÷|•UÇcN ñ~ñuß ¯]l/SS¼_Gßû0{ý,À©9Þ¯ãÃOÆóëNK¼_~ºëÛkÒsNåí…×™'üöiz]¼½ðÊŽNÃm ¿²½Ü%†05§íõWï'çòöGêÜäîõÂ~Âáã}ø1–ǧñÃø\_>Œ¯õñýÃø^oW\áøðˆêïÉÇÛ÷èÿ½ãŒÍ}i”ö-þ÷w¿ü×Ûß¿½÷ouÿß_ðiš‡~ü«®j/X¥ê/XuU{Áª«Ú V©ú V]Õ^°JÕ_°êªö‚UWµ¬b ¬ºª½`•ª¿`ÕUí«®j/X¥ê/XuU{Á*UÁª«Ú V©ú V]Õ^°êªöÒTªþÒTWµ—¦Rõ—¦ò¢^3ö‚UWµ¬Rõ¬ºª½`•ª¿`ÕUí«®j/X¥ê/XuU{Á*ÖpÁª«Ú V©úKS]5\PÏûÔwòèkð 5ùÄ|b >¡&ŸXƒO¨É'Öàkð©×èkð 5ùÄ|b >¡&ŸXƒO¨É'Öàjò‰5øÄ|BM>±ŸPk>q&øÄ|BM>±ŸP“O¬Á'Öàjò‰5øÔkô‰5ø„š|b­øt>¦øÍWõ>±ŸT½OªÞ'Öà“ª÷‰5ø¤ê}Rõ>¡&ŸT½O¬Á'U÷‰5ø¤ê}b >©zŸXƒOªÞ'UïkðIÕûÄZòI3Þ'UïkðIÕûÄ|Rõ>©zŸXƒOªÞ'Ô䓪÷‰5ø¤Zòio¿,ˆ>±ŸP“O¬Á'Öàjò‰5ø„š|b >±Ÿz>±ŸP“O¬Á'Öàjò‰5ø„š|b >¡&ŸXƒO¬Á'Ôäkð µæg‚O¬Á'Ôäkð 5ùÄ|b >¡&ŸXƒO½FŸXƒO¨É'ÖŠOëÔN¢H>©zŸXƒOªÞ'UïkðIÕûÄ|Rõ>©zŸP“OªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT½O¬Á'U÷‰5ø¤ê}b-ù¤÷‰5ø¤ê}b >©zŸT½O¬Á'UïjòIÕûÄ|R-ùt´£O¬Á'Ôäkð‰5ø„š|b >¡&ŸXƒO¬Á§^£O¬Á'Ôäkð‰5ø„š|b >¡&ŸXƒO¨É'Öàkð 5ùÄ|B­ùÄ™àkð 5ùÄ|BM>±ŸXƒO¨É'ÖàS¯Ñ'Öàjò‰µâÓ¶´…M>©zŸXƒOªÞ'UïkðIÕûÄ|Rõ>©zŸP“OªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT½O¬Á'U÷‰5ø¤ê}b-ù¤÷‰5ø¤ê}b >©zŸT½O¬Á'UïjòIÕûÄ|R­øÔN‰Éç¨zŸXƒOªÞ'UïkðIÕûÄ|Rõ>©zŸP“OªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT½O¬Á'U÷‰5ø¤ê}b-ù¤÷‰5ø¤ê}b >©zŸT½O¬Á'UïjòIÕûÄ|R-ùÔOÚ>±ŸP“O¬Á'Öàjò‰5ø„š|b >±Ÿz>±ŸP“O¬Á'Öàjò‰5ø„š|b >¡&ŸXƒO¬Á'Ôäkð µæg‚O¬Á'Ôäkð 5ùÄ|b >¡&ŸXƒO½FŸXƒO¨É'ÖŠOGƒ]òIÕûÄ|Rõ>©zŸXƒOªÞ'Öà“ª÷IÕû„š|Rõ>±ŸT½OªÞ'Öà“ª÷‰5ø¤ê}b >©zŸT½O¬Á'UïkÉ'ÍxŸT½O¬Á'UïkðIÕû¤ê}b >©zŸP“OªÞ'Öà“jɧþÀ>±ŸP“O¬Á'Öàjò‰5ø„š|b >±Ÿz>±ŸP“O¬Á'Öàjò‰5ø„š|b >¡&ŸXƒO¬Á'Ôäkð µæg‚O¬Á'Ôäkð 5ùÄ|b >¡&ŸXƒO½FŸXƒO¨É'Ö‚Os»pM<¿àªÖ'UïÓU­OWµ>©zŸ®j}Rõ>]ÕútUëkðéªÖ'UïÓU­OWµ>©zŸ®j}Rõ>]Õú¤ê}ºªõéªÖ'UïÓU­OªŸ®ëÓU­OªÞ§«ZŸT½OWµ>]Õú¤ê}ºªõ‰5øtU듪÷éª%ŸŽö†üèkð 5ùÄ|b >¡&ŸXƒO¨É'Öàkð©×èkð 5ùÄ|b >¡&ŸXƒO¨É'Öàjò‰5øÄ|BM>±ŸPk>q&øÄ|BM>±ŸP“O¬Á'Öàjò‰5øÔkô‰5ø„š|b­øtþã#ž_pUïkðIÕû¤ê}b >©zŸXƒOªÞ'UïjòIÕûÄê}ò×`¸f¬Za_ÓŒ·Œ5X¦ê-c –©zËXƒeªÞ2Uok°LÕ[Æš,ûÊþ’,Sõ–±ËT½e¬Á2Uo™ª·Œ5X¦ê-CM–©zËXƒeªÖ²ö‘K|×ðU½Z¬A-U¯–ªW‹5¨¥êÕb j©zµT½Z¨I-U¯kI-ÍTÔÒŒW‹5¨¥êÕb j©zµXƒZª^-U¯kPKÕ«ÅZRK3^-U¯kPKÕ«ÅÔRõj©zµXƒZª^-Ô¤–ªW‹5¨¥ÔZÛÅ‚£Z¬A-Ô¤kP‹5¨…šÔb j¡&µXƒZ¬A­^£Z¬A-ÔšZœ)©Å™ jR‹5¨…šÔb j¡&µXƒZ¬A-Ô¤kP µ¦g‚Z¬A-Ô¤kP 5©ÅÔb j¡&µXƒZ½FµXƒZ¨I-V¯„I-U¯kPKÕ«¥êÕb j©zµXƒZª^-U¯jRKÕ«ÅZRK3µ4ãÕb j©zµXƒZª^-Ö –ªWKÕ«ÅÔRõj±–ÔÒŒWKÕ«ÅÔRõj±µT½Zª^-Ö –ªW 5©¥êÕb j©µ¶¶A£Z¬A-Ô¤kP‹5¨…šÔb j¡&µXƒZ¬A­^£Z¬A-ÔšZœ)©Å™ jR‹5¨…šÔb j¡&µXƒZ¬A-Ô¤kP µ¦g‚Z¬A-Ô¤kP 5©ÅÔb j¡&µXƒZ½FµXƒZ¨I-V¯V»n|7òU½Z¬A-U¯–ªW‹5¨¥êÕb j©zµT½Z¨I-U¯kI-ÍTÔÒŒW‹5¨¥êÕb j©zµXƒZª^-U¯kPKÕ«ÅZRK3^-U¯kPKÕ«ÅÔRõj©zµXƒZª^-Ô¤–ªW‹5¨¥Ôê0Õb j¡&µXƒZ¬A-Ô¤kP 5©ÅÔb jõÕb j¡ÖÔâLI-εP“Z¬A-Ô¤kP 5©ÅÔb j¡&µXƒZ¨5µ8Ôb j¡&µXƒZ¨I-Ö kP 5©ÅÔê5ªÅÔBMj±zµÚÕäã;—¯êÕb j©zµT½Z¬A-U¯kPKÕ«¥êÕBMj©zµXKji¦¢–f¼Z¬A-U¯kPKÕ«ÅÔRõj©zµXƒZª^-Ö’Zšñj©zµXƒZª^-Ö –ªWKÕ«ÅÔRõj¡&µT½Z¬A-U¯ÖÚ>O'ª¥êÕb j©zµT½Z¬A-U¯kPKÕ«¥êÕBMj©zµXKji¦¢–f¼Z¬A-U¯kPKÕ«ÅÔRõj©zµXƒZª^-Ö’Zšñj©zµXƒZª^-Ö –ªWKÕ«ÅÔRõj¡&µT½Z¬A-Õ ÖÚ>f/ªÅÔBMj±µXƒZ¨I-Ö jR‹5¨ÅÔê5ªÅÔB­©Å™’Zœ j¡&µXƒZ¨I-Ö jR‹5¨ÅÔBMj±µPkjq&¨ÅÔBMj±µP“Z¬A-Ö jR‹5¨ÕkT‹5¨…šÔbõjmCû Ü¤–ªW‹5¨¥êÕRõj±µT½Z¬A-U¯–ªW 5©¥êÕb-©¥™ŠZšñj±µT½Z¬A-U¯kPKÕ«¥êÕb j©zµXKjiÆ«¥êÕb j©zµXƒZª^-U¯kPKÕ«…šÔRõj±µTÃû|ܧeÎçÒÍù}ÒªÁ2Ôdk°Œ5X†š,c –¡&ËXƒe¬Á²^£e¬Á2Ôd™w‰3Á2ïg‚e¨É2Ö`j²Œ5X†š,c –±ËP“e¬Á2Ôšeœ –±ËP“e¬Á2Ôdk°Œ5X†š,c –õ-c –¡&ËXƒevÙÏ…ÍgI¨zËXƒeªÞ2Uok°LÕ[Æ,Sõ–©zËP“eªÞ2Öd™=Îh&Xf÷5ÍxËXƒeªÞ2Ö`™ª·Œ5X¦ê-Sõ–±ËT½e¬Þ²«zµT½Z¬A-U¯kPKÕ«¥êÕb j©zµP“Zª^-Ö –jI­½ÝȨkP 5©ÅÔb j¡&µXƒZ¨I-Ö kP«×¨kP µ¦gJjq&¨…šÔb j¡&µXƒZ¨I-Ö kP 5©ÅÔBMj±µXƒZ¨I-Ö jR‹5¨ÅÔBMj±µzj±µP“Z¬µÎÝwÉgI¨zµXƒZª^-U¯kPKÕ«ÅÔRõj©zµP“Zª^-Ö’Z𩍥¯kPKÕ«ÅÔRõj±µT½Zª^-Ö –ªW‹5¨¥êÕRõj±µT½Z¬A-U¯–ªW‹5¨¥êÕBMj©zµXƒZªµ–çùÿÇwZ_Õª¥êÕºªUëªV-U¯ÖU­Zª^­«Zµ®jÕb j]Õª¥ZQëš)¨uÍXµT½ZWµj©zµ®jÕRõj]ÕªuU«–ªWëªV-U¯ÖU­ZWµj©zµ®jÕRõj]ÕªuU«–ªWëªV-Ö ÖU­Zª^­«–ÔZ{Ò¯¶˜©­fjk€™Ú`¦´ü€°Òp¦´œ)­gJkÀ™Úàã†jk€™Ú`¦¶˜©­fJkÀ/)=?àLi 8SZΔր3¥5àG!”Ö€3¥5àLi 8SZÎÔÖV¯­fjk€™Ú`¦¶˜)­/Ó\ZΔր3¥5àLi 8S[\Þµd"gjk€¿¿OûI¡ÝÎñe&­Á1·ŸKÞÿü8“ÖàX~ŸkÀ‹E¦5ûã`=f3“Öà|žÒÖm™>þÌÄ™Òp&>f¬u{4œwúe¦¶¸ô\m 0S[ÌÔÖ3µ5ÀLi x!«Òp¦´œ)­gJkÀ™Êè²8•5ÐLe 4SYÍTÖ@3µ5ÀE6jk€™Ú`¦¶˜©­fJkÀ·ì—Ö€3¥5àLi 8SZÎÔÖo®­fjk€™Ú`¦¶˜)­ßNXZΔր3¥5àLi 8S[¼9©¶˜©­fjk€™Ú`¦´|«Ci 8SZΔր3¥5àLm pâtm 0S[ÌÔÖ3µ5ÀLåç†Yù™I3¥5àLi 8SZΔր'u•Ö€3¥5àLi 8SZÎø5h'©}ÿéãyjø¾ï¶¯ñ›šÞ†·O¿Úß½½ÿÿ^‡£†8ŸGáó›~úï·¿ùí?<~û/?üíÛ§ÿüî?…•ÖØ³-ÐÛÖžÉõ?p˾ÿoÌøÕ3ᩯÊó~CÜ®ÏÒÎ=<-ßø†ð«öò¾"mÍÕ¢NëÞN)lãÿðÓÏ?¿ßç‘f–­mòûñ]ÍÌk;ñò[ßy|Õvë¿ÿ»_n¿{íA·eZÚwßú¶à«¶Ûòéå¶üúm=ÛWø÷ß}þÃç*󢈆ÚïyŸßüÎà«¶›2¼ß ÷»\ÞŒñÛ‰Óßøfð«¶›1¾ß ÇnÆÞÃó­o¾j»Sy«ŽkòÿøÇ_>ÿôËç?¾?L_Õ­Áùh¿©ùÖ÷_õ¶eÝ«ˆºÓÞNóþÖ7_õeËúƒ’nÆù¼søæ;-¿ê_¹eŸ§>Ø_?ÿáçÿøãŸúÓŸ~ú°ÓšW9yîÃí@ÙïG{!öý™ã4õÝàÇ´ÝgŽÝÍŒ ÿ5æ_fNQV7ƒ›Ãw—û̲¸™çÚÿõÑÿï3'N_ÎìÇüvÝÂa~YÚ ff_ùÚÌó>3n¦›tô¿n·ó6³=Ý̺½i%öc¿ÏnûìËÁ[…ûö2³6½ÍLÖ„Õk÷í6³¸í³Oýû<û[_öñ>³»í³wÛ=Áz¼ÌœÿÜnŸQ÷¤Í ÷™Ó-3ÓßV³}rÝî3›Ý>ð¥oÙ¶†/3ýùâ—3Û¡{ßf–ûÌèö…mŸßôhØ—á>³¸í³õ߃ì[{ŒîótŸÙÝöÁ‘°­¶ÕËÌÑÞÌaf–éÃÌpŸ™Ý¾°u=ðHmÏ®n3›Û>[ß«÷µÿ9¾î?ûé—Û>[ßCñèÞ‡õ>3Ùí3ìÜ2xLÜf»}°,6·™ÝmŸè¾íÏÛýƒÛ>+is[ƒö8ºÍÌn_Àóìy·c`›ÙÜöY¹5—7<ö^fÆö v3ƒUÆ“˜m½ÏLnû¬X±þüz{}ØfgÕÚïÉ>öcúºÜgv·}VÒUØÖ×ÇhûÅÝ>ý;ìý'°mÙî3³ÛVÒÿÜæã>³ÙíÓŸìýw—ÛíxºÏ§Û>ˇ7n·ãé93¹íƒ§Ùk»OÏ™Õí ËÖïýÑÿûÌî¶ÏÒ ÑÌí1º\Ïs^gú±í·™Ùí ˼ðÝfž÷™ÍmŸ¥?›€¦Ûíxº÷·²™™ß§­Ûz;žž3“Ý>ý/¶¾zëíxÚÞÄêö…¥}¡öz<ï3‡Û>s7d[Û±ÞާûÖÞzéfžoæ¹ÍÌnûÌÛÎ=6Üf6·}æmàžsÎÜŽ§ûyltÛgîºãˆ²®Ó}frÛg½­y²ÜgV·/Ì´?‚ÖÛñôœ9Üöágý9ìz;žîG{ ÇÌŒÚCáÖmf¶Ûâô£Ý:-÷™ÍY5C‚þv½Og{CÕ—3÷оã|Ÿ™Üö™°çŒøAf½Ï¬n_˜¶õÃÌxŸ9Üö™`Hÿëõv<=†Çè¶ÏCúóÞõv<=g·}¦þ¨Ùúž·ë}fsûÂCú¹OÏŸëŸnûL}ËlÏoÜþ03Ùíƒ{à¯×ûÌêö…ixRœs›9ìöé·jí*,ëëcô˜Ú‰æ_ÎŒý_ãÙÈr;žž3‹Û>#~üí.·ãé9³¹}a܆7=ƒYnÇÓcno<73ݵ?ï]nÇÓsfrÛg\–7=ëYæá>³ºí3ÎekÇ•é>s¸í3ögTk¿…Ëíxz,íÍáf¦‚gWËíxzÎ,vûàuã~¯–ÛñôœÙݾ0ög xF¶Ü~¦=Îc£Û>C7—™XnÇÓsfrÛgèG쵯Þòï3«Û>ޤ}f>¾¸m‡³jÀQ±?[œoÇÓ£ÿÒ×ÌàhÕ·Òíe«6³¸í3àÈÓóíxŠ·Ö»™R·™Ûcto¯à˜êÞ/q;žž3“Ý>P·?ïoÇÓsfµÛ†ôGм|qÛ·/ OéŽãñËÌyltÛçy@êþ[—y»Ï,nûOì¡ýÑ=¿OÛÌì¶Ï{[;¿OÛŒ}]ÌýæéÃÌáö…gtâÙü|{1ñ9ø×Åžø F;?÷ûŒ}]ìÙø `¾½}ÎØ×Åܘ×ÌØ~#ãfžfÆûŒy]ìÿøâ(|y©¸¿8ú«†ñÒcnO4»j…½P˺µæÆuo.â‹c{^òzäšqŒ8^§Ú«~jî{7ÌÚ¸æš:«á{a¿{ýêÃÔÔNòSø÷|•UâÔï_÷ÝðÚÅö25Åûuô½³úY@Ss¼_ö²:œZâý:ðÓ]ß^Ÿ3h*o/¼Î<áwqÓëjäí…W.ptnkø•íå.å„©9m¯¿v?Y¶Ô¹=+ëõ_¿Ÿhøx~Œåñiü0>×Ç—ãk}|ÿ0¾—ÇÛ{9>|¢zÖÀxûý¿ÏCK?u_ÚC¥}ÿýÝ/ÿõö÷ooÓý{Ýÿ÷€Z·­}ƒpe°«Ú+ƒ©ú+ƒ]Õ^ìªöÊ`ªþÊ`WµWSõW»ª½2ØUí•ÁXÕÁ®j¯ ¦ê¯ vU{ °«Ú«}©ú«}]Õ^íKÕ_íëªöj_ªþj_WµWûºª½Ú—ª¿Ú×UíÕ¾TýÕ¾®j¯öåÁ½fì5ÀTý5À®j¯¦ê¯vU{ °«Úk€©úk€]Õ^Œ5\ìªö`ªþ`W W.´>¬ñÚöWõ>±ŸT½OªÞ'Öà“ª÷‰5ø¤ê}Rõ>¡&ŸT½O¬Á'U÷‰5ø¤ê}b >©zŸXƒOªÞ'UïkðIÕûÄ|R­ø¤ïkðIÕûÄ|Rõ>©zŸXƒOªÞ'Ô䓪÷‰5ø¤Zòio¯.FŸXƒO¨É'Öàkð 5ùÄ|BM>±ŸXƒO½FŸXƒO¨É'Öàkð 5ùÄ|BM>±ŸP“O¬Á'Öàjò‰5ø„š|b-ùÄ™àjò‰5ø„š|b >±ŸP“O¬Á§^£O¬Á'Ôäkŧö“x½ú«zŸXƒOªÞ'UïkðIÕûÄ|Rõ>©zŸP“OªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT½O¬Á'U÷‰5ø¤ê}b >©V|ÒŒ÷‰5ø¤ê}b >©zŸT½O¬Á'UïjòIÕûÄ|R-ùt´3¤¢O¬Á'Ôäkð‰5ø„š|b >¡&ŸXƒO¬Á§^£O¬Á'Ôäkð‰5ø„š|b >¡&ŸXƒO¨É'Öàkð 5ùÄ|BM>±–|âLð 5ùÄ|BM>±ŸXƒO¨É'ÖàS¯Ñ'Öàjò‰µàÓö\ÚÙÌÁ§«ZŸT½OWµ>]Õú¤ê}ºªõIÕûtUëÓU­O¬Á§«ZŸT½OWµ>]Õú¤ê}ºªõIÕûtU듪÷éªÖ§«ZŸT½OWµ>©zŸ®Zðéš±>©zŸ®j}Rõ>]ÕútU듪÷éªÖ'ÖàÓU­OªÞ§«V|:w˜!~bõU½O¬Á'U÷‰5ø¤ê}b >©zŸT½O¨É'UïkðIÕû¤ê}b >©zŸXƒOªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT+>iÆûÄ|Rõ>±ŸT½OªÞ'Öà“ª÷ 5ù¤ê}b >©–|ZÛyWÑ'Öàjò‰5øÄ|BM>±ŸP“O¬Á'ÖàS¯Ñ'Öàjò‰5øÄ|BM>±ŸP“O¬Á'Ôäkð‰5ø„š|b >¡&ŸXK>q&ø„š|b >¡&ŸXƒO¬Á'Ôäkð©×èkð 5ùÄZñiÛ»Ÿ’OªÞ'Öà“ª÷IÕûÄ|Rõ>±ŸT½OªÞ'Ô䓪÷‰5ø¤ê}Rõ>±ŸT½O¬Á'UïkðIÕû¤ê}b >©zŸXƒOªŸ4ã}b >©zŸXƒOªÞ'UïkðIÕû„š|Rõ>±ŸTK>ííÊÑ'Öàjò‰5øÄ|BM>±ŸP“O¬Á'ÖàS¯Ñ'Öàjò‰5øÄ|BM>±ŸP“O¬Á'Ôäkð‰5ø„š|b >¡&ŸXK>q&ø„š|b >¡&ŸXƒO¬Á'Ôäkð©×èkð 5ùÄZñišÚ7ù¤ê}b >©zŸT½O¬Á'UïkðIÕû¤ê}BM>©zŸXƒOªÞ'UïkðIÕûÄ|Rõ>±ŸT½OªÞ'Öà“ª÷‰5ø¤ZñI3Þ'Öà“ª÷‰5ø¤ê}Rõ>±ŸT½O¨É'UïkðIµäSWiô‰5ø„š|b >±ŸP“O¬Á'Ôäkð‰5øÔkô‰5ø„š|b >±ŸP“O¬Á'Ôäkð 5ùÄ|b >¡&ŸXƒO¨É'Ö’Oœ >¡&ŸXƒO¨É'Öàkð 5ùÄ|ê5úÄ|BM>±V|š—vµä“ª÷‰5ø¤ê}Rõ>±ŸT½O¬Á'U÷ 5øäßr|ÍxµXƒZª^-U¯kPKÕ«ÅÔRõj±µT½Zª^-Ö –ªUË¿ÙZ3Þ² •f‚p_ÙÇ’p¬A8U/kNÕ §ê…c ©záP“pª^8Ö œªn[Úe¢eªÞ2Ö`™ª·LÕ[Æ,Sõ–±ËT½eªÞ2Ôh™»ÀÃ5ã-c –©zËT½e¬Þ2I„kÆ Ç„Sõ±áT½pª^8Ö œjÎjÅ™$œUQ3á4ã…c ©záXƒpª^8U/kNÕ ‡š„Sõ±áTƒpk»>iŽ5‡š„c ±áP“p¬A8Ô$kŽ5×kúiR5X†š,c –±ËP“e~/æL° 5YÆ,CM–±ËXƒe¨É2ÖôlÍŠŽ™h™{ö­™’eœ –¡&ËXƒe¨É2Ö`k° 5YÆ,ë5ZÆ,CM–±zËNÄÆ|惪·Œ5X¦ê-Sõ–±ËT½e¬Á2Uo™ª· 5Y¦ê-c –©zËT½e¬%Ë4ã-c –©zËXƒeªÞ2Uok°LµbgJ–i¦b™f¼e¬Á2Uok°LÕ[¦ê-c –©zËP“eªÞ2Ö`™j°lkØhk° 5YÆ,c –¡&ËXƒe¨É2Ö`k°¬×hk° 5YÆ,c –¡Ö,ãL° 5YÆ,CM–±ËXƒe¨É2Ö’e˜©YÆ™’eœ –¡&ËXƒe¨É2Ö`k° 5YÆ,ë5ZÆ,CM–±zËÚç)å3*T½e¬Á2Uo™ª·Œ5X¦ê-c –©zËT½e¨É2Uok°LÕ[¦ê-c-Y¦ok°LÕ[Æ,Sõ–©zËXƒeªË8S²L3Ë4ã-c –©zËXƒeªÞ2Uok°LÕ[†š,Sõ–±ËTƒeGû¬”hk° 5YÆ,c –¡&ËXƒe¨É2Ö`k°¬×hk° 5YÆ,c –¡Ö,ãL° 5YÆ,CM–±ËXƒe¨É2Ö’e˜©YÆ™’eœ –¡&ËXƒe¨É2Ö`k° 5YÆ,ë5ZÆ,CM–±zËÎ;úÌgj¨zËXƒeªÞ2Uok°LÕ[Æ,Sõ–©zËP“eªÞ2Ö`™ª·LÕ[ÆZ²L3Þ2Ö`™ª·Œ5X¦ê-Sõ–±ËT+–q¦d™f*–iÆ[Æ,Sõ–±ËT½eªÞ2Ö`™ª· 5Y¦ê-c –©zËŽöÁTÑ2Uok°LÕ[¦ê-c –©zËXƒeªÞ2Uoj²LÕ[Æ,Sõ–©zËXK–iÆ[Æ,Sõ–±ËT½eªÞ2Ö`™jÅ2Δ,ÓLÅ2ÍxËXƒeªÞ2Ö`™ª·LÕ[Æ,Sõ–¡&ËT½e¬Á2Õ`ÙÚ>+ZÆ,CM–±ËXƒe¨É2Ö`j²Œ5XÆ,ë5ZÆ,CM–±ËXƒe¨5Ë8,CM–±ËP“e¬Á2Ö`j²Œµdfj–q¦dg‚e¨É2Ö`j²Œ5XÆ,CM–±Ëz–±ËP“e¬á=n‹íÏþ £A¸«ZáT½pþ#Á®ëÞU­{þãÂ4ã5ô¹kƩ꼪5òªÖHÖxf®Óèš±rªz9¯j弪•S5Éù•u rªz9¯jåTõr^ÕÊyU+§ª—óªANw.µf*r^39¯+§ª—óªVNU/çU­œWµrªz9¯jåd r^ÕÊ©êå¼jIÎþ9åQNÖ 'jMNÎ9YKrb¦&'g‚œ¨INÖ 'k³×¢œœ r¢&9Yƒœ¬ANÔšœœ r¢&9Yƒœ¨INÖ 'k5ÉÉZ’3599S’“3ANÔ$'k5ÉÉäd r¢&9Yƒœ½F9Yƒœ¨INÖŠœÃô˜ãûæ¯êåd-É©/§jENΔäÔŒ—“5È©êåTõr¢ÖäÔŒ—“5È©êåTõr²–äÔŒ—“5È©êåd rªz9U½œ¬ANÕŠœœ)É©™Šœšñr²9U½œ¬ANU/§ª—“5È©êåDMrªz9Yƒœª%9ÇÏy¹jµ&'g‚œ¬%91S““3ANÔ$'k“5ÈÙkQNÎ9Q“œ¬ANÖ 'jMNÎ9Q“œ¬ANÔ$'k“5ȉšäd-ɉ™šœœ)ÉÉ™ 'j’“5ȉšäd r²9Q“œ¬AÎ^£œ¬ANÔ$'kEÎqn72É©êåd-É©/§jENΔäÔŒ—“5È©êåTõr¢ÖäÔŒ—“5È©êåTõr²–äÔŒ—“5È©êåd rªz9U½œ¬ANÕŠœœ)É©™Šœšñr²9U½œ¬ANU/§ª—“5È©êåDMrªz9Yƒœª9§gÛ©’œª^NÖ$§»FÅ5ãåT rýñ³?›œó1¿|Å$§ÕH3^NÖ §ª—SÕˉå´û‡f¼œ¬ANU/§ª—“ÕËyUo$k0RÕÉŒTõFªz#Yƒ‘ªÖHU¯áU­{Wõ±áT½p¬A8U/œªŽ5§ê…CM©záXƒpª%áN¼âÕ ®„C­ Ç™ kI8ÌÔ„ãL5 Ç„c ÂõZŽ3A8Ô$kŽ5‡š„c ¡&áXƒp¨I8Ö k5 Ç„CM±áXƒp¨I8Ö jŽ5Ç„CM±áz±áP“p¬áæá±ç³|T½p¬%á4ã…S­Ç™’pšñ±áT½pª^8Ôšpšñ±áT½pª^8Ö œªŽ5§ê…c ©záT½p¬A8U/kNÕ §ê…c ©záXƒpª^8U/kNÕ ‡š„Sõ±áTKÂm%^ÙàªA8Ôšpœ ±–„ÃLM8ÎáP“p¬A8Ö \¯Eá8„CM±áXƒp¨I8Ö jŽ5‡š„c ±áP“p¬A8Ô$kŽ5‡š„c ¡&áXƒp¬A8Ô$k®×(k5 ÇZn™c>kFÕ ÇZN3^8ÕŠpœ) §/kNÕ §ê…C­ §/kNÕ §ê…c ©záXƒpª^8Ö œªNÕ Ç„Sõ±áT½pª^8Ö œªŽ5§ê…Sõ±áT½p¨I8U/kN5·M†áüëûúÞnFŽ5‡ê…»j°Œ5Xæ]ÂL²ÌûÇ™`j²Œ5XÆ,ë5ZfÛ¬™`j²Œ5XÆ,C-ý6V3A8Ô$k5 Ç„c ¡&áXƒp¨I8Ö k5 Ç„CM±áXƒp¨I8Ö \¯Q8Ö jŽ5=‡3ï©Üϲæ³PT½p¬ñ,§”f¼{ªé,g4g¢{f¼{¬Á=Uw5Ÿ…âÎÛÑŒw5¸§êÝSõî±–ÜÓŒw5¸§êÝc î©z÷T½{¬Á=UïkpOÕ»§êÝc î©z÷Xƒ{ªÞ=UïkpOÕ»‡šÜSõî±÷T+î5´âu®êÝc-¹§ïžjÅ=ΔÜÓŒw5¸§êÝSõî¡ÖÜÓŒw5¸§êÝSõî±–ÜÓŒw5¸§êÝc î©z÷T½{¬Á=UïkpOÕ»§êÝc î©z÷Xƒ{ªÞ=UïkpOÕ»‡šÜSõî±÷Tƒ{Þ¡å”!»ÇÜC¯ÙYg9Üc-¹‡™èž{¥R3Á=Ôäkp5¸×kpïªA8Ô$kŽ5‡ZŽ3A8Ô$k5 Ç„c ¡&áXƒp¨I8Ö k5 Ç„CM±áXƒp¨I8Ö \¯Q8Ö j޵"ܹ8k¾ ‚ª޵$œf¼pªá8SN3^8Ö œªNÕ ‡š„Sõ±áT½pª^8Ö’pšñ±áT½p¬A8U/œªŽ5§ê…c ©záT½p¬A8U/kNÕ §ê…c ©záP“pª^8Ö œjI¸­-NŽ5‡ZŽ3A8Ö’p˜© Ç™ jŽ5Ç„ë5 Ç„CM±áXƒp¨5á8„CM±áP“p¬A8Ö jŽ5‡š„c ±áP“p¬A8Ô$kŽ5‡š„c Âõ…c ¡&áX­pÿúö?ßýæó¿ýó÷o?~nÜ m—_O2†Ž^{Ø®ç:žÿï¼>¯hoñL#r™3³„€Šœæ}|™™ÿÂLãl;2g¦8Ó^ØZ¶Ž*ߤ¨™1ÌØ58¥l WZΔր3¥5àLi 8S[ƒý1mÕ5ÀLm 0S[ÌÔÖ3¥58`ϵ¸œ)­gJkÀ™Òp¦¶Çc›«k€™Ú`¦¶˜©­f*k°=ÏãÃT[ÍTÖ@3•5ÐLe 4SZƒóYÕyô­­gJkÀ™Òp¦´œ©­Áz~çê`¦¶˜©­fjk€™ÒŒãy;‹kÀ™Òp¦´œ)­gjk°?†â±Q3µ5ÀLm 0S[Ì”Ö`šÚÏ5µ5àLi 8SZΔր3µ58ÚÏIÅ5ÀLm 0S[ÌÔÖ3¥5˜—Ç8æ5ÀmÛðÇ6¼Ì¤5ØÖv™‘uÛùbÌÇ¿¿O[1üþãLZƒcnßçýÏ3¥5XÚé“ÅÇgJkÀ™Òp&­Á¸Nýû,¼…gjk°>–¯üÌdœ©­fjk€™¸/à_ãd]}ügJkÀ/­gJkÀ™Òp¦´œ©­>€¸¶˜©­fjk€™Ú`¦´üàÒÒp¦´œ)­gJkÀ™Úàkk€™Ú`¦¶˜©­fJkÀJ+­gJkÀ™Òp¦´œ)­?`©tläLi 8SZΔր3µ5À³ÔÖ3µ5ÀLm 0S[ÌTÖ@±PÙ4“ÖàXúºíýW^ç3Ù3__ƒe<úýyý>•çÊš©­.–^yh¦¶˜©­fjk€™Òð²Ç¥5àLi 8SZΔր3µ5ÀLkk€™Ú`¦¶˜©­fJkÀK–Ö€3¥5àLi 8SZΤ58Öö~¸?¼XYZƒ±¯ÁzÌf&­A»§£ËôḠ™ôúÁÚO؆ÝÌÄŸ†¾•†—™ÚàrFµ5ÀLm 0S[ÌÔÖ3¥5àOJkÀ™Òp¦´œ)­gjk€K"ÔÖ3µ5ÀLm 0S[̔րoš.­gJkÀ™Òp¦´œ©­ÞVY[Ì”Ž œ©­fÒÌý8·õ“ºÚ¥’?Δրo±*­gJkÀ™Òp&­Á4ýçwÿø)üT¢±g;p¾mí™\ÿ·ìûOñÆŒ_½1ëòžúª¼1ï7ÄmrÞvîáùhùÆ7„_µß÷ikþ«uZ÷vJaÿ‡Ÿ~þùýŽ¸Ç¡f–¾ÉïwÄÿœ§™ym'^~ë;¯Úný÷÷ãËíw¯Aé¶LKûñî[ß|Õv[>½Ü–_¿-p¢gû ÿþ»ÏøüáQevp =§ösÚ·¾3øªí¦ ï7ýNÉ›1c;úß ~Õv3Æ÷›ážëfìýìo}3ðUÛ͘î°×ßîëflC;û[ß |Õv3æòƒkœö{Ÿ6üãùüÓ/ŸÿüùËûòñ¬ N{;Íû[ß|Õ—˜Q[7£×òÍwZ~Õ—˜I7c8훿ùÍÀW½=ÀÜ!Z7ãy·}ó›¯ú×=À†ö %쫟ÿðóüñÏ?ýéO?} ÌœŸ¡Éel§¿÷ûÑžd¿?¯é?}ñ--|¾ñafžÝ̸ð_cþ6³n—ËÂwo·mz<7ó\û¿>úŸã}fzš™½ÿÁ[8Ì÷™åp3ûÊïÐfž÷™}s3]è£ÿu»/3ócXÝ̺½i%öc¿ÏÌnûìËÁ[…ûv›Ññàu¦¿- «§ V\3ýW’ffêßçÙŸ}îã}frÛgï‰vO°·™ÕnŸQ÷¤Í ÷)ø:Óß(´}r½=F×v*ž™¶}˶5¼ÍÌnûl‡î}›Yî3›Û¶}~Ó£a_n÷gk{«™é¯„ïý¢}žî3“Û>x^°÷׋öé¸Ï¬nûàð­™/nÛîö…­ëGj{®ù2³_¾Îô½zïgFµí{›™ÝöÙúŠG÷>¬÷™ÍnŸaç–Ácâe¦¿=ÎÌ`/X{o3“Û>+Ñ}/ÚŸÏûÌê¶ÏŠGÚÜÖ =Žn3‡Ûð,{ÞíÁ°>¯g7·lÍþÁbû|Ÿ™ÝöY±ÊxJ·­÷™ÍmŸ+ÖÚØ^ŸëyøvV­ýžà-•íñz›™ÜöYaHWa[‡ûÌj·Oÿ;^=\¶ûÌáö\j’lóëþÓNÛ²Û§?WÛûo¯¶Ûñôœ™Ýöq?¿˜ÙÜöÁk»Oש½ÅÌô·Ÿ¶–kûÒqŸ™ÜöYÖåÃÌxŸYÝöYúE±í·™Ãí ˼ðÝf^÷ŸõüùËmŸ¥?›€¦ÛíxzÎ,nû,#¾^=Üï3›Ý>ý/¶¾zëíxz>C{º}aéG_¨½ÏûÌä¶ÏÜ ÙÖ¶G¬·ãé9³ºí3Ï·?Þf·}æmçž^fÖvj®›¸çœ3·ãé9³¸í3wÝqDY×é>³»í3wCÚÞÖ<¹í?[{«®™ ý´ÞާçÌä¶XíÏa×ÛñôœYíöµ‡Â­ÛÌa·ù}Å5³··ÓšHПî·ãé9³¸í3qík0Î÷™ÝmŸ {ΈënûÏyltû´­fÆûÌä¶ÏCú_¯·ãé9³ºí3Áþ¼w½OÏ™ÃmŸ©?j¶¾ç-Çëýi¿pûÂCú¹O·FŒ›é[f{~|+ú‡™ÝnÜû}»mCû)ÏÍ|ù;Ž3“Ý>ýV­]…e=î3«Û>cÿ×x6²ÜާçÌá¶ÏˆúŸËíxºÇF·/ŒÛð¦g0Ëíxºõ·Ã›sîü‡™Ým÷{Òkfj¯«š™y¢lm£O÷™ÙmŸ±?£Zû-\nÇÓ­¿eÝÌtCðìj¹OÏ™Ãn¼ŠÞïÕr;žnç±Ñí c‚gdËígÚsfqÛgè†àËíxzÎìnû ýˆ½öÕ[ž·û³´S–Ì Ž¤}f¾OÏ™ÙY…ËmàÙâ|;žž3›Û>ŽV}+Ý^ l3‡Û>Ž<ýè0ߎ§ÛÚ^v3¥n3Ë}fqÛg îýœÏÛñôœÙíöºýyï|;žnç?·Û†ôGÐ|;žž3³Û†§tÇñø6³¹íó< uûëy¾ÝŸþ›'3cÎ{ý03º}áÙ%Xñ‚äíxzÎ,nû<±‡öG÷<~qÛv·}žØÛúsØùv<ÝÿºØ{Nß#æÛÏ´çÌìö…gtâÙü|;žž3öu±'~ŸÓŸÃÎÏ×Çèþô¯‹=û#?Ì·ãéþô¯‹¹sð>Ì,vûà5ZÎŒ÷óºØÿñÅQ øòŠuqôW ã¥Ç6Ü6Ÿæo×ðp—ž9žS{¡f<Ÿ[ÏyðE‡±ýÌñzäšqŒ8^§ÚJø)÷!àš:¦ô½Üåf95=—ô½Ü‡hjˆ÷Ë]ÊHSS¼_Gßû0{ý,À©9Þ/÷šZâýr ÖTÞ^îBQšÊÛË] JS_Ù^æ"XœšÓöú«÷“aÁ#µÿtÛê…ý„ÃÇûðc,Oã‡ñ¹>¾|_ëãû‡ñ½<Þ®óÃñá#Õs(ÆÛ÷èÿ½­Ï~:ï¾´‡Jûÿû»_þëíïßÞæû÷ºÿï/µ¼ß‘~öLJK!Íîjjž- ìþkñ›£»Òê/­¿ùôô×U‹ß|šÛ¿µß|ÚÝõ¢zšGw±(¤Í])ª§ep—‰BZÜ5¢ŽëÌœ{Z'wý4¤Í]<­§óG5så4¤Å] épWGëéÜoÌ¥Ñvw]´žŽÑ] iuWDã#õ鮇Æ6»«¡}í±úÜÝÒÐÎ=Ï\ÍSΉ-ïFã஘ƶ¸]†íˆ{Ç0Mn÷`ÛÜžÀ]zˆúa^â£þ¼³ñaß~a˜÷ý—;öê÷æð†‰ö²¹»*¤Û‡¶QalÖ06Ëš—‰ÍÒ„æb³à°YqÐ<9lÖ4›U‡Í²ƒæÝa³ð yyØ,=lÖ4›ÕÍóÃfýÑã̤hR´Ø0&mÜ>¢Ë £÷FÑ‚£hÅaôä(Zs´Zt­:Š–FïŽb€ÇΑ’Îüi=ŒVE bEø“xÃY<Œþ4Fb8‘‡ÑŸÉÃ}ПÊÃèÏåaô'ó †³y òp¤$OÛ}Í˃æåé-ȃæåé-ȃæåAóò¬ø„»üh^žÞ‚"—ôŽ\6+%[¸€€»q˜¨Hɉ ¥s)9a¥d³R¢y)Ù¬”h^J6k"›ÕÍëÇfõCóú±ýœœ°ú¡yýج~h^?6«ŸÕV?Å Ÿ“]#V?ÆŠ~±ú1zý­~ŠV?F¯Ÿ¢ÕOXý­~ŠV?F¯Ÿ¢ÕÑ;w´+ÑØ¬hlÑ0QÑ0QV46+šÍІæEc³¢±YÑмhlV44/[A4NXÑмhlV44/›Mj+šbA4XÑ+¢iÄŠÆèES´¢)ZѽhŠV49`ES´¢)ZѽhŠV4Æ ÚÒA44/ZE´>Q ÑúDI4LxÑмh½Ñмh½Ñмhh^´Þ‚hh^´Þ‚hhÑ0áEë-ˆ†æEë-ˆ†æEã£Ú‹ÆX#^4Ä’hñ¢!ѽhŒ^4Ä £xѽhŒ^4Ä £ Ñ‹6<‡¶aÓ… ­iŠÔ8RQM#Ö8RqM#á2Sˆá:S=¦ M!†+Mõ˜.5…®5….6ÕcºÚb¸ÜTézSˆâ4®CÕcºb¸UéRTˆáZT|¬‡‹Q±¤»fÂEªP+Ö]3á2U¨é:U¬áBU¬áJU¨éRU¬áZUd"\¬Š5\­Š5\® 5]¯ŠÕ²§šÜÛÚg %÷ƒ{ˆ%÷úHÍ=Œ”Üë#5÷0ÜC îõ˜ÜC îõ˜ÜC î!÷zLî!÷zLî!–ÜÃHp¯Çäbp¯ÇäbpõàkÉ=Î÷Pkîq&¸‡šÜc î±÷P“{¬Á=2Üc î±÷P“{¬Á=ÔàÞ0µÏ î1z÷+îa¤äG*îa¤äG¼{ŒÞ=Äà£w1¸ÇèÝcôî!÷½{ˆÁ=ÆŠ{ñî!÷½{ˆÁ=FïžëÞ=ÕŠ{šñî±–ÜÓŒw5¸§êÝSõî±÷T½{b»§êÝSõî±÷T½{¬É½½}ŽMr1¸‡Xr¯ÔÜÃHɽ>Rs#Á=Äà^É=Äà^É=Äàbp¯Çäbp¯ÇäbÉ=Œ÷zLî!÷zLî!÷øXî±–ÜãLpµæg‚{¨É=Öàkp5¹ÇÜ#Á=Öàkp5¹ÇÜC îsû,»à£wÑ_p1 g¹âHÎ>H0’„³ôrÄ Çh…óÄ‘à£w1Š÷•ŸÎų—Áåˆ71ÉhôŸØÃ/gÀ‘#ÁÓ¯lõà)bð”Ñ{Š’4D "–4ì#ICÄ’†}¤¦!FJb$hØcÒ±¤aI"–4ÄHаǤ!bаǤ!bÐ{KÐ5hÈ4DM² Q“†¬ACÖ !jÒ5hH<‚†¬ACÖ !jÒ5hˆš^y´¯ì-c»‘ÁHFkdØó9^üÊMHžZ¯8Rñ#é÷;GÙŸí†Í¯ß%(Ë胾ǒ§©xŠ‘ä©ÿ°jŒ„“G žúOï#éC惧ÖgŒ$OíqŽO¿²Öé£ê{LŸU<ýÊVJÏp-Á©(Ë‘ð‰÷=¦¼G Ÿyßãÿ¯íl–e7®£;çSôÐðÿ@<¶'ô@Žñe–MSa]éý?ÔÎÜ8Ýu2›ÜÒñ@—"×ÍnÔj€.ÜKïÍ[ïÙßÌkïIÍ{ïIÍ‹ïAe“š—܃º·Ü“š×Ü“š÷܃ºÝ“š7ÝS?æU÷¤æ]÷¤æe÷ îm÷¤Ú²¤5ËÞß;W‰°dYDŒeÖ,‹Hɲ©YcYÀ’e#â, X²lDj–E¤dYDŒe:Ë–,‘še)Ycـβ€Æ²eeÙߌeIeIeAeIeAeIeIeAeIe©cYRcYRcYPgYRcYPgYyäžÇìj×Ê 4–•=•‘Ê%/•‘Ò3¤ŒËVž„BÄYP?C hž'ÔÏÎGtŽ,92"î.À‹šØçìÕÏqŒstæ4æ èÌ hÌÉ>dÌIjf¼(¤õ)hi6AfŒeAeIeIeAeIe©cYRcYRcYPgYÒ‹2cÝ«\yk›ßEèÜ«¬ÈHŽˆØù²J¤Œ÷¾Ø0ç^y͈v/ae-"ƽ„Ú½€Æ½„•ÙŒh##º™±j¶"öI}¿}¥sYF´‘‘ µ‘‘ µ‘³gi#'Õç²Iµ{I͹lRmYRcÙ¤Ú²IµeIe“j˦h´e“jË&Õ–%5–MªÏeI­OÕï*÷Ó|vBéÓ„ÆœZƒ±g­R¶ˆHs–VqbÄ8PÏt646 XšqÅHåÊžãȀΑ€z¶+ ¹†'4ÞÓƒ "Æ{÷÷:ïï±ï‘VæµfÆØ´t&šãHPçHRãHRãHPçHRãHÊÃ8’Ô8’Ô8Ô9’Ô8Ô>S îôMÃ|ž‹G&4çœJƒqçœBÓŒT®÷3âÎ9ÅÉ5#•ëýŒHŸ&,\ï3¢-›PZ–Ð>S NÛ2R°lF¤e µeî 0R¹7iä„Ò½„Ú½ ¥{ µ{J÷^=Kº÷¢÷^éÞ¤÷^éÞ¤Ú½•toRíÞ‹J÷^R’tïE¥{“j÷^´p 3ö͸Ҡ÷·Í­’’ÐY‘’‘#b,õŠHá.#•»1F,Ü`ÄÐ9`å¼7#%##bŒÐ°däˆÔŒŒˆ12 1r@gd@cä€ÎÈ€ÆÈìYÆÈ¤î»reÆ´fdfŒ‘A‘I‘I‘A‘I‘)%cdRcdRcdPgdRiä¤%÷Žk+Žq/aŽŒTÜ‹HɽŒTÜ‹HɽŒh÷VÜ‹ˆq/¡v/`ɽŒTÜˈv/ q/aŽˆ”Üˈv/¡v/ q/¡v/ q/¡voö,íÞ¤÷fF»—´äÞÌh÷’÷&ÕîMªÝKjÜ›T»7¥¤Ý›T»7©v/©qoRí^RíÞßÝþ÷›ß|ý·ùîöÃ×¶sÇvStk3BÇmW¬mLç®Í¾w´ÿð®Ú¦îõÔ_—hw@db™Ûí×}©ü÷Ä!#†å˜¨Û÷Än¾£I¿I³}Ó²‰Í$TËÇ&…ZÓ)µ‘Jãq­¢‹®{Œhù£"¥æooó^l~DjÍG¤Ô|DJÍG¤ÒüsضZó)5Ÿ‘Jó©4Ÿ‘Ró÷·})6?"µæ#Rj>"¥æ#Ri~æZó)5Ÿ‘Jó©4Ÿ‘Róïmd­5?"µæ#Rj>"¥æ#Riþ²œg8µæ#Rj>#•æ3Ri>#•æ¯ík‹c~Djƒ>"¥Q‘Jó)5{‹"µæ#Rj>"¥æ#Riþ6¶Ë˜Ró)5Ÿ‘Jó©4Ÿ‘Ró÷vYTk~DjÍG¤Ô|DJÍG¤Òü}~›¦Zó±ÍG[pÓc?ŽÇÈëæ¯Óý†ê=D\óïS»ˆ¿Ïû 7s"¥æo÷6lÇm¢}|ˆÔšH©ùˆ”šH¥ùÇò¶¾¸äQÍG䛟ÇóC¤Ò|F\ó§8ø·µu´u\#•æßÏOz1ð©æ#Rj>#•æ3Ri>#¥æÇkèkÍÇ›ëKÍG¤Ô|DJÍG¤v½ÙWÚŸ¯°® 3• d¦R‚ëõÚ¥à¥Öµàu¶µðÝ¥ S«_µ[©_p[ºóÁW[–j¯ë­Ô€™R òµ›¥àe—¥ã€¯¹«Õ€¯î,Õ™Z ø >7~n#·ê¡|ž«ÁÇAûÝàCÆÖà¾Æ±sÄTûü”Ñ5Àž9k=ç™±5ˆÌ¶Þ£zÓS¦T¾ÂªT¾z¦Tƒ|!W¥ÌØà¸^×8ާL­xEM­xáD­|µN©ÈØ«‚=~ÛBŸ›×§L©|1E©\f¾Tƒ|¡F¥Ì”jKà—j€åèk5ÀâÒµpýR ©Õ€ _WÆ.!]¹Èkå éZû2aúœÄÏŒ½FZâéúó1S:¸Àké8àÂŒ®ûûgÚ§¹0m©ȸàŽùþTk.Y©e,Հ˦•j‹IVjÀŒöñúžõy¹Æb °dZ­XÔ¨V.õVª2µpÁ¥J ¸tQ©\r¤Tƒ\ˆ©Rf\ æ0èvÇ}³ç¤J5àÂ"¥pA€R r™”J ˜)Õ +¨Œ |ì¿4.ðÁÜÒõB.bðúÆiÔm›ž¿ÇÕàˆég÷!{~’½vðñÛÒqÀ‡éJçù0q¥ÌØ­õ÷©Ýp¾Ï™ÒqÀéJ×|X¦t~–j€ŒãÐöëAp>ÈS¨A>SúíœÓÓ+5¸ð)Ô 3ÖñXä>=ýâžSçK5À$ôZ 0M´VN©/Õ™Z 8…µRN-Õ€ÓµJ5È©­•0SªAN%“™6•ì»/³Éð½ï¶ÏøÍ?Ÿ·/ÿÁ‰½ïàß§cnSÇõþvnè—ÿ¹ýÝo¿ÿþí·ÿúýßß¾ü×7ÿôÅUš±åh3öXï¹ý-ûî‹Ý˜éåÆÜç·qÈO导oˆrCæ=æÛò†àScCÞ+ÒjþëŠ:nmâ_‹ÿã?ýôÞ5.efÀäÕ®!æØEæ¾´Ù‘ŸÜv|hÛöï¾ýáiëÕˆÂ-9ÿlï¶ùÜ-Á‡¶-ùò´%¿z?`&fû€ÿý×?|}8 ÄXÏÌ:Æ›">·%øÐ¶!ãûF¨OnÄ2´)ÑŸ¼øÐ¶ÓûFÈ©b؈)æQòFàCÛFÌýõ|ú™ÝâÞ¦dv÷Žm±|܈'ßóèn“»?ûànŸÙ6a-Öߎsêå‡?þüõÇŸ¿þå:¶ÍL>§³G}z5ù©OG·þ9!7£=NñéG?µ;¾Õ¼ÜŒeý?Ãø©æ¼`ÌÍX·6öfàSŸŽqs~ÂÍØÎ˰ýÓ7ŸúWççiÖŠàë~úÏ?þåÇ?ÿùlj‹›ŒW™ÆöL4¤]n¿_åÅÓG\˜dÞ?„ÆA…Ä”÷P¢UÏâàû¦~óο:«Ð€‹Ãû —ˆ}¨-–ù!tÜ—Ûµ‘üî ®»¯*$.CCÛ®BqäÜã?·MíCó¡BÛ~Ër÷ãChPûéˆßÓÚ†¡}Ï¡ã:Ûx‰Û ¡Uí'Ü¡½ñ¼Ø1}Mj?1lq3çØû6íç¦BS¶¦…Æ¡tâs(žÖ9îÝö¡Yî'è&vq«dÔ~ÚïY‚êØóŒöP]c?–[ÇÚ·ikýW„bêÜ?”Ëü!4©ý„Ó¥#î¦sߦõìi*´Î¡~óÖ6iC„B)8lÛÙwšÕ~Ú££ñ˜Û1õýim?…ŠPôYëÇØ°ËY]î!}h•û "~©oç8}hRû 7+Ñ«Ž¡oÓ P~ á¨[Z!Ú!Õ‡6Õ5Ô%¡Yí§»5Ø<ú6ÍíA B±qÚ»÷%ŸÚ?Uh¼å•ؾ÷ìô¶(…mÑ4©ý„'©`Š}ëرM3¡øŽ#.×÷µ?`ÇóCUb‰?÷¥ïOçð)÷“¸q÷Ô~ZžÅÝû1wlíT!ˆ—œý˜;ÆTs½”;î¨ôm®K‰çж>„ºv8‡OµŸÖ¸‚„2÷ñøÚT×X—•Çw B³ÚOkœvÀ³{?æž¡Aí§uÂ7µêmý˜Û•û)þÃ5Üú1÷ -ªk¬1DÃèÛ½oÓqN>…–˾ųƒý˜;ì×EJnWÍ}hSû çºû†ßàÆ¡Yí§eÙ“ÎP?æž¡Aí§%ÔgÛºvØÚsQ"bÙñe?æñl»Á­q0mý˜;Äc"ãʼnïÖ¹ÃÚ¡)û,tÖ‡V¹Ÿà¡·¹oÓÚž¢!Ø!N|·~Ì=CƒÚO3ûlbêØåº‡òBOâýÖ¾?-ç.Q!u“ö!4ªý4C,øÝ¯s‡9Þâô1±ÄÙòÖ¹ghUûiŽh®¸Þû6çê3Ä'k?æž¡Aí§9öÐ><=B~…ÎáSî'ñÓçchQ]czÏZô¡Qî§Ø°-L±ný;žçg"4Å_ÇyËÚ¹ghUûi –øsíÇÜ34©®¡æ<†µŸ°tÂgËk?æm·«ÐºÞò i]ú6 × ­çÐ2ÓxmØéKÞöV!¬é¹vcîýÞ 1gò!³Ê½$æ>d&Õ/ÔüÔ+s¼ÝÕ>C*X(eíÆÛ{Lm™ã V[fê3‹ÚC#ÆÙÈ,÷Û6*wa¡œX.Ý`{?‡MµF c±—º›«-³ªý£žêÈLªCŒZâyÙŸÓûËÔ}ÌÐ÷±JK7О™MîH8ΗnœmËpÈý—Ä´¬¶mTaRö¦Ÿ2çx©öÏp‡¶Û^ºÛ|gfUûg€H°RM7Æž™Iõ5ÇðÊ,×}¼ç zhÝK7ž™M퟽-Îr—n€½/úÛ€ž=bé.„Į̈úÂG'Nù—nx½ÏúþÚ€ßÅâwŽ>#o¯ qà*aé×3#ï®ÉÇÜ33]?‘t™á!3õqoío½Ï ¶[¥mí£§[­¿*ÏÛ˜ø€ëŽq·h‰\?fÛùp[ö!WT=¯mס¾º•šŽvÚ©Br-&„–Ñ}“\0¡uvß$NBh³mR [3´Û6Ý£ë!z] t·m’ëX±äƒm”\0‹)¿§äÊ\Lù]%—cêžR ‘1åvÖ_ÝG–m8%á…þìòž}›Êéý!½”ÓqZñ­ŸâG=¾]ññQ ÕI(S÷ñï¦wÏs;LÚWüé÷?ÿ÷ín·µÿªþ¿`¥yß[óg–bJ(×´K(W¯#ÔëÔ%”+ÒêµçÊUæÊUæõzrÚ½1o²{QM½ö\ÂÂ[™3"W™#Ô«Ìé‘!#…µçqkÏ©Q!#fmü¦W¤#Ô+ҽܽNÝË}§W¯K(W¯»úРV¯»¨\½î¢rº¤zº‹Êé’êé.*W¤»¨\‘NŸ@dF¯SwQ¹NÝ%¹NÝEå:u•ëÔ%ÕëÔ½ÕfÆø”´äSdœOIO©ãSRãSRãSPçSRãSPíÓ¥­Kâæ±$”>M(}J¨}šPú”Pû4¡ôiBéSBíÓ„Ò§„Ú§ ¥OJŸjŸ&,ø”‘ŠO3"}šPú”P›3aÁ‘ŒhG&”޼Ž_éÈ‹lxeŒ •»2£mxQcCå×Ìh^Tzï¢ïeF{ï¢Ò{—&¤÷.*½wQ齤Ú{•ÞKê¼w×ïïïtÞ4Þ è¼h¼h¼ÐyÐx/ ó ñ ñ^@ç=À’÷"Ró"Æ{€Æ{÷KÞ‹ˆó ñ_ã=Ò’÷˜)yç=Ò’÷qÞ#5Þ#-yç=Rã=jÂxÔxÔxÔyÔxÔxï”ÚÝÍyI¨½G¨½h¼G¨½h¼G¨½G¨½XyÂ7#æ _uµÅˆq$¡v$¡v$ q$¡q¤zH‘çHõ[\F w3¢Í hÌIhÌ©–ÄaĘ“P›3{€¹ªVËö\ãSéÆÌŸ¾(¡óiRéÓ¤îúùÅ!ï|š´âSfŒO“jŸ¦~´O“jŸ&Õ>%5>Mª}Jj|Ú^àVLH¨}J¨} h|J¨} h|J¨}J¨} hÎ# õy$ q$¡v$¡v$ q$¡q¤T9"¥óHFôy$aá~$#•û‘1æ”gXˆsjsæ±nÌ)-˜cNiÛÌs¾¨3gRs&ú‰>}±;œO“JŸ&5æLªÍ™¢ÑæLªÍ™T›“Ô˜3©6'©3çÖÖ=tæ4æ4æ èÌ hÌЙИИ3 3' 1g@gN@cN@c΀Μ€%sF¤fNDŒ9õy$ 9$46Ô~Šˆ³! ±!_cCí^fœ Õ™nfJ6DÆÙTŸG’ּnjñ©ñ¨ó©ñ5a¼Gj¼Gj¼ê¼Gj¼j¼7íÀ6Þ#ÔÞ#ÔÞ4Þ#ÔÞ4Þ#ÔÞ#ÔÞ4Þ#ÔÞ4Þ#ÔÞ#ÔÞ4Þ#¬x‘’÷ÑÞ#ÔÞ4Þ#¬xã=Bí½<~+ÞËLÅ{™©x㽤Ú{¤%ïeF{/©ö©ñ^Rí½Ô„ö^Rí½¤Ú{¤Æ{Iµ÷H÷ö¶ó÷÷÷:ïïtÞ4Þ4Þ è¼h¼ÐyÐxÐx/ ó`É{©yã=@ã½€Î{€%ïEÄyÐxÇoÉ{Ì”¼ÇLÉ{È8ï‘ïּnjñ©ñ¨ó©ñ5a¼Gj¼Gj¼ê¼Gj¼j¼·Ìíí`Æ{„Ú{„Ú{€Æ{„Ú{€Æ{„Ú{„Ú{€Æ{„Ú{€Æ{„fjùÛ#Ú†€•5ª3RX=•íÈ„æ·5Ñ-#Ú‘€î¾¡Ô #…gû1æ$ÔæÌ «N*yQiäÆ{Iµ÷HÍ/ÍIµá’š_F¤£™1ÞKª½—šÐÞKª½—T{Ôx/iaEÔÌTžâ[ÎìlBãH@ãȀΑ€Æ‘###:GGtŽ4ŽÔ{ ãȀΑڹˆTfî R:dĘSž‚1b~‡ÑrŒˆó©ö3"%ŸFÄùÐø”½Åœ‰¾(vmFPfŒ{A{IÍ/.¯¶±t&šãiR}&JêŒLjŒL)#“#“#ƒ:#“#ëódJF>¿~w+G$ÔF&ÔF4F&ÔF4F&ÔF&”F6G""nöЋ‚{{{«VeDÛÐÙ[ŽŒTî Ry?@FŒ½¥Š1ö–ÂG¤doF*öFÄØ›PÛ;{–>NªÏ†“j#“#'Õgäæl8©¶lRmYRcÙ¤Ú²)mÙ¤Ú²IµeIe“V,ËLɲ[{É ³,¡¶,¡¶, ±,¡¶, ±,¡¶,aŲˆ8ËÊ"3bæhJ·!bÜKèÜ«f§0¢Ý èÜ+ï÷1bÜûbì|N%RFŒ{_ìçÞdz¹[K(-Kh|J¨}š}Hû4©›¹©®e2S™¹ÉŒqoRí^ÒÒÌÍÌh#'­ÌÜdÆx:©ötªJ{:©ötRíiR·öЫڔîZ0S³÷ö6¸58{{tö4öèì hì X²wD̽ Â’§#â< è<-½Šˆñt@ó›¡1²ÖkDœ‘µÄ)¼“0#•9¥ˆ”æ”2bΆ_l˜³7 ±7û±7©±÷‹ã¨öû3ÎÞ¤ÆÞ æÌ9©ñ4iÉÓÈ8O“OSJÆÓ¤ÆÓ¤ÆÓ æ|:©1ò«}R2rë€vn¡62¡62 12¡62 12¡62aÅȈ”Χ©xãiBw'Z]¯3¢= hïD+3âΧÕPˆùµŽÐÝsö%²÷œÕ9'"ÎÓ/ö]é®"ÆÓ„ÚÓÙ³´§“O¿ØüÚY63ÆÓIµ§I§“jO'Õw8H‘“j#§”´‘“j#'ÕF&-9g¦r߃™š§÷·Å®:Bh< h<ÐyÐx: ó4 ñ4`ÉÓ1g΄%#GÄÐÍŸEÄ9 ½», HÉÈ)O3âfU¨Û茸»Ë¾Öv®…T;"%OGÄyÐxš=Ëxš´äifJžFÆyšÔxÔyšÔxšÔxÔyšÔxšR2ž&5ž&5ž5gÎI+gÎÌ”Œ|Ìo£¥F¨L¨ hŒL¨ hŒL¨LX12"ÆÈ„##bŒLX12#ÚÈ€%#3R12"%#3R12###R22###bŒL¨œ=K9iÅÈ™©™cä¤ÚȤÆÈIµ‘“j#“#'ÕFN)i#'ÕFNªLjŒœ´bdfœ‘uï 9###tF4FèŒ hŒ hŒ¬EÙÝËxQ0çiíUl’ñ4`eV#ÆÓÍ=gBidBs‚°²R #z61 ù Pÿ†è hÉcÝ8’´äHfJŽDÆ9’Ô8Ô9’Ô8’Ô8Ô9’Ô8’š0Ž$5Ž$5ŽuŽ$ÕÏK–lx_Z·16$Ô6$Ô646$Ô646$Ô6$¬Ø‘’ ©ØcCŠ Ñ646$Ô646$¬ØmC@cCBmC@cCBmÃ<Öµ “Vl˜™Š ™16LªmHjl˜TÛ0©¶!©±aRmÃÔ„¶aRmäچ¤Æ†Iµ I­ Å„Åõ<4F·vJBiÄ҆„Ú† ¥ µ J&t6—¢Œ8*µeÄØP ”mÄƆê #Ò†„•§Ò2Rxâ‚w ÿâ[*>͈ô)¡öiBéSBíÓ„Ò§Wo‘>½há $W¦àÓÌhŸ^Tú4©öéE¥O/*}šTûô¢Ò§—h¤O/*}zQéÓ¤•ß®®Œ´lRgYu—lÎMwó»ËËt–4– è, h, h,«•{Î)ÅŒˆ³¬8³eÄY°dYDŒejË&”>%ÔæL(™°0‹–çH@ãȀΑ€Æ‘<Ö#I¥#/*m˜ÔyÔxÔyÔxÔxÔyÔx]ßxÔxÔxT{ï¢Æp Îp²ãÛêÖdI¨ G¨ h G¨ h G¨ Gh 'ýŽˆ5œ:ñf¤r‰ˆ1¡1œ´#Úp€Æp„Úp€Æp„Úp„ú|иŒP» иŒP»,jí²¤ÚeIµËHË’j—‘—%Õ.Kª]Fj\–T»,;¹vYRí²¤Úe¤ÆeIµËHk.Ûß&7§(¡q qY@ç2@ã²€Îe€Æe€%—E¤æ2DJ.‹ˆs`Éeˆ—t.4. è\h\h\й и, s qjã2Rã2Rã2Pç2Rã2Pç2Rã2Rã2Pç2Rã2vrã2Rã2Rã2Pç2Rã2В˦èÇÆe„Úe„Úe€Æe„Úe€Æe„Úe„—!Rr#—!b\FXq#Úe€Æe„Úe€Æe„Úe„Úe€Æe„Úe€Æe„ÚeyTk—%Õ.Kª]Fj\–T»ŒÔ¸,©vYRí2R㲤ÚeÙɵ˒j—%Õ.#5.Kª]FZsÙñ¶¹y, ËË:——t.4.,¹,"5—!RrYDœËK.Cĸ, s qY@ç2@ã2@ã²€Îe€ÆeËËxT—‘—‘—:—‘—:—‘—‘—:—‘—±“—‘—‘—:—‘—–\vzarëu$Ô.#Ô.4.#Ô.4.#Ô.#¬¸ ‘’Ë©¸ ã2ŠËÑ.4.#Ô.4.#Ô.#Ô.4.#Ô.4.#Ô.Ë£Z»,©vYRí2R㲤Úe¤ÆeIµË’j—‘—%Õ.ËN®]–T»,©v©qYRí2ÒšËÎͰsHËË:——t.4.,¹,"5—!RrYDœËK.Cĸ, s qY@ç2@ã2@ã²€Îe€ÆeËËxT—‘—‘—:—‘—:—‘—‘—:—‘—±“—‘—‘—:—‘—–\vnäæÖ}H¨]F¨]h\F¨]h\F¨]FXq"%—1Rq"Æe„—1¢]h\F¨]h\F¨]F¨]h\F¨]h\F¨]–GµvYRí²¤Úe¤ÆeIµËHË’j—%Õ.#5.Kª]–\»,©vYRí2R㲤Úe¤%—=l¶s2µËµË˵Ë˵Ë+.C¤ä2F*.CĸŒ°â2F´Ë˵Ë˵˵Ë˵Ë˵Ëò¨Ö.Kª]–T»ŒÔ¸,©v©qYRí²¤Úe¤ÆeIµË²“k—%Õ.Kª]Fj\–T»ŒT»ìw·ÿýæ7_ÿí_¾»ýðµ‰ml“<·ö»gè­u’yiÿÿ6»1{ÉÑþûš Oe~ÌŒw™©Îå˜8õ1s¼Ì¬Ó=&ŽO™ÝlÛ}i“Lßÿ|Ìl&£k°µ¿gk€mÛá·}|̘dæ¸*ñ˜©ÕWƒqÄŒßÖªe]Ÿ2¥¬§>öb ©Õ€™R ˜q5bÀ^¶¦@{\â1S«ÁùW¶j "S¬2µ S«2¥œ#â¾k€L­Ì”jÀL©ÌÔjp?¿³ZƒÈk€L­ÈÔj€L©ç)Ì9úÖÆdj5`¦TfJ5`¦Tƒ£mmñ8@¦VfJ5`¦Tf\ îÛÈ­z¬ÁyæxøLq´=>dl Zκ­3/³3ºØ3gfPUª°(Õ ùªÔ€™R òáR ð F­˜˜]«)Õ™Z 8i¼RNà.Õ€:K5È)æ•0SªAN6­Ô€?K5àD°R rjj¥Ì”j“Ôd¦MRûîËã<5|ïûŸí3~óÏçÇíËp îûø÷m¼·iˆãz›†Û—ÿ¹ýÝo¿ÿþí·ÿúýßß¾ü×7ÿôÅT:cËÑ&Hì±Bjû[öÝ»1ÓË™îoãŸÊyßu»$7¤ÝyÝ>}Cð©±!ïi5ÿuE·6¥°ÅÿñÇŸ~zoˆº‡“™ó”°Muí¢]fÚÕÄñÙmLJ¶mÿîÛž¶^݉䖜׷íM Ÿ»%øÐ¶%_ž¶äWïÌñlðï¿ÿú‡¯”èÛÌœ=¯­¢þ¹-Á‡¶ ß7BÝàF,C›*ýÉm1½o„ú%™1ŬëOÞ|hÛˆ¹?°ž§ød·¸· ܟݽãCÛF,7âñ^iÝm*øgÜí3Û&¬¹ ú–57áÛIÙáoÜ|hÛˆ­Ü·¾ÎÞ‰"þðÇŸ¿þøó׿|í[ò<+ƒí!‹O?®ø©]Ssr3ÎÓŒÏÁø©]'S?3æf¬[?{3ð©OÝLÿ“›±mo÷ýÓ7ŸúÔÑôMÕÜŒ}osO?{3ð©Oí}4{ -4*´ãЉ?‡­ ±hÙÇж߲ÇýøÚÔ~:âê=\8î}›†kdxEC ó¡Aí§#~ʽñ¬ÙÑ•|ŽªÐÈÖ (}h‘ûiÊÖ´Ðø!”R|ÅãjÇ=¢[wÀÎG›“%B°oìâVÉ>´©ý´ß³-´~ͪkìÇrËãâXû6­ÿŠPÌ®;övÀKןÎë]í'œ;¶ºaŸõ¡Eí'œåe¨ß¼ý:Ñz…RpضK‘çÐéwµŸöèèG,lt#M mj?aŠŽõcÜ>„f¹ŸÆƒ{GGä~B§XGžð=‡Ö³P"´áøŽ^u }›Öö|œᨋ‰2íêC£ê¸$@WìÎDÏÐÒN»T»5&#}›Î“#µŸðË úï¾÷%_Úã‘*4Þò²´¿[hP Ã<*ÛÞçÐ|ú]h¼¥)ö­?`ç·Eî§øŽ#î]ìkÀÎm·A,ñç¾ôý)É!ñ ßchUûi}xŽwïÇÜ34«ý„+UˆlïÇÜ34¨®±Æ$­ÓWû6׿sh[Bý;Æ{Æ?†ârÊl²ªk¬ËzËó¯½sç!Þ6ñ1§ðìÞ¹x´[„&|S«ÞÖ¹gh’û)þÃŽ‰ný˜{†Õ5Ö¢aôíÞµé< ÜÕ~ZB,;¦Rõcît¿®RºÐp{¼…ЇFµŸpê¿ÇÝ´­s§ã¶ ìIg¨sÏЪöÓêÇ€³mó‡Ð¤öÓbÙñ{i?æNqT„àÖ8˜¶~ÌÎáSí'Þõˆß­sÏÐ"÷Ó”}:ëC£ÜOðPŒ‡í•TÏ¡­=Q!B°'ö%ßÎN*BjžúchRûIMÜz­owÕ5æ}{õìÚfÿ‰˜&÷ZÔ~š!–O£ôýim7YE( =ºâzïÛtŸªkÌKœ¬ý˜{†VµŸæØCûð¸†Âch’û %¸ã?÷›7Ç:T"4ÐCC<ŽÑ‡6¹Ÿbö0źõì9|ªý4Å_ÇyËÚ¹ghTûIÍyzçêÓ>ÞòdgíÇÜ3´ªý„—%mq¶¼öcîšÔ~šÖõ–gHëÒ·i¼ns>‡–™ÆkÃN_òñl­ á-N±‘k?æž¡Yí'5Kæ14Êý„g¢ek?æNí¬I…p *<»öÇíyµŸÆ;&{G!ú1wâECÇqËâëеéüç]í'5­ü1´)…©9È¡Yí§ÃYì­¥sÏj?©™<ï¡ãú¤ ´x ­B«ÚOjnùch’ûI<¤óÚßîr?‰ÕC›êãêǠ݇fµŸÔ3…¡Aí§bÁª7ý˜;níá\ ;l¸ÍعghUûi@Ÿc}éÇÜ34©ý4 ûʼnïÒ¹ãªïº©C›êCª¸Xú1÷ É»nê§åǼë6ı€‹‡¥sÇEßuS >†V¹Ÿð#C}›u×ío½K3¶»¨íÝÓmØ_÷¸Ã‰®û¸Ýº1rq¥mo—Æç¡4çr¥ãÔ ó<´uïD¨›ë|Ù)BËè¾ ðý¾ØChÝ7©Wc3´Ù6Éw%"´Û6Ý£"š Ým›äúX,ù`%_ÿÈ”ßSrù.¦ü®’ë„1õb_©µÕ˜r;ë¯í%ë~GÎC ‡ø¯ï Ì.ïÙ·B÷bzH/åô9,½Ç·z|~ˆõøvÅÇG-TgëLÝwÄ¿/&ÂÏs;NÚwüé÷?ÿ÷ín·­ÿ.þ¯­âÖn~Îí–Íý> 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 551 0 obj << /Length 1005 /Filter /FlateDecode >> stream xÚÝÙnÜ6ð}¿‚H¢,š‡H‰FúâÖ ’nú’æAör×Bt¬u$p¾¾ÃCkImŒ(ˆ‚º0¬å ‡sqf8$Á<ˆ ¾õ~ºïÛ+‚`Áï7¯¸]QXAE‰Ä’r$i‚Uœ ëbõþA[˜{iÈU‚>[ÊELá8&(G¬ÞŒy$”!Æ ì`AOÔg1_q‚•Thøµ”Sä,Ê!1&”"A%¦’K >bÎ7JaÉ$ª5ÚÝghòíÖ-AI%5`Ìá+G8ÁÝùfuz ;£@m°r³CŠ I„ݮͽ²ÝúÃæå"J÷¿ˆ ³ùÇ<6 à6Ф£œ"ÿZßvY­_§…néµþÏÙB0R|û]¡ï'çYu•6úÉ’œÌgλ¥´®‡±£œ -óP0À^è6¿[Ò†_f3—‰“»¢Oè)Ò1ß¼}w±pQóod@ZÊAZ29)M¶Y9?)%Ô2“õ‘·Î™9Aåé%'¹a/8¤+!œø§k»ŸÍM·ÛåÚUí³2Í´MÛt1WMJ+÷'®Ór[ó]¤þYV&¸ûX~.X·¬gEöeñ¢¥›UÞ]õ‘÷3ªß29Š'Ý´Y‘¶> n»4ÏÚ;:mºZ7ÚÕ°½vÔÞèQ,nágGÆÀ®ñD[½K»¼uÀëW—næ{Þö¦ø.ü˜ µ¦ãúºe±x×ÐgùÉ‚ßÚÂæ °m¥™µNã³%%ù¨›‚²îÊGÛPò¨}ßh(˜Ö÷ VÉ¥û±Ÿ}"Ž;¬C^µÿvV¥?õàbãFû:=Ü,V×>¼¬–‹7)ö€<t Çãrés[~Ýôýl¹?þábs|Ë€Û;v-2ï·+¹X¸ÉÁÐNõK<âô÷‚£ßªÕ›ïz¡¹g1‰i’€—"¬¢hÎÃÐ=“LHbà!0}˜Çô}êÈ<\a:€Õ衃Áb¹¼Ìö^ë ð3&h¤0#q»p­jf‘T;ó›¸~Ô 2?ž­Ãˆ³àת8¤uÖ|•Öuºk–wqŸìú ½i¿¢jüšêªM³Òô»² 1èŒB¯æ(H7 CÍT°]ÓÚc´f€Aˈ« Ì^wõ'£‹ð®ªÍ ×0éuÛ™‹žAºNÛbk?•nê*ïúåÖ¡öµÖ%ä0çäh  ½Õ‹H†*³&Yç…rî…òÈ Dm43¥²ò£µQx§‡ÛgV7oÞXü²~ê¼îÀK¥nŸ5q¼.`—û>Y# ªLä (øþj♲ùoz¿ endstream endobj 537 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/estimate_rank_random-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 553 0 R /BBox [0 0 720 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 554 0 R>> /ExtGState << >>/ColorSpace << /sRGB 555 0 R >>>> /Length 7602 /Filter /FlateDecode >> stream xœÝ]K$7r¾÷¯¨£Ãåä33¯’-´€-{Xìa0jA³Väé‘íõ¯w<¾[ÕÝUÕ=àƒZd|Dð#3ÈJ‡¯éð·ÃÞü›þwXŽË¢Ö,ÿ«%óÿ>Üþ|xóO÷ÿþ¯_ÞÞß$J\ñïý[ËþòÛÙß~ù'N]ÿ}ó—¿–Ã÷7éð5ý÷·›$õ|sóxÕ7‡/\Áº×zÈ{;®ë!­Ë1õÛz¦ŠOÉß~MXŽ{·ø—›°[MX4A /Dnåpw“ÓvÜ£ºùÖj:î[`P:0¬å˜r`PšVÒ5™þw ËžŽ½J~JõX·Á:r´ÂJGú')<8”ŽÓHBéÜ5¥•­jë±µÀ t`ضc߃ÒÌÐúÔ*%ƒB”‘ÚÈW2*\ÊqË¡IJGŽ5ë8”9¥cZèÀA³cï4[ÊÂ{ÙeÎ@Ùm=æmè¶õãÎ7M¶|l Ó¨w+ÇÂ¥Z-Á6uþ!S‘?: ¨'¯ÇžF=ËÂ\£¢·êI;wõ¨g¡>o´† èp ù²ï£=#A$UK3rÛ¹“¬éB¼eÖõ¸UÏ¥Qî.BJV$´ãž\®×ÝKBXQ§æB•‹º¾½ù˜÷|ìÝúÿ.$lÇ’{9®ªq­*!¸¢½[öÜ•ÇÝä@H©ÂŠ„vl›Ë‘-v/UaEš mT.êªê§’Ž¥Ø|¹‹)…ÝX"¯Yµxj¹Ï.¡Þ 7U¿ü~,iÈ‚’²•)49ê%—GÙB)7êF>ô‚lÔmYÅqb®ßÅÊDTb¿ÇAþÇ-C(©üâÖG~e7ê² ¤låF yÛuÈ’=´Q¶Pʺ‘½ õÖ¶d6œÍìô.¦”c&ß´ìÇM[Vȉ˜U Åõå”ymñüÂFa²FIÙÊ2Òä²ë~$+µ²•nÔ|ÓKe'½¹-0/¯Ê i»8ÿÜ˜í§›&K‘“?Òšiž¦r§ãÙx„3ý/±óæÅ#,ྨr!ìWõ¬ÏBöU˱Zd0B¹˜nâÒÊ#B2}çiæ4ËXOp÷èrZÅ—Î3„|Þ²Êòi4Ë,Ç,8dü= ]žß>,©ÖöjÀrZþ• wm xôX˜3uP]èÀP—ãÚƒÒ°@,™&Õš"`q0CÊà€  PLà8X¹ñpèÐ*šk=À0Ж¥=@а¸FÀ/C!µÏ~ «‰Œ&À5ˆÁ380ýÃÌà  žxq¯{¥¿+æ t_WZú]7ö—}@‚ýc @‚íO†ÜkÝÈzÎ,™VïÒFÔÎ.ÏëÉ…º:£LkÌžG=™ðÐõo[‹·g$l¼º*xHäi¶¦ 1‹å $19Rê,ì—öâr•§»•*Ä,– mT.ê úÿ.$´ãRÒÚád¨„€År’˜)uîeªÙä;+UˆX,Ú¨\Ôu,˜/w1%ó’ÐÀÁŽÏf—P°x¾—%eÀ"ŽÒ ÏÍX@ÀâùÐk €ÅË€s=é‹b µË*@ÀâùH\V)-;¶¤²»l',»zÙJÀâùвQï °ÀNïbÊ~l«í*@ÀâùHLÖ();–Ô»xfÈöÆžÈ=†P°X¾é¥²“Þ°°[ËÙK&KªÙ‹“°ä¶è.€¥VòXŒ €%×Ì­€…&ۋѰHÚ>K&VÙì°8K¦©·.°dB[Û>‹Ó—–Ç€ÄCÀBìéz¼rRüµÎWê|¼RçÓ•FöZG¶’#›§M8„Prdó¶(%GvZ’zaà JJ/K)=öŒ¡D«×ºE dù†‹jŒ°(0àœÆ€Šà TË„ý” ½¹óL½¹ëijlZXú2²•Ù´P”€”Œ%ÅÐYB†LÆ!šÒ`Y[±ÂަbO‚l¬`¡'°±®ÂÊìx p·ƒÁ÷†Õ‡ Ú7 I OpjZÄVKæuÉÛw^ú´ZšžÁX­ä — yÀÒQI‘âûÆÀ'ï±êípàD+º ,êØqöæU,zÂèUÐ •žhÇ3‡P× «šüìª&$§z¨šÜàÖFÍdÞ· ú>ÚÆ²M¸³“­K;ûàѺŒÅàTë&Ìhã4ʱ9fäý«r˜¹Š !BJ ˜‘å2äh2ïÇÊ¿bDTQ¡¨hŒ:©^$WUÃnÄO=`Ý'DÀ‹ÈUD9!´Ðyéì¢?3Ó¬ˆµp«EUÙÀûÑuÕc=œ\ƒûÀVu½Ñm O#º 4*liÝúØöÄí[@#ÃÆnÍcØqFˆýŸ‘aû·îªvkQ0ƒÍŸ‘º÷;åÐþmÍ;aÛŽKóN0jtB¢‘YÇ齸ÐÅ»ÁÉЉFV$м‚zÂéÐ ¼z}‘ÒÊóÚ;ÃéÐ ©ó>º#e±ï§/ß ?²K{áLs£m/7x²€ï‡Qz!»§Zs•f)-»pŸÛràP:rФYöÀ¡täà¯G=p(-[â;¾Œ+¾Œ—¼°Ù9èÈAótY‡Ò‘ƒ\øþúѰï{ÒCoбe9é:j-S:rÔÊëÄàP:r¯±‡•Ž´®ï±‡•Žžù¬iôŸÒ±í‹0¶+9ÊΦ58”ŽëÆŸ+‡Ò£’ù-!ºôápêƒé»=3íô³ûO®Ëºê¶Ëj^»Æ"X=´äµýÉOV“F5ŒšÈUH´„Õ”›F=XMEÜØ¨©&ÆO}4ÈX<¬M!…fêÆ¾ðGyþ6OØÁ{ ´ÈºÍõ|E. JÊVn¤d>ÔtYÒre ¥Ü¨[óM/•ôÆ’¯N=„lxʦ†»ó‡-„eøèyÔ-2lêž_4þBdòÀ O‘ —•à /Ûc7¼nIq½DvÖ[ÛRtµÁ\º‹)›ÔP6^.Ø;qí6ó„íxè‹ç×,çD5jµý°§È(º¬Œ¢—-”p[Ýȇ^*;é¶ð*ØÌîbÊf¢»~É—ba5BI}«œXþ&&kT·NžÒx/î²rÌíe ¥e£näC/ÈF½µ-ßÖÕ†ïbJãÝOMMb¨ý4gÝâW›ÓUJ=—‘7YPR¶r#…öDeÈfÞ?yÙB)7êF>ô‚lÔ›Ûâ>ñ ¹7]wÁy;·Î ‚j.ºW‰®B8Ñ"c¾j×zJ-¢7a$)· öÆh‘1Öôš]{ *CpSAŒ‹Ñ,ã>¯Ú:¸ˆERõI½¯€2§/ÁQÏà›ß ©ëã ž,àµbÚÃ::¬âilj·qì~äm}‘û1×€7”Ž­é¡ºq´f§ê@Nã“=Õødä䆬‡"§Ád89  «Çâ%¬í¤ÌpèØ2Z‡k@A #G•¢‡Ò¶½ÕʆÞ@ECmjpµ ÁT48`/Îa¨è¹° Ó[ôƒŸiË_ù÷Mx·¾×Mxë#Q%^ï³Þ3ˆœ°~¨»bvkuÍú ÓÚHËS x+ÓF.?Ö¢ y›BJ– E"i“³)ï?ù’ñ|A9. ÊÏ¿,…–&š5&ËÊ/^¶RY>ô‚ì¤÷„‚0w1…,´‘Ø‹íà£'T@Až_4¨Cd’² â“ 9ƒlfÿïe PR\/‘õžPæÒ]L‘ol@",SËÁgžPY¾¢“5*9®±”…1¥ÉÒ¼å`O³8¡ òüÕXvÒ{BA°ƒ€‚X†UE"IWo³š±ºÉX¾¢“¥e”ôïÉÒn-/[©€‚<šB6ê=¡ Tá)$‚  ³øT$ãù‚r\”UxŠF˜¬M¸7ñ  «Ûò¡d£ÞyT…¡ ‹£0ã*Ügýˆ”ëÊÓÇQÓqØ—ìÁ‚8‚°l9Pû7•QÄ¡*£(È适r|é(ˆC-d äô(èùØ ; x4¸Âƒ0¨ ÇYÇ5aOðò@ -½PŸÉ4ï9käA±¥Ë8ʦSÁ8”Ž]µ‡Ò‘c_4úÔ8”6ßp¤:X42ŠŽ4@GŽ&3bp(98+­€~ü> ô&k(9è­tlAC™ŒÆ¡tähIƒ]ŒCéÈAË‘l¸ŒCiá ²†#5ÐñÀ‡–%©Žm'{YÃÑèÈA.²†Ã+У“ãYÂáèg•L_²f¹dÚqàú.gÙª up9V3_à9fõØ1Ôã€Êj²c%«ié=7jJr3jJ²ššhòú$ ª"ìm )rLP¬ë(’kóXíÃ\å ëÈÏŒ LÖ¨êˉ¥žy.+E^vöåÄêÖ|ÓKe'½±Øñ—ÁÝÆã.¦$Ù¶“»_õ˜‹·ô6zŶüº›O4¥-‰?¬@֩Ŷü–²Ê‚d²|رxÙJI[P·å«^*;ë­mi´£f§sé.¦Tý+k‰çq”.fžP¢ïž³çÓj•«Ë%e ·¥dž?.›ø«Œ—-”–º‘½ õF[hÈöbvpSV>òhÜôæ•gV#”~Ö^å4Ìò7y“%e+7R*†qÙÂ×X¼ìb×\¼näC/ÈF½µ-=É×Òpté)rüØ“|]ÃѤ[¼]öÔùV•篲þš,(?ºô9~tY9šô²ýèÒëF>ô‚lÔ›Ûâ>ÇJ•ЂxV#±…-m>V²yMënæ‘l˜S¤ŒÊ~¨²K̓f÷U+ÏD’!¸ž9"Ïú´ŠF‹ Æ)˱8ûp=éåã,‘¡‘YÍ2îóº~lí¼²òÇ“E?°vª` ôEŸçžF/ß>ÄI/¸^óT¯…“øfÉpè°ŠÓb1!БƒÀnH t@AãÀ¨hXõŒë(@ECQÏà* ŠzPÑ£—lÐv>$ŽmW:¶Œ&õ èÈ‘wöuƒCéÈaG!Æ¡t@A£w€ŠÂZÙà* mW›m* jAƒ¨hpÀ^œÃPQVO©:VO):3­^€j¨‡`·öœºíõõOÞÛY¯‹{=êµzºFZ[=ºÓŸè·g°Þ©v–êÏMý°ÕŸ:½?WÆ\—÷'!xé/o窛T«§V=´zh³Ü·çû“¢k@É|Lµ…þäÃÁLe\WF=áØñ±09`@oQHé¼ ?f qóö¯üéù‚MMÖ¨f(ÄS ïå]636𲳡¯[óM/•ôž°+f÷]LéÌüÈ£C{MŸ#BìŠ`SÈ:å—®=E.º¬\…ö²ýÒµ×|è%²³Þv…eÞÅ S~dKmëÁç]³ÏÀŸ–¯ØÔd¨ÝR+é²b^ö@íV7ò¡d£Þv…W¹‹)ß5~ä~_ËÁ}ƒP»z¾`S—%eìÊlÛͼ°yÙÙîcyÝȇ^zOØñ.¦TF…Àìih2»ÿlv( üéù«~^‚,¨l¶=E.¼¸ìÂð²û°íu#zA6êýx°ÝÿO ëjôYž!1«äO«É­V©è4Å,^e’²£GÈMw»­ÒVvõ~²º‘½ôãø¤÷ìDäɳÊÿQí߬:M>²FIÙÑ#Âè‹Ëò§îÍËV*zˇ^zÏaÁ]¡’øtƬ’PcKnµJE`ùjñ& ÊŸ°@JÚõQ•MìÞTðž/z¹lÔ{ö çL!EýÍ*9qX­RÑ#Xþj]ÛðZvôËÆþÊd5ÐßÊV*zËW½L6ê­áôã0ÁΖ2{„Ê=îVÙx4FÂh¹U#¯²Ãþqêâ)‰Ïî]va/æe/vêâuk¾é¥²“Þ³GPd=B“°w³JÒnë¸RÑ#hŠY¼Ê:%eGÐdn²uçw+[©è,z‰ì¬÷Œ°Þ±”*ßAÌ*kŠV«TôȇÅCÖÁæxÇRVÁ;†:ÏSÇÝðŽcäCSÈF½`„n7â=e“¾³uzçͼ¯ã»]Š÷uùÀˆa=L¡ñgf—­|þêeW;Ÿõº‘ï¨@d£Þ³GÐÝLôŒ+Š[%ã½æV«Tô–¯o² ²½4ä)‰‹qŒ°³·uŒ°›_wŒ€|èÙ¨÷ã—kÂn[>#Ú©—}6´S¯øÑ-I®Ãø©Ïu _ÐS/§Ã©ÏO¹Þ‹S/îùÚÆ©—ÓáÔ+×MwN8õâ“•¾S/§Ã©[š„\ãÔ+ׯG.~êå´žzBO/éþžCÏì­gŒŽ=Ãaf±grÑ›ÏÖ3FÇžÉUg¥õL’—/FÏ{†¥Ü;´ž¡ä”CÏ­=sj±žYœkϤ½jX;zÆéÐ3’$O ¡gäžÁ6zÆéÐ3|"µçÑ3¸Nã=ãtèÞ]Ë—Oô ó”0gœ=à Ë:z†?½ç>zÆé+NJϸÖoŸlŸýôŒ›×«¾ñ!Œä6rú͉*¿Œ•ñïôä¹M8ñ ÑÉÊùÈ/¾»q;ò¿RëW4(‡ï~8ìþŒ¤Þƒ²K—WDn1µÃww‡Ïîyóáþöýíýýç‡ïþvó/ß×ô‡ÑŒÏsÚøœÁ¹…CÛ?¦ßOWþ’~oòlFo¼Áç~ÿp{ÿîû_ßüt¢ÛŸhùÃë8L=YûõTŠž„Nšgåó­~5òÍ¡§j¿¾ä[ÅûçþÝO?þüëíÇ·Ó,z¶ñ^8Ñðƒ?ÆÒNWþKËrÉ`— '?ÿò#9¸ïÞþÖÔžhúÃH¥?¦“ž¬ý¦–v}êÖ{éûw÷¿Ü~¸÷óûwF7yˆÒ3—žªýGP‘£¼›þòYm`>û¯Ï©oŸ½ùðù_ß}ýÀòžï®Wý{øaÖÞÖÏŠñ-™øš°æÆ§d¦·„5{zJfzIùñ%™éaÍŸ’á|k ^˜<º¹ŸÅ"ñ™ ÇuòTÏ6ùܧùî~ ‚å\A¹3Ÿƒd=[²ïúbƒI¶s%åbx’=òï9—R—ÍÃÝüòc|êùÓËÓS`˜Ÿ~œžz4ŽééÇé©GpÌO?¾ú¬JMÞM¸bZÉKçU½tbÑKgV=kj½h*ùÆéJÌtó•˜é ŒqLWb¦+0Æ1]‰™®À€c¾óŠÓIîi䫿JÕýª %·úUJ‚þËUJbìÓï;¡<øÅr †™‚_Œc †™‚_ÌÁMÁ0Sð‹qLÁ0Sð 8æ`˜WœPrŽ¿\5¡äØ|½jBÉ)u»jBÉ¡p¾jBñlÛß eÀ Ÿw¦ßeˆÐ ùÓï2Là ó3LðÉ8¦f˜8æfx}ÅO²oWa¨!y1ˆ¢£¨!z1Œ¢¿Ûb7†qzczõó+Ó«Æ1½‚1½zaÓ+Ó«6½‚ñú‹Ý5ó ‹Ý5 ‹Ý5 ‹Ý5 ‹Ýï:¡ü¾‹ ätÿeºïò öppø}spÓý—龋qL÷_¦û.à˜ï¿¼þbwÍ„ÂbwÍ„ÂbwÍ„ÂbwÍ„Âbwé„zi‰xç‹‹4‚\+MƳûX…ùVÐÖ |vW™pÝø;« ÷K…ùñŽáíaw½ÌÖª¼ÜéwÜæ;obkà°;nó·ÈawÜæ;o‘Ãî¸ÍwÞ¢%}’±_ø+«ÜÂ^mìÏw€ÞåÉu•nË…ÒâU!½^Z7€$=á Ÿbü=ºŽöcçÑýs´ä°“°9Ú?rx õíÿÜø¿Ö²Í (#ùµš }„ågi.ö&ÌA ùR`Â]îV=ðç o«Í^š¯:8‚bóרî¼Ö¦/†‡¿Î6¿Ö9ìu¶ùµ¶Èa¯³Í¯µE{m~­í»°ëþG2È~ûË~ö(©8ƒ÷¤C\¯/ò *²¤Fñ×f:f~J& €?3?%9ìé˜ù)™ßÉ y[cZ/µ&È6yJKeÏ$Èn#q>…!Ö.ÕØ¯7N?æ¨÷§$ß~¼qú-Ço¿Ý8ý”ã'6Ÿ´q gÚº³Dó÷l©Ò¯Tv·½K¥›/ %J¿âÈøÏTM¿Z5zÞ¥júѪo?R5ýfÕ'ÌÚ},zçïWE´uÞÇ_¸^ªè*W‹¸.%§¿l—.´*ÊO䮶ήÊÒ˜µåÓàô®€œ†Ÿü3Ä~ã#þâÇȵŸøˆ?ø1rí>âï}Œ\ÿé÷>B¾ý¾Çôsçzô×øožç ÇþNó<¥y•λœZÉF\>•õùÆò³7o?þüáóÃ?¦vøìÝÿ¾ùøîç÷¢g½ÿøýü¬ÿž¹ÆÜKÑ‹ ªË¯^‰îÛp‹ùÕšÛɦ3Ÿ$ŽUäûÍí›û_?Ü>þý—ÛÓS÷ ­µ°¶êcU|±IÿÎZ xê¦çi èU »ü¾ÚÝ¡“ËFPÿèÊaÄHN±'"vŸQcḣGc5‡^›>kÖì‡9‡§T¾Uಅ#O½ìb¿Òáu#zA6êýöæ‹K‡—@^¹:cxO=sÞðV¹t3†Wédž÷Ôã,ϨqîðB‘ÒÄëY7ù9\¥âð"ÃYPZvÞ*ýi²U~çÏÊ®þ3€V·åCSÈF½¯ÞœÙÛœ5¼§îIŸ7¼¼P®ax•~lxOÝDxFs‡ŠÄ”,¿+†..òK 6JÅáE>†²F%{&ÅS¤~“Í{t+[©8¼–½ õ¾bx—¦?ÏxÆðžºž~Þð¦*¯Ïûð*ýØðžº4ðŒç/‰)²ó².N·ž6JÅáE>†²FIÙqxùGòMŒ­¼ìd?âu#zA6ê‡÷‚¥þäy{ÏrY®ËïBðBÿÅ›ûw÷WøWªE[!µÜÞ<üðîã'ª(ËCqE_þ|ûÃïÞ¾»}ÿñSµŠ¯tTöþþöýý¯¿©éB|Ç×x³Íç]>|‡‡AYõ~óñÍu¸.Ñ,¯ý<×ñPÕ³]G¢ý ‡”˜ëý˜ë8Õ%nëVVHéú«.j¾Òv³PPÁú-_­ÛdAiÙÁúS“7 L¶ÉV¶RÁú=šB6êÍ·ð.¡"[ÁÐÃ7V«šägH|¬”¾d¬¬¨árÜÔ›lDµGîuõ*—œþñ:ãxªS“[SlÿóiüF"ûnz”ð÷k¢Y¯Ýß–AhðK‡»npÿôÍWa'{ ÍmsCt8íóª?ºÇ½ù?aàøj endstream endobj 557 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 572 0 obj << /Length 2994 /Filter /FlateDecode >> stream xÚíkoÜ6ò»Å¢=àd fDŠ¢Èâ‚ârHúºhë»/m?(Zî®j­´Ñ#ޝþf8£}Yvì›¶wA5‡óâÌбHt:‹÷~ÛåÁ+ý~ÿÅY<ƒ3x>|†pÆÍöæ1ðQ˜oÎ$pÏäÌf"–r–ÆJ$.™ë3„ke…ËìL)# °æg‹³ïÅÉÃww Li$¾f ü¦–`€÷üòìéKåfØVfv¹˜¹x–I ŸÕìr>û1*ç?_~}&úOq?š~–døšâ6góHô[ÿf([ÿm¾öÝ&/ün/Ò)xÕNÃ逸ÑþäyÙ¼Î;ÿÉ)7ðäñÄ·1Aô0&Ì#` ~‘ª4]ø¾º9åž=š¸±^ã}7úHÄ/¿ÿ׋[Äÿ¸¸¥ÙsK•¤"8“W.Næ4Gáàb\øBJáÒ”–/šõ&oOîM­ïÄz¨úR¬}¿jæ£l§_âî4«•ô{ Oâ½Ç¸uá$møÓó`À_-è¹i˦¥áUÝ\W~¾ôôÚ0FQå]ç;z)ù™¿ÍË*]ù¥½˜Õf~Wµ<®aŸ4ªøî‹¦^?vaà×ðhý唌þÃWÕoò’‡b…¥ø0.,O¶î£8P…!|G`PñCt‹¸@—N²qmmœTr·¶5©–Îì¶ì´‘hK´e »4Bó–]vßÂqTl>^7ƒÈ«Šù<\EVãq`D¾×XÔIæ¶ÓÃøýÓ奜ÜãÓ”—\nC\ÜÏo¤NkŽ ™ÃÏ}‘ìU§ýŠ˜5 }Þ—MM€ës•EyG/Ø€|»hÚ5Ñ€Pö+ù¶ÅD)ÐkóâP¯J ±ác¹¤:sQ¨Kœr.#š%£MÕôÌFÎË¿¦ƒÄ/Æmì{ȦmÊ|(£$É`¼ßÐ8D~BàDû þM0øŒyvXžö…§´P™‘0çyY.άäxêËݩ֤cÖçû7e¢$œ±¸•½bpÂg 2Ϋò?㮺†ÑWyϘ=£þKÝv }{žBòY ž^¡&ñ ÇMퟰ$eDx`®/‰º¾Ù„):¢µ2`ˆdóÀï×+ßú#”=™ÿµ#Pø y æ³ôuÁ¸E‹wä!çI‹¡ÂU`6‚ô¢³1¬ÆÓ>Ê2ûJXð5 >øï²Pt#Ÿà~ÌS"£yÇ´ôQjc!‚¥dȉMH9‰åÜ6 ždyÖ ‰v,m£ràTø%è>û~#¯ìOæ?!û}þ•C·ýœ·ËaíkœÓO~’)‘ÅÉhÔ¢Ù sÝÄ&5T„ÒŒˆ¿’ùhØw,Ý¡ù°þ%2 ±0~ñEß´7ÄZ)IâV® ¾ð ø?@dTô%™á˜qÌ^!Y”ä KÈÂŽ÷ £Íôèi:‰.W‡·–+™b ~Ö`”èDpßE”$šnÀve{I7:?k GìB]³fcoÌ[tß®|NVý;·F_\ÞîŽ*g…ÎÌqwÔ$"3òÿª; Ù’È2ó±;ú±;ú±;ú¿ÒýMÂéî(§ýX•Pþ¿æ’“Îqñéú ¦´ÇŸS6lÜÝ ¨v/+w;¾ÁvFý·‹°­tO·¸û÷ä„Þ¶’ü©ã×~ÆøÇ `àýÅDLo-nE¢îYUv=;ÖWÏ0˜ÿ©É¾q¢„‰5±{9Ö¹Tç˜ý:'¡Î¦ýعȨšÑÜÙÀï\Þíêe½­—³É…t©Ð‰~@“B«Ç5)’é&Ågõ1œ}ZÏT(Ǥ/}Þ¯óM÷þÒ8ˆLYÜ*O ¨ÿ¨CÐMl9u7¹øÂ†-¬3UœJaõ¶Š}2E N+;"`?xšPâ°Ï=âa#dBVX›îhÕ¯»áÎL*R·ë,µTú•ó ‡4ô¿P>ïnhD}6®3Ð7„ú–›,A8Ĺk°-˜)DI!Ótª*×a"^ÓQƒ ‰¸ Ž_ÖyߖS åsfÐ2ó%^u ]›ªnlJ[ý.G XÙÏË"§f¼¾-—5Þ ññ öÍU'Â캄?ÉDƒ]|†÷B.ÂÒž§à%!ú«'Ùa¡m|2eëNH¹µõÐÝ?FW¾ÚhÖ9u®dVHµ=.>¿û8ЩF¿ç8p"ɶÜ|~¦XÅl©-FÆ×MËœ—56€GU ŽæØÛVòPDÇk´qÀ ‘g4Ù´}>š‡f†æ ”o°…ŠÀ07~À€ˆ@ºøÀ=ÁHAraÒô·D#mLh´ÒRx™€k•Ìæ:¿ #”ü™Î·¦ëJü뙂Äb%ÔòÖ_º ™×!š)G]È2ø²!¯¸‹:øÖÔôìWãœÇ×ü†Y°¯œŒ†Ñ{JTþÁ€•»iäÞ ÆÊ@ô0ÏÛ9½U|ž#ÆÐ¬È«jÊ6Á1E–m…¼É[ôèõ¢m®Ÿ !öz!=‰qÚ­‹œIƒurk†U~<áwSO3‘î2OTgL—u‰µÑ²-ç4z[úë­v¾×Sªbµ³³Ã3}úØ{úRº™.KlX/Ô C8 Oºû–”´äÅÞ4¼Wˆ¯ªööþzJòQ Ú3½«C5)HÁîºZ…üñÅ»| ¹Ýx{9ÞMç7š²„ý[ËýÓ^·§—hd G„œ]w§#ø:¸Xq l®XŸýøs<›øëÐÞ²³ë€´žI\(ªÙgßÑD’B ãÂÄbæ2(ÁŸ”P©>’ü”­€óf09–áô6ÆRVØñOVç˜Þõ›î3ŒoO!¼=-Ú¼í¸ í"u¡¾M»|ŠÆ3ÀX˳Is;~Û‚c€Ý@l…r*c¥¦Ç¢û/ñ:Ç endstream endobj 481 0 obj << /Type /ObjStm /N 100 /First 898 /Length 2559 /Filter /FlateDecode >> stream xÚíZmoÛ8þî_Á͇¥Èá{‘]\›nÚ··EÒÃî]‘®¬$º:VN–í¿¿g$%±òâxcµWàH@‰‘†3Ï̶& %¬%¡¡õÂØ(¬S‘AkEPèwAÄ9¯…V²Þ M:ˆdÑ:/RD›üDCZÃ/ðÈj¾H¸À#i§.0œÃ\sk—¸Çí-÷``¹ÇšQëñ(àÎFŒœ"Œ$HÀ‹Faœx,¿­ A“ àAy\$ô$%(¾Ð¸a¢5z’æ ˜¿=(˜ yLšŒ0†ÄÆ>_[\´páñ9Nia†w Â1ÑÄ)%L2Z8LaUxd…%îáï7øJ`Öé„‹Àzå¬@D·Ó-hK£'E–áJG˜ÁÌg cǃ2^8¸Çà+ã4z#AË5ã_눑=Ï•„7ŽGÆ#Ö„#<âQ5.*AÆó¤Ë{‡× z"´î`AAñ<Öˆ qç,l‡¦u"m&† ƒÂ€Áñë°± gµÑ0fcQ0)„á›Ð̆ %j,sFDbð0ÏÓš8|R´‰{¼ˆ­2Áb-ÏqyŠ$"^V—Z¨0‹¤S«$‘ ¾Ûy‚E30[r¼‚XX?Xi¬?8¥ Kà ”†­86[eØÌ°¸‚‘°Âà+,Ç&¬,¯~à7XùŽ}@9¯'ûû“ìý—ËBd/‹ª™d/«zVÔüRdo²·Ùn° '“ì¨ÈñƒI²€IÂsÈÜbî„n v¼úØ`Èì¯åâSöb¿ {‘7eµÈ޳¿½åÿgçMs¹|žey=]Èú‡ËºúÆ—U}–]NóOÓ³âÇÓª.¦ùùÞO?Mð· Ö`Ž}0ÈCÐÑʠͨ`gÕ»i=Ï‹ùx½>f’:29I*ŽŠ÷cyvQ\Tõ—à:´ ¸…L í„c wùe‘Ÿ×Õ¢ÌËf Ȧ$Ö48@;/id{øå`œÆIÄ›˵^úä¾_Ë%|ˆÞK&"Daà×cköÝÛ5¨¯Ä ¦TâHd¿ÿãŸä ^—h«ùüä!1ÄÊ  Mc•óJK½…‚§ääá19k¼D|Ù,††Ja¢h9ân%¬“—jË<$åí„a€Jo;2‚gÛ »(Ò¶¶ÐpJ[ ›>.‡ÈªyUØ aºwÞM›¦¨‚ºÛŸ?7¯›iSÀ¹c’V‹Fìï‹ìNî‘™®o÷™»xsuƒ(‰„ªbZ]=£è~ÖC$„Ä ¿á'ÝhÀ½««ü¸€Ÿì«C‘½/>7âdè«ïà|Ý¢)ÍI'×Gì ËjUçŲÍ,Û®_ŠY9}Y}­K#)“„äÙ œ® :ÀÂjÛ‰·,°Ääœô2$Îy»Öõm§…“§²‡Ñ`á.î!ýã, ›)[úªä1@ÚO#Úyî®Û›+àb°Èv¯€“Ö2!pß ÑÚͱÈ^Wï+S}öæ´ªLWHöÄÓ‘° ×8'‘öß ¿Vé$¥…T9êuó¼Ó!`9‘ŸÞ¤_Þ|õ ÃVA`]ŒƒÐ)¤æÉ9«@ÚúQ9 Û-Æ#•$Áf¹*sRù0&• ÈgÈkŽJœ†ö7(l,]Q™C5M׌ö"u1rQr=À€ ”96ý%‡þ’ýSôºEÉl ¹'X‹M¹(Ü„tBÖ/)^p÷{ìrõqY´Þ"IºuWeÃIn+û_ƒÀ°ãFÉÁ’¬i`£Xjk›âÝ(ùDcpŠnïŽ<ÁnÔÈ.h{×\c]qC•> Å§ªGë»êI»ù ï51$ÞjêZß·¡oãn¾4 Ú)®‹àK(A#`’^#yvÈÆo /ëÕ¢hH);b4·‚Ýr[^-$8ÄÞÁÛçͪÉÏËŀ∀<ôÃ%ºF}º.*z€›ÖåÙ—bYŽ H°Þ(ÄÁö\·¢®oëÛo»^(X¸„èÑðF†‰[¡yh¹˜!®œw3Ęê]Ô߆…Ê0 0¼S}o sÃ>O%ºœyWw7Âé“®h»¶'û6 ç .¦I_±Îž½zNЬŠHb’u.ìI5{ðÙû²™ãÉ‘x]O/ÏË|)~]5—«f¯ÕÇl•5?…5I³×ÏUq×ÞP1¼FköÊz’ýmzÁϦ;]í:foŠùESæÓIöó"¯fåâ¬Ýdï£Ò‡ìíÁKÏÐÛªòdmš«7º¯ßÏ~+/Ëòæñ«òô´€†yIð¸ì¢\¬–"ùìß+”,óâ´a'Éf¾¹,³³zúG‘MóUSdyYç«‹Óyñ9kÊù¬È.¦yÄþc]@¯Ló‹—ÍJL±,—™ÄÚÍŠÓ¬ÆÜYŽ…ŸÏ§×ç«ÅÙ´^]̧«&«ÎªEñ)˧<Þ’Ý`¤$Ìjdá””4Â%I#%"‰‚ê^¿?-ÏV5j·]Èg©Øœ¬£t¾=‹‘ Üb …ñZ"£ç}|ï¢0³Ý} P…~¬’ãá-Y>eC\€5‘„Öšo¤ ­yë(¶‘FtÛš|œ¤±TöpÙƒð·£m••ÄXƒÚêê¾Í¼¡(s6Êmm7Ë]’¨Í£õ_-O¤¦JÌõè²uøû¯y# öí…FÐP;…!«î„!w CÔ}/Ÿ.nnâ†p¿Ÿpcýz´ÅæÞ!xYÍg÷»ÆløÛ65¶ôN˜”d0IÔ=fµæó˜o‘ßߎ«(À6®x<€3©o%71¨¹Í &mÅ ëbW êS[Vl–EÎÍL«ãwÅŠƒœ{§¯¥ówY‘;¡wbEww7À¦6K60Ÿ7ô óuϾæs÷2”ûŸb(ö·]I».Ö»"9´#Æ=èbÃ=çüí®ïÄÿv]¸»ÑþÔF£ ávFáúÖuœÅ¿êZÓ·ýN›ï `ß¾Þº[mI•ZJ:²I2YYÎ>#m"t;b•â"ïçµÇ[m¼óN¶?¥cPß ƒ•Úøöü'x™òÿ… 6<+ü¼d=¼}¾ú¤–¥V endstream endobj 589 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚÍXÝã¶ß¿BÈKe`­ˆEIA¯Ý .AäºA’ì’Gäð7¿:vA|w»öã€6DëH‹$È岪öæ×ßã`sßq”yðHšm deY ý&øçÍOç6r!¥d¤dò%q ‹8’qæløý€–Jƒùÿa<~@ÍBÁü?i.…WiÎN’E±β(OR< ʕ̣"˃TDy¬ƒÁ[Üû;ùã§{ M¡³þ§9+.d ÷öþæëw¶-up¿ Š8ÈD‰<¸ß¿†õvõûý÷¯²G°þ[œÆWÛÏ’ ‡iB8Ó¬¹²ýÁ|<Öƒù±l=”•ù¿;‹($ U¡à¿¿¤3ÛþêmÝ?”Ö|õš¸½Þx‚îÖš\}Ö\Éø:•iwaÆæé5ÏðÍÕÆu®a§º©ç¥ßøùî•$ð¿Q©gQ)“4J4ò0EåöÕ‚fÁkÿáµQ‘¦üùCÓ¯Jƒ±Þ¯ÃñÿäLQ{lÆ:j͸ï7ê€Ts \ÍÇÝ]ýÝÿ~â»»Ÿr0d•f€´ óïÇ›H‰‚à³.Mù%NðõûVï!7ÿ4MI‘D™P~ÅUÆRo,~±|’jžLCUT(uMís2²–"‹D ‘FB%×Ta“$惮gΣ”»:]½€/I­õž¿ÿwõî8˜Õ:É“P½qŒÏ©jDé çnú´“$‡²ZÉ<ü7U¸õò’»ÆðÜÿxÇÂáØq£ 1Û‘O:e·á†û-ÚÅø8°…$¤8Y­A¼™,YV¦€ªw{\3úH Ö@žHp„B§àÝßïÁœÔ"ú•ÌÂGË£~‹­ Ç=lÁp²lí¦ÛrêÏ,î·£éX\•Ãðô|á·B ›º5­û®lêw÷ämðü¸wK6åX¾Y­Uœ‡;Ó{ âL‡ ¸ªiœ†‡ú³iì-ÏA¶¦á2q}’¦¡«hµ: çf/$©·Ç®aîÖç|/¤Žd1];y£-—ðy!ɽ¢ù þÙX¶?ú­ëàѱ-‡ÝœCWvñëY¤råÚãƒ5ã‡þñÂçSNÌN±°úö‚M0©½Z¹O½p(ó!OöœÖ ræðn(Ñ…;(tì¯*4Uý[,TU’wi†NmÉ»*ä¡5©Nª3¬Ã¥à®÷+º`EÆæÐFåW¸:eBwdå„èi¿Çº=@ñE}¸˜Í_% žBqþÌÿßøÊgá´,‰¤œŠ‡P%ð î;óØã¾&ÒØã÷¥³lyà¼():sŠN‘IÞEц±ÕP?׌“Õ·Šê¥# Ë&rŽìGîx?ÊPÆq¶p%ÁáÖ]yÏvúŽ})ñÛæ°Ø*…Κ\²¨4,ù$S ㈹ÍD;€‚³2a€Ž_"S¬/š Á­Ò²<üeBÃsƒÙš»cÏÆœUœķG铤{Ó¸w€oÚKhÉÒ¨™¿þo¿@k¯{戲»B¸$›èÛ/ÄlŠYrb‹)µýàòÏüU7Öå'FIy܃Ü öfomýà;¤9·z²>îk—€æd1öSåRžWZÄEìQ`!Z‘´‹¼:˜0EhyàVÆ_$î\AèNΨúÎB:¾pZG:ØK_{¶É8Lm;#n—”o1a©°Ž ÀL MKèðR§‘¦‚f~Çx´O"à ¼»ëù>òc:Ë·˜(ª®ƒû Ô>éœCÄ?c,¸ÏÍ`ücK¬I úEâD5½$NÒuÓF°yæÍ·Û?Ð:æÔe¸?Öãž¡#☑㋘„í[™ñ/YÍ®ÇÃÊ–%}çÑçðYõÀæft@ÿ®oŽ> /ExtGState << >>/ColorSpace << /sRGB 595 0 R >>>> /Length 1926 /Filter /FlateDecode >> stream xœ­XËŽ5Ý߯ðrfi¿í,A€D2 `n‘0Df¿Ï©—ÛDhÈD,ftO½|\ÝU.wp]p¯Ü§ïÜ® ¿e×’ÏÙå}‹.µàKto®Ý÷îõéãÛ§_|â>}vÚ|JÉÉÿà·msÏ>ýæ„_Åýuúá'·¹§àãïÕ)l0pON-û¼¹œ‚›ÛO#û\*ÍænNëõèb>w©ø-¹X áR|Ì.nÝÇA¸R„ˆ0‘ð(¾V°Z¬À1ß› ÛæC œªßºëÝL°TŠÓ›¯-¶êK ˜ÙyTÚ0H›Ì¥SŽn€Ï詬I§D¯ÿ)é›o÷$=Ä@lä™îNxãܳw ÖJÉJY: .šJ3P¸¤˜èјÂÕ`zÖÓ@àbðÚs‹Á'Wš¦óí¿¤éöŒW÷óˆ7ýêìЫBþ û..7zÛ¯vwçÒ]½:}vÅÁÿû!)qñŽñŽ™3vx§‡x§Àé<¼óƒ¼;r½2/ñιS Þõð–fð°CÅ3˜·àG‘gö®Að}ÂÕ@r; .1¡´i p5›Ïé0¸$<T¡(\ ”¶¬»X“´dæ£%a9ø†Î´%êœc$ùßÓ|¼öc“õƒ"D4Y¼+¡}X„†äé›Ò?(BŠÈn—ãÃ"àE Ò÷m{÷•Ó.qÊøÑ¬íÜÌ9ûA=^Ÿ¬Á_tÛ÷é$éÞjÆÌ5ߘä7O>wO¯o_¾xûüæö»½7PÀ “Ë5Ò Iž\ßýúû‹Gîç7o__ß¹ÜÓç¯{äÒCZ 2ØÑÄéxCÈ.¾¼»~s‰—Ó]<¿{ùûëÛËŸÜÕã÷|ø‰ÜŭБÍѾýùÕõùî埗8ÜŵÓÏoÞ^»/¾úúÇËÿÿ8î?ûœk‘v;GŽC€=ð‰…3Ÿ›NœÉ´pSVmå.©~ 8*›ªô‚ùÅáK·¨ØTÖT­²¿•ëg¿sù6"í‹ û^ÝHœ/ä° gÓZãPÙ¦¶Ò›d~ 8*›N$ó«4ÓXTlªkŠvÒ#¿•«Ð8™°éöE‚ŒÚ „:Ž8îÀ2 :³uñ-úJ¯Éô$±ÅZ%Rk¾¥z±• ­mzeª¾+oÝKJ4 ê8º/4Dä"àÔAwx{7°ÓáU¯ Ž­©¯¾–ÃWÄk•tÆÌ·‚k𱉵¬mzeª¾+oÝKI43ë(½¯’A­9”L´àæà͈×ÃãéÐWJáôUı͚%JaúV:¤glFb­k«^y©ïÊ[÷‚‚¢MË5`_%…*- ) ‘gÅyi`Äë¡vS>ôù*âØb­”A:|“Ì€›‘XëÚªW^ê»òÖ½ Ühà‘+̾JP…QkŒ:2mF¼ 3ìÔãÑ_E[¬E‚çFõ¤¾ÈmÍ3¶ ³2¡µM/¼Ìwå-{¡I#»~í«$ðA4:#dc^ÖÙºÊФz¼ãðUıŚ%cøÍutidg¥…MËœÌo¥¬Û@iáF(·Æ} zz¥ˆA Y/˜x%FŸZ\·é'€£Š© pV?º"F‹*@L‹ÞYkôØoáªô ÏÂrËÝ÷¹ˆêËÌ Ç]ˆðBhåaLm£Z7?ÕLI€Bߦ_¥J±¨Õú ­©Za£~ W¥êCoåû"èÜ#Pp8@ ² <^¨5Ýk;uóÀQÅTˆÐ¦_á«‚Fe ¦²¦j…ú-\•>ª(lúa_ ±1À™Dé ” x!T§nŽ´ù à¨b*‚Js“ùáô3*ƒ³èqj…ú-\…~B餠Ÿ9öEÀí—¾‰ è‰`pö„Á™M›mŽ´z‹ù à¨b*‚Ês‡új6•˜Êšª6ê·pUú(”Wú*èÔöê Å®õƒÎA?uÊ»i;õópÐWÐP?!¨Qúº¦j…ú-\•> ¥%ýn´/Ðh ¥uýŠ»/‚N)Ȩ«ÂœÐèìƒo·[gÆ…-ÓÖ.–ê§ Ù­Ó•:Ÿù: -j±[§­©Za£~ W¢ÿÝéo!§X endstream endobj 597 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 561 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/errorplot-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 598 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 599 0 R/F3 600 0 R>> /ExtGState << >>/ColorSpace << /sRGB 601 0 R >>>> /Length 7203 /Filter /FlateDecode >> stream xœÝ\A³.7qÝß_ñ-í£‘fFZ*¤BT]•ÅÂ\^‚©wMÁ3ÉßOwŸsZš‹CìdǾïtÏ‘ŽF3µ¤þÊãçòøããÏ/¿züùqŒçÖW}¶öh¥=¯ýQ¯ò<öÇ_><þíñ_ôòãO¿þ—Ÿ<~úÅËöܶí±þÿ‹ŸþÒ¬×ñø¯—ßüö±=~ÿR?·ÿþøRü‚Ç/^®ölkx{ÔnWwÂÇïü@çùÜé.×ùDå‹ÖÞ½h÷b£½åçx64ñ—¿øÙã×>}ýû¿~õñÓxá½­ýQºÔVÎo>û×o?üås{íŸ}õí×úæÓç¿}|ùóïyãìŸÖÎÒ›˜QÚ/ÿd…ýȺ᳷¯>~ýéÃïúÝ?¼~ûõ~þpë‡ÿñÕÇ¿~˜u}¯/Éÿë+R‡Ýºì)ûJTkÊMùˇë§ÿ¥ƒš´ã!±·OD3º¿ãÎþ‰‘ºÕ¾=ëîÿoûdcZýN’}Kìò^N§–© þ–dÝòúÆ´Rž¥ÛÈ´=vÖ?}üè.5>ûúÛ?¼}g×ÿ¥íÃ_v/´(íw*ê¯ß|øö‡UÇ¥gûã‡ßÿ‰½×çú7ŸìåPÇ5Ðn Ð7Ãh®a`÷¯Ž}Ùmn@ðj—v#]é->>“7•ÊK;n¯=fä™´ž¥¼B€× ƒÔï¦õõå /7¾ÐuÛž¥…üi°ú åÙÆ£Ÿþ„¦Ë'Còöç6y ¬Ô¸4 »¿%yû讥¼BÀ(é 5â­Z!ÿ¨ì—=ß#äË`Oc}Œ=¾Ï®æÀ†&¯È>ˆGMos‚xQj\ ƒöºwÆ€ÂRâRÔI/Ô·j¥üËß–Ý&Yî¾ v‡úÃnA¹b>± ~[¢¢á³lbåo5‰‰Nµu±ØC-êáJTð‘eµð¦Bç­rÑ‚²Õç9ÂfÃÌÛÝ2ì-Úb,taG‰éWÜ@vàÒz¥ÉMdeãjZ'·Ù7Ë„«Y7ýÔEîª[m±Wf+|6¶Zì!½¥øØZw»É>â]BQŸYâVÒ¿û×%¹DQ6®NK“ÛžÇRv \ͺáŸJ{ÓͶ”ÃÇ·uö‹,¦Çî­}òZíÞû3„P_WO…?>É%вu5-¥Ln‹>UÙ-û\uÓŸJKy§›m± ó†'Òšù¶ZN x†ì¦•½ª— E}{óNN¿}ü.Q”­«iÙúäZà·”è•JÎ>ý©4¸«nµ¥ûà¶m¡Åô´@Ï}ìŠ â쥂Á½ØHΞrõ¹xr…¢l]MËvLnóOa–è•Jz™þTºït³-ÕÞ¯¶ £oZ" v4*´ºº#{‰ƒR=³§Ü=·…Ktè»°X¢-göÄRv W*‰ºéO¥Á]u³-móF‡­£-²@O‹ :´õM(êk{ö”û«wOr‰¢l\AÅmþȲájÖM* îª[m9}¸µ…–ˆæ‹EÔeL­Wö’êë>d¥øp–\¢¥-iÙêäR땽 ²Y7ý©t«ït³-‡}`ñy²—òmµœ1zÕfÅÐjꎖ½Ä·Ù,ê)÷Ûà¿p‰¢l\×#n‹/†Ê„«Y7ý©4¸«nµ¥càðIþÛj1=[¬=4Œ¹>ž[öÇM³¨§Ü_ü¥W(ÊÆÕiÙöÉmÞÀ,;ÚºáŸJ{ÓͶœé„í@[d9}:XÌqðÂ2R-BPweOmÎ…KeëjZ¶2¹±—eÂÕ¬›þTÜU7Ûâ dãÖY Ç§ˆ[jµ°N½Äú,ªTOm®…K4Û2-Û6¹Ðª²g[T7ý©tÛÞéV[.åÃÖØZ¨çòõ-×êÓÆ««—8«,#°§Â?žcá9­œ–Ð3Ôu)»ib™uÓŸJƒ»êö¶ª3àVìÄ0K±H„_4·©µANicžúñ%g†1×3¬ÙUÌ—s†sÃúÊÇwÛ1¿”ñí3¬¯M|? kÄŽqË1G=a1ÖÛï“c>Áцõ$æ<О/¾c=ào—(þQBSûTnÛššÁnCÓfÏÒ¡Ð` MéE4J^‚m[BÓjß` Ä+ ©Ô34•—jÀ[µ®¡iµgÍŠ»¬›&V‹êÉ ’`†¦òFð)^‚­,¡©¯nÚ}'Ïâ3K˜¡©¼TÞªõšÚŸóZCS{·ìÁÑIû>ðuXBSz‚˜(Ê]CÓ‹Þ¢žþeUÁ–Д^ o•{MdžÅÕÅkU  ]#ÃG 54•¡§¸D[N8ié±^$®¡m– ´†¦òC—¸«î{hÚcª±†¦öäÙ ¦ð°Ç£®Ï‰ ÃKùzŠK4'6²Tç’[=šÉ²­¡)ýÒîM÷=4µW~·ÐÔÆ Ÿ:1<4d1¥g 54•¡§¸@({ M} =’k_›1ËZCSù©”ÜU÷=4½šo.¬¡éuøüOááO¬>,W>Ð /åGè).Q”½†¦fÙëäÚ^Ê´†¦ò§Ò஺E÷[hŠ D…‡†|AƒE 54¥Ÿ¡'¹B[¶\¡éˆ …¦Ýõä·Ï–34¥ŸÁ(¸7ÝïBÓëY¯{hÚcò¬ð0v*òƒèšÒÏГ\¢(ûšÚ£NîßÊ>5:fÝôgÈ|Öwºÿ&4mõ}hê  ÏØ{ÑdäœÃKú34 n¢ ÑÒ|ZBÓ­¯¡é¦²34 ?u‘»ê~šÆSøv·Œ>ÃÃ#zvN¤´ ¦ð’~†žä&ÚÕZjL_ÅÝ}¾’eº…¦ôS¹«îw¡iõïé-4eÅðÇœn ¹š¦ÛŒ’KTõñNËî3îäî>ïȲÝBSú©‹ÜU÷»Ð´øÃz Mw· kŒ²šÀº…¦ô3ôW(ʾ…¦[Œ²ânþègÙn¡)üÒîM÷»Ð´øûõv·ø×OááîïXN¾÷|›^ÒÏГÜDz›eÙbÑ—\“|βÖÐT~ê"wÕ}Míz-I+èÛâûªð°D J.I+¼¤Ÿ¡'¹@({ MÍRFrí³l 54•?•–ñN÷=4µëÇv M˜ôex¸ùF{=n¡)ý=Å%в×ÐÔ,>Ç!÷¸âKβÖÐTþTÜU7ÛbÓ‹,ܶó}‘“^CƒÏA-ì¸S¢>›zÅݤÿô`7¹D={Q–+–yʼno–}f/ªnú©‹ÜU·Ú2|ÓȯÐr¡,=–ül"ºuôl wjär¡M‰ùL‡÷ rr‰®üM‹âž±¨²Ïü©nø§Ò­¾ÓͶŒÃw(ܶó»/K„yÅ¢…½ò9‘LJê»ôL‡¿Ç,]\¢(WÓ‚e^qeUv \ͺé§.rWÝh˾Ùû…»Q0Ž-–Ž5µ§Ù-´¨aëB¯qu¹·ü±âšÜD\(MËá§—’‹ §ÊnŠ'²nú©‹ÜU·ÚrEµGÄÉo«öÖCäÝ`‹âNúú¹%î&ü%Nˆ+tèë—–—¸x-Tv ”ͺé§.rWÝlK± G\1ðÝOË@1êu>äXÔP›Ôz¦ÃF´'.QKuÓ⃸öí^Ê„«Y7ý©4¸«n¶eß|JýÈgL–#nŠ¡kÇvT|­†(ê³8‚=þ=féâ5ͪÓR}¾–ÜêßÙ,»ê;œuÓO]䮺Ֆ83=רZŽ. u¼‘ÝÑ…;õõ˜{Ëß#Ú—(ÊÖÕ÷Þ'bââ“©²½RI?¦ŸºÈ]u³-5&nc¼Ÿ–ˆÙùm8"žßkÅÊx·8¢ÓD÷ˆK”ñ~Z"fOnÄóYvÆûY7ýÔEîª[mé¾Cá¶ZÙZb›t¯Ã×Í@ì%Îw‹#ØSîo±D(®PÓl1-5HâB²Ê„¶°nú© Ü›n¶¥5ÿ0Ä…ïKZb¿·Ã„к—Ôê©ð_1K—¨éû’œ87fñYö®ïKÖM?u‘»êf[ŽX0æèðv·DÑÅ—]ÝŠØKÕ™¥·é¯퉛h§:Y*>ÚäÚŸ¥ì@¸šuÓO]䮺ՖӃ6·•Á¶¤e`b×ð ˜Ä²—ô6]=u`Zv,ÜDz›ea“ºz¢/eÂÕ¬›~ê"wÕͶx…±GjK,™`pw­Üm9…¢>?I±M,&%7Ô¤%÷<ÔKÙ»ŽÔdÝôS¹«nµeøMØøŒM‹X ]-¿צ^ÒÆâöTøqš܉4‡‘¥Æ¹{,¨ì]Û·Y7ý©4¸«n¶¥—X­öï¿•Óâ_¿Žó¼>Ž]M(êë|éoˆöÈMăiÙãàŸ¸±®žeçº{ÖM?u‘»êV["A úqc[h‰Ó¾{ïqzÏIŽ@ýB}w~‹8öÉвãjYJt¸%Â*•]´•uÓO]䮺ٖQcÿÃl“§Å™Ñ<øQÝÑ;UsLî&ý'¢=riL–¥D‡ˆ»E#Tö–c²ê¦ŸºÈ]u«-#^¬#·ղûÛì»·•óˆÇHË.äõ¹¥_Ó¿c–N.Q”«iÙ|’›Ü¨"Ë„«Y7þHWpïºÑ–º1|Eë–‹e¸ž8Qâê¯ïÂÚµVâ–1¦¿#Ú#7Ñ®¶ÐC–¸mø§BeájÔ-?u‘»êf[üds+8Ž¥¥øXäèĸhãT-¢¾Òp7éoˆöÈ%Ú4Ž-–­$×´¶Y6Ð+•xÝò§Ò­¼Ó­¶ÄMôãζÐR|vêè: ôRîYÔ}COÁo¨O®PîYÈÒâó/n‹Ï¿Ên¹g¡ºå‡.roºÙ–½Åju‹põm±ØU:òáÕÇ»ÓûáKGDPw¢§è?1K'eëjZ,·Åƒ§²^©Äë–?•wÕͶø®>žÉßYøFÖXäÔÛZ™â(êóƒÛôWD{ä¡l\MK¬Ð‰khŸeájÔ-?•’»êV[âte<“ÛËÇOj³˜œ–:Š^Útà§ZqÖéˆöÈBÙ¸š–È×Ð6ËÂÕ¨[~*%wÕͶ´=ö@¼ç8ŽM‹?¥­z€àêü)µ¨½¤qÌ,ì©ð퉛Hã˜,=Æ"r-¨é³l \ºå§.rWÝjK¤¸­¨-ié®'#¡•‡Nõù‡lL¤1ˆ;W9ÓÙ}â¶X{TÙ-W9U7ýÒîM7ÛâÓsŒ‹âÊÅb3íê“yÓ=äºÖY6Ð+•œ}ú©‹ÜU·ÚrÆjõÚZ¨çÄŽ µ^ÙKª¯gOmÆÂ%ZÚB õôì‰YöÚÔ-?u‘»êf[ö=ö@–¶È=†FM­{]z)êÛÛÒSm<ŠäͶÈ=äR+Ë^Úºå§.rWÝjKåÙµ-´PÏÀ9MIÂ}»µÅó ³§üXs™\¡ÙY ‡\iEÙk[P·üÔŶ¬ºÙ–9ƒk[d>|¶zàœµK/A]d0¦ÿR´\¢¥-´°-àR+Ë^Úºå§.rWÝjË©™k¶åÔìVzêªu\÷¶tì¡Ð?bE\¢¥-´P¸Òв׶ nùOmñè>ìk[¾OzŽ“+½Ç³3½ggzÎ Ïôœ¹é 8·:Ópös¦7àüä’Þgoé ­®é qnIoˆódKzCœÉZÒ"ìžé 84Óp¾Æ°N´ÄLÖ°N…\L§ÐÉŠ8+ññ%O'ÄyÇCç,ªß®Ü%çÏfäNsì;ænmì¿ÖŽ'ï_îÆ> aí¼5֯ݫØrÌ ØÓ1¬]”†ô“܉hÔ«ÕüŠt\¯HnÉUåX'6¬•Ùõåêf¬W:¾´¦ý“+xÊÏU0öw®öÄúa­˜Äˆc®:ÄèeX‘û`ùŠ~#žuÌ2bBÊÂ"®rÌHfàyÈh æ÷_rFÝñü䬴ãùÊ™]bÎŽˆs†!¬¯t¼{Žù¥Ö×"1G\aZ‰ùæñ¿´ñ›Žã‡eêúKþ¶mú¥gþ¦@hÂ/>Ћ߂ JKiˆwR¼ÓWUê©EBÕ /Õ€·j]Óq|lãÆÊ4Œ“©1~rÛF" ·^Òjä„ñpKE†H¯úû«R«öST'¼TÞªuMlj„±¤ãx¾‚½ôÈ‹ñÞÚ‹ÏAT„#’00݆ÄD‡nêb±ADÔ?`Á‚›Ö]U-¼©Ðy«Ü[:Žz_Óq<ÛÄÛ!%¦Øhå ø¨AX¤Ô¤?Òm’KTò0÷´”6¹ñdÙp5ë¦?•wÕ}KÇñë•Â"KAJ¬Ã9Š•‚ûTf KÁ­¤?Òm’K´ÍX¶4p·Ž” „«Q7ýÔEîM÷-'®¸ýR„_å‡Ç‘ãhä¯9¡¾®»9ò—"’ „²uuX:„€khþ ®FÝòS)¹«î[:ŽÛôk$Óâ¿(‚”˜è碔¢¨)5éÓÉM¤_#‘%bqqýÄà,èõ%ÓqÒO]䮺oé8Ñö[:Nôl¦ãDû3e†(êCJüH·w¢ý–ŽãêÚ5¹§MYö©¡+릟ºÀ½é¾¥ãøõgYÓqœSO¥Ä8 u‡îA2¥&ý8ÿ+.Ñ©Ci‰3ÉSYv ×—Ǭ›~ê"wÕ}KÇñaaìk:Ž"ç©”˜(ïRÊ QÔ‡”šôGºMr‰jžO;w>UÙ{ö¹ê¦?•–þN÷-ÇÇüóöKe‹9Sb¼¼-ÍõEJMú#Ý&¹D[¦}À2bÞOªš%àÒ¨XÞÐ$Þ*ù–‰3º6e>ñe.ŒÓ‡Re¢&dÒÈI6âLuÕ¨MÃo y²Xê•C6ë¤jÈ[´Þ’oF,Ù¿Ý Þ`¤¿Œ˜43¶ˆŠ<#oäÕ— Ü²n,zj™tc¡DŸ¥€|Ô /Õ€·j½åÛ˜ÿ¼ýĸðó q<Ðnù[ Ðù2òF*x§‚qbÒ'ÞŸm–z(WôB y‹Ö[ŠÍ˜?.DCÌö˜ä2ðÓAˆ\Çüe!¤ÈÈÙ3âÌŸJÃÖ“‡ b©ó7…X'½’·õ»Ö[V Îß,I5#d¡G7Ço,tÞ–mæÈàÆñׯäÔ¼û4ìñ “ëé*uÏ»Ï:é…ò­·DšG)–<šQBRY|q~S¦ @T„Dy#@<€™;CÈ—¼ë ,µÏÄ!Ô)o¨oÑzËéW¦gÑ€qÙ+!–1¢"ä¾Èi1â\™Ò“ÈÉÃ8ÈRÏÌÊbð¦¼ÒïZoé2}fÉÒ€DW$¬täÀbÕ¥ÏY¤»È[¨âÌüXN$Õ€‡ìW–:“cY'½PCÞ¢õ–!Ó/=<2Äp•޳TX$êy¢….òFò‹x—pÌŠ<œ«b©‡ÕI/Ô·h½%Åô+Ïú¥!Q"-¥wå° +tÐI-ô"ß…¼:åGÃõÈÃqQ–zä?ÖI/Ô·h½åÁôø…¸·›Á—ç‰âO%ª@ÓÉîo¤¸ˆ'°Ït¬)øñ>òâ—ZTjþ ꤷrÕ x‹Ö[êË"? .É'ˆÃE>RWäÃÐâ H> g¬9’,uÊgôB y‹Ö[¶K¿´š4 !#òMzüp8PQÞ7Eñ¸š$e€wÄz讥–®RQ'½PCÞ¢õ–à²ÈOƒï÷!Å„±»ÈG‚м‘»"ž€äÓäA KòY'½PCÞ¢õ–Ӳʗ!dDV‰ŽÙQrRèEº y $ŸÈ ǼÙ:é…Ê_´ÞÒXùi‘H"±Ú½Ê?gw0CE<”åŸó†«Ô)ŸuÒ 5ä-Zo™+‹ü4 %¯ùx`q~‘4 y# C<ɧ2È;”A”7—¢Nz¡†¼Eë-Ye•/Ã`>g>ØKXå÷ÙÌCO åÃ@}Þp•ºÈGôBÍ©\¿Þïò‘ç±ÈOÃhÊ¡@l},ò‘_"o¤žˆ' ù4@yÈR§|ÖI/Ô·h½¥¤¬òeMI!ˆšE>RJälòH> A²ÔEþà/Z…|¨¡üE«²P §‚’Ÿʸòá±Àâ¸=ë¤j²Ùe}x¾Ç¦'íµéÉEpmzrE97=¹*››ž\ÙÌMO®æ¦'WØrÓ“«T¹éÉ•žÜôäjInzrÙ!7=Æçž'ÂâÜòD˜™;žC¿'Lj©Ò˸&ŠÜîÄ4=w;;7c5ã¼p±fp·9#ŠyBîtN¨M•}›ûœâ‹"ÈZ#^BŒ ‚|#ù„'ÄCøÅ˯^þGFC¦ endstream endobj 603 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 606 0 obj << /Length 838 /Filter /FlateDecode >> stream xÚíWMOÜ0½ï¯°è%‘c;þˆ+õ‚ m©T º=‡lÖY"m6dµ þùŽã„fs@¤m€J=¬×3?Ï8ólÁ!ˆôÚrµ'ºöü㌠@ðÿä·3 3¢(’XÒ ø§»¸"h c§Ö\Gh×Xæˆ3•´Fßfgûeˆ #¥à (dÅZŒñž¬¥Fý¶±*GYö"Q˜PЏ˜EÚFbõœEX«ÈŽJEQiPj}áÉÓ£›Â’JjEB+"g8ÐÝÑ|vxÂ4Òà6“hž"MP 4_¢ /Ký«ùé$.ú%d4¾ •Eؤ™t–C¥Ã/Íí6+Í×87ÕMœ˜W Õ D®9´Ý7ÚS9샣¬XÄ•9˜2€·ãÁC»ÝR6[}g9P6à`ƒoaêõý”1¼ .# "–¹¢£óPéÀççß'Î jv ¥ì‘’…‡Òà +ÓÉH38 ‚ná€R¬…t˯ãûb[ÿËC²È6ËWÀˆ\¤¯ë$á9{. nz{'òÖoÀ@Ùð#$=~–ímùÆo:8ª³Êu“"¿)6fSWÏEÙK/y|3u²—¦šü©¶‹ÊÔçÅîÿòHþ¿lîçÙ]½-M—ý&M³${Áü·.> /ExtGState << >>/ColorSpace << /sRGB 611 0 R >>>> /Length 5522 /Filter /FlateDecode >> stream xœ­]K¯9Þß_q–° i¿í%á%Á ¡BFšÑdÈ øùTùÕUnWŸãÃ]ä&)_¹Úm—Ë®«n¿º©Û×·¾ü¶þùñçßýòÍí§¿Ù·}ßoôçïúwûÏËŸÿrÛoQ·_ÁŸ¯_no3ç¦tØR¼}ʬ›v[Ô·on·¢±þÿÓͦͦSéÀ5û¦,%Á§›Ö[L¬œI éÍ9Z^ŸnFo»=tãØþ*û¦#P•­§6íiq@qÚŒ;s¶2f‹†–W ´0 M¿Õ[ˆ´¸Z㟊ë¾kZœMŠ™5͸(CË‹ŠÝæÝ¹x|¶ñ/ (’¬ÀF *[ÁoAÑâ"h柊9[ízSŽ–W <ò€J ™ÍZ^­þSñ¨Æ”· P$MÐé dü¶G(D|ó× õ¾™@U’iP½ Ï~g€"éOq ¬Ýœg€"é(€ZÕŒTÁnÚQ@•䦞ÆÇôùP@‘ l»ã?«Â«Í(’þgÀ !Â_Š$7ØÀTÒðr»‘TÒm8 :c€"é(€¶Lo(¶è H2 ù`ÐU(ÅE’0¤À¡³W/7í P$ù)Pá0hp¶û]&É •P½ ¥7« HúÄxŒF‚OŽ%]P«º‘ÐŒe€"é΀Aƒ7›Q P$]зÓ_V„y40@‘t g×`ö„/€ª$#PIèމ„Jº 'ÀX>2@‘d jç*éƒ}g€"i6Lƒ£6å Hº`ÑKfÀte Hº†3`ÐÆ P$%¤Ø9€J:À»mO P$݆3€k°ðj¼¦€* v³–˜¤LÚWL%Å» `¬BÃDµ3@‘ä—¨Î^EÔ8¤) Hz;œ£‘à4dI×@Ôªn¤ÊSIÏ€An–WQ$mr‡¤ îM–ФÛpŒUÀPU%]üö´úðV F4°2€å„‚Ÿ?|û=×+=déÊ£Oø×Ç—Û—/*/˜T]VHU†6x–f¤´§\“¢½Aï;ð”´cGØ->“ÒÔ¼ È}()ì~§M^ƒ˜‹&ÏÝ;)¿\ùËõóAØIùdF/7Ìá|—´“惰ojçæÐn¨I„ç$Âóöy#EqæäT~&Í›<ŠƒpròÖIâ ,$“Iƒ/Oâ ¬ýŸLEÞ’8'G|$ÂÉ9M'‰ƒpr!¨’ì.Â<ßk‹¶mÑw’8'7a:I„:Ä| yMÂL8?~ì$iÎÎî:I„³cÄFfÂù±H'IƒpvHØIÒ œÞv’4Cnì=×7¾'q&„å6’ò ¸‡µâLò¼ÎOz:I„³óÞFgBŸç@$ ÂÙAT'IƒpvI¬“¤A8»a×HâL8;Ëí¤ù |:Ü5º¬×…îîÓãˆK²9ÈÛü4ã’î ݮӡûe:®;=®Ó]§+ºNX]$ÎOЬÅl£CŠu¼ÁEâíÃwŸþñÝ·¿ýþóXåøçÿúˆÏá$†KUW¾qÆAÝþŸïÉrÑ1ù¼ @-–¼ŸP-\t@𣡢¢*BÏèyELt@ðÓÂ(h±ù9ÓÂDËB3@²Úã$ Lt@¨-£gÐm3-Lt@ÐÁ+)"4×CðÌ!LD Ä–Q ~„”¸&"ß?_ã"4×CðÆ!LD Ä–Q‹÷¸!À+¢"9´ð.˜MY—b¢o>¥¹–€»–iá¢ârçcÅP„ÖQ±Š¸è€Ðvµ¤rLµ0ÑÑÇÇ\„w¶„‰„Ø2jI¡Üú§QZxSÁ°7ùÓ7Út\t@¬>½€‰»ÇOw©.: 6âA"«¨(†ŠÀãù>©ˆ‹dï°ž´8 …¸&: 9;T´—QýðÔ”UÄD„Ž€Q‹Ê‡ÑL 6ލyø4nä2s™ˆ@öþQÈI‹2-LD ði¨h/Ÿxè[ÎóŠ˜è€Ð'µ@Aq-Lt@¨f¾ÆŒ1s™è€ ×R‚ãèȨ&"u ¦ 6°Š˜ˆ@è›´¸ˆG!L ÑÂÌH0°šäæ2ÑÑéè £–”˜&: ðÂ["®¸t)åyELD ä‰F-!â§ŒL ÑÂÌÃ×ñè™ËD"k »)1ì¡…‹Ä£2É"lºˆï“B¸ˆ@ˆ÷´Xé‡0TDErhá® .6I]3˜åÚ€£–ñLvl‡.: ˜9^QQ AßÂÈ•TÄE¢úg|'-0}*ϵ0XüѨ¼«Š\ œ·w)"„àÆß¡"!¶ŒZ`­×ÂD0òá,BH‰¢„Š„Ø2jq¸¹Íµ0-ìµ–Üm÷¢µ.è…-±ËI „8Ép-Lt@À6µóŠŠb¬Háì¬"&"òD£– 6s©ˆ@ˆfš ã_ss™ˆ@.´@œç×ÂDâ{Š.BˆÚl TD Ä–AKÚnˆS-\D ‡–éôó;N£º.î¨z´’#£«ýðÊÊ—÷í²2³ã!®L¯h8Ì™á®lœ­T–lãüFC¥Ý³ñôhxÏû²gg%•u¯ÇK!•¶l£S˜hõ]Öò».4ÙFÜjôë=¯°–­)4Ùšù ‡7ö.ZL¨¬°®zÞìT´Ò–ß*žà_´£0¦ ëÊÆÙéY¥-Û˜ržÑÆZ~iͬ3Úå[Übð{®æ¢çMóXÖjÏ«´eqñr¬N3+Ö}ŸÇ¯UÚ•Ód%:Ÿ¡.ŽŽÊzÀçñD…veãì,?o8.àÊz yóÚ廞%б7"ï`ž<¢°°‘¹´J»ß‡D;¸Ay·O6Ö}ùmµJ[îÞ`x¶ú® K¶±.{Þ4±ŒÁE×ý<äɬåÑQhW6ή]øKÈõ+¬lä™I íÒÆIŒä“ÁÝU kÙÆB[mǺ»hce=`#»|\i«spPêîÏzìBbe]ŽàÉôUiDúìârÐO¯lœUVX×^æ|´Ò°‘7Ù¾¼²qr¹®²V½u¥=`#ëÆu»wµ ëvd·c+í~lÍZuëuÕÆÂz`FaW™+í¾|" Þâuˆ»6ò»«•µºò¬´Ö(,è¨[µW6NnˆVÖ¾‡}$Pi´#»ßbþ´ó®ïha-™B»¶qÒ“Ãk«ïº°VW•¶º*¨ÛÏ÷Û‘ÝD¯¬Õy¦Òx×l¨Eåòדw#Eæ±*ëþ<ÃÃÒJ{`̰¯5¢vùË´µùº².×õ“@°Ò°‘}»:µ·ØŽ…uÙŽ“kÜ•¶º?R··÷*kÙÆB[¯áÍç/C×V.•ueãìšu¥­Æfu;üîZO•uiãäþx¥­Æ1x¼Š±ÚŽ…µlc¡­îÇèñÀø¾lR«¬K'Ì•¶ÜޏÅÿH;r ëÒ÷L¾J¨4ÙÆÅÜ5ùrò<þôý¾´Ã@ZßBj 5~òö‹÷jz™|ÎÇ<ò¿øâ}Ø“~ÿæG>~óÍãŠ0 1Ó]N÷2<ÇôVûœÜX}xœ±•›Aï*ºåvˆùãt®IÕ²¦dñ8~ÐnȬjòMœlòV¹÷ï5Áœ¯Oí¤Ì¾Ü_<ÎÌ'›rÊ£U›ðnûhS‚æ²"œäίí¬j‚©(žLòë£Êã|1ši°Ë&WW§Þ´OËšÐ÷žš "®õ~ ÒžšIE¿jRØó·KƒIÖB·\Õ¤<^5âšœM«ðˆX, Oh2/zrÏ6ýØhN·ùC?NwÓ]Ào&8ýq·|¾÷0¸õëC¾™1ð§ãw¯§êŸ•ðúS:µýôC±)?î9ç?ï¿ÓË%ªˆ·Ü‡bÌòìuÄ{KC÷NqÙ1áE7Z¤  ËšðwŒ&éÝ*»¬ / Ž6©V-kò ïwÎÂÂeM¨ãÔNÑ„õvŠ ïV}I-‡1%¼”Þ>|÷ñË/¿úð•˜~ìå0CÎs endstream endobj 613 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 616 0 obj << /Length 1827 /Filter /FlateDecode >> stream xÚí]s›FðÝ¿‚™ôÍØg4íÄÍt&i›ªÉC’‡3:$*œ§¿¾{ÀX‘œbKÆ3æt,{»{·Ÿ·r=ßrZÿËyç§þÿò—Ç‚<·ÿE4²Úÿdr'È¿O0PáXØ ä`lQ#7 VœÈy„( Bù–Ø*¹•œü±%ÛswŸ?MOÎ/HdE@8¡Ö4±"Ç pˆüXÓ™õÆÎ>#¶œe*ÙäÝô×ÈP"q}Wþ¨ìÍœõæÌ'¾ýølgü˜bù3ÈüPöæ¾àOÖy,Ò"ßy•m!AZoßÙ¿+i¥4°ôXCö&5þ«1‰?‘rµ糃f`ÅJ–!ü?àŒ¬JF`ZhË´JQàEÚ²$»›°ÈR©=ÉZXÛ“Þ$@ž_¸NkÝ3B<9žu†1Š|_/ÿ`¢Ä1+ô³*2.i>×??½3/+E3¿*Ò\ŒF8ˆfˆF„ШKEàÛK–\¬Ë\׫ ¹ÿ™87¸îú“j;®©'CâÈÖ\Ú¬ú<²NOIÎ  =·Ëê|çÕGTLàô¶• ƒjy ZÄGžcÈ}½à%¨in¾ —ÍgÀ%ôgp²æ\ô>ë,æúàÞkû‘V“30m63¦¦}T ‚qI ˜1Q¦Wªƒb¾°{´‘àÐC!%@8ÌÉ)ù…Ò…MôBI£¨M°G±Írý,.A‰¨ýžÇBOˆ3£4¦Â|”E¦Gñ’UÕ¿4@^è×+½x~1À.ö\à qºH‡vEó§7ŒÎñ›%5ešxó\WÒhx”Ø¢Ð3 –Ï–\%jÁKØ3¾T„Hs䪳ÔQ©‹j#c>D¯ç¢Ð kb^ 1­ß0t I1R9€y6€ÄGĭߟêã×ÚÅôã„„6×óu¸©À<›‹$Ž)µÕ#¨Ò¶l>yØ‹@CsôŒ8L$"‘‡.üdv˯ÇÈeö”†R~%J¦©Th¹à¥Ñ­j{,Åé[{±ž”»)Å h„ê‘ÞÁ Dµn‡z±é¢'"“[WB¿«ŽÂi ”x}£$zUfÀ¿(‰B¬”DŽnRB]Ø>º›’è E$èžÈ‹ H¾(k²lµ¬Þ½æ¶O§×Ó[‚ƒ%^?½%p¤0<¿¯üÖ #äyø˜ßóÛc~Ûe fKŽ °k#2òãîšÙŠñ†T.¿6LýIßGjëSDÂûHm!ö¼cj»Ã’‰ôÙrpkŸý`¤Ÿq‘­Ö‚é—i§+¶üò®Èy.ª1Ï Ùõ*f{ç·­Ô•®RJqïÜáö\Øbl⯤=Ý­@\u°îdúò¯§wáQîÂ] ×úˆ±G¯ëJìä€]VŲ1QÙr É·I4IK™ÆÉáï?W=KÛ@#bsžóê®mî‹B€¡ï‘¬âœô¦óQuRYþAÒªö‘EY×>SU\êtTŽ!/ö••ƒ{²ÕFâáÀMw~ɪ´ÚÛÚîÖÜô6j¿¹Ú³3ÆglQÝ"ÈQuùVýiT?ŒIgY¥×oN÷*i’ÃÃ1åpÝȽ»c×9àV®»Lµ]µÃ07ÂdcòŠ£çÓ+±.yøó$Iã”ßE.F‡™a“¦Ðd‡¦(`|žï¼_×î¾f,].a®d¢/’o4˜‚ss­ ΣâÍþSÊüh•·³Êâó©£KÑUÖ£/ô%·ÑÏÚ•žœHÿ·×j¿1Ü®U†ìØrì éô†LÕ­éDödéÀ@T¨@dÞ7ÁòþÛŸô Y¸.ÔôLOÈâµLÃ[_É[ëXÞ#˜ø»ÌÍd"‹Or¾(?œÂœGí"7ë¬n¸!0rܦŒß¿ì±G½¨é9†©Œiú fò lo@OùÀ‚g®â¢î–æY2t3!7Ý Sf.ÊËù:ã¹dT ¬@Uï©9’òœ}µFö†xžýŒë{«±­VËÏ7ut;ä̓žéôàtDîxª¡Æ¬üêk`¬gE¦ pmYK’çlo/ÞQН]¼SD\ÿ;»w@!ŽÌß»@xûG­p›‹ðíÝË#ã[]JîiuèB"#¥^`ôê€óO»úœƒÇilZ·ÆŒídßžÒ@ó\Ý*Ð/ÔÚ?W‚±¿ÖaQ:Þá9ºmOå £ÃpíÒN07æY}uzÐfÜhX;Ú>v:mUhqöîbzÖî$~`ÊkÝÂÖ•eÕúkîyÁI$©x¢:xûÕ{ÀAqêÆóbÆ—o„ôƒËÁB•˜=Ùøy™¬ñ×´éàñZ¾†V÷„ç².eàÝÈ+ÕÇTãn¢‰;Ëó‰C‘=d³ÈÍ>‘pÇÃ>å_w±ö€ endstream endobj 621 0 obj << /Length 1679 /Filter /FlateDecode >> stream xÚíËrÛ6ðî¯àL.Ԍċð49tÚdš:é$u{IÒD‚6QrI*iþ¾‹%RVTÉ)“fê‹,»‹Å> aDpï·¾LýïË''8‚<_”PQÿ×anÂüó„€8"Q*&$X!š’(«N,œ%)R2QHˆ$ªMTœ¼8J”C·÷íåÉÙãDE –&"º,"…#Iìfyô*~ð`2%˜ãž<áñw¦Õå¼9Ÿ¼¹| ²N AŠó.—<Öó«e]¶×ÕyX¼¨Šß‰–T¦ ËÔŒì]Ý“w k½È—Õ]l¡¿|þäÜËF0ÃôâÔOWÝ!FSFS‚Syá¯æÒd êBЙ.„”” B¥È™á&IÞì5/›V/2ã‰U¦­Ë¬ý5&ܬ²y™½°“½”jÓ”ùJ[ÍúåL%ˆ1%÷®ºÑµ®¦n‚ šLÏ *tÖ.ë‡ï]|YVåâêücÊ¥¤X5¦5šÖTž™ë›Æä#ŸÀÁcXÙ1î.F±èÎÅÏ3Ö3k’ ”vBRDPòØ-þÒ€`»)µ}°8[5-mNؾ©ŒnVµ±Òƒßà!’‚+ÏàòV0ÐBn ½š·vÂzĘ3OÌMÊÆ?gk“Ôë-þMÛ‘\Õ(šLÁsã ^£¯±ÏˆÅ3ÝxÜrØqz±µ=Í´'¹ÉÁ©’”'Ù’µ¯–‹€“Yùì`f±b•±ÛÙ Œel²¼‚Y!,ZÐu}µªÌbkÚ ç~|J¤@ŒKÖ ¹œýa²¶|·ëHDWÉ:Ì ¬)7›ÒJïàÃD•èg×àhøÙ6S*9R‰j¯PàÌŠÒ8[ÖàÞ7NËE¾†·KûdÎì`:[•óvjõ`gKбßÞÄkЋÕ ËÅi@«4‚éîÐäšd£·ŽÊ.µqDísciQvÈ!wûùÁKëjDERMÝzðZžF t‘`ïîk×ðK!Ì7èç!8|Éýýåí4MÀÁìl+M3Œdð1Óô8˜„Lj§à"H¤Âcn»"âa‘À F$»P„ˆÂ}DqÏWóùLgo§¦œÍ­ßYhþZ_NŽ=i(!ì”Sû«‚ÌÛ@g“ëß mPŽÍùPL ÿÒ寧Gs°ê†äÈ­‰ðÎn¶ŽƒÓ"s ¡^ª> uú8~Cì„;{Ì-àfCýÚe̽=ñdb‚Ç=–‘Ï`Oÿ;@TS¦lTJ=ÞÔ9á?^tµöˆîMF£„$Ôj$ÝÞö¿ùÉaÄ…fsÝt=Âóg‹²}ôÑÞ ×í=[æf¾¿×ÛÃ5mþhïòÂèJÉN6Ž÷özbÊæ šÂ·Ÿîï$uu3_ÓNð![þ´‚BZHÅ?¥Áå‡6¸·û[‚mÆ8%]›Ìfšæ9K3‚µÎ3›Í˜2Z+a #¶ú[qd»q¶Ã[ÂAiÊ?ocËïÞØŠÛ-¡»G ‡Ök[ÅZ&ä?k]ÛëK´Û_¬Ýk÷ÅÚ¡¢3rŒCÈÿ¶|ÄN%u¡*ÔoC˜'Ýÿ,1¦Ãxqek¦¯º h5tçíW½(‰>G ™Kô?²a…²þv6^ÞÚʘS’¦(†h8ïdè‡æì. ¬ªÑ}Õ1²£»Ùe÷½wß+îtD½ÄÐ\µ¾„S-.ÌX;¼K;ºK'¿™iÙˆêèìƒL6£/¢#¼·5:ç½sÔ8ô¶¢C*]sýWTvöušÐöyp$és5žåº°ííG?l_}¶¬‘RP5¿•4î?nÝõã–8êãÿ²·F½~ÜŸ)ø! bm²êäÕåê’f½wXUD„BDÙÊyôóÉ‹píÄ#Ž””þÚI"FU‚Öªµx,’€‡‰Å“(ÅàT J¡shÏ—­½>2n¯ukG".jwǰwŠcS7¶ñpŒR{½*±¿E·Øëki·M àî^}ýºk[µ¾¶UqàÛu6aíµ¶ï> stream xÚíZëÛ6ÿ¾…€~8-°fH‘zm’)’ô¦‡¦{½ip %zW[rE9›½ûço†Cú¡ØÎî|I~Ø59‘3œ™ßðÅ™TiÄ·þ÷×;UúÿúÛ3AC¿÷ÿ‚•Ymÿwœcâƒ8? DTäŒ e‰`RfQµ8CºJ VæE$xÎržG½‰fg??H”ûª÷ÍÕÙ£—I•ði’EW³¨äQ.° µ:zõÕùD¤yëùu×7ÃÍâ<åq»˜ýCè\Š’×õ”Ÿ¿½ú„ŸÁÊ4}l©Ãw½nënq”ýõOßwš¤±àŠË/¨’¤i(2Æ.ŠžñBüH„7\©¼J´ÑµPu‘çÓ\–²ÊgZUº,³êíÎØc=ëÆº­ u¶0CßTAô'³U[ M×~}TüÞØ¦^é¹ ßL ™¥G?Zê^Ãh¦·^u[é¹a3] ]ÿTŸß«fÑ´×—‡x¤!VÖô^{g³ aÌ\/­©ÍI’gœ+?–ùVYá—'qέ^*µå¡ ¤LY!R2U|n~ãBµ0 s!Ág¡!ö~k‰6ëz*,š 6Ul›ë–ˆµ4*QÁwÇ“EIc>›CǪ(ãáÆ`¡ØD‡¥†f±œ›…iÏ“"pGl‰¿rc¨dk ‘—¬P0”â§W/÷È‘”ŒË5ÏRWØÿ»óÂóÚKâˆ9³@,cmíja‚ÌzØÈá[®<ÍM­ó‰I Väj×5Ú®m͵š÷(aðI)âï:¬Ý:Ò{”Âô¥2MbÛáðR•Q7ø e‰b>@Èa±p3„$'æÍ!¡‡Uoˆƒ¤Ç&7L׿ó5˜|*õàÑdY¨T]k‡^7d{±/BnoŒëç~\ž…A͸ˆÔµž­›¾[hÀ‹D¤ÐµÔðÄ7¨Ü6h’3¥Öýû› n‘ðÞ{Amäšå»=€ß”"0€,‚DÔ½—[ÏçÁv`µšˆCG\7›ÈÒDÙ¶=Q¼«÷ n“% rÃîTã,˜kð–¬Ì!),š úùD‰Â5=;A¼Á ô«çŒ &B,\"z yœpBÇ5`À@áیǯ»Õ‡sÇtÏÞ èãÞpÂðÏ žÅ¿`NæwÔ£]:o6úà ÜÁjÝuwl¬;ji»aŸ7Î4‚‹,’Ø;mG5r1(¸ÃB…àÑ ÐæîÎÌ0âJOÿ›ÅÆ¡™ßœ@Îvóµé°Ÿ#‡ÉƉ¡LNÜüKcÚ#Ò²ï¦nÖDQÝVÝj^ïSiJ\¹"©;´³¬©ƒü}(ÔĨ1r ɾyºžÊœ(¹-•ôr9oŒÿÒM¤&#OÅñ †L³"~Õõ¦C§vVEꌸ{SÿyM—G÷dËÞü¾2v@ÑR;ðkZ “…åÔ›ˆµGÇy·¥¨´jw°’¦[âºDŽ»åz24S  :Ýo”(þâyg¸â0ÊöYî ¡2¦Á™åff*iÓÍŠHå4XJ¦°²=žÔrŠƒ9 ;ßK´Éá3RVŽí†jÛ)ùþ%ö ` ½°ž{}v<ÅA˜P@o¶;%>Hé:”àк¥úÆÍ¡âƒ×\Cò25æGË´›ÆR³5•(¨ÔdÂj –z¾ñ옜C±îüYL(V*µ+ã7w˜ý0ÑL¯æOI ( ¢ø ÂOÏÌäz¥ûÚµ«t“°çˆ*€B^ÄÎi"è;¦Ù7~ýBüÌ #g¿jÛ&ß-ÔP$§·—zË©/‚!>ÖÑ™PÇÛ³PÜÙФ ÛdOسì˰à¤k KüÐ{OF°4†ötÓ÷aÙÌ|Ó‚ o­°žôÒ‘œˆ“deÝøÎÖž—$Ëq6õFÈVTx‹bÈ­ìe*È$a©’‘d™ð”ˆ46Ò¶$JÀJzØp~uãw4ïŠ'ðÁhâ͇Á8ÈÏ3ïP¨ôROX­¡ÄŽâ\'σLX’Ÿ†R^íâ({‰n^sàõœ6y6^³ã ?÷I ;œ¯Ãɇ¦u€žÿÍI¤ endstream endobj 641 0 obj << /Length 2172 /Filter /FlateDecode >> stream xÚí[Ýܶ¿¿bôAxiQß:4E›ÀnRÀqê\ч4<‰{§X7¢dïõ¯ï ‡ÒJÚ=ãÖ®îðË-I ‡3ÃáÌ#Ëü \¹£¿Íõ¤KßýýÌ]ÁƒüÞK£t5þk(çƒ'QþqÆA wÅWIÌ\ÎWQ3Ï嫬:ÃñÀKX'«˜³$ðV\mÎþy’$÷Õî»Ë³—¯½t•ÂT/Z]nV© ËbzùêWç›oÎ×<ŒC'/t+êLž¯C/t*Ù6EvÏÜÐuþãòPvYYäRÔØ9ÿíò Èšs–†áŒS#u‘w¢Ôýô Óø““¶¢°¨lpJ 3QJ¶Y«šo¹;™<—ý²¨Šúúâ®|BtZ6V}«[YÑ2²[-ó»¦zиÌu»¶ÝQ;À™‹ì]ïË/_ÁhAH?dq>ã eCÙ‚®ž#³bs ö€Nâ;íÄFàüôæ5TÊå²DÙÁ?Ü){ž0?I‰ý  §V-6|GÃ^‚k€`83ZÔDF‹A6¯|Íd?F„$ð@ì,a¹šF:=pÖ3Îè¥ù9wD“Ó€ª¥Y)u„¦9¹DÙji H8ßyõG'ÖÇ6º-’D18zh<Í`ØjÀv§½¶û@ÎøQ8?¨sPéã¹;ò6eƒR—hUIâNˆ"G”ת)Ú›JÓƒ3häh^_6²ÆÁ–»:—Mi·Øìí¨ûµº %¸±ËXöµª×Ú«öæ˜ H´˜ üŒ<„Îà ¯ß(’@ÔŠ$ { ³æàd)jKBÏu£c£éoŠ ßWØpmùÖv]Ûª£ S@ ¶õ (HÈÆ¤Ëˆ·Ü<ËíH âZÐ÷t.h€éD}-é9 4Ì› »<͵1 2ûÖ‡á¹Ønã&»ËÜpÅ– ŸlÇ%²ô’”ö£½¦ÑÀ!°T#‡7,É/ýf¥ÐƾØ!£a l"ë\hl<ç / Yy`¶ÁOƒY”òž†Ç¿•e¿¢ÓzyžY”⪔w¨–Á®¡eÖ^1žÆSÛ\Q"Ó6§dA'§ß8=tDìÞ*Å]Ÿ%¾ß \W›7 –Gß7z¨azA?aÓÕ™ èp’ié¶DÙ½n®»ÊžÞ ›#“¼º<„%Aä2/9„%KRIX² eìÇØ }ü›FD9¼ …žÏ¼(ž:ÄÉûv_J …ƒ³=²é0&zpÂx¼>ˆþüöêw™µÔQú5ââ€nó¿Ü›p#EÛ´xîN‡¯„.ôËFÔïRÏ8kQmË)ã…Ø4ÚÙ€íÌ ¬"ok H.7± î(mnéå hP²š B E¿ ‰À†–}§[UÙ!‹" èÀw0ƒ¹€4E?˜>¡ ÄapÄÂ$é£Z¥ŽCB‚p8ŽîÄ·›PöSˆ‰?ÝØ=–ITñ Ñ-uD.¶ pߣŸ«Âô£¬Æ{=‘¨GK `Z+ñï@CÆE"“·a´(Ko ¿Òƒ%(ГG‹çÅ9Âî£ Çˆ+#,vÌ!ÿ}p¹¦žÓmX`Ÿ÷öÐòTc”Sßn6Z¶Çò¸m÷”3¾p ûòQy%Ç—±_ÔæaSVv¹ÁJ©E^ð«ÐZZcmЧï ¸¥^ANeŸ‰,CÍU7Ø&^Ëš8[ fœ…óˆÅî,£Ïà/æpU#Îï¹A’•»-Äm“nà”e—Úâ¶,k”¶@kÀjC¤xš îÅAp}p<¿üEU ?Ájˆõˆê– §ž©ápœ$±Ì ÌÆèȘT·>™?8vñC%ÂÙØžÿ€F§óG̢Ƞ$håløï–þÅ‚’hTåy¾ Œ bK*òíé'-‰ ë†x¸Â>>Í'%”Å@w‹Æø%Å M:\ÞNׂ2žçÀªEúÍß!Nôǹ{í… Í@,¡Ö\Y,«*ÙÞĆ]|æA+švߪ¢nühÓ¢Œ±å—Œ&Kn°¶cê²;“º/ZgSÏÃkŽª¶]k«áÛR±åþ™ªeÝêży–g²n3ñäÒá}oßv…mƒV|réðþZ8íÒÂï³/œVÙîžm:¹|÷¯W‘Q"]`Æg)Ÿ„#¬oòƒCæ^c^Ï™«:•Nä$$܇Maù‘ÂR.ZÁªÏ*œ=±è´)?݈Gý¦þåÙtgŠ#WZ•Cü ÊoóãJà@º)Ly›?¯g‰|ï³²Txà”þ“jåÅ\d£‹ÿ *㛣&ê÷Ô*tÁTƒo̘¥R£’(¾ 70­%þgn¢3:<ó³W›bðÒÇo«>ëÞ[§Ùv=Ýž˜?@ ZÚ`Ÿ§ûïÜÑ÷ZRÎFµæŒÿúâIÝÏÙábI;¼ß8I1‡éÓlWŸ<ú …½ø›/¦ ²Øá ³þŽ)7›"+äC\û£ãʈý—XÆì¿¿ üºøfªØøÌD¿o ì'æ:8|þµh8þt.E›Í§Äæö9_à¿&*ëÍ(G3ÊçœÏ#²›sòrAù¿üåÀÿ³`áÛ å÷ãúéì«<Ê.úà‚(ê>1 /{Ÿ[%ã˜÷þuÉ·rOôí艉¤QßÀöë©©>nÉ¥‘€ò¬£wÛ|Ñé ù<ézמzb¤ý‚"ç)ßãwgÑW׳—¥ë?Ãð§\/øýÌ~Œç¹ yjþ)ÂûO§z٫˳ÿÅÁœ| endstream endobj 646 0 obj << /Length 1535 /Filter /FlateDecode >> stream xÚíZÝoÛ6Ï_!`/Î3ü’DmöÑC?°Âزl`$*ÑfK®$#ÍþúEJ±•ư²ÑuÐ"ˆLR'òÈ»ûÝIŒ¼ö¬®6ªöùþÕàE¿£¿ønvtú’â@"Ñ(˜eÁI΃˜2„£0˜¥Áùdv­‹ã)clR­ÚŸ4×Çd¢mYͯÊ*o®–¦^O©˜è$ÏnóâÊ6æ¥-ìgðHkûfQ¶ä©ž_Ì~vä;”H$¤f[FÞ¾yù.ËjÝ8ÒuÎyŒpÌ:Ê3C1fE ¬?[Êaã(ÊgGŽp„`à’À„¢ Y™vN’±(‹¥4¨tý2Š›Ýgèƒ2æ1 ‡g$"K9l|ï4­ËKâ ÆaN¬Ä¾9ž†4´f ɪnÊ…-¯i˜©Þ@Ñ–@!laQ¼-{]5§˜Å¦2ó”nNÃF è*¦„ Fv>Å"=ò®”Ðýï8Ä¿žŒÁˆ=4*vz5llGhWùœÂ‰Ý-êå‹¬ÈÆÏ ÄL$j…eK9h¼›—Us{>ºs")T¹4F#,ÝfS'wö0h*~%äYu¢æe*iÊê°Ä±»¡LölèÄ[ÿ#8x£o$vpíðúٻ˿tÒt€ë°{®êú¬‡è,o^˜) !ÒôAÇ:ìc¬òlƒ2\£ ã­ÃõVñbk™VͪÒ{!ÞJ}©ê¼>­Tñ·£g[ÉkµXÎû¾éö¾-Ö9Úsû†ÎCsÑWI$b*»*&2ꪔP"xÿ6˜bÚ*BÈ.vYût£òy½}õ{œ>sƒ“û“¨˜±LÇJ¹}q´N»aESðîÛÈß¿}åÖ‚RÌ^;w’®t%JÌ"ÂØk·˜š³˜„J³(K0áWB)yF9IÙer±uä4¯U$Úù'ÝTyÒ1n W¯’yžjUtøû`O gyºRf]íç ¡añ HÌWKU)UW"­Ãäs²]«fù¢îåÈp±ªuåªoëF»¸JÏÕ²ÖéCŸÒ¨U2L"7”1¾+C»Å)Á«KXN_ò8°|Qs1&#,— Q`‡›ß»è‘9½³‰HÜJóº4Ë0I?‘D˜Y Ą웤Ø3 L¢\*B-m)Õ ¼pÙP·¶©P?2¼p#ÓF¶y“Ë€”ýÉVEÒä¥K° ¶™Ö¦c!+«Å¡f5@&plQÈ(§”A¿àÞóÛ ÌÍBÕ’r¾Z©À#ÙÂoŸ nðSìºäFPË%,ºg0°êî}¿ˆ&|q¸üñàv"FCý¡jN»ÏaR¯¾Ù-ã6V7oÛ?ÛÑ>7Ĩo-ìþýIrš·Û@¾ÛUš–o¶ûDÖb«óŸ†VV©®|KÄF$ç^7ÿ‹>ó¹ÚÅ~ àâb_Q1þT8œy“«yþ rG“ížå#bµÿx è¢Ý¤ÔÙ— A#ãÏ{ˆ$ªU‘gOyÅa;ÍOaè·^×|É~Ò¼G‡G;F±D”°M€:ñmÔ{Ö(ÿó9|xìfS¯ ­w\ñÑͪr·|VËT5:ÝØÿ<îÕqu°vÄ–Ùúvã”$øÀR¯<ž#?ÒÛ¼€hïNiˆ8îî 6)û“¸ƒ1>)ôͽÓ66Y´— û·C=9“aÎd„æOïÜlWK´÷Nåæ¹‰c$»Hüëí9»¡;Ý0k97jÁiõô¯˜iz½Zvïxòë­ÝolÕMz`×µöéì(ŽPHd0eйãŽÝ>¿ò/"/O} endstream endobj 650 0 obj << /Length 1170 /Filter /FlateDecode >> stream xÚí]oÛ6ð=¿Bp÷  Ão‘AQ Ã–bE×mßÚ` %ÚjËž$gË¿ßQ¤[±]{€ÐØ‹HžîŽ÷Áû 1b\Dxë[Nw–þ{÷îGð#‚ñt ¤¥Ž¶¿ fxæ_¤À‰T‚0!‘Ä1E¢tqáàœ*¤¢‘”4*m4¹øã,QNUïÇÑÅõ-Õ‘R*£Ñ$Ò8Jˆ[Â*‹>ů^ ¯8†QPÿdk“Ï«›áýè=ÈzEÒBláŠDÄf>]–y=[ÜâªXL®Ë£4•µY‹þñ×[äÖˆ˜„É4ԋɵìPß}|wã$˜cöáÒ/!í!fZhÌ$aìƒ_"cÍÆÉ$c’Y9æ8U‰J™cžfÆÞ<˫کõ̶.ó´Uäõd]¤u¾,ÞeQÚ*ÏÖÆ™ÕÓ-QB%9JõKmKã˜WAu)ŽâòE^LoÙ‘Øx]Ù²õÙcUÛ…çlçfUÙì{*#žÐ°F”ª§9Á޲—܆ôõ-O" ç¤ä i̽”„! äÛìa(iìü•Ê Þº2CO­“Ð3i”k™P†i™ Øü>d$6éÑøKÃènÕÊ2¶iþžzàrÕxÉï@ñV´9[*ˆ}í7Í€ ¥4^oª€·ž·:Þ|âí€-ïf‘šÂMX<†!‰­_”¶ÎíƒãçtnˆÊ€?¬™)¦íu'ÄOëY0ÉNz ‰òö÷CX£©­k„Ø£_ÎǺÅ6E¶‡%€ÊއíuŤèÝ#ØY…†WœsgÆÊùƒñÆ ÷Ì8õ½ ÜW sSÎ=ž©¡§i,1Rbc±©‚üoBh}ËŠöóèyQcŒ ¥ÏŠšH²¤Ï¢Ö¦á1 |‹¤’³ lK*û%•k‚¨¢!cV³åß>¯fvbÖóÚ/6U3,áì4W ›° õe¶ÌÎöy&‡¥`ô]àÝ»n7ÐÉõ£Ú‹¥a›ÏP~ÎæO4Dâ.öòx» –7ÁêhcpìS¡Ëž´iNĶFî¨ô­ x‡ôÆÿ I\q†³IÔSâÌñÃ3ïêZ|ïwï'ƒq¹.l=8€| gÚÙÐÿ´½JˆíåbУOÍVTÕµ©—·t=­}® Y RÒ<€–›jø’ÒNE~éiéÿ ~I¡’ìJ†·óùvhœ_.O•êPVÚ*ÕîÜþ'÷y[Ûir¡UÔœƒA"TuîB!,®ÓuYÚµðµ¿×< …„¦imÃíg9ñ£5þ^sø‚DÛ{AØ!¯Vóæ†ðè\†šIÛvïéê£pôv[¿*ó"$¦}½½bàÅMoÿ½6òÔ=‘g¯Sp1ÑL½¼>þÔ¢³÷iŒÂ…VsrØÃ}Öžï-gw2ßk[<äå²XØ¢RøÉjb­b«7Ǻ(S×¥SòrÎMU Ze¿ÞL­LúÅLíŸ!н?5HbK$š§ )áI‡1/O ûqkÈ endstream endobj 671 0 obj << /Length 3167 /Filter /FlateDecode >> stream xÚµZësÛ6ÿî¿BÓz&„ðí›Ì,+9·¶ã“”Þô’N‡¢`‰ŠÔñáGûÏß.”(Óvâô> X‹Åb÷·» è`5 ƒ÷GTÿžÎ†ïÜ`À\â¸>ÌoÜ!Ô÷óåà“åÛŒqÏš‰ªJ‹üØvÏ:ÏoŠãßæ?µŒ€K4ˆHäs™¿Èõ6g$äL1úÌ=XÃéÞÙ‚9y û8Žu{ÌK”zc €œÄQÍÏÔ£œrצܿôØd\;’ðø@Ñ|ïCÿwßµ·‰¥yso¯òæ¹sØÌ ‰1h„$ô^q‹âØæ¡•Ä™8éÏñÝvòø÷ñü×ëÉ[‘ÿþqF>ÎßÙ¡^´¿£.ñi`VõÛ'4 ÷Ø^}¼œLÏÇoÇ=ì|NßýnóóK)ãùäI£ˆ8Á7‰8þpq1šO^)¢í„h´pQŒDž×r½üp5™¦¿¾ .ã”ðèEy£=y/'³ÙèýdöÒeIÎá·hâzt=™¾$ðË6`;^—=ÒÉÕè²_Ín@hà|‹¨£³³)è᯲«ÉÅäúpc½ü‡pî} ¿ËÉhöq:¹œ\Í_R'8b´»Þ~u: Næ=Rçùð?w>ÍÏ?\)ÑŸ¯†“yº þþ(ò^Dñ8ñZLš²ØŠáiÙT•Ȫg%ƒëò\#Úk0{þïDÝR‹XM™ô PâÃzaõPÕbsl{fÕWYºHП•7Ìy½*§Mž§ùJ‰ÚäKQöJʉ´k>.š¼n”¤œðAWu.æ³ç…6Žûza/ãºLÛR«¹IêêäØv]T~7Yýÿ4½Ó‹Ñ¬7„q™Öâ†MUáþ†:Ò¶av†˜/²¸²·õºñgaŸT„ôçwa‡ïÐÝÅèú8t¬Ñ1èlüsß÷ÂÀÝ mk—’@ûªè[ïÑ¿Anåû’Ð5â-»˜ú„:õq£„~õݾÆwOãJ;í6N0éúrìùV¼ÊÀ±ß:+ŸlF)…T¾ÒæC•-J0oŒ·õ±J*|Ïú ñYM8vÿFõÎbÔíÔÌ;kÀúaÙJ¯mLäÎQk.ÀPnÁx…æ¡&Œõ„Kñ ‚h¥ðý„ÙHÀÚ²>ßÊVxÐzS©°H¹sPk¦pÓ8KÿˆkÈ 1›r#GmîF`ÙcV‘ß,A€H„„x¯û¨F^ä¹3Ý­PÌ6ºÎKâ"¿Þ­'¥ ¡Ó¦Ípt7¤Öã†PQN“J±Õ­ˆEDP/îÄ‚«ñì#78Ö>ˆÿq¦ÈS¡Ü·(kE€ºh-Ç Y@}¢¨êòëí \äp¸AÿÝ]ˆœ ç\ë&Þ¶tñªÑËŲÊÄ·Çáhî ª¨†×Í"Y¤:t¬ ½èŠ[ÕÌo]¹EÁ”8û•:à€×ª¯)³¾w 0ޚʉ¶~¬œéàËÀ´~FOÀ­ÔÎ5() a¶ÖP¶‡²-™¢WÈxX QÞË"'¥QÛÞ¶jöz “=v·©¸[ꤥå¿Àýïò %9ûïšœÊÞ[Ùƒ„kÇ–=Ñ£½g¾PʾýÈí›MŸ‰ÚNå<ýo@C,`² ¤ªþÛ¶ß·aB>>·ŸOüvüÑ.*‡Õñ§³Ÿ¢-ovׇÔ5g¨zCÕÛCV]¢7Ò öy‚··G÷·Ç®µï÷ëYϱyi9ïêùh2?ú>6pCN"@+îyÄ$›£O¿ÑÁ†À5 2wrâfÀõ#[6˜ýS}}èb~è‘ìqªQÿ]*c¯^G¹‡ïvoª®sÈQ¶ƒ"¦£×àá2&3tp‰HÿÔç)WÚ­¦r2†7ÿ€®f¤K´¡ôwåk+(êP÷‰÷G¬‹ô6mð[ ÔšPTÄDµ?3ÇÜK¸Q9XàÈŒRŠûm¹û ãâC¦E*3 dº¼QcŽÌ-3ÓU” °èͨþê4ÑK‘¶Tm{†=Å&q™¤y±ÁJ‡{VS)Ñ Y¥*¿Ëê8ES)ª ,2¨+KG¢ ,Øîòƒ"žç'}±’BºÅZ¼Ž“Œ‚{Ôš=€‹aЫÒf£H*R‰è…“`¡å1(7Û•Œ˜yûœ±{ÀI¨FüícÒœƒDmíÈ#€=î{ú³ Õ+ ù”hÒO±ÍýàOÀ™žpÁ(¤P^û:ŸVUAmË]g0$SDŽíшõñ…\Ç:3ìªê»Ãº•‰Ãp¼“áðîƒÎiî)ɳ ÉÓ5YÉàq;Ü6‹XY˜ãGüÐ}л¾û¼ó:÷ÍóÎ~Ó|¨€Ù× ƒIuÐÁéG‡Kò/¢ÊSQ–:½Ô¤RGY±—¢ÝÕ;HQ=ë"Ÿõ¨zj’XŽú&u­)ùÉLÉ„LœQ*MBtµ™ê“x!™ao·&_ªEf¡z¨Tixº‘å8 pÈåûÀñƒÎßžŽ€ìrÓ±tT¹L¦’žoͰ[Ù-äìÎ1jUÅ3jý¨~Îâ!b‡LÙÓC•V}ß>!ÌEm¼ô ¬Ã8ÄëÆõC&WŽ1Ïû“N¯ã3JBÏýËEÜÎdÒ-ïH•¤X-ÓJNqd¨):àrHµhÜs *ÊÄp›¦Ãe~¹C}J]±Çnëì»­k½äµÞ«C®ÛïTc|ls¬Ó¢©«t '_zUõô‰úygY¡‹Œ&+Ðôqšþì—35Ÿ†õªnI¦_Gjl-â¥"TuŒ UCcÊ›ÚÀø³~ ŠÞï êðÝG¶ë¸®E‰©@XSUz¦h”e ¥·Ðƒ¸Aw߯]†½pÛƒP† ‘öŒc ‚ñŸÌñy¯EsÌgßÊ/¥s8užˆd!Ü®«@¬>z˜{ ÁWV.“E £¡Ì¦)Ö0ÌÇ–¬‡ðÕÓÃÛ¸NŠÕÞŠ‹À C Q‡#=x‡–uæðóî_X3º|¯fD±N”8ÃÎé²4ÿYŽœÙ,:ÇY% ,;D|†ÈÑáQ °ca}o€Ó—Xà€‹ì¾ Ì̽ÓðÅñ¢ïÆ—à+ð……`ùX=òˆ„a Dqºß úmŒ# endstream endobj 717 0 obj << /Length 3909 /Filter /FlateDecode >> stream xÚÝZYoãF~ϯ0ò°Zì“MÁbâLæH<1ìY»Ih‰–8C‘Z’š#~Ø¿¾U]MŠ¢¨yÆ‹†Å¾Ø«¾þªªÃ“ÅIxòì›pðüáõ7ÓŸDx³Øsòúî$V,¶ü$’…FŸ¼žŸüü®ÿ<ýóõËî­“ß'< Ãàeš“«e–gëõéDØ =H#ƒªM‘6g˜QÁÕ)T$·yIÙ×§VÉ*ÁÒøSžõ*J×Íü”ÿ+½¦Ç³2ßÜú†I1§a^fyÞŽá—iU%vúŽQÉ\ªË´Ii‘ÖÛ×a1'"d*ŠO&œ³Xû…®ÊF;ŒdÚkÇ“b^ý•¾Ôèà¢%.$ \úmv†uÿE›ýsüã­/wR¥7Ò6°Õ`g6Xf”{[‚ŠƒiTœWC‰ÆŠîˆ‡þ|Ç¥¨Ëꠊ숼“x)H¼ ™•¦…OŸ>E)¶ÁM¶ðòn9}rPÁºËd‘ü•騤s¦T'fBÓ<¼ÄÛVâá{“ÄCWâž«^C/ê³R ŽÂH-X¤‡ i€d6«Êº¼kðÜŽƒ‹²"ÆYV„OPj=€AõM“v8ÙßöÒº&6F¾BÅÂ-3˜—W‰ã_¸áðÈÓɂԀɑqû JfK¬0ÁÞ ÔÞ±­y²†¯OwmÂ*|·ÆÞ’Ês‡xf@Ú¶Ý~‡H"ÛÅÁß«ùÐ:frûáS `ž×ôX'Näßžj_x òÙølí¶ 8LˆÜ›pÞ…BŒr%ØcRŽx‹l5@ÛÅõ“Wìz‚Ì6X§Ÿh¼Ig +«Åt» ƒËøÞ3^+’ øšÎþ¨’¿Ë¼µ‚íPô8ˆãÑ3€x\¸/–U†,Z8ð‹Å%ÉR*)óKæJ¡ ðƤ/=‚%Nâ Õ z¼,«yR0j„XvQ[Ëå5"eD®²IÿüŽèüÞ4˜îPlrèܑ޶ްñ€S†©ØŽÑ$*j{¡R§×ð\»Jo‹aAB':vT0§Ä ”Ðe²¢I½òd‹Ö¶3H"Ë"ÑMK Æi(/ÝNbN„<$œ$"F€€vöÀƒ'Ð}¯õ˜â(°CÂøcEôè’Ç2˜—£F ¦¶6ÐW[$n¼ÆE™ça ›L1óú %óÉå _-RyÆÖ;w6Ò‹ÔªÙ¬Üä¡A½¹%;Ê»»Úa›q´ wWt‘xB `žì ì[63Ml|­ã‚@#”ÑœMÈÖJMŒô}<~`ƒ.©èá^Ú™I,½(îÏcZ8bÇÂÙq=x­ŒÅDë§1Ôgá]N3W³iRÁ®æi=½º¼FHšéçm›Ïéç¾íÿ9g|¨BËV¡ù¸Bÿx“d“>#z`ÚÃJR H)ÙÚÞ£PIðf,jð‹R*ôß倦úÖó‰ÙˆjÚ¦óÄ¡XMÙ?(Ö,Ñì.7‹%åëuRÕé!å.ö0DDªÃÉ}*68à'01ÓR·òõCVö5 ,R™_?Üá Ó˜ŸQùÓb‘ÃÞáW“[3†jk3qÈÑD°¿W§ç ©ûä)ÒbWJIKcÈ8 ïGÙV X÷ƒÙ²vi¢‰²¡íÖ0Íàp@Àâ„é2±tÙ©û½|mE“-b@“¤ŒŽÀ}ô”·ì¦rÞ›ý:†à—d¤Ù3û[ô&ù ÿiÑ<F×h„<=0B)±‡·¨ã/1$×i‘lœßŒlÞ”›”é H_$ÍÒù }“–Ùb™2Ê!Œ<ñÉëôCv›§”¿¦ÇÀH£BoÛaC¸–Nÿ'{âU©ïNqàhŠu'C?\^@cPÕ@ìË•;aºøGk¡s·µ\ÑÚº7&ÅÖ2Îåƒ\諈ƒEêG®±Ç¨³ˆHàÈ×v4Ô`93ú¡ÄA9¨1zbb>èÔ3Æ>Ô€B* N\jä ~II"ƒJÙÅ­{ ŠÀ÷Æèçµké3¾Ÿ«lxœ½1æÑÌÅyfÀäÎݤ¦½_G3ºõ’+ú,:#¶•èŽð9økowˆdôúæZí{#;ºAŽf¥1¿ëºz§þd¨qÈøQÔâù¦…Ê#>àÓá&\Ó›1iÝ Ë¿x,“LÀö@Ü ¨vÙÌ÷Òú\î}Ö,)µ8ßúÑÆ5{.^%ͦ"ŸâD…6¸L›¥Óðù©ˆ$³[BËÃ;Ö¶¬B·¬ŠÖÆc”æ\ßc|Ô¢×,´òñlo®Ç‘•;-µ;®”ÿ}GŒãÉÊj*(pR× èP¤tP¬RÜð®ƒ7mèÖuL}hWƒ Ç;.¦…˜Þmò|êú`ãE4½UþÕ|:úba>pê—Í,sá&¼¢ÇóM㌬‡¢›ÔYî¡pA|lªµ[ÓGßâªÊœo.Yù7@Ò—¾Î‡·Ð¿Oú’ûèñ ð„L–‰ é0ª@õ¹Bì(ë ÀÉ<]S‹bÞž–NÄUÙdw8˜ |¨¡^žn}{Xã¯@ «ÕÔ7í](Ût¦=¤÷M{{È´±ª+šö\´¦}g×{'½·³˜OûJ2¹=ØáÒß!¸ÛL"…„0VÝÇá¸vÆ ÷Áäzõ¦¢âÒ+¼¢•T•¿ÚïÊ0*K©Ö £ˆé¡ pð©˜5øž¿IMöî÷I °[ó¾g1šÓq$!Ý%t¡:¾yÅÁ"§8˜à*Ö÷P}ˆðIñà+ukBt\"Ôã·;$ÓQüh¤O(÷ÍO9ù}ƒXNUêïvkÙˆÅbȺmV ¾Çp?iY¤þk`wo¦P¼HY©Cþõ¡_ýÀÈïC¯­sñÀ„yh,úä€aÌÑ€bÖFþ>Ôî⟾þæ?¦n–n endstream endobj 591 0 obj << /Type /ObjStm /N 100 /First 899 /Length 2946 /Filter /FlateDecode >> stream xÚí[ÛrÇ}ÇWÌSÊ|ðܯŽä„MK•ÈV‘JÅ ¥J­€%µ6€… IþûœÞà É)ŬÅ\v¦ûLÏéîÙ¡‹‘Iæ’fÊD< ÓÞái™±Tv̧gÖÑ325ž‰E™˜—’E¼ë¥b)Ê—G¢ÒùÈ”ÖxÃ'ŒìQ-Sý\’Lyc™ èãƒA;š‚ *8ü°'¤€·Pˆ&`dÇ´tSE¦U 9Ó‚x%™6Ê+Å´ è£4~$šúåÑ901² x+&ª±L'“^9fDõÀh ´×>0¯%`èš"3€x­™ñÑCBÏLÐ5?¼EŸÄLŠNÌJ ™µeV9ƒÀ¨ 'Œe­¡Eg£D„ ~`Tf"ý0ÌF´{ÈdcÀ\*ÉèžÖDcxo ’ñèC«ç ·tÎcRå,¡“ 6Mj±²1¡³ ´„Ô*É®ÉFzà-)@“:"(OCpå!“í¦ˆ4~ÖMP!Ò8XΠ‰– I”¤xȰ”¨q0ESxi©=&ê@#‹Vbh! Ïb„EyO¦FS@Û¤`>x–tÂÈ0YØ—‡”É+È Á ¥0h"ŒÅ[‚) £Á¢¤u dN‘ÔÅz$‡,f´Ç`Ò“DXb%C _¿Ù"QJ’éÁZ”Ò¤/Y>,št : ƒódé0uL’R‘‹Ø*;xôh ^ý6+™xYœ•ñ´ž¶å´ÓZao ÄQ9¯Ͱœwû¡«zQŽªâIý‘Ènÿ:®!Z´ŠÇôf€‘ eÏÝ÷§Ó#žt5ݾ잀žoß~ÛIò´)‹¶ª§E[²¯¾ÑR[h¨e²Þ¸=Ì\nm{Uµc´±ï›bö®ÎÙ‹v¶hÑô²©G‹aÙP«å†›½«§å/bXÐxóY1,¿$û /õ)ìceÜû û?²^ÃŽoVàü{5ýÚÖͨl:Æ’oÄ3ñ\<=Q]8nزã—ÀÉÜÀ¥ox‚/0Ñr=úí³G˜8fâûúUÍÄûê´:[4%w{ "

WŸ‡M ˆ^C-× Åí8C]ç õ ÎXÁR­…üóàx™•/@}(VZ]Ç*mǯtVp‰_·sÿž’7œ‘\G:,ЀCÑRÉÝÅÜ:%È–²À´9 l ËQ½ø7wr“ÏrtBE§‚6‘ƒ·NÜ»°nË©ÆþIÂiRúxDÜi¥äÎ! X1®ÝüúÚæO›mþtió{ÌjoÜýé†Ý¯‘)˜´ag¹ ¿S¬Äðh1 ³–CvMöºï1÷ò=Þš«´a2M˜Ÿ;õE 9¨‡Á8˜¥Ã&UZr:!õRsws*Zþºè’ ®¸Ú!Y ùí>äÆtÖïy ŸØËuY¼,æÃE1þú–¡˜Öà ¿C±,6J€N05ݹîĬvöN±ž£²¸Jb´kìfîÚ^v×°N_>ÿƺ-t{ð&¹ÌZûM² ÖfùÃj7`j-¼cÜíQÄ%äV¾œ<¬ž>¬üPLÝõxÅÆm1Ý̳Øt%¬„¦°¾ŸCÒ(?]ÂqáÕUÙ ‡ë<ï·åy׋ä³Ðôµ­{º\vËr]ö .ûó{ËöoŸÏ®|>¶¢Ol}YßáGn#Fuá8EqŒå2!¢Òt˜©‰3×vT+ö=êfûCòâXüãè9ý}õ®mgßA¬9/Ëæ#¯æ-ŸÍ¼-Äûªü0ª‡bT˜Žëbô—Q]=V’\ðD`æÕë×*&³?7åì1þ–EšùñltúZZ™g˜”¿• Ÿí;>æñ_Pxyüúõ«q9?¼8|>­ÚýñVû=Ç{·¸’ R–[^u ¾Ì^@ÔCöD+™>UÐ bƒ‘3d_>D÷Ø´µ\!L=G HI¤æˆ]Hf /~{P´Á2™Àé;¹Š±;0NsItÛ¥þÞËôáà÷¶âÓñ„O«wü¬~/f‹·“r$ÀÍš¾ïïí2ã²iEøÔ|\È~oÀîŸ}ÒY¥¿Á"Ir&­—a—°ÒÜ#á9—·Û@£¶0¿§èê"-â9bÇqẽ g>¬è°}T5˜‚ë‰È5¢hÚj8.ŬªÄ±T>$ŒD®kURÛ“íM™%”‰tÉ©WêA‰ûÓHÔ¿Ü…NàÁ@7YÎuºÅÜ–4¢’aØ€ÄXûPÑÀéï1Ì#Xœ×Í™ &Pâg>+Úa}Æé H‘ÓiÖÃMWzž`²½°ç†ûa!뽪éÙ»Å[^Žç%g_>g_>gW~™EåìË/³¯\ËrÎÂb@PËrÎÆ2f>V†üõÅg(|t¹~Ù?Ïó<ùr…ïï¢_/åq’ÊõY¤s9Ÿ–õËrÖ/åyú›p,,?Z¤<_Êóɬ—ÌóÈåø>—³^ýÔçñò—Ü!ô_WXËöe9Ï£–øåyÔ–ÙkÂQ3Ý(¦K1‘ôGj·ôEÁˆÙ´˜spatFÁ9=œÈ»(t•7KºtD’t]èíàF“Ú]”¡”Ð:œ¸H—“¹£û¶½2Ÿ%ö¦{It‹ø\Ÿ8A®•a‡¾Ì+Ø¢ìN·×Êv(C´<Òí¥ Éóà7ÀAo“(ÑéN¼æt•Ú:Çéö<%±;?™/&“¢ùm5»Ç6wPvowŸ‘Ø…ôß Ý;l~€ 0«èÚXÙzcRž»;"w»MgR—°ºÐ_\²é¾%ñåÓ£ýøÑ׳¦¦‹2u" ùr>ÕpÇÅx\Žó²ýw endstream endobj 755 0 obj << /Length 2567 /Filter /FlateDecode >> stream xÚÅYmoÛ8þÞ_aô€=i‘Ôk€b‘ºénÛ¤¸Á½µûA±[­-iõ’´»þf8”,+r“ö‚;Éá;ùÌÌ3´3ZœÑ/Oœ^úâòÉô•tF|é.¯G‘3 ¤âŽï.—£새~ÿvù¦í2ú0Žã°‹D…O¤ï³³¿ž.ê¯c2]‘hž,°¼Ž‹% Þ'[ÈÛÚ85Rò7œD³µNmö£PîIJùìj<ñ<öI/ªÉx"XVŒK4fSœ Òv¤ÆÌ¶¬Þbô4+¢ú<^`Õç îf$=îú£‰<òìNãîÆõØmR­1ç²mlæøJòM–®H^V…Ž·%‰i/(­¯lÅSNU¯ÓcœmúÊ•#–Bò@øpšfÞ¿åcOà2áWI–⸜ —ÚÈ¡V²ÅšFë]÷wƒyP¢Õ|thÃCP¯u×qY½žœ\±Wc0ß$!ÁÉXú¬£ö(«2J/tzEìaP#" šéõ<™É.piÆ%dŸŒXX­ »¨‹²Nª!Oqßi5!ìFàeÀ 8äCöyìùäQHÈ+J .'Êv”ŽÔXá øâñœÌÕè,ðQiá;í|gó“w&ÃÍwn¾ CÀò"kZÏ6/cÇ EõBîEjÿÈwçâá¹<·}¿Î4¸9ì‘‚‡(AÃSº* ‡Uà`ûm©â¬uYnœ gp8)ÁÊ1] CVW/†P+"@:°Å]Ì)iH] [vaKnNøÆî™`Á=.9‘À²²JŠÇæ;l¶—Àyf¸y@/Ÿ“ÉÏñ ±¾¡¼† ÝÁ`$“ìÛý8¼Çt‹¡0‚£ºc‰Õ¸×@dä²ó‚„Ífj¡ÏÕέŠdù".5zd)ÔTíÛjG‹©"»ÆT¹Gy©IJ–Ä8 ‰lÏ|,†hˆt¾×…,wNIïÄI¸g QàpwØŽ0œ;„ =$pæžUyD$UhiÐ.BaÌ!›ÎöÕÚ¿a45ÿ_CI>ˆa»’û¡Ûƒ’; ¥“MÂg :Aà*u¼™œgD¡â4CîìM†xÀv@’˜²³¸ˆÿhZ¼%Ù[¤s3¶cm_Rr¦×ö¥¶QÏø”N£î:Å“îþ^'ha„kˆÿ;í¶–Hb„‰ràz]–‡BoGù¡Á>ߣ±àVÒòÝù+<_ˆC¡¦rà˜…l0õúôô½·Ã.‘¢§¥ñè`ÖãªÒEc3mϽ-c 7ÂP/„Ã^¬mÕ4oà¡Û Ue8nA!€oÕ†qš:×Qººý/H©ú®.Sâ!xÂáNиpÑ ÞF¼acн´{“å[M(§ŠYVhÊ]7o9ñÐiýÖm*\÷ %gtëx‹«n‘è^à7ôÒg§éMB.>…é+Ú0Õ>X,«dчP;˶y]¡‡0µH¬vn”ÓægF²‡³W¸¹¬N—õCÑü˜içǹQÐÎm¸Çþžè4¨pR— LT2fZ ?l¸\¹Á£yzœ¹÷²Q Ûã>ß —bÿ8¾ë¡Cþ(­ôDVYWkÄ‹¯z¦)gõÌ)D’`KÊŸlâÄ6\Ú†³µÅr²2@þèH5v!†Ñœú˜'‘eœïL J+½Í7qeƒØÄs+’Ø7:È•ë亚$æÝïÆð@¸n«3,s©·Éì§y¦ ý¶3@ÞÙÜöû€Š^9ȃ)ô˜Q(\"ý¥@lfÃwW_‡ 䆷÷ú|ýP\FÞã¡öÚAå"©´aZ_8¨o¹Únà%óéM¢o—äºM¸$# ÕjŸTChr›n²xùó2Kžƒõøç*tûþO…Οÿø©2«9ù÷ç”.¯ûÄpü;Я˜r~þÁ0ü;ѾÀ};z‚PE´±Ó2;¿x/0 ÅGmÔ¾‹‘°ò"nßÙÐq¢E1=Ùb áCÁu“©Öš2sá6OšqŸÑ˜X` °Kvq/sz?¼ú‡ÎP %x(z+vb(@âÿ7† †þìá¡”¹£{˜¯ºk¸QÔ}d#üá°+<`¦kú©‚^`¥Ëþ 6{…| r¦IFèMލôÏZYÓܸ\m{@o<Çõؘ;ü¥ÅÏc[kÃ-—ý {ÕšfѱʼuC ;ñd¢•¦ƒþ’øNœÙ²yë<`¦÷‰± ^ak¨'øsXØõøñ15‹›§6jÒx(“Ïó 0û3 6¦w8Å®6‰áú-³ºXhêPêlðzJÂa‡áìÛB¢%¦«aIaÀ’=NV6ä Ú4ÏîYÙq9CÏ";A/ý}oϧ‘Ȱi`ê‡ >ÚÛýv´¤,ÓÁ§{.¡[«¦fptâN•„;‹˜ êqψòOTäò Pýߪà@Í‹<(ºžgŠSS¤S±ÅÀyÃç!9”dzZ‘Óùá–rÜY%-8¢)qSJWIg_éfÛ-%ë¶ào0ðMg¨¼¾ÚâÏ¢í "ô|ߣ;––µ³tPø¶¥ƒªà’"îG=¾e >$Øñ"ðÓ‘ä‘#©«ÚŸûôòÉ ’e  endstream endobj 762 0 obj << /Length 847 /Filter /FlateDecode >> stream xÚÕX[OÛ0~ﯰØK‘ãK|CÛÃØ`H°î‰¡)¤N‰–4%I…ø÷;¶Shƒ6‘i‘@ˆØþÎé¹ä\z\‚ˆ ÏÒ­· +Ai‰%åH*‰cmPZN.¯šíÌFwž³D13X)û}›œïÊД!ª&A ³NÀÆà‰Ú~Ö ô¼pœF´ýôœ}pç– J‘0 -œ™ÆFi¤VT¢Ú¢ÌÙ>À’ç{7'•Ô‡§Ð±‡ßÑlrp 2`6“h–!C” ëÍæèršgûW³ÓQlé?ˆ ƒå+®ÜQpŸe2pöÁ ¿¶·ë¼¶gIi›U’Úç 5 ޱ‰á¹ ÒdïåÕuÒØ½1x;\8w¯[Jÿêa8{  &¦ Û÷cúð~°p©%‰p¥+6õ܃ðÙÅ÷ã‘3ˆº§ªRnU%ãséš°¯ÊáE)¡•¹¢;ï‚›=8N8ÙÒmG”b#DPÿfßÇsvcÃ&µEvíýªÃò&¬ëÆÎ;ZÖ"¹¶{]ÝulɲãJ«b].›ÑºB¯Ý‘]ÏÒjÙØe³nÊd5v³¨mƒËuÑæõz9zí%ËåǪµôlóbw=º+m¤¿šWÛEÎ>ŒÝCÆûFíU˪¨Ú÷•: ƒß”ŸÕÿ!‡£ZH^\²<[~/Y26üE™§iÙÃÛ»hÄIÒkÈòÅÏUÒÞ¼Ú)’áÕ<Û{µÕ›‰zùµ¬÷ÿ_åŽg·J¸GqM Üòv‚cJ™ðÄ­­'m>Ò_K…>UpÛ<ß"EŒh̤þiz#üñ瀘ILµ-ØèwùG Ç\+·89~Ox`\@ÇDyüÕ4Žw¯¦T̘ ?ÉëÆÍ˜³©<ì¦æíéU@]5ö/6iÝXq%§UæVñ8ð¸LÚ:OmˆY]•‡>ìÕ:ÎjÖ Á¨í|ºYסó¤…ëZ(®¦ ›µ¾8<ÙO»Žä5€á(êlÝIiJœZÎ7jyÔÔÂ&­ÊUa[È~ „GààçÍ|q³ÏôÔÛCµt‰€ÄTPƒ"­±¢:¨çj‡ ’û7ã>ÚË endstream endobj 729 0 obj << /Type /ObjStm /N 100 /First 918 /Length 2831 /Filter /FlateDecode >> stream xÚÍ[mo·þ~¿‚@ †!.‡äð%°(N¨ Áv¶‰?œNké’Ó­r·²Ýþú>³·»'7•Ww·RŒÄ¸}™%Ÿyáð’Š”•Q!‘¢ðk•3¿Nù˜T´xÇ÷^%+ïYe–ç'Ox9ëpy“’"NÒF–6ÂVQvx’²DΤ¬õòÊ)ë‰ñÄ*Ëh,Z¯lÌO ôGÎOBf圑WA9/psT.˜ˆ¯ð*€ÍI¹Ü|ž•'@ŽxêÚ‰†”—¯"n|€–¯¡e˜Duspxå›,0¢b ž°bPÑÅÌò*)ŽN^A&ù*)  (iÑO$@ÖI$ØÈK;MÄ,‘ auç".`L'†n³Ô%€ŠbP:Ñ_0É…‹LÎibáàøª“D $L˜8‡ )Ë…h agÅXb=:GÆWÞ 0|Sf<Éðº(™ \9ªäHžJ WFgU‚¸p*%˜M4IÀ#0gb€r›ä« ²gžD¨ % JæäUV9Á±ÑEp7¾GX‘!±™Gà‹@ˆÞá Þ¨¸bQŒ_&‘DøØO¢G8"¤=Ä#98-ú$±* ¡%Gt xD‚"²DrÝ 1Yt‚+´b ºxøš`iÎÉ3‹wQälcUy&o8¹'8ùÂã +a ‡sWòE#Çâß\‰'ºÙ þÀçÐäÉ“IñæßW¥*Ž—ËªžßW«³rõ“ÁX5o‹¿/Šg¸øÛIñªœÕê'¨¨}@øÖF†s0ÚÀA£F˜@îõõi6‹¿Î—¿ÇOž4=dzz^-‹×Åß_½__ÔõÕú›¢xöêøoúÕÑÕªúèju^\Mg¿NÏ˧gÕÉt5],ÊÅ£o¿àÿßámûRMgÿ>57=üì´ÁXêàÃZâ} ÿX=y¢Š×ªø±zS©âõõ°hŠÔ- †èŒLÁ–5#8]$0~q­}¶»í¬š7–"£‘¹xsrüò…¶Æ$mc|´7Pä4mK; âö œ>|ÐËÙé\/—z9¿ÐçÕûâêúô²<+(g‹äöGÛÇ"P2œê:ôŠvçHÄ@Õ£±”ã ì·¢3"æ@tÂH)ážzÿú„çÙd±ËY1]ÕóÙ¢\'/ŸÙ€äeBq¸£}°ƒmdm{-þÔ;;äBGнžHò[-nñ¸¥[=¾;›u i “v4 Â’ÿme–õÖ"¸Ñ»±Z¦mïà×ìË&»ât^Í—ïªÕå\§õ<°Û?Þ¼#- °ÃÛ“}ð%–`=ú¡F¬Á2:¾kiÑ?(ÚÝÓ` rՃϤ3f -ø[2’‘{£°ûdµ°øÎ¿. 8p:N¡ éÈ‚?¹÷­0ã¤Ò!-\·EþEAwH˜[:¨½Q÷…zz9ût\kÜ"gå²-Ô³êr›±ïÑôŒ‰…)…¤Á:ý¾0}vx†t’J¯UÏ‚;&”[[õn› x½M)k„(e´uùÖ1ðÎO@‚ý¬eŽVÉ<:`Ê Zж©GÝ Åÿ>@‡R*û@qDf‰*E•a"R*jB‡š'tªÜîX€cQðë͒ʦ^hÇ~“Í™ö³×´¾^•ͨX^–õEñKu½ZNÅ{²ÅÒﮋÍídÊ»¨/‡v|m< Cïa¼Øiô‡k°ûøFEË”· %á.î†B·„Á!…®‹µÌÊڄΤ~ÄteÂíÙÞÑ[² x (ÆÐTŽ ‚ê„: Þ þqÇyJl)†ñ ¡N×=øtnV„:ð»wàN ½E0‘„éÝv¨Ô¯&íîb±Ù/ëzZ¯«w›õŸv,ÞÏËÅ{Ã<'øÈ†éT–?£D xw7;0cY˜lñ;oáÞtÿ},Yùl0ra5Peo¶lŽJ£°_ ô©ÑÞ3°ÓË2Š½Ð Ï 0®Ãü÷ÈÊIËfEf–…Þñ½ø²!Y!ðQiõž4àëï!'_’a¼Ê’sc"»ÿåÅ dÛauâÍèöÁ:4yDŸ›ñêno³¶¸w³Âø-QÈã-Dy0ÙìxðÇ4 Œ€‘Èâ@pÚÉ–ÒçA@p=ð2'ûžŸ`Ç4ArÚ'êdž0ˆà“Tôƒú)‚sõJÿøç¿”l=F£ñ³»}{›˜l&JYbÓ \(PÁÑåÑìhX…o†Ý‡ä8Xíò°L¢î°œG¡í‡¥«³ÖÂqÀŒa‡ådƒË k+K´Ž‡µ@–ÐérHXÚË9”ù©¾ªxV-ªÕë«é¬Tn#~2­ërµTvsûçõ¯1S—Šš“âyµ¬›€}nÑjò¹çàÅÖ„îåÉÍ z*NVÕìu‰€æx®Š7åÇZ½ýtl ä'À³¬Ëe½VãŸËZ£˜›•ëfcµyô²<›O¿¯>ªfÌ1F“ì€'O §“é M¨à[ñfÔ®Ñ¹ìˆ $Ùo~Ùürlï©ýµío+Ï©½ï¾ãö7´¿Ý÷ÜFuÙßü¶íú¶]ß¶ëÛö¸“oÛõm»¾m×·íúVŽ;Üm»¼i÷í¾s+Rr”ã¬Có D Ë!¬Û—ÝU«†€æ‚±;“R°#Öd Ç†i Z b9Ѓ¾mbáCÊnf "TþÑQ¼€9%ÚÝwÖ³‹j1]€Tç‹ÍFûè»ßžÎ—õ¼^”ß/Ϋռ¾¸\?Ÿz¼¬–GËò´ê}ùìj5ÿøøÝt{Ïÿ3•n~þùOæpV j¢ÔäIB`¶*ù*îÁBÍqžVc¶ZŽ.m5~’´Úê1„¤ƒ(Â@ö U¤Ül¿‹¹ÐÚm8;Ùaˆ£ž1y7]×/ž˜²µ¢¢lµ ¶ÿ`w¯F­oö¿:ìÖÉæ[ºýÖ E’ÃÔÆ)×ɲ•Tíˆ)cÀGönµ*§³‹«&)ßs]ª9J¸Å~õ{·JÉE¬þBIœäèH´šj±óÕüìûéºq•Òja =ø Ââº[1bµé\jr)[Äžìá!·J.egQv>LÁ)^“ƒ¯=PÉ¥ƒÈBNb8·ÁKRáZ3FÉ%Çx=r£ßÒFm‚’w/&·º½ãmù€ää¥ö‘±k6O6ÀïgOTâB¶ë6óûö¬Ið(gw7Îl^—ë²\}Ôóu­¯Ö׺<»nV¦ÏªYqV}X.ªéÙwgÕü©¬‰ÉÞ!|øjU^=Å?úJº{zuön„3)HA6Ne}‡;óE*µGfCWy«"bDi¯â}àë&OOȪ67Ù4I€b&‡º#¿}yòb¼©Ó9¨žzäBomp7ï>uîÁ©s³ÊÑƒÝ òw‘Æ8õ G<åOлæƒ)0Å|à±æBþ¨É'ÇÂ*:”’€LÞåà^(”Çy´è’©Äò|·ñ¼ÿ|ïfŸ-ç0¼üÆÓ]'xY$c§Õ›bŸ[Qý¹€Lâp{™,Ù;È!žsî—7‡Nåµ=fÄA9ŠZþ¼eH΃äø†åÀ³ƒ»ƒœÉ ´¾d ± Ç8Z¿ öwë—Áì²~C@zù/› Þ endstream endobj 585 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/heatmap_consensus_inc-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 765 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 766 0 R/F3 767 0 R>> /ExtGState << >>/ColorSpace << /sRGB 768 0 R >>>> /Length 8173 /Filter /FlateDecode >> stream xœ­ÝK#Éu†á}ÿ .í…Ry¿,5[€ ©/ C0Æ#À‚f ©mØ?ßy¾ÃÊž7›aÌB=P¾qI²È‡IVuõðøÍcxüùñ×Oß}üï±ÌÝq<æqéöý1îkþÏ|tóñøÛ~üôé—_~ÿëoßþáSßõ}ÿ¸þù‡oÿ)Ý–Çÿ|ú—}ôÿ4<~“þ÷çOCðøÝ§aÚ»~zÌÛÒMÛãÇǺvÓàÿ÷/Ç>Gž¦t:« ¨—û#oy]£É}»Pm1LùÓ§ë;r3 >É£[ûú$×þn@µE¿äw…×väf@µB:¥iªOršî”[{uOÛÌõ¦óé×ú ûõf@µÁØMåþçÎÅìü‘øVßy„”ëï{þˆô’íæêìÖn)à³A.^1>^@Ò›Š£pñ¢å ûÚmåvä¹Âe@±æsÀ:TäèÈÍ€ú$÷ü±a1à¥ýå$÷»Õóyaz`GnT+äS^Nr¸Pm‘ÐË»ÚŽÜ ¨Vȧôz’·ª-Z}ñ„Ñ‘›Õ óÇ7Š‹#7ê-†ü)b1àÉ×ÕËXAª#7ê“Lÿ_Nr¼Pm1ÏÝZ¥åå$—»ÕÓÚÍåväf@µB:¥}¯OrßïT[$ÄJuäf@µB>¥áå$‡»õ}7•_,;r7 \!Ò4×'9Íwª-bKù°·#7ê“Üó÷«“ì·»ÕéÚ¼º«íÈÍ€ú$ümúbÀyäf@¹Å˜àJií¨OrHo³ª“<ð€—-Ο±+œGî+LýÔåËŽD®±ÙçgßùÔ'>ò'gë´¤?·dê—ïú”¿»b¿ -S9½¿ØûáÓãOjù Æmèûüé$ÅóÇo [¾d‡8.ù=Äiê¶™â§Í¬-o@f‘Ì:#š¥ fY%³¬’YVÉ,«d–U2K̲JfY%³¬’YVÉ,U0ë¬h–U2Ë*™e•̲Jf©‚YVÉ,«d–U2Ëj›Y6‡ÌR³ÎŠfY%³¬’YVÉ,«d–*˜e•̲JfY%³¬¶™esšÌJwè„×YÁ,‹d–ר,U0KÌR³TÁ,U0Ëkl–*˜¥ f©‚Yª`–ר,«d–*˜¥ f©‚Yª`–ר,U0KÌR³T›ÌÒ0Ëkl–U2KÌR³TÁ,U0Ëkl–*˜¥ f©‚YªMfiN“Yù¯ƒãu–E0Ë"™å56KÌR³TÁ,U0KÌò›¥ f©‚Yª`–*˜å56Ë*™¥ f©‚Yª`–*˜å56KÌR³TÁ,Õ&³4Ìò›e•ÌR³TÁ,U0KÌò›¥ f©‚Yª`–j“YšÓdÖtÞl0Ë"˜e‘Ìò›¥ f©‚Yª`–*˜¥ fyÍR³TÁ,U0KÌò›e•ÌR³TÁ,U0KÌò›¥ f©‚Yª`–j“YšfyͲJf©‚Yª`–*˜¥ fyÍR³TÁ,U0KµÉ,Íi3kϿیÌ:#™uF4K̲JfY%³¬’YVÉ,«d–*˜e•̲JfY%³¬’Yª`ÖYÑ,«d–U2Ë*™e•ÌR³¬’YVÉ,«d–Õ6³l™¥ fͲJfY%³¬’YVÉ,U0Ë*™e•̲JfYm3Ëæ4™•W1^gY³,’Y^c³TÁ,U0KÌR³TÁ,¯±Yª`–*˜¥ f©‚Y^c³¬’Yª`–*˜¥ f©‚Y^c³TÁ,U0KÌRm2KsÀ,¯±YVÉ,U0KÌR³TÁ,¯±Yª`–*˜¥ f©6™¥9dVô71‡eÊ¥̲fY$³¼Æf©‚Yª`–*˜¥ f©‚Y^c³TÁ,ÕØ¬ôt8Ÿ'Gzܧ?ýÙ¢9ôבï±æ€o^c߬’oªà›*ø¦ ¾©‚o^cßTÁ7UðM•þfr(˜æzáë¾æ€z^cõ¬’zª ž*¨§ ê©‚z^cõTA=UPOÔS%õnk»R[û|‡‚zA=‹¤ž×X=UPOÔSõTA=UPÏk¬ž*¨§Jê…_/Í!õÂg¥æ€z^cõ¬’zª ž*¨§ ê©‚z^cõTA=UPO•Ô _U4§I=Íõ¼ÆêY%õTA=UPOÔSõ¼Æê©‚zª ž*¨§«ç5ömX÷üëÀH²3’dgDÉTA2«$™U’Ì*If•$³J’©‚dVI2«m’Ùœ6ÉlI¦ ’%³J’Y%ɬ’dVI2UÌ*If•$³Ú&™Íi“Ìædª ÙYQ2«$™U’Ì*If•$Sɬ’dVI2«$™U’Ì*H–žz^“YÉ,’d^cÉTA2UL$SÉTA2¯±dª ™j“dšÓ$™æ€d^cɬ’dª ™*H¦ ’©‚d^cÉTA2ULµI2Íi’Ls@2¯±dVI2UL$SÉTA2¯±dª ™*H¦ ’©‚dª Ù~þz]Ì"Hf‘$óK¦ ’©‚dª ™*H¦ ’y%SÉT›$Óœ&É4$óKf•$SÉTA2UL$óK¦ ’©‚dªM’iN“dš’y%³J’©‚dª ™*H¦ ’y%SÉTA2UL$SÉòÝ×dA2‹$™×X2UL$SÉTA2UÌk,™*H¦Ú$™æ4I¦9 ™×X2«$™*H¦ ’©‚dª ™×X2UL$Sm’Lsš$ÓÌk,™U’L$SÉTA2UÌk,™*H¦ ’©‚dª ™*I¶ç_/O’‘$;#J¦ ’Y%ɬ’dVI2«$™U’L$³J’Ym“Ìæ´IfsH2Uì¬(™U’Ì*If•$³J’©‚dVI2«$™Õ6ÉlN›d6‡$SÉΊ’Y%ɬ’dVI2«$™*Hf•$³J’Y%ɬ’dVcÉÆ~ɾX2ÅX2EìYCɼƒy%óKæ5–Ìk,Ù³†’y%óÚ"™Ïi‘ÌçÄ’=k(™*Hæ5–Ìk,™×X2¯±dÏJæ5–Ìk,™×É|N‹d>'–ìYCÉTA2¯±d^cɼƒy%{ÖP2¯±d^cɼƒy%ó ’å¦p$É,‚dI2¯±dª ™*H¦ ’©‚dª ™×X2ULµI2Íi’Ls@2¯±dVI2UL$SÉTA2¯±dª ™*H¦Ú$™æ4I¦9 ™×X2«$™*H¦ ’©‚dª ™×X2UL$SÉTA2U,ÿ£~If$³H’y%SÉTA2UL$Sɼƒ©‚dªM’iN“dš’y%³J’©‚dª ™*H¦ ’y%SÉTA2Õ&É4§I2ÍɼƒY%ÉTA2UL$Sɼƒ©‚dª ™*H¦ ’©’d{·â5™E’ìŒ(™*Hf•$³J’Y%ɬ’dVI2UÌ*IfµM2›Ó&™Í!ÉTA²³¢dVI2«$™U’Ì*I¦ ’Y%ɬ’dVÛ$³9m’Ù’L$;+Jf•$³J’Y%ɬ’dª ™U’Ì*If•$³J’Yɦ5?¬A2‹ ™E’Ìk,™*H¦ ’©‚dª ™*Hæ5–L$Sm’Lsš$ÓÌk,™U’L$SÉTA2UÌk,™*H¦ ’©6I¦9M’iHæ5–Ì*I¦ ’©‚dª ™*Hæ5–L$SÉTA2UL•þSøõœx¥f|³H¾y}SßTÁ7UðM|S߼ƾ©‚oªä[h•æo¡‰š¾y}³J¾©‚oªà›*ø¦ ¾y}SßTÁ7Uò-úÛ´>§É7Í߼ƾY%ßTÁ7UðM|S߼ƾ©‚oªà›*ø¦Úò77}©>ó–!õ,‚zI=¯±zª ž*¨§ ê©‚zª ž×X=UPO•Ô _q4§åŸÏö9 ž×X=«¤ž*¨§ ê©‚zª ž×X=UPOÔSmù—´}N“zšêyÕ³Jê©‚zª ž*¨§ êyÕSõTA=UPOµI=ÍiSoÏObRÞQ=UPÏ*©g•Ô³JêY%õ¬’zª žURÏj›z6§M=›Cê©‚zgEõ¬’zVI=«¤žUROÔ³JêY%õ¬¶©gsÚÔ³9¤ž*¨wVTÏ*©g•Ô³JêY%õTA=«¤žURÏ*©gµM=›Ó¤^zÀLx­gÔ³HêyÕSõTA=UPOÔSõ¼Æê©‚zªMêiN“zšêyÕ³Jê©‚zª ž*¨§ êyÕSõTA=Õ&õ4§I=Íõ¼ÆêY%õTA=UPOÔSõ¼Æê©‚zª ž*¨§Ú¤žæ4©—¶?RÏ"¨g‘Ôó«§ ê©‚zª ž*¨§ êyÕSõT›ÔÓœ&õ4Ôó«g•ÔSõTA=UPOÔó«§ ê©‚zªMêiN“zšêyÕ³Jê©‚zª ž*¨§ êyÕSõTA=UPOµI=ÍiR/mhõ,‚zI=¯±zª ž*¨§ ê©‚zª ž×X=UPOµI=ÍiROs@=¯±zVI=UPOÔSõTA=¯±zª ž*¨§Ú¤žæ4©§9 ž×X=«¤ž*¨§ ê©‚zª ž×X=UPOÔSõT›ÔÓœ6õŽÌ©wFRž*¨g•Ô³JêY%õ¬’zVI=UPÏ*©gµM=›Ó¦žÍ!õTA½³¢zVI=«¤žURÏ*©§ êY%õ¬’zVÛÔ³9mêÙROÔ;+ªg•Ô³JêY%õ¬’zª žURÏ*©g•Ô³Ú¦žÍiRïX»¯õ,‚zI=¯±zª ž*¨§ ê©‚zª ž×X=UPOµI=ÍiROs@=¯±zVI=UPOÔSõTA=¯±zª ž*¨§Ú¤žæ4©§9 ž×X=«¤ž*¨§ ê©‚zª ž×X=UPOÔSõT›ÔÓœõ¦þô.VO1VOÔ{ÖP=¯±z^cõ¼ÆêyÕó«÷¬¡z^cõ¼¶¨çsZÔó9±zϪ§ êyÕó«ç5VÏk¬Þ³†êyÕó«çµE=ŸÓ¢žÏ‰Õ{ÖP=UPÏk¬ž×X=¯±z^cõž5TÏk¬ž×X=¯±z^[Ôó9Mê ééC×zŠ žERÏk¬ž*¨§ ê©‚zª ž*¨ç5VOÔSmROsšÔÓPÏk¬žUROÔSõTA=UPÏk¬ž*¨§ ê©6©§9Mêi¨ç5VÏ*©§ ê©‚zª ž*¨ç5VOÔSõTA=Õ&õ4§M½#} Q½3’zgDõTA=«¤žURÏ*©g•Ô³Jê©‚zVI=«mêÙœ6õl©§ êÕ³JêY%õ¬’zVI=UPÏ*©g•Ô³Ú¦žÍiSÏæzª ÞYQ=«¤žURÏ*©g•ÔSõ¬’zVI=«¤žÕ6õlN“zãšo¨gÔ³HêyÕSõTA=UPOÔSõ¼Æê©‚zªMêiN“zšêyÕ³Jê©‚zª ž*¨§ êyÕSõTA=Õ&õ4§I=Íõ¼ÆêY%õTA=UPOÔSõ¼Æê©‚zª ž*¨§Ú¤žæ4©7Íùä@=‹ žERÏk¬ž*¨§ ê©‚zª ž*¨ç5VOÔSmROsšÔÓPÏk¬žUROÔSõTA=UPÏk¬ž*¨§ ê©6©§9Mêi¨ç5VÏ*©§ ê©‚zª ž*¨ç5VOÔSõTA=Õ&õ4'Vï»Ç_?}óùÓ/¿üþ×ß<¾ÿòÉýûø3¯ñËÃãóŸÎC_,ùÏóóÿ/ëù¨>òúŸ|üݯ~ûÛ?.óñÇo~ñýùËß?>ÿùÓ?|>w¹]f»eª–ùý0´.³%Ù^ÎæØÇæuŽSbaO6µ.´o''ÅBc?ìKëBÇœÿBuuFÛ16ŸÑÐùPŸÒ<Ìí+§öå9‰ìæ•ÒkÝTŸÓ°{ó`Hõ9¥×—æû{H4Ì/wÓžž›Í+%Fú×»i[Û¿tó–¿7YÓt,íç´,'å9­ó°üñsãJë˜?C«Îiœ·¹y¥-¿v¼<Öio_i;i.Wšç~l^iOP¿žÓ˜¾v­+¥ Ž>§c§Ö…ÆtM9×§”žtkûBÛùÒX=.÷ô¤k])½/}­÷Øü¨Ó‹uÿrFÃз¯4õç%Jy'­Gó Á8¥ëÁú”ÆaêÛWš—n+NéwéÆMïÏ_¦ó ±˜¿½?}Í¿[¥š¾6Lß»i®¦/ïOO—þûQMo¸íé]À\ï>¾?=]þõîCÃôôžçe÷þíùS¿žï{Êíß¿ï§aJoOëùóûóÇá|'YÎÿî›Æt¥ûr5”„o~›¦õ|oY¬´õ/OËÆ Ó úç~Ӝފ¦«Ýô†m¹ÛêzÎ7ëØå×»7þf¡|ù•‹÷_†»ùCz£¸~åap;ÿÈWÚ÷ûùãÖí_{ÜÍOt‰~û,¼›>§74˽wÓ—1ÿ^É[î¦gD{ÿn§§þz¯ïÝôtY3O÷ößMßÏ û—ž»ùGz+½½ý"x³Ò˜ß‚Ìï¾.ß-4ôÝòþ¥ÂíJ{þg_ß»x¹['==úp¾v9u·Ò”.=?ÈùÊÞÝBóÔ-ǻלw -C¾„}÷2øn¥ô<¦·/ÍoWÚ»¹ûíÂÝJÛÚ­—‡÷WÞÂÜ­´§÷ ﯽ­º[)=åÆ÷ßêݬ4õC7ï—ÇåýÛÏÛ•Žnûx„í-ñÝJé9×_á÷ïÒïÓeÅq}`Þ~pp·Ò4çwØï~˜q·ÒœÞï}<Ä¿öËÝJéi7\â÷úÜ®täYÞýên¥uË—¤ï~4v·Rzgp¼ýaÝÝBùÛ4Áo?<¼['½Q¿\2¾~–™/N/W¦kzEO¦×³¡ó+Óå\púË÷†Òÿ¤vó÷š–´ËË”¦D»¬cÖ´‹¦´ì²õùÑ×´‹¦4í²åo”µíbSZvIW@cãmÑ”–]Òh›ÛvÑ”–]ò÷zMÛøœ¶}¶üý†Æ}lNÓ>CºÞi½=šÓ´Ï8æWç¶}4§iŸéüîQÛ>šÓ¶OÒz{4§iŸyÉ—‘mûhNÓ>Ë”¯ qû `³ooC1§iŸt ºîûhNÛ>{7¶ÞÍiÚ'½n­·Gsšö±V¾mÍiÚÇþÑç¶}4§mŸóŸdmÜÇæ´ì£0±iŸÓ´ýsfMÏSŸÓ´ýcCmûhNÛ>ç?Ò¸ÍiÚÇ~QÛ>šCûëæÌù7‚~̱_ûŒç>ë1sšö±_FÛ¶æ´ísþúÇÆ}lNÓ>ö ×ÚöÑœ¦}ìWµí£9MûØ/iÛGsÚö9ÿã>6§iû‹³mûhNË>ú«jMûøœ¦}ì/‡´í£9mûœ?ŽÝ¸ÍiñM?Ùä›ÏiÚÇ~ä¨m͉÷y÷»A“½·>ÞןØÿŸóO<äßR;ä÷szwßýêw¿õ·õñ­ñi{Ÿ_ð·ü Ãù‡Ù7Ÿ¿ö­)8™uΟ1hUÌljD?‘õ8Üâg>[Uß(>0yëN÷üŸ<ýÛË%ñc×çL[þFN}CâLJÏIÇeÿÙo¼­šÏ¾ü '¾&ósIo=÷ág?[5ŸË绢Ÿ´œûóG‘ÇôÅHÿ±e‡1ÿ`Æ“’5ÿœí|þ„`þ¢\g­ç•s4+ú¹BŸ•^÷`¯µßþ¯¹ì{9k_h¯è_ñYÞ®cÎÏ—cËOß}Þ®³¦o×q¬Ÿ»¦{æ:kÄÛuœ÷üÞç3œËûpšðvçCh=¿^Sú:_gñ×+ú¹hŸÅ_¯}Ìç6¬Çãã'Ù}ÖÍ×+øùwŸE_¯ÿ÷ƒ}˜í‘:çŸ[Îöð»È÷“·É]ømàÛéùŠà9=üúýôé2=ü>îýôõ2}oŸ~<§W Z_(Çjóÿóš¾lÎ?ùf*~ûŸ?}ùá§/ÿýåñã¿ý×ßþãë-¿ûôé‰t endstream endobj 771 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 586 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/heatmap_consensus_inc-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 772 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 773 0 R>> /ExtGState << >>/ColorSpace << /sRGB 774 0 R >>>> /Length 1060 /Filter /FlateDecode >> stream xœ¥VËnd5Ý߯ð2YPøym³œ "4¤%£Yõ BiÈ>Ÿãzøº#ÒDšEÒ÷”Ï)W¹Êàî\pîËöÎ}q¥“Ï®&ÊÙå©F—j Ý_ŸÜoîóöíÓ¯?¾qoï7OÞ{·þ¿û ¬µ¸¿·÷œw·àîð÷°…Ap?oÎÁWõ®UŠÞ=¸ÑÞ]Ôƒkºw5Söú}¼B­ÙX¥05òÍþ˜'¸ŒÀU“©LüÍ<™KÆ$Ñ,ñ·{0V!Ub¡9æiÙ‡ •Ô(D J¾:3»Q)Çx§ºh±oa«%Qχ6ŽØ¦oFÂÖ¹u\ãRí·æRà!¹°'Ú³äb–B?¥QÄ|ûN Ð 5âùö@1Îñ=R>´†Ø·°Õ)ì‡Öst曳mn׸D{·æÒû(UôZ•\Ì’(üø±ÄÑ£Æ?q4€¢1ß µ~Œ—Ñ8S«ˆ} [-žR3í˜0Lߊ„Ís«eÆÅÚ˸%—˜ã¨UÌØ's™–ÀÑå4ê<Œ!ç2ú@Ï—÷Ñ's¼ŽšZEì[ØbIØA~jS¥tø$l™ÛÆ%.Ó®qk.ØH¨U¬R\ÌÒ©AÓöQçØy”[ } ˆçÃ&GŸØx÷£‡Lkˆ}3Û,;µ4µØùûá[ø–¹m\ãRí·ä’bµJK”8—iiäq4bSwü`ÓÆäRò£ùR £Oæx=dZCì[ØjA åЦÝô͈Ù6·Œ[\¢½ˆ[s©~Ô*ê»äb,J–c¾UÊ;P} ˆçÊ>™ãeôÐÔ*bßÂVK¢Xm$¿øf$l[Ç5.Õ®qK.I£V©ãoœË´äݸ¹PçÔQçTF(:3»Ž>™ãmôÐÔ*bßÂVK Ü­§¸øf$l[Ç5.Õ®qk.¥ŒZe”[ïÄi‰ã†ËXbÔ9£9p÷eœ’Ùâùp’¢Ol§l8´†‚Ýf‰}ܦE+•÷ ñ-sÛ¸ÄeÚ5î‘ Þ_÷<Ð N^À?»NP¸s2Ab#(\ r&L‚À… Íi… á"ªäBxsÒU8?ýÇ*<ñ†ú÷ ;ýŽË™t@þ è…SϮӣ»‰·îô°}b×ÿ£Åí‚-thóëµ±ñ#éÐî¯×¦½_ÆÜ^¯Í%\jƒ7±> 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 788 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ31Ô35R0P0Bc3cs…C®B.c46K$çr9yré‡+pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä00üÿÃÀøÿûÿÿ üÿÿÿÿÿýÿÿ@¸þÿÿ0üÿÿÿ?Ä`d=0s@f‚ÌÙ² d'Èn.WO®@.Æsud endstream endobj 806 0 obj << /Length1 2171 /Length2 17623 /Length3 0 /Length 18910 /Filter /FlateDecode >> stream xÚŒõtÝ[÷ ǶÙìØ¶m;ídÇfc[Ó¤±mÛIcÛjcõæœ=ïÿûƸwdŒß3ý¬9çZäÄJªô¦@c3  ½ =3@T^D‹™ ÀÄÄÊÀÄÄGN®fåbkö9¹†™“³Оç¢NfF.21#—Cy =@ÆÕÀÌ `æàaæäab°01qÿÇèÄ3r³2È3d€öfÎpä¢@O'+ K—<ÿùP™P˜¹¹9éþvÛ™9Y™Ùä\,Íì>2šÙT&Vf.žÿ‚ŠÏÒÅŇ‘ÑÝÝÁÈΙèd!@Mp·r±¨˜9›9¹™™þ¢ P0²3û758r€š¥•ó¿ª@sw#'3À‡ÀÖÊÄÌÞùÃÅÕÞÔÌ ð‘ *-Pt0³ÿ—±Ü¿ èÿ>3óÃýÛû¯@Vö;™˜íŒì=­ì-æV¶fE 9:€‘½é_†F¶ÎÀ#7#+[#ヿK7H+Œ>þ›Ÿ³‰“•ƒ‹3ƒ³•í_ÿ óqÌâö¦¢@;;3{g¸¿ê³r23ù8wOÆ7ׯènïýdneojþ SWFu{+GW3i±Û|ˆàþÈ,Ì\ìLLLœ\3G€™‡‰%ã_ Ô<ÌþV2ÿ%þààëít˜Ð0óµ27ûøçíläfpqr5óõþ§â33ÀÔÊÄ`lfae÷'ú‡ØÌü_ø£ÿNV¦ñc0ýõ÷ß/½ 3ÚÛzþ1ÿ»ÅŒjòêšÚ´ÿ¦ü_¥ˆÐàMÏΠgag03s°8?>|ÿ7Ž’‘Õ¿ëø‡¯´½9Àý¯r?Îé?%»ý{¨þ½ Ô€ÿ¥ü˜\3ÕŸA×ebg2ùøaþÿ<î»üÿ›ò¿¢ü¿úÿ­HÂÕÖöo=Õ¿ þôFvV¶žÿ¶ø˜\W—-~ì‚ýÿ5Õ4û×êŠmMÿ¯NÚÅèc„í-lÿ{ŒVÎVf¦JV.&–ÿ—ÉÕÿZ4[+{3% ³Õ_W €ž™‰éÿè>¶ËÄæãúpþ˜É¿UfËó¿)ÅíM€¦mËG‡œœŒ<á>šüØÞÌëhjæñ÷ì..€r¾s Ü_å`0 ÿ%úâ0ŠüAœFÑ?ˆ À(öqÅÿ‹8™Œ3€Qòb0JýA¬Fé?è#ƒüô‘AáúÈ ø_Äõ‘Aéúˆ©ò}ÄTýƒØ>Váúà§þ_Äý‘ÏèúÈgü}ä3ù/bÿЙm?Úò Û_;»?þõ‹Ñôðƒ·Ù?àG‘æà_ÈêO|Ö¿ Ûsö¿ô@W§ø˜Xü~ä·üSÍ/KOK3ûX|Ȭþ?ÈÚü~0²ýü k÷~ÜŒB±¸ÚÌß?ôÜ€²8ÿGýQ½ÃõÇ9|ì6ð‡óñV2:þ~°ùWæÒÿ¤ÿP:ÜÔ]þ¨?jq±t2ûÇá}Tïâü‡Ã×Àînÿ€å»ÿ£3ÞÿHÆòÞóðƒš×ßðÏÄÕÉéãùùûjüØÊÿà¿ß:333¸•E  o°u]pÇc0¾;ýÁÿ<ùf:5½÷ŠS§ë3t uuÖ—-§{á”Ñ>”õ=qª;¡U¢7ï³Öè°¶$åöŸWƒ•Ùƒv¸å¬¡éÂ3áúABXz5¡CŸ7G@ðVÐnò-xmT¨±8÷à’ájã‚ß¡MÌRx‹§Ê`/y—|Þâ_ÊገY H\ÕÀ%ñSÂq .¥çÏ ëF'ëÉu7Ét²Õ0™VPPÕÃx‡—Hš'U‘Ž–dXù?½‘ª&jšÒvö~ê9¿Tï¦ñIŒÃáaŽ9š²ûtϾەíÇñúÅXn4+)™b²Iºª ˆ57©šï+®2êÓPè­3ø;Ÿáû½5¸u˜Ïw;ÝMžx.l¥©c¥†ã¤«‹·¢îxËQÆŒ;Ì ƒ.îð½–wÖ¤&Λ`:il¤‹òl®™ô-¦ ;gu0ÍågS­sb‚ÙAA¤ù·ì®‹2Á5åK´s¶ 3•(©x½ùH† ƒ™IÁ¬À}®Ëà O³:žk¡X’¶Ž]†>ãˆQãüú¡ÿ"[L£í-ÛHâÖ‹Ÿ‘æ× w9#n 4%˜^GË倯SyX=ÖnU³Ô!WzεŽ*$o3ÕÃ!¤¯ñf—=„Í)OoÚ²þJR× N™|â2u/_yñ·güÎJ4ækaädh fa¬çvá\Þ?»É®ušéºÂdÈ]+;Æòi$J /†à>qu@lRRœJˆ5sK’j´= ¹ÙDŽº´0ˆøx•wkXeòæ(Ô"(Ê1r=ã’\ÃÌ¢”J ¯rv- ”ç|ËÆv9Ou祙=·e‡ï†—@ÑÜfQýDü>VÈBÓxŽõcÒ?š‹G+¾-ð§­z9tK°tÁ­ Ž{9Þî„ ,…ö‘a1îlin×f ‚³©”™Ä÷4J¬çÃcĹ™@5Sî"FÛ…Q(_BVub'ŒÈR-ê˜Û_Í‘¡uS ™N`9/>©Lë£R}}•öF%'¶sßdi'm·wÚ!ó‰ú=«†v!œ¤7ã]®Uløû™mA2Ž©bÍGé‘EäÔb½Áý—±MDM<| BE±¹5o¬© i¼- -Çy9aŸØaœ÷Ó*ÍÓæåEî,<:ªò>Ë÷ö‚— ÊûJ\]Ã:=å¨à žc¤ÝÖ>[\{&cîP;½Žëº3ÆÕ’"ÝÏdx:´ê⑤C-ÑòùŠçTˆÓu b¯;rÕ»e8ºw4;B^¬”Åß)fR8¾_³¤­CEv“CÒR¥Ü~µ 0¬ÃÛzg¬K±¡BMŒ³IGq¨Fr1¼×?éÃÙ]¨Õ• ô;ýŒnp_:žØðŽ ó‚nBÞƒìG…A¼ 'ã¶äŒ„ì›>Ìí¸è~8³í½—ÇŠV5å<•„*œûH¡Lßïðåˆ2‚"2Cž¢Ž³µ5ÕE{ëB׉Ð߇=E¾¸…¤þ MW5r7áùê)_MôTŠXlt=]»Ü/skÚä„ó±®ÎîqÐû³ÜÑl¦¾KRðò-W¡Ußã’Å ¸QSéqX:€u÷¡Þá C¯‹G+ f)ìU¢xïgÛ‚êᆭa ôf2ðGõÃw¢ñ)Ðþßù‰Je÷°Å­í«¥I<1´ÂðÖÅš|):òÃûïlŽ­²;úVÎQ@0Ð=j¢ÏŒ[]ûñ¿‡ÎÖ&Žè2®4Z³½zR^„MýÛ%?Í# ñ™Ø–]M7}òR•j6¯•‹)á€ÈNpì!Ò[×›Ñʱµø>Öi“¨÷™zÂiå’‹òªM`k›S*7¯Ýt ºÃŸr ‰Õ ®m·i.¶>Wrt±¬¨\Û/Sô( .JQEÞgòk‚©Ì£îç2¤rIÏäf6S*”-…¸=‚o,Û'ÝH€žÍH—\Æ#èÕµð?ÿô£Ó@c_ßÿžæÀÎãŽÊì¡‚à'¿îÐX ñÓ{^¿HSŽ1WÀLë¬âb†|iMgCt%Úrñ.šœCìvzõ°ÓU)Bžßþó¯¯ð}Kq_¡ùxýMéªõç9Š̳é”z¦J|®«l:T¸Ú8o? XÁ‡C…7Õšô»ƒë³²æ „Úk,ÑŽ³ «uD$º6éäÈØ©du£7ˆ˜tÐÕÙ=vXe(w}¿4Ⱥt tz£ßBÒÍÕyqÙÞ£bêrp•¡¬[%>×'DBY´‡Y¤m7×‰É Õñ0z:,#ŠJÛש~dXîŽ[—rë»kƒ Šé; ÛŠ8:3á‰Sº‚±š.ã|#!Œ¼­1$‡*•v}U¹™ÔU÷¥™â±ºN#šÌ½ó³‰Àä¢tϽňj‘‰ÈkÝ.¡U‹À“èiA;€¸£ãJrð-›þâìØ.r÷¬XnÑ+7'Â^aKÏŒwåhq&Z¹6qƒ!½ÓªíJÍU»#è—Lœœ}‚•¶åÈ|9QP‹98{cØðg¹¶Ç8¼äa§#kvýnð2zä£JN3ÌíŸñöuäç;Ó5蟇R\G\ýS?­A„c³ µDíñ9’hºˆèòæ —-r\ñÜ l."!ŒÒhE•ùëÏi³0ÀaŸ¼+¢³¾ ÎÉiˆgƒ{<]rc¬èuQ¢ß®ÊP¢aþ›5IíÊH…¬M ¢2;vDÖ˜tP™õø«xè±õ%r5rILh½@£ûɆÛKýŽ6Ûiм³àœÕcø´Hƒñà®®l 7’pyÿ¶6ß“mÙTµœè~{Êm áXF*Á“gƒ‡èÜÊP.Å—nõ’ß]é¼p'¢ì±ç1l |„ìžžÃ51A¼Ò1@"4UæO<Ô^†ÔsBö-CƵçÎohnÃ*®mL丨ÝU 41 ¹/> ï £y‰nF§Ûªi¼œêä6¼à{r""†—.6…¾°â}ȺáR*ˆC“$§Z(5a>ëžÓW®~ʨ–å6ÝnlÐó…y ˜'h²šmSÙ\7%Éþ}¬è± /¨ Ÿ_õ—è/V¨|Ó }á’~%hZ•cÎãóƒº ”ãùMdiƒ³U./¯P&&»¸ê4Ì+ON¼ˆ«à ŽëmÆ;£»‹ÿþõXQ½rÎÑV®¹Š®Ì‹xQχ@îaKˆ_ ·x[‰ré'b¹Ë¿-ÑP°E¢۪G·ï?_+ädFU‚d+qD3ù™óu%fuÙ°¾ÖAU¼ÅÊg<êÉÅDæË˜ï ŸSžÿ)kŽÛytƾïË JÓl™; Û&ÊRH)£ñ¥˜Ÿuõ´[q>ëñÛ†$£ƒBP9r á oe‡KÒ!"hh4ŽÃñ)Â)ÆSŸ¯»üWLTFoآ銀oL Æ¥i{ÖÄÚ{±B|Q…‡ˆ_îß½<mPÿ~#©¬]ßÉæ£Oïõl¨Ûç2.aVX ALÀÒ|©²÷޼’¶ypùPk®îÖ‚%žˆ`ó€}׃A(¥9ûÇ’rÈžcj«œ?ùÄ×®vß{#4ýD žì>ãþâ?2Ûc0%F8døýw ½;®¹™lÿF ,O€îs¡ÄËzr!è×\rÐdÉ~ì6 ë.: K,uŠ)ÕŠ2&äÓ üèòtÕÊI‹.ݽ–¾—ÈŒ³YZK.†0 âÑâÁ„ßl¾´ƒ£·ùéW¦¢‹ù¼÷gŸ$ºj¾ j“ 7$âä—Ö_Í¡˜9Š· ƒu«È•Á~y]"óYӬ̈š¿eTR¨‡ÒŸIa¥a’½Û<x[j¦ö¯’9‘· ™#cæº1è²(ufm䤓ÍÎE^È„™jŸš¦Î;L gÛDxFZg&í¶•§¶6ccJi™d+=,ûE43¾Àýü²¯_4Èö†9ÊA8ŸLmM¨ø}Õ0`„¨ô|‹ÑÏ+Ÿ£àFßJ‹¸ƒ9.'/èæãsß-á·Lž_{·ªPò!°¹Çògû&ñ~êìK£õÖ¿,ûݺ8ã—‰ƒž¿__Ð^|o:kÓ7ëÖ–ì°/ä) Üœ S×d^~ñú}½‘`vrýr {Üžgõ½¸¡ç0 £%j¨i"õWj1ÁÉEEîŽìjs6•{–²«ØY­ÖÖ DwÒOÈ*^ø0Ú®ÔŽ;ÛÞ€gô{¤;VË=Õó­Ì#%ÌmT±±ÁD(j.˜ùó˜$òÅ´¾ƒxe=¾À ó™(¿EóL~ǬÎf ™ò 1bíµ®Y1üÑ9“Þ‡Sª¾-œáx†ìc¢©“VDV)¬ðaR™¸»>p%ÎÇÄÒñOq*´-&ê;å„jj; T9ÔDM¯â²ú¦kä =$?ßU£dËr)|8ÃÜ$ßp—3Ÿsȶ5"fò»–ßmíæ8Yt¥Cý·Ó¢ÛÖA&»Ï IÂ…ŒX©àòàA8e8ë‰ ~ì0s–,Ê6xшóâl=Mâ É?¡ªRca{öb‡—ii¦Ék¬ÔøŠ–N>MŽg[t—šSÐè./^ýÚæÓe8XkÐ*À¬äHN_öïH¼oä½.Ú]'Þ×¶Ÿ+ØSͯd§^©¼ü[èÈÑ£}ØWúeNMyîöÊ9]Þ+.£á?¥ÃÝmWÄ ~îäFcv>yÎÛà¡?w´®”>‘qR‘`Í©ùý”4³~.j:yi¬~t¸MDC’ÊÛj[g_ºXS˜O¨åx/“¿†ã^°ýÄ5š QmL²ô -?IÁYŽýndê$AŽè—k$},(Ç¢…Û3œÜ!°H¼ºe¨ÀOšºA–˜Uëfʽ DNùáÍû¡7ÝeÊ,™ÿÞdH—¦X8W8½—„UyÝg£noì°Ôá¶Ö]ŸK–9ýœƂ1ùj d•³âT€Àg…¡c=’l2ð¦é&[‹;²Vé¡¥5D & ጂí¹_G]Ø/‘1Ùå¥UýÔÔEH;v0*Þ‚ 9qÖ£H«^ÛÕ˲ùuÑ§Ú wåy¾iðný8ž®²ÔÄwµø9ѺãÄØ\Þ‹iÝ»îI¸·)û3¾ˆÁ®*…H*›‹Œ­C°Tsxk2ˆ‡ ù“—/Ó´•¢¿nkwHx…ò„–€KÈÓSYõÌu õ*yZËë=Çîd…Õcé6ÂJ–8¦ÒÙ5j&Ñ4ª~…ß G´VKð—mGPÊ„†¿¦©çÆ» r|ýì±ÍúÓÙì#¼j[»¥ê†lë~ u &dÀ§€¥ç2¼ˆ”FÛãçküšwoÐ3iïC €ªÃû„:Ђô„ªÏ›ÅàÜ¥3“”u§Isâ žoK˜îÛöHD«¼È­)€!ágYد‚±} Ž¡§il u\(ÔqjE“°ƒ& =h%é*ª­Ó²c“ÉWº¬.Ò©^[Àè5æ1…DVÒKŽi-s^k¾·¯ÏÌŸ.ÕœE\eì1Ñ MÕ/¨m(¨ ÞbG®]µË”{xúµrᎸ:4ø ¶ ²_Õàþ&Ó¡v~S0åË&­žÙ>Q/—ÿAÅ5ƒø)ÃX¼[ùL í Å…¡Ïœãï|1¿_cba8—æ ßcÏ:WÑj)Þ°Ù‰Q×8¡Ê3A !øÀ/${/|À’‹Öü}?ç¡ÉBŽPÊNq%½¼,ωF)>¯ ºå…Ø7œ2 —2º<£ˆaµ6$]2À•£¢®Zâ‰ÅrºGkCœ”D^u»ù3Ê`8.“bU‹ÏqžÈ7îíÍeTI¤á8*£;~Øp³è´hþ+X„¹Âwg:ÙùBâãGW®C }CêèÄÆRÄ|´)/ö âÊff3Îâ Š£8žôÕ,‰»Ú3~&R7ýD‚¹Cª¿-3ÊÄLÃ܋ނ¬.s¼G$E_üå¿þ&4=Úf#Y%K.:7S1’*œŒÜwÎtÔˆÁ»äC0),µÎèt?ž0JÕ‰5ž|å‚BÆõ½Á,u{vuß<õ|[–29øò(c 7;=ð ñ"æÏµ«X1¯)³x)? ˜¯J]C!™0¼„anQŸŠaØ’{2Ò_°kùÜgA™ÜÜpÂ6Âi¼¬¡º…XQ’‹¿¨§Ðøg/3Œ{nòÓëÃWÊž˜EO± ~RlDýæDÙ2Ÿå3¦|ñîª(cì¯.nB1©Ò̵þB>V¨ûC—-å¢R 3p‰ñ…AC¦«ÍìÎíx?Ò•œÎ ùg^‘8‰Éc¾Rîé 'Y|¼†±Wò¼¶ö5o^ÖÖwéÞ>–ƒœ½%BÎù+êe]ËüLò¥R¨Áf0ñ•]?ë8M&ø¼À» ¸!¶Üt>/§Ìz¶–ê/¿ç®':¾z n›Äl‹ vxšZ(­N©jÃO KÛ odiû|[ãótwÿÌ딂ääÅJ-Ý7yÒ`óU‡ºà!]Ï®s¹Ë“+Ô:¾£çWmÛ_¿Eá]k0d Z‚û%¦«Ôù·¯u=­sï8W´lIþ|Ö®³T«,Åe#Õ€Ž&S4 [ KíÒ‚¢1Ýéðx”8'ñz±=Z)QàãÉ÷éº'µ™é/© 9Å^¿çèê~¿ñ‚¤¦ûß—È9z2¨RZ‚ ¥Ò“èÇÅYÑ ùüh˜Ì]@ˆÑä&J¼AuS!dUÔÑ ¹jDýP3”(ýül}ý…_† :g ,/¯ß×ÍË9(‘±¬ ‰ãÜ[–U AipÒªFÇÞ}{ ¦âÜÅtøÜeðì«Ü—,t6œœ,P <Šìlp¹m^¾w”ÝcQuu³¨ZªS„U‰5äŽ}ñ˜%´{ˆÜùµ`*!áûb‚à—jʻͧÁ4©:õ#„pu ñ>ò鈀£b³.ù~øšy›¦t.>æx`жิ(!Ð>¾ð8c»¹’e—F”aíÑG=>!À\«bm²Ú{³rd5î+F¹²œÅÄóÐ@ß ÀДy”ļԷ¿È‘{bqâ• C‰q™¦UÇ¿¦ ÝU ΢€dc”Z¦0Š{  ØíœwFÔåí02iã¸n0Àõ÷=Î!ˆí);’ì>2HŠ+›I…™,QyâÐæª±6cB„eE¤^ g,‹£NU· ½÷®Ç+Î_‰vi€”k^éøŠ£óÅ7 yP”™èJ9þn=ì“ ½–ø¬Âᆕô"qWX?ßÍÎDðe¢{;ë<¡‹-TJ¬˜Û8¥úlÏ=ªèÞïtÀ3{`c æÐ, Ñlÿ¬’s ¼ÅüØA‡VkîªÝä †$CaÈïûƒƳi«¹üaKM3².xülO:ŠE×(áH›~ƒpæ×î¯ëmÇk©½:8²Ý½CÌ|דÔ só.Î"•µç²ÔJ,vû¶½¾?êJ¾à…@u=ä ’)ÛܹJ8[ÑöEPÿÊkNêeEzÛHBŸ÷NYt)ku@ª4^°žÉ‰ïÔòï|N Á1’©=Y¨‚X ¡´’¦–nôL/ÐÒš¬ç\¤Ž—)~hnâ–ŽPm$_6»x\†-c¿Û¨(Œ~턚Nƒi“ÙU¼¢µ0-PoºQE”CÒçA‚ó;U¿ÒˆË²åOT?†Ào¶0Ëà²ÎÝÔp­`)º>@¼‰F…ÇÍ3JÝ:0—¥ÌóÚ´¬¤í@keà ÍlyRÁŸÄ¬>šÞš¦KE^ØÅùéϺ›¼ê¾:H-`5þ#·7‘)ÜtîH Îtu‚×ÚtŒâ4Âa½ðWL¾’ã9De“òÜ2C7:Î.G€—kÑÝh¹iF¤x ¹X>a¦ÒÖ@lö².—vŽ•M;”cÔ£³~ú˜4ÿ)„(¹åü¤ˆ+쟟Ÿ¶|¦é/$»ójÙ·Ó ZüÓP¾|–¶Éê…jY‡N ß~p²Êݪ]²•8û"½OØkW(ø”g3_êÇ3ˆÁT€£Çäü=î¼o–€}}NÞbs~°òŽáâÀï×鍨ŠC3»qTW˜’ý;äºÊ ¬äo¨ë8QkxÝ`©$P<»q/,«¸U(g¬÷Ô™¼×”õúð´TôUiíÛØo•^ocw¸ Ó¹n2)Z Ææu¾6½Ç4cDà7öûbÞ©ô–ñŠm0=ÛFU–7—«ùëÞe’Ì® Â«l^6£0tcLv²ƒ,ƒâÁC(ò¢Àç5 ®`ÚP”H݇ô‰“Pâ`º¸Ð5zHÈ8Or¦~Œös´Åúý²WÔ†uÍkìâÜÜpe}ÌnŸ;ý˜n N´Ž~ î9 c‡¥H€‰z²Œ•­>FeŸÍ]¸È ¡¬jžœ´@¬£ž‰òâÖ¹ )®œ´úeñ¢7ÉÐÞDŒ°ŸŸ4CÐÍáiE†G~,ŒŸ ”Ùk!œ¶A’§ßíT4æX¼7ªÝÍò[DÚ‰}g’â%~ 1 ªÈ;FûÞFw›<ß|¯Fxç[±Â&ävÇPáŽ;‘kA5ì}Y.WFwÑH“*?‘¨\~þ Ò?zïNj&È^­ôn2¹Ïq ý{X}õø¡[ºýŒí3"QÅsþµ˜c Vœ}ɪ_!ÿÍCîï _j›iø.a1k,åÁÏ@¤1áb4;tó&¼»@] ñeRÒ·!…ÛPÚ†&T®¸¥Ç§Ù08ãˆé·Kª+¼5n[4²‚l\|®NøWt‹Î„m_鑊4Z’ÍOù#å†_ô“ïЖֽÔ$¯Á’ƒ¡ªâYÛß§ 8-ûk¢¾KvØÞÖF¾Œ—`¿\ôžqJÝL½ © ?ñXÝ?•aÓ­ãP»ÉЮ"Ûâ“ÕñÉ‹½ènÇ?ÌñS­ípÁíÏ:  7ãÛåYä3‰²„è·;•‘ ;£¾HB$CH”™¦epÖoÈ쨅7•‰I"ùgÐ!ê‚Û¾ ¸wQdïÕõ ؇eq`p c½M‘W¸†û%S&˜@#÷ÞÓŠÃðNôŠø 0Dùj€»õ«}é(¶…v¡!0øžŒ†7SXH­5h€$‚8UY¨Ã+ºõåØh«ƒ«Ñb},s ÂW¹»UƒÂÁ„bS‘q¨ë(Fbš"§l‘ K¦Ÿ¨kÝ„„ùĘ5mj"²ðÆå®d«Æe—¤IÄ.òν¨ùg ®R\óÑ´äB:*âV Ìb;‘8V¯×*­p ìÚ;rLˆ}^¿à=E¼¢íëøc,Q|¿]Õmv¸”©ûYí×áñÙ ¼CVsÿÂÐ&ùÔL§&OÿœÆ†$@ˆç×éÍV‹”x2RNs8·³z¯É!» ö"Gçõù ·’ªÒž¸©3ͽË=+h"“ăeùä^Å—¯¬¯²Ò<¾­IÜÝ%¡[†‘úVÒ­ ­ã‰è¹ }ȰxE¨s¨ýï)²#ù¥qXÜleáΰ :Õç©=øŽèÚc'#°†ZV÷šQÄK»çŸlZÐ&¤Rí2®KKè5ùTá8•Pd¾È­ïˆÇdà”¼ÓtJH2k_%ê+ϪuoKZP¿NÀµ¯ö͸Ÿ)…‡Æ…ŽÛ9õr|rÁ. >rc÷~îÑO‡c!r:ë¦SC.§ËñÃ> ŽíÿÑ€S‹ÐËu¾½´«0ü­¦Ã#[73ÌJÝ;ÊP?3P(=á,—Ó7Î ­5çJ¡¶²Y’Õª‰ª'°ßhš>’ [ E Vãè¹²­‚¯6\ˆ«? /ÀX—Ѳ®¾¾'—Ü•ó»K"#kJ{‘3Ê­DY^m-ù&—‹è‚YDÂL¾Q§|#í·s:‹¾‚ø¡'pnuż/„q¯î{mÁà™%&€º·!‹™.îÔìj‡ÒˆVEg¸†‰ˆ °ÎÏÞÀ»šF9©­ "‹P$e—ÆÜ1õÒݼOù„=sΰÚAN£õ¿AôãÁÎÕå»T]4^,ö6îVX;‹F—ì܆@æáq2.\° û7冂Þ…~ÿôsæÕ™mɸ×Ôû^/”† Îð@ô½e24+ÛÃ}ÚPO‘#Âþ ÓL´ Ö§|¬6?TBàJ`ò§I !  ì—òEŠK8}°µÄhh¤#ë™î–ßo¹³lÐéå5}H– çód¾Ä³×8Žw 6àf…ÖAŠe -8³ ž]T'»’[áa´•G¸ŽßÇV-n«añŒjík­%aÏ€)ôª %È@79ú\ ¸¢" À‚±Keóè‹|•[•1_Î5_–ÂKeüpævë‚BÈiTv|VTi³ó×rNæøžÍOܸ'OV~4¯RYR21EŸ'=;JÈØO <ÌMú¦¤i-×Ì} Qæ_Ê!’~9Èãì%‰68³—zÓ¾áÅạ ^v¢MhÞÎÕÿ1 îb¶Ú*¶%C†KÑî3°/}‰¥ërÿzK"̬‚§¸œ·Ë@}¶\B½…Y(ޤpzeý¢ŽBçÿ KE…²Kñ¥Ð˜¨ç‰Î ½3{¹îp?œFJ‡¬V„_Î,ÛU×_÷æ¬a.Ø4¥"özhö¼ (3`%hÌ8É»…ÁN¹}þ‰ îA"y{ãdÅTq‡ç0¯göfx¶bp^Gw\K£‡Yƒ÷ ³ù—Égeã©Våp:ŸC¼¦ :IR“[Òâ˜Á¯C[>»ž›;¢ ½qK÷0¾qðèÎÍúÈ!*Ï4…^)š ŒizTbóNT *hxÒœO7 E„KÄ>¾0À¤ *²œ9èÌ¿û®’†6M\ .Ù‚©ÉfKT6µ>:9\;…â…ìU ™¡ÈÓç{“BzšËAŸÜLÈg%ÎØ„¯6@©‚³ÄÓ!ÇßOô²ÆÒå[J2éÏ*NòâæÒ¯·iUý¶Ë uyW@\ K¼¿!ÁfXã!ð–d1Žâ¦<š<­fÆ„²ƒf®q ^Çÿùó Ùï®ÒYÛ¶ÙŸFyºÞK˜S¹ßjú“IF i7m98·ê.£tÞs7¦7”½¼œ:qSz­êìá;P[¿gý‚˜”¼íèT+¶Ì_§ã¢ÑŠÿœqH¹È=KȇVɦC“¬ÑçÏSŸÙw~­þ­^´“çW.wù7nLUOpðZ6¾‰“gâïúúwÊ È¸‚ÆžGŽÍùNuΩ ^wC6Øü»¯n%ìU Ÿ9SdÂî\‰áD§¤ØD=¶2} ¼¿L„%Y–Û‡ôÁ¾ú^fÍ<»]ÞoyÎ8d/ /‡ýHÈPýrèú]9-^/‹@9=à"?ÁjòKblAþJ¢YWwä'ƶäz»%¼aæ5“i=¨œoqVª:ö& }O3å¤…å¦ ñu¯õ¨„+¢JnУܤ„!<“Ý6UÀP5ö²v™]¹cN‘r‰®#à½mS\ƒ4†—›uœ/êžå–µ©A9$ ,–ï¢HÜI%$r„ùçúÝÒzúnœÍœ–EÛ9t¡JafØùA£ËOX—X‚owµ¯+mÁöZ~èî´2ⲕ ö‘,RýXå-f'õå{,e -L­ %¥/âX {ÃMÅsd»:7ÌwÂ/Ñw¿,â3e ݵ¬í{-O"HNÓv ròÕí†1•‚û—j¨|ÚUYžTn!^4kÕöu‹‹²7þŽ˜à·3EºŽìŠ9Kœî8¼OZÌeã4Á€B¶ÅKÃ|^ç)/”¤÷&ÑÒö¦`£JÙ«“Ë X¬&Æù&Œ¡¼FϸŽ@ö…ÌÌ{¼ƒd HFØýZ¨r7WNijVÖ]:×lðbjÅò™Æ\?‚wUiæJ;qŒ8wBˆr²L ¸ú²õ”pXïœÏ·"[¬µVãjr+I)葳÷£ü´‹aª§G„9–GKþ:¡FNÀRôh™éúôºec4°ßüY´Ï•[½NN{Õ"5ý¯SÃô«ç×ßdLî[ó»O¶.¿•e¥b´Nã¥ØFပo`™‡•U=xfÉ•´Y+Ù¦âNS—hÁYÒlâ<Ðä÷ "YòrèŽëCßNw¢~ï\Ú®É~/~wÈ©H>šJÀìX¯¶œì5‡•,Eªˆèëp =5*¡äÆ<åÛ¯ìÛqêê#Xj†rNäiÚ=Á¼™êyp,­IûF9#Ò—¥ŸÞÉU«èoh¢šÔ9KËj%´èC³Ìó™­tûmÖü±Ó<(Í·CUŠðï‹Rf9Ö&7¼·õÅŸÜ#5f:öyY˜ëçË*â 0¥ÂÔSÕô†ˆuHH›pH4$ j‘úÅŒýÎV-ŸÇ÷lïÞ/‰ÄULúª)>×>«Õ¥Oc_ðªø®Lý|þ–¢]#`K…p?bÊÝÿ5t9$œiCÉV™¦A[4zqgzN‡äM!¡ùH)ážçÑBÁ'U¤ä÷ÇlÔS™J©álhc°·%Ü\D‘f~µFV·“ÒwnÏ$BŠ…9HÎqn‰œ#‡ß‚ÚÜOiuúvª•âîˬE &¿P-¢ÅuБÿo³%áKákü‰NR®9I‚*KòÐùó‰D¹. ƒ›µËÔOar%ŠõÙVÔPµX1ÅPE^9!}……:oFŸŽs­‚Ú†ÖØþ³ ô,ÜΞBCšøEvøï—Á•böθý7ëÁž¥GH›K¢Ýeçß~õßOV“À5ÉsÚçái#¶TݹÀÇ®§ê¹Æ,“Ö‹pð‰&Šåƒ‚LÈéçÞüà$žaeS¸ÜΰÏÄT1XNâCs58ˆÌDÌŽ„ì”%4@pâz~Á®{‚Q½ùIO`šòÌr¸EÒ6_î#zzÞ,›¯ ‰“†X#îs¨`¢)C7äoåG®ÔÌV®+ð=|¼.#W)ÈBtºB‘{ÉÀµá®ÞÃßʇI±ëÆÌ±i°¨£È±Ÿ}ʾP¼ý\ìœþu[ICƒiIýÓ æLOXª÷cÊœ(Þ—ÃŒ ¦£.òw˜,¼7Ì‹*Õ˜¼»ô:Nî× 6î…ëõÜãOŸ)ñ…ÎÒ2Ô‰-å¦bœ¶ÄºUŠXÛŠ¶@á·°òIHÒ¦»ÀBæ Ø„àºÙw—ÎÛ ÆÆ”¢(ºTÃöŒ Ó’Zaœ+Gr-H}P‘>ßc ½ Pþäüi[ Ò`-NèYv Œ*bÕú~Œ(Ôè¡ã(„ò†¥¡ÓèÆ[˜~Ú†›ÆÛ˜ª‰ ~ÿÌRµC`ˆQ˜6RNô Ç+'Uï‘;(£ ÅªÎÝTÏ9 H^¨–+ŹCd‹d éNØýÉñ‡~¶2“ab1Q‘>Ñ0"p<~«#,w=GþÕöÈÅéA_¡îdec(íÇê·VȯMfâ2F.!ÅtÃ7Lµ¯¿B»p½E#¬&ôúV¾~M×Äè{Üý†75ñmãt¶‡C*s<ñzd…é¡àlœgÄÒL9•Òzm¦Y"n1ôM1\ƒÒY•q'/aƒ­Å vR*‹‚¿:f)ÿÊyš”g+{k-“r"z-/è“)rÚZ.“DƒjæBÍ}4Ï:]`ãðyÿ=Ó—‹ßŽË±ìN7—xt©Ã>ˆOEüZv€| #tâ¾/fE¡õ•wïM·%zß‚ì1Γ€WR,“¤;ÌÝ Pñdœ@Ò÷Ý4Š$t€î½Q| *!_Ek¦Wi¡Ì^A%u0"Ç¡½tp*W}ù‚Vªk,Ttÿ÷a_¾Èf’¦êÒwä÷Œ“ÃNWv|WòMÂ=Šn5ŒJ¬‹ÐWïŽrjz„切¡Ùžëy}#¥×Vô>´§g8ÉC)70ú¾å»2ÿ!h‹ƒ0-žÄí®'ÉpËÒV«Ìç§¥V½ÞÖ^ÃüÍbѸ&0 üçã¼::EŽ'ßðwêo•?Ïä¶²²ðH8J›ƒwÏ.Ö3±9ÿÊõu´³æë Æ¥¼,WöÓí8˜™›IÐ5d-Îá3®/ ó9¡–Ú,ô!§ +Äø3sŸ;Æ@²˜mx¿AÚ"1b'|x)"&¦ íBoH”õ\.÷ÅŒH¯˜ZÖšo4þ‚Ã_×¼}Ê_FÍ~® Q[/ßR¡ÛsÓ8dN#NÉÝš1—9¡èœŸFi‘Óá3k<#€&J6!W ‹­ŽÛ`Îacª\÷D§6;í/±­dòe”=™Žð÷Ï<á儊F,Ök…7‰fu“Ü“¨äñ(ÃBùÄewq(þ¶ï& ópySóYÙõîiY!Á}$†¡l’̌ﬦ ^%,ŸÎ~¡M‘ÂŽ—Vü€UæÏéBŸ½Ëº÷ú¥B?KÇÁÿ¹YŠ=‚§6Z€ø¥ð·®ØˆXD~[A¶Ø°Q9ñ‹äSÛ‹íÏÚÜwítÓúÀ ÝìÄËÊa.T€‹\KÀ÷ùoRmâhŠoƒ-uÏ-–î²N˜uðÖ¡[.Ô÷MTó”RO9÷†x‰*Àùcç£b*yý=ä€Á_Á_(úYù q\{Ó‘Á^û¾}ìÕiÉ]#¢°¹4P“Õœëîö–Xqkj1ó™½Òਘ°ÌDïC3o#2åDʪ› ØîJI…¨SW~ §¿_£[ì=»îô8ã¿„6jÇp#|æÛ é[?»‘Ù¬ÌêI~Ÿ¦%t2<µåï>ŠÚÀ¶_‡õr2.në_- µ*Q”„tŸAKoXSõ%Ù˜w‡xç$¼EgQŽáôxß"¡EQHSɾrNfo§Jè*ç—=UFdÕ@3œ¯6c´¦Lüií¾’¦éZãée*Yÿ}Ì‚%¿ÛòÌ>Ut|ø¨Àí½]v¨;]™ö4[µ€€:¢½-À*'¨á›DפA…\~ë¿–Idæ×—™F²H#WÀtbxJdN4”—Y²¤ž},23þ÷1…˜ôâ ~cÀ.Ö†LŽ®]ÑžqÌëܬ'-ûu©¤õeqúò“F«ª2-¥Ü*0Î&óŽÔfŸÇ#Çר+Ï@p[Äå^xYƒ'²ÇœÎi„*î;‹ç¹Ô–×Í]ã#XѲl±1„Ò‘ÕWÁ¥äXG‰¢^OAÈÒÎgC[gó…ŸëY¡\~‰SŸ@ÅÛÏŠpoÜ—Jñ–ÜëêEWõÛ-V(O¬R[¬ Qn¤‰ËyºÍäo•ÓJê’9ÑÊcUø‰•®nY¬Y ÀDœ)T Ã;ÕeýÌ'Ó½Ã0VËd(G{žb^Bt“ü ÇðJþÕiN-•ì(°¬§E¤øNbaŠç@¯Æäóˆ´¶¨2嘥N+h]Ë´)>ÙœWA>äñçô_‹’ZJNW0’#ôÔ–[§¬ö™Âg¹^“-`9O¿nXÃüý`‰‰r@‹zM!¦ÙeFà³gC£ÕË(º’sÒ\>ÿncpŸ2š®¯Þú±­ðusŒW'´æ*è׊éé¾kTùŠ7fâ=o$hS5¬â|oˆ¯·ò)¹å%ží†v ú%-!÷¡¹T(¾“ôùŒMR!¡o‹‰†‘šWSõ±.-Û{6ÄÊÂÚ%ý‘ÿO[¤÷*ô«%"=?r&0ˆÌœ‰×/Û4ÒãÉê58W>»èNÒ55<iƒ]ñŽ/q@ s7bk„Bw*$ ¬½ËtôÍŧFÑXØ[‡¹÷§Ô@-/©¥2V),qê´ó—ãnà²Õrõ_MuM=¯9RîB¶²ël¡P(®î~2 yœ;¦üè8Þî¶œ nOMÛUÙÌ0¾\)`IÅ;,ï„ÑöŽ=\£\Ž~E{®æÊš—l–õ üð¸÷Ä_\Ý' =ý/LD4NJûâfW7™ÕMŠÔÔ…hdIoôÉíèJ'µUÕw[ÚÔ¹2,›8¤'áQIËŸ›©ÒµiÍ:žŠª†ô ­ºDš¤,tϨNÂLû³n˜¾‡¹¹oHÏöœÛŠR©.I ^ß%ÜDE"¡Š´?£$B aBÂŽÛò"XP ·jÈb·@ä!Dî9êåU¶o‘_ …³ŸÌK¸U 1€ÿ4ÍŠ½ Z›HèñúÄ«-_t ƒtM ÐŒuž*$˜,w©«$ùJhMj-åÅN¾%«úº`ió1¿ÐÔ ì(³õpxúx7”ž‡So™ó¦`²›<¾zób:Ï@vñzl‡5,0Óª{¹ó‹|?þ‚r¤)ãoB5w.9²|2mÕØç“Ì…nÐP½6˜.öS6ŽY·ŒÆp› ]P=h"Ê&íÑèÏÜðÖÈùÜ€Á0S’kô5 6hhXƒ}¤äñbÚàñmŒáÞÍ¿Oð©mwã·i®2Ã&¼•Dt.²ûÙÁ„ï¦ YgÿòCH…¿Oü¢ì%AÛmJÍ8“;/Øb{÷-%aF} poã²B£iú±ùk;å Y}ó¤ä\< ³£RÇÖ<Á‡*$ÇÊ-æÖ ê+½5Ç£Ùæ j-ÛŠ‚ÖÕÛÒ2)ƒ:GUÞ4åÓÞ&Nt]õ6­ÔòØ rßf.㬅Fоïçú¤p'Ьê:œx+€ ³‰½@ünË|›ºÕv3=òóóOö@ò¦Õ!î ÞàâÛ(¸K€Ry-C»ÂÄ{LŠÕ+?L#Kû%õþ{CxćvŒî_a¼6€6‘þ~VzúÅ Ðj{nòÈÚõ)ÂÜ×Ûß¡XÎF¤xäP ¹àð « ‚:‘™‘IŒß§eTüҘ$Ù'ôe[g µœ2S|NÒ}çk”bÍHºK@1¨4·ÑXõ×v&k̃¾„ƒV@³gûoc3Zu(ndñöÿ ftHm9,Õ‚’Ár¹å]’‰)íMŒü“ô¹y³Aï8µ8b¼¾¿•s},íZ^9Rg,rñ¶…È\&„·µBtË— Ò·×ðÀäcû»òèÄͳzª"Oce%oç’&m”ÈÞ£á¥Ä#J8™Ò ~%rÒo•Š•á4%UJÖPJ ?–—K;ö©­›ë$a2˜£ÌÙq^^ÿX»?Žh ¬ýj\*»½Nù÷Rñð|aì!õ…¡Åc;+bw©v,ŸÆó_=x¼¦®Nœ-¡²0vêÁH‹A–î»ý}r”oÑü{\ò§+®AºØæÅí$AðŸK¿Òð‚†—àÂ舭‡ÙÎ?‰rNr”˜6FaÜ-àºý˜Ç€Ÿ=Øõœ§h%öq`¦RúºÈ¿y1Ú›R—$H2ÿžRAPb®ù9Ÿ;Þ„‡Ë‰wž¤Ë¿þ¯ÈU"”úˆìýG Jsªºs²”ÚÓS+ú ü0…´³F!¢B­kšµØÐýLe"Œqߨ 6º©n¾|ð9ÌÑQ¥³=‹Ø˜%:ƒ-ɽó<½.¹±ŒÙŸ´Ô®ZBÀy ©ØÌÖúyî²Ñ½ºcÏã(U¯?:,-[M¶lÙûÍ…^ÌJ¬F²\æ0‹$o ”²Š„®èÑänÃÖ8Ä~òämI)]‹”Nʯ}Í9R'Óh8sÊÄnôÑgn‡ÕR÷åÜ#5/s–0’»{1zï N‚Á #]™4“P¤Ï/\öÁvþÊ›Rå1#R‚˜¨é›ï½—Ö÷þö:Pba/LáC™þ²'Ø4ŽSÍAö)>n äÃþ…gÌ£6b¥‘(Vqê)×Ewcµƒw/‹'Rql‹pþ¼Ç³r ù¦¨”§0Ƙ‡•€p™ë fhj6.¾²ƒâ«„7ÍE¯ ¥› bØ…ä˜øO8û>O™aE_†ÝF£3jÝ+š¼`‚ü5æùŸQJçE qve–·/-X0¤œý8VJ’´‹…hýŸÑ|ÊÆy;H®£$Ç£Q%$‰¢-Hçµ> stream xÚ÷P›k× Cq§¸´¸»»»;îîîîî-®ÅÝ‹w+nÅ] …ÃÞ¯t¿ßÿÏœ3™Ir-¿Ö½Öý$$Jªô¦öÆ {;zf&€¨¼ˆ3 €‰‰•‰‰ž‚BÍÒÅô9<…ÈÉÙÒÞŽç¢N  Ë»L èòn(ooqµ0³˜9x˜9y˜˜,LLÜÿ1´wâˆÝ,Mò {;3<…¨½ƒ§“¥¹…Ë{žÿ|P™P˜¹¹9éþvÛ‚œ,M€vy ‹Èö=£ Рjob rñüŸT|..<ŒŒîîî @[g{'sj:€»¥‹@ä rr™þ¢ PÚ‚þMž faéü/…ª½™‹;Ð xØXš€ìœß]\íLAN€÷ìUi9€¢Èî_Ærÿ2 ü»9fæÿ†û·÷_,íþvš˜ØÛ:í<-íÌf–6 €¢„ƒ‹‡ hgú—!ÐÆÙþÝè´´¿ü]: !¬ ¾3ü7?g'KggK›¿82þæ½Íâv¦¢ö¶¶ ;gø¿ê³t™¼÷Ý“ñ߇kmgïnçýdfigjö SWFu;KGW´Ø¿mÞEðdæ ;'7äy˜X0þ•@ÍÓô·’ù/ñ;_o{€Ù; ¯¥èýÞÛè¸8¹‚|½ÿ©ø_ÏÌ 0µ4qƒÌ-íàÿDƒÌþ…ßÏßÉÒ Ëô>~̦¿^ÿý¦ÿ>a¦öv6žÌÿ>bFu -q55ÚSþ¯RDÄÞàMÏÎ  gag03³r8Ù™¾ÿG hùï:˜þøJÛ™Ù¸ÿUî{ŸþS²Û¿g€êß B øßX öï“ Pýt=&v&“÷7æÿÏãþ·Ëÿ¿)ÿ+Êÿë ÿߊ$\mlþÖSýËàÿG´µ´ñü·Åû人¼o¼ýû.Øý_SMпVWÄÞÆôÿê¤]€ï» lgnóß6Z:KXz€L•,]L,þ5.ÿ’«ÿµh6–v %{gË¿®=3Óÿѽo—‰õûõáü>“«@ïËó¿)ÅíLìMÿÚ2vÐÉ è Ïô>J,ììoæ÷u4yü=ÅF;{—wÀ;9_€™½ü_'ÊÁ`þKô/Ä `ýƒ¸ŒâÿEœLF‰?ˆÀ(ù±¥þ V£ôôSþâ0*üAïÿ‹¸Þ3(ýAï1Uþ ÷˜ªÐ{Õê€Q㿈û=ðzÏgü½ç3ù/b×™ØÛ¼·þ?’¿N€Ñôð%èý{žþƒ÷"ÍþÀ¿å{Ö¿ Û?ü¥·wuú‡ÿ»‰ù? €Ñâð¦å?à;3ëÀ÷òmþß¹ÙþÌïLþAìýÒa´ÿ/d{·},ýCý^™Ãõ;Q‡÷Ý´ÿG+˜ßKûGáÌï¥9ÿ!ö¹þ$d7w~¿Âþ8¼ÇüÓ¸÷‹€ÑÅ ôÞ¼×ëânÿ‡w¶®ÿ€ïlÝþ߸ÿ£ñïÞÿHÆòÞóð×ßðvÇÄÕÉéý ò÷íö¾XÿÁ?®@  üÊ¢½ oˆU}Hçc0¾;ýþ$ÿžf5½÷ŠS—ë/d˜TêÚœ M§{áÔÑ~Ôõ]qª;¡UâßÞ'm0áíÉÊÏ>/†‰*3ûðËÓXCS_N„¾ÂЫ øüvôÑ´†hï‘¡(ptåBV*Bt”ôhøV±6¶¸¯|PË!‹ðR1K«£X:OQhœ»€C íBOKƒvé2w?‡–?õF,“H ï{ËZì­³Å÷´àõ£JŹ—W‡âm|†Ò[ä(M{É»¬$^&,ºÄŒÐ`±E  èÈö•¤g…¯âûÔöwœŸ†¢(»3añ&Ê;"£?mTó»qÐ 8Kg3~†wVî>üå]=Ÿã,8dír¦Äž9dCrG%Ý}~”¶Ä±Œ[4ôÛoöScÒ›¿Pâ2‹q¡‹nŸ7Ðé¬ûçã•ïÔ”¤lžî­šö™€Ú4Á(pŒÙ‚$ŸÚè,Osd¨íÍZ¿;Èï²ÏQd,ªEuº)'ßrEŒÑÇ«äÁƒìCê9kË€À/i‘EŸðZÃÍoK”y&gÊg#~šÖŠ˜&ùÌHWLŸ‡J¸GÈ£ÔTNÈÄÄ.˜s+Y5“?÷F2ŒOßôÈ0`q,ÕÌòe¨áÊž’6 „8áPáV) cæ¥!î“e ´èXõÝ[6Ñf¨¿º×¾]í¿4’'ì Lïèmk*0ˆSiÌê](tõ·²~D†š¼¶1Duî+—Sjy¨@èŽó4Sõ,Û^ì1Þú81`ÄíJè7t¯´3’P§àê´H-ÇïjQ·4;"6¹RØÞ§4mPê‹ÓÒJ ÕÛ;¿G_6é¥N3±FÄZuèw¿+UìŽ쵯Ìóaa¦ƒyq{‚!eÓÄ£½ë³NzUVŸ_Çr»ìÚ|Vø­×ËGÉ®B&pê^'íªä(ž¥ZŒQ“"p,¤òBNi…ÀßP‹ûšomÙ*úHM9܃P::Ù„¶>&Øö!á_Gƒ¤õlÃÀÂüì2SŽ÷Ïï p™ôp›É!f;A./B¦v*¾ùÁ®þ˜8‹Ë®îE‡à¡û´z@˜Þgö5é…±ØD3=X,cø7nxðØ/•!*=”²öIô"ÈÁ•Ùž¬r‡Kôd’iRÂõî†?§ÎµoyÎz‚>í‰(GF7s Ú¶‰¾›fs·w‹­ƒ|%ECL‡¾6­¯&s^sU6Í¡©ñ¼¨µ¹ÐOÍõ¡ørQñ¤3±Šä)À˜MÉÉö%ø*æçúlÏ7:þvÚïØ&¬ßXë¾ãsYC°85„:ƒ¶éÀ<¶ƒMØfí7µÜ+ô#Í÷ð\–êf’Oä›òL[š`.fZý}–gÙ3gwª‘‹¿áùŒ³×ðeä×Vu÷„ßÖ«IÚ’¼\ÙV$:‰·¡€Òq­/¬Ä—òûj¨åƒ ôÔæ ˜}X¶äNB./ÐuXZœ3¨'\븈|tR~5•#àêµ~Ñ6ü¨!¹±Ó$óé1 Ch§æÃ¡ÓY;l³,ž&s™Áœ¾¦–ŸÞ~Щ<ßœŠ›àÚQÒ·=J€&³‰)ÝÎd•Ep´ã'¦¨¼Bš•iLõ>‚†;p{°btš^XÍ Ö!TB¥f«3[¤UtÐ2Œpñ°§éÆ«èóYˆn¸gt_=³) £§¸[÷øK=±ZŠû†5é¢Ûžz=¤ª`>’ν@芰y£‡:x©0j>ýD¦‡ë,JC4%ÛZ$W€Ì®?u¶ê:f·”Â2ä.Š2¹¨=žvQVì¯Ñ ÏÀ¹Ó“Ò²5o ̶}Éà'« ÉÒh~è¬u4¥—éJF0&œüþùFÇ4þ²Ü"<-¡>:~PÀCᬼhÃa7Þ¢$·MR.`E±ØBà&Î>öv,¯lU†÷R†VÏ~’˜@÷™g¬ß=nÑ6›Z`$6Û§Ûu 8²àp÷F1áãߨqóÍGQ-Þ„¥‰òq^J?5“¢½­f& ¬Ž-MVµ{úòm×,Ößð#M˜>a^“žå% æ“Ì„eΘã÷ [€lÀ¬« “Fõ Ù÷>ÒRRƒÃØ޽Mn[æÆ‡ê¥£Œo ·pȤp¬â˜uO²FÃ9ê*§Ø9Éoì?áwþbøCî·h´ ûU1‚¢—si㙯«œQšür@E7)gžl÷ÄùÃaÇõ^Ø.OE@´÷õuŸ7#j¢~±0Ö•ƒTYòT\ŒÏGp™:Vÿú¬´ÙιbØ[s*o‘ÉÅýjHÍã&_a*YNƒ)_<Åôä?ªrK-_*Çv.ä:™ÝJ–¼è±³‡§’í®¸aê†jO5RcbÉî©4úÙµeVËãi=ÓqQ~æ" ™’¿¦ÿHE0paÔD \öœêñïÄ)…½©bkU–õ¦^០Õë4è°Ç¯êd;¬¤âY†ÐƒP„”’äÞŒã}ªîÉ H9zdc‘刕´¾oz#—äë„™Ì>ø¾žQS`Ë-Ëš)² ü¨ ÜÙP)Ì7ª'ÔÒ7‚Þºœüóc®]U*ÛÄÏ,~* Ïn… ØX—xìv—WTK¨s–Éø®ŒßÞø«/Øî9°Km£»å–¥F7±FÁys6îùÅ¿›B$xÕ"æzœ`‰nûF ÿ ïÆþ§lú*©TîT-òÖò>ß§q1röUó·§?T¡ˆ:زK#i&²;ãfúÙoÑ‹¡"Á]—¯¶ˆè@UD™qI¾šàÏóýÖ¢ïáí.^þͪ÷¦,qÿ”"Aâ¶FÈÛj„äΈ[K´ ‘*ÏÖ ÈAeh¼yåч;»,¦àû>í]»‘ôæêÛáq'°s[ÝÛ‹Á\Çä¿zÈHA°Óüh Ö„„Wff!…iñ1ùßjÐʃ•ÜñÅ›¸Kï¦È:BVùŠ~—½EZiAuh9Cü–wÂ[>¯m<Í]{!="9¥1áÍ&WŽLœû€H'ÈŠÖ»ëÁ™vÅA†ßó$¹‰âØ%Aþ0š:êZŒm\Ôʘ¼)ÙÓ°NRzÐ+×32ÞÞ] ¿wâ咽L`,Á{àŽã˶GQG=>Yá¬a(`/ßÅiÞU‘d6sIq4HÐw) =>2›”žT9fX§ò§…ÆÐt˜;Ãbk;Hé^ÔdíI!ÚUÝ„f?[þlv?œõ$ûmšõö¡ÿûE*…óئ_¶è)òqNŸ*îbžgÿÈÒþEp}}Ý;´`W21V¨žg¨Ð¦ê×7gà×ÑJ·dû¬F”YÇ­ÌÇÎÂõî“âqip>£¶ó8zÁó;}^ú›,hI_Ur" âö=âR³µë§ ÷lÔßµéž`Ç!,DmɃ¾Ò4Ø"¢Sž‚YІ£àPléh/<;©_Å 4ôC˜›g5.ŸŒé‚IÃeí%˜L€xí§¸oãùfl’ãUÖITÞ‡<ëð°™M¯úô ™–ec¼Ôï& ‚˜_ó_Æ-FœiÑ&‹ü£~ 69gç ©ÖcçÒ]Ê<-Á¿^ÍŒ;½¶Q4^K°â¾˜£çoDSÉû.¯•°æ‹YXÅêå;¹š l^ñ>X¶ ãvŸGbÂÛKÎdšXß)dÏG?Ûýr[Â\ fÉJ]ËLÚ#';Câxšñ~½€}©<Ü©iÖ“p»S?Õ$Dè °9‡§ð€Ò5oœG= µâð+FE˜Ç\'MJ2°¶­¿ðDi_§ x%¦ž¦°kÖ\ÈQdÃGÍô¬öŘ?ô»Ñqì:+_%¶”. $/Éý®–Mã\ñMÿ¹â0ú–Ø2Ü…M';Ml^ßv?2Pc,qUñ990 æ®“ÚÌòµ þš‚þƒŒúP®Yšç<#^¨I8Vt ¬:d݃ç—|ÛÔ1œ×7Ïîxöի­“Û]¶Òm’@R¬q€ÇuÇ®áCGÉw¹ÖÁ|ÏʰŠäàºÛ)v”!Fo³eÑ+ßJÓ±^Ø‘¥{¿å]§†Ÿ$µl¿ógî:bÌ”>Û·œôÈÏÑ|¢Ë@>ç0d\Óô¶Xž½eŒœÉ:·:lPõ}=“ ÷B˜q‹ZhÞ‹Ú^´Â†+ÛhðóÊ–óvÖS™µ §ŽæñRP•‘ûáI`e7˜2œDØž0D@D=«6í7-«!ŒùK‰ *>ZF ËJÀ{‡r xíoÇà6ª›º+\‹ýŸßBa6¨€º\_NË µ³èͼnî&xÀÆÑÀ(uŸˆuBòzÓ¤pû»ÏªhG‘°¬ c¥ÛøÇÛþ—¶Xp—B‰kÏ냆ý»+Ê ïwe]Z(™¤"ÇVxÚ¶m!„‹][;ºM+y;q3iD[„2IÂZuÈêFmäZ®þ¬G…Pì²Ïo¹²¨Q<øúƒ_DH*¾a+È`F]~Zf¸·îõæSéOÜ'g4.Ú¥0Qi Û¶ë$¤ Þ½Î*äÆÀàŠ"^W@q5TË=ÎbnF$¦<§}Q0 ,u•ö¹{ ¡}[d*o"EàAO0ÅV…¹¬®ìç¨Qw¿S$_zö'œ¾¼>á—ˆà".@™Ñ% õ`Âû¸û!óNÇÛ;(vàvƒ˜!ñŒëûð§f¸Æ¾ C …¹)’_‡‚ñæ|å‰zWØ5ø}Qô˜BnXÑ=4`tn wøÁF ùå°zÛd÷sX/-£HÁŒ„WèýAB·TŽ&&º¦I‡Sü4úÏÐHìAÿ~ :Óp=rÞ’*5•^ y®>±SÿÖi¹|gmïH±F26„Ç`1o`¹žo ¹]1ªéXþ§‰ YqÄ´OÉûˆÀ9¢ûuCÑØàÌ‹¦ÈÈ/c/@qqäu6Òž>ÝãÑ*_(ÎNŠåöÌÃkFéfëÈOÕ¥îÆ|ã"©h÷>üÚ;‰5=6½ÞËt˜÷9ÅÜðèŸè‚mN>ë8: ÕaEâ`ˆF×Ó!sà®ú\«ãÕë² —{?¶Žïxß6D½·Mn§n/Õ]ƺxÕnhBe£, “ËOêªâT³Ë»…ùÎTè8›»,y÷}-¾ŸQ¤žÇÂÖË w²Ž1ŸïÓ…KlROuÅóÖNW~Ò!`âqŶ·óWYnÕ‘µÆtýºYAÛ#¨Ú¡B-[NrØ-½Ÿ~³~ç1*æ÷Ó¢5<ÈèV!“ÜÖtÑÛ0Eên$[d Ø¡ tÝ„Zóº5Þî ʨÃ?©tÒž9+©WˆªËo¦¸™Á5‡»ÁS×¢´˜ˆàHXVì>¼ùµ5¯9ÉòÕ`ç1ÙK²öì`©P0;Yùû·§Y—¡êéŠÀ3ƒ¹Ñ=ž‡ä!üï‘‘T¢—S­ó„&Œ»¸6-q_°¯9g¡¡ M´ã|årtŽßЖöe!I| x¬ó™/:¯?v(°6”¡ Ü'q~GxgSŠWÇðYóP"â_eˆ”}m‘ö)N…Ï÷[XÍ®5“-·´ö(ÄŸ{õÙ6µæX­4øÙžYë|¦/öoÙuêúz✶¹ú¢Sº_UÁ©ÿÚ§]ÄGÒŒiA=ðÉ6ӕ¬°Yc] ÓÝ ÷BþÆ€.½Öþ]Ú‘Fwd:®wÓÃa›qV;¿Ü{Ô†'ÞÏ&¹ ‹:‹ŽlÖXê)À©¥[€ˆ óÓMóG‡ŒpÙ³ä 㹟(aIãŽoÒn¤¼l‚p‹Ï}nwRb¢½/Æx„ráO´j Vr‹’…* ÖäÁª[Ûï,õÏ– à\•8«ú)—ÒãUÉÁ®(¡4Y*|}›×;ͤ< '~“™°”ÕÏa+Mjp)`rø Ü ’~ü´ÀÉ.`!㯥°ªFø7øˆ±¹7'î ‹Ö©‘ÂÏv]³²~|ëß=2v\= dWÊ&Ø\ÓvOäiº†%AýÕí¯îa‘êº}ò¦‡g'ÊÝ™¯f‘0ÓMî[‰Iíè½ÆËf]Bà7¬;ÐWÌ´ ¾mÜÛ° Œ§*öºøQûºÞsvp¥3–H”ô #1DsºÞtÙyû}T$èðótÀcÛ)ßœÒÞø>ÞÌ(¢½ÏrÕyÉæpL–J¿)U™j2JäQ<ôý‹©hÿQ$ȦHýû¨‰ŽÅÓ‘§“p8Χ4Ýúýšä–IÒ¼!­c–æiú°öSz•¥dѸ˒›"kÎà‘¸o±ø—5T è7Ì i§HµÞ_D¸¼¡É‡Uý=ú6Á×­›xŸÐl¾¹;ÉÕ` cêT|éqË»æ:ÒCûô<íq^Øç-Æ·yR¦DXW§rZ1GX—ð¹×¼>]º1Ï¥Øïd2‡ï,wìe/ÃÊ}‚áÀhrª /(júO¯…h)þóÀBˆ2©¼Ò`Z×yFg\ùï+Ðz.i}ÚÆ¯~cit"Ÿ¨¹_ýÁ†´Q#ˆ ôoÔõ]6ó‰‚P9—8_…«§Ù¶œPš×Âjƒ޵¬87Ž‹]9®¾¬Æ/(>?`{e ÊK̜֡~nÓHšó`OÎ:çbó¥y@Ô\½äÀÒú”^Ê&c…‰–oâ{{SzAÈ£¶g¦/6¹'ÄÄW‡»ÆX6w™j]ôàFÞd- ²0±GsÃÑÎï¤rlRµ…ëÒçn¢Ùb®ñ½ÿ²³ŽFÛ ÊÈ‹²"ÌÌ £Tt’ÉìpW؆1ó$Z€Äg3×ÈŒgý7£„ìR+ƒkVÀø&ÞÚR×ñ"îC®(ÛîΖ/JÅ =CÅ4J˜ÏOðÑ‚ˆ"„6Ë¡¶¡À)Ä!û¨%áÖM2UxÌÉ=’]!ù §„£žABeà%ÄELP^u½IœØãs3V€ÏIZ-vSÊ AgF·Éˆ•Ñ¡Ë3)^ a=^üsîjFËêæéh ƒy•Õ÷ûª´\އØA0ßB¥ÛN„êq2Büe‘µÞ´Ðâ0iB€ùª½‘³Äcëqí 飑ã¢6ðV)‘goƒ^ÍÕ±\ò&"¼º´uX§¥Š{¹Š¼â´Ö;¥'bŸ¬ï›]bߘÅBJóGzˆÆõŸNOÊ{ ‹†y%v¸ÐÒÚg¾¨Œì>g:Í´ðìóõÞÉr*Bq[A]H¶z x™X„„ÁòùûG¬ÌL¥þ½-Y9­ËQ¢¼&ž ÐîÅ!wjãrQ@ÎrjÌwÿb N”ɶ¾v=X7ÊžÕtCã>4Ôj]æäóúƒ'RA¥>ÀaD„®­Î¨±ˆkSC& ¦êSÖ…[ƒø‰¾?b&ç´ê%•­÷ÃÝÞS‹ˆuT5ñå‹ÎOÊLHlk9µC»¼8»C™´j NØá+VsJ|¨ £þ4Ùo—a4EV¿aËß^&çõ>åÛÒžO/TÝF;FwKÍãŒ9ZYPž àgLhÜEë"(¦°É}zø²&HJKª o‚'ÜkÓÇ'²,Ÿ^KÔm^*Ek& ÎVÚ,•x¤‰cÀ´…uô_(4z’•ôCT%8k2Ns%Á|ÊôQ FÓèå¥à°¦ù=N—Þ»`ðÕ°hÙ-YFü¤Ñü:¸\} DïÜ5‘GííƒÌ´tu½¦ù¨Q;Bg<ôÉÏq–Zc¾Ê÷ÿòØXim­±5Ø< )Ì`jýÞð(±+ ßc¦ÐJ/_o`#{_lBÓ)pŠ€jXs¼‰YíÕÎÇ‘]*Ûº6ìu9Êͨ±ˆ®™†.ŽuòITŠ,#‘Ï0ƒX»@ozvO‡Jé+êxü4ùÌ—i\É%àkØ #‡õ@"߉Ñ.kÇWánl{å%4î#ã3¶Ù„c_[0¥±|‹{„žÆ\ĬPÿQÉÛn\e{ï&x†[>CÚcξÑEŽB÷š|›ŽOše`¤S²[Pm÷ŒW¡l~î˜ ñq Öh(™qÌ!õ˜4`ÈþY!_ÿ€#“zKZ±/SãêÜÁ\ý„Џ«”ˆ+ä©‚¹¡ó 3ó»Ql«p+`4·!ÁÀôÖyiò¨|jêmLq+Ê:ãt¹ÉÛ‹0¡\*ïw?÷Ú2F;ÑÒ¨¬+ŸÖ~Û˸‡ ¹¼Œ`U(IªI믂GjO®„àÏ6TµXâ.ñ¸ì¥Ð¦J·¦W•2ê+¡>—>éCbô¢g~-QŽd¡¢±¥&«¥5K¸#Èr²ey˜*0Ô™' ‘" @ÚÏLŒøÖiáÙÜà4ðß¼ eå’Aá~ûòæ¬mn”ã¾³~0lÑÎö¸HPÝsf®b„¯&+ÇÌ\ö0ñ¢°ÒóœÍw©„‰êz°uÁ5 ;\w4Þ× eIë×ÔxäâU½Å7ÄÜ2*×ðÈžüŒê¹~5&V3Q€;<¿ƒÇ8>ì©Òþ„cqB'°»[ÕØh ²¢Ï‡tœr¢ñ,Ÿ¹ÐDrOƒÇüQä(BÌ7Éü#è“ õyYcO7·â‘‰±GxÔWǽ|ÆÇâ'¦$ ¡ q;•²t¶€+ñY̵Ñ6Ä0ûmÜYy™"Ê¿=w´1ñ—O²Ö[»w¦ÄJa¿÷“ø^×´ÝEó$¶UÑÞB§ÌNwȇàÂfš88ÐN»¯°×ø× ÷êÄ”dn–µ¯ÉbmàŽ>þÅø’½ò1¤£³ä,oEJŽ“ËàO…ñ«Ëy]Ú&?–úpÞD¬+Ÿ£²¥—5wã¡/0E£òZy.Âö‚"%XB$‡cls]͉‰£p ÌLõžâ–£ fé~öÙ#'Påw71齨{xMƒ<á°Èœ3˜VÙúkA9™‡}ƒÍ‹ß <Ü1©´ 1d» JØòF[+; …„ˆ‡Jç£N!&ŸÚ‘úÇ?p“>p»å£À´Z°ä«“ÌýÀ¦>Fºüúfx3ì<áØyù;°‘Í"OwX\[@!1^5Ø:Ì{jÓ%FÓ×¥saÉñ»íb„"±À÷0פŠ>DS »Ôgcµ°¨Ò?škÿÊÝ¿Cùâ[“„zÙE%L„F’©¤¦¥i2è‡ï±®žÖd"ŽôVãÔÁ\ištÀ.=—hÄ:~Bã9Ô âàI‚»DßvŸ‡pŒdëúÅsÈÅÔÇðD’CŽ`.YcX2‰CwEWÚ6^T6Å\Ë¿@\áã_Ûàk(ÅòC\dðgAÓ“pÍwþ™€Öìàklú9œÕ…Bñ±H ÀòÏ(ßù”™Ì¼›5IÀµç\3Þ rdêydLh´ ÊSL¢£ âÂ/UÙJ{‹4›Íâ:hýd!%éÍ(­$#1Ì‘‚P¿•Ñ=«ù#’2¦ÄŽª4´,àzrkêa"@ñ=VÊÇ¡]ˆ´Ä&óÈXêê.Pú釋pµ)ŠØ°ÚÁ ‘™®ãß2ŠmRùœ>P–n6ã:%#”¾r’º¿i•Ugœe†tßôå oŶg‚}õ€bô^»w¹oKÕšCU…»šý%[òæ…¿îyOséS˲$d3ŽG’]£&ú¶ ÍùÔæÖêgÖ²…×ð6Õ¾!"wçn¶EOà²ã¾ÇIxPMZ|°í”øå…2 ÚòFu¹í‰ð™ 6?ÿýõ0„WT˜>7FXfìcUÔËêî9× /+Qqúyè¯ |œ¹<·óm^×ds5ÏNF0瘼åÁ1áÐiòÐü|ãð Œx^ŽÈ€è°×ãù³£’äÞÎJÑœrŽ=É&l”AÚ f»Ìëu§{ &né9ÊÖ‚‰5H–—»DŒñá?Ä UM$䄊NŽgd{ó`dòaÄ’ò”üˆ„*~¬Ìæa†³žEÀ¢’µÄ¦Ób6%žK?¥úKÓ(n,®õ <ÆU'Ü·{ª“šÜÒB©¸kènTÓ¨›È#÷ù–×É”ï7ÆÏCÔññ‡)ÍÕ|›¿N \Vâ\ÉT’ ùY'ð@]Áå®O|N¤<#çA (ÚW¥‘$A¿éJõ5‰«¸…['F[²àwyÂQD'|ú žÊÕ#öÃeE]êãÐàfÒèÄžÇÀFJ]Ø 8˜ãÞv}aļdösÊ•Ák‚–k/±!Nw†Ž°ÞÐðã§»`ë—_ßd0l*‘Øí —R‡“µà©š©–:t•³DªÐìeçDm£Ý´¡ì“gKAËV,<ðܪ¶A›ñbÑyê*¤NQ?˜7ÃT- 2•Ë©ÏѰLé K §!‚JX¸y\¥8ìϥ˷´Ó¢Q…|òÁ Eì?+H.S`…±•ÿÞÚO³E„Ô§K97C Ä`ÒûRžÆä¿»p)c$l f–—îÈȸBŒT*Mi¦ø¦cX:8œ}­ŠÚ“ô|+C’çwØÆÈÕÆ0ûEÍ^µ…¼Ð¥8'ëßñøqø³vÅ—ÊíÑ‚¼³Š,k¥&²$õ›G—}¤³±’³î‘îæ˜ÃSlÓlzŸùâ|÷]¾çìú´ÃªÞaqì‚•=ÖËðœå(‡,$Nóä ukc+Çe Ç4-*ÍÆõk[_—…]exønçêÞH"Ìég$qî¡¿²£î@n!á¾b¡NroìÒ$1á/)© EÝñØSvC¡š´zÙF®ÛéäÛ-(Ì òÐÌ——ZorméÏÍXqrHÛWÎùu²¯†æ®Üæ±aâÜ’ Ëħ V~ÇÇ?¦+¥e¢YŽ-%M³<Ì,Wõ¨þé]4xŸÃ÷©iè°*}›ÒXM »(ˆ¨Ã^“E§0"ÿF-½¶C¾j'7 ÆÅ©€‰Ee 5t^^úãxîKÉ[y‡47AÂGã<Ñ”˜£–µ )ƒæÛ½ÊOߦFÖG5:Òb×bY¬ùŽaïçg€lU`ŸfÁßÚb~Í·Áøó“Ž·v||Œd6øIg®ç.Î=D%!Ò=6‡ˆûk_3¾f¼qCjlZŒö(°ËÐÏ_çv<]…¾ÓT:h·kòÓ&•¿&á]×ìÞ—Þ~ŸÈxU¢¡ï3ÍaàéÏΛö4»‹0·“ßͦìc‹Ëû"K´)7Ò4l|øðÜÄÆvÈzºwõ”tÁ‰Ý4õMÌ~tDÝÍ3iÚ³%‹û ËÐ!ôñŽ æ¢"=V0‘Ôe±î í¡!k½PåËK¼E<ýÄ  ”K¶¦$ãøÇÀŸV»è€4Ò ÖXsy»pŠKE;ÓmùÇH´¢nô«y}†¶9méÙjé~\À‡/eŽ`%¡b®ßçÓ追YŽ×ŽëgÞFj ¼S¶kÆ9#²ORÏwÏ“¬J2“~úÄ¢ÃaÆAD–Aq×Ê;'¹ÅGóäxô :oPQm½ÎäÇ &|«á¹=}“¶Ë¤1›X=cm_;9e›¾)t×|Ììímw[£ÿôºŒé™»\”AxÆê{¬Õþ5i·ùWó8§fDän‚Ö•;äÑ]í[²MÛHhh>”(89¤çG4{ú›jƒÎ‡u+K±àÎÏyñ\‘-‚žñ¡\gN£á ådäÚJ;ç%J3&x/`Kö¥Ö!Á¥sFÝœE¦åó¨d¶ RâUEÛ8À>˜¥3e ± ³:W&~¥çü’gDlý5LÎË1Fh±´"ÍÒ ¶7·fjkÆÁÀRö¶g)¦¿þÓa,ûH¶`ù-$óù£Æ ´[³TÁ¤Š¡¡~pèvU¡ŠTw4 ¢x¥œ¼QÑRò)¸ÜÉàóüóe!Û¦©,ä-˜ ÃÚøNá+ï5¿:·JþÊ$^ÚátSR8ðwcÜFò¢„iâq •’^v¶P¾&N¨øéC÷Dìheßy¯Åت¹Žú>¥uWA†WTc %토 ÔœêãçdmñÖþYYŸü§‹^Ë uLY”þWÀ…\ä•ù-òÒC©>³G+~×>™”úGëáUêVþ5wÇñÃ;nNCÑ3¥Û,¾ gAµãöF­I¼‚ÛêöE2ºå}l^ÂâTZª '",û+À*1b0I~²‚•ƒm ðÃ\‹ºñªWSСŽxÔ.EgQãž§°Â·V#¶Ü¨”‰›ªÄuÚõR”/e—˜žëè@‚PMYÞ+ëÏ|-.®$)ú(`h>§„ýV-ÞÛøÇÁDêïf‡hjlFæB“¯bȉ ¬/]Ãæ0Ö2y*zºŸ˩ԱÐÙTŒì}Ãç!¿„Û(Ra´¸Øk©] ËÉ:{‚„Þ[ü\§½ÚW´ç¾€=“¶}EŽ7ó­eZ]´I¯ð|8™RQøR%g¥¸ú[#ZdŠQÁí¸fRÓ¦ìGÈzÎ'Rh¯ˆíxÓæš©ÖÞ¢ âȵ/Š£ÙxA¼oâß®g;)àx# †8¦Â½w®^‚<âQÔâƒ"=¥ê4°*>)¤s6 ?á ¡‡Qh*—›¤}L-9ÊJ%õÀlMÿ.dzP¶©¦–}p3éfCžö2Avè*ð“gÑa0–¿v.çn2E¨¢Ùàs¯õ“üm°):LÌ–Žžlµ®Õ É/rݽ¼5-<,¿Ä d‚QDÖÊ>œZ&T%‚4‚”ÞcÜ£—Ç̘zÉt@t0)Ë5>Šˆu807ÂÆ;[fªön¶èCñ‚³’Hþj·°o°‡zw~vé­_”á+~;LºÃP{_×E„_v\U˜¼Ìh'uíþøÎPÞijît†»Ç†hb­ÀPLVðyÑ„•¯EA;0>òç U™ò¦tò¯B.µ %õ=ç)•“ãëY^Ð…\™3bú³ËÍœYïq.QëùÉ©¡ñÊœ8¯ãÊcºüÄ@ɕ閤b>ž3ÓŠiô†ÎÓÝO±YÛ¤.N-]þVWÔ­;Õìc¦;†oÄPjg«T!ù1]b/:Èòa’:x‰½sP ¦™ƒpàÜŠÝX°{Ä:ÜFßyšÚáràî÷\Æ#ž™\xFgžQJš% f*²±š§º­y·É&Ô5Qwؼð5¾I¼dWS“[IjKLA( û•F¦Þ»(·ê0¾Í‡ÅL²ûÛœ¿æ¶î`”“±³X+mB¥Ý»²bÂÓæ'_”V¯g¤y³¯Ôé¬n>ÉL«0“°¿F¡»—@¸Žå|©Îý.£ØAëÒòññ:†>g°¶©QiÞTªi¦´Q4ûÚ.7‚;ޏ´'?16)¬ï/î‚ÄPt'O[ ¨Ô %ã›ó«L~z•† ’ùAxRÓÎ!’K4É®# b{—¼Òµ… ã#c§ `×™lØà²zƒ`×ü0J]€ÁP/·[|®Üs6†øísJ\mm”QÅFJ‰Œ'Û¸d¶‹²¿Ïñ_M+¨Hðål’úŒƒâ„öE$\ÂÁmfBwnœÏVOÌÉÕöÚ²k; ~8§>|1õÖˆíç3¾Œã*½…ž‘qãœÖª <õ¥€¦ݸî´Óý$mÉhTh€79<Ñ?ꆵÃN¥øÏ*“Yx£_ZáÙ»šPa UPòn›¤Öe(ýúD™v/ ¯*k"̽¶~Étl± ^ä’Š¾BÕC;Q/éî±'Ñ H$ÈÚE´%‡îÙW6–$rlm"!¬Ø@­~¤Ž)Z_1Ù„[ኩ¬Ü,%#ùª0#Váà…˜˜|ÐÈ}Pøä?ÑL¬ï#pŸÿ|Ù-"Sð58ùüW’º»vÙ©‰oD´vmãÚ'raaÏÓÜòÉÎ`Ú@Å<¤äMîVÇÏZ4t ÎúÓ<c×Äð7½ú®Ç~ƒ×K—Þ¶"-‡|žf4§:Ä©ƒ«‰øŸ§,¨»¼yŽ¡šrc'TñŽ<øz™9ÁaÂ!)èT•SjA»ù­GÕóMd÷°FáüŽæ‡6¡Q¿ÛM=ãöN’,SúŒÆF?ëG pEá„»+tº@:>hueo€$™È&enåŠyr}Ó8ô’>Ê1n8ŽlUjó‘…çO£«ˆêÒÔ—%ÖBÞææ(S@†¿Ð{ªÍÇòPŒlle¤„‚ÁòwžZŸ´‹³¿;~žÙ÷xŠÖü¼Uøe‹¬a·3½c Ÿé…csÎÇ39-Ö_P¾ýCìzfˆäQ&XBoäü}d´èƒéϬ ÷†*ÿ[´…\¯Tš7~°‹õ»rwc¢gråÚ“"ñ€¦õÙɃ¬çŠèèIîR”#ÃÅÜö&ÈãŸ2Lê‡AGúüD±J²jùA)ƒûM7{ø¿”D]žO×§«µÄ‹ùÔ¸ˆ¦šKndˆ<ÎÒm¾-}-Ì,ôàÿ …p4^Zvœí÷|)®é)Ô[5AîÚŠ$M“Y4#æ,ûDB¦˜Si+Ò%s‹¶ê¢ FÚöÍA?–ëÚò| ӆܜ6~áuâÅb(³†NØ_µ ¿ÇÏ$-”þàëÏØ$xxuü}cþ« Äõýoå¯pm¯á†Ýá¸ô40ÄtÆÞ‘“«M¦ý •lfS0M¿4m¼Ràý0ÀF§}W÷¢l´²žkåÖi«Î1·¸O^Bkr&æÃ{©½L$Äíð-/ â+# ’o‹áP¾úcÛA;ðœ¯ùQMî2áÒ÷µyML&ú¸Äƒ¦Ð¸yÂõZî!ç°°b4ÿz°–»Ø{¬×ñ¡T2¢iQÊLv™N^*Gðª˜ëx,;@z†ÿù7µœüø~K*f;°i7Õ¸M|4]ØXG@žÃØÓù+¢w!æWÌ<û”{ÇÛ]*j@¶³ÝGT°íuba—P¸úD4“6E"Âóh÷ýŸû×úÒs$®DÎéœã蟅\àÞ¬bŽœz¶}k×·½L~_t\ÒÖYË}ѾÑé9>‹oÈsÝš¢cÇcJû)ÝÖz¬(>¯'DÙÕ"fÒ"?Ê¿Øb·E}±×\û%ÅK¬¿eƒÅíâSyÏ¡ßMYëï\u¶ž_ç6zvu!w¬R†ŸÌ­vJ~Q¹÷ÿ|Ó±ï^hjßòÜ€3%-©Ó]ùœ^\FýÀåÉ3j,âɹ—ƒ”Ö?äƒW”4y°°bÓ“z‘˜ê@»YCôõGu W²ÃÂÕuÈ„uÑë’ŒO ã¡Èv_ØJâr$¦]5f‘\Úz§Ui§þþ•‹ò$Òc^"¯ê(Gì¼¾µyW Ž%à@§Æ‰‰G8Þ ®ÕÀòÕ`¢Kç{c?DlNd˜WÆX3×MΞm&z¿§×S`IìŠáUæ¡qä<¥ƒ´V%DÿÐóX©«“­@hïÁÓSã„ÜáÀ¿‰|E¥Û ¡_"îd´²ÂǵàÓ)Yd5æøk›t*‚+¤´‹2  ›-m`dÀUVQá-q§«¬ýRÛî/œÞ÷é»ÿµº¢ ³+µ€+4·$z_8t@¸M]×-98)II;›äe;n¦Hš¸`F;/ˆ:ÿFÈr:*Ûœ‹Д÷"¼ T?ÇÚ €n›dº&#‰óÆ¿E§n·5±FjÁšH°\F•K[´·nHG%ˆée)ah+á§ Adò†Û›ÇNÔä”ûç#;ÝŽÏ…ôº“›Š¯·“ÇßòB¬Š¾0î„]¬ÊîkF=Ûg}€°í-ëù sÝ®"W\ë‹ýÈiÍöÑäœí1næ´IbÝRÖMk å;ÙÜRüŒEb=·…Eh8—‚y£cþ… »F™Î$ëh“ÝIƒ~ÞkÉ7œ " ªDÙÃ}”P¡Ý¸17­”EuÀæjQlL HCVv¶ÛÃăEÿšYM¢Çmóö$ý 1üZÓ Sæ>¹@š§ÆüÏhFÉýMéÁÐ=ºÝ™\ÕøÓbí]jžŒÜ”õùwG'ÂHµªÅ•HÔSŒøleðÍåšÍ¥ÄËdÈÏþ%3Ò÷Òî†lIê^¥_ÙÕƒiˆg®âÝXP5Ϥ™»ÍZU^ùfÂÃS,cz,œ¿Âãõ8Кí'Õîžw3«œá@mV!…+)2Í~€ÎÕ×µ cÑc˜q¬ )ƒŽn¤<¿·®KNaÄ0FXqyt}Öí3‘f$‘BML„¹ãº $þ2Ö€”×m$;ZП•ŽM½Âè 7^|‰%;a4)@C8X—y)ÛYy½*qwóU‰!Ó„¦O> stream xÚµTÜ6, Ý-= =Cw7Ò!9Ì 0Ä ÂС’Ò*!¡tHKwJƒ„4RÒé‡oÝ÷Þÿ_ëûÖ¬5sž½Ÿ½ÏÞç<û ³Ž>¯<iSA"P¼ü| €¢–¢¾"? ò@xllp”ì›ÌÕ ŽDHü‹¢è £îlJ`ÔS ‰h¸;øü"ü¢ @ÿ›ˆt•(=àP€@‰€¹á±)"]¼]ávö¨»þ^8 œ~qqQž?ÂòÎ0W8ŒhQö0ç»!`'€>‡¡¼ÿ+‡”= å"zzzòÝø®v2œ<O8Ê sƒ¹zÀ €ßM´Áΰ¿{ãÃcØÃÝþôè#mQž`WàÎà‡Ànw1î(Ìp·=@_]ðĆø“¬ù'ð×éøùøÿI÷WôïDpÄÁ`éìFxÃv[¸ ðDE“å…â€ÐßD°“ò.ì†;mîÔ¨ÈëÀw-þÕ Äî‚rãsƒ;ýnø;ÍÝ9+# ŠHggå†÷»>%¸+ rwðÞÀ¿ï×ôDøþmá¨íïF î.@Cü™;L]é/Ò ï?6;  `Ï0/ˆ=ð÷Þ.°?œü¿Íw]øûº ]¶wÀüá¶°»<_7° €ru‡ùûþÛñߟ…CP˜÷Ÿìwf˜íŸøN®p/€èNüÐïÏ?+‹;‘A‘'ïÿÐÿ¸e ‰¦¾ºŠ1÷ß=ÿãUP@z|ù…¼ ?HT z·ðÿï<:`ø_uü+Ta‹üÎõ»Þ»ƒú»f¿dÀñ×pþ;™6òN½0ÇÄnAî¾øÿŸ%ÿGÈÿŸÒgù¿‹ýKRqwrúƒÀñãÿC;üÿ¢ÜÉ×u7 ZÈ»@ü/ÕöçkÁ pwçÿõª£Àw#!°súç,án*p/TŽ‚Øÿ©™?톿çÍ Ž€é Ý࿟/?ô?¾»!ƒ8Þ=#nwÂüÓv»›8Ô·øÃîfê¿KPF@ÐßÃ' ,»º‚½ñînþ ß ánJ¡0¯?¤ ò!¨»À]»þ[¤+Þï[þ]úÛöáÿ‚b Óà>€ˆA~ù/(ºþ Þ¥rûÝÿ€ÿÕÄÝÕõ®Ã?dw×Ýßø§ó‚Aðf¿ !’Á•ÁMçòtž¼ëÃR˜ûiç&¼Ãy–8¨nåq«•ýŒô¹ÇE*³]ü*–­Ú ÏÎ3§|¿U1U{ ò2©lÙ1ÙÄ}ùuŠ6™è{FÏò…¸þ^¶qŠ£D¾k÷=†H’6\Y¨]·>±ß£ÊΙDOvŠQ&í–¶Š‚tM*zq£ÝU=Ô'›>ƒuáã²VcƒÖ¢ÌÃSµß°<–j¹ÀKð,'Yîè›'íbh|©á¸~ÀŠ"U–ì£WÂ.7šÏ!ºÎÊ÷ØyCæk£J.·í.â!_÷ƒq¸Œ–Œú®$Ì»d9C”_ïåÖÒªïǃÇùî…úPß·Ñ­OXäbK!SÆÐ8Ø´QyúbsÓû O=ùIÖlI$ÔS¬`ÝSBU}™ ›:ØGÂDˆm€ªnö~$¢V~?‡FCR d/_‰|¹CTçÓqžuŠ}×÷1,m ÑwÉñ¾_úpt´ÀÙN…ãö¸I­Ê+ ýê Ò²R§âyJe!ñKSÙŠ$©C²7{c¨0®&"ÅA™eä3/Ü,;pùZÊWߺ?tþp:ú)§d´Ð±ò4*³c¥ä:BQ¾û4ˆ|_£dR*Ê-²º¿óè§ËSh°ï“)àéá v„s G¤d>T>-ÍžTÙ*öÆ™ìel‰×½rv6ÛÜ7A´Ñ|J®èŽQ$ÛNgNÕ±h‰}÷TLpt†4çŒ[…·Ùøßhøa ·÷°Äs6°‹3«áðŒm½{mœAÛ?ª’æS©[¬ü\öýºÑa6Ïgb+ÙdAßó:©û¯ÌÂT7¤¯ùŽå¸{!‚tiôÓ=?:¶™—×––ª¥ ‘${†¯;ÛZ~X‘Œðœ€‹#©ì cç—_¬— qÝVîO4pØ •Ÿ‰½Éô¡™wñÖJÚÉH:vw¯Hñ & µ55ïûfp‘ü`Íød]×NŸEÕAu¿§˜ã`žäà‡ß{—M;‘Ïþ…yä«´•,ŠP„’ÖF!¬.$þP4Ô4þØa½ŠAìâ$RUì0àö­êa}cGƒŒÃÿ§ÚR¡U} Äõvž?+šsfÃÂu8jËŸÜŸKÛ˜ ]Tôîç c›1É5Ö®ÀöÔýªwë­øD9ØFËÃ*b}í…Ê)Ý'xŠ#™ÞJÑ„Z,F<@"7™—6ݧ (ºYó!a1¨¶pA™Xq¯w:~{œð2>µu‹;/Ü-ëk‚qoÊÈ‚z¹Öa¥±É'½O[ùM™\’z(p fÁ硉mck!›åËoKÆ®­n'[)tÏÑ€Ö5}~»[äÇŒge©×÷~ ÕãÀ„ éí³Åôù}é‚]„±*ÓFIÙ¾[½‰ê¼¦§ñJy)K–íâ©E3-^ýµ|êÕ÷@x¨òˆBoª»13“ÄæF,fWrÚÂ`«TaÜKÖÐí3ZŠUi 2|^C»B¡ Mš·ÙÀkŸ˜ïØöÏÆr´„Ê'ã=”ÅÆtz6 4 ò5¤ÑʼéÕ̪[´†l4#Î^º^á-Ɇ1¥²…uÓ°å^YÇGJ®TºÎ7  ogâ '#U-N ­\£k­ÖöãöªÍN<ñcü*„{¯ú1b˜†É$Ô±ã¢<~øæ)?G~=ˆîÁÎúLÊÝÇApÈÐøy°O— òbBÓ9b04ûl´7´1-×äO1qÕ=è¥P]Â4sÕm_VÍw”ã\RVk‘6׉÷ÁŒ€]éXðÛ_šh}$ëøiiKsß÷Tª"®þ6FÃõì—†«9Ý®,e_¢É0ó´fN­Ãè¬:“¥pÐÇß›¬ì퉾fÄjÓ+nõjŒ e»,…õi¥¨@<¢4äW:È~œÌÊRÅjõLå'Eo~QÞ,ãƒN’Ú1¸ä\¥f¸)À¾éÅÅÌ%ˆ˜:Z•D²$Ø:î¯;†X—…—‡¼}S542Úß(kí7‘8 |)±\䇴¿-™ÆJ«F(zaØJyT¯c‡Ä®Mgkˆ Fú¬œõM#n"Õ]º’âŽ4§hÛMË#̧y‰‚YƒsV{ø¼ƒ8[ýuço¦Éõ´‰‹_ºì†r‰x|™ÌºyÜù<Ññ´áÁœ¥ú>,~ð=Þõcù¢'Ü¥Öy ¼â×}ûdøÄð:=Ì.ž‘“xji¦j4”íP&6kSQž£}ÜŠ5Uþ9àðÀØO»ØuߣÇÿW#5ÓêËw¶ík ”†ª\6}{;•œÇ•xîÔu«ô CY¬x%±úÍtö¹c2eä컜XLl„j£Ç—Ú[.ª_Ž*êœý÷vœöÏø¾Be³ÆÔýò™É‘~m†áw¼*Ù:‡Æ<\¦ØäUZMœ%4ò¹ZlZ£ßš{¦)„C6ÓÀ¸xþ|#5ã­æ«)‰ò_ø2õŒÅyoâV†#oæD§‡3óV’ž‡[e¤ÉÂ,7†ÓÐÌàÅǯ"Ö">ji§ImÝÒñY…µêÀÊõb[§´O>ôÔ"+Ä—žÎñ (>ᦑlÞÜl+Žß–Ÿ›±M~m%GeìoÐgƒCñåQþÍÈu˜v˜Ì.îñVÅ ž§ÕÀØç^A§•B}N ™1òlÆ¢âÙÆqGàÀÖ+IÒˆÙj÷$³I`î©Jdñ{4â¬>¡E×AîŽëStGÜ5ß4¶E‚R«ïŠ7Ïg˜=g3ÄÏCY,o¹E?:Ó{© è"ð$˜#ÊõmO4lËM=š×^¿s¼b ɳ6ïØ¯ ­Rç‰ žÖŸ9š6ŒÍëèô3XÆi}ž3ลßnºã`ó’<(SUæ^k?ز˅x‚š˦z»PLš’àJmÞÊ^ÿ´X©pþ=ö#¾7]|è SW*ö"Á2©Ú³y2dþåܘYد-:óÝ&†b(ìâ·…>ujaä)gß ×¿¬t|[’7±PúxûMÀãyñDáåö…|ÓÚ5kS‰¦YûãS`#äÝ»rî6FÒ´1O¼ç>S#ÓÑÝèùÌŸ©'ÉÊ 1gàL—™$Ã,ä÷,£N™9gÓˆf*JJ•݉aªÕ{”C®Ù#"K2¬VCÕwG+GùÞ¢ìÀž<÷ëfÊK'»W÷ASÄ6Hý›ÝÉUµJ™T55õ! Î<:gMDÜb¥̮ɿ‘pBBòD&ÆÊÍÙÙmÕdœåC>–ØhtÍ3ìCê‡ô2¥j ê=͉Ó÷’z3Œ¦û°©ÏÍ·ùlù+MrÅ)ÏL´ ztâ1Øí gF¸uk¡ð­/Œ Ú}£“y)D´é¿ñ¬)°Ò^Ã*“\œ¨dzPYvßÅcÔç%·ƒö¼¿ŒÏŠ—çð¾HÎÝ7癓SûÉ7«ÍÎcgS%Ñ©}?Ržç8/Ž\A׫#••Þ“#ÓÊRôt‚€tðˆë*jüíC÷Ø8»ÛT© u.iÃîaMÚ Ž|emb·5¯¤µû• Gs†ÅíÞ"± “§KíBœÁÝ/‘í¤Xet ø·ŠÚ˜µÍr;2XMW?s‰ã͸SX‡ª.Ÿo£¥JÕL¬ÁR)ªxÒ® ~/÷Œe]E{~҂О¨r+”úm¶§¢'2èײ=Ÿƒ2]"Û¶ñ…w™¸X²Ý¦=>•8ïiÃ…éŸá9#¾.Žd8x¤TG_.þbñÃêÒÜÃb‡ñ.esY”¬ø©zúFxm§žABì¶Ñž!Kl¬$Û™ì³Hjº“‰u¼mLJhÒzõʲìd³îÛ3uŠ˜ íAåNÉ÷£¤RDÐuPÿe(i?¾F,i{wW ÿ‹’uùg£]³ƒ7ò?§0Ë«t¿¡ ‡«Š@,ÈgÎâ^û|èT¨Í´¯`>Lv=«1¯Ì–^5h é\½Å©¼P¸a«×/2¼µÏð‹Û¶ä_†jä%0¾2È]À‡.´'ÍDT’mkÓSƒFjB;v3 ÷Y=VXYbXÑ7‰7-/®NJƒâ^ÖÒzø“§_qFO]›FÉÇò\Ë"›I¥"ßu…|îÛ`qÔ,étû¼jvÆ0ŨžKLQûU.´Ü¶~]'™ð©´ …_‘ÀG9H6à«é%l ªÑ& gv’¨c*lÞ®[(óiåƒ÷rðŠWÄs׋ßö¥?J¿8Hè™™sw‘»¶Xøºc½g'7›>.l”Â?1›”Djc†`' H›®QÚ-¼5ßY Þ Жï¸4¤zŠéw¢äõ¬óŽ ðLuŸ^æWi”ÕÌÉU‹¡)°¾ ±þ(ï×'¥g‘ÂŽ!XÐ:s8ÎÒ°ªòÊ FÜTßG1]Wdvk0­ï€7ˆËéMc» ]þeÊ$Ñ<™áxFÉ;¼‰û¤È375pÓ¤bÇ×nÏ#;åÃM´B×~q.³ÕlÊ«­$ÕÍÞYߣøÓç“ÅÍÉÌA”×±ÈÈ ½uL:Þß*•C¾&É™OЫ*a0h¡ï¢rþï‹ÖGÆï"rù¡Þß1z²i¡¾5ËXvêJ¸®‰Á9{¾ígMÅo ºØM·êø» åyô²B/n¨¾?20¼|Jᑎ» ˜—2îDÏïþU&¯ù±½ÂãÓE*öü¦Sëâɘ¾lÐ:UþÏ*»î¦»ÎèðÖ­ÎëÙ¤4ݸr<þ¤GŽrf•°©¨ó2îkL8™–¥Êxå\a ãùæÜ?L£Wˆy¢yþFFDÔÅ0¶]ࡤ¤yøwéÕz’xœQôãz Í‡Mì RþÅ/Ðñò->RJÑ¥²yœY®·ìq‚Hg+Õ)—œVç> ¢­tFe)°¬R4xmMµ’ÑÕ†ÛôÓ>ÕþxodÁ4FÔüÓÕë¥!Ú*WÙÅ­oRtúv|ÝÃZB}íâ‰= 2øú)Ö¡¶—.o_¬Ë {%Îf`å$³:œN1§~Ò°a•1í·‡ÐðX/JW}6Fœ{“AÓ×+ÕÊArÑÃÏ sFç´ô.Ó<:¢ |ËÁRm-vlbOˆ±y>ìä᯸R=è[ßtNØ4œ©¾zºQÄé'5’ÒìT¿­ð¥Ý“OtÜqv™VÔÕ“`6=ÀÍÉ–ùÝò 1Ô˜Œµ-ožY·O †oŒ_MáyY_± M `¾YHcÌ£©‹?F|¦Ììþ™Ô'4‡ ‹$jú.s“ªû±^áiMÝ;gŸ‡†Ð.“=r0ƒ5Ðìá‹ø]ž§jöO“G3µbÌžx™Æø*Øžo×=HOTô œ¯2€š:ãæNuŽ F>êÍãÞ·³S$‡™9y|)¼]””¼üÉïTäã&ufÊ[hûý&F@9~:º/·Ýä-2ööð➉l²­4´Iõ~ß Ö‘LÎOaô€ á³RŸÄ γÉgQ:ÅXáíOêL4·œ$q¥ÑCižêãÐÔÓÀô«‚Õ’°Ü¹Î¤Ëù1ÝÓ*í<ÕwýæI~vTæùÖéöØÑ%jXÔb[ì>?UÍ8ùPódí’O:ëd3~-’m¬liüšÈðtººKï âú«é"9Ž3SA{ VGóDøî÷°BOâÑ| †)=µÓ‰Ð‡GNÏUPáRÝ9TËgÝ“igþÝcžžŸ¬JáÉ\öÁç=9IÎÃBs®Þöת¯o¯A‡rVèL±cæqUü#’Ž /’¶P®wɸo]3J<ˆòÁ”Ψ#(¡¾À‡ê÷ˆÖ¤–zÞ7± C9VM8/îñàë¬|Úù”/“—òó Ù ¤íüVس^µÎå˜%Ÿ?ÔÇr”;æF°ÇO¹~W{áÂËR_4CÑNƒn#àû Û¨ƒ(@ Sù˜Ÿ|ª÷äÅ+¹'M)Þ«¼EÊÔ5¬­ãXä9ñ¦ÓÈ ÀÏ›²ZcÜH¥®R|y}ïŒ"§ùx|X¸°—åñº¡Ò|_þ9Ýîdnj´’G™¦±^]QG*nM‡Gfã ¹÷ÄEˆø%)}@ÔÉÌ'=D¨ü¸Ì/¯AËøžF‰0Bgc¹·g,£ièqSûŸfúù+8íê>Æu´¿dólvø ~Òæª4¶»ú'ýHö×N¥G3Š›‡ë€åƒŽ_GGÆ Jñ{[z!YÌT) ‰#±öÁýÐlã.gݾÓ™âY…jJÜ:çu,û¿°P·f¤+‹L3| xðö͵Ó‰åBçwÌ8ç[Õʹ…£©œ¨wN‘~\0¼¾:`®Ñ_w¢¶ËJ dÔ©ýyÌZE(”ipÚ6¼Ÿ˜”3Y{Þëýú^ªs촄 Ý- |C–=C?îøîo·Ù~Ár³/P¿„a•’2Ÿ‘¥Ö¬Aþ k‹J>ˆ—ib.ŸÓß3 ‚äký»…®±sÒœÌH^ÎC``Zº¶°šÌtvåPs £‰‘ŽúÍ¡9õЇ¨Øb˜òí ÀÇë0aèÂO/ùrþí*™Ÿbåö\ò©h»pVúdˆÔ´máþ¤ú7 ô 4Z/5˹—Ô1k‡îIZû!\M•„ýMŸz­ðžó ”Ï’é©™NTGN[.· ¾&ê~7¯6z?·×w+( «¦ÍÖ¢ó†‚?9œ¾izÝå–C¹!ÍWYp;€¡ih}E4°³Qe®Ê£»8Aa½vé¹hµzäøI9)_Uýà bÌô`û9MœMïtœUP¹)8E¬P¦§á&·Ôý§s:ŧÔ#~‰ú÷A{VçæYt†¤ÏQ¥¥B³ÁÅK'Âu§k6)ž†7OÔ¤E¿VóàM$‡\±p ¥×*¸lÈÊD Z¶»ëuT$‡Ƚ‡|j"1,íšÁß&ŠÅ,ʳº–% ¡MXë?¥“’1ŸÊ ×Zij"!Í\c¡*„¦Lt`9>óÄøèH^U.¹_gY‘ÎI„±­´B~0Up#Üú†ä±wwÈÇz"ÜÚòbÖ$_Þ¯a};7s„މÌMå¼ó¹?¤wáT…DŽáª*„LÖ+‡ls‚ÏzDNÑ}Ø)Ðù©`°{ž­¸š6û´)hãFwýšý±½ÚÜΜ—×õãÓãÜlÚ¼bó^ô=ž qdRùÂnñäž‘ª4Ùü\]ø8OyɲY'øUNèÅyÏ”dY«ÿ€ñ|è¸Ãj4ù¨¦È¥³Ð¼NBJ½ùùü¡#‘Ø8näW¢{UÚš–ßZ´Ÿ+³S=‘5SxuQ°NŸO2i†û¬ù«éczÙøü+W‘3ÏùT™† ÃÍ¡¯³Ÿáh7ÄÓÑP¹M«õîñ-“è¶d¯ÎPö 1ÊJ>½M%Á$¹s=S4 Tá Øl’òùÎOa›Ú â9ï –˜º Ûô;>ªLR(õÉÄ4?†^v¤eÔäð}Õò…Ú°çT°p[DŸÄmu§U­•äc;1’½Qîg³Z2Í9 cEl ¥íTÊ3îëkÊ<|!é÷â‹-*:0cÂ’§OÛê9RO¤yª,õLÙwt`U3ïð ÆèAØõ[Ž—}”;Zx?È9ÄçGÖv“<£Ûž3ªlÞɘ4YWiâÐ'AûÆ}¾Üdª -Šƒ~£n­ðŠÀÉkÇïÍÉøAœe ÏäöãUŠ ô­tU=Òw÷é‰.úÓܶh>‹ý|H1•r÷iÄK9o‚îG¹/Lj!Ðc§?ÿ¹¶ÿ¶ç-‹c´¾ÍnJ§^Œr×s\—Å–—/Ðì±­Ø“¹ŸõŒMùÒÛg•q¼Ý ãêD@þcMŸ?º‘CW”´Lt_ø¼\ÄNvjC–>ôÃèÏÁ›šT“gÕòÔk\Î<,‘-È»pƒŠ2»DãÜ.²>¯ãT´MnFçY_Õ”TØ®k2œ8ASu“ú^ w«Š6†…gîZ[¾Ž ÆŽ2·n•uP“\WÃ*F8²),~송L¤*l½ávH ÊWŒ¢òíO­–NŠƒ Õ¾¨–G+sM¶×L²ÙÊÀ¬9D!Yì1ƒÓÿ"ÐÌÌÛU¬wìì ɉJcR) •Iî}Õ2HGk~ñØóŠÙnPâØ/ÌC¥éÖ¬;/t‚ó„qD¿í[fŒÖǧ„6ÏuJÍõ]ÞÁ,\ûkÒÜ'èûbäIô,¢:ÝŽÚ=k;,ÖÌ¼ÍÆ»•GÞíÉi5š-![‡+g# ý‰m…N^jŠ ¶+ÙyœåW Ý->:¼·TØp0_°œ#ña¥‰’Éå©ÙoÆŽÙtR”ít”ÆÂ쪵¬ÃÿAC¤´Mc¥³#Å~[5eÙè©Þt–ª%øCD;#;4µÉ¯Š©„uŸè,¥ŽyT¹ìÓó‹>ßG²›á§‹^xÚ7tg‡"#ž©¬¤¯~Ü/$Æ¿pÛKÝ=•"A<Í5^_Äyx¾Ïa„×ú„_ûýÂÙÓ ˆ’{fã…§J.Œú‹Adp_{åÇëÀ™äMüÎv;(×9ÂUJÑÖíõÆÇ{†SM|LY—¢ D»ÈŒ‘n<#f;b›Æôk.»)qæ%î¯nh.㙸rü¦à®¨é.h†Õ»al.ó’½ÂçöêS%K¼é¬¡±9î?ÿiš endstream endobj 812 0 obj << /Length1 1586 /Length2 6857 /Length3 0 /Length 7885 /Filter /FlateDecode >> stream xÚ´Tì6N—€´ ÄéÒt§0Æ€Œ1ºSZ$T)iPJ@J@Rº‘NAAêÃxoüÿç|ßÙ9Ûžûºî|®ûaaÔÑ瑳…Û@”á0$—_  ©däðó òòó °°@‘οì,F„;“øC!olŠ ä Q¨{8€‚ ˆPT‚Ÿ ÀÏ/þŽ(‚PP[€&/@ƒ¸°(À]½P{äMž¿þØÁ ¸¸(÷/w€œ ƒ`MÒâr“ rèÃÁPÒû_!Ø8 ‘®||žžž¼ w^8Â^šƒà E:ô î b øÙ2@ äùÓ/ ÀÀêþЇÛ!=AàÆà C`î7.0[p“ ¯¦Ðv…À~“5~¸†òÿî÷Ï@PØ/g wqÁ¼¡0{€ÔÐVÖàEz!¹ ˜íO"ÈÙ~ãB Î ›¯ÒAe9]è¦Ã?ý¹ƒPW¤;¯;Ôùg|?ÃÜŒY f«wqÀî?ëS„" à›¹{óý¹\'Üæû×É ³µûÙ†­‡+Ÿ! êæQSüù1üm³‡ Âüâ¢""ˆâvàû™ÀÀÛò þ4ßôàïë wØÝ´ñ‡ÚAn~|ÝA(‰ð€øûþø÷‰ØBÁH€ Ä #ø;úb÷û|sÿ¨ÀœÿF~@ÿÏÏÿþYÞ(Ìsöþ›þëŠù Lä4µ¸þ´ü?P^îðåðˆ‹ð€BÂBQQ€ÿ¿造 ù‡³Ìÿ]ïÍ þªõGì6„ðïXZðéBì+Ý‚_˜|óüÖû/—ÿ?™ÿŒòUú+Röpvþ…³ÿ&üp ÔÙûãFºÈ›5Єß,ì¿TcÈïÝÕ„ØB=\þ‹ª!A7ë ³wþß ¡îÊP/ˆ­ vø­˜ßvß»æ …AtàîП¯ €ÈÏÿìfÁÀN7/ˆû,A›ýùwJ%nûsÑ„E äMpsÍ7'a€/ðf#m!^¿„ àã…Á‘7.€›öüvpÁÏ; øl 0Ä uµ½Ù gˆò'ç,øø÷þ ý÷pý³ð¿Àÿ¸Šø\o^ _ å¡ö¢€_ü"bb>w—_¯±-ÔÝÕäý7Èÿ ñúé_Ã{ nÂ" úf’=QˆL0=K†9Ö„5ŸVÉÝóäY”úIJfüŒƒÇwÑâñƒ7…£2#dq"—ÒûždnE‰ýXv†áÒw§¡7²ñ©nӹ߅Õ½‘µ&‚©aªî¡ü¹×]tø´<²ë~—n~FÁN˜ è­ê,9nbÄ:yä§ž*^¯»Jf?FL¬é®WŠ<¼uQ2Êgk\4Æ’k“9NÍ„ƒä¡Ãã$;ðº=v|ò‰,{èšAý ÿnœ`¯Ù’@üÙ¸Ï|™€{Í}3j:Ìc²#¬¾ò›©êw&}‹ ^Ž1ÆÛ¹^«È˜Ÿ#<2Ø„©´ uÀ¯æ¼ò½ò)»òpþä¢Fp¼Éà—_=³wî—)hÚ>ĥŌ`µ05ðeF•¹ôšq”„EUs ¹BÍ» Â_ˆÆ veRI°zhåZʯâ«CHoå^¡Îß³“}ŽÂUGS#VÖæÃv2ãPÀ(t ~êSúœS´ÀÄåù¢“(¶h:âÔžu"¦ÌðbŸ‚K±ÜX® kiqì5ýÝjϸN¦—äKKD&©lþ:îu|6i® nJÅRÐÞZ€Ýu¡°±©3_T²²æQÞiàéç7LéeØIÛž/PeŸ{Æ"¯(u;W;jhh„.ê&Nwñ°â)Æ·º„”ŠYqQ ÔÝæýÆpWç•Gì{_$)G=C–_j›Ì‘àS¹™¾„áÌRyæöL.Ë>ŧ½bS£ÙKþÑJ–çý&¸º‹cÁÚCí%©\Ê®=|—÷–º–ÀÌrAÍ¡¡SY!@õÖ¦Èj—Ú2 fÄ=öã;9mh‹£ù¥jÍØk£pÍ$G±‚íÀ©ä±™üÚ öÓMèr]Osp¹¾J>G{Щ–Á—¸%½‘wël} ŽrÒÄÊ8Gýj>ßUÃ_UyßOË»À&¬½7ÍËWíå8 &˜N‚{<»¿,ê#}w½å¶øw­‘ ÏÌWÔË%Ž ƒ—ŠœtMjþÙõn´UŸ‹gm¼&¥¿ŸÐyû·$V°nI îH9[ŽÓï>K¼yS¹¯ô4¦:[´gž ÷(uèò„(ªÇ<ïöš’Þ€ä‡C½­8Édb¦nö®W¯Þ“Q`–´wàx7N¨jø‚/Ó}Å0ßö DöÎúAD&;9Ãô¨¸ô{~\þã:Ýý‘¬¯ªméSÝ\À‹Ì+jÄ5õ›kÊ'µsž(ý×XtYÓ„a °Õ~¾`†(;oTœÅùûK”v¤Ìá|ŒÙÐã>-fµý 6t ñ9ÏÞóŽp LׄoWØÖÛ-Ðò],öU~-lt»‚¼¯•±rÍ}OÌežžõ]û§~ÕšåèâAsä?*URc4—¤i~{0ÚòvÇÀ®ØüÝNë½~Ÿù-ßœ¹[… ŠVÓoàÏ ]ù=Ø]eôågvk—wÎPý°rƒ}{yûéGvaÚùÆe·ÂIÞ >œ·ßx õ8Øœz ‘¾wr¦Õž8™rJVVÈðÝ­8¥ÏÛ?‘Ç•ÐÌÿáqàƒåïE–õQY.¸fß÷ rz Ó+Î¥ZŒLo³ê]ù–3 ÎÎ5o²íh!Dèz«lârœò­B©g^¬àmU]Qeßi{uw`y‡­M6ŠØM¹,XçK| ùp>1ÈêäÜjºS4oÐ*‡iƒÞ=ÀoV,ﻚŸKd;±Ö‚# ~’Z±*}Õû„÷xða™hì2ֳɄD¼‘©;í$’ª6w˹̅å¿q¢Ñ¦´â¹ HŠæ¼Vc†Ë`èobL)Y84×XÛ;+=9xÄæ{¡Ãaô±6 Wž;ÈofIgp7® @‘”’ý$ºûQ)BàG“}°sR Ã¥0ήHó¢‰g“òŠh7Týúê4€À¸(šŒò²Ì3ò,.îåkíü– £íЍphú˜z„Æõ§,I)4¾ãÞóÏ0”Ñh.˜$*¦€æsW_2o›Á&ÜÃ!YË–<Šk¼©_Ÿe€‘¬V© ]÷³V2Õ,§žu—–°å%„=ür¢¨©Ó©{4Èý^ÉxX+®ÈƒëÓªÜ&Å­Vûñ, Å| ‹Kì[Eð²ôœifKÆ]“ ®Š¡áíªò“ÑðwßµKØÝ)5!ÕlŸÛ%Î a'+ @âxÅvn‹¹J¬UÁOVQL\ØŒëö+ñ˜tÎ$Ô’,N›ƒ DÌ!±/P»Lø!oYf5_½Ç’K™ˆÐò ÿÀÒ˜bG­x^c-¹.­¶Óüzýe÷š}=cF®‚>tsªãÜn¸ÇþN´3µ‡\0Ç;•Îð`>oòÀ”MÕ.‰½Ëöté±]©ìrúsÔÔç²è+³ËJÇ[Zò5–¡¼Þo¡ÇÆ‚çøÂ¾Q±î3¡‘KÞÛš4½°,·Îa„}/jªÍª`·ý¾¡•…és£*Eæº>óö€\îû­°PLKŒ~Þã0ThÝHsbzùDb^#Ë©g8É?!µúà³Ð{!<ëX/ÅîƒNt¸„Òr–ÞW3L„Y"2-¢â…¥çÆBÖqº‚\IV ›£e®ÔùùC¡(ì#º}%¹©üêA‰~Mí1P÷(—‘I¯ùJ¡ ÷< hš³!š:i@D<Í,ºÊ²/¿©9*Ô¯Òš¾oH†‚*‰:TÞÌóœDptÓ1<¦Ÿà[åYÁÔFU cv‘¶Ëz¾Š X62_£OŽ|8û†îá‹ö…¿ÿ¥Oï3´cx{h}ÍÐôæ«õø&LŤa3}”u?$l[ßV3B4³B&÷*û*QX· iÈRZ-HWƒi¼ùжæ¾m¹MÀ}ÌÀŸ„ý7ŸP56¼ÖªÃÇSJ*‰¿eäúMâfзKÜ­¿Rzo‘^q E¯bB½2Lë—”Xûb®{¨÷iM|ŠÖ Íö]Ä™g[JŸåÔ“|‚æ³(-P§å²šÙö™–íL]›L™hÈË*y¿´‹íÔ/c½!žÍr¤} º-E¯wzl—w}Ÿž•ãÒ¬#)¿†jº’Gä@g‚ÙÉs¿sYpß!r5³{ÓÚ‘×Pî v¶Rº»;uÑöv0HƒùÞÙ䨧êö÷õdÛå/¤,MEÉ83â'¡ºWFcݹOaˆ®ã’{ô%[Mqú¶O°»œM:5€Úw´ñKÑ6‹‚a¥[ò^X·!$„'²@=mGìÓp*¼ð3‹ïÏä½ÁžÄÏ|¨2‰»û$ººOŸT'e»¶ÈjñS Sð(\·>*…ÐÞÞ\-¤ä-s ìQ{Z±²0±ÕtguV~»ñÌlÇ¢Cž’¾4\Ø!$Qq›FéeN¥í#ò.Ï’÷ÑÓк7.€óÅ“m·Y™ôN ®6½ÛAx°É-ºz@ȹúïZ›âJ»EŒ¿š¨4‹Ø~‰úþÎŒ$‰¨õª”B”±Fy’||ø#àá4¯wï‹Udø{ÇG1<ë#læ°|˜7¥¶ÙK íÕ«1Ãøä’À¢Äw‚>’ÊÐr V‘"ŸQ:ÏÒ°b6¼†‘V{U—-¦¯ZcðDöá«)^FC¯á¯·!zŽR†RƒŠnëÕ “X³<ķαÜÒH,ê*cH—5lZx›¯ÃÀ«WØ,3^–¥“%±*ÊÛ;1 î´¬öêŸéyGdÍšÍHŒÇu8?‰wò(ø 6éCBÌØÏ‡¸0Œ-Ä/ÜâèrÐ~“¤‰«iÛ9@Ò°žx5A¸:®å39üÆTEÍÏ´%WºSV×s A<_®OrŽÇ”׺ƒÈË™¯2Ý@x‹Ç8ÄtÉlƒ¦³R„1€ (L±6bõcIZf€óÉŽçüÝn¿ÆÎNKµ¨ÿ‘ÊÞè=ÎH•pYøèóô&»FQý- °à´#*ÒçÈ!z”v|K|ëMrEôzÚ=Ñ r³cÓôµ¸×A µÛ—J$¸ß$]R„+Üçœq0W ~Ï‚.·©qôŽ™+ßûiªÓ°´ž©s¯‰K«ie^b¯âcÛÒrnóœ‹²ŠŠHå<ƒíœüà(û~pÈpuk‹D> \¼'2ÅÂw?¬üàºÙ%~̆¤Â7¤—§(¨-ÐíJa ý¡|íÚ5V0;Æ-f³¶“V²£Ü0¤œüìin¾’qó°¢Rψ°{3¯Ž"D?l>º¬Zâüþ¼?W(‚s«Ü890+ý;h¡ÂЦ5ÃÂR©åŽë×!£á¯É׮Ȼ‚ö(Ç=ŽöJ`{ì\>£´ íø!手ϛy÷À&ˆ)£Šå!Þ#¨px‡x»‚ßwK:õUŒ;B¹®HÇ®èŽ' ÉÏ>D&Ç t–ßSa€l>^ãcÐc3¥À_”eQj2DØ|Uªæ?,oOÇÅ5”©´,Û˜æjÙ‰ü®šïÒ—vÌKÖcíEó•kŠ<ä©€›™–ãJuáÒX“º¥êa‰d·Xew¡\¡û.«Û…Ü­¸1ÞÈ[À­t NB»;þvLÍFÑ!«ÄÌÙA`ldDØ’£¶¤£+¶Ct´r‰)=¶%¢¶qÁOšï=\{Ñ÷n„WǺƘ`„Mà[ÿúÄÚ êÜÓ™×ãü|8$pîlž®‹±Â4-Í'}‚©ÿ2TyÑIoàyýøàwù k§e–˜gj6  ˜Å•ÞL¤µ-Í6Ñ€rNæMÕ®i¡~üó\>cg*í­â ËvßbÇD‚¶j»´”(«Ç®~ÉkÛRfÚé=ì_¸J.­wTñ …‰^dŒÐGŠÚ:à}Àh(µ4šÖŽ…ífä‘+²›wðQ UŒÉìuD»>9ÙO±*'â6ÛIKÍcè¤â5Šb'AÄÊE’!žyü «àÖ×›tr©UÉs!»s¤àà&%äJáÄ”þ#,âçX¯æ&@ÜÖ¯1w’>‹Ï·Ø­_B¾ž~w #§!F 8Èó•mKQ™ÄÞFÊ™æÃ¹6í:¾gŸdƒ‡{…&†ˆ?³&˜ªžñõÐÒ—2^E_u{(í–¬¼Gÿv»&Мa ‹ã–ZÜ|†«M¼¯¼{ïöÜ‚qdÇ{_ÕÌo’æñý¢ò¡ö9Þ‰3×Äwõ×è'C|O;ß? ƒZñÚw;”•bP=þƒuÝ À'±ûoDzÈ·Oð©6kEý‘¥kWEq¢.G'Ó~†ŠÑ σ G î¥GûuéÅ@–+Öo$œîdF6y'6s!#-B¨@Z Ø ¾d–‚Ÿøøºª…†jCm3Þ)b?”×ëÝn4Ü’ú>±,[aÂÅMƒmCƒÃ-† m ³ecáLš5wWX·iíu£o‰·ß³ìHÀ|6)œ,âü!Dîp)çuÃóÈÚ˜ì(¤&è»sÿ-4ð5ϾL;˜Æ‰ŒxYGäys ˜5ÃõD%ëÃÛ³ÜUë©á¦ž.#^}ÝÝÃz†Hr´âõä*eð‹öÛêãŸË¨§ #£–ßg–‘‹î:‚ßáÖE—·E^.& ó¬•´¾fào™ê‹\jÖ¸Òü’¶D䔿 VT©R%1eívû„ÚóçáiZnÒûþUÉ{Û«îìåqÌ:òÓïpm$K´zBS~µÇÚ ñ¯ÄÅáQjÔlh(Ñ5+deÍÞ½R)¿{Mô1…óù•Îv:*™³ÀÉOøMñ\d=N¦Ìk]pÉw–åÍp¥Ò·â:¨Ñu[εc÷§âʆ¢d—¡ôZ^æ/Nn}~; $Õ™œÒ1㣠ÒåÄZErm}ž¾ÍÔØ;DªìÛë\dzróf¶$0Û7ᔆÇ^ +KL·íc]JxË}—Ñj¯¥ø¼€1¶ß²vm²7ð…©Ì‰^%ÏKÙlùl» ç·ä§šÊ–ÆÕûcòGûŠ_Èï‹ÜïK+zÀ¿W¿²Ô#•,¹J­ÎÔ–[7Y,?WÑn;xæo„UÔ(EŠæ„’Ž‘.í£‚ IQ1û;\œ-¤}Õñ’ª]ûˆOv"L ýhO©0ç‰ ½75;;W×…æˆÒN:ôªóopào ‹R*éÅôÈ!O]Yò'Ì «Š¼Â¦˜шǃ…ÜØ·¨ Òïùâ ²Ût”Ÿn b˜RV–k­^½rˆ‹¿ö¿øáhéä³+߸B-$æ¼6ÐÃ)ý~å=¢ÒBb;ü¯é”õ­¿ÓØÝ±@ æÝ‹mÊÜ”)¬0ŠFìíÕn$}°[jrwim;E0uùçš§Õ‘gea9ÞOØñÝçÆ“Ö[ï-Wâ±Ìûë®O•YJÜ&£x‚.Ýa@Ü¿×85©Y¿ »„(G3ZÝ™±[JuµA¸Y纟xÈhœøM«*¨Ðç&{Àø¹tÊdSq-^¨ä gŠ@Ð7èç*„/8>3l ʱ¤?7¦Û«9—Ž”Ø©3‰õŸ#ÚÀ4w¨¹~HºOmH’²òÍuݺ]2Fÿñr![Ûïãn$"s#˜•Ž"òuïI÷Õ±àQ³Îø;íDžWÊà?Á sUžö9¯Ã~RƒuÉOsö“RA-³6Oáh¬•œKÓ$y6–4uXÏx¥„§¼1›…%ð¢ön~ù-WÀ9!ÓËI*q†ã©ÏA.‹(,9pÚkÉÐɧ›Ýcwãh†Vš:³ÃæH>%©=úˆé#%¥Ñ•1“ÙT²BÆèa½f±Ì¶J½•#œˆ}Ïñè«QbëÇÔ:J gô*Õª//3Ž»òÙ<¡Ù”Ì4õ[‘¨bpØ1 [Õ‹†Ä Ú…[kV¦xŸÒ %Ø“áûµ“![î¬ uêðÄ#O &‘›N\–ïâ—øì ‡¡x›Ôù•¾’«fb§G«Ù¶%ÚNñKý;¡E8\Ÿ§ i¾Váç…GÜÏ4VÂÑ«)y²±J$º©>ùˆ®Á@ÏTÙDˆ|:ÐðÐI*xÝshoˆÍrL•ô#{ýKï<Ëèšn'UƇé¤×þ®NŠ0«T¾s»Ñ»-´š¥8éñ£‰ ýË…%«™¢ÿ½l½úI§Ô:>JƒU‡ÝêñQ«Ê‰~ãösù-U8µ‹¤š#÷kð÷bZq•hg×Ñ>ƒ¹¨+§Ëbj«ür0¬.P‰ãš(@TG¯'{'y ê0muwR‚ª=ØFF£$W~M»mæCÌ*ÙÏýw}¹â7‚äÀ¡¢²öÔÕëMr`Ú·½TVv)>8hÍ=ïwç6—ñžÛ^ÑÉõJÒ(ˆ‹÷&¢˜„L½÷ï{™ôë$õëQšºEuÈbéMqUNpž}Èí)ü?|X[ endstream endobj 814 0 obj << /Length1 2515 /Length2 12290 /Length3 0 /Length 13724 /Filter /FlateDecode >> stream xÚ¶Tê.LHƒ 2twwwKw0ÄЊt+Ý¥t‡ 4Ò)Ý Ò%ÝÜqï}6žóÿkÝ»Xk˜çíþ†ŠLUIÌÂÁ (ívebcfåH(Éih°±XY9˜YYÙ‘©¨4@®vÀÈTZ@g˜ÿ g ©+„&iê ‘TräÝìl6n~6~VV;++ßœù’¦î €3@Þ tA¦’ppôrYY»Býç+€ÖœÀÆÇÇÃø—:@Ìè 27”L]­öæ¦vusÐÕë¿LÐ Z»º:ò³°xxx0›Ú»0;8[ Ó1<@®Ö€7@ ³;Ðð;i€²©=ð?¹1#S4¬A.sÔ,]=LÁd»@tÜÀ@gÄ=@]N âÿ-¬ø·#àŸêؘÙþ5÷öoC ð_ʦææöަ`/Ø ` ²T¤™]=]¦`‹ß‚¦v.}SwS©Dà¯ØMÒbjSHŠÿ$èbî rtuavÙýN’å·H¥Àöö@°« òïø$AÎ@sHá½XþÓ_[°ƒØç_h [XþNÄÂÍ‘E rrÊIþ#!!?Ó¬€®.VVV>Ð ô4·fùíBÃËø“í7’…Ÿ£ƒ#À’Ðd „üCöq1u\Ý€~>2þ!³±,@æ®3 ŒülBZþ!#à òè³B& Àúûïßo†!³pÛy=‹ÿÕe=-]5y†ÿäü/W\ÜÁàñÊÄÎÁàææpóqüþÛŒª)èŸ0þД[:øþŽR¦ÿDìþÏÐþ³"t€ÿ¶¥ì™] €öyÔ X¹XÍ!lÿÏÿ—Êÿßœÿ¶òõÿ IÚÍÎî/Ú$þ?¦ö ;¯D Ãëæ Y%È:€ÿWTø÷ú*-@nöÿË•s5…,„Ø 2ÔLlœÌ¬œÓA.Ò O …*ÈÕÜú¯ù›¬ù{ãì@` ªƒ è÷‘(±²þ²fæ¶CâÍ¿X@Èý·[)°¹ƒÅïucçâ˜:;›z!³B&Š‹ ÒzÈ^Z=ÿf 3ØÁ¢€¤è°tpFþÝYn.‹ØoÒ߈À"þŒx,ψÀ"ùŒø,Rÿ"V‹ô3b°È<#v‹ì3â°È=#ˆw…gñ®øŒ Þ•žÄ»ò3‚xWùñB¼«>#ˆwµgñþæA¼«?#N‹Æ3‚Ä¢ùŒ ÞµÿE|dúŒ ±˜ý‹ØØ!fÌLŸÙÌœMÍmÆÒõ™Îñ/ýïåø—ÉÆü_ınî`ˆÿP89SìíŸ#ø=),@ˆKàso~#'7ÈN= @Ê`ùì‰%ÈýYƒë7ÛÁÍùˆˆÕ³Eßê÷üS–õsòY{9ZÁH@h ? ¤¿6@HQmÿ€¼ÿŒRûg¹k,Ï–9 †Ánöf¿ï‘Õ!·ŽÅá9$ˆ È3ü’†ã3bÒò‚ÿ«KœlÿPÿ»GœØ!gËáªC~°8=Ç)‡“›ƒ+ÐÂì9 ¾ˆÿmí/ÍßdÐ_÷âÙ$ÄÈ%fƒäéòÜ¥ßèþG…¹ â.÷âß(!%u±3u±þÃ$ðgÇCÌâjí ü£õ*¸z8ü¡±áö„´ÅýIÈãÙ‡h{þ!æ½þ€z{?±ä tþÛÕ1s7gHÁ]ÿzn î?ø¯@ 'ÐynÚÁ\ Ȧ&¨ùºJŒÈƒéçG'·æå“)'r´ô3Ìwe|Ûb"ÎÜ ÞÄLIÕAká }X%XèDRÑ<¶|â-̘XÁ˜0²á„̵‚Êü¨'ˆ´£¿X; ?Fá'gïJxõÈ“•^êR K cª‡8à¼%¹ÖÛÞqR'z]ú©IegšŽ÷öý‘Ь¿?üd«$«ÍûÐdù¶ú±y=”úƒ+¬òL“©é.q4®·“!2È®5'fDºÅ<ü­Ãmì·Ö- ¢­ÐíŒù94ÛgŒùýWsаqþH{ÄùVa^ûJ1xy ¥­m‘U4¬[ï‰^sèÃèT±ÿ ú™¾GñŽÿ}û¢³q¹–§ (3šÝB•ù¶Ø¢S5ÜwµÜ5À åAdï7²èϨùÄÜ$’SHÌGÙ¼Ä÷¶7½é%f4Y /g6j{SãHm\Iè;bSh….¬´NnAºs•§ðˆ•cWÇU•û±ÙxÑ‹0ugƒÁžâ°—™_úéÏ>ÑSÖ÷ ð´ÂJOÊØ—6=§Ú>ݘiÏϺˆK-½°0# ò·ÞéÑå >¥<|ØšøôTõ5—3íëðžn cˆò»ö‡´F­b‰T‡$ãjuznT´&9Ê"¹È%¿ 2>0+‡ºVÝ’j¦Ÿ;âôw'xÜsi¿z‰(†Í*ô-ÜY-_ãä>ïÒ0 ½™ç(©šWÆœËà·²hpdÑ0Õ{lçÞ)ÎÅXäøï’ä¡Màö–A©ÿ6xõ§ô»ÎŒÄ©\°°  ²<=¡ÿ'}v‡¬ê>Èó]ÈL®'wtM¾[5VŽ‘ëýº†äjÁ5¬í©/ü!×â.s@ª€U –«ùÝÃ:þA“Æ\ê+ÿ¡ís åÔ@Ó–\„ŠIKÌLQ÷R[Øòü{æž™õ»#IÛžÖ/*?+£=hP¨´à~úŒBakØ(=Ýü>X_¹íuµ$ IÌ&äÆ} oàìÀòÅùmOEÒkzŸu¬lF) :Æ~ ”ÓÀz̶_îP kü‰‰áëÑïø1€µm¢!“Åš9þ{^tP¸—#iVsá‰Ç½Dzvà«_s÷ÓîM°u%×Ð3»Cáƒå¬}ìð W[VH²a]ò]?àÄÙ:ß?&hx%öíù°/î㆖éjÀuçÒÐ#v/vÒÄC¹5¡¼xò¶µÅ6’ÛD>}üHE™˜Ø®ïS~§ð6Æï!Μ«ÌnÇïxž!N÷d¢4#G`Œ Ñ){vÍL‰"äÝ%2’ålEi±÷ˆ/¥Æ9Âý¼¡öÌÁ ;Ãí0[ñg6²Ýk­@Ñhþ{Ž÷/É–…Å+;`i“ÒõøóÐ%öS¾ÕÁ'oñ”Hiöß(öN=ŒÔmF´+¾p8ZAPpÜž1ß}Ÿ‰Q¤"NߦC¿C §’È/n¢A¢zëržÑu¬V¿™½3Ye¹øuFóͷÂÞ)£S0y¾m=óŒR6ÙXî3öÇîT-”·j@Wvuµ;õ%7 ž3‡WñM*ø¥yZ¡¦ü£ØÀl•ØL}laÆÚIQE#¡Å@Lk…VPÐþ]z*g{/|ÉÇ 1]”׿rÚù=ß@Kõ2\qÙ"á·I/ßñ”ºê÷HðDTZŸRSã „2H3}WmsÓ¤–ÐãjÁ#û¯Úá-r5­iw‰´Mã)»s»u7Hµ 33°ãO‹‘š_§Ïo”+7#8ž¨ê¢Ò˜gÃ"-£‚²ðTÛ¨}p°ÿ@]¨£Ý/;ñª‚éEçªpÀ®~ýGœ{¶-ÿ N=J†8. ÝŒd›|²e !Ëi¢RÍÑN0`l7¡°l$:VÏ@°(wµ8Õ€äÕµn‹JàEÕ>•m˜bmŸ*nS¶dFéU?ý›¬5aæ†Õó%ú6lIdOéÛ€Fp| þGI˜$¬£É˜ ýRm}= C“yÉä5Ï¢ _lvT¸kûè—n÷0íq&8dˆ@F6¤W;‚윟zºIÙØ­ÒðHíú|aïg•êNÕëH‰Ö6?'±ŠÁjñ‰õ‰ù 5\Ê;{î'ôÅu¶¹ }ZÔEŽÉ†™²¨N]ëIVø)ßÿ ý°Ù6.ÛzóÛë2^߈¤ped#n •]x7tŒôþÖw(¥ïˆGl¬­Q –95ÕÔñuÆÄVhVs¡ÓÏ@$ÛÝà ¢³ô™öôö·vìN¢EïSoòOz;%2µÈ\ûdfh‡—ù2¼£™éfݧ9ÙI«ÐÆ)7wð%ö¬IF Úµ·”º{·÷†= +m£°ûÊ+;š— ØO\}³ûµõ·ƒ_yI Dã;×^/ÜèTußèhk¸@ 1M»×Ð0už¥$e¼ï[Žñ)#ÐÆä^o˜¾4-ÜáHKènݧ9˜1¸ÅBa,i¾Fè­@4ÂBˆ@Cžº»Û«1Îæî†¤Õ#t6} yY†á÷jÿã½Úï¤<ùoÕ0`ç`¾ê"èiðâãf1 » ËÓc¶.ñ ‚¶Ü?œ’H‰Ž9¯s‘À\Â@㯠ÍÇaÓ‰¢óâïu ˜¾÷*Õ O cjB©;œXÐù‹ æS¨ã¦Ç³Í¸Pö0¡©•ïðì€ÆÈU©‘ä˵¥àºäÉ« çM:¨kG2…wÖ^X×:sf]˜G«-q¹>)·D{7ú=ÊWŒÕÏ4Ô”S^/Å›î;Íj7•”š»~‚м~&81›¥¤kf"Bî!W¼÷B¡;üœ‡æYôR?,è-A±žýP)Þ>oð0nL¦p®Ð|²‚%¹Nž8ë›Ïõì´NI¢jM¯’'Sß°l‘¾‡vâDée?y ¿ƒAâµî"Â]âÖqì2Fp?ÆÌJô†`WÊ!³’¬æ¦Èì †-:´¯ VÁh¥ü>ƒxLßFÖŽŸ¥Ô˜³Å¸Ü¥®Ë‰žQÑ·”2Ž ²ÕÜÚ&4Fù¨˜jlWFtM¼âu^\Ú—(j-GŒ@wÌ¥èVp Ô$Î<³‚w\†ž¿ã@™t÷_UOØ;µôójÔÚQ¦çåˆÔGáÌøJÚ3 N“º×kËR÷–Òî©àú–ú54ªÉ­{UçêûTû˜Gì€üá£PC’1rûjG9ŠN–‰PîIß®|Ž1Z b–hÖÇI7e¢ðÕîb¹º.¿ïâ;c­çŸÓîåNe…S¬‰©í»?)çÀWŒäš –h9êõÔ$Ýu…¢yúÓZ›o±öê–Yœ Æ´ñµmîÅßÜ€£bgç±"~ÙÈî|‘4=°‘à´gMò¥ßV}sÿõ‹òÛáŸ'á 5Õ×áí[Zæñí¬kPÉÄÌ´â3¯eèóà Z_º¦7—›bΗiòö´Ð9³Ï,pÔ©€ðØ8£<UCÆ&»)ü>ŸIbÎF:{˜³Ìõpo„×I…|—UxÎcúÙE wèÔöçƒ8 ù’ÉÆ#YlR˜öŸVØT%(îñȲPõÆÆu±=1œT2ýhP¿óZãì®FÍ÷‹VõK\Ïó±¯=‚ïõ¨füfȳux¡Ø³«v0p{ŽY‡§)ÿ‚êKF `>Å^{MÂl8˜¥ìØÂ“!擇]fŒQÒf¨tß:©Q‹\9s<ôEèlMfËx0­«&M÷3Ï@e9kb]ÄÁîë×­o“)WF‡¡%xÓ^%qmž¨¶¿vçýíéãß>~à#7ºT|kU4«T61.œÛUõÀÕ 5¨pWùYÝù9ŠLô‰h ~.œÌii<ô‡fòÇVù“À²ÆÉoP·›¯eÙÛš;‰ýοº3àýPMK8ðå E§Ž1Çc]%ôR 9æŒïnÝ¡yëí}V‹Ö­vó™-m#æ˜a›Sa§ù׿åWFÁN]˜pRŠ„th¯~[–¼n½×(Ç,DÈÛ+wC¦ãÄûÐúÁ:¤ØñÙ ~Í'ÉŠdÒ+~–’TlÞ©4½AÍÉç4=ÂmågZ†û–t ˜Ò"¤A°t[[®ðzIô½ÎÞ,T3œ€Þ3Ê¿p?ð•Rîd€cË—(Ý2εä6¨Á ßsfuwQ8{MC  +ZHð…c³tßbÔx ¯©o¼ C¨ãêOš¾ôidx‡Âd`•e—DZ 4°yúå>Ì—ðúš‹,yj¿ÆžÒ­šV7íOBí¡ëé-}.]…$üâP˜ý…-ôpð—Õ–«;½œ0%¦6@ÌÄž°ÖJhØ¡žk è· Äg§sª[KyÙ,ô×Ç®s`QnÐz£îÑ«‘}°Em;s¶=æ\`‚ŽÚŒ­p[°hÀÄÑÕ»æª/mH‡òœ¼{þìŸHˆ0Éb5n‹#‘z3í¹L©T®`vŽ`BÖ ‰þò EØS3 z_Ž÷=ü}C òsè?SÄcÉÏÐtÔùñI1â³%­ÓaUõÏUq=ͬ w:VAµÄjmŽü“â£'y¤Žk wêfšFÒ¿:\vg~âê×&øÑÂÙ07{ŒÃ°z^Z³ùÐ02Ùåÿ‡Xûj`¯w̨OóuاfGº˜§9‘ðyRÁûÇã‘Ú’>Ú„­4³½ÃlCh®Ûø›¿¨u-ìc# Ô) HÈÙ;$LÝ}2"=mQ¾R§œÝ¹í.t‰Åú ¿f--"‹P—ǾI¡Æzì¶…‚|ž³I'š9éRå­ÙJ[à65úb6}ü;ÖŠs­ïçÞVÎ/˜ -²õQÊßVà,…$¦BeÀèœ:e#6*‰¥5öªû+b R¬6çC÷’€û×ÎOý·¯Óy»ß4½KmÞxï`ЖJ\¾`zrðQ$Ë´¶– Uöä?ØRŸñeC¶š~÷u5IÏÛˆo^ȼÌ%ú6qï:®•u1’ÜÍ?ØfÍoK¬Û9ËýÐþi¾5~²€ «þUÛãä‘w~üë*†ÈŸåp®G"-¦nŽäz¨k-*göP˜Œ–ö|/ô–s—µz%`ˆÔ–Á¹!äHÂÆ\Ñ5“"¸§…`b)éPŸŸŽiáIÓÜz¯5§#?qúòñ§u»Ç Ciú/vƒ“>}B1†Þqú¤êV»Ÿ1´ÌñsƒåêÉ®”fñ$'Qjkœt$)«þUákVãt°t^rZ—G 1§|½¨o«xºagSHsyfÞr¿ ){â×¹õUnô—I‘ä œöâ=‰Ð'mL2­œ³¸¿ªÍå~שm«g¨£Ù‹¨E0F-¹HÙ;#‹E•Ê0>— ½t²®BŠ`T…·«F?Ú´Ê?û‚&ÔV°3Ç5Þ†þš4•ó0÷ðSuµRIR犵÷¼*ï¥õ¥_Wez7% ôϲ8¦.DA‘ºêÝ—w}@D تŒ¸k³nŽ© ùSF¾*­Û[¼ë§%Ê÷‘ã´5”3t‡Üšìøx7ÈÍo; Y8¦¤àš-™LŸbG”jxŒ¦vö—¦P1eèÃh¸YžÎR¥½ß8\h^ ãí%4àï~²“›£î÷¹ŠzZi¤ooÿ˜÷ÎpsÔÜkß!DEÚ%8ÿMDêvñhâ'‘R¹©L/ãrGîY‚) &$Êpâ¢D5&ûÁ|‚§,Ô€XÙ‹éBteuÒ¢lßËú¢ ~ÅJN žmäØçJù”Œè5(øó%5CÉPhìïì«~Qpc[å‚¡õ1òl}¸Þ >•Y¡ËTï_UÁϵ –䨨nXs6ò–&1~[³¡„jñÁÈxûžpô.RYXÝ»b¥“Ø—¶¼£V?)UîcK¤M”˜S›Ùï“‹"ÏqŠôêZ‹¼ØÇØbÉ;$xãë|èM¡¢\/¡ã{UžRËWklbQÅ+ŠjãTzH¶½Y #À¥ØS>¢ê¯ø¤ÚËXÄÏ8¡â:xvñ/UomPEà¥hٺυJ–ÙtìßP¶Gá^UÒn4enb—'¢4·‡‚ìhrŽå"­Þwf¼IééD#³{_ÜœçĘùa?£!œO¾yit”AÓ#YµÛD¸t‡ ý© Ö+ ÏuÂÙâOqu£‰Y'œ ®–ñ`H»kV§Êª•‰½ãK=¢×vl³ø¶Êo(&Ž}Z"5ôîkJ"ƒÓnXš Š—íJô¦S}ø™â& e×à 'Üc˜©,÷ò÷.u£Ò¢é›/È›+(C¦üËïä^Ú‡0"ÀWRœW²uáL0“NEÁãÑm½ÅnqõÀÓqÁ§DŸ$¬£Ç Ô=èRÜxßföRÕËñá ÃxE‘·Œº&êt”–J•g7ëzo(o†_ä%PŽªEVåwÖ_%S¼{ŸÀÈ-ýÈl3W–솈|B–w_oˆ×õ6åÉ÷Zð+6‹]ïÏÙÌm¬ÄpàS†ÿõ@âH{>±ŽUpú_Ç‹\©ž•/‡uØ1“d÷.vC ç~uˆÕaËm;UĶB­ÀG»-¯ù0JÁ\¹ý'¸ÈÄ£ÛM»´Óé=AóoñR/ºh#e+Ã6à$W¢1ä½Ή{YÛ©ÇÉsßh÷¥|{}wVfUDƒÂcÚÜ;®îÉ«øc¬?ÇÆã>¾0³‰KÒ-¤» KKVÃïû/[˸±AI®7Å·–Ô|æj-›G,âŠOc²L¶U;xOàBµÔõÑŠÁLãì×w,Ú²•´ |ýôä]„|Z6ÿÆØÈ•&^Æj‚÷˜¢9 ÞçmñÜ ±¸ñÄYH"m›­Æ™—aª…9Õü|àùŒÔe{V5PRX?œ÷()bITµÞ^ÄZÆ„éÓÜϲ L/€bá‡&Œu ›ŽVr˵­2º" j9e-–y×yçAö™ZðÙò¯`W’Û O½ð;?":qæ[[Bú´¼­° 0 N‡÷mØ|WA|ü¾ÉíÅlÄ/Ö|_ðRþiõ÷²F²ôYDƒ†kR‹Vv äï…ÌŠ†D#*z%Wc*Swpî2 Âsæÿ¼˜‹I8ÍîJ;%°št»ó™&C-¶ŸÒBMÆR„Š‹d!Íf–÷e®÷“XzKE`HêbHÍ·’¿b8Œ ‚óoÄ›dš79‹î~4BPÙŒ“² šê—“mžùá`ñÉÇ6î³:éìÓe¸¦ÍךUô#_ ac uI±fÊÕ„V&ûÞ‡öÇqGþÞ¾»QåTIîºmÛ®Ü mr³­Ug ¶KWC=­2Û…:*Ì™<OìèyNzþÞ3ƒÕrMœF¯ÝCJ÷µï´Õ)”F Ã…ø*PøêQ­aÑ—Uä#)•õ¨‚Ác‰ ßiP·q Œò¨ÊŠÊá‹ •k~vÀë¦HH® • ¥c3SÕ‘2 .À¼ št1KŽŠª<îe²ÆhÈ!âÎþÝ®é=œïò=@¦™®Žáø‘µÊA‚]ÈGR^(y÷ôé6w½æ0 2º}¦&ÞË;<â×>¢Ke˜'y­`¼šÆijtzÞÛq;‘]r·é’úhmjn>õw²æœWßßäVõ•},\÷^Û·ËÇ€YÉ/ 1ÛK¸ÀÉ®È+++‰~û¶µ¿U|f›ÎÐýàP§jÖ( F ³ß7]ŠS|,2Îã'Þ²m‘ã6ò'þÞ8Q­xãIq"AÊ#t½¦‰¤q2©ûµ7H4›y´ü€oÅÙ3‡\îN µ»¤ºAo8Þ|*‘‚âÿøFæãûOQêËXÇäsêqö{𥫠²‘og؆j÷Èxµ…¬ò‘¤Ë—-F /¯Òa™uÓKkJ'úõL?sGBƒÐß”ñÒ¬‰°ÀE×À¤?t¼ ŠL¬3>hùÜ~xûZ&´ˆ ‰ÞJ±xh†™(ûÈR¶_#Õp ªŒ•6áãËJm 5´­LðYÝV®LÍ#*–¶“•W1á‘æ'Ðëb¤×%¿í7nðí ïã5ç ° .^ut.F±”@ w†×íA0ÎGL$ô^FNîm9ùjsÿƒ%a¸ïä!éÔjÄ´ð¾?4ë—ãþ±×z"Ÿº­ú>'YÑ[î)Ϋ3·¬XUfFIÖ Û¾b$™G<ž$ \ÃÐÎɰ¬ä³Ÿ­£y‡×ZÃ÷-¾:Œ'Aªôß°ñª?ÕnˆDô*‚öÀbƒÂ›µ(,–ãÕ%›T]³FÄ;û8™±öºNŸ\Þf_Κ²±ðÏÑÁfºžeÁúºáû¿6ŒÖ•pm Ø)Œ];}®x Õ÷>g°WÃj(÷LZúï¡·“ÃØ9PK`zP©R ¥¡Ï‹Þn7YäZ^€ô`Ÿlo®ür\[¨Ï`–uÞ;¤#ërÓÝ‚ºÏŒo²¦h]±{Ê?&¶Qµ f ‹û3öj¬Bæ6j\Hš÷à…» KXqÖ¸¹BtgµWY9{ /n¯ÞúyÀ}è¬Q–¤g‹i°SOd[jÏ8#x„yySºfXšæqžù9(vHWÈ\¦×î¯gˆ˜»(žÁ˜#eÎë :ªšE\"ž½a/-[Z›‹Æ´3×fDÆTó"F]NZnïV„føŽkM… ÖnR8$0…H Vž£ütAi_k–ÊìM[¯|òV ¾ž¥{‰™¬ég2Ùõѯá£<§_q™äÚ~Xza„TŸu€Tþ·X*5¶ûÄ+xó¥%±§ñÁ¬áãíÄ |\—Hv_+_7ªÞk¿Þ}Ÿ# ³Èaµ?y¡açŽx¦ïdÁ®ž=HH91û¸8Õ@Yv–(«¢ ÕÉCå —nE?ˆ©Ò:­s"ó½oñé~–‡ Óä­šFVX‚…9>HátF¾›N4¡ó 8>^¡L5NT^üÞ'Êûf{B[󫯋©jI›æOÊÛºU!³Fp9¶æ‡™õ_¸¤¦ŸÖTá’Æ­MôØŒªàzûL=Ng,hŽ"É3/?˜|Û5l½ûBÍ*ij1þ„ó"ç é^óKR¯Ç®w_˜ó5åÊ—‹t¾«¥ì…¯<šªoi‰Ú? ²"ÙA< ý2j€nÎê³ðõQázðÇy'¬ëLŸùÒIŒ&5wÝlK¥É‚~Â/ˆ‰v”Fpëýž1ÝâvYb™WÊ®zjFdâÝ…ƒôU¿““õ,ü±ö­Ë±…†@á|áäÁ³±$¥,ëœÄÔ-Ca;GÅst"$Ê{tLæó‹¶bdÜ ²û†Z)”ƒã¤š07ñŒ Ø=ãútVÕ}I/³*Ô‹IO_¦› ‚%cgáv®Ã͉˜œfÝûÊ/:=ãGMoF ã®> ö´™°TTXŽ¥ŠNbC™êͦ·}dœ+Řó¬•Û±9¡í‘?Î(‡±y»L°ð:ßÑ»z³[¯–ƒ&ïã$÷ÓW/¨ð JYÿãß›[ãhÒ¢ƽ)fÓFÖ23Û5ÏJ—𷤟½/æâ &éÖ ‡ñ2Ïj'b÷OÈIk¼˜õŒý{hiPÜFi»9øû[í5æúŸ|„r‚ØA6ÐÄ?ã£Èžxê>)Çæ&+!‹¶„Õì~!¡ÜnÊÐ/Ýñ‰QÞL¢ÂODšnú15Š¿²w­U0ÒÌ©àõ+^ÐÈ´f±{¡sR…R 'ž¤Ç_ÍQ†,~ºÅd;ÜAæÃeGÁnœkŒ—‰PV ôR_óÂ.·Ô³4D LËP‰Öø´.ƒóÝ–J’ öG\³?ÎëZ* .ÕÖ¥¾óGÅR0”VÊ Îª Û«Ó‹Wû`¸†±>­†¦äÂï-˜±¿¢ú«Ñ9Ôª‡ÊP ¦0—³ÞÑ/ðbmÔ×Où8¦»"·.Ûð„X*%V¬x#ˆ·5éªûÝÒ$Õ;ÈÚÚŒVmÝBVø'âê‡ÜWä¬Ä¥ŽY‡~9AWNƒg’þýð°¢ÝÜ¢Åò+Ì9}¤+ Œè$‘üñe1ìJ½vÎ<ð/-ïÓ饔H¨¨8p7ÑrÞ¼Ñ'2Æ#³ø’ÿƒœHùši`>{J¼ æz¸µoÃàüJP£Ø4€y½ÞöcœÄßÍà¤â*ÏnyV§­Ž›–¦—÷ãá¸:±kH¸]#aíÎWôÓÊ¢Tó¸ìúCc.t2h§ÖáAö%¹<1wÃh@åÜuÑÌÿ°×qdb‘!¢ÞAcJêf¼èM“LÆ¡æþ“ûí"T ã]fÐaõë¾HÚüq•ºê!´‡k"ia?Šº yšîä ÌŸ®ƒ•x]½WÍ`œÁR×ã¢à×d¶2^ÍWi6‘æۚ²h-[c)dÔ8츹 šj:¨‘½”Þt;7GUfÊyE–bÎ jÁ#\à¿Ã¤¬Ñ\‚n©zÌ '@ëvÔœ®½ñ˜­AŽº=øœÓÈ·÷ÙÍ¢#Èžr •úݼ¦ ò+ï#8Û(ç0¶¤6ñ¢3\umI®±³¹<„¯ëÔ6Ï´oª9XØL1ÃøP=¯Œ œ¨zé•G~àrü £†sQˆÛóµ‰Ëñkªõd‹¥™hPlð³~œÝ26ï¤L•[÷’QaÂê7tÞä(Æf^ ·%Ìj†ë«LLxOwÎ]êË`°¯ÇnŽqçØ:^~J0£Çí¢% çNª¡¬ëëð}©Poñ©¤þf%Sô¦O´5W•h|s¤˜õ>,p&ë ~`u0¢ûÚUþb( ¹5"wÅçJ¸iéìfÃ>õ0öšDn_éUŠ̸l²¬D|1Ó:µU1fýU´Ù“|eÏÆJçе@«•ÚÛV' )ŸzÎh°`”üZ~F!l‘ 5ág@ÏC²€ºcUî´K—Ë5èáÕ†£2 í½eWaVoTzM:Ωlé™P¨¸d^zÅî ÔÔw!ËûáÇrsZL…îѬÎq÷H ÆUKÄLxr‹æR®o†Ø„}^™b¼MòäÈKêeÅZOæ¨~³#kE3@-³çØvÔÊ/c™C˜ÔBu:-oËð¤î4Æ/¬…¬Qot•ÀÒ|HO>õ`5»~,k·¦1+5JöË+6/Ÿ½Û¬yGÈ»2"R)åy"Ùnˆi=_½ÆþdVÅJЕjIÎÍO»&Ì‘§°$ OÕãIÊíª¥ÓÊJPDprÍÖWú^èàtt”ƒß·[y‰•>'±8rXù(´Ç-ôuƒÜ³\©ìtµ2©»F†´él¡êqâ»b˜[رëÑ©1‰¼Qu;í:ÒçX§ÇԲß‘2ý[„‡’£n`æ•=ôj¥€ƒr¾oÃÃxi¿‹6/£c—L´ÂؤØaõE÷ÅÞÁ×B½ ͼŸüôé•Þ¨®á§:±äçªX÷»JlÍÒÁ$ܼè8™aÕðP$“ÇB•¶û"ökŸå˜-[MªsF]¸¦z’Ó8gIÊk2>‰ÞdÓG€‹¦Åcu”Ì£ŽH†@ákí’ÞR€ó|wsmÇæ.¨ŠbE…²¸qS#{t\£úž=àý¶xƒZ@¨¼$Ϩl×J¥Xƒ?j¤xx„4ë;¤ò2‰bˆZ><Ýee/}fªõ>Šn´«¶4cr\˽¾V¯e¸x§Æ(n_j¶V¥ÒW+4Õ*Á Ç•B9Ì`÷/Ê÷»ÕÈ—~,;k†^Ä@}8®†Çá¦×„.É1“4¡¦'¿HSÅñ=îEúYØà4\©Põm_Sî[?Vé© #®ùÑB(ñ\©ýónj(©+‚qå…TŽ váúu)ÍÔ¬f"I4µÉIb –¹Ò5UÒWéäq&R÷:yHêÔÈ ©Dr‹ÚÊdò }Œ³ÒQýôëÎsƒ,S¼ˆ nG™ÂÚ¨é‡C¥÷#’æ–NL^ÕJSæ’ïZÎ%£óå°¶°µ·M8¿ðTü±ýêä¾°PHìÔ;¾v~œqžY¬Ï×("ïì/Qpá¶CÚïcn–®ý‚¬jæ¥ lgH ä»?Ãçrl“꯳<úõSC.@£\‚—âH‚øuWМâb¤YcŒZBŠÕP¨±x¢Y7º´mÅÒ·§ï :–"õ†i䛂\x‘ðÃHù0“€Rö@-†$àãÛmPÀy '†/ ÿ3…/~GÓÃT:|òjü—‚.ÖV÷C)Ü8#•Qùw›ŽøSaVMnž[®t`{Èá¸ËóÇÇ‘ô{žÇ°*n“ÊŒd#ó‰÷—Dü†ÃÅ’røÅ9­œ}´Kpwº“Ú•¯ÉOˆR5pIË´{ÖaÝé&´x“$¥»RÙ©øÆ¼6ç}ê‘Vôù‹²»†'·ªÑU/Îä§Mw:ÄœÖ"oÈîDâ<àLßLÌ7Î2íKøåüŒÈ>Àƒ,L“ìKÌ­£‰üµãâU¯Ë‡PÖ>àÖßå äú¿T2ɸMÑ,ëåЮV/“ÓØaµhnéQ-øžâ/ÀÄÏì-÷+Ÿ¼ çE|”7:êÜ{¨¸"ŽÄ…›ï¹RËÇ T?UÈâšs}õH2â˜%¡:’\‚f3ë¨uOrÜó1›:Õö=° ‘0ÅÁ˜G’”Ѥç¥ gùê~ɱ¥X>TeÂãœ;LØ8!åæ-ˆ‹E<µ°°”4ÌáŸJ/f®àÓ!YàÖ†¢¤]Ãõ¾nPœ–ˆŽ‰ý" Ò2ùºp绞ªx–/€)Å¢Ð9ÊÅÙò1iÈ\&ŽVµm3möpÜTsÞfή¿6W§!WHÄÞŽÙRðn> åQ%Ÿ/hENè7ÓåÈ­®XŸ&wñ’L^ÇÎ&æÁ­¡hþ L¹’”í6«€7ûÉ*‰£ÔtãF«Ží5ï¯òËI§DTD©w,Ãæ¤A*AõåS%´Ägœ4Ku4MœÞâôËd|pÂ]ÔŽÂ9¶fòDE³¦lÞþgßBÖc—%ŽhhÎÂfú+¿7Uï±3cÁ…§dš-l$Î"F¶†¾«»opök˜¢6z·Î*y„–-$Ó#—µh˜¹è”O‰Šx‰×ü$:’f,l‰ñ¤Ü¬Ü(öDÇóÚWÝ*JJ¡»Ð|eU‰ƒ‡VRŠÿ”¿Ð•á1§ÐM5دƒ=.Oî6‘ÿø5™Î uó!`hrƒˆ ùÉ‚¯ôcY¯"t-_aF]òr¯|’׸ ‚°þ¯'¹§}˜²C›/:r•­›®^=Fë)‰•ãEÕÚ…H…¢P"Õî;q´á;ñ¨³)¡öâù_5è{§Y&<Œ|Èb~ñ°ÂgÕ–ž‚*w@ª‡H¦~¥*YòË8Ú˜P}0&Ik¿¹Y?dðÙ„ó´M *à‡¾y(¿ŸiEú§eÚÆpš8¢S©¾Q8ýF«†ãçÐÇ«k¾x›’§"o(- HD¬Éó~ÙæÀ‹õL¬±Ü< êΔhÜvÝÂÓ_©‡ë…¿jWj?®Äd|ËLm@þz&tõA•è*Õ ™A:ÎȪjk¸ËúrƒßÇ­+·ï^wš©|þÃÅÃÞ‡Ö뾎Xe²BtùS]ƒXíL|häÔ[V- ³-?Ü™ñ%ÒfN® Ÿ¾#„£¾Q0·E9æ²)êxî'ðfx66«­8C–ºàÍ¢†9ÅabêªðMPâiâB<9ŸdäÓû!ÄÞL“h:‚nÜ{Û±UV‰R9G\n¬™5Ẋs)®â‹ëƒSC;ø¾;ÆOfFÁ$£Ø.D%f–•Ågû*[Ø,‚ܬq¶rÙºÖ!#í°LÂëâ¤[UøòˆÌšÌÇV¢ÅrÅ¥ï^…Sm>í—E†¿à O½o:þš2ŸbžÌû5q]™ß6ŸºC8 ³JÁqs« Ðl`¥ sæfm•×—Œåïz•®lÿˆÖ!gòsHuàs¢a´m7E'N쪋òÿhnB endstream endobj 816 0 obj << /Length1 1739 /Length2 11447 /Length3 0 /Length 12572 /Filter /FlateDecode >> stream xÚ·PœÛ-LpwÎ@€ànÁÝ݆Àw×àÜ î®Aƒ»%X`Á]9çÜ›{ïÿW½WSÅ|«{u÷î¯Wï¨)TÔ™DÍÁ¦ )°„‰™• ®¨(ËÆ `eå`feeG¦¦Ö°†ØþeG¦Ö99[ƒøþƒ!îB^l@È Qìû``ã°qó±ñð±²ØYYßý‹vâH]¬ÍŠÌ9°È™Zìèîdmiy©ó¯G­€íÝ;ƿ¢ö 'k3 @±Ù¿T4ÚÔÁfÖ ˆû¥ °‚@ùXX\]]™öÎÌ`'K!:F€«5Ä  r9¹€Ì¿[(íAÿ´ÆŒL а²vþÛ¡¶€¸@€ƒµÈÁù%䃃9È ðR .«Pv9üMVø›ÀøçåØ˜ÙþîŸè߉¬þ š™íîÖ– k;@YJâaÌvÎà—x  ÐÚhúBøëè@€”¨*øÒá?ý9›9Y;Bœ™­í~÷Èò;ÍËk–t0ÛÛƒ ÎÈ¿Ï'aí2{yïî,ÿ ×Öìêàù/daí`nñ» óŽ,šÖï?€d%þἘÿØ,A+//ôr3³bù]@ÃÝô—“í·ù¥oOG°#À⥠·µèå ÙÓè@œ>€¼=ÿÓñß™ `nm˜‚,­ÿd1ƒ,þÆ/ów²vè³¾È Àúûóï'Ã…™ƒìÜÿÐÿ1‹„‚–‚º&Ã?-ÿÛ)&vx2q°˜Ø¹Xl¬œ¼ž—ïÿΣ´þçÿ+ë`üNöû¼//ê_gvùG´ÿlà¿“)_¤ ÐþQº+«Ù˶ÿg½ÿòÿ'óßYþ¯JÿßI}°³ûËOû7áÿãÚ[Û¹ÿÃx‘îÈË(‚_–Áá©Ú ¿wWdnýÁþ½²àË:ˆ:X¾Hš‰“™•óo»µ³”µÈ\Åbfõ·lþ¶kþ^8;k ØÙú÷óÅÊú?¾—-3³}¹Fœ_´ù· èü²r¿ùƒ^–ê¿Ï!é`6ÿ½}ì\Ü “Ðùeø/ˆ àÉö²¦æ ·¿Ô `avC^B/={,ÀNÈ¿ÍÍ`ýmúqXÄþ ‹øÄû"½#V‹ÔÄ`‘ùƒ^rÊÿA/9þx_˜j'€EãzajýA/Õµÿ —ê:ÿFï^|À?èÅgúoÄõÀòr)Ùÿñs¿Ô´ü}_¿Œú_6¶Y²Øÿ/âgqøøâø'åKÇ ƒÍÿƒñrô?é¸Ù,Îv@g«?ö—ŒnÁÿ˜Ù'§—‰þµi/ÓüþëîÜ@fÈKó`3þ ›Ú ö›jQbW¦íq¸ãÔv¦ñ#DH¿ä´ñF¼zfƲ|©ÔR›”‘M—’Øû›¬Õ…sÏ­:òzwÎ+&r©]KrÓØùç«W³ ž×$”óÍP¹ÚÉbd|ÅNýP*¤‘˜ÝHÂæ–ýêÔ^ok{\ipK¤xä‚Û•:»«K2ðIÞiþPƒ´˜ils]¼Íþa¸ež¢ô‰R^ ó9Þµ s}pxè;ViO¤¿œKÀö UK’ˆD‚¡Jë{úCv±ËÁ'lOSi‘óþ²5ºä›Z¥3«­³C ÚÄn+“D‹(¶C[R,Çï¸b©N9ù;æß²BÉaš…®µzÓ¬e¾¬Vü µ• –w_žíZø Ÿ"«?1D˨/øT¾uèÝ@ÝíbÝú¶:kK’?ƒnßÛ"0o€Ê.óûmð¬6»>oªU»†PÑ÷wA­~:Xh.Ö©•šè, ? u¯<=8ŸòÎ;;Åh–ßWE:DcGy¬×}÷úT{wÌÆòµÞ,­&JÜÃÕ~ãÊ«ÊmÃPaÐ\è]áÑnÏõk}ëc˜@žõy¿+"(š€¹5œ²âÛf_Ø%Y9t¬9T‰RNÙÝ…?þظŠÙ¥Ä?êîÀãñú@ Ù±Þ®T_kºË’{0¯Zh‰ñùT¨5EÙOŽÓ^”uôQ£q¾…wȳ“!¿u ûÖF°õ‡í ÅÄ-e +o&œo´ÑpU‡÷âc¢ÚE×/Z²#éfjˆg¡¶—ú#2¿ûü3ãà‚Ã’˜è¹¡†äUÍ'µ¡†{”­-ü}À§TÌ;Þ-ïñ޵Ùé™2Z×ßýÍ)ýøÍ9óò5 1–¸ø7ï\pߘÉÇПçgð˜ÀCЉªÂö@³¼.PYsí¾0åÞf‹–½k—Ǥ MÎ]Ç †í[´4 œØÈ?|œ¡²m¶»Z¥6¾°§2ÄL{·ÉÔ˜³ýÚ¨0âKôý6UcB…ÍsÒ‡×!'üã\–Ô²§©FÇh»|È_9žá Ó4aÝÝÈÃ:™ï6‡‹Öï®Ö„„ýq–·ê5r‡ÀGj®Ÿf6øCÉÒA-ÇÈ,gHá­»¤$=øî÷¿šÑ½ƒrB!;Ë:y­”<~gï!AëwÞÝØ;S‰tÕ!¼°êj3:I2œëÙm’”Ú7[1©»Qc43[ƒ×=…f£YrÊ«>‹Ûƒ×¶Yǩ˽s¿½6ÿéi…Ï)`ä*Qt"R½0GïƒÙZ›ëN­‹t5#:¢Zsð“Ôú‹õ·ˆ’‚îïÉ/.Qa¦(+äÍövŒ‘‘/„¾>h€§ èIpš¿ŽÜ¹ø-½qħJÓ'ùÕúer©²ëqðd6 èJOy²Ý<›iÉVÃpÓ;)RÞ„C‚ÍýüWJ•BØ Í¬WœçςǤcNim.îߪ¬Œè{dä—j¼ .uÃ]qˆò9éú"\¸¼™K ß½®Î¦ä¶×c¡ƒt÷>yÇÂpf÷–d=2ÖªÆo‹Bø6ÊRÌÝí3Îzf+6ðdw$俪³/ðCF7ºzÖÍ»ÇÛoKЉ*2Ý—‚¶ÁÃVBUÍÂ_7ˆ¾gSÐÜ—i‹²¥DxÅY1Ïy›v±V÷ýÙF”>ÝÄr:Tµ´¦‰¶è'ÿˆµ*š&y¸£éî˜ÿM¯8Ô;Д>m$rÞCðmìm‘ð8A´TįÔöVã‹Ê`¬i eDíÕIèÍ’ì’·¬+×qѶ,ñ•4U\—¨_§Knæ‘ük˜ÖtµôJM9u²ôGY?ŒÚà IÎÚÖúÕRèôw+Äv6ÞäÆi¦T_¥oCíî4dH†¦ŸÜÓû@šÏÎÁ¢°ß3"ÀÁäã^†ä€*ô­bÿ¥Jš$¢Dé9M6‘†f–wÐüƒS²¯ö'¤<©Š:ý4Yä¡aì,¸ÝÞ¯ç"¹#׺z×ÈȰÔÑSß}3M²M¨zЭq»M6ÚT¥¸åתw¤Â¸7Ð9¼nÍÒÚ k$$»…g "¶çèã{|µH­ñÃNY°¥_Ñ· „VÄÆç˜¡£n?ý\‰™ð¾´²Q™®Ë€I"Š,ë@®Y†ŽÄIõ*¶T•ë*ßWƒÀTÁ›EhœËûàZPÕ5Où‰Ÿë!ì 1_Òcž¦1¾‚Šp\Ãàðk%ñÊuÅ«9ëã9´e¡$t¬‰ë°mÔíSú›7Ú½™û¼»‘Tg3^gYMRkãÍOD{Ë üÆ¾ÈæªÉr²T­É½ºC´‹øöjïwq®óåô â},æ1aÞ1&—q×ýxmÌv—?ãã @i;øL¢Î'Ì#ˆˆr>/:Û¿ænG°©ðªeÒ–Cs¬‹}t¸‹ÔMXf/2M«û.ö›d t¡¶²%Órò|OFµÌžã:PžŒÑÀ£àñ &Ëô Y¤œg&[ø9Ûh FM’–Âã4—»¶¼—‡ßôùfʉ×r#¡ÀFÌ|/XK°Òc‰c¹[c^Χ}G¿¶³áiŽÃäÑ%çÉÑÁ)PUQK»4ýŠù'Ž.d7-u¯º¢–Ý#sî4.¨*Y@ÂÖ`×·bÒfúi'*»JöŠÔ˜.S/í|Ö„)‰®A+Ô4ã:߉ ÷saº)HŒu‰¦F4ú>ö+‘Nª!"eX ¸í°KÐ&Œ:äÔ.Ïg|³þ]:1õ9Ê­w©=:ðdzÓ*b5 Ù¹¤þg&˜òǦÃKôÝÀŽäí§J8ŒýõiªB±Rh–ˆØŸ|Íbø—€ùÕ?iâ¬éq¶ܬ†Î&þÈñI^ŸZhkð9³×Ši÷NÄj™°lÛÛZ²’m 7.îÛäÉ*í#WDV Dßî,tëµÎtc#2R©ìg%ôa*¢»£}FN*OÂQàu¾'ˆ>òÚ‹z,]þÌ€5ïTâ§ÜJó!€ŸŠ/ét\k¿JÁk&—.B÷KPšÌ®þØ·æÅG8âÆì]»ž41Ùê´ácA~ ¥Wã÷ü¤YDMÇMl°xÞ(¶³‘°'0¼¿­EåcSá×=°çÚ f°.Yµ®,+Íjz˜thöœ8ïê¶fÚ{ç!|Ȉï#ß’¥± KllÚ†‘<­A}›¨i0å¹UÄû^_˜=S̪CínX?æ‡Ñã/ûŠ#¦2‘4“,é5?9RhN1ÅõT’¥ñR2ÑöPtk¯W 8àÊ!kjÛÖévT¬Ôn¶âi|~ïö~3µyÛú(L‰üüUþmDZ°Ï¨ÌjqŸÎ¶*½Å‰×t&îFÄÙèõ›ô3s\"ÆòuÈ'½È#›ªM)\ïí“hŒTÀã@"µoÕwΉõù‹ö~f¶là†_ÄÐÑ5X¿ÉýPÓãHFñÊ÷ç½4!:8²ù鳩°Nß¿|}þq¯›¸Äo´:™¿v>œ˜­¬Ê°˜ǃ¯ù<ߢ wå2{n Ÿ8>$šCŽI»d¨¸E¸€…„‰{õ=ÖÈ¿bjN9©ÆnebÒ]ä¢ÄȃK2ʟЃê)`Äì×*눭z„cL‡è ´U±“3JpG˜ œÜX“md{˨´¤Õ,Í®0^`0 g½’Ø$)sSä]$E*Ø@D!¨‘b¨A9ÄðèªzKDßs­ÉÂ$9E´œnÓ0ý±ÒŵUÕÔõÐÁžØ)Tv(ïöž£·pý«1¤˜´"}/vÒkJ{:Œ5TpG2N¤ª5‘ù˜ÝhÝ©®/›–TF¨´»¬2ºR7Ë_u½8¸äm¯±ÇtÚ ¸!:îálâl꛵ôØëÜ,‚kœàÜÎ’µ)Ö„¡/ù¥,Åî(rÕÊ@ÚÄôÕŒ·àSíêÙ‘&NÕûOõ³—Ç›çâp”eÏ.]‘Í—6OXPÑ©ÙwßGDIgšv¸˜Kœù: ‰ùeØ+ƒ;j…íºêkÍp±·ž T ¯/(@ˆùßö™ lYˆXãLB’¾?ÚÞ³l{®ÁïM%‚ÓÇsp‚bÆ`6 y¥©±ÂÇÛ¿ 4)žòÍ$Ý9<~¡2S÷; æ¢(ÏjeMŠø±,L‘Üè³%4ó†—Õ7÷¬þùÜ–4Ûh¿ZÐRü$/®ÞEøv÷`Á?ÚØ0¡ÝÉçåŸh™„ªpÈJïù.·øgiË-©·_‰ù0nÅßQ]"œP¥Ó7qÇ]Þ Y9a\R"‘ƒÊùwGÐý¦µû™KÌ}®¥ŸX%S7Æ‘  VEض £Ý¬«#´JߣÆ6W•%V`Î;þ´,Pzåên¸6oñÝ™ý½ýÑ“pób¡|ãÝ¿çå¥F gfHwö—˜b¥¼ãYÌuøNÛƒõ>óu·Y+IÁÁÀâ°BÃxC'€F|·7Zë‘lÀý¯töÂÊ7h…¡°iOûýúHÕ)ÈsñfÝ[4Õüm×ab_~‘4 ‡—ùw…yµë¨ÌæhuôÓîy¬NíÛ{ºt|ìU‚Ðgž~2Ä’H«%ŠG1æ‡ØÎ®2¥gîs’R7ÂI•ܧ¢Þ¬üª%z#ªœM[âüÕ¢†šöû½ã¸Ä7Jv¸T&ÇùcŸêpÓÍ  Á’çª{‰)ˆ´üu6Õ}ÃMwkK²Û·ìθ¤yk÷¢õ–!Ò cJêƒfì³­ NØÌ!+›'{¹ÒaÉš¬cTôZ^Àç&f¹L GJŽ!Qšw‘Ž_ø?fXàს»“Á,W1)"7”¤óK†Q|zžÆc™ ãU 6ge¿–@Wußlç¸RÌuœï’e>ÖšÛj;òl¿wW›$ÛpC¼`Êp ƒ}žÀõ®Öm9ò0K›½¨š`¢³†>µ×š_£-Wø”¼©mùùÕ“Ó¸ K F ›”†·¤ái;GîZ±:5 b³{t¾®xA"’éífsQ4’¨+ž|>òu€¤".)_’{‹ÔNÛ)TžóéFqؘÈP#,ÍçmªKé½°ª;²ÍzðdVÁF¢oJªSµ™&lÐE½,Vö‘‡ÏtÆ3±ÂQÏla…4ƒ^÷H¶XTÍZD×¾`3"=ͨ¿O¯ohì›Ôéõ.»¤/¼äxäµýÍVr÷ME=9$y´6ÑϦÛôø‚^(bF³éVì~V»¦ãêú1g­VW¨òA¶éÄë\rzò)ÂÀ³¦’Þou·X¾`®À¡Âïeuæå0˜’¾ ÷Ã4½¸‹ðÅ7¾ -̬õ+Ls›Ëê&â¨P<ïAŸ ð‹L Q!µM«ÓÕ me“’éNfe7*·x·ŸX§otš sÊG,yå¥qXë(üçÁEÚ'£#Ö|ƒðÚí g°)òuí]ó°®??;¿Õ(ï´ àvZÞ?SH áÓÖèkO‹lZ–4(˜ E…‡BË#¤£‰ÜsÌ©+ññææã¿µ„Ý+ZCÔ^¥ÛšU3¥žº_G5ù¥î Ep£mö úÐ¥")Ç#—}Ôqåc¡Ùð²M+¡R±¬Ê•uJ£4¯' ^öd‘°*^‚ßX9NiìQ÷m¿bRË¡*¤¿Cš.9bç ³jß=nõ’eæúÐc¢ª’=@grú9EUu°qöáš3‹ ©Î¨8p5(Wq­ FŠÈ%Mo"<¦&¥X‚¶Þë÷47j¹ùqß±Ûby Úæ ª“k€ ü¼ %î—|ß¶¾²{ó{¤z±îFª^‘·„aÃÜ{ÚëÈã±w’x²-ÇÜ7Œ÷²=T¡ÑOãîéK¡G ¯d’­[vžµÌ¬² ìh¾­åJõ®ðµ|ÁT.Ø£z3H!ÁW‰LM€ $ØLWtKx¤4VH¹&ùbŽMÇ:ÏzÌnÈãF{ØÊéˆR©ÂÛNO ëÂEšåejR bÖÌ9>R®{þoènô"¦{~¦ædŒÙVšâKCwt˜ Š1Ø-*¢†Ÿ÷³X42k 'Å|l¸#¹ËBRÀ>¢1¡i"ŠÖlן~ð€Jò\âß]òk+¯[FuGuØÙ|`þisB9ñƒÝ[φ†¢s‡jjŠ_Kmõ™¼±0ù•èbÓbÉÃ׎©öž8¼…äPÇoðd78AЀŽ´½8/lÜ¥¶¼!H"GFVJ%_I‹ë¯_)*•ÒbúV|v¢ûØœõᪿ.0È>Å>ψ«õ]f'Û$Q«g`žd)-j)že¾^+:TO¹eªK•àÀs3ÿYL°Ý"UÇ&—h¾¢¬77]_‚¸ à;}¹šÏ Ýzû'vA•}œžû¹¨'mÜ’Òª´ÚF­…<\Âß6A ‡xá±4[(á a•Чh¤Á…é2Š'cêê^bsc™È™þ·˽£¯\öOå#H"ètçNË2°0G%éU]²jD­`æóq°,!Ôm¦ã<7ísݘXj…²íTÜP›íªŠäŽgd¶`òai‹‘ã~Ͱa2‚ÿJͶv»¨äD…ŽÌAÝ…Ü—”ÂÐ,b¿Ó 9ÕVð~KŽ[³¡šüµ¼Náêt 9«òÙº‡¥ã+ë_IÍŽûæ¦eÑç‡ïÚ§{DcpËgóZl¸V>Id¡‰ !õß.ÛŽŒN6 5ÑÝlåo(Ï3>ê÷–cnÜõ‹2½v2#wUë”]a~=´ÚüÔÑœ£A£ªc„Ÿ¬² 7ü&fÔ<^¤þÒ³K ¥J!7´$}ûÌ¥wñsZ¾DÔ$™£R/œ‚’ºM'‹‰Ô7#+!Ùà:ðx,>í-˜fó™nxÄlxce3ý=%{È[å}Ë •¥ÜCÔd~ŽÖ`ÃÎx6&mÚV¦z'²ïIc!6æq|£–ˆ××Þ÷x)1ÆÎñŒ°´E nW?m¯‡‚ÌP×­¦¸ÛŠEhá…BCì&ÙÎð'7O›d¹9¢$æàJ!^ÌG¶ú¼ûmIŸWŒÒçÃÎþB“h›¯ëªÑôa†/muY"JnCµU 6qP>Ÿa§Éð–¢k{<Á§–tQ‰ES÷j¨à=þHðÔª3ÿ£•÷ŽçKBY\Uœ Cñy­D™Òߊaú¬PúæS£ïf@Ìaz3´¿höt™ryÎÏGõ¯U÷ð€)e‹Ï‹Šèú*+ÁOY[¦J l×?Ë)Ÿ™}' ×ë)ŧÛVîFž=ˆ9ե͞ڤª¢ 1c»%>„¡õ=ô´uov]s¸"…á„¡?u§ÀÍzµÁgÖ‘6¢ñòUc’Bæûœ%Šiã¾’Qg”®\à1s=ãrîË0®z‡lŠî{¥!Â+V­¸ûCLgZj¨£ë@Nž´hÓ@Q°Ò˜RÕb5IÎÔ\áÄŒ˜¬Ù¨¬K@þÑ|†÷‡œ-Ošä¶f=ñXÓ½ý·:BÝ¢“¼â¦''±ísä~ð{špq©x®x ¼]†yxâݾHMZò…›?±ª+Oô=MEP¾ÞíeLv5ß Jé&äLVyæÅVˆ]"ㆎtÚ\¸DIâ䆜f§†æ„øšê$,k͈Ytó5½ç•5"ïßýUz›kjY•h´ Àh°ï l#! ¢ìI`Þ@ËŠ¡[y`Y醆³Ç3!}ÿ%¬.ƾ0ú4À·K–ÁRØýå)6ô|Q±9dÒŽ*3§î¨É“U ‹.n«4©ÊCÁGñéÓž¼è!ÏF)ÖF¡’ôó§3©i&¥§>¯Æ(Œ5t¸Å%âä.»è2ØìOÛbŸæX¥Yü¢ÂdAVuMf”ìŸÜ–TÐÜ® Ê µ¶©n'À›Ã°–‹bä«+W´]XX žÜßõìÀÞù³G¬ã#žj º÷Ü¥ƒýþÞç>Ô$Ü£ä}.Î×Ú•žÐGH½'ž“l+ ÄÁwuÛQg‘§?Å0_e¬Ü,ÞÖ$üƒ+æ´¯µQ ’áOaxd´ËÈo"¦/'@[óSô…Ø.¹%A$šf^wwÑJ¤+¶¾Sy;âìJÚB­u„x=—³ì¥>ðf¼î,| K$@‚MT/)6Øy ­¿Hð>öŽ˜¼dâa7Œü‰ë5±/a‡ñ©:êÔeŒ{p•±T¼¥êˆøã¬÷×ÈpL#Ý¡p8f)¹ž“JO¯¾\cÛ¯Ÿh¤ÂÃMX G,]/Þ¤sû)5‰;ë“@"¬e–Q ÛŽÓ…®ºB„Ÿ4*ííÍà5¼š>kíöÄõ-ŠÛLØj"ÍvOÊéÌ…5Øïޏ'äŒ*±±¡óx("J=B%ÚÞ ¶Vc”oÍgí$P´K(w¡4è_¨Ä2ˆG{õü•‰Få|=µ3 Ý\n1Ý{~W]$9¨ßR>÷¼NÎ °š-Ý ?˜ÙU;_ÁñëÞa|l²’ŒûµÓ/±ßo–4úPRJO‘‹Ïu¹<êåèŽ3;öCØV%d©“Z¥@»Q¡ÎŽýÀ‹H&Œ¨¥UQt8 N…J•m¿ˆ|P_Î*èÂÉ3Wè¬ãV!kVÖ£•ø!ãÍ¿û6°3i6¹rÊ"ª(‡iØ©?L¸ÈQg$†$k…0–[2zw#F<« 62$Èdggóв±ö~‰Êg^Ô¼»3èú‡Yš–’ Â>Ÿ(ˆÛDsÔ"JÚ^НkéAq‘éÑP€ÍÓ=â‚¥GûŽ8nU*ã0³TîÒô×Ú9ò„³ë lh2ç“Øã@Y³jÒ› — •–+»€cÊYePÛa¯ò·Uæ@§ö3ÑâHXíª/†ß‰ÛVÒÀŽùqjëùè°*²qgÊl)”ïwÉðò ñps•í/égrXŠèîn\Œ³š õ$)Ut>(Ð{¯ Fq$lÙ|áH¤5ªœ­C½P™:·•wöô%Ðk%Ðd<´é– Bf¸?¼µ)1_¡¡2z³|i–CÏÅœ¼ªº›e áw‰.ÉÙ¤r>8Uó¢JçŒÏþ˜Ž¡÷l¢ˆ§5X3ž)¨8‡öÒ’m‡±!(óóÍŸYYªÇ€“|.Of´£ZÓ #Ãb€I“ÿy•YR¸:!2‘ýÓ3g4ó ^’Ÿ#…"A«°Ô’yí>á0Îp±ÍÖ¬hÐà†o¶äÍU­Ê§WÌÛ52Æ»ž^Bߤ>àäE1O°Û´?HJÛÛ„c¾[èÚð[ã¯cIÛ³éU¾—ìÄ{Jµ&ÓpäR£ ¤(T¼QEÉö Â—Óà”“Pd\ˆÕ'ÖFcožŠ]¹¤^ÊAÏâTL>'!ÔžïΠˆ°ek,î<Í3}ø@r6iÛÁž|Dµ”Lû™©<›£Ûå0KSqŠõõ#­'©Uö9ÏÂ8‡mÔzûEÑÊÓÞÌF%OýŠTàЃ„œÅ»r܃m²Žš÷ Ï¸8V.‰+Ò®qœcʇ7ål(ùo5qEÝÓÌQ™Ã…`ä‚-ÌåÔtbÔh¤ìFH?>µƒ¼0žÒ/¼%…Êyô$µFµp {E؈ƒßž¶‹6q­Øúr¿É²Rg²} ÝLQ¼Òÿš3„6K-]SÉqbL¬ Xt9wŒ/^Mú‡ô.¹»°‡ï<ªˆ4¢£|ÎúèÛî Îöl6]MÒ¶¡ûÒTgßÃÓíKß=¦òurœØ]¹Ë~z®.¿¨¾í™ÿ"óÛ…^f5uՄφ¿ŽW½HA0‡f›_ao7ýäþ‹¸ù¡Úñýξ™uœeÆ TÅÖW ª`œ½Š Ÿ/CýÒoçvàõ,“ªºê2‹Fñ›·e9{©³¢²¥ç¯Ï¨^ÃêU¼:R$¡cDÅ`‹… ·éâ"Èü4ÇñPœ×ö,·(€{wt?È%9ÌÏQrê0ÇntH_–†ÃµÏšCLqJmm¶üA÷gv`ÓŠm7k¿o€aM2ΪÄl5µÏjìϤ5ßì³äº°~ywq ˜ˆïì—”s¡Õ%¿>p÷l]—7ižŸ/èUÛô2М¸4Ñbü‰å _Oy†ZÓEš`å5纸ÌE­nrç³—û:ê³$®Sák“©}ì¨-§‹T¼ÉWalÛ‹›Œ¸’1¸Ã³‘ú¦‹½f¼"¯j‹Å.W_ÛŽRxÁcÒÏGÙÏ!WÌÿMšÜWÈ ¿W¹×Ï´Ó×÷¸# d,¶E])2\äk=ÊHuOtA™ui-Ò7Úë0I g2"ÓÑ©æ îr?;5ú+$l¸Ï²" ÿòñ9»ƒ~è¥Ö¶ºim Åýʪ°¡ оËï# |¯Ð“Û`ôËK*"nCrõ•‡lÊv«AŒ©‹çwJÑŠl:ñ³Å"=šVƒCo½Eq.óÙÞFí½Z@·MqããÈÅ/ÜÞzãw™i5£M„—ËOBU»±ÒÔŠçðñºImkne„³GrU38SÍS^ËK1™yº2‰9Ôaô.z4L¢ìêºåÑï´OØÅ»k¸&ªÑ¼±4hQ@Ò:Œð]è3¶ *u÷7ªðJÙm CÛ<†y˜Î×é‚@ª,gái½®Ó £-$Q„Ž1– ×Q1¾s•/è‹í‘+ ÕQqž j[aâ!.D#²:&®Ôrb`QÁ\_IwUwJM°Àšï1æô›Jæ¹öù)5ý^dûb#†6Ï“ëP¯D•ú{òX–|N?$¨ï3„ GäU—ĘÖʵŠáûxã§SúàlúÆ'0ûúb?‡•;Ž•ÐAãû †¥s±1U´Ÿ©® j¤¿Es‡W]r>Y¯V@Oo­`ñ•VØ´‹[MFÞ.ç‡xÕÂãx™›RÑÇžÈ°í©«ûy$hÓD©óØC.8²Ÿhγ"9zÕ{=›ðŸÔ»Ìa¹ùi¿YyÔ¼÷¼ÓTj¾ðI’VÊF¡ð×9çÜÀî^¨–ù6‘‡Y?­^ùZ(•€üuºöÚ}3tf¡uED™jÀUì[H°ÑiñFms,µ41%žêFA> gM–×ÔÌ®¡ZcP&5Žn^(ÜÃÞØŒâÔ”kÂm\÷Ø=À3·A ÄU µ›”\·½/ ½“×Ö53 Ò<_›x½a:(ü#¿²§8(ˆ°TusÈW221~ÙÆÄ=ÿuUÖqUOZw.¤RAÜÁžísÚ;YZLû‹…-ª„¡âü»'Lg"‘šaŠž¯jô¹Ç\Iø’2Ú5åZOJg=TY“ý­jƒi&:‰¡’X‚Ø&çó|“_E~¡ê·dúIWmY+Åå[†,–­Êuì FaË™±Ì…ÈâWkÍ+ÈpR¥kvp§a§³½²Ì}¾¥Ø±›®g 8Cð·¨,Ì>=>T Ó8^“ñù?»oÇ endstream endobj 818 0 obj << /Length1 1415 /Length2 6444 /Length3 0 /Length 7410 /Filter /FlateDecode >> stream xÚtT”ïö.R ˆä Ò5twwƒ¤ 0CÌH Ò" Ò "HH‡¤t‡RRÿ1Î9ÿß¹w­{׬õÍ·÷~ö~÷~÷ó|ŒôÚzœ26p+°"†àäáŠä44T@ È‹ÇȨE8‚ÿºñ Á®nP8Lôä\Á Ò'B qp@ÕÝÀÃàå¼@ È¿€pWQ€<ÈjÐà¨Âa`7“Äa¿®)æË¯È;}A™êŠ9ÞÛÞ,Çq+Xu<2’X5²ï‘HÌã?1Ý߉±òç-zUÐ{ñ%²´««N&Ù•ŠõÓ²ÐՕ™‘˜œ¯Ör9Ðû;`Þ³Z»waJ÷KÑQ¾ï|åjTx8ô½&ß1q¤Óé@äÁ†ö@–±Ì;³tÿ”Ä›xŠg˜è gÃM/®póNb¸˜ðK»*Á{i=Â]¤°ó~4y€Tnô"JéìDýž££5-UqS6Û·Žµ¯¥ F˜âm+;Ö¸“ø*©©õà&~LpÈÞ|x‰aÊDŒv0ìÂÜ•þhüCa¸R í¤O)Jkê8¡îsµ4_Ȫã°Dn°ÉCÅ×;Y/³†cjÒ_ H03ð0_JztÜ)ƘÀDV4µtÎùÐ GÊ™ï¯Õ…;îE=¢ï¥E’š?>+Ž:ÓÆ£j•͈ž%%$ÿ¢°ïH92]Ñ_7¡Î‡gnç¨&v†³Hä yí²záEQvU )LÏCò¶'Ú”µ±•¼RÞ›¶rîGÆ• ‘ÁteˆúÄÔì ±þ¶+>/ ™-"B…PË@%f¬ŒŠ¡ûà ƒŸÒ6RB–lsÕøt1Öµž8jt§Àˆ½¼þã·Øww}ÂÞÑT[Îùƒ7(lR|ÛºfÁ5°Z´Rxýðbu}Ä0ŠBk¤•—Š<œÜ>ñi°"ãÁ[.u_Jëmo£‚û`bÖF\¯(,‹ó©4„1¾Ä¡¡”7 büPOKçyí‹®`…÷êÂù´mêÇä, @¹eL·P")@ÏÚÜXÞUéšB]FzÝ:‚s˜ZSŒ÷鮈Vw—¦ºSû±ñ8k†¤§cÉ•cèÞà‚ú/K¬¶±/ëpÇ0%/Úð‡Ø^Gª¶Ñ»œ¬Ý‘äiWäXÖon'Yß“SA½"ø6×94â·IxG‡ÁÁyܰØ-Ö|Cõ¤ ^n®§ëgçAÞŒ»‘¹ —jªm!£¡é =}8jc¹¾9ä3 µ(xõ¶` Ÿ†SÔ:­ø$oY)NLú‘› ¥ÿ¨lVñ‚JÍ;™oT?t&èÖ:2¤üßûŸû¢¨ªŸ¥ü7IC‹…ïUÌ [AöP:°gÖòjÜ’ß¼ÔJÚÓyÓ]X»ÓD9m0íe”3‹8Ú)=´ù\•Ò™NÚÞ˜­Õ0‹¦Ü‡™ÝA}½Ë}‚T8,Òü*Ĉ\ ÌØ"Ã0x[C½tЧS¥ÐDc”ÓU Âc<ÆopÕÜ3ÿ0ÍÅ„ŒUáçås…Ær¡î \gÚc´ƒù—F皬ޔì;g“L¯¤†?µ"ÔìlŽè°¸(i È ˆK¬i©)˜r^ ï´bàjׯ é?½§œÁ2‰"7r:4ŠË ÃÁÞ°¬iÝZ$¼5×{ åÂc3PÇ/ÖºÓâûáÓõP»VÙRÂûkú6w ånËÁ$j0\˸MbúdH¯:#+Gv§7¡ö4á²Äl`ƒ¨ ¡†ë-¸ª¤)g÷áŠ6*ûi ;/èx) Åo(w´DÚÖ¥¯/§MÓÔ´që=î}`u–í”^°’!±Åwæ ‡o\FôÖöÇé,}O¸×q¥äÜÿygA-TDóc}·]ЀÁ+wy’úk>ÚS'ß©1¥Ÿk\)à ÎD‘â +þVË*Ï45‡änµc ³¤r-Uâœ%–©¹©|CÕÁ²™!EEr|ÑYã-ÝzgÉëä’0ÊF ¥Ç(UiMÕÔôß~r×Vl^¶p ß·ÏÄl×ÍÙ"œÊÎõéÙ7¡—7=Âï¼L­1œU=ì¯IÖÿJ) ¹­w…Ð @˜û]ØñX»Ü¥B?b¸±ÛV…_͉›’†—ÑngU@É•1â̽…Õ"˜/æØW-™ ç4v0YþMïù^’æ„r5o4!zqËŽx=ãOØÉ èò×âÚ¹ìjÕJ‰ÚÙÚ§tz³—ÛGÖåÆK_‰1ðim-9ׂ'ûgÙÚ¼$Wšî2ÝfmH_³ ×õ‚ü¢¬Ôgh!¦\úÊ6£¼Àʧ.>?ñž)?=¹¯è†8 ‰a´wÅ)Ö”/l<_±[%ù‡>¸ÎTä"Í¥šèù„úEù CÖá<»?µ•‚}›âø >,¿=µTøZ×c¨îEâcÞ0#’,¦ÜðQ]«FÝì¾Â ²¹Õ;•)Ž RçPãeÁ­Ñ+ØköùÞ0O²ãŒ?ÖÙ&ÕÏÂ[Ù¢˜|äzˆu=ã7ì´™ÔYu@¼¡€®ÛáÉDöì1þCã“êŽÉ”XÝ~œ{cÛY⃄‡Qí³–¨¹L·ûn$‡µõþ²jÞan^9¦úÏ‰î ¾Å@iªÉJ£v0`»aÄ­¤ø™¾1C*>ý(28ð³Œã°US"¿?ŸŸ¶‰ôs±¶„u=ÓÉØ#Ú¶!Df§†êxvôÞôTÿƒTC;ÄpïÓqTË÷ÊÖyI‘Tu™ÐZ¨¨ò«ë7"ëivC.-Äã3¢ ßMÇäÔÌÙÄç¸âóÄxz“²G.ƒx&üó4nqæSln[Á+wcì3Ä‘´ùþ&\©Ÿ{qýòÙ¸òßNïYù>°Ã2ƼtO¡Èí„óFŽ™ŒÒÑjm¥á#S&º‰W®i饻Ëlœ„·á…gÞÙæ1Kûï~€»EÒÄ‚…³Ï åä­>4Tú}Pk•MÞ3¨ûønyQ˜æv€Ë¡b>†Ýf¯–£âœ½DˇmtÀ—ÿ½ï¼âsoBõ¨­o¸Ä"ºðÏIÞ’pX¬c£ùx’M)úž:Á˜y‡×࣪o¼«a[F}A¼3ü¶ É+D´>a )NyÕ qz£+Rßâ öí‹´ûïe$|KM±¢}‘ â%ž{Yf’æÄ Ìvç´rÁz¤¼îa3Û]¶M«\@ÌðJTŦÔÐhŠXTópbdt·0ø‰$®xŠ­—O­ÇÃzKý´nºÛn³Žæ­rÃJ^©Ï4ÌòG Ÿä+ ´0™¼GU†šÍô¸)ZÙhyLÑ¥kÚ£"ëS}CUêа|ÏiÙÒòôÓ¯¡&Ô×—·Ñ“—]Õ¯£ ã&9/,{“L$Ó¾ïsÑ>pé[x[)ú„œ!Ž]©y<·:Üé”jrÙ益,Vs‹/`±¯¯_—Áøv&§ñó¸a§–Íly×=ÔàO´èîbyûCÃÂ'Oñ“ô¾<ö^ù ø:ŠéñG÷Œ)‡5yYí§Ù™û›™&iÏ{õÉèÛŒ5f(Ÿ÷XÜÆæUYq®¼…Ö§ûí7¿ÄòRIbfÙÊ8(¡Y­È8rnú<øgÐ/ýŽ“,Á,mÃÿmrKZŠiå|E‰—&a{ŸÝ fHÙËLAgý÷æ»3î«øSè…*.úk§£ŽIW>H·àNœ${S­j&›Ëˆ™J|ô<ÍÜ#µ«ÒéÕé‰i62¢©» dÖz‰·K#NcÛÉ{E8O»¹·ªüÅ}`Ë·ZÃ\úoçlQÆ·Åãt‘(&¦³bÙ*#óƒÃ춸–g¼ÌÔ.FmG¦ˆìI«k;6½îh½‡þÒó†`Ñ7ö~ßvÉãÂT0:LSõÔ85²%F¢ž4üÙ>ý[篬¨ÎÊ•¨ù_pžžN;qWEÕÛi‹MvÂä‹ÜdøAϾK MY6<ø„óÜ)þ1&U .“þSæ<¶ÑJs°Fýƨv«—¯œŽh¤@KéK%óúز+Ôƒ¾4wáx¸Þ f—i¹êq*lçuœ·®Ì‘ÕºêèÒÔ>“Ò§t¹7xÛúd˜ ^¡¾ RDç:ßIàþ D)ìë æ[;Siœ+”ñ|JˆÙ|àóyðY;±F…à½N—¡`S¦Ëq•™°ƒ¶Ec]C¢ÉDÕ‡ ¹\ö¨_3Y,ŽRvïˆÐ¿Ãª—‹ºBµ^¾9¯ Ñ¡gåTQæÆ°7ru¹E?â*·³™Ù{\Í€óæýݑľMðL—L(íEý¸é’I¿gþŠ(-ðËg—åøí‘¦RŽŠ/¿$ì+ÆU ±ãoË¢ì$R®8´tñ‚«Uß徘}¸iOœ;Ïœ–›¾¡W¤Ü1Wǘ<£vÜqåÀÍ ñÿ†Îıò>¼O¬­ï2DÕîãέôšVt¤ ÖšË]J’·Ž? ¤}£‚õ"Åþgu©nb\Ì”Àë`lº.ïBÝ« UÜõ¶$ÑŸ+ RBD¯­Œd\˵lûV¾MmÕÌ@‰ßtkW¥RßÁõøöõ üRžf¶m#ƳÜUç£CK:=:Æ›p棇C¾3ÃÂxóƒ^†AôŸ‹l+ð¦ìçDÓ3¬ùø–ª‡‚u¬7²"›“˜ ·–±X:Ec<ʉ†“ªÒhÓøÇ?ÑW¥â¤3ž$P6¶À~¯‘1‰?ÏŽÀ’tù˜@Љ®¤˜ÐpM»61<ý#´úDy]šg†~ù¼éJר‹Üè@Y[]Àl+éVÜ€Ñ+óµEËÜ4,³gü„.ÔßéHÿ¾³íb(E6¾qNÑ\ëÒHVw&üàæGŽ  k =q¯Î¬2õþ×h3F‚ô}›íg/¾È¾ÏýâeÙ=éXc‰.‚.þýíæYÞ¦8 ‚ùÑä)2Cì€p*aC }‰ºn›aøøšx}®Dü!\€:°—­vB]ÙAo a=ì1ƒr3;2“+³sx¾ÿSÆK3×l3µM›EQƒcÂT/HMõ0ê¨i³wo±l/üEX|¾wÒ™] ®Å³ûû„¦ˆoÁŸQôÆCüñ'Ï+bÓmNsQóɃûç1äŒE±O8ü._ŸÒKG6„®íd ¬†è‰ƒ<".ž^qøŠp¹g²f ®B"윖»çW™TTµ›©ZáôìÔ;W9Kq8·­~à®,J|r§9<äP#í„êMh!Ñ$NÅ­¨Î°¦Áû93®•RÙUr]\Š×²ä}È Õð¡CœÅ&6½€F1%(;õýB8kx%å6Ý̶×ÅÛW¸¢§†MÖÙÚ‘Òd²•vôwY+E ·é=C±Äz ¤²×dz|î”íßzŽÇåÌó±ßþP]‡Î[S'íéO1‘&Ÿæ%†zf h¯Çæo?÷˜Óœðx ~ZÚÞÝQ´"¾+Á,¾0ŒJ{Mµótithß,ÇIvpƒwnŽÔK&Á',Ad™¼ra7X±Õ¿ÿÀD@oʶ2è™9š_çd@‡C@ͳOàeO×l<²ê¹ëˆùq•š Lò^¦]3â5“Èiò«ôjÔ߈òõòD“‡2Ð9ÀhÛÑ-Gn)Eðô͉*ÑÈÆ#½‡'? «|œÙPéš-¿{ÀÇ•»öiHpF^²ÿˆ¹žú0±·°s¢¬y|µ$ïô$“œG÷¢ã“èçÇÄN¬Ð"e"e¸Õ…rÔAŸ:å±X{Ïó­!à‡ÂÖèúØià©ú>ª­å³"û醭hïM»X㸄n—6pì¶“MÕÎqví1ƒNw4g?Œ>‰¤ô«:(¢÷ÕÊ*˜PìôÅÿÔ xSsÎðr9Ó2àÆ7!ЃKu•H7—|¹VƒS“[ piþ=‡î+'»é³wn+¦Éå>gª³Ž¦¡»QYÒ«+æ!îT-ºÉhŒ<ÚSÑÈšjÇõa¡ËŠ26®œ£|ߣî{áïÍ[êØÉFDuâ¬ümér5Ì›ªw1ú-ß0ж˜ˆ: Nnr¯Õ/°n¥@)ìŠeåXeFR†8ò›ÔowÍæ¤^= Üñrƒ8_ÐôÇè/˜&òJ)^ð-¿xsƦ4¨ý3§>vR ky[€÷­Å¸Hÿ4¾XšM@dóûäí›| ý^{ÛgoËž~âØ!x¸8þ‚!ìz:ßÍ£º®óÌN2'WI"teû‚Áþ\Ž·8$TWÎWBp}ÜÀäÄæ±°¸tŠîÙ§¬¼ìm|áÇ´î­´Ÿ“JÏ*‰dðîê|• ” Í=Œ¨˜ ­û,ÛzÞJª†¶ØøŠPXƒÅ}OV~§U;‘/K‹Í;ª¬kQ f¨úŠ“*츻È@Ãõ½ÇÀ*JƉž] •ý¤¼Mì.ÕøPQòt3–¸¡ÝÅ”íaøƒd<œœ€°’Xú/ d[Ìq”ØÆ[æ‘8òñ-•›àw‚ÂQÄl$xÒp±Ã•ÚÞãl Ú%Eݺ†q%IcÅÑ:i™>i˜HïáìUrŸ/`ìcæ¾GL¬‡ãI~WÙb9˰⾇˜œ«ÙwütéŒS6ŒøZ€þ*æ²âéuÔž³ø¸å8 ­À¾Ï£ª G ››è–v>ÔVA À»ê{°a'§‹ÌO•7ìí[R´l2¯OxFHa«=éŒQ~Ù·9ÿ`÷íLªÂaRÖ#`ˆÒBÀnWš7ªXqƒÏîªyt”ô}ñÆxùYо×q¼å“‚×=±™;Û¹AŒ V´_e¯±îjɯ€¬å#ëÓc<‰½Ú×Ó£ûÞû}ä0¦GT÷/ÖáXœ8´zÂЧ4Mý¹Éhû7¿ñ‰ÁŸ—c ¤“-ÀðÅÞ”¥©(ª4ª?-F¥gÔ”÷¯2‰A#Lu ‘GÔ¤ªú?ÒúJêÍ (1÷AÁÇ»8÷‹)ûk Z ›/ÊõදIOÒR”p¥ jæ^©í¹ç»g{•#¼ÏoäëÌðžäs=þÁñvþ „WÕ?Æ€;ƒÇ<8ìçnmñCTÌ*x?ÑNácqÝœ/)z²I¼FÁJàxÃü4õ™]ɶuÎj8°î¾¹·ô`å“Ìtƒv)Ü)·‡Ù?ì=”ZÙ/€vÚ¤è%4NZŠˆC°nŒ¡-‹Ô¶Œª¯ÀyÒn#?‚HPU¶2J1kþ¢N3š­H ßö#ÍäÒ⹉ã3Ùfíœ|b‡š<éy¨¿M°cÍAANßжç¶n¶oZTž[;ÏŒùän.¥õV—4pJª‰å`=:¯d»Ž¯Ñˆ—²—ËŸÀ<Œ…R†­. ÆsõÅ0Ù#,È2Òüüê—²"iL¨§NÔ.²EÝãm£­®5£¼Ñë±Û0f´~ ,VDŒ«Ÿú–Á€Ôþ)/÷~ÜgèVäS*f|ù,@ñÔ•Ó,ÄÃ…”Ga˜bîí'þÊ‘óøå7FNÂM¹ìÌækXº¯}?àE)ÐÝ[&~Á Ï1ß¡ËR&„y`3JÇ^“SxÉðÇk­5,«…ò%æ¨+Ä8¢ê9r‰Î©¾r—ÒóÊÝ„Bôl‡y¬”ø‘‰ùªk^Þ' öu· ëW"±òôš°9ó5+ÍÔhs8ˆuvj•ÌDÛókN"K€¤æ‡v¶Îø£å Èu͹¬ŸKäw Jôÿ=`ø endstream endobj 820 0 obj << /Length1 1533 /Length2 8365 /Length3 0 /Length 9392 /Filter /FlateDecode >> stream xÚ´T”ë6Lƒ¤tÃÐ 3t7HwJ3 0ÄPC7‚tHwI7Ò R‚H+‚„tЀćÛ}Î>çüÿZß·f­wžë®çŽë~˜è´t¹dl\¬!Š.08ˆ( SWW|Ü@ /&“îù[ŒÉdq÷€ºÀDÿÃ@Îb”É[ÁíÔ]`O'ˆ ‰^ Pä_†.î¢y+/¨ @ âƒx`2ɹ¸úºCíìá×üë`³@""Bœ¹dœ!îP°  n·‡8?Þ¶r躀¡¸ï…`·‡Ã]Eyx¼½½¹­œ=¸]Üí$Ù8ÞP¸=@âq÷‚Ø~ аr†ü©Œ“  gõø#×u±…{[¹C'(óxôð„Ù@Ü—t•Õš®Øcµ?œ€¿{qƒþîoïß °¿œ­À`gW+˜/f°…:AšŠjÜp8'À fóÛÐÊÉÃåÑßÊË êdeýhðWæVEm€Õc—çv‡ºÂ=¸= N¿Käùæ±Ë 09gg îù;?y¨;üØv_ž?“u„¹xÃüÿ¶P˜íï"l<]yôaP7Oˆ²üß&"Ìdv8@(,Ä'Ì €¸ >`{žßáõ|]!)A¿Åú»º¸l‹€Bm!˜þV^ÜÝèÿŸŠÿF˜ À †¬!vPæ?ÑÅÛ?øqøîP€ ð‘{ ð÷ïß'³GzÙ¸Àœ|ÿ1ÿk¾< ú2òz†*þ·NVÖÅàÏpñ   ôxüï(ZVп³þ㪠³u€€²}lÓ¿2öú›¬/࿃i¸<²`ý‡ä¦@ øñú¦ú_.ÿ ÿåÿFòÿMHÑÓÉé/5ë_úÿÚÊêäû·Á#i=á  îò¸°ÿ55„üYZuˆ ÔÓùµÊp«ÇEÙ=’™ ÄÏ äÿ#‡z(B} 6ZP8ØþeþÈõ¯šÑrñ€þ~[½€ÀÿÑ=îØññýðxäå••Çã²Áÿão y\§ÿÎCv±ù½w¼‚+ww+_ÌÇÑ?"€?èqAm >1Àà s?ºkغ¸cþ³À£ø[ôñx”þ„ù6â_ø¯ñ€1—æ]ÀbáMá]W 2”Þ\[Sâ¨Ç™WF¼\S%æða…Y‹õdݼÜeÕ*Å¥!¢¹C¯†¬ÛUþ—…sÿÍ7´Í¾ü—\´Šßíh­“æ.çRüRÑÏãµ!¦ËÒˆ–»#hQÇ>í{"ec7¬Ë„ÀÒ4¸˜âÍLT¡(¤Ñ¥ÑÓ×P‘«FB%bp°¡o·ÕÛ¸ c)ØpN|ñ-Î4:C#›^U¼ç3Ù»þéבñÑUü!êþØP¯°­Æ—p|±Q*y~ôzƒÕbÜÛ‚r¯ýlëg„²Jl&³l)I[9Æû(Á‘õãÎÛñÛž¯ÅBö«nse>‡7S â¹æZj¿·uô¦ñ4¢³I5© Š´KùÜ0{]“a·ÿü^φTª9,ZöÖñcÅ(“dÈŒÜ8â=W”L±ºúbG‰0šE¹ÅŠ’‘7_~Ngh³¤2 ”˜ÇaMW¶D³Ôl!»åë?™Sû!ûŠ)¢= zjèD|Ü-Æù®DM|HË@2'CSÿrò:( ®üÞo$D«¥S"Êòqˆð€X|m :Y"½WÑúw½†¿#GcÄ_ù``B2~¤cŠÍOjW§¼ËÑH€³`ÉÆjë0»Ô´…ÛÔT™f½hYó—oóð ¾.Æù.~‚ýCö[£ø¬‹µ$ìõ„Æ6ò-›µ¡½Çíós‘úQ¡$æŸÚèo‰)˜‘î·§½¨®ny,Rx‘üQñ-‡TN|n~‰ÏÍ2h™ì"9‰óâ°÷Á”Müt & ŠïLE”ÃàWà7ãŠ[žV¸u`w7/²¼€I¡¢ÚŽJ3àÈ×ý3µöüæGÙAð]æ¬D~ò¹ô7S‚;sÀÕÿ9Â3²mÞìeÄ5:™Ë—Íåt!}Do{ª }K5Š_•§Iâ4nþ‹›ï®CÎÊByÒ£¨ˆQ’‰ÒTÝí ùŽï-Ò/¿Ó/º‘3’¶,ZÛ\lB$…p‹Ÿ0æ,&¾¦Î³3KÔÐë}óØ*ýCM›CfѬv×nümåœwKv¤=:Vì ú¢¢‘ R“:z¼ó³çF"Ú^H6n÷;Br&•ü£¹ù†fôÅÖ) ˜\°ÆmŒò×Q>ÕÂ/IÜ7í9Ì—o»:rM&S~!«•_!7OŽõÑõâ©q÷à*¬C,ŠåòGÝÁçÊôË ®N/q»6û# oI"÷ï.†ëŠ Ø )r͹ž+Ù›%]ßE©ÚL37xÛº¼ØlyþÆÂ'ë­fqËÇ«g.)ëLÐa?Ë|"ñ‘—]/ u¿’Žœø³:Ls«êÇýè½%fð|y”Ö>ð-µ,¦3õi>5jH òÖg¿÷ÓNÁ=FxÑSCZÊn^¬Õ6g’€ÿÆ c^÷½÷®Šº}õ¶åØH?‹çXqËë+¬ù#Äx;O©HÉð1‘åˆÝHˆÍ?Z"|B5hö±àZ CYËp5^.}ˆO¸‰øpb+8úɱ ï£Bc¼áúò>RyhÊçàv Ë:E6yí/Õ–]©Y/ÌüÑqŒLv¯á@Öµ.ççòIÕT à¦PQÊ`šÌävø¡E©º;)’t²;b¾_òn(;ŽŠ˜ x) gHÉV—Vzs5¹ ˜åxATÆÏ+%‰‹4\1ûþÜ­†é4è›xm­Ï$¿å¸ŒËàT‘S}ošÎ¢ÚB)ù÷–A¥;’~&®²”——y³î¸±•E†ì6(°Jxî§Úõm 2y‡ÐWjäœî}÷{²• Ncmì7~¥zG"FZ=c‚ŠnVe’†}ñúm=Î;›¥‘l¤ŒËQ#9ÎhFÂDZÚG²nìiE©!&J™­¾¯a_"{ƒ…Ê;ƾε6ºânI­WG°8æÊ¢«ƒzÏq¿™óãtr’fNч3dÂèZº”Nè¹)÷È1²7 ã ݹ_ÑN´S´’’E”H·ªß:Å÷©÷4ª-–rhm`ì1… 5Ÿ–fºf¾,Ÿ qÞ»=Ck·\ŸÏH¾ú$K’2DkšÜHÖoÛ¢eélÔ‰»UU‹èšuæ¯M‹Ÿr]Šì“äˆQGT"Žhcây·‡E©19Ô‹¯Û"Ï:Ã)83ĨNdô$ÆËž½Ÿã—~ÁæS~ž¥OˆüéJêàÙª ©ò2k•õœ{dHÓM³y8'ƒ'êr“ BŽ™WÏ,üe‘ýÁ×-ï,ŠýhùµõÖ‘]Ê\×Z¢ )™¤x£ô;>eiç½#'›p1íÇ‘ñYìfo ¹VTrDÑÙmã h&‹ì%ÞåÓ—Ë[¹„ 7/Ïë®DÞë4|”Ê=øä忉E ÓºÐî×1¢±-ß@$@LiNTñërR¹= éYaöÎ2dŒ c°ùë Ëôú…Ìi²¼wЇ˜0ÑRê‹î?AäÞÔí¸JŒÉª­âçHŽ8 :x£'¢‡)ß­T$Z#¦òåðg(mrÞ+ia̽u¿(3øy§ýí4L ŠXµçr ÏíZY×fÛL¯F¬¿ô,œJ鿬SÅnîŸ,2tZgÅÞ¸6º“Ûñ…;Ðhdа„‰÷Š¥ëå-o ¥P¾Èçš1*ƒßÏ+ÒÅEô ,cJ=™(6á¥}ÈÁ¥…EûëÇîÚŠˆâ6Í;ä [ƒÏ ?KzøßñŒ‚{“ØÞ|8å@·ãB™X"›Xjdv^dMÖÇMBë™6z¥o>;&‰ÉÑWªB£h“B6ÍÔó&¦šúýލÄèw;õØM„FÏídWƒPWf!·|m壻Ûƒt”Du^3«¡Äk@?+míízÈ]@£íφb¢{Õ5F*žŽ×í+ó‹s”“º'ˆ—ï†*¹R]}žÞ#WãÅç¡K± ïÄÚõú-’85U¤D^ìqnQN½ah+Ën—y+§X›•nìœaŽu ÇMX¶è1ß‘t,IiKgFµ¸ ‚_8ûQîé³»O²ŽÝOÚ$ ³¾r‰]u†K$ßp6˜£›B•õ(ñ'CT{ çxß㙹š Œ…ÓŽL¤MO†VIÓ½œ.YOs°bß_¥Äâ(­õÈ„- å¼6k€.DáóAŒ1–}&ÞonEñø’Ûš`îI^!º™oY&Ÿ…Þ4 ào±¼É D¶<ç»Géß=›cÝÞUϯÐ ìúÍé8Èx_yÖY 3À5ÆÜŠŽQgpËÃJŸ"~I{AôJW3÷ƒ&qñžô«ÚÞØ–NÊM_|jСâpõ{ôôÁl1抪¡!*ÜW¤©ÇùýðÖ–A=©ßäù‘É9C'eÄý9-ÊVóÂ(EÕä1×õTT¯^ºj}Övo‘€Öd.:š¹ÉÑ2—¾ Šª»ËO5mÕÒ34 déÀ}·÷0²,Wà——?fmÿL܇JåáX\òÝå½Y„.üjQŠÈ'|&cC¡%µåi­I/âàFrþe›Š$óWúhÙ°Ó'dºàì…˜ ršñÀ`ùÐ-gyýô.û¹]Õ`:›ã»“E 6­K &.'üø>j[æ=¸ûipʺ¶…}ßš}#âi¼ãYFdo×ê+ê·‘cr-N€‹¯VPfG`÷qfKÆvâqƒ—q”‹£óø"ßå¢:ÞE£a÷ÛÉà]3Á»)R:òëH#ÇpìW+#6h–\†ßš_Yî¢˜ÎÆ²¼»ß8ì¦ÛPlþ4“eÛ(,Û6o»1´ZÎʆð¦>‹^;þ+“õŒ4Ù°G²¹V« Ì‡MOÚª¡À¯(áZ¢ÏXQP^,+±«ZÑ[ê,ÏY´Àqdž;ž!\På–aìû«¯ Óʳ7ép^m2qUß×áëÌ™¶˜.ÖòÖ~︵†â†6§Îfô˜ïìýÄi2uRM,ˆGª ƒ 1˜mîWøh¤ÉÈk9À#µ[dñõ–„ç¬N¢²§0pªdÉæÛ#¶,Àu¨: Osx½4Þ9)~ÉѧeiÛô ØW@x}I¸ÄGyKÝh¬èRh9`æêƒÆÔu1¶å·"Ó#ˆYò±f,óàkês¤>Sÿ¦Ž}y.WÍ1ñ„™ŽˆˆÏYT©Fµ™õ±K6GGIÐx°Û?‰ù–¤½¾šPø)ªeú2¥^ìÄ©_ÛÕi,çu–’þ‚¡’£”u«’]2ìõT__Ì[ôŠFá>3odCÝÐÅ'íÎPÙ,cÏÖ¸'NQg:OK¾múš9y9]׫ãòž‰R5C{/fƒ°ý:¸ýŽ‚_$ž±ûS<±†üÐØ×žu|GìÔD,½"³½aævÇ—Sáëéõ×O¿†?ŒªGãNþ>G¿ÙÔäZå€2;¡Ái ðDÆÅ¦©ûˆ'”dE$sœQÛ§Mâ_oL¦7}©G –+9bÙX“Q}Ü€ª?6Cw‡îVgºáµÑ…𜔤².ú§<ðpõДÚy‚ ïÎåט1j!*CÚ âÖ¬‚Ó#QRK`‹)‡âL³•nƒOö\Åa¬·#æUq´¢–þ“Re²½ú¿ÐЙ‹:ѶV/.çîŸ,‰( ¹éóž]sí"€2Àe!]6'òo±JÈå¶út®¼T·n _ènÚv®Û›ÅÜÒð’ið0¶áI·šLB†~)ç‡AÇúvÆn]á[‡;‰ ºýTéÍk'†“Dâ¶Ÿv š]ï%KTÔŽyé‡%Eê£ó¨E?ŸÔŠ} FËX&9b*à(6ô#R‘É:8åàȇ.܈Wy6÷¨.S“ÐKÜ" spó‘Þuv˜/âsïóøIj™K¾*ç—4½F3wU³Â7€ìÏ8F¨ßô«" ºõ‰›ŸaòåñÈÔ[f ç¤'ÓzM?W8QwNâf$&*ª³ äòHÌ‹7p~mUܰk:mó7¿vjÌ{ñx¯¹¿ôÿq2µo9ÝØ™“ÉÏ×B«Øß4ÈÇ:‡Â >O¡T¦Ÿª–*x-au"½ú²ÙæÝ¸U`N¼V´6»;ã¸æ¶y @9r›+i('äð\kæ==*œ¾_|¡ M¥Ý7mç·¹z&æµåJýÅœtâ¨uÉ ·ÎX[G_¸Zݵ‡Q#^0¢D‰øt”#&‰ ;«¢o„‰X-öKÀ ›“wiÁË1’3O.N¦É¨$N”ôÚ.l¡œÍ—}t55¥G¯rWžàcß)e'L´Ÿk‹¾˧&Âþœ?j•ÿÚØPFç¸e½XŒÚ 7úù§º¹‘ïÛ"—)T€Þ©¬aÈj¡4Êâ§>#uˆqí8l ôP' †yÇ.MÌ)HI]µû'æ°ŽŒ1ÂiÊ+#ÊHݦ…q®© œUFiÞè4לǷ–vÕËð?ˆžQá’‰âö,KvÑ ø¾½5v>eðdhQ³\mÕD,—©’¼€ˆbROÊ8>hŒó“¾­Ô˜$9!ëpkº]ÅÑÇ„ S–3³)/ï%K'ׯ•b:³JT˜ðó»µ»=§ñßjYð¼Z*ß—Z¦÷Li?ŒxÛ]"&× ¨Ÿú´¸]“Mo-Ȫ‘ðhcÀ ½¤\§`bg¨&zÍɽµ[1aìb{æ+éÿpÔƒEeuÍ[ïÊ4ºìTQø°ò„Ý“žLý½ýµ`&çæme4‘àð—RmIÛ üòzýGj;‡Ãå˸̈́sþ¸´ÃH剬ýÛ•Õ)¤oy™vÃaÜä¯,]Þøk„¡°]’CN<íß~'IL‘eÙ ½±¦ gO¤“eÜ”,qf`âq ܈£×û‡û¹÷¥íX…³2Ú#†xO‚PÅ×ídVFjÇV„;- „RjHÆ!ì{ §?µN\k­¹”R,âB}Î&š{âN8rLÏžÕ½_ `Fn­J0páîÔ… ²ñ.=BÝmÃ1…ä_¼þ9)n±âGnõØHŒL˾g£Ï›)k#Þº$L à»¯Ò çviÞþ ò?ºUÎà_&¸2P¥à%¡Z+š(Æjéøæ®Mº’´YŸÙfi_Nþ)vö.-cÞ'UyYu£!S—¾v‹z’ÕWŒW&µéF)þò ]8ñ‰”j× qÂÿ¾x¡cÖáKnÖý.q$ý?“¿Ü¾?Ò¹Ýp•Y;t^Œ@¯HÞB‰[IC_1s1%òt:jh(*m¨‘¥ÆÁãÔNðM{â Ö­Çˆh³é8ÇûbfÒÜpß{èö¤J[ÞŒ,g0HZ8ˆ5•þþùì~±@¶*=⬀¼Þý9&4#Ó“Â"§Ã‰x}°™¶­Ü·®4#Q¬ó\¦N!icnmK÷3°¢§)˜”{=m½Vgâ6½CæÓnŒèäxmöä&à ™™Bi7$m LÆÅß—BÖK÷}±Ï5oGB ‘¦Î¬g«A‡KÈf"¯E¢žc½ä½$™«NÒ“!¬}]Ú55~MS€ó“RKG×–|‰ýüETŸ®úîF¯ÕÑÕµð0Õ0½c–œÚ\"æÇÅ_ôÓ)…‰4ÓND ¹{Åè"$)²!êÝF¡}Á{|³µË £—û0òŽ`K½} “–·„“˨0š4ê×>e@6¸å¿Ox–ã`ñjj‡OY‘\8€u3m*š¯]LÌéûOö“[B_¡ŠîG³’µøqö{2÷Ñî+åÍ8=»¾}Í0W=Tw6Ò¢A@Ðg®£"Ü )ÏA>l±ß¼°}‘}ÝM!í<üÆbÒ0ˆ æ6ª·ÛŠ’>)Üù^ᨭ4«AhÐu }Óg¥7n-Œ¸¥ÞV«èJí<ò´sŸƒƒª”º«»Ù«ëp#-2ŸeúÙŽè\h%C%êæXrž4[’éåsœ_VòI™Ç‹-s Ò~‹(9ns¼¯ãÒ{ç2Dü ~:öóZr]Ž¿¥À6”£û|8¿°Æ‹#P&›@ì­s[}OÚÏü«ž³žI`é€þ»t˜Ú‘ÊTc’ó.Ža–šðu?[N=£¾¡ßÉ‚ý‚QŽÿÇ7¯Ì´¸Û;ò¤ðósóuC§]éC"zø”Ðбt5pÚµµ= î"­±tÜ<â?ð´³®ÔÇ*P@ÆxÔ ßvyŠTÖ/ùÏ\&:}æ^eAS²‰Þ§ôÖjmYܦ¢&rÄN“cµµ¥ô÷OKõž'ob~rŠ[åxïÙâ–ZŸ°]ZP düämtGdî•7ÐAÃÏðá€.á=”åú¸CiòíЩn”°¤cÆÒplѶ2Kt–’ν8a“ „ǃÖ\ç·Ëñ-ÊŒ›Ø>NÕ(-× …±n6'ËòuzÙtµ é§ô­r˜m·U€…¼d!hydEíO|#…æ‡È¹JsjŸ®»l=Ëöâ–áŸØÕ燼9[PÊÕ´÷ŒLÜ”î[`û½ù®’r eēЭ °ç:.aH‹¤Åþ9õ¥[cÿ©$BÈê½ã-•VªsÙ+{2D4N£8dþveç –ó™FžÔä-_'Ré#ÓÃ*>Ì*“Ü€f»µXbìŠë÷0Aù4ŠK݆³ ¡ÆÚ‹ñÚ¾Àôh¾Æê95/ïnfø‡Å¥!y^œÆ®]™ª¯ î&“¶Sb½ÎË X˜-r<,-é+sÖÅSS›”(z{,ÊÅUžM15¶$(Òˆ.¾äËígð5„ic×Ô4]¡þ9c©$äV%¡ueyµ8¥›ì«UÏ‹c¬J»í|·¶®¶¨ïV2ðž¹¢=†´…0 ²ºáÌŸ¼5L¶ÂìßêŽ+ËÙè×ôB˜§¿h [¾™òI§Í„ˆÇæîýpû‘‘%)šÁÝ™£Ž:T¸ŸÆ{DýÆÙËGO´ªàk'_å±Õ±Q‘Nþ8ª’žzÉÂ<íÜžW©¥:360ÁqÀŒú ö{§ø‹Èa$†œÉozݛІý_aq“áƒë˜NªÍ3uÐrÁqîbÚr©ñZ¶M§‚w äí²Ç5Æ+F" ä¯î|^(eñ»À™‚‡éõ XZ‹™)HOÏu• ‡:9ÄæG—ærs‘>ZºÚ·xÓT°z´–ÈnTg†Ýçð;ž˜7å,&jÙw6‘ˆ%¾è‹º5Óý,ågàÄMë6*ÁÎá\Ï– dº0%¤2ÕgJ8,Ñ‚^äìõãÒOeè^ª ßW+|áýüyo}ÈÏ,B‚÷|@àþ6™ñÀŒó %¶þí#©ü“eàõòºîŒTcŸDȃ¯Š ÁÉÔÀS6®eFÆgÛ¬qZ>Ó¥Ù¸6ß/”–ä 'š'­=0ÒÎCEG0Ç-P 4©¢õÓyàK¯´ì«øTžÁ47•ëøÓ¬9•â¡0wÍP/\#ǃ,<Là’›+'ïÀù^ôuGD%±Œj_®ýõþVJpëŸã\HóÑ<‡¢¾.KëÄ~/VòÐkƱ}7.k5}àûÉÁàBÓÓ -dŹEW<› íP¤ØðèŸHH˜Ç”¸ øŠ_ðj½Å[zd˜µ\èYwôšì˜ôÕ Oøü@_$­4/´)åûiÞIWâ×Ýôî;² Žó-u#ÖÓnÑ=È=£ý@Sê¶mU4Çbû~I Ò$,‚£rŠêPö§ÂÔ(á-öº 8Ù)¨_ŽR±¢qL5£dæêÈÇ–/ƒ„ïük¸ÂÌG ˜Rq0Ë¢;€¥ê-›}TO2êÕ뮆¼™°z…$Ùñ*ØÈ 0B8öÈeS±94ÔóQnµô_\ãW9MOŽf;7b˜Ò™áøÑÝÃ*Óz‚ýéÞÚˆê[%¹ùÙÑÞ5íj¯G ŠJ÷o°kÏÈ.Åt’uüª-âË»vÅØ³7ƒ¥[ÿ"ÚTQ NÖÔ+¤ ²IœÙÉUýNÅsëŽ?úîÜÂ%YÈRÎÕ‡âE ,dzñ…¤3Ę"ͽ£ùH7y[$¦x$,“÷M¤²/=³ìHû×—K눮$%Þ2ÑåÇ•q?é[Vdn'hÃ쨅9c~‘_,í)&–³Íëâ&mxoùÅßoHÏÏa…'šÈ9 hÿ’˜ÁJü G™"‡j–mXhk ú{‚P1N³'Ñ<ï^wŠêÍráESÚlÓ,¿@<d…Q^{ºÆ¾ âlÖA€Jäßq‡ÖY¨Îz~a(Ó÷¼ˆ¯£Ç§ÂÎLeÉ\‡ "ݪ³¼Ì—si5‚Ø• ªžéGæö0Çs³˜›ið̈€•c=0¾$° Îø•·2gdó6"´¢Ï¬ÜQ§ÞyQJ0½ÏWó>°†ähÍúYÕ]ûS;­‘Mk÷¨9•»fb‚·«·Íy„»‡lñ?NݸY½¨Ýß‚™‰ÔûL’Gû ±6¬ˆŠèr ±l»ì?÷#úš‡Œg†oÆúÚ_Û°ðUÙFÒv¶Dv‹L)>8DÈBÿÌñsS˜Z QÁ³ÅAyÉIö8)vHïê>ÁÉæR²ˆ¿ò™c賄ù®ÜÙ•½“a£ƒæ”ÚÞµŒÃ7÷Ó4oY’R(<¶Ôlò>\¯'ó¯á¯8sH4g)„v$Îí\ÕøÜ«{†Šâ²=Yèöe\é9£ïB ”Q(鄨3cY¿,SF¸³€¾ÍF ÌÍûÆKŸ‡ ‹z³0ëŒ>úuQ[D\3ÞÐAñ©_Ž­(úR¤0êè~ãVY(âûT'ã³À~Bþ q©òÝú«]죃ù3Ò£^óe))aYâ©„uÅÒU€ `ç«ð´k* AÕ÷. žºãZY Ñb1òè)ý‚qAb›º±)']‚XÜs0š”Ï]¢§‘b½¥ì<ÍÞÏÜVš;³y—Ñ&eÚVu¶«ru[Žˆ–d¸Ném¦Äë?~*zªQ8À}ÿy Zqñ‘¦G^ B–%Ó0vRKkÿ©nénNëÆ¶Óg‘Xü#ÇÂ-¢ìhžó'“òà Ò’)ðžcì.£ ¬&^ÒåþUf‹]»zaÓÿng?Œáð›–Å–Á0™ªTêoË ÝÄ¡÷ üI¦ËüÂÕ[Ÿm»ŸÆÒÈÛWA;[Ä °nœ-?uAÕ~„Òû4•×jn‚2¸ü*g5@EïàRûÓ¤Çé l&OË Ï³˜‹º Wpåfcé=ޤ_áÔ†uù@+J_;ù– o»nõòXÔhñkÝ£aëçAÔ-Co‰GêƒÎ¯Øç¨o ¢ÏÁQÎlÿЫ’ endstream endobj 822 0 obj << /Length1 1399 /Length2 6447 /Length3 0 /Length 7411 /Filter /FlateDecode >> stream xÚt4œïö®HôDM‚(F¯3Z´è½÷m0Æ fôè½Q£w‚ ¢E/Ñkˆ.HD'þ“rÎùÿνkÝ»f­o¾½÷³÷»÷»ŸçcfÐÒå–¶AZA47˜$ UWW€@ü< !3³ ‡þu2@]Q0$Bôd]¡4Æ'AcpêH@Å óÀB¢àG¢ €ùé* ƒ¸Ãlê<$Š"d–E:{¹Âììјcþõ `³f€EDqýNH;A]aÖ@‚¶‡:aN´†ÀºHkíõlâöh´³(/¯‡‡Ä Ńtµ“`çxÀÐö( êêµü q‚þ™Œ‡ gCýñë"mÑW(ã€Ã¬¡&à au`è*«4¡ˆ?`µ?.Àß»€yÀÿ.÷7ûW!âw2ÄÚéä AxÁv[ ÐTPãA{¢¹„Í/ ŽBbò!îb…üîPÖ@0þeí sF£xP0ø¯y•Áܲ<ÂFéäE Q„¿ú“ƒ¹B­1×îÅûg³Ž¤Âç¯a CØØþÂÆÍ™Wsqƒ*Ëý…`\„ÿñÙAÑAð#~a~Ôõ´¶çýU^ÏËú;þåÆLàëãŒtØb†€úÂl¡˜?BÄ @»ºA}}þwàŸ! °Y£VP;‚ð?Õ1n¨í³|W˜'à Ã=0ôë÷ï73 ½l¸×à¿÷Ë«j §k ÈùgâÇddžn>7Ÿ ƒA€G˜ß–Ñ‚Àþ¶úO®2 Àà·‹¹§µìþ—lÕÁøg1 $†¶PÛXn Ycàÿo®ÿNù¿QüW•ÿËÿ»!78üw˜íwüÿCœ`p¯¿ kÝШ#1:@ü7ÔúGµêP˜›ÓG•ÑŒ¤v6sƒx@ü0”Ìj£C[ÛÿáÌ¿þ/­Áa¨ûõqÁd@ÿÃÌÚóAaˆù'AaÔ†þ½Æ_6£§ö!°FÚüŸ âê ñ"Ĭc |À…Ú@=SÀ˃@¢1)Ì̾[¤+á¯5?âð*ýrý¶„x [ÿ8ÄÚÍÕÓÅon`:ø—ý[êP¨'Ôšpv i-âPÒ|Z-MãÁ½þQg/íÔˆûc¡9>ºK~Ìbù¹nVæœj™Âl'XÁÜ¡UCÆå4ûóô¡ÏZíÃ:/cî‡ ›v­â§®oL$úœÐ2N‘4bå¦ÈЋ–¸vaiÑE“¶HÚØué2“rj•Z”E~šuJš­$\x®Ô§J#*Á¯ëöÞÑ+ú»"QÄ•²mè\|¬V¤®’ä` ]¡K‰òøq§™8¼“Üšf\¹IÀb éЬÍHTën Ž‘ðaÕËOØÕ5ÇüïòÒRy[[-_Ë’Åó?úagì˜ÛŠ?>³Â)›¤Ô€jÑI©6áXgë„ËÙ ‹”}½8ÊÏuö^ÍMWÛËPÈò7›\KknvzBc|yœ·y6Ygö!épxeq`o`9­ ÞQ9^»š-+æïtÎñq—<¹mJؚۤjvºµ•)!  Féî QsUÎ]@ßço*rاÀ²×ÀM‘•Éz¿Ô²¤M¹he+üŸG¸DB\Ï‹ÍG#¹F4Ž”Õ3â-.Ý Xë̽döy%½Ú°€·‚F⟻Ë*à‰ t5šàN‚c²wŸ÷žß]Á‡<{¡%šQwa%•íÄb=¥\=œ·®‹~Å];d`?€QQ¤ˆ-wÆpq]…¾Ú®—1ÖäOÃõmÓ~Ô‚Ò4 < ƒt¾¾ ¯Šx,<ýœœk¼T`=ƒOñéœU#dÜ}`ƒ¤ˆŒðÑù´kuKNÍ;žõ_ž!UuëÔgÆž»Wêß$(e1,IãØÃ™ðÑÞ—LÎÝÓ¸€­˜VnW£‰ÔoSm]Œ…Hl«ëPÞ¾1M2f·qÉ>p‰O=ÔIIë)1öŸµÈ«IÉmx;q Ë7xÙgxïœÃÌè¥äÅÉ|F,U“ƈà0,)maÖ`èç&ôŠQÓ›ÀÍFñùûÄ3gï¾&;nú÷¡¸M°sòœ\\B];•É&\°Ð¼"œ0»Ñ¸vÖ&{÷'Âm+éäžÂK·ÕâÏÚeNì^‡Vg”øZV}Zͬ¶g¢Lß`JÓSêâ&gÿ`g¡`ä-ê´v2xrÑ Œ{’E-ÚàGøØ´Tþxíh¼Üª‡ïëlÙ²õBÝ3¯Ã¼+æ‘ >¶e~lô}Õ»C„.ñ)d¾aÏåï|íú\Í’P¯–Écy`QVx*=³ bæ•l˜úm-x«Ïó@åüæèòˆÞ•˜_’ ™éy:®÷¼£.[ijÆ(•‚Q°¹¾ÃšÕ&4Xˆ/ˆŽ³JT²ñðNU/?Ëõ÷wù÷F¼Oš¯ ÜÛ3¼¤T÷[blÛMWþx?æ9Q ñbƒ¾ RUíœ*SªÖù|ÒL†AY¿Mæ“€O‹×¤´K ¤×НFI5.ù¶èG> RŽŸù@'(t\½¨ø 4ù,ÈÂÈv íèmV£íÂ섦/ªØòê7§…Ç–×ÑGSl—X9ÚüMJ‰Ò">glç ÔäŒÀ,DîÓ³xD úáÒý©ü+ØRžŽ\RØO=ÛÖæysCfGÇûS¦Ù5§Ä¥C;¨ÉŒ~LÄÜ ƒ›9tÀuÉÏI<]â³ M·®HáœÓÁš4Íç’ IÆmØá]%§à¬í¼SxöÁ# ë—rPù"ú§¶—Õ¹7݉…(LqBÂGˆÛõ…¿2¾ïÌ¡wùC6AWöŸ qÒ ¶²½“œØ™{ùñ‚Kßzñr‘[4ZR<ẹ̑3›E)ï\ˆëê•<òÜ…zzðjÞÕÀáøD1{ͱŠDûÐàPÐW.€òËÁ„ŸVUBí8T]ôW†ÓØw²[¬BU?ÜË\s,?ÿüú†œðâúlypocɲvæê„þœõ¬¾Ä–'²¼ñÍÞºbàº4q(/k"d»ôågm+nxÕ©þ±¹Ø/ì ÛnâØ:+M{³´në Ïr¼(#uEHSm‘'!m”£IË×K3ÌÌX Î*%ZËn¾í…—“„Ï.}e릶I ã\|RZrU,*vˆÕ5 ©ùÎ[pãî ©æ;J‰ªû¶öˆóýuÜŸæ' ˆjµ XEy6TíÞ´âIü;žÍX? þÞò…™˜PV÷Iäþl9‚Zî+ÁAôߣ¾ Fo=‘§¯Õê¿8ß7;×™{=L•§¨öù5O´ðˆ“Iâw‹«pé_nïùƒ;qs6{bbžÉ¿pNí9øM¥‰ cn] sõä™i)æ\Ð ,¿.ýV<ç#Ý%@}âËžc )òS80‹¾»Én#YŠ…äžNÃQFô=ôf4vAL1^ã/Žœž6ÐÈL%Ÿ6©kO:7‡_wS9𫬶$ò‹5$rú8Þ&õªò^×ìüHòñ“ûkÐ*ØöÌd’[aÄBkIµ(²OM Ĥ߫øV…a![ýfÛIìÆíBâÊ¥’#7ÖwÊ.n¬Ûa×Ñòl¹õ¨?p§3‰)þVd;È¢q1ߢX{ê……-µ5/)w±oàWEÍŒ¬r)ÜM Dõ~1®r¾>"åÞÒÍäÌ0ñŠR7Hy>–Ì\Ç' YtçžZÆöµOz‘~¢hP(`‘ûâði‚n/›Z7Êx‰t‰ÄÞg:;t˜¹õÀ3Á,Ø=C< ª/ë"Õòµ*ËsÁŠ0, ~p` aJy‚±h²ïD´FQïúšy^¹ëØ6°£ H Pj7 /dQY±†RþÀÎÍ7y`š)-­ýF%³KIh¼+ØX~S“1 ÝåVcÐ`îƒQ0uÜäÎЭK‹]c¹ÔÒÚ(…Ù(I®Š@nøö˜«®üë¡ÛœX•\oÈA)C"Å)r†?jÃÂe¯‡¤`óO&R ¤nîø &=8öD»Çg—ñDQØê×2Ý!2÷ìôqÚªµ {uþ¸hòikhÿJûâ§NMî«á¹ú[Ýw""H*YÌô!º½Ö; å&Åüü ž¹ñ ±OOv“¶«…Q^_[ëYMÌH¥=kû=L¦¶hßdk*w‡=Š*æ\Gn¿\l}Ý!>æ(UÌŒR6µ´”VöÇ­À¬ô{•‚Öʲbù+"`ô\DÞR´ÏüIûm¬¹sÆpw§[Ê,©VW ƒ·–†r6έUo«öP€37æ®®I€ËwgËÑJê‚ïQp¹Ê¥¤± ny&P²èùÌvǽ±ŸÀaïïíQ\TŠjCjøøx—cyéªæS#Ϯˬö“Ù—Zã6µÓÉý‚5?Võý³m¬^“Dp K+– t€]ãžm]ßÙÊ|l9ò)XYü”ÃàÕc¶áüS ç)çº×£-I„䳜tªHñÕç41þì{Ë?ošs8ôf*}=Óãa!è»xÓH«=°k-uë3žÛ•IÑ@*XQc´JîÍžòšçÌÙ“ß9Ý‹?Ìü^ÊÎtžZÛEG¹eâž§ óNX1Uد¼4"ü2Ü#0’ýCäÔF£OŠ?ÃTÄ—^5¥§vBæÿYtgíþXÕLÁÈ„ÑM‘#2n³8‹³ ð«G¾Þ,aå@3Ûwû²UÃÅ_ÞÆ"l“cá6£¨¾‘;.ö:A³+MGè %qøGê¶ 2L¬ày 8å39ä†oS;÷ïg ›ÔÚÝž5¾õEGÈ{­gHvoˆo˜„ÿÜ—4GŽ?¹4ÁÖ}Á ¤¶”™´r‹“ÅX}bÁ^ç.mUa™Jauò[”ù­¾çN ÃaôÈè–hqç=¼@C©·•ƒXÌ]© ÙŽXÈ»nzakóã±48G!°ùÛåò¼½uQëG•ˆõíVtçûM…K  ™–¾ô F£ÙíŒÆÁ‹ˆy^ó³v¶›q1ÉRÄ&`Ô åžRûç…ÍÂ$þj]“mû”+×Ôš ýrìÁà<ãë¯{.ïO9ÓP—’DˆÂRò÷~1½grÏÉÒÔbª¼ŸËÎ^eF_¬<ãU*+?ðs_e1fij|¬*]u’ÁPr°yÉ6B—<‘&±2g‡2;ù(Lg)–AŽ;ñê¾ÖãÆ…8{ǚЬÄ8=<•Óc#urŽdáAóYï¯Öбä5£¡òìe:É·[R…nuyÔïç…®ì?¤É˜àO!{ÏÊ*ĈêkqÚ ¦S¶| ²f¶ñ<¶ýN™ÀÇfÞ!ý‰³¡ÍByHö3Ý9B3¦þ𦻱T®õõ„U‚ÿÅd„â““=¦ÑtS5Áþü”»Ïç.&±"m‹°y;H„È4½’F#ƒõVEÒžÆ^˜iNáôX&9¼Úš­“rF„§Þ fµ)ÖH_ýÀS_ì—UÊôÍÉQ™›-4{ãp¶« TƒSÃòɵ_è“»ÆÐ—ÝULO”¡¢o¾¾3Ÿh Íš·«{Tré2N–|ÛÁ}ý´=˜ýÙýZrÝê}âqâ‘èfj"èÓIZXW+ ÜÒ,˜7z# Ùä&a1S«‡Ín®‹3ÊMŠðð½â"Š0Ñh”¿7"{ãGÕ ‘1Q¬ôwÇÄñwþæST=sÀÈyÓíÝ+¾Ð!%IJ@žshq°Sƒ´ƒ2õ|*¡uPàJõéP¹—Ù‹êë™Ô-¬—îòê¢ÊÎ]׳õ> §b‹Œ¿?¡¢ü ¹kR$ÿr“³eJFÍA.ã‰-;5òørÍo ø¸»ýÁp£ÄÝF¦%½S^KÚë·¾•Y\9³èvDêªL™Ò?®M4¸þH6jÝp›¦ŽÊöùNæóÕ¬|ölòî$p—LÉ£]Åך“r=$ò€õŽ-Lk5C{KŒ©c¤NíiÉ¢û%uQRÚ’éÉÁo´ä©ätM«¢Ï_nfr×rŠªCªdk©ÎCÕíµµsÆ<Õ‡S_ȹϘmÅ4åNŸWŽ—/«”q¼Õ[ÉÎ3ŽÙ¢ Þ‡ZRô¿H~@QÒ+-{pÈ4 Ç ˃³½ ìNýNd|‚ãô%àÃcìøaÛÃ`ç}Џ-t·‹7Üõ/ Û' ^÷RešJÜ+?¶¯n€GcM³-¥_9âõèJ:4*­¤ÌˆrêÞ–k5ãT*Ò뤼Ûm{/ÁÔ NÔ´ßîÕ¨w¯òå Iy¬íKø¡)÷Á‘äu-Á9ÑwŸ¾SnæJxþ\pÑ7¾³¤Ë%µ—oÊÓ~l”ûy¡w[tkXŒ<"½~ˆè³/À;UÌFòñæ–«‘ IF~·–[޵ƒÕâãîµ¹@¦Ø´Ûò\ÖQé|ñ>Ýå_{¸7ÀÔ\cƒèL}‡ ~ÔNUx)üÉÞIûÕÜé¾@kWi”n§§ZVÛ™Z´r¸vJ¯úU:¾}H÷+ŠŠÉÒ„T#j½Ì0~6þJdùtX¨¯ 1‹ ­ðàEÑýÈ92ã׬SóìÞðÍPùS¼MYP6T f×þô4nÔø‡Ÿ$«=Á>q™;`Ð/…© '/ýÝYw(¾¹YU(åµÑ›…/JãÞŸ?¸5ðSGZÇÛÓO°Ìšª!‹Ö:ÇãFpùº r#/?­Bþ” ÂFê¾Ú 7pžlI­Ñ$Âyü”¥ì-‰C&`«pzê5.QÆ­‹ BQòžðws·Ö}õ»«Ónl7p‰Ž¢ƒ® ùH6Ó…*CÄ߈×Cx¼g?UâxxÞõ+n_ ‰Za¼Ä3lŒÍ_$¡Èµªõ–_~Òè¹ËŠë^;_§•|·{Ñ‚ÈM‹Í}÷AÑÛ×78_8E…3›÷Áܳˆ—UnXZGñgáñzBu¾Ý[ëÏzl…ä_ÙĤ2ä‰G˜ÏìOßz3–P¼{É[ð$æHh¼øeVQýTû3Í“£D‡þOô¥"ôÚ܃çÄr-W E.í=¹H¼f'¥Oþv~%¸—1ŸÎ%ØÄÃÀ]J–GNð‹=ó}K¾÷ë¹Æ†ôé¤>'Ñ«½ÂM¸~ªç®¨%Eƒèv‚Û2úWk#ßêàœ¤ñ¨ô¨ð’rp[€œk§ù>”m«7§C«¢82&gXLøzsE° »7rðLãð„R|¹ ,iH»`r†ZJ;Ñ(½ñ:‘óÃ/7>Î0E÷'Ñß$¬c’ˆ³È!ñÈ*§¶îÛQûîJ ¨L¦h¤©k‡_]/ºm7éÝ HVœ‘J‹µá–*aÛ†ÌIL<À¡#½P ŠÆ/œ÷Ìñù,ÏUŠ –ÿ:×[à endstream endobj 824 0 obj << /Length1 2805 /Length2 24896 /Length3 0 /Length 26469 /Filter /FlateDecode >> stream xÚŒ·P\Y´.Œ‡à¬ îîîîîÚ8;w–ànÁÝ%Á%Hp'@ðà.A^gfî¹ÿ_õ^u}¾µ—|Ëöi(H•ÕDÌL’ WFf^€˜‚* 3€™™‘™™‘‚BÝÚÕø‘BèìbíâýCAÌhâ –‰›¸‚õ@Y7; €…“—…‹—™ÀÊÌÌó?Šμqwks€#@ÖtA¤spôr¶¶´r‡ùŸGµ €…‡‡‹þ/s€ˆ=ÐÙÚÌP0qµÚƒ#š™ØÔ̬®^ÿqAÍoåêêÈËÄäááÁhbïÂèàl)HCð°vµ¨]€Îî@sÀ&öÀ¿3cD¤¨[Y»ü-Ws°põ0qÀ;k3 Èlá2:ÀÁj2ò%G èoeù¿èÿÔÀÂÈò¯»¬;²ýelbfæ`ïhò²Y,¬í€%IyFWOWz€ Èü·¢‰‹ØÞÄÝÄÚÎĬðs€¤ˆ Àœà?鹘9[;ºº0ºXÛýN‘é·p•%@æböö@« âo~âÖÎ@3pÙ½˜þî¬-ÈÁäó°°™[üNÂÜÍ‘Idíä”ÿG,B|‘Y]ÌÌÌ\ŽŽ p@?k ø ÑÇÅÄpuvúùüyð_„ÈÂ0·6s˜-­Aˆ/ÞÁb ÅßÜ|gkO€3xöXÌ¿?ÿ>€ÇËÜdçõ¢þW™”åDEÕEéþÎøß3QQO€;3€•ƒÀò{ȸÀ~ÿu£lbý?le@ž¿Ù‚Ëô?ŒÝÿê–ƒð__Šà©¨_†\Ÿ™ƒÙ ü‡åÿyÔÿ2ùÿ›ðß^þoCþ¿ IºÙÙýuLý×ùÿçØÄÞÚÎëðк¹‚@Á¼ ÿ­ªü{i€æÖnöÿûTÆÕ¼" K»Ëhí"ií 4W¶v5³ú{Zþ–küÞ2;kPÙÁÅú÷µ`·æWËÌ|u¸€Gò¯# xsþRdæ`þ{ÅX98&ÎÎ&^ˆà&ƒÀ‡¼‹æ@Ï¿†ÀÄrp›Àéù,œw”“À$ò[ô7â0‰¾ .“Ø â0‰¿ “Ä¿ˆ‹À$ù‚XLR/ˆÀ$ý‚ØL2/ˆÀ$û‚À\ä^˜‹ü sQxA`.Š/ÌEé_Ä æ¢ü‚À\T^˜‹ê sQ{A`.ê/ÌEã¹h¾ 0­æ¢ý‚À\tþE<`.º/lgò/bkš˜Gí_ Ø“‰½#x¹~_ÿVÌËÄõÅ XÉôÓ3u61³‚_^h±ý+ÿ{ÿ=G5ûq€™9؇ï$ìì¿%ööðO%Ó VpæÖ@g  ø QyÉ<ŠLÀÿÄea3O¯‰‹ÕKf¿mœÜÀ;ÿâÜ ‹V°ø²ÿ†Ö/˜ã7þÃú·ñË1ÛoèþŠå·àEã·ºƒ›óÑÁ –@p¼¶ìàhV^ŽV@Ð`Ù|˜ÁiÛüÁ•²ý‚‹ýgªàNØÿ‘*¸Ê/ž9À¦ ðð2àH 7{Óß7¯å ~—Èá…#اÃV,¿Kâør Žá~݃þ3+ì,ÿHÿ;)ìàdÀ³híðÒ{vp}íÜþhûï’:½4ô7rºüuý;q¬¿…®@sS»ÿÄec9øoh6žNþ+fù=´ëwÿ_¸p€\€öÖÿgŽß:@÷?šÆvâ~·þ›¸Ô.vÎ% 8õ—°à—“«•3ðñ×ÑÕÃá°·? ¸Óî@03?¦líù»÷ú‚ËåýBìÉèüw¨ÿ\üfnÎà–¹þõjïÕÿà¿~hž@3ÄÅ93¾›ºŽÛ†íqiŠm­TŸEçN·û×piª3ƒÖœ¯E>÷ ­lJP_ /‘<ú´6À…·%©´ÿò}0JPÜnG\˜ÀøVx RßO„@È .¼ãûèä«h Ý ùE–"×Éûµr>æ­GŸ”g}ÙòhØÜ¶ÊN5§ÒCÙC¬FŒ~à§Š<Ó¬Y¼·°® Dð´§ž¨3W×Ó9ßžIdèýcÙŠ|t×YßßÍz¯V¨³ºtá“ãëâA_aŒNRúˆî%ËâÎû”­ ,x¶ò‘ä Ð§¬0 1î±fT[«Fƒš{kÝG?³lå~„P `n%Õ–6c9¿U®n7ŠÆt­e³í}¶]í¸Öì¶°I!\♪Ì èX´tûüjpZþ:Àp–Òv;Üüu³ÛOë“P¿¡¥ ­„•^ÔÊ2oQ L™ëT—P ~Éý#÷ŒI(¿OЙèý–…Ì̺Ü0½£„ǹ¾gïý*O?¯Ï ÏÛy`?s*>›~I9=-Ä·b“0Î £ÎËèŽÌûG¥ÂWlœ .c:]¯Äa/õ"‘OüÁ±p6H^Ä.#Õ»=_5¥äesÇSÀx¬Y©ÑÏQ BºuÍ0¶×8$ÚÇsm¾÷㺼\Ô{ßAóî´Ò#Btøý†:WH^ägÕ€œ.¥4)‘h¨â›ÍÙ^S²#uQwRûæ8T-uûͱ®âú2q ª¢E…~¹}þpßEƒñ¢^üšaœÈ«æÖºN¥[jäL´Õ÷™;ËÐdFÃÍšgOoD ÔÔoóɼ×!zç§Æ6IG&7É}ì*õ?±÷µø8bÒ í(Iç7Ò/Ö¨c¢ž,¢Z¾kxˆ4,ÖfÌ ×‡F_‰’Áu²1c ŽJ K©2¿ËÑa=Ï%eÛüðξ'‰k¨rѯûŽuÅZ. ß¥I¾&.¡ñabçócΔ§Tž h°œ = ˺šbîC6éü$¢<+n­^v:úåf‘? iŒE¨v¼Ùz4<Ä&ÿ,ÖP]\ò™*¦2›Dio-:úúÓ„ÈkYÔjF˜Å¾:1ÙqY×2Ê^.ØxÎZD²@͉މ®ƒÙ9éY‚¤‹h¦Ò¯¯%ç-=ÞJr|ˆó8S‹ ÷­~tPáßOABš4~×ÄŸEÌÂ\ê ŸöÌß¾oÒÐ|·ù}Øêô{nÈZå~|ccMM†Ð0¾±ÐWò’Ñh.ŒÞÇÏÜžÊüì,³D®ßn¥!–PQø8ÓZ[üœåÜXöÙ~¥kˆAÀX§ã4H»VÖMNû]{áÏ=½3#¦Ð_s: ÐokÛaWbw'ÕË0º‘i˯9©¯~ÀØ1‹~üFT~® {§£Ã\1çîù†÷aNÿ¶åœã4œþ– _àúC–ú”ŽãŠÞÏašnz\©¯r>&bº¢RÙˆÄD^ËÔ¯£ä¨ÂzY•˜§5Sª8e”ÉÉí~íßW´0$á®ëuáÌdž£oßÀãËÎS²RX~0­ö¿‘ÅO£wsx§PÁÚ‡çýÝ-1-7|†“6½¶¥¿¥|ò™çËxÉšP_Ü3¼‘o7ú§–9®•”B¥›ï¿õ]þÁªxt&ítçš+ꋵdŽ/)]Ï}.Òbõ$Ùãv"•7ŸªÚ$p8x·Å¢É3$* \{yDʜح“çà}G~t7q3@ÑWùerÛcãû«CYï ÊèQHÆjÕm/OÔþX—·‘å5üB²9|éçMP×Òw‘$JIž<ˆCí܃²”á`º¦:[Êû¶„ç'žÀUâõèc‡Ìƒ•â}Üϖàu* ´¼»Ù¬=6ŒucqåÐ[…ßö}ÂÍZ³a•x…•ö+¦Ì‹©0´÷Æép}yIkILW½Yvʬy¼Äš"4j¢òL;üe8ǘebÙ"k7Yv|U>#]HÔdm Ú0 IØÄ·ðÑ©!Ü>ª ‰èÝ}ê¸Ô[FZ§P¦"Oþr¾ HF˜sÓ)ZèkO„ (^[ {Ϝ幵†7&®Ù$ðÂJ,yLY’g$šØ¼ˆÉÒ6ÍPæ'¤úuWõ í+žÛ¼¿ÅHúÃ"`ؕݕ¿í‘¬¾ZÐÓ%ôÛÕ¤‰µ¢6´lOŸwøýÓ‰*N NQg»dì tY§rã^§ü«ÉÏÛWÅxFzãÚš踃—*¹Õ(êÊÏWîÁ¹wˆÀ¯ô‰ŽOKo‚ý­’î[’ÜpÎâCbŒéì|ÞÀßUnæâ„-p9ÙÞH¯)›¸OzãkŒaÕäŒa è–³Ó–m ÆbTÇ)Ð š:„ñù¬–"Vª°áìijò-äuŒEL¿FÁ¨RbTÊ^·¦ïàæ.Ÿ#>ì µÌÐX~+¹~/'y«žgú+5á³fà{;j;˪î¬%Ó©ÊØUÒ–½²ÙäÙýÇ;vÜšÑw€ržNšE-ŸF‹‰.†¶Gù.æï3@¯½ºáá* v yçå³½ñ Þ£Ÿ–9#Eå—»+ŠŽVââ!—‘·~¢LY°$ØÙqzA†Ë"ÄI*5žóË!l(*½Áûê–äÿ}Ê.Ÿr·ñVg{¾jqBkib;˜²+Ÿ9Pð„Îd`½8å†`šý¦G ‘{°Ï[Dºh6‡ Ñ‹ñ\/׳õǪ+‹ˆ[eY²£È7F=öµVStf×ÒÂcEà<+BñѺU¤þ·i¤Äï¶Êùè¸õ =<ñ1t~H!®rHT­ì%acæ­´&K5ÞlœîP‹ Û5cN³¯p»1^¸Ño.¾½¿ä;¥÷÷n˜¤@th¯^Ëõ„bNu BŸÂÇÐb‘ôüv<³—²°|²OˆmôÔôºj\BŸÌzk@æý/å“£ûy7JQXBÚõB £³(O$96¨EG¬RŒå¾ÏµÌ\˜ì¦„bÂV1|&Z®2wš¯ ëçL’] ä=5,ÒBŒâET1$ßúF‘ùSEϯ#ÈÄJ´‡5ÚŽ(þâ¼›ý˜!˜eÐ.]Å<üRq(bÆ¡šûùVëÃ}Ø*Iã’EÊ}?&уýÉËâ;ßN²±uÜ(óÌóêÆºð„CRoV£:/iÝñ*~(:r™¾üÐL" kŒœiH¤µJÉÊîQjç´C>êu‚Yç±:p¨Äcú\°ýV©8óë˜V/­$†Á*S±±WYŒJ-BÄð}•=’´e+Öê8g±{†Š€ks£ãàÂ05 õzÅ69®¸jx:Õ´¹C=碌‡!«~Ì#' _Gí!rQôÍ‚N¸òý%â¸$¤†DþáÅSÌé´\p×,ªt U]£ ¤®Šð8ªÌâº+EÁÖsrf—^ Wåç‡\«qPr-þ¾Õ̲IO“zï•¶³ÿÌZÈôZV> ž:Y±n7wd"±²Q‘ÈGN²qmùÔÐ6Ãô{èç;œ#cùêøe“B<ÈÖ~Ÿ‡ ÷'òk+m;ùìI—,©äþ˜Îö"ÏÇ.±z.ÎAºkдií¥7_]®N2°L…}¼æàIÅÄH¢}pÍàµüu›Oˆw˜qAH릎¡–.Ê©æä “ú×Õã3”òüŽ_^a´ Úa"û¶¾ËhàÞ»gîKn¢³ôö*q&Ù0ªõ®úžvÉ*ä>Ó õó¢ãj>¼WÒ¤€”¶Ð1y9ÏÒc‘þ–k[AGØKÍàÝYhTZåƒèÜ~EIr–;)óÝ^s”ä‡ äÕµûãR‰5½ˆ ‹[eOöéÐ\lߟpZ |ËRÄsXh:˜oÙD/9/vn7¤õßN—ëÁÞ²$§™q(Þò”9 ²rɶ‹>^4º0AG5YR_–zb«Ð¿vÔ«úÁ=–$åÒßÈK¢JÎcÀ‰EqoïUEc݈å>¼oÓs­U-ß§*jH¤*jb÷åÀ³Þ(w^'‹·ŽCáSõ«µãe¬“(8Ì÷함þ%¿˜l C×ûóHý¾8>§Ô" *ÛšSÑn%‡•^û´‹:ê*SXÙà?4˸¨Cx&¼Â.wNF3º<­öÀ£|VzØtQ„aG%G§Á}Ç14 ]¶ÄJl|—3ÇkL\3qT"'þý”Ø×Ô½BRЂ(øaÏcBØ›ò|ÿiš®°¦¬»Æ¢s¦X>85|*dÃÖ+Þ-×W²µ6Â?±<Ëëƒ%¨™¥¾ò·a/«8A½/ü`«NÕzšÆ—ÍïDZØr tµ“cIÒîpŒ½IAtJ˜ïsš* ÚŠžðfS£ë",Pfé}G †RcCb+—MVXúòÑŽúlº‘ž¸ 8¬²Ídï¨È!Ç©õŒò¥é]^øn%\¹®Û:]Íî«á÷¥¿o·÷²K0I:’¬óñð'Äé ¤ üŒÎvÉt¾ÅžY‘DuË!ñ¯ ÑÅQ‚5X–ÙÅtºÕëQ=•0y«2†í wjÎO^&e©ÒÙ >bžW±„¯J'qu p¢C…9W×&©ß Þf&"eõ7‹KÛ„ç£mº`;cy®$#î0ö.MÌUWç}³M©Z²ëã£L®&ãß]J¯9ÆÓXLnIzg76 åoʘA«IS&ó?Ãt$¿ºƒ ¸1³$ƒõ75kËØú/L*EH½¼:6yϦ鰲ÍH òa%ªSOÆMö ‘¬”l¡³š36oï‘+¹Ý¼VÈÏ“W/>º!Zø™9õÒqt{½#}\5˜Íº'¸í:|­A_ ùÙ5—fÇšWú<÷³Rhß2u•P)pŸHRóó“Ó,Ž`…ÛÞzƒoÄÆYŸwpvh†´®>EœÆ‘ûB1Ê„÷¦!Þúˆh¬E€¢ú–&6¼*íƒu¡{,ÙÄ[†i¶"ëÍyiá•ø@‹oÁ¶-ªŒWîTƒöŒTcj›=âí£‹v^$x\I8ùÈ:Wsbõ•ýöû†MÕRnFRp·‹,Å¿P]™bfžÖcGœ"®³GÖ²T‚"Œ~‰ ú9ÂÒíX”YòX‘Ý—ôCŸ(Ü/NµJÉ]óq”Ãz ´¿Ú’qv:)a³ ZÓA·v«èYÝê=ïœ<9œÂÐqFÛ'¿ºæ‹]2'†S-‚^$‰¸¢#0”ÅÓcÑüh3)+n³úñGoæ“Û3¼Ú.\"~zŸº\©‰6ù–‡åpR“R°Þ(Ïh§Áà¯W2ÔÉÏ6hòŸÊdºÌý|­ˆ»È¼Å`j|ë‰÷h׉¥ë|¬Ðå?ÙíûVØŸÉòå¼ÑÎØE0iìv+ õÆ÷UÅ! öÜJÄ^Cú€á'Á1S¶×ä/c“Ó<Œâ!”(½êñ(4ã©Ï£Ù=oºaMˆ ó¼w¬ÏåMBp1ül¾Öì ÿ*ˆÚöë÷÷DÝ9Ñj‚KÛ…»¼OeѾöy]m'¤[ê}ýñ+F´`Ë.÷‰#ƒü$åPÁ/è9cA€qC Eqrþñê—a—2¡6÷‘öCý‡HÚDì¹G•¯%Ц¡tËŸ¿‡d;¼Eˆ]ü¤Ðá=yaùÓrÌdë}¼[ƒdîd/¦ö½×jKYÅÔ=mÔåõ3»6«AO<{‰túX~Æüyºa÷„“<С.3UãèâòMQbâ—à!Í@áEš4(>ª­¤R„ëí¾x˜*?«ë£BÿàåËvqÀ/[íËD‹‚ÒÌIèÏßÑa.kK~JFbü¹AÚ5Ñû–VvYëu×’q5<á̉Í2 åԢȞ,2]ùNÄ—ÖvxŒ% «dżmrN÷:µ7ê:è‘dËxUò)Ïì㟎w…2 ¾Q]ÞôÞùKâškJÉÏÑÓíâ¸`WH=®2µ”:5ô¾¾†´ŠéG­¸»Ó%®ð/uFf»b¤gäì), ÚÐðkYo)tD>Ïç?¿Û®iŠËÎú¦´µi£úM~sŽÂPÚC²À{„J-Hü ìÇõvºCîzšleë˜ÒGlZp=zzÒÙà0ŽÃ•|g”áÙ ­‘íM¥Ø8"%Œª1‡Æ)ƒ¤O’²»r-øÀ;¬iô jXp¶˜‡V†ÙgºQÿ­Ï6ü ›Æ’÷ÀÙ°Û–d¦ôèbaè•òZÉW‰ønÔ ¢Ì{šªSK̨l§Þus²¢Öêì+8§A¤¢Ì†VáDD9h)®¸Í·•¾*áP;e÷ÛÝsoßÐ ¿‚>ùÙ5̨"Þ‹²YûŽO="l'qs§jH¬}ø szõæÍ I²™ú+õ8Ä•„ç8f‡Kxw¨¾°#®ŸmX&2DvŸ¢°«º&«žðGeÝ{èåH|!ÎB¿}ÔüŸ‰˜ú¡Ò ·ò_£[›—ðUÐÒ²Ý5Åz-‘bûЍOØmpw=dlYöÛÞ¹¾ÌzË=õýŽÕ-CÓR­~xØeê:Zr@ŒlÅí vTLÒf¨!–"©se¯ŽwQ%®s Ÿˆ¹Œ1SD "ƒ ’Ó[Äîuô1*SŽý íX þüªV‘Ú¶rôX•H™UpNßÊ=nýÄff ë„´2W7n5ñ‘ΖÖ0Cä0†„B¼Aúhär ƒ3V ~•Öïv ­ 7ˆ7÷Gkü É–}Ì‹=&Cˆ ¬ï­’8Àó8'iø€¼Gü8Õ .”6p#Õ*êŽ*EŠªzŸ¢n” µ”8ËÍ6*ß“îΧ쉾©ÂÝ•CªZkæ£p] mg‚ÙQ£kÑêFÑkÁÌ  ÛŽK‹’™N3#’¼“ºC’à{_F<”öJ1eJ²»ërËÜáöΪ_|Á R¬YšMôcq4`‹~ôµ•Ž% BS„uŽïÓÓp¿Áu-8’Œ!š¬*bƒ¸:âGÙœh¬Ñq¦l{R ØQr 9¡´ÍIþéqãìèä5êôR/l2A´ú¦°MK!ƒ±JŒ2·Ö"X‘A÷˜æT(ÝzÚÑÎÎÆbÖ”šc̪]1 ϫɟYºíO—ä‹Z”èÔAÍÂ1 ˯e›¯¼> Ëåƒ8è¿dåR®xÏäFÛrPn®ïbKǶVEEO]bZ yÈ#Q>ªK‡’~ê‚mÛlûž4‡ÆQ1hÖ¸ª°óǹTèÉßm£5ÚGð°ñvv…ØC]ùã…wÅ…¦pº €R’6ŸŽW*)Œü[v£ï÷£É…8#´—ã}hñ±!9š3%T4ïѦJ®­Ä!ÔÆ¿ñøë|n@¼> ¹–o70Þâ=D«'Ç­ÏH>\7à¸Cû¤ûæ3fc‡áM|¬ÉŠ+y®ô]Eü‘©üÌöÉ#ÎKGå]^T£{ãL ”-)f!nšæ¦u–¨]Oª:2–ˆ”Ó[”Á«þ„ΑÝÁšü9dzò߸( ó!§‡=¦1e5 ˜M³o Å–ù4 §ÊäjvòªYO0©³jLOöwt¡'¯ ¡ R7 ÇúÔE ¶8Ù½ˆšë‰šÃ¸ºßªž"S"›4³Y ªîÜu z'­h Û.›ë]-ÙÓ*)ö¿‘úûdàiñÙu~Œ ¸ÇzK’>ª{Ûå:]Aà¤HÖ¬)åÀSS¿{Óy³êIвe媃X–Œ (c¤1ªÔù¹ø‹3u "•¸6ÏÊÙç™s#нaeér»ÂûVMKÆÿº8sHÛÓˆÁ?—7ÒãÇÔ÷ýd~’ï ¿K•½}ß&M~ëNä²GŽWàN5Çq C¾Ÿ‚gŸ}„ü‹Õh{F !FËU¯˜àý…÷ÂV]£Óˆ@ã…½G"dïF@ùòÙ_:¦·Iõ¢µFÿë÷Ô¡$Ô½þ!îzëJA¨sB¥ûJ­¾“ô(¦ÑE‚‡Ÿ†mÌ~ضwkSÅ¿´¾YyZäÀwzÄL)”£*ÍžÆ;œ~¨•„/ÿ8Ê&<Ø¡8ýAÓˆ±ŸTäåÔÚ³ref|§üs´@–Ù¯Àk=*ÿ×pÝÌä1͘ŒÒ×ÈÊ:n–¯°zP£Q¤ÙzÝX#»8Ø­‚ÚS÷>¯Ãg©ïª†cŠ µ¯2¹¦§Ü”Ÿ,uŒÏœweè7ái¾këWR úL澟×G‡Þ ŒîÊàZ§-K>‚€±—Š[?ѓڞ»v«#Xžq£n¿̶³5£¶Þpó„õaŽœÏ$×О„÷ý’ã„= |-oÊ?)$ðÔåB )8—¯¢,U}*b„SCÏdù‘Ý6&CæÒ[5áKGpc˜CÕé¦-i–Tl‚~®5ÒŒÒGl~b¨×®ˆü¥ý´ï]ŽbF8-ΑŒ™Ä¼m ºi±¶ûx³¡IÛlãCɯÍm´`ïï©¡œß©ÎIUðvjAT×ÊÄ¥{‰•é¥?  _7+Æ“b§YÕQ¾5Fdm÷vçÿ Yš´ Ssc.¹']I£ç¿Ö¯0”7®hÕJTêȱÝt>ºv Ì 1O‘ÉáKIXŠ?¯5Z¯’»õ£ãñ§¯b‹OŒr1/ÇÝ$ÐîÖïk•âx| Þ±Ú ­Žisçsñá×[á´M•LßU¬µ„¯·­!Á‘‚ïtÞÚu°†MÉ~~ÎSËHn!O¸h›Žjáø”VÙVlg€ ºËo2,±?=âÁQaå¥CÛ;*ê³+ŽüöûcQ¿©y×ÃÔç^G½]êÀo)&¶T:ŠO}]#[„UEšLXa­÷w(l8T¦aø”ú¥pk{…R!|·èaÕ§J§üD Õ-«“!OUºéMß^S"M%¸ù㥎[Áÿ4`#j; vý¾kÎÛÄØª™¤ËÓƒZF—ÚI†BÙLå>¼GwÓk77ugêœ!Ñ»>H¹3V>™Â‰ù̦b¦uJðŠ^é!uNíC¼RåÕR5Ü*jéCæhYýWŽSì¾Ø˜ƒçš×]ŠXH¯Š9Zˆ |‚ j“—[ªÍ·£‹’XJ0vö¿~Ùïáö!ÎYÊõÈHô“³^‚ëà»M±¸·{˜9ÇF˜ä½ÃüÑø#iâ›ó.î€]ˆP¼6IÔ *àöâ‘üá1´<'Åó¨±JßÞŠÛP“Ї%ül…ÃÖt!U ¿Jê±»O„Z â*lóZ@\,o®KÞ##äzÊîÐ97Ϡ‡¨Ê•xšs׿rµe9ëÍVÏ\^‡¿-f5' ã[۶턳ZíÄûTÅÛÚÅ”ûš bÉM¤Îï9”P{íŠ.5g¸ZÔ`‘ßtgï½ {|r÷Í8‚ÂùcÈç’Fv­„3ƒ´"= XOµ«ÄùdGÌ ÎÏ$ÈÖbv«14•5’‰±Óͧ’vÅ_·4S_ïK/!ñ°f}˜¯g"Ñ^¡5/÷Ú¾)ðÜøiD;ËݰÀæÇù6Ùý —/þǸ’¨¹ø#mÛáÂËÁQüÅåÊH|.4DŽðØ“ä«*™½uÊ£D¬Z[ÃÏ¡‚¶&rá‚ííðPļOZÁZ§ÈyâéîäPrö«úDÅù3ÈÓˆÍ|9ûÙ{MQ[ñŸ2[¤e·jYyíß(Ó61®5õÕ|WCah Hk©s‡ [?(÷S ¶zÞM)–F&(§V3Òy'ÿƒc¦sc›—w“Nç6|X|!ö^&M¤°»â£–U§dÕóŒh÷älB1î¡+´K˜–JÜ‘ ä ýN1ÊUõ¾‰Œ ¡?*Yp1T˜ÌÊnC£tî¡n‘.–ÌwGÒ)54tùôjr lŽm5ò%¶0GTG£ŒŒ+A;nm SI÷çÒÎÖñ¨Á‹qfÐjîŒYTsÈ7²ö¬M~%·„8wòÉt\i#A¦2ݯƒG¾a*Â%Çàƒ¯†z€_¹óÁ.Ñ'œ©t>6ÞXωAWnß"«.©r¦`u,âÏÉàð7X‹\¬gSXN3¡WèìRGu®ëæîñ=Å{˜7T¢^夶½ÓÖ£\õ߀É+UÈÍt= ÓÃUêaWbæÄÁò,ö{ÔŠ€™–`êHn;58>¿ó3Úrø“8 ÙQÝ7±œkSîÊÃ2l –åmå¦]³³e¡éá ˆ´Wl!|8@g#tu䃪’Õ\"ü5÷ñ±Õ.I Ivö×wHèµ{ãë \oö8*ÅQ–Jhƒ sê ¬ÝÕÒÏ(ÇnwðIúHÒáÜyõÔ¯ª®¥±•*Äg^Šc`‡ÙŸiû›JÍáìbž&8”j¡&2›Æ‘pA*¶Ò–<ãªÀqá/Éà d²Çã­‚"…c2dèk}Äô—›ª³{³£´wÊtóœ?t3Ïõ# B´bEý¢²:%}ú˜^Z©1˜ÜkMFœæ,)¿«[îžaòŽe2eí4»º,v7‰Ö7”]C^ïœä„ƒbãB¨Ò§HR^@Ç+™0 ;„Ò\ ’%ØyGÙMëì Ðûd¬!Šð «“‹h"4ÓÁókWì’žbƒ€gáç .!#íW”çjÓÅ58^ÉQ?·Mc¶8š±Wbk9j›'X;£ô:Èõ´“?茭хîMå•¡~¶ç¥h ©9= ×'%ªmb›;ZÀXEb°Sun7É h{ròXšøë¤i=Fóf‘‘a‰#£c,¦ýŒu*\¾¢.´/QÃDF·8N]‚´À……iV稇ӣ2q¯—.ád  ßÀ()œ,êìX@|#ƒtZ1ìhá†0/% ä—½,ZL)8œÒËAïLÌá™è:5É6C 3&NÞ-}¤û.n¤÷y`áºVzÀ¨O[‹+ AdÇÉþê£l;%'u¢0 :ðÆ‡’IÄ­N/]–*§½ÿ¬ËmÚOœÀ{cþ3í—0a«Ä%ÀKÍJtå9)<ö†j™Ö]ÖÂPŸìþÄS’ë3ØÃ`dìf:ÙþïSyBXØdöÚ¾r,¾Ê¾ËT?£°œgöqwèS×jDjy¡—ïl’à¾U]Å©­±ú°³!Æ:jø7žØí2êÆ9tI´ÑU°K5¥©Ñ~ÛÎà%¯îôš>ÏÍ,ÄCtìÁôIå{£¾n÷5`¯;P Q܈µ+·CX÷.øÆ‰±éÃÎÓʯúKyjŽ¿BØÇ¬ÄÑÐ6<{hø;Ú„ý ³1USqûwòÎKë´Ï=ç§»¯sƃˆ/³Š«oIK¡ÇŠEïÓH„¦Æ¸;‘ô9иDŽIªÊøãÙ)*Nkܘ®4³5־мñHN/wd¥×ß:¬ åzឈ<7›ó=äþsÂ]ªÁ ä sE*Ï&VŸ_šë#kâWÒ¿­W9SÝÏyùæ!}¸±!ŒÌO|Œ$:Šg$úÐØdëA<ÉÈôâ¬|M´º2ë—Z ]5 äd˜ìýcA:ýSbÝð: æÛOz87!­­[aP‰ëÖ¾ÛGü¢[ÙM®ü®IÊN„ üÜB$ß³¶GE™%¬ï§#ÅŠ]CdÐŒë`ßmÖO_>ÛÃŽhÝÍèß[ËðUs &Û;b&IVNz&ËUÌdÐÜP³M"F¶öØm\·¹öLzá¾Ðž'ª"^×27 ¨V~‚2ÙÞ·ÊVŽ•þ`ÖuàðÍOUÙVÇQü$®=âY3㌖¥){îcë—ÝOh¡ùRË›~0\W‚—Qk h¿¦¹ …S´º¬íÅ›ÈASm¹ˆtûË)êæÃ¹²½Î¬Ï,ÌŽph툆DS¼Â˜’’’²hÕ ©‰¾n°o¥%ÖØz)Å'~̼ÍåôTÉ삉t§z/4°çMô©aí+â½yð›¤LÚ AüÏû‘éÐMÝyrýË:d5úI9pí§ÌÔóృFOZÔ[uÖÓ¾#ˆ´¶µhnZrüøae÷epü9XŒhÕ çýæŠO%×5Mžx¬W} §3ƧÇaÕL#ß"žOäoÏF¥Îvƒ³RØúuüäß§ÒI":am½¥½tíí|C S”7Ž¥h›N$·ÚîåH™$hfUÁÚê$3"XÅÊ EG>ó^¦ÝÿÝA^ ×†ñ{JMkŽãÍã¤btBñ™<Á!õÁˆî’rÜ€%£[©Uº¨»d¤úˆgĸ° ›_\´HîCp¢3Έ°£DáY ¼]A°ÈÉ~ÛHÀ÷Â} ±(œÒÛܨª¼U‘s«8†·™¸U^V¼Ó:Ñ ïK>›iq}6¯ÙV¤Aä—Y„Ýd—á €?æ0/@ßbˆë¨rööì¼Ò°…ìQßev•kÈ![èG<ȧ·¯þ,á5á4Pùsû•Ìmü´ÿ0µý;j·)ÁXùx9ÏoZoŸà´uðÄyYG™‚å…I¯5²7Ÿ«û'?½7š"|·ëT\Hj(TŽ€ëGÇ·\ç‡|j–æ^ÃDêm¦tŸ”MiKõ³G^Êv˜zÐ|X.ö˜›ŒQ¢ð[16í^ÓÞp݈ÇPÏ%ÝL6.BÐCQÒ©î(yK¨?ôž¾:\@ű‚Ç šµ°Öù=ô;oòZ(¢ )9êU8Ÿ·!v#e! bk,ÊëÎ]ætÑšt[¥;Ù¢šêºß¶?djœˆÈN…Údúž½‹·oŽ>< ºëØîÌ^íj|£û¡švªê{¤à‡f„5æ÷ú–×§ÀXRúU¤XJ@oÏ;šv†¸‰š~«ïF“NÙhG‚°Wµ Єå¸SŸHÒ $ÈÖ™Žä’‹mM%D³®cð€ÛjÍ¡ïâ0KÄO°×¤e¿œ©Ç†¾±cg$M;\$âûß@Ddh÷ô~ÂdmQb\S¯kÞ´||ÓUgT`ä+{Ê38ƒ¦…*]Ôõ ‹ã³¨IÐa)vËçÏs>L©’$~ƒ£>©TÚÉ‚HîìþKv­(†¨•ß>mIó[\Z¿íºÈ”¼‘lnŽC+Ë>ìLÎ&ÊÏm+ô³Æ9‘êåÞÒ^¶„u(à^Ý"·ÊÜÑ—\^´ˆ«èÚ¼@݉Åêd2dó‚y&Q _2/÷ÏdýQÙ–ý»Èt…¡­¤;îL¶Í÷õ‡0­½¥!ܺ”*rQ°„’‰YjkQ_×\¦1ØbL^ âZ;8LâT<¦ÂødïŽí"§~^Å#T‰UÂ=%5 DçõœƒRáuyA²ý‹¨ú쬨R0bP6k¡ÐTò×5 JªÌJŽÐ/ mF»ZSe¼éù\¾K[ ]è­íÝ9楇i?[š¬ŒBÌZ¶aß2žÙWgR•ñ$Ï·¹ YjÁÊ%Þç»éß‘í½##ÏF£7iˆméÿZì`‚Þ¶žœh%yÈ*¤ÈUÎh3‡b;F9k[7/ÝÓçËtyÍÖ¾K6.ê—ƒLTtœèÙp¯–ßV, š©lù"`k(ñHÕÈÆ€„tâµgá1ÇÁi˜1—:>¥ÉhbÑ9ú>\Æ'ëgàÅ=º¥Ýòúæl²ãsê܆éK4²"sW¨ ˆ&Ác/â¾ùWM4áå89Øþ‘6½€+3Ž¢°Dx²YáV§KêÉ>aCsK‹ 9>Ò'‡pCj9QǹºP¾åʇwÒ—8§Q¬0xmÆ'3Äé¢ÙŸe!Lã]ʆ˜·kMì–X¬\ÄGÞxÍù­Q¼æ-?Ä»‚ ׯ6¢ÓsøìËY>çðXÁ¯s‡Z;ÒM“¹Æ˜Ï<"…¾ôêq­pzdª}¼q!²C¥$™È³ÄÜö]ö‰FîGªîˆ¯T,{¤Õqöª‚pxö“Z¯[eüݳ—åÝ´QàK×v?°ÕœÙRŠ)b{á6¨?ÙR8™I•|ÁÛm2JëÛ¤M Ü|$£ò‘pm0Ðǯm&âÆncK ðµJ^ ,I1G“=ü¤>°ÃÍöps%Ž»ô› ,1ŠÊN•õÚrn#fr”¶ª™¹Š}yý½ñN¿û°õ:2IVÕ$á0eЫëR^ ²Ûåo'?…¹tSÔMŽ>¯&êøîÏ Ó”2k¾œfoô¿s£¶ÕŠx?ýá‘ñrE“ä"÷Né÷°"e"û“^ìö-ÓÒð5Í¥£k,•m6Ikêô‚Ô®jE6ÛUš$;ЗÌT² <½Š ¦n¯ÈÕ©e»ûéÄ¥Ó¦fŒzùÖÝ:èD¼0|¦|¾g+ÍRi1UjÈÁý\t—«Ÿ)”e\èKɦ8ÃUu¶§cLb)»1á \Íáˆ`kvÞù²HÂ5¼ÞawåÖµ,Ð8~ÞrÁ´i–p}߯Ž{]‘]¤ñj5mˆ…G3‹?~Sxþ!rÆg±Ç¬Daÿ'¶ö—¡y^>ä–æ ˆx:ØÉNöððÌÓ²î+‡óŽ÷ZuæÍB„Ó¦z.bQöMѯì!X`(£¼nEÚ B-C¨GÓSVÒúj =ŸÁ:°ñŒäÒ[¯2k(Oõ“q,µeç­hN{n¤ /uAXq /¨ƒŒÛÐÙþ^Àýʆj2’Ôð*•|:9Üæ8EÌ“YÒEC‚ä1[ª‘¥N¯Ö¥çØ›k±ž¤?6­¥ItÓ¡>xy¦©„ú›ÕÄÒ–Š±Vˆ;–§Aä›{„2DSÚêPbèCÊrò9ÁÝ84QˆÑcËê^̦dtPI~ïÄÍÊ5[èqƘŠÑ0uZ£dÈq)¶«‰°¾¢àübÜE7xg¸¢´ØñÙ›'ì&z¼@GÃbt‹áb©¼†ØÄ‘æR%Ú”ò†ú`\BªNy‚¿K2™#BRú5’ǰÈäñƒƒ©ÁU€¨’9¨R©Ê kV#@qR÷åÚ9*ã’ôpóãËy3+f@±¬ÝwÿS¹Áó±ÍfªÒÚ?>VÉ»Í?öª{ÞÆÐ˜ žÉð'~›ªdíwÄG½aBÀð ÀÝ%xG¾úM÷2-ö­]ñ‡d¨Š4C‹ÇïŸ3 èçpÕz¥\lP¬7MáÑ IËð³S˜žœ× –•"é_FÝ;¹WªV› ÃÏä²Òõ²Í‡Œ–»;cÆP eÌUúH_{ÏÒÝ'¶=*öggѼ2–hÞÂP·px}c(<^l÷0˜ÇA#KE{…(–q—×·bUT™À7ó”%q-¤Aƒ}Zþ á¤]›Ÿù€v×vöžÔiáD鬒t~x¼¦è|øcsý´T8gCÅWþ¹~Ö×Èb¸w®#ÃD™Å‡¾gQ a¨Ëú§Uòio|Lb JØÒr²"€®ìÄdõ½õ™QÓº6ÚŸö³ÛoœŸÇdW¨†û‡JêÂÂøõ§¿ úx)W/ݽI/ºÄÆ$êðfßÏ–#Ÿ7Wk¿¬ãO¤iag/¹Ö1B.Eö 1d<œhY Æ~ï8œrí¸à 3´í`úë´ŸÑÈ=¦*«ïÂ[PÀü’—AÝ⮥ƒÓýܯ֧»\},ô˜¢:Ä’‡–v™ã:TŠ©ôìÈJÐÍ8V¦è`¿wÒ9ÓßuC¢R†g^¹.Á䘃nzrÖPÙŠz˜(†x­øÔÁûÊ Á2°%"øÃêkÏ"Fg"ÏâÉBë\ ’%yÓ•W"Hô4×ýŸ ©•MÞº§/°‹¬J×–±‡©—(ŽEiyqòû|ÇκCV´à´-†Hð±Ò«ó‰>¥¢Ë»Ž2­Î"Úg Ùòa_mÆ£4!C±m‰ ø¥¿t˽å×­ _Ùl´æœ¤ÉÙ6îÁ=O$¨FtC|#F v£ J)émøÑ˜¾;z±7à‰8[TccÂñÁ #îÝBÙPçá[˜}‚Ðü~™6êŸe¾[Îy¾obTªà!@$ÄöŸ~ŸÕ<ì÷ƶ}fÕf‚Z·ºÏX fšT© D/+Õâ/“Xo|òhL® 3Ødlšc¬CZÒMÐú<…$ˆx÷DŽàÎã»Aq~@I\ZÛÕWïz\nqœd9Cöüð-œ§‘©õqŠöx¸Ñœ‚È9ØÐæ.l³ Þ×ÀéØÂ÷N²f£{„¿yƒ˜ºµ4t#~c(ÿmæ‚¡+Ù¦h«q*øMwÙ¨æ›_ÒÞ´W ì˜èyë—]x99¼ùô+4ÂäÏCÕïG¸°’)ZD|¼$ÔŒ "FZ¥ÅÚvN Vœ©ÞbX«O Çes~()!IuQÊ× \¯f£ôãhÍ‹s!ä°\qü”ui-7ØÕmÄr&G š%y,²6w×ÙÛ½:u–dœíó¼¤1ê`TñôvNÊ©@Œ½ÖW =¯Ò…ù£>fª! Úú"LgÑYŒ§É‚ ´ð!bH# t¦±ÂhàT¼*¼u8ôS›ŠîKiûrD3ÖÜÆèÜrÌô¬lÇ•ä1hÍtš›6µKøl÷IŠßö )÷5R0Öd÷lgùIŠý$¥×?y‘¨ŠÐù0ugàà¸Mî3—¦Ç½*ǶâH:U׎l5P¤½²Rä¹è| uRʼnÖ^—_I]º±aÑYJ¸BÜLj*–“F´"M½–yC/ìÕø …Ú4S}wÐHî´@9òäQ ìUdê«#W˜c„Í9gjÍO4Ž&‚>È./£TaÊ;áûˆæäûB_Ç–_ZbªQ/ö£ßf¡´¡õÍÁíF–ôÒúæBH‰1€+t E0Q=¹nÑxFÖMþì¸ol¨w“Â’HAQ§ñÒâ0ã:…‰U6á˶Ëd* LWêTF2ª_²ꟗNø%®G.`Ïh8=­ß®I¥ŽÑCõÍ„¶r6=±%ùjÐ/BXÏ3ß"MÀ©áön”M†#3¼8c¾Òøž~¼ öÚœ±Å÷;{ú‰I_Ö®b6ø"êiëôDAYA8ÅhêSièï¾çì¶ží-Y]~ÏY€§àéÉä.CÄy-™ÅZW!ûJ¿Í˜hZgÿ'!*辟þ¡xø"9¼Ù¯³Ž! XòÖ}ÝÏ=Ç­ómùìàéàpS«$Y•ÛC;Xn>~`0ø‚x q‚=ûÉ¥á•l}‰35u<÷méÏp/IšóYò®[ Ï‘£s“rm¼°ë+5gó(Ä:7TôÑ7¡l•PRL„»rîæ. ÷Xõf삟]®ÄoMËF~UŸm·¾ÑB†ý¤”fÕt£¯Fº„vÛ‚:ðØpé¥2Ñó'-{¦µjät,r% ûœðÒ– ëŒ5ûk¡^ªt›å}«µÃå’ØL95Ù• ﹺKϳdcÔø%-¡¸L½©÷ûÛš8_$IÕ—ýB´‘å¾ôáx¤¸Ãl¨Åº@@ .×1(;ˆ~Z¥/‹ ›”,i‡¨Ý›f7¬Ÿ§à@4ic-JÌãp\6P+ò|+ÒÄ©.¤;&Jìã‹èy“,. 2°ÅÇG Eé[hH4>²ÉM¬g :9¯ß¾QÞñyBÐ\ýõŽ Yt©•µÚšüž7L^~ÄØ2–³ƒÏ•Äðª÷678eGöïi_óšôêÉS¥]9Ó‰;…ï“æßDÒ´ÖÂí)ØC²r)\Kì™Ý}×­Ûoè‚Ô~ÛV„Bjúëèy®[¤ðûuiÑ‘·Ó©—à) U‹1ýtË—±&zm*4˜6TªÅT³YJ§šøˆÀA¶6Ï®ï-nœâG¨¨DÊ‹)_È ìbÌçƒ"œ$UÑñ'ߟY”©c/*”ž±ï¹¸FýþŒÁHS5›è"ÇZð QúeÒ‡‚¦zpäÓ oÅÞÉ:‰tKEŽU6¼¶§#gdÿI3Aɺ3ŸáOi%R‰˜ ?;O¾vëø­£âá«F÷%†0kvÚ†öÈGgÚSé¯ Ãº#‹£’×êïÓÅ÷\ÚâÚ•±¢{g'èXíºLqØaW‚ËNd!y•l«LFæoÃ0¬@˜Ø5èñ)Æþø=²,åq]|ãA®ÑË„µ–2¸¬¯²ð PÕ(x>mâf N5¿ùúõ»èм@F»½NdÐH÷Wwîwö6Ú Ð—Û*‡×D(Õ[ù¬  ±%£‡n¦³p_l›ÜÜú¿T3d“ìŠAs-^Ùèu¹€ÜËR1ƒ£ôØkΈ¨Â9êtLÌÓgÉÆ²n2·fn±¢ê jÿ–GÑ5Ä{=ç‹¢äLÁGøñ»Ó*ú˜‘®Ù8F"Å dyÃG(6<\êÑ[CÇ}4m×+2òhâ(Ã’sû;DÉK=døïæÝúlÐöVäØe0#ž?MO¤Íôª/ÊèÙUU^óF×R:a]þLIßÎØ]md_¯\Ô+EżªA5sóxJdG£$Ÿ0 _·Eñß¶ôÂì¡-¡¼lš%^•ÚNGÌÆ-gv÷Ê®Ô^·áûU¥·0  žG:—ÀHÅêÖ/>©Â¨ûøÕ?¨!®ºõÐÇèŽ[òÒŠ:P© U™ÞZöýÃ$¡k®’ókŸ:5žeü6µçÏäE-ÝÀíØÓåsWv¾…*+„´p:ê3p5tøŠ  ½GXð*Ú–°“GWb0æP:žðµnôqH«sçÑ gÅeî°ø†Mn_­Ýóà"J õ#çX©ªò ‚6g Uþàåoùœ“P~/4óÌȸŽmŒNá5ÖÊ]âŠÝ¿$§VæL7ä“p#EŒ1¤3®jã™[ïhÖ™cA°L½Ú˜.ÏmR¿6à#Ënž‰€ÑÜxû׫ô‘Ã:fÐþÆþyeB±è'‹˜bž´xÙåUln2?‡‘)¨\-z0†uãʵŠçÌDÇÛ! ƒþdù?kÐÞ!Ó,jë5!Í‚®L€ˆQÒïìãCaÿ|G4¶ ÛÛñŽÔÂǘNâ¹É-tzFÕøèˆB½r‰DÍŒŒ ¾°†ƒæF®õ³]ãhÃïÁý ·¬=†äô:ʬµFè‚P^9ú͑ѺÁ– ZîÒ”Bcþd&ªƒ„aþ¼vÐËéÈA Ù”„3tGA9\´ Æÿ<9•°âÌÑÓI¦°=r÷ µe(ô•)ùÛ˜ã|ì€w¦­èrYa|ä×Tж†ãÛž.Ž)ɺƒÓн‹A%U¢)Í:ô÷–²DS4,QKmŠkæ;1 {µ›eÆã ãܜ㠩jrrQï©û-~cæŸqŽ–¶Áß5OÓ\ylgá.Ưeä!†’»‚^½Ï@ÑM±®$k¿§¹Œ7àC»dÓkò(ÒèűI«¹8­½Ò“úºn‰;¡žwq.÷ÖCßïª úÁ>ޏÎO'¿•VaÞç¾RsÕÂnò*vlñ€R‹ B“ã- úÁt»ªXëM/ µ…=2•7@nZAB~&`ˆGŒ!öóÏ6s',»d!8Wô½XܬÜáÜ+×^ä3€Üž³½XGS2iV¨mÏâ׌ë:°|Ì¡}¶xWfFÃЕµ!HraË€q¡ò3oÌæbúßïí{£XÙÊ•6Ô0y›Ë'Ö‚– _0[ËÿLÚsW[ÄhÈÌù@¬ªÄ«cô‚Ï,'OD bûsùÅâdÊ:ª:ºOòJcà `ÍC yŒÆ[MÅp»† ½{}ñ^Ñ\ë^“ qÓ…;Ÿä«HR!û?žLÓú´Óu’Q§,rëÏ$Ø1K½þëjYÛ¬ßw‚µ#·ˆ¦V l% Ñê·Ý[IDê$ÃŒ§èÌLÁ‹lo;Qž°²á7!µõX†ÅàÌ‹ëR3I•Lqñ/AzTìÈ!¢–¾šLq~ÙÞ¼R_Mrµé(Ú̱͞xÝaN£­.®“/­É6¡rËrÕÀS\G€ëâœÀžOãœMà ™q±áQÊÂãÖƒJDZR¼½«°ÜóXWu²ÙKûYÙ×õ¯š ¶»R¥+|¶ÈŽƒôž—£Î‰¦ñÃQðöŸ mUÞ9ï_BáÕ’ âÔ8 ¯TëIåóðØÛ²ÞZõ³ Ü_éÛæ[Ãag¿9°]'ºÄäŠK…Ý’‹Ç zÊ€fažÀkÌc¹YFï… $þ!úê¥ ¥ÇÃѧã5Õ .˜ÑÙõ_kÙ§%ˆYЭzIòk•“ÏAŽÄ:¤\ovÒM–âÃ݆LÚè|Ò/³«â L=zd*cøÂ†[äñcNL±^ºqK¸P†ƒ=¬ñu—«Ðã„Ñí u€]D ÎØó$ .…Fd§ Í@,C–¨­½¨_dÌ'Û=ï -HR}ÀH¬ëÏTìvH þ˜¢¸S¸f…ÖŒU|—¾Ï8(óŽ]¬C«z½54°ådÓ7þwK û¤¢WÐlu4I‰ž/ïQm³u›3ÝÜ=U»}'âZÏ7Þ¦Š;^±€¯iÒKöta]ß»mœÑÐ$ã‰Nš6ÄP@9˜•÷¯Zv$bh”…ÁkÏ˸ßjRjË\RÅŒ¿iM_x‰ãІñÖéí#r&Ñ´9·‰*ÿÑJ¤Ûl²Î=¼-lPŽž”ƹ?Œ¬ê,›²’œ¡? ˜\G`¼5\8rͬH²o}/ÚG2`ñ†ŸýO˜00fReIDý·ÎëP ó(+žÉ¼%wVàÚ…ÐU·NYKäÇÁ+QèÒqÄßÖ/Si÷|$uF'dE_ˆ³éGÖEV¢±òhb ó±õÔhTà©z#…#@¨,}JAE–·OH]ª`˜ŸÏ†Bضì¿S…ÿÙä;B˜œêäóþ‚ 'ëú+ÓE6»G$€Ÿ¢dk퀀Ԋª™piÝÌÇ‘€B¡f³ƒ_bòö‘0ë»Q;ïï\Ìõ"Wð­‘ßÑ®º@lÐØµ½ë¢q NªÆD°¾‰—s¸çÃñó©ÉÙÖIY'ÖY+Ìwodd4R{ÖФƒé® Õtá•eù[—ÅpçÃ9ÜúFÁ;€Ê?À ÅWÉÿÔY?gJÜMs.qÑFx"3•±‡÷0ëLà»]è|tŽh§?7èm| šN²¹ã!µ?£+0E™¨5 ÕE±nY ØEï]KÒÑmèùɘP¥u‡ƒb6üCȰ·:½õ¬Þ¯)¦!Fªè%i·&vRŸØXCÛÞ¸€`Ë““Ia ›\èW}Y—մͳàj^Ò󅣜°C¾iÙi¼U^{ÞÅjpYxS%ôI£nñðâ?aÜPïœ\P¶ž Jö¬Ø öʈçN ‹8§€mIäó#±¼¬ö¦†ÄË"wCÑ-hBg h’L¥ÎѱkZÉH3!<ïqôŒ®Î7†+©:í> `ºc®Öý+Á‡bM•¨´wOüE‘iÊ^€m1¨›é`9äážl9˜+.éUƒå²‡~ê×Â}¦Ý¡²ø=¤›g´Õ7 Í\ìÇP6`ÓOÇRËBg¼/“Îf@ÆÑ1®çw"‘îãyhΛïÀʆGž²)æ K¶µÒ=b‚ˆ3©XÅ€d‘{Pêv¼Cr{>óÐÙ¹uѲ( é’œž€It.å|/s3CÓó¡ÎÊÉÄíY½„Æm=ßÿ5«ÙŠ:Ï·±FצÙGf%އ7I×ÝudÒÑ×ë 7G†ø\K)Ž ;d3~¡Þ­N-ÚÆ—Üš³Ü´ ´1HìtÛ‰àßÜûFžj¼ÜMšIæ°)…..ýIÕ’s”\'þ©Úd!æõµNmHU™bÓ© ÷ïž¼p»Z'8J~Ž?©—‚­ ˜ƒ²«oCô²O¬å¡kxÑåšÔÃläpÞâøÄ2„Vù‹ ¡®´ õ7èÆ“Òh³·tŸúnp€%Œ£)—ZÅAÌ€Êô+3þëwKŒ&•¾ÈÁù”ýÅ,Îb£|*¥›ËBÖ¤ù›óusè%Cm{ˆô·¥†ú¢´!ó‚dÔÅmc‹“댠òÖuìýîf[ÄižD’–ù¦‹?Ù²5ðQðëåÁ¥´=ùŽÃÈÜ 3âñáÅEYHÝ=}¦yKÜ?È)¬1X©¢¶çÏ´°kò|N’ë)À8äôeyZ˜÷&gÄ û@ÆêÁò ¹#sÇ?ÉqJëô6+;hÖ­C%5)ú` ¨)C¸u¹°)Á„uÂ-ØLÃ[ò+B=Š=µÜ{ë&»LîLŽÂ Nhpê­f@Áô1ÖÏ‚Íï$8aa˜Õ«68:¦š<øf2E¸bò{ÄÁùïS½G;û^Þ½L°2d¾k‰$.žÛ„5¢Yñ}ô?® T–Äš/8á8÷$œ–›ÎJŽâpˆ¿ßÀ¸³rK¾ÑNÓF`µ¾–š<|í­}tcø!©«„Aë0”¬˜ŽìW„c¹ HŠÎà©- Âð{E}ÿ„¶~£†;ŸƸŠ*s1¯Œ D{WíY‹ç=Öl—:XwÎÊ©;Æ1w¾È4:ëż­Úm7”f•óãø¾Ám>©¯é/U™ÒNXÉP±t7ÌYÁR¬¥¤Š•¤`à–õO³ÛÛ0#ÕLôb®56–’¨ìÓ¡þÿ–{¾¶çÚ±ÛAwmáq]ÃÀ$Ó¤˜|6ìӦľ”ã’yhSöa#רL L´Ð´¸°Âgðí[¡8/iAµ%æp(sTÃ$"*9Öùƒ³¼¸§ÅC.Œ‘º”¦îŒí#›€.9`¿þŒÊËÙJä>ð—×Bl©ßæ?¤·ÁºÎ;ú‡¶ ž”ü]«7ßíe7²â"-o|ØŸ½T~z(ØP­I䇳RE eñ_ä5¨.‚ý"³ ‘~&Ȥ'ÒÅýÇ4PÍ@þ5 ö‚­,@ß’²"£VoŸètæß:ÀNÞ÷ ç¼SP&ûr ŽLkF#ÆŒ-Áª.ÄcZsô½“'wTö¾ Ü`wpcÏT–’°¢¡¬ç¶I~ùÎN[n©à_ˆ[2¬mEØËØbÎ1ùòtN±LG±0š -y˜/Cèç^×a‹`Q"Ùj”›üðý E€€ý§R»( ¶ˆÅÞ\;óÀ¥PŸ¯ƒIaä!þJ5c„½~Ë#¼ »ùëö9àuø¹®GÞ‹{Ì_Û÷ëYxªð<Óî™|[†©öõ¶D \¢u¦æêðªñÏs/Mÿ¯žò§‹þ/¬Ñ©ˆL$]­ƒboK%é.V”¾ŸÜHúëíûWôÄ{ ­má(‰˜<žú±áx(úUp¡ÌOÑW4´êsÈÞr%xèhkî©ÿ8Å_Í4J*†?ÿBÕ”ck„Unÿ•>"¼h8N¹I‰ÁF4ÿë‚ò×èÅÃÀÖÞç¼ëR"lÃQ;ÝØä^í!ÜjZÎó‰Á¦í]n‚ ]g%PÉ¥øAãw&Ç‚÷aë>§§²ÃîÃŽkJià#»ú1(ÄðŽY|ú¢­ýH=Lñð[`t,X¥ƒ½ƒÆ¶ çqp‹ Ï{/±Î‡KÔò€z¸9XÏ»fÖÑË”ðoª^˜HÍ»o°EÅ&.€ÿ§b’D `DR³npÎy"ï~Œ€ÞØ]‘ç[˜‚½ÁJegkÖ•mí 6èᑪvÖ\1÷[úÒ8ø>ŽþZ§ë9&©0±¯µ¨u’µ€µQll‹rhïåîk ~CÆ+c›ÿ•‚©âøØ[ÙI„6‚œ‹Û˜èaäôÆ>øgèI"­åMy{ X§¨Å?[j© ƒÐ®7³Ž\ÐŽ—ò—Ñä‚+=D™T”ßê÷q€ïÚkúÌœC–%C K’Þ31oû¹Äÿ6Ú9yˆTÇj]¡F žú S1ÙzhÜôçûµðþ|‡6çpá¯$¹Z{¹^B‚㕨rF5T>SÅŠM$t„.ã9IJùb9u‘#*Ž7yÑ& F=}}Û»d»óoO†";¢b—IÁŠxíÛ+½©õßrç-ü”®6ïýÉ–ƒ³¢¿8ß2à“_‡÷sŒãTËDƒ§•»Ç7FêPEƒž\ů¦û*´ÍÃ8ÞY4ê›âÁØðºf1Š:QÒ' eùdŸw×G@½zâØÔ[«dÇúoØ5÷»‚ñ-Ü9–G«ä©À…>Ã]CÃ¥ÛMLÄíF ó¸|©›-¡âéóY#ç¨v-“¤‹Z%áä¾vIÀsËÁ|àUÇÿL+ó\PqQ–¿æ)[¯X{ÿ %2‚˜³ý!ÑþG׳‹ƒý{Ú~ÞvþüíœÚØ[2?e©Yzˆ¾V8‘|š˜¶{¶É#µ Ìe”pB^ö_v¡ƒqbªñɤ•ZÝ•ÒÓv?·û@EßYsJnÁ*‹öXº¿ç¢pb_ŽRˆŸÁB‰zíÌžoîÃ÷rMŠçŠæí·ÕYLN/žškÇõR㸽*$Ïû^‚E˜ö í¿›U8é?¿[4;õ¤‚Däaaû9ŽΪ«#X5­›Pg!YëÑ%4Ò¥;¥oØßKñ‘¤ÊØEPõuƒ}Ùåi6í“ßÝ0Wùí‡÷÷6:y$)·ÁNÆ6B(÷Ä]OJƒ wøîA,ôìkž²I TCìŸô_- õž6­~)НP!N ¼39œ4r­_Áà‡$½ÂßBãaŠînsÚ²+_üˆ˜€]B¹[ä4/g+×[•yž ×D£=ürwÛ;õAŠàÿ?WºèEœ&éw6š þae«D'^7V•¸¬CóôOãäqÒZ>Y©^‹”á¯Î»Zé@Bs ^‡R;Õv5r<æIœ‘ëVäô•Z»¤ê!ÅúÚû4f"!áëŠÄóq½© º)*€ìòVo|ÿM¼NêŸÖ|2†÷.§…_ÈĈnWgÁ!ÙZ™##(¯)†TP Šÿ¼çR²ÅÕ4î90'™ +=ïÁ[”ÎÆ€‹9uSÍ|¨§2ŒtáFÕJšã܉Ó!¸ŒP:JÉàà L;Ûa®­»Ù׊ԧ­X€áKå*üŽ^”`|Á-½õÑNûÊŸ” $B%¥Ðg¬‘A©áñ°â“'ÉgÓÚ$=™0°úñOæE¯ŒHºø‡EØì ý/-PeÊÏ!M}±²ž_Dç‰bêw<¯0B~Jçh"Сµ꺻„V—B8è-7“½–Êl%›–‡¡Ù“K…¾+bÜeÕБfmª:5•LÎCØCÍíÙeì÷–…GTi„ áü3ûï¾qÄïfø°Œì ¦Á(öG zN©ÏøˆyJ,AÇëmvâgEå¨iôfz¶B¢ßIZÕ¡í6FÔz0™žQ·RGÚK6JÖÀúJØmÆ–Ž„Õoí<½'LÄÇSûbʘR›_„¼Võ¥Ž ¨#ë;ü^6Rn£»TÀuzg(ÙMBpo‹^ü¿ÅÒW¾aM¨ÅÞ6WÑ^-,íÑqf×{½p7÷«hЯB]vÒi6¹]jj*Wà§©&a^Ï`Ç=JŽùžü¨L¯$7Jñ²¼Š¡½ì2Æ@ç–ÂúKÒ™TQïG‡ð‚·ìõ›éÅŠ±˜‚¥XÄ Çj_e7:øeé:7k)2³R‡0J°ïµàƒþ›æZq‚’Ÿ®ìÄþãG¹aýnXf(­WvàžizÔ]¶{p¹xþñ.7SúnŸPý;hp3ðç¯=§Û¹Às‹'nðô˜Îþ@¿#Úynf1Ä-ÍÖ" ¬'®M§uÚ|-›—íPÏñ;u›µÞz÷âø‹ÑSÖ>ÑnÔˆu%Õm/î™Â²³7ñü¦ÐLà¸,ž¥qÐpduØc@јHEx{}ÐúùH ̧F¡ìªóM¨vtV ÉuÉye¦ž)Ò³yk- <:g©‚ÒHmÿ‰Fg*ñ‚­ÐŠ“Â€š_þû)ôü ˜ñÝÉÔxI‘ÂOÓ»CÓ`¥‚šžDréʹÚO#O•:Îu[LbˆÇÓ’(Ïæ;8%^Z»7¡ ûaœ¢¥m9.¿:°+ÁÅ'b~@ *ÝÞôGKÚøÃ½ûwlKŽYÜÖìàïný´IÆØ0OÖ]r*wøñh ySìè¹Ufºõ?™+øhÔ¨_ ,boÿ€Á”Àϲä­Õ`î:òW&c`æ.î´#Œ3–é´S! ,ØO"ˆúEKÕîÒöÑ52tžÿ»*ÚM¸”›?@3à5ñ &Èz­Ð7Mê 寬o£”²¾ 6aÅY2Ñ"øçZJ¦±|w-ŽäØä ð$ª+B…IãÖ­$þ„С¸³«KÕíLײ J®Gà™d(â±?ÛààQ7ËÔ¬~üµLÚ Œø@ ^2¿Ø™ylAc[T£ºÂ=?ùïÙq+»B—T¦{ƒ…ÃÈ¢çëi‡0e7í=H»ãÄV:e[u†˜4s!‹nQø.I¨Ü#Ÿ9ÊÓSé’Ââ€l™¦Ôü%]£ 䨦çƒylI÷+Å9ÒòÁ‰ÿzÆq1 áž—:Ö×¹&{Æäû¶ÚóqDÁU­^Áz®í±•)ÿs{öê-»”e,ÁNo3“5`×~Šã[.€"̨Oø…E°ØÒ©2ºÄ—èà¶ä2îþ¼˜v¨¸c„Æ/!]—lý®òÀ’þF+¼Ã Õ ,רǃêT:·SЧíD—<µì‚Y®ËÌ5~K4ö3«5ÆÜ¿¡_ëÇ™ªÿþü øŠLî“zu ê•s^ØÉ‡p0¯ÏN„Ø«¯_¬Œ<§U•Óæ²[C²cZøâd§[õqäxòÍ1Y¨Ê·8Ò‡ôöÊmîÂQ!sÅ›å˜Iáâ«tª¶Ò©÷\ÑÔï{êÃûª‡H2~d$Är;Hh¡ Sohdc¼·ÞY?ºÕO­½È«Q³Ïp»ßáò‰#´zUÀlW(¦sL›ÜÆäŒiøvUÎýËE*`/Y¼êX`š˜´‡·[IÀ2zñESpe^Ø5®1õ*5l1²“¬ªçU<ò^`þD°ç<^»~LrÛ\Ý+DR yW5ýË~/¿bµ­ àà­Á€])õùž:Ø‹C>¥«D5m×ÔXÒÈÑ”ÕïÚÒP+F!´}‘Žˆ³³#àÝ~ýbÖxïÿEBb*îŠx§%Rý³Æ4c×íÂäã3¦qbÂFCl¶±|;ñ * ‘íaxc#´Æ@™1©ÿV ²î~¢›&¼%!qø“^¤F+­Ž„g'Aw¢Y…êòêÉÊ™6 b‚kòXa`Fõ¯„#É(<ö p³\?Ã̦¶üiDŸ³F \¤@1 bu%µöæ³4<~¶ #Ž?Í&—}™uð~·}‘ŠI¶èJÀô ³RúbK¨^…Q‚È´[J“wûNÓásl,7 ËÔý?Åâ3Ä Jb`k ÈùlG˜D@î !UÈæîDö D)¾o«Y£ÑMð8ñNi7IS-ôi²¤Z)6TYô´”H³ÌZ•¾4#Á<¢“é/±¾…:µS@„¼¥‡¶9þèðZ­èTI«ö™_sw¾ªI'[ù¬ÖFhGz> òSt8 `!cŠÈ0³YšRçÂR¼þÿ/|ÌÖð~±ãÉšU‹'øª#9)m²ŠmèÇp–üí¦†fY<(>Éo-AK¸ÏLJ´ 5¤R`Úe¬Rq¸¼î™k kI Ü? ‡¦¼Þöú¦{R \ŒÌµ&•Âì`H2!¿ÇÁ¨<™`Ë©=0ËY +hÐ!žß£ÞÞ~¢50Ì]*6!þ`bA®"o þ‚èáêmÅ\GëwE$¨ &µâûæ™cfå±HûyÌ^™ï¨xKã^8ÈS&NH& þ%'÷2è¶±Òÿw¸CpêÃ}^+`Ð,Ho9¹q{U‚» Ñ. V) ŸŽ$äeY×û2±AèË­m¥d$ »IæÎýeh€<Ü—¿Ó ®§&誤·£åþOÙ;Û¶ÕWÃý®æ¨õC¦ÁªI†ÄèÉâ<Ö\Õ¢6©ª-Så-™ö—¶¬ÿ$dä3]û1"ÜN_Ñ5sF³C96×õv*ÞPl-1Ûeó.ly3S´…¶;X¬!ŽH¼ÞǶé’¤ù† ’ö¾M,|¨&SéL ÓýáÄeÍ7d¸ÿ÷D¥kQ[¶â>uàyßiNêÕ!Ÿ$1µ1¤¾öé¨WÎ*àòîfm,7çT±·Ú+ °Nð0m£ïÓèm|vV 7l”Ò<1¹{Zõ¬%$ÎV¨LÂh¹›ã³mØ«—¼gqëûйC’v¢™&mÿ¼ð‡`BL”˜Ow)?g”¯—#»Î}£@ñÕDÐ7±©)L䳺ûI8ÁA‡–µŒ'”Ø£»ðzŒ™£“Þ:Ü¥Èþ“‚W›nô=ƒF£I((l“…ÒŠ)¿K%|ãåљ¤mp MRÞú˜›`X2d¯Û±®‚sZŸ‡ÛÔW{pEŒsvkû‹bxc¾ý.ø–!KbKž*ôpŠlµS¼Ð V¼0‘¶»WiÑ2$=” •~ ¸€,N´»• ,êcM]A×4UÎFŠ’i¦„k>Ûe'þ—,ø9íšê‘ÕÂ>¢ ŸótÚ}âZ4^¡&Þ}¼ I{…Ünò(+SY—Øo›^{®ï,˜Íù+ñØY.í_¯C¦gT!Q^àµûsK¶E䕊R³|á\ùøS3¨BJìÍsA­á B+S=ì 9:­b%bÅ…»Ï8|\(|7¾ð3ˆ}4èh^9Öšæï†Räå,.ÍÎp)úõ1sf¢s¬WßIßc¹ÄLeÒ:¦2gÍñ™!­y©P­¢ž- íÆåÁÅäêËPF„LÂÄ¢=¡Mh=qjo’" ÈùS¾Zx7Šð†*<ÀHÜgÓ¯á+é©§ý-¯î+} ?¨ŽDáOVAìÒÀíñËt*ÐÉÝñíȇÿ¡Z©áÁo¯3‡½W'ò<ßgŒP­&§N¯&³âT¥ö‡ÕÁç‡ê“8|¦ßç~ÙšÓï=cÃïá0V}’ŽAžù˜•ü¢pzÒp’/kTy†vþBþ) ˆÖØ|»´fÁ“È„2æ 0¯A<0Î2Xd}­1Î3êt,öt\¨Jðm(’BYÎbšLÙò†ôÈ&ÒW\s&­þ¡ 󸎾c 6¹rÏ O{`¨ž´|’Y ^q‘^–œWÈß­îÕîGGÂ$÷3Á Äe¹¢µMîÌ÷ÂM'=±R\›[€d…uïïÎa‡¿¹º¿Ï †^^Y!j޵µúÐÔý&‘)¹ˆ z¦Êz>^ #¿´"Í‘¹†mÒý Bœ6øÛÅÙ±¥z.g!W«Z5Í/¢;Ãçóú¯ò·ÛI(÷}ëÌ\ÔÀ ¡ï©Ž\oñ’øŠ²oÀ“ºÊz:é×h†”£žcTb¬šDòóiÁa72¾If¥Ë`¶_(‡ Bk¯ÿùNÞá:VÚ”©‹áL7'¥Ë ÒÌ_ÞX’ŽÙÅÖ…-ÏyÖb¥Ë4Ý×$ß+/‡Dz«þÆúã(¿Ú Rôs°³Ç-üÈŠ$0Ýl“3~öd«  î̼ö¾5䂸ñ÷»eí[>…ã½áf²foæ½dx¿Þûve¬v™+fi±õ ˜ì,Ù}™ÒÃGEß.B[‚Ga[‹rg#5¤ü<¦¹ !_2žT•¢¾Ü&’ËŸé( U:©þ¡ÿŒQØë'!bJÛ‡hBÏk¬^Ɉî1Mû#kX™Ù¦C’ºžûç- ½*ªpöì±ü!¶_šûP&Ù×9`äL6ÃWœ .vãý#½8¡}hj%üޱí,¦¤D_—?˘êô_8‹܈ì0÷ûšhÌ}ßW~1K¦4Ò endstream endobj 826 0 obj << /Length1 1622 /Length2 9307 /Length3 0 /Length 10372 /Filter /FlateDecode >> stream xÚ·T›Û6 )îR(ÜÝÝ]‹ %@€ ·âZœân…âî-®…âî¥P´¸ÛGÏ9÷œsïÿ¯õ}+k%ï3óÌ왽ŸÙIè¨4µÙ¤, f y(Ä™‹S £¦ÅÅ àääaçääF££Ó;Ûþ2£Ñé`N`(Dø_èüd“:?ñÔ €²‹€‹ÀÅ/Ì% ÌÉ àæäú È]Á5v€2rB£“:xÀÀVÖÎOËüçÀhÎà`ý# e‚Í€ÐÙdÿ´¢9Р 5ƒœ=þ+£¨µ³³ƒ0‡››;ÐÞ‰ ³gb¸­Z 'ÌdøÝ0@hú³3v4:€Ž5ØéO»6ÔÒÙ ž v`sÄé)Âb‚žh+©4@?ɪXí €‹ëïtEÿN†ü 47‡Ú;!`ˆÀlhÈ«²;»;³€‹ßD ô)è ÛÍžTÈK½Ÿü«='sØÁÙ‰Ý l÷»EŽßižvYb!µ·AœÐ~×' †ÌŸ¶ÝƒãÏ“µ…@Ý ^K0ÄÂòw.º°£ HIö/Ê“ í›ÈÀÇÉÉ) Ä 9@îæÖ¿Óëx8€þprý6?uàãåuX>5ò[‚ž>мœ€® €3ÌäãõoÇ#4..€ØÜ`²CÐþÉþdYþ‰Ÿvq>i Àùûõ÷“ñ“¼, ;èœ/‡’®¦¢œËŸÿí“–†º¼ØxxlÜ|\!AA€'À翳hÁUÁùO¨Ä ú³Ø§]úOÁ®?ã_³Áøï\êÐ'Ñ‚Œÿhü '§ùÓ×ÿ³Òÿùÿøï,ÿ7ÿoAò.vv¸ÿðÿÜ@{°Ç_„'ͺ8?é_ ú4ÿ¥êƒþœY5ØÅþ½JÎÀ§9‚XÙý½`'y°;ÈBìlný§Xþ´ëþ2;0¤ uÿ¾Ul\œœÿã{š,sÛ§›ÃéI‘¸@OƒóßKÊAÌ¡¿'Œ›„Á€hœOBâæãxq=¢Èý 8Ø!Pç§ÀS{>K( í÷‰òó8¤~›þ@\…¿‘ 7€Cëo$$àþxyOãmÿåwõÿ‚O¹@C¾§\–PØ¿ü<«A~‡Í?ë)ä_ð)ô_ð©j§Á§Xç–z uvû7û©r— ÷“ßýŸFž ØŸôÿÚZsìérùCüOûþüÇM¹ƒÌÑæg æ"A65AmWURdnl›ßÄ&é6õS˜Ø¼æaŸ]n°P™*3VaR‰ƒ]8KrŒç’ ”÷^{Íu(¡- ¯Zo½ïÞÆio¶¢ÍõìIÕö’£¾dÓ‘Üò¾wôÖó·}Ö ß®L—ãè"ˆ¥™‡åÖ£à^Û[²82³ùj«’_ý®d‚-J7òÑ]®Yæ4 5²3ùsf¼#wì©ó‹I¼ìÑGJå84Ÿý(žB/Ã5îèëiÏå2n§Ž´/ IÈŸã Ó{Io')Ïz®Â†“§‰>¬Ûà²ÛfôÜT׺‚휘ÐÓ 3¾ áxF ô>rµE1Þ¾ˆ*™7óhIyÕ]éD Ù̉U#ü¨a'P˧….´Ùy“]ë¹ÂHXcÀªeM˜XK éæ %‡Ï®¥Ç Ëß´ê¿‹"^yÓo¾<´LPß$„e*GÞüÙï»UF›ÿβÕà’û€ÒÔ±²çD˜ëγÁÑ™y:´¯}kÄÉÂþ… |"]}}€ØvUKb¶,: Ù{¢ÚLr— ¡f2$Ò(šÄŒ´œfžzMôþ·Æ5›{èLé•Û­½nhWa½»%º%R•å9‚¸¨Š(1Ñסë#.D cë²+x¡ëÊaÑŒ!y§úå]§#_NóÙ8EÙK¬´¥±1Ôí>àfiĪNæFó‘™Õu<©´0#yÿ’G zôê,„ú•Ìȱ®¾ÈºulC ÿlÃi’ì¾—Tóª÷Á {çÀw'8¼ ücPä…‡á æ¹sâF‘øcõÜ’ÃO .m½*xŸ˜~á+%ÀS NëžY/__Q{äin·ƒá줛Â`+¾¾wÏ’áЮ_’ )XûE¾=8båÑ'Á ¶h/EP!V¥pd~ÞNG¼!êÆÀ•ãäj¢.ëšß™…“Á®ÐS§ is7<üUOä9™~Ëž©ý>A팒)dQt°1ò—ë½æ¤µ(—ÆÛM§å‚ÖžùK+—ªî"³5›Egä«Ç„øÜ£[Ìl{ÍR&w†›zn~/SËkìpâËÑ;”(0â½Õ1¹Zéè›Vu”²S¬cŠj ½´â b÷‰tÐ/s2ðÇ!ŒÎTìd¥.‰W)ôDé¼=†=SLÉ,¤áö¯zð…ø×ç”󀂛 ²ãÔ”œùÇCMi×,»£ËÆÒ;I˜ýñVE@†C©5ã&?KL‘cÎ…ˆÒøØwÀ‰,‘_”‘Ü+1„;ó·–F_ûhýµêßzW9¶ã¼c§{CèIUbÌ “¸•`¶¤\½ò޾gÌ“;Sèìk—DjÅÀ…ئ¿óÜ,Dôæk\ˆw¯l(gEÖJe3e}K) 5êAEn-#H#× ï»Gò8Œ"á;'tøpÔ¤•­{Ùt‚OßÏÙÖRŒÀĶ–þ©F?qÜYéQÊy8ŸvjÉŠR뉢Ÿ6ÜËR­N=¸Ý5¿} *»QjóeãÜVøÛ‹ìÁ:= $7 n£ ¾LÍÏ ež¯æ$陘|·MÏút®,Rfމ¦Þñùs>JáeÇÇ‚µyïôø©nŠ0Ý‚Gó‘ŠÕ¼m¬Áb»)ßõþ ë4~$#TîùÕú±ìX JÃ5Wݳ´ïvmšÞtLzýMXöG-³¥™äxxbôm@´ŸeDgÊÑÝN)AoÉó‡kâS‘<¢}çI½½´ò¢ø{겆’¥“cl”.IQü‰CýR¸“IïkáwEt)’¼è’p„»¼Œñ/ÛØÅàF(M³&¬Ê&6XÜ]G |Bj$Þã*ÌðàÊ’ '˜4ÄÔçNfÇ2Ó7ó;ÌÁ¾»GÝ­óžQäĘXc§ÛJk¿ŽÞ¤”±31AöYh`s’l_=® JV·>|DÉiôŽpS‹€%˜­j2þȵlE©I,èWäHÈoäMÖZP$iåûR>é‡<³©[O8Ë*ÿÒ{„y)02è~YrÓ!‹$P]cÌˆŠ¾ ?öåf/­¯÷ô¥=‚¸ÎçQÛªõç;0—àª×’jˆF—oú¦t¤Ø¯ÉÏÜx¬ÈýDÚÐ- ‘›–솠¨#¤ÍÜ÷ ºë§ç.üßSdfÞÓ‘ö¾Ö9gÐ:‹ì'µ™€Ë†Îp‘«•@|TbXàŽ„5ê9†M/%NfOFoÂò6Eו*£aIc¼ -} œ®R$D•Šóµâ$RzõáÅ©èŠrò­«·è?Ê”ÂüIç(GƒHñõÁ%ârº*F ƒ3×Ä¡-®:!x»R©J•… ?xJþBÜçIIÆ 8,i7kÕvqgoù O’^ìñ,™Ú2ë`40V|2ÎêÆæçÓšc3êd”+ß—R¦âqF1Kåí.åc >” È9Õ©GÚ×™•³³/^‹c„v…Mždˆ¿j¥o&Kêw¯ØÜnö„¤`µ‡…ØÊWY:ê³Í'Þò;†CQ˜SXØ/¬lì s`ÖÎd1ß$x„¹ çç=èÉäS©ÜD/)±ªZåÙÕ&±¼H>­‹¤IqBnÌâ+$\{ð_«cQNîÛ¨Äïå§Ï¡ÝO¿E÷ÀÛ¥qÀ¾­z! <³©b×ù‘ˆwJ²M_Š*¸9•íYÝ›© Ꞣ6!.¿öÓÂ)Àwõ6¤2éÅþâ&œµ¬žø5ض̈âå%ã0«PÜg M½x¦²ØÅ³ù÷ød§Ú¿TÃzTYª?5­¶MܤOÈ5{2Öƒ™ …AÉÞ¹i²BØBæ09 ÿƒê$ÙPË=§›*øÎ‚ê³:ü‡tß°´zæãdÿöB[9ÄÚ½²ø¶sݤñf´U7zÇý!%&ÎI¼>Ö| ¸Eõ0Xb¹R!«F# ?ÃZá‹õQ\»¼ZÊt´ Çu]’w ê†NÖs½M¶VÆF*åúFÃ/«¨Ÿ‹©Œ+=g—$gÙü>]bð„òÅ$ȪÖñ½…Í+nî”;ZUrPÀ~àl[TjÒ%¼w”Yì¶'u¸çLIÝ›ïõ¦ µŒææÝ½¶Xf bκ‚FY˜†ååI©ÝhšE†°A âBw*ãiê Ãûì¬è'AÅÉåØÛIf|øãÌr¨|±˜Õº:Ö7/–í\Û…ZÉÞ2Á_O½¦uIOëÛ#ÇaflR‹Fn[мÕ{¯á;Ôïl.cÚ2ó3=º§Æ¯B¯ìµc/ÃN|—r:i%þ‡I±!ˆ„œCtô:Ð7/âMåõ.Ó×·¼óä_|T^çV²Ô[̈›˜¯è½çïÃã”3ìsf¸'ÀÁT¾xòhPÖ–OfóAp?’¥ù˜·ú‚’Ý× Ÿ%);ånd5Å[r@´Jç‹û&Mù úëq«Ü<[šµ 7‰N‡îõºÇ‘„îûuçúL"òŪ·\€¶É XWáFük„ä‰1Ë\CÜç™ElÏæs®â§Ö¾nE»ÊqäKVúiÿ…2ʪ7¤}å±K?Æò¸T¥«JGñh”ÔÀ×uœ>t7‘;sŽà¾+ãáÆ©ªÊRóÏ,·”¸Š_JLÙ8w3 s0F*e)äf/  à ÕóGô#¾MÁ dÉ­ù»\e¸gÍÙø «ó­ljßôìVúB…ø±¯† RPo7Pw OâEÖu26±Šƒ§ˆbSþyÉAX¶P1쀜KzŽ-¼1Æå~Ýÿádà‡i²^Gâ1½œB¶¿Dƒ9 Ö̆Ìbrª€@ ›iÿ<-be¹šë*Ê.ù.‘wm0½SOä7Œ ~ª+ˆÅh¨Q‚î cÅ|t2t JyYô6xÿ”kCt¹µ!¬úe?f'6E¨»Z¬R» Úç³r#Z Y]ÜkŒ‰n›žÆµ€°·ûO9!73m„§^iÏØõ™´:ªú4n«#„‚™;þbœµÅ3sX eóÉbœ>)–¯õ*Ä oø˜«¾•7ç¯BÞ©!ÃF¤.õi]LˆØŠOì@ßÄ}d˜ÉÝ¿®çq!KΗ¢ªsÁYÇG=ûlF)Zv(èC|Jx{iZ!e;•,É Â ’µ±|ƒ÷€½XõcŒHÄÙ¿×KEaù=¾©5B;ƒ^ŸÐKl®yñí#f ÖZOQ=Grª¾9š?æ&WÂ_¶Gœ`-FË ²^ËFeÑÙ|Qs÷‰@&³‰¼)%†&ÙVt“òÝá»$Rûîw6G2âŸË»¾ÔëP†«ͱ㠼axwÑ}f‘E6ã½…'D’ñ¹kÅ&€½Þà÷ªí¤‘  Êþ oó€Ã(áóK£„? -Pñø¦BÏ(z¡'ÜM¥æ×JVýŸþˆ´*\ê1÷[¯lìíÐB"Òx²©–Ž^ÁâƒöH£À¨;8¦.=‚T5|´¤µæˆÅ׺º©wC"ï|‹±›p¯,ă"HŸa ']cRZµ|AA‚·Ó½ƒºÞGd³àÖR¿¢óë¡-Ö…ƒwm$Tæ×RH¾ª[uµ_ùQKLw~ÝÝš];A`\&¦)ãt·ô–{©ÊöþœŸ~¯}GT­ 0T¨”tù™ó•e'GKÜjÄ-å‹ÕÃô,•öwoîèù1‘¨™X¡ð¹‚Mlè%Ó;ÛÄ´áy5©÷E‹Zâ2/[VÕL|nŒC,T¥]šÝRzéÓ ÊÌØ‡S_´£8½ ¶eÜû í…`õH?IuÉ”È=‚”KËÊžË×Ü+U]àX®À8RÝË<|÷ˆñÞB÷‚_‚üªCòølßM ?|Δus .±9®’B¼)Gýfª­õ¦á5"V5û„›úñ½Luœí¦~é»EšFA¬QuZ€+ö*‡1º•Èv§š%©×\ü­<9jBT ¶›"ÄÁG¶šóåfïÌãüв Я8CŠGBî"š] '[ ~iÓ?É|T×[㤘¥Y—œ¶6.6[A‰½¯ûÉg:œ˜Ïº¶Î1udá“ š;•¡>«`F ,[½Ìˆ³Jqó ™|‹=Ê9¥8"ÎøµÎEÿód¡§wºÎp݆ž’ÚF¥%ój~!ʰùÏŠÑä -¾W6· æM5치°ëÓ$®½¼àP‰yÊÒ–Á9/2÷ȵ>" €½~(ÒÔñZ£3ÃçYõ¾kCüÂ6=»üy„@òŠÑg?ä.|‹H'Y]-9#H³¼:ÀôÐa*,×Ô3Òë!=#Ì#ü%-í+±è/QçÙx!õ´ùÎáU;%Eòœe§Ìn±C'vÕð÷aDâ ß.åo%Ÿ˜£f«Ú?©¥6öD91›[Kν³·µt-–\êÇ ÁÄÒq0”Œ1Á î{V”ph,ånH x¥ZZ+PSàÐÙHd!ù“I˸óÑZbÁÈ>ØA‚fß=?™“ÑmKêY{’Þ¸ô\黋º´"6Ã>|íQ4q¯ž~ a$•ÿ(Í õ”Ã×ÇéÊc$3í€qÑGˆ+üà3gǧù”°äK¤ð­3âŸUNýù ˜ao ˆeN”ár˜üéW;ìÕÂéÈ7r†ÛQÒÞ JµwŽ Ÿ8È”åä«á*K7sž_àž§k½»Î·ä Œ.GuÕü΄¯Py·±©IB‡]ciL£áìïÓ¼¹AbgÙ&e‹ò=O|p&;x½žÒ§A2ìíhcÍÆ#Ò§S}úŸÅLH4×ßfýªÒ"gnYr‰ic¹·ÀoS?Igzº"š¾4–Ùé76gÙöól ªCbº®¯ØT#ãln ¹Ì}32ð€ í£\<>µoÑCûÄZ¨cÔvŠœ?? :dè…E/|™oü&ƒþãü¶~‚•Áïc—&ÓÂéXQŒywW?Øa–6ý¥®9[dCñx€t8Ù) ;2„Ôq!'5 hª1ìí¸n‘‚”»²þg‡ôÙdw íú.Ç©÷„šÖM#›i$ÙZ%Æ'þ-µïÞìn«w'~—¯.%FÕv'ŒÐ¶ùGä)+ÒT;9ì}·„ƦΙ ¿H_‡3‹…Z;‚YJ‚¼,ôf 3n5P9æf83hvöj¬µhà.Ø,µ,ÑÆK|£E˜‹œã‘,7¹ŽíŸÞõ,µ+ÌfôNGˆ‹äP3¡VÙ0f¬ãÝ3î™깦¯¡ýS¬*6áÙ)„ ~™4pÂ6ý:ý¡'ê9h*Šu;ªgúŠR*F>sζŽÃìÍùÆv«ÒòåÖ B#ú³ÜWx+x§™ð²ÕS»§·¶WNIyÖâ i¦ÁqÙÀ¨OšUŒïlè4+BšűÑêôíUýÇ%R3CÔ]¼@\ŽûDßaírGÿ™B >„'2 jŠî&ZÈü&µ#õ Fï÷’ëûóúõ}¤ÁŽN‚Ä 8Ï`Ä—‘ÙÉ,Ô ?üÈššKô¾+F¤ÆŸ/¼¨âRXȾTtøþ»mG§fd¢tÞ)–­ÛA;¹´S¦¶&ÇQ-à™;ÈÙXkÒËS¦úYh‹„‡F‹ö ûËšé)õÀµÏ6.Ö[*]|“þe IÍòö -Ïq1KÜð$¦++©å÷P3iM ÑÊB“‰hÖI*ìî\×éMû9teª¸jfÑŠjí„.1µa!r£E-žõ)nõ@‹=êï®pòü¨rçñF‡ìعß& ÕÕdÉÈ7º~RZ“Fæ{Sâ©üç›xÏÎǨ²~C8)΂ÈÂÛê1-YL¸‚”=&=ýËè5eSÛ‡sÔ2r6Ó;ÜÈÄðqÇ#qT…ElޟεôÔ`ü¨´¸6Q—¥n Òì–ò¨F:vSö‹LçŽ4S’ãß°¬í‹ºצ5â9¾ÒÊ\ó£\Ûÿ XѨBx˜!qërÓpaVï¿Â²…s7ÈL}ÔËŸê*Sìr¬â,Åå9Îûvr2ë;~–ÈÌ2@,Iý9"îMϸqG¦™þj.UžúJ¡Ã5£o2þ²p)…µcHÀ§#ØzäCÌ>& Oœð6!¥O­ûûùÇèÌÛÆšº",z“Í¡ *û²QIv§Õgm«ÜÅìù÷‚2¹ˆFÕêÊßñ§alÞZÔæ¡ŸbÐMÅ$¾Zì<ˆ} /¤£€h±“iËzz’V8Œ‘öÙ)a]Í,Û$º³mÅeL`q[¤ºïÉ›æÛ:÷®Í$—.þÀM›'~i(h2ÍÍ`@xò•bæÑE¥üõªœIÛFoˆŸèÃÏfú9%:]Ëì½²ÕGÁ™ìvjøà_“Ö^,j©Ö>@£N 2#$&.ÁÑÔ²Ëß.ZR’­NoŠv©×6‰l¤îª.îð‰ljˆ¯¤hx„ÖÚ_ Q[¢]ÖQ8õs“ï Iœàï‚Ýd»‘*u™pð‰£\,‚Ñíð+ƒ,ÞÔÇ Ö{Z™‰’˜-+d™Ã.k=gSNA¯~ zÈ@Øï¨ØHÚ'Ï ŠÑßaöôz·;ƒ]Ë®öÕbèë§±3Þö{Œ.%&²¼¯Ϥã³vÄñ2ÇùéW<Öd[VvtNü õzVúeŸš@}Jtï»7[vö?i¾´ÂúäòÊó¶WCjj­ý/?I¹”6%„f툯jU/ÁP²xú>¢x¨y,ÁOVœqíeÖpY S$iÒ ´u‰8h›8÷¼äB7=b軬#ä¯.kŠ;¯<wFûík_Éí&“–;ßÅÞ$óëm%2$õúËâw䳪4#¨ãt‹gÊ1/ „w¶oŒÅ-€·0 ƒHu4Æ¡NŽl‚o 0 ¬z>”Ðh\Ý:Âä„»÷<åÜb×ðà¾bz4£ù¹=®½Þ§9Á«É ZƤ)Rg)“˜5[—9aœf~"Нéòé–BÇOú…ØçPch([³JùÛüþÂÕ——R‹„Œi£×ˆ“üž©ÏGëóíX,c¨éÛ·Kµyú óþ²ÕLg-M')õ¼åq™ˆ§Iágó&F¡'ò,ÑÅfþµ6K#é2i»¸¨,å’5 Óõ?<}YÔ“! MŠI™^l´4<K:”• ßÕà\#s®c½eQ^Ue9ªUŽÎ̯gGÉk}:»½*ôú;/|âÛQ@Øï`ÍéáÒ’ÓZt‚ôãµÛT-j:¦›­†f,[GË¶Š "¸mæjAm”Wº ÔªD«󔌹” édól _c¸7Bûî" IUv1]4¿8½x[=&B •wUõb ’D'L»$¶îM°©¨†Ôš3TM‰YO,×½Â?Ùž¨ØÙ?5‹ýì¢ÌFKÄ+b{gç³¾FÀ¸„t’„tƒóÑ'toò œŠñ‹*²ê/”¡²'XÆÕŽΛai:T^âu‡q|#EaIvv¾ÐšT<µú…[ ¿”7•%ßVãLÍœ—-vÅ¥úímzzÊëiqïw5Í27áÄ8ä('íçZáæà£r/jHQ."m9¹c©FøÛÅÝw)ñ@S› ‘dJ•ÄŠKŒÖ7wµea&d¶s#ÊE_7ܤ_¾è5 è ® ˆD2zïÊDÅÆ ãïì UYÜS¾göŽd&ˆW’V-ÜÛCÒ‚.Õïû5(6•XY§Õ§; ñm¾ÿHÔ BÝüü,Ý–ÞöKïEz>!2[µ|[ƒŠo­½P†o2x:,˜‡oêD4MöK»wÛb¸4ËP¢®GA¹Fðµ4¸™A3ô³ñt•zÅlþ×Ã#½<Å·éem«iÌÇTj=>ú.êºeœk ÃÃîR쎷)>|þ%ofC)fûvÆ#.ý½ïj¹ó¦À"‹Åžƒ«øw³%ѹ°W©Ø’äœçmé¶?ó>°¶îpÓ%ìë ¢H<Ïo!@Æaü2È`ó¾™­œiEûâ6ƒ›L¯*ÿí—Áûg¦¨’ò'«ˆ9ÂéßÖ»Ê(m³èʌᖶuülÕ$ ISÙ1ÄAk)£a¢ºpÓ¿pÛœgµt¨¢+“—ì—wÆNR"hÌ6V^c+ÛZÕõg¢r¡®%©_¾4yqjðphdÆpÈ ¯O¢9ûcË 5á»Å: kmð/|B ݾܙ¤ o{a¬\(¯o%úx¢†9Ûé]?KËVÙ­ ]Y>:¡ß#›‡X¥t'&Óí’}NH(þÄ+z"Ä•ApÉm¶ç/ê­Ù?·Ñ%¿%Låö“R~¹(¾ð-8óºJfjah_Ö‹÷º_Ý”Âz]f'°ªzذÍÑ#»‚ør²ÕZ,xŒD·e'ŽQ~ŽçôψŒki8ô#iqéëîCÜmÒ~‘Õ¶ûM_DËG­E‡ÓÆŽ®È¢UÑ•ŒiDA_"Õ9^ù:­¢ßpD·ˆ'Ý# AZ=Ã!¬ôªP8qîe0dpÖÑ«ýö9§n:¹ê{@;¬âXWÞÀ S˯ãÍPcݦa1ü𥣵QûDf&ªË´vT_e ö®Zoz8Gáê¢Ëú ÜD„>Á†=ªzߘ•ZˆGçµDÅÿúu•ùJ!Y\†Ö‰Û'ßÌ”Tç¬4ëÒšœŽÈà]üúfÈRêá€gËO0a@âøÕQ/SJÈþ¶öTƒjgÊPÙ‰ð9Õ¯ï[¸ÉbͽNîm©Š¿Î: ânïyÌ/?Î5¼1¢ aج˜hðDV·ôIµ¿b½})°5Ø¢«jGœ&üúí¤+ì^á£×1irP±.sо¬î÷ª!_Ú°œSCÎ-6QÊ_s8™¡Ýuýr´ 3(VÓ¦i8åóñzL/$ìs1Æ)ýfgÄóÙù‚-® •‘¶7®NÈh½Q8Ç-ú«s+îíÃÃY% $KÜ-IË{zä'Å4 „c6Λ°º ¹Ñ;Ø,C)ur‘^w: ¤ ƒ°S<4Ò³1Ú§ª’ ½ÀŽ¥ìY•«9þTÈD1œì mìe‡]l1²ŒDï#p¼¦˜Ø’Œäî•v˜^O_±œìYØîl^¶Òªô9C’ žÆ›7Œ_q†1j¾v9ÑŠ“ˆ`ÁŠ5òæ ›F=DL’PÈ*é.Àb\*ÑÏ"ö2}C(ˆ$,XÑ~±Æ¸]J‡àS„vì" àxª±û¹i¨æÐ|8¾4;­|>hå>~[7÷ðÒbX¿§bJkÃÒ’ÌEÿåùÐé}€µèébx—àhë~ú^MLåÞÅ—[7>ŽêÚ¹{‘Î2ï/‰g§=µ¥/#x𴬾rõ@§wnùv½Wã䜼 ›Ä±ã°ªI!ÙD')\'ÑÚŒ•¨E5.\¯£â4zI!ê™óì]·u?[ñ–¢NOWJµ‚„û*J ì"µK³¡xª›Ä%Ôf„¯‰M¸×í¡gãk+™¾ójÓ,ʵ6[Ú@ª¹ñ¼qn”m-ðX¯)¦sO×}Þ°¥¹h üO⟦Ÿì=?‘ße²è rG€,s‡wÙˆEâˆÿ=¼øÙ endstream endobj 828 0 obj << /Length1 1597 /Length2 8923 /Length3 0 /Length 9967 /Filter /FlateDecode >> stream xÚ·T›[×- Å]‹K°"…àîîw‡àînÅŠSŠ·¸Cq(îV\*-nåÒžó½ç¼ßÿqïÈÉ3—̽ÖÞsíñ„F]‹MÒf ’ƒAÝØ8BiUMN~7ƒƒ AìýmFgй¸‚aP¡H»€,Üžl2nOqª0(@Éàäpò qò qp¸88ÿ'æ"±ð[T%äŠÎ sòvÛÚ¹=-ó?&+f§  ?ëŸt€¤#Èle¨Z¸ÙŸV´²€´`V`›÷Q0‰Ø¹¹9 ±³{zz-]0[1fV€'ØÍ  r¹x€¬¿¨Y8‚þê ˆÎж»þeׂٸyZ¸€OØ u}Êp‡Zƒ\O‹´U¯œ@п‚Uþ `ü½7N çèþÎþM†þI¶°²‚9:Y@½ÁP[€ ¼’Sºy¹±, Ö¿- ®°§|  0ÄÂò)àOå9I €ÅSƒ·çjåvrsº‚!¿[dÿMó´Ë²Pki˜£#êæŠþ»>° ÈêiÛ½Ùÿ:Y(Ìêû7°C­m~7aíîÄ®;»ƒeþy2¡ÿc³¹x988øy gÈËÊŽý7½¶·è“ó·ù©_'˜Àæ© ?Øôôƒîëjḹ¸ƒü}ÿíøo„ÎÉ °[¹,A¶`(ú?ìOfÍ_øéð]À^#Ž'íq8~þódò$/kâýOøŸóe×Ó”V”•ùWÇÿñIIÁ¼¾lÜÜ6.^€ /€ŸGàÿß,êà¿«àø'UjþUìÓ.ýOÁŸ?Óß³Á øo.5Ø“hA¦4nÌÁËaõôÅùÿ¬ô?)ÿÿÍòÓøÿ.HÎùãfúãÿÿ¸-Á￞4ëîö¤UØÓ@ÿw¨诙UYƒÝÿ·WÑÍâi$¡¶ÿl#ØUì²V»YÙý%–¿ì:¿‡ †‚Ôa®àß· €“ƒãùž&ËÊáéæp}Räèipþ{IY¨Ìú÷„qñò,\\,¼Ñ9ž„ÄÅË ðå|Ek× ØP˜ÛS à©=€ Ìý÷‰òñØ%›þ ~»Ü?ˆÀ®ú°«ý >ù,þA‚v«ÿ ß}°[ÿ rØAÿ‚ÜvÛÁ§ Àÿ‚OÄÿ@Î'*è¿àì_ Àîô/È`wùä°»ý >1»ÿÿµƒVî..OwÈ?mïÿà?ä²B_^€Y ‡Ù×…u\×H’{²íMˆÎ2ìée0³ù.»tºßb£¤2x²ár)™ú©wuG–éBb…úÁ÷GkJdÛö;¿{³$Íé½vô¥)¢ÁÉâ’õ”hlÚ_üœýtƒZá?*1ä;» `«\{öË{ÕT|‹XØÓøòOã¾b†íµNœqpéCeÎ< -²%* þ‰ÎÜÅå,~Þä#µRÒKtÿƒ×Ü%¾†›\ñ7ó>kUÚ\®Ý¤ô¤†$”øcÓ/|¥¾¥)/ú–½‹ÅmŽr>(å˜D£/)Ñ0™îõùÚO(÷ È\nƼðEtŽ~¹ òGF=ñ‘ën@ý¢n ïÕ#Úæ¨AKù„´z†kxùÑïzÞýPiº4‹l„5ÆÑµÞÿÜ%IH×0·"ÑŸÕÝKk©¸§ëĶPv Ú¥O QÊÏ{C}Vü6µ¥Sg¢*××Äz¿±?Ô¦×zʪ]?Om9„j¾ѶA&ç»Åc²¾¥PÔ„“a®X¸/úÅFÑ­÷æ*¨áež­ÅÄŠæí‘Gù æ@ŠÙ­z²ª^3I8‚¯²`Jc ¬íÁÏ™†£¯Ù#Ñê®_…mk?t¼µ§–y–êh÷®†î¹Ñüô››°~‰ÂÂ:ý°$ˆ£oçÍ[hÅÍP‚g—uH¾ÎoÏúÊk6²ùb5CÛ=ªe¥K¹OC#ÕŸñL_Q§.Á)€¸ +(y!µ§üap¦ Ö~é´:I®ºì‘r­Xœ?ЋŒ´îp&j@b›‹«Z!ÞÆq÷Ê® }3ÄJW¦XCyô¡WÎAóJ“’waE¡ê›±_â! ñåjŸ¶o(h¥p0Tï-‡ò¨L„vf%FýJ˜üÔèÙªö|èqú®Ã52ÿbß[Á»_Ý¿_ÙdK1×"èLKÛÈ ë±õ8|×·‡äçÞ…§|Ck$ª½Š—"Ð$u¢³k_CÆÃÞÿ¸­l¶yñQõürÙOG&f=³r>–eüe`ù¤gFÝ˱+·Æ…jÿùV¬À$»þˆ6ésþNÍ0)vwBLÏk}®à«½ÝØZ@[¨é• xÿgCÏGÐ[jmá2£oEœ]Tó;’Š]Ê%œ§5wˆë!–íº£s`Í­ãÆÁ_E£c»q‚tŒäÈÆ¥Í幨+NûUIJ¼¼•5ȶ>ü‰Á¶ò ÕQ“ÒLÁñ˳w+ á@¶‘MRÔqRœhv¥õeCË¥ú@ù9/âW/ÚBÂ?  îˆnâ Þ/Jîcy£´P€>ëšÊ9®F‹…QßÞ^#Ç•f9Œ/ïödÞ1q”‘¬ñHè‹Ms[ýl\¨mØCu í½¶•[Èo·"$ðôédkyL5fD(bIÚ„Ó%Óü¸Í}—aÈøÝñµÆ.ÞÀ~Ä£2‰jý[kt˱ÌÎÁZø÷7Ñ®Ú÷vŠE›TŽá&Ök½"ï1yñ ª§.*.bEµ^溷êOˆjÂÎæÌKQ¾®ç¼×½™'+1§'`ói²ä_Î}`´ÿªHŠÌMÞƒ}ã¹›Þéí®ÌŽq3KèU1ªéTî„3Äœ­$‡¿ä•e®`aVO_6*²…4°,h­ÁÝ yv¼5H&J†hèÍy³<€˜Ùp\à;Îl„óS¥;ãNX€´½²ÝáZ@fÛÛ™ÄMGb§¹yõssµÁÄåIĪ`¼—œA’Eؘ’ƒ¡p쓪é-€LSv0"­uщýY):,EgeI„zÞj÷ ¸ñFŸ²““]äºÓ«iGÿQ:+¯Eõ(R_e‡¶[¬ižŸ^I;áoB’H—ãUܭŸÌåwLx²ø"¶ºÂµçÖaôS£Tkáð°á”aâX©Vz®oí§¢¿JwB´–QWõ­rÖÆ·7e8·«-ù0þƒS{s³SãjUæœyvÕrõQÄiå­)ü³äj(² jÿì—¬£k´…~>ÓK¢=Ð7ýš2oÁº·ðÓߣ‘Éëªd•Afu¥ùÒU€¾<¶LpŒR«ëñx°Ã×iît ü®÷nÊ}E/†Óo™å™…¨îÒr%–cp½jÂR2> x:ŒS~­Ãy^¾ŸR™b…ø¾º ùU²A¬>]óyahVÀ°`gB„´V»jwmÛÅWÁ°ìoHHJ „é„ÃÓ"dò¯txì­«;ê­>ÉPì«o{š+¹·…ÒÕ›Ò‡Õ øÓ¯žqÙVV TkÖñÖBœÓÈÚ¨û/âŽÃÄççç¶žùÂf¶¨¶¡ µ®:F¾@[ÊŸrßEãd&žÛcå¡ÄŠ6` ^ϧ.yµ@ÀJL9jrªã—y.&UŠ{¨%ê¹"ú‰Þþq]爑ÃûWЮ R_ä5²½y %¶¾—vúXûä¾þÑP |I4¤&Ê4ïùÖ.ŽsöÜâÁ»PwupUï~ªJ"½_Ï ÷Ývš·èÆùpgBÁü½‡áÙWÈmÑŸl·àI¾ãØÄ}?ÓŸæÚ~Ïî,ØäаYw"g²ö¬eװЍ”i ²`<ÛîÁÔŠ"æ8W{[6,-ÞØº©€Ì$KÛh-'"2¨š´õí¯ƒ_Û}ÄÆR¯,ÆÚj§ôq 8¦ôðsÌ–z 0edîêÚ¼t~?¤(…_£•¡ªy­>JEŒ‡Ë´ØøqKèzD³Æ¹Ýª¡r6†d½(Ó È¯2VGZMöúüŒP5©‘Ö¯ ‡™—óƒ pê§+IÛˆˆöCþŒ•î|>FEs“ý]i$º}p­ñ8ìvé/;ÁkcÛ«Rëµ£'΄ýaÙ΋@Öy\»ÆFXJ¿˜wsƒ‰á5Au·©gÜ!TRµ­v)xñ^Ã/3PP%ýÓýÉø¼f‰ÑK% VÀ½Lwý ½Ù¼Wk¼–ûà.½ç@ºìëŠBƒ-lˆ<ÜàëÂÌô€m»×´±_“ë>ê¾W5š×Ѿ¨PçãDÛi-Š!õøº9ÒÌ“‚BÝåDë®Ì„µó á^dX*šHÓ‹î\ç‰å¤á“ïŒk]žUð2–Mœdz¨s²t³¸W¡³5㧨¶æçö®•Gv»ä *¯4ÜQI5 0.3>C)rŠ7Ý)l‘ÕyŒ5ST銶é¾Ä¢>ûñêä0¤Hª¼Ï¬->Ëtè¼ÛÃ|L%µ’t ;Þá ¥Ò¦*LÞH w–ÅœA¾cÍe¶¶˜e¼ %‰«肎:Æƶ5³|zü¾³O‡î¸NJu±j—„dyŸùÑAë0{×Gî‘]4­ÝÔÂŧ©Ø;ê/¿’/‰b*}Ü¿ÑMdÖ›2ø’¢^ôJ³ñÅ‘¸#o·î,™3fT]eù>tÖ?/Ú.‘ èúðEìнª¯‚` Õ[P—&ZSóØÈ)†¸yÃK ‘¨Á'H8@Ò¡¥ÃÆxÊþQ? –Î^†y]}¸‚¢·ùûçî$¾2Úmø)7²0ߪÇÜËÓ$"”@úmm@a"0B•4Y§œÕŠ™c7êeÞ€ÌóÁèsÒ‚¬€ç›2ŠƒÇ?íyɘ78kxÚ”9¥uÊU|n¹© cRz-Áˆà?Õ+z$EEc~Ê|XÔeóüŠæøÎ#ú Ç>º¡*4úž[2ë¸rTÝôÌŒ;l6:X:ûö÷^¬8õ öt3Z–P\QøG±‚ý¤î몦ºŸ·…¹Hê—½ºB÷ãlüY-)=ùÂ9CÏØ¥.ͅ뢲›¯Í·Êϰ¿"šj0À‡{ÌúÂå]¦Ãƒº0ÌvàúóZ™JƒXCdüÅ„Sl„.ëòUÎTò­¿¦JážœÌR Æfšy­õ60áQº;ãÙê¥ašXª©2Úùf¿V®r&¾ ¥jå*´üݶÚ"e¯j¿˜^¬†£nGé¬Þ-]hH¡†ÞºR’Lr·_æíï/v,Œéù/²"ßøÁïáΣŒ‘¢r½°Ac¢ ÅZÞ[Ö¦ o»×:.fI,ÈP^¦âʉÙõI~‰S©&µNN½rÄBü£Ö›ˆ#ê —}¿sµ[»x8«[팃ŠpúYÏæ´Ç4Š rŸ­Å.žPûµg~š6Gx«9©ó3*ÊŒâ:@*ºþ$¥RQAþXé\ŠË¼ËºP9§4GÌX×_T‘6aLBb³EÒZéóÛâqä'P›™.8Ú« >£ ›¶&ø™ë~~~õTò5¯ÚRÕ¯6Ýû{”ZîUÞ-Á§Ìj:°kè™'|ïfqdǶ7¨÷29š¸r›âPèCÉïCä¦T@QÊè—7°(!¨¢ *:›«%1ê[ˆí]0£ Ðf¬cãÛµ&$ÜKUI§ìÛzŸgÅâ‘"ßzj›âSâóâ×ÏxÝd7ôpÉŠ ´£G¢ÂH£Wë#ÇO0@ùT—À{gµËT?›OýuGEÝÚÁÑ¥:-^îól§L3ó¯À)¿ñbD¼MѪ"¸eÛg¬ßs,‘H*†WÚØ;7Bâ'[‰EtÌX¦;ƽÄܳÁo„J0#§‚» *Zœ¹ùî.Úô^õ´ú[Óâˆi‹½n]ú¨Œ ÛiG%òôÒœÅH1v/”T`ÖÎUtŘûЀУ«ïïuÄ×rMc½2UIO‚¥#cÂVHÔ¶ ÞUŽóÒžB'sV7¶þr<ì:>5‘b¤ƒ7ä—…>Hqjêѯ…ùî“óóñÐÖ7û&©hƒH.E¶• ×|†nvn~'f诨 ]†u¸ou½|èLÉÎ[@³*µ¾_³£ï³Áï‹á[úÐÓxÃxor¿ä?Oâf Sa˜ãì§NÒŸ™W|J=zQ1¹-.(a2Šô 3ªþÙ´1°µ,â)Vñ㽯†±‚Sõ‘CÄš´'ºîO ÏŽ] -Ž0sX€5è2dd¯§bšùzË;Ò “‘ðU-ˉxi”8¦4ë ÍŒœ–Ë€Z²ŒÝZ·Ú•í2XÍÜmDèÕ‚·º@ùšIØ”òQ8Jj]i„K›p!þîâg³ºñ"ê¼»h^ÞãLÍ¡­GzÓ§RÊƒŽ¯ýq3ÏHÆdÎeEµ6ÿ¡b5b£¤ìY`ÊþMùu’Z¾º9–t9T¨bK_)¨ž¿;Ý[=U®YœJ:#) ¬”¥ßF”=NXêÇþZ-‹q‰—o¾¹ni£™}Ô´ .â¨Ë®µøhG²Zl—AÇuf*ôCƒœî"Bû£‡ê›%œŸ™>lj=#ð)ðÈJ¨ª/Rzsj8=–v0ƳvÑ¢3-&sž3æSГÅÉIÕ#d.•0 ú­pÏ?)OðùÝK}ï„æ¬-Êt0bŠ­H,‹;*‰V—ÝÕùÑ&:Ÿ½ ÃH´ÝºÅÐ|Ó³–¶S'òú"w=ra 2õŒTuµL7K…ƒ(Zï5›ëúDH\GÀˆv\ઓá\ ¼!“n-Üá=*¿™ŸðÒw6€|»>J“ÕæÃ@PJƒ8Ù½-b†–Rb{GI‘)\©–Ñ0j :ßM³“Ræ«N)Ú[v°ô½?*óùgãÁé“[ —òXV‡oòœÒxß}.Ñ”Äa­ùV”•¬ÄƒÿsaO®†Cv°Æ-mpËè]ºƒ£nÛuKí\ø§™5rµk»k)*^ú“Ý„9^Š&Wí¹b`DzS¯nýÈä+*™¯ön_.}‡ \^µbZT×›Çø2ÐÞ°6 æ”$‹\ýÀÖÀŒqámÂoú¼1‡7 p¦NÀ©üñáÝnù@G`MmÁ¬+¤:†:¥‚BÖèUIí%‘hÙŒœ’ùÉáÎrÝש½3”m¿ÙMRÛNœJŽëñQ,µ«¢YÖI̼ÃjÛÕ Åc2*Ú×Ð3| ‹ù¬zîT¥¹Ñ»tx ÉÜ`¬Èˆ…äŸøïÄü 4Ï~ÍãiIzý2ÅÈX9÷v|àÙ2IÂzˆ±@®§:¦à ³©à"Õ3)hw.]Á_’‰ô’©`“ùÞR­1iPAd2Ý} •’Vi㋌+bï 9Í!îç ‹ïŠ¶ð,…Ê+i¡MZ'Cþ*ù=ˆÞ¥ë«Þ±6MwØpï[Ö~5£×'É~_à®Ó+|Ф­™éevÙå]f§PG©å¿kOÍ_“®*ûòÀ)ÜIQEŽéºÉÿÓß~Ã.ÝÍÏëÙ—`æØ_¡Po’[1œUŸþïÛ¡G7–ý†/GðzD/¹?…´ŸÍ›êÔÿZ©9Çí ˜e×ßJ_à†c!ƒüè‚ZȺýz²¬Ïã¢m=CKÇ”}ÇéâYÛȃ’U4£ $Xùqë€3ù1NÇYªí‘µÖ[<±Õ/™5Ã*¼%oF¦±Þ^+aöw7ƒðâicöë<óYë° }ªÃf¬`ËÞ óx¤+»²K$Ï,G¬òíï úe_Ð+T^­¿âý?L(cÆ endstream endobj 830 0 obj << /Length1 1511 /Length2 7479 /Length3 0 /Length 8495 /Filter /FlateDecode >> stream xÚ·Tê6L§‚H(0ÄHÃÐ ÒÝ%% 0À30 Ý)-]‚4H§”´HŠt§"4ߨçžsÏýÿµ¾oÍZ3ï~v¼;žý®5@z-]Nik¸%DCròpD²ê:‚ˆ â%õ HGÈ”hA¸Bá0ÑÿÒË" `$ “#Qfêp@ÅÍÀÃàå¼ È áQ€Øj Pç¨ÀaW ,ÜÙ µµC¢nùÏÀbÅ àâøív‚  V`@Œ´ƒ8¡n´;táVPÒë_!XÄíHgQnn.°“+a+ÉÊð€"í:WÂb øU.@ìù] guýëÂm`€¡V˜+ÊÁ f APwt•ÕšÎØcµ?€¿Zàáâù;Ü_Þ¿Aa¿ÁVVp'g0Ì ³Ø@!M5.¤'’†Yÿ2;ºÂQþ`w0Ôl‰2ø8  ­ £êû«:W+ÔéÊå uüU!÷¯0¨&ËìeáNNÒ•àW~rPÄ Õu/îßcu€Á=`>Î6P˜µÍ¯¬Ýœ¹õaP7ˆ²Ü_(ˆàÌ‚€@ !aÄñ´²ãþ\ÏËò[Éó Fåïçã wØ J€øAm ¨W°;€D¸Aü|þ[ño‰€‡` µB,!¶PÁ?ÑQ0ÄæŒš<ê 0¡ˆÇýúü}2CqËsôúÇü÷p¹TõuµØü·JFî ðáä8y@>€êà÷ï(Z`è_Y€þñU†ÙÀ"’Eué? »ÿ5}–¿ƒðïXpc!–n Y¡¾xþŸiþÛåÿÝ¿¢ü_þ¿ù(¸9:þÖ²üRÿ´`'¨£×_z_Ý(î«ÃQû_SCÈŸuU‡XCÝœþW«Œ£v@fëøw¡® POˆµie÷‡*pý_ æ…A´à®Ð_ €“új«¬P†+Š¿UÔÒüûJy˜Üú×vñ ÀØ‹5b”$ðáA­¡5Äó7ƒÜ\08å@•ç°#~ÍåÄý§$üápÛ@Q$þàEp7Ä?€€†Êîo€_À ÿ/u7·+Äõfüð£›ÿ–yÜH;ä¿|@(ÄþOLa·7ñøWÉVnjáSÕÿÈ¿_ÄbE0?· µ¯ m;¯‘~èÁ¹þQb¸n˜ÎÊé3hw»$ÂMa­Î ^EœJ§ öÜ[ú"ÏròdîÚg»¥÷yk’öÛŸ¾Wæ :ãëo æÆ(úF ·¥ëßÓà?âÔ{²á{íâkä€Ù‚Þ©Ìuq&ÒÊ'=÷èUô¬_¶ø!|f]{£ZP•ðªl‚3V?Æ4¨d ˜g™=MÉ€ƒä¤Ác»àI2›©*f}^­">¤MS´|rJæqÜdñ^×Ð9G|ÿñì1pT”…Š’“L9:fµU)Ñ©„>‡?û`IeÕSù‡P‹¥+‡f"ôVÓQ¨«b²˜~Ã’ìÑųíÕñ†œ[ò’D|%H1EÜñu1ÇCÑwøçEšº)÷ò?é²iJ½iË]ÿ´–v\s?ç<†nüçÍs쟥8ç/[Ja45W#äL³|2¡‹R3¨Prø9Qÿ:Á&‡ËÚÖbTK2±K|M8~…‰±œ™ÐPk‹¦§¢ù²égÝaÒ/ŬµWÇ×É™áñÔ—¶/wxµqüD¿¿+¼·á{)Ë}›››ÓðúçÔ`‚ãñ¤ÞXÙƒe^‹®À857¾‘eâµ·r±ñ؈§eûKhÛÇ3Ö]§ÆÕBô©(”Êï(¸,êÙ 3mTNøf,m4ó~ðt\¨Ò|î6ëÙ‘h«¸É틎#ºóXpÀ¤2(¯½±ïuõm%„ÿöhJ²ÔÙ‹ù+-_zÈ­=t™kñj’º¿ø)Ö°ˆÔ—#– B·lK1…2a-# ßY29]`¢—ÄM¸-Œ^;È8õùXú«š2MèëˆðÓÊ×ñJáßÀB'©±æÆâ‡¤¶Ù‡Æ×Û##÷ÊÒ!8«99Ó9Á.)Üþ8öÌ&ò<Ëø=l9T+“‰àN3’ê b5ˆR@”ìS2LšFÚøç$äd¶sœÜ¡Ç[:O&èæ}-Ñdƒ¸ÛF½ƒkTóhͱʪ0 Ì3<£Ú‡BÏ’øZå[Î'Ëöw¢iD˜0»ŒN[{™9"iã÷rI$r(33‡$cHÉT&À÷xÚM÷XÄ_(¸äi½_²D0«k|Hh\ðg›•›é¼“í£Ê¯?ã9ó(Yîd¶kñ²!¨u%¹·À%4Z#PÕe%Qd¶í«ê9Þ`:_Í>™—4£ºµùFÙ0®!sOåN­ÜÊ£bm3j‹7 ¥X}êôc8I'ÝŸžz|=ب× GVfÎQf%±›Ù&Ôl‘O‘ †Ýܽ†»z”%mjë±f5 GW €£>K?÷»KzöÅö+·™Ã†æýÑ‚2¢ý¨öén—¢u‘™CŠÙQBw&TÛ(…"x;l²+e_ÍAAŠäN¹Zb!ORY_Ï'FªÏ§IK\h0½¦äÑNs¨$¶+ßè½ïû¨: ÕxÀj‰|¶-ZÂ/>eT°ëÆBfˆÛ” ¶Rõ]gzO®ã.\Wú‹Ý×Îsuîhxi^Â)þ§ÀÌWÏÃÆ(ÈÌw¦ä„û›#ßkëí¢= ÝÌ»¿L ö˜P4&J4Äô›=2*oæ•¶T¶¾ßbâVÕIn ð…Hì-Ž`—aæEZ¢›‡Þ6‚t7C‡RZ£Âøxæ:=7$SïL§7hf_’×tÑ>¥7ù?C4Ž?+ Žù®ûUy&ýòŒÓè7†bÛ1¯¨'TA•wß2Í•lDÇWj9H½ñzëuÁÖJ*Ž}º¼r0œè"!«È8xÚüÄz¾»»ÉÿhPšG[8XšÓw5Ò’Ç»²Ö ПºX|elz/Ÿ«±_z'×ÿk¿kgÃË­f:^r {vj™ºÓ¬[Þ‚êŸÓHo˜[457SoúPýÇ÷áeOaº7yìW#>»ö6ñÇ¡ÅiÝÅÔ;üAž: æƒø,Ž™e»Òw?Bú^ÌoËÚÈg \*˜EE{¥Âì|}°Æ{€‹3ÆÍÒéÿøæ[—VM‘ŒÈÙ[ÏÀ‚‹•-ü@ÊOg"9¸è$£šxª;“»j”éKXîÈ”8bÈ$'âÂŽcq6$c0°Ëõ5!ìÔÄÍp¥Ù7TzTÞˆ|[_ìŒß#à=³§çvä-/HëùºÕ)@Ý—RÛe{k€žØÿ` Ÿl%KXù•ꨕéqÖŽ&ÝUvIød¼ŸŸ^êÖùòOR‘ìGr,߇­0&EöóÒ]!³TaÙ»:Ï……–éë>ÖÀ\[(-‘Éwüeò5 µèλ”žÚŒà2ÊÔ?’Ó&_„¦@?ç$·$ï_Ù-ÞULNNLº¹Ç“&®Ã0Ël«ääÍÒƒ°6õoHöùñ‰Ÿq¼Ji¼³¼ö¨Š  ä Ýì-Ík«2 %h¨+n”Âúó.e¯v÷…k‚ŸHjûÑZ†)ä™`m‘•z1;ç>ÖmGcÓo`¢­ŸK¥-@‹ [èŒ+KL¿²ÞuO6§›3¥]4Ì.=“Yk=©5'mh,y3É8\}üCëºñ)´òàs‚ÆÛj+·ˆ÷ûÊifʯW«ÂMu÷ö”ãªp6܉r\ñq]Œœ³pFµÌn|o1}š ‘èèVVße@äG±ª¾³¹Ûáüg+ Y°½óçâm×Aaé¾Í·Ùi߈¾Œl½¹Í3ÂàçÜ™ÜVkXÿv§~¤º÷J¸¿¼§`PëìóÄ|(m~§2‹ÍbLMóþÎA²jg¥âÐ «o@™“JAP€j¹:qt¿ØZÚTœÊ~­ª#¸›ÓëÕ®è*1‡¹ŒÑVÅS^ÙZú„!€$ª$®Êܽ|_R‡õhG’cÍcÞSÙp©wl"ùôaÞ3U‰–ßP¤ ‰lö»pšPg)ÚÐ$O„¢³Xä±]riS®óñ8à‡¦k‚~ÞöÆî›’欵}8ÏÙó.-Ê…—?={gmœpH=@‹ñpå¡gΑ!3åÚ­4z¦{—˃4I‚âI9!@Ë‹ÌÜ£dì{IG OTE‹s·`ÖêøÎ ‘F¾zêµS¼:ã5AØw£— mYåãLc¹;•ûáÇXû|‹[2|éÖ3â^(¾ SNk²èµqpyö{‚lÆ6~œÍœÐ#ñ¯(tÊK¹Äö‘þ+¼H`å@ßu©t{5ú×\¿ûW%?X¿QˆB©ðú¬ìŒE;¿WOßWÈšÂâf>ªî4ÍÛî6àªÏz7uxZˆ AoË}W…Å~¿ o„ZУH¦*Ûí¬ù’°ö>±ÂPwš†§œÙHŽ8íƒv|#cМçÇ š-¬ç&Æþ3ÁÉ%_Ã:2œ¥Î,›EâƒdÎ^sP*Æ ÷tàÍ,%þÜF>ºÛƒqªàn%ÉKaÈøš¯ôm¡ÎT Æ¿½«LáäþrìÇ¥æVÃkÒQ–\ ìvëÊ~©:´éÉþˆéI¶I-Î1ÁÒIl$2eb\b3V_ýf"cN>À›jŽKôæ–.¥6ÁA.g¨Oöá&fʳJÂÍ/…Ñ©1EfÒSú.ç3lmãŸì@2üÛ‘l>F£¦›%|6#¯´VÐ:´¿¶Ä¾~¨%T:è5ÓéìNëP¢·ðaVO‡ø^mï ®n‰>²vÒæ¼A`«¸²†–­ÕÍ+¥ $õm´Ö|¹¹NËßÑxŒì•¤”×2RQÙWÁ¾-L4ŽK*û~+£ÄIæïÕ6Aå<ý!j¢ýKnhÄÚLµõî]oî­ÂËU¾Â5{ò„B¶.t­—« +¥¿ê76=.ódh|l™ÎïÏoö”hºu#±ãŒ&]¤JDO¼}*gè¥êfAØ@Ž…‰²OºÖ¥duˆ‘Ž›Õc–½2ŠÓIÐR™{6IÝanŽØÏw¾kO,¿·æ@®,ˈaîIY>/D×sG=X˜¶ ü!|'có“ÏâÛ®ïM›Y~x80C­ƒ\²*ï—©1Yb3ì:È0ƒ‘§‡_$FM'ÜŠ[eRpßïé³Èº÷azH)ÍâÛ#oýÑär )=‘»—“!­—QòZ‰&žÄhå“ܱu¡y¼MÁ¬Uãìk MÄ9DãCµƒžaøã›ÎJ‰â••lkàò3ÌÏóç`u–{M+?¨%ÚYal_Yr•©ú9ldÞ¬Èá»å 2²/~§ãbWìõŒ@ë)î³Øz 8êF>oþéÓÑKhÜþ‘N;ònL(ûõ‰s´¡-§Z¼eQŽóÙO*/ÓEo[A¼5È~ÿÇ® ÕØ77ŠŠ%Dôy—K6>…PÔ·ÈÖ\ÓÅO+~î†;Ç!˜/°t·Ùïê·/17öl%¥"l±›ÇSFÏóÇ ú˜Z,J —;Ðo¯¤”/¿Phö‚‹ni¤V'´Æ$©†ûSú.kî’Åé ¨Ð³QŸ¬?¸Ð}ð¤D}CˆQøñÌgqÉE®Wì²WäåÊñEÒ„@Sbh­ÞÊôÔ`¨Aîñ}‚³ò´]vC´Z]jÍ-'>ò-'ëÈï$åìɺc”Ý×%‡z;yáç^'÷tÄ™ÉG¾.ââ½ã=ž8m¦È š“(’Ê=ݯù¤ññ®…P#cYÝgÿ¡>õè““¬%½Ú.©oò³:ã#-¹ùÚduÞ女f÷I]£Ëô¶Ž'µžh…fá‡)rö¯tDÔ;×½+××Yùˆã3÷ÔÛNq‹”*_áz>ì¹5`ÆM,âb™t­¹[ö]5ÇÑÔË™~…ût{BÄ‚V;ôΓ–á|!Äh?äpq\ÂF8U¨IMçl-W´ìtì=€]:Ókö©…<¼îÍL¶w×sÕdv,OerÜZÑãcõVÜ\§ñYþá«2#ƒƼ‹Ï­Í™-êWùfÅçlýù³"_H"°”Œ§…ÏÌò³"8ÓÇÌü’”å voa·„Ì~¼žòÕ8K%îlï0 Ef±f¯áwqÁ<˜U.ýºt‹÷Cƒ1‡—ä½Êo·æêØõºàDªÒE‰W M/"Üã¹îaxJ 'oôõØþ@³1“²d½íó|YæµH¯ñB ?Ú–cR”7;:3bO!¶øÍmZÞb¯jmRfÓ3Àã e¹z0<óqѳ̣‘àì`²hâƒÑÍÚÅW…£Ò2wØcô<dOwí o 7kÅͨh"‹r9a1/½nÎÝmãšeÝ ¦ 5ǧ–²¼A¾çÒ8(ÆñíšÒšwêóëéâŽp«^c’fÐ/ÇÚªg:kì¹­t÷ƒó.>Íïs_¸¶Éñ9è§›tM̲Ssl—×ͼ£¥¤äÆÄÓ$Üå®>gÂ&Ub¾z_+‹CÂ}¿á¦1:ëNÌU~÷´/G¾»D˾ß÷ð,:Ùˆ²¬,/ A#"-¶æã˜Iˆ•.a\ ™œß*™g£US÷P¦‘ÞZOp»ÒÌhÛeµ®—û#k%§±ÔëVR=‚·»å™†}ÀQ·‰Æô“”\6ã7§4bŒvvKªBßyŪe—óƒÖòÞõ½ÿ¢:.a’®Ï¤ÁK®\e€ƒqÄ2 'Ò84€MàI²š®úUìUtÜX²×°{`Šˆ 2«2>}Bï4÷ë‹7Â'ðD­|/­î’}Ý "bqº 2zª¨lÅâ±nH{pÈ‹lp½›tM ՘㦞•›I*áyŠýŒÄ ùLœÃé*ÞsY~àðQC@E 9/»5B{¯u‚"ŸŒ[¬;!7~!áÂOö÷ŸÐ'¾·­BßwîÇòüTÀx¤é׊.ðiïñÝ`zq„ºyRÍ¡£ìøüËoÄÔƒØä³ÄŒÅýñqõüDÉ’îìê+‡<[ߺœ#Í¿TÇíT‚ Z7#))û1Ám‡Ïã›m‹:Œy"^ˆ†ùo@Yc¢¾H8¸T«+¸ºxˆ¿fÍ­0‹Š±Î¬˜ñÓpl >pó´ú¦6/] ™F_z¬F„V™ÈëFñŠîåg‚Á,‰¢QÙ1¾P“ð5ú’½òÅ¥žæœö]í[rºWÉ^K,Eòäl]?%;+˜WŸ¯†DÜ¥µ»j˜¶lÁ±yâŽàÓ£‰Ó›ôY½mç#×ìX¼ÞÏ6oŒßþ:)·ÃŽ_r‹¾bG¾BYÇGK:L*þiʵuà¡D-Z3ù‘© WŽ%¨éºX¢¼r¯|’V^‘íÀ”=p¿¤“M,Rcl$ Àh¨@ø‡ŒºôŒqâgý& %&,‘_¾7ÂXjðÁ ã£ÕáIîýÃÑ—t€ulðúFbŒó™´Sæ±w›U–:JyÈ10Üf^wÝÃúÂÝ7M¥#;èN)äyé•&\¶'pÿФŒ‡¢1ÅøÍ3ø2Øöj¾T®"à®}.žQ'¯UÆF7»úxÃÛn£€¸)S®M%b™œ+þt(ÄŠŠZ®ßøð3AhË­1ôÞÇ­Ú³Õ¤÷v™?sMÄiõú u¾€Ð…X=Ö AØÒ[ísŸx Ù×|‘„»¦´f9)ÙèERo³Õ­#îàО»­Ðt «‰¤ZÈýúýûUù›Máñ-5æXûÅÓÅü½›>¬—’…κ×÷ “ºÝD%Ûm,F‰Ìe²á°dzŽ4ÂQ/nY‚Q„¥ÔÚ ¡ŸŸH±‡DOÓŽn?œ«ªÌ#‰ l:Ý…½;t è}V)lì hBp,É$>xöYSã½ YWCzÑ-èHHz4jµ‘0]â'ÏŸ;è-]¹¹Bdøñá+ÐbFiÞÙ¸õÌYbÐ'ðŽ«Ëç#sÙI½›:Éfœ^íÚw)ï±L‚m”}ÞY«Ik$öàûYb>‚ì„s+HÝ•n6³tËžqì*/tYNŠ7áåW—Ñ+$w7­!4ÚM*Aa«Wš¤ü¦‹…›Õá2ð¾æ_2*_¼Æ@˾^­é8²˜:ûµ5B0rÄ‘Óv K'“í~€)W¶Íñ±ÑÉ*­,W Àöõñ¥õK¥”ËÃ# í"3啕ؤ®Ã%S9õCó/,+qˆ÷m¯ï•îkv,]ò³dšpÄäÊ‘‰Jò;d½:(ntV3Öê:®˜)+k\aSúž´ùÍ_¿Ìë°sEy@¾ázwnNÝÂÿ|²mºÂù0µÏü§ü·’‹ÄÛ×QKpïû ½çŠ‚š9Ñkša Sâ }úósYgäÏŠ˜·T=[µÅû¦1rÑ”sUúÆ ·í¹ËÄ9Æ üŽÞzº®²wÛ1¬äêÈÄ+JD·ó‘aìu$@]^gíò m×DçÐÊ8|*é2¸ &¯Ìömí3Aô¿³jàÀ{Ñž\aã¦ÖœðÁ·”ï£Å\¤IK•àÖ²ºÞñZÌ#˜mªèa•¡JºkåÈ;<ŸAj‚gë4½ˆŸ ‚#hi"“êØÛyÕF/x ¬nlo„ó7@ ÀÉ·3é_«tD›×ÀaÒBš®”ÔsS)d°»F?…”–QïÓ@ƒhkµ¡è²ékw¢Õ k1Ù\ã½ãGÆž®Á~wª/d4®èõ¢GÖnİcɾÎß q!ÍTŠºD8½^v=›T@%)-u+hl(ήoñêÄf É!7^~ý kÇTÓžšW@ŠÜO s–Õ·¸®»%Àw®<Ó5F=jæ]ÝOŒÚñó€úÞÃPÿd«Úì{»Ç¯Ûìw6z(¥ENµ‡1wòç’>UÉÆÏ¼¼ñTªé^Žþd7ßRYZi€‡­–È!|eÝíô íò‚šèÈ=>¨½ôµ ð® WVÏ y‹›ø¨W\«ol„=}S„a§ÅbzæÑ‰ðƒ;‘i/8¼¾½àz $‹ƒ—Ýo¤;j­®µ W˜yÈPs<œK¦íû8Ü!P?Oó-ŸŒºÏ—ì/øeŸ2Ë­ñ.Þ®£EÞ!n•ŒÏÒd*¶¢ ÷zË{<*þ]÷m×€ÖäG§N¤Á6 Uôâ0hÖ¡]õêˆþÔ/`s¨e>Nð“<íêôk¢ô'·oÂŽ§Ì¾CîŠ0òZ,ÜFƒ³¦£|ºÓ{Â_W†o§ ÁGš»‘öbL¢j¡ž2UÒᤡ¢"´1ƒ9.!÷låó¨íkŽûÙª`}¥tW¤×æÚi[X8*²ölä1í‡ÛÕ VIÏÑÕ1Ñž0‰÷$r,ϯ0óœ^z-øHK¨ÖËLU‹ [õØ ªèUâ n‰Ÿ8º’êåù:ؾ˜KøÉ·¡;[ŽŽ>¡Ñ%‹Y~;*ÈØœLl´OÈ(&åœØ±yE¨Á¥Ï¯D|ã¯2ÈaÿjÍcå‘Ì›7àDYÅ%Y¿éTý›™`#úƹ@‡³ÇÑÃnLÖcÔ;‘£W²ž©4òݲ[%?ØV{m¸ß©þ¨/yÞ©Ë3“Çpn7z :²¤²x÷tg}ph&}£•`ÖP»OyP >ˈ/yŸò…R'æÊ¶žz~F¼ÑÜÀ‹sð°ó£ÜPð--5i}uÅS©s•ËÁGÖ Ç·ŠÆöW Vžð·¹oû3 >`EØ!¥´J¥S WY} B‹?÷ÙãL)°O …'½2M`ÕºòOiBÒÌâ”T=°1uìEûO³Gí»ž> ’©_%³¢’J0Ûr¹³®“üÙ=?ÈúD³fW¡óeû2 =\¼}AæÀÿŽ:â©åûï†Y”/g¾›QOï®áöFb_/¤u¸nJ±-M›dyk\‚\п®st×ÞJ>˜"~F|¯jÉOøHÕL‘›Q7q׺ŠanuØZDV ^Æ TUñ ÿ¼ÙÄ÷$Êåõú‘úÌÞg_px`Evn5Åg­÷/bÞ~5 EZ«!žº¢¹ m$;2’^žÉÃòØ–[O ÕrЇ8ç~”¥)qsžf+Žùìì–ã™ÚïhdQnCÔ€ÖÒ'¬cBª­?¢U:İ[ ü.ë"¼AsB3Òßà ˜¡¹rT‡Swýˆ÷éž>Ȳ‰›é…Ý?’šl™Iò7¹¤î³ÙÜx ²èy¿D.ËH½[m2ó]Ð9w‚¯œfoÜ Û»[4nGú&ª€æ9O _P«1tŸ·~`-“™J#ù6ð”áÝÿ?r„a endstream endobj 832 0 obj << /Length1 1574 /Length2 7805 /Length3 0 /Length 8854 /Filter /FlateDecode >> stream xÚ¶Tl7NIŒ–IH³ $•în ©1ŒØˆ‘PZBRAR:¤AD@Z””’éoêó>Ïû¼ÿÿ9ßwvÎvß¿«¯ëwÝg\·ô åíP¶p-Kµ Ä`°ˆ, àâ2B ]àP×}¸‡'…”ú/¹¢ŠÆbJP4VM…jx¹!"@ˆ˜D\  ƒÁ’ÿQDyH• Þ; ¶P…„{¸Qn~G46ÊŽ@/")).ðÛ(ï ÷@À H 6íwÅF„A]€†(Žöû— ž{Žh´›äãã#uõBy8Èð }hG Üîá ·þ*¨u…ÿ.LÀ4rDxþ Qöh¨ˆ\08Òkà…´ƒ{±±†êZ@]78ò²Öà_­B„ »ûËú—#ò·1C¹ºA‘~¤Ðáêªh ¡}Ñ@(Òî—"ÔÅ…µ‡zC.P[¬ÂïÄ¡@y} [ß_ÕyÂ<nhO!O„˯ A¿Ü`›¬Œ´SD¹ºÂ‘hOÀ¯ü”p¶ë~ ßcuF¢|˜?g{ÒÎþW v^n c$ÂÝ ®®ô—üƒ9ÀÑ@Q0,. ÂÝp_˜#è—s#?7øo!äŒÍ?ã†rÚcK€"ìáØÆê ¢=¼à˜ÿüû€@€vh w@ ÿxÇÂpû?wìä=¾À`,ñ @ð¯Ïß'K,·ìPH¿Ô¤  £¨sŸÿwÁ‹P¾@Œ °8PPX „@„…âØC࿽èAeþÇViJþIÛ¥ÿ$ìý×ôyþZ ^à¿}é °Œ…yþ!¸X Ã~AþŸiþÛäÿÝ¿¼ü_þ¿ù¨x¹¸ü–òüÿ¤PW„‹ß_r,_½ÐXîk£°€ü_UøŸuÕ†Û!¼\ÿWªŽ†bw@éàòwž*_¸ süC•?¸ñ¯sA áz(Oį(ƒÿG†Ý*˜3öÑðÄòñ·Ž]š‡TFÂPv¿¶KXT õð€ú°#ÆÞDv í྿  !Qh¬ [^ Ðåø5O¬èOIXø7"Á"î^Ø9ü‚ìXZÿ c”—Ç?€8„Äæû7pGBý÷ ¹aߤ ÜþŸPw ¡ÿÊ›:Èî}rþFî`ì2ü}Ç¢=àÿ•6Úõk ÈîñøWÇ`^؈èߌƶó?÷ßî ‡¦'P°»ª¿=©”gö\”åZ1IãÄL{´xQ%ó¾Î™÷8’Oîí ú¼¬Ìs(7Ãv‰Ù|SKÞ”¨ß|pa`0²Ò ˜¾ñaèÕ¦|M+ ‹ ‘ÜjÀ¥{Àý`gü7¸m\Ùî^z¹4'>ïU}kºJfûÃ&VôW_‹i’^”||jc\8Æ•cûrœ-ÈJÌw}Ï—rìðhôzÖЛF? pë©H>Æ|A8ötÜÿK™‘°g;#'£9+þáõþ‘Û…õ úILQþ\Þ˜…WA¤ÈçvKÕ ‰%ñ{~ˆ‰*Ùü[«‹Ç[m¤}HÕˆŠ™”W«—¥+ÜðDW×.À‡Y=©v0¬%×ë«ÙÛ.^‰+žÔ>§[‹|¤Áq‹IZú;‰mÏ#zÆ›Mf†Mõ€1¥âVˆœMŸ\…B»6¨Ëäz“™/Í“É~ Qü.  ùH”F†¬+ï‚Ä.Q@ê´î 3#ÀÞeˆU.Àžžé3É~„³cñ(ž“®ÏzËg÷-<’=çÛ‰«Ö²ž÷ÿì€ÝdODÊ Ž›D$òf&¦ŒG³Ñ´3 ²â²„ûkNi³ºV± äWågì]L‘ð[m4NxË×¼ ”û~ªú²•x³lm›6¨ûÊãõþ0©ÍzEÔs6.ã;£ØQÒ¶):Bšt°{Ë'gÔj#‘ì”vê}þ”wþÁÈÁ¼xÇ÷·£ÍyIJ ƒÈå­TÙX¥w¸û»”ê—OKYˆks²‹ˆ}•·w€œ‡ŸÓžÞˆÏåA½]¬H 1ãcøu„Î.ëuÉ EDpKg7t«kœ³tì-ûÃÙ=Ý!•ÙÂ!ŒÈ™´òÅŒSÅ&ÞÃ1sœׇšA|>ÁM²?qn¼ZßáH©Í#,aº{¨%¿ÆûBÏ‚T<"ð³U«³ÊNÆT·ðYTNRY¥o«Xá½ûVš.ølƒþ÷ãüŽ+^±+çKPªRä¬v}}ßð¾U!©…bímT§ašM¼…%ÓÕ‹sþ|ËLNh—)·ž¢SÒŒ*‘<œ iÆÉh{^R?98œœ¶KA™5¹É¢¶ê0iAÙÉ/]Bí·{Œ^éëϰLÙøIúÜ8puž#Còã…êKß¼QÉêõ·BèÑyöIûÇ6à ] µµeæ<“k”l1k?ÈÂd=¸—P v»ÝTi×c9²j0ùDæk)%ÛÛĪ]²ùbéEÏ{´xá> Ÿ;Óø=Æâak³™Ù"OÞyÒSnÕ–I1^ŒZ€›¹Ãò7‰f1î"&V 8ÅÜ/¿ð\Ò0˜åãô8"Á&ï Öã eq¼®Ÿâ̼'»ÄÛJ5ïb«¬OŽˆC$ k—Ç?JO·4Îdw§ñn&bê<_K¯»Z„‡$·yQ»X©:êô°MÊo.ð°¤Æ{’û4Ÿ‰Ñ%N³TØži‡s_çûF\Ï_RÐ%¶"ûueÙ&Ÿý“‘YùœM ù9$“®|±%4aàëªs‡±Éy~•‡LJ&ý‹Xû”ª¿-kvuÑB'бÆpµŽW;OüüÐír{½í÷…„iµM)s ÀÅþ„Z§¾n0%G%ð(ZÔDÁÏ *0ÆDflTØ_7Ù}• °ð¡{eh^ 3{&ðÉOõÞ ÞÏlœ…2ž«DsÛ‡y„×À•frE§M=E¢gÅëT õ–Ø)<š~¿kk!Õ¨aÅÚ/[¡lòÂÒí §²;yoß±DPWÞ9X÷ ÕŸ» )‘¨þ¡T#±»YÓ(Ûþ;¡_ÑÇðÌöŸø xc3W ZC ÍÛ‰ZvæÂa&?Ò©…6ïƆ í4[q ðå³ÖÜèSšØ5—­Ù~,þ8Ö²‡[NÆG®tOoÒçdy¹@ê¯ÑJs’œý…ðÛ3Öï´JLY²zÖW»èaTÎÀͨäx­(nXIÔa+ÎáÉg–ùðìhWZCBÚw‚/c¦8bÉî>\z`Á_™ÉN¶9ÔÉÉ¡ê‘'Ž,{o…ƺîO|Qáïó¡ù’•ú•×À”’ƒµ±à4W2ßÓÿÎwÓHöjÛ%J|-L& 'Lå‘N9΢1wú‡˜lý¨±ô›#–SaæI£dÐŽÐvi(ðq[sr@‰u×Mš=†ùøÆŸÎC<å*W®ä²_拎È)»NІˆ¡ÂTÙ­ÔýÏ9‰·$üƒË_ÂÈS’iÓJâozo(]4ŸVüàXy}8ÛŽR>×Ö‚ÝŠ‘%ýÑÊÁï§+Îù§XÅS>Z“6ëû‡¼$b@(¡žeHdg#9ñ…méîw¦·š°ìÖÑìyí½°ÚzcY+.ÌVÞ¾Wð§]i0T¾Ñ,Z™—¬›95¼küQJUîNVCebAùó#Ý÷¶,÷(¼zz½yœè{‡tޏËuÝ‹ޯţ)•mqBºV›ÌEi¥™e:ÓOS‰žïuMdОäqÐ5;^7¯Ù’~?GJ¬;.ëBÉî>ÇC9¢ôM7,üÐËùÿŽu Ûlw&G1N¾N[ÄX§”(„ªÙZq¥lZáÞ’t©Ã¦¦.tm¹µ}+|,‘ÇF£¯|’QR(¼Û ¯¯ÈBäDTðÝ™ªUslsf:tãQICùDÐ@‰Ws”F•“ÒDr¯GÓÊD\ë —§îS›³Úº„G×Cú-EPÌnBkâ'¥#Ë·hÈZ‡A:l€ Ÿl¿_«÷J!©?_ºo‡2zc]ªÌV¹®e®¸lûbj0.ž·Ãë'K½T\, Pøv$7Ûÿ¢»ÓEp‰Ë—‚¦ÎdÁkíƒ^»QjvJ„84{@°2ÂØó3ÒVz u2{£±ö4#ú°ê¡gæ^ßÀJÓaÏL—5%b /ÈÔszFäEµy«Ž<¡ýpÅLK€CùÛOïо‰ËF ÙG”rÃ÷6¨¯\e‹w;¿Xêh¼m3ÛI¥o·2‡w×¶i6˜î=Báù¼ !›Õ± +úùùœBÑp/×Ív¢o´­çÊ¢gqÚÅ ,™Ï3º­a°«èu›ä¤ô”£Þ:˜ÐwxSãüñÆÒ¨ ê%Cº¿î ™QŠ¢å*b¬töáÛ9P“Ѫ® \ŸÚ£x‘ƒ‰!¼‹»øªø:Ñc›Âðí»¹Å/}ÇΑÂfj TIñªœ›ÓïÇSuëd4ùƒÉYøUf‘ri~Þνš4™¡¤˜Ù˜31¿F–ìcѧÊ=7ˆ¥-ˆ_3zɬ{ü"³ë±z”ž²sWeø¦êDáwîËVV©ê®â<;º­¦áCÈõ·‡–Ey¾î 5qøE“'¢@‡ÓÖ-åÑ'·†{ƶ‡`ŽÞ„b5•ͽÓîîϸfôq¯{† ûròÞßøÒaTÀ-ÑÜë–üÊè™\ –|/M(I I<Æ=¡hk"’,ø‰¼ÍéÜU ¡™óyº–¶èË;u“Ú¶:~Ëb»mر÷ÍÁ@ª¡-þ:9 ‰—ù¬v+·bµuîOQjø† ‰æñUÊbq½t×» Ÿ#¡áÏ®ƒEÁÖ?HûpåÜû{}¼w¼ íŠØâçÚÞ©ÆL§ní=ØÞkµ™,ˆŒ{·ŸÄÜ Å¤l13±?ßDŒOÃæ6ԜӾÏJƒú•ÈQ¶ÎÛžV|Ö±§ë5 hÇY‹/7v9é]o›;êÝ%ª©ç¨•WS­gëê]¿‚[Ý¢½]€qÀi]¼5”J1-ß‚ûN­àÝŽÑCÊ} Õ{•›ý¦ä 7àŒ Åͧ’ hh1l¶ÐhêYÊxYÏ2àâ¦õùô€è*i?z1×u`fË¥oÍ˸†¦êuõ)ˆz’²ˆ¤ V©Â¦VǘQo;Ñ7Ã.EåGpXâüø+ù¡Êtd=‰ü…£]YEù=Û::_Sn¼_l)ÿѨ¤¾ÖZÎ5¨žŠR¬eQ`&Ý’ùqB5oYœ„[HÁƒp ŸÆ>žRöæ·K½r¥zùð_z¼ðÚ ‰’N+ªc÷PT@z:Œ3=ÞËp=BV—(ûÏܳ­,…’þðóŸ_bæ¿^ýså?ôrl¤r'1~}'LúXªª¨Œ~ÿôÕ8E«ýØ€ub¼Ùæ;°©Z1×J~íY5|´Ï6p8æ]ô81Oà©Ë£ïgÞBƒò.­|a "H &ÍvèG2¸³èE4,NòÕ©`ÙâÕu|Ç7$Æ#N$ùj¸}ï‹ã’ÔµBô'.žæ8ò®?Ô,š½±\¢)C ®CX/“óÙèK‰¾%ÔÞÊ|±˜p²b®ÓlÜ}»y‹cž\ÿS ¥beJ¦zàMÐ*Šù˜IµÄ© ¡AvøJf4ElK¾Z$ÚÇ@õâël¯ÑkÒƒì©]GÀq²ö’nE®ñ‚bþTƃ= xߨ҄ÖTír×)¢±1Ék¬ÑqÝ!¹7;Tä2:Ac-Ü·dRçTÒl§­ÛÙÆö'jÅpÖ^ÌÜÁÞÙ2O:$ëŠ["™ûaßkð$\vžl%¹`ƪO(׊g™~X˨'옚4Ù á5ýî=Û–hè½ÀߟæoO¼‹Ô̘—lÔ ~GSÁG[jÓ$øBöˆ¿ ÿÝ~jú.C…S×pÿ¬Úþ´EÌñ·á}ÕvP{Æ­•ÖMùçûöö2PQ%E*Îb±7K.ñ­—Éõ|wvA9|4i,ËœÚ Ì¥?]—ì8‰j‹8¯ƒcà«.âPè狊r摋禙Ëò=méï¤Ûô[¾ÞN Hô[†´ñÆ‘f^>ɲk#WirV\-à@¦4DíÒWàªU‘gL¡î!)o±-âx‡1Ï·Ïgêt­ÈY´pá ƒ+ZoÉtÒpšJÀö¹í1dùYÈ,ý›Õæ:$#ú,ÞêÍŸn)…½±*ï†hÍAú[<áÄ¡ªTlU±Ýý᢭ëÿTˆ­©o)gO}ö5N¥D£½7Y©àôà×Lf¾nð¨‚Ñýgôjųfôüín†€ùÞjW·V F‘°¢^³'—Ð\O²/Yu|†úfZM zÖBÔL®¿×w°_Úìµ²1SÅn=ðíŸÅàù¹-¼³¤2éþŒ¾¯Ou¯x ÷¹Y½o•{Îáå3|ïβ-•À5W¾À·òŽ': ˜fûƒlåGrö:Ù 9B¬6vì]u¡×ŠÊ:«jp ¯”:Yw]s™ÇÄ&-ˆˆ †Ó¸”ŽÉÒïM‡Z>Å#Çíªýq;*òãÍ€º¡ös ÝxÕ.½+)*©†éëö:Çþ§Yƒì¤‡gÅnB¾îWq8qPÊ‚Ìx¤ð-'ÆçE9Ï>Grôí¼ƒrŠÀÚó<ÓF¶®xwŒðãýfñVQMϲʄø•½ýU×㇘֜ÛaÆrfë‡ßº}s;WpqÝù¿ú¶qíÚ°‹¨áHH¢ÄVŒVÙ|G‚ÝŒùwûœËã|f÷•Åç_‹$Ö GíFã—Ý%3ð­KÁxqãŸ5ªíÈRqmèUv4|Üq'®ÄC½¼:^¤®“pÖw+lùÊ#øA…rÒÒÃÈÔË=-ºøäSv§|…úœÐE=58¿­PóRZàF¬É'5©žàKƒBº ^Õ.ŸKÁ+âE©ùJX냠—*‰ÔÃäUE×W-ƒe{(ÒT¹-o’î ÐÍæõYÿ´T²#ÜÍ:Š“UæŒOñ¼&,l“,µRÀôíò„[„ÍkH‚XÑ~÷i|u7­í[暯ƒüúò}ICê¥Ù>U܈6 VzšU¡×È(Ô-Ì_ƽiúªÀ'7ÁªÇOwzíò&ß:Zò~Û©S{îÏÌGh^°4·–±A¾¹1ãâì~qÊ ÆYòc1'u Å…'k¡H^ü”yÉǦÝ›zך.ª/zðkïÕŸËã6 ét;“ÊZÄ̵O«6ñÝ•ó¯½æörSÏm‡ýâçp™Ó³ˆÎÀˆ9ŸäÈ©6\}× ŒšøÔvÙ÷c‚sœÖ›±{£«\—àSÅÛ±›¶F§¥ðéÜè{)ŠÅYÝu·†eÓ¥Yr/àtN;ü¤/ /YúѵAîŠ Ê9·‰Å6lÆéΫî ³]{|š×r|VÛ(lî·ÆH$ßöó¤û‰ËƒRRâïQ_+¦ÄÄ8K0ÊÓùâ×Ï¿ ™˜›¹ÒH`I®ÒëY¨‹æ:™|™ƒRÙc°ð^)û|jâ»»¼ÃUõãû¦’7I<.îl­ïçO¯¿Ø¥ð¢´óí½¬íÊÃGïk0„Ñ(p1âNÀYj·q#¿ååÃÅB}¾…[g{¾¸G[v4²ÎófÝh¸seј8Žâ¿V”´‡ØÔãíoñJçùù*=~Ò´9f7¹?ë„¶´úãÐìO`üÄË'jð»ËóB✓î6Ï®¨’µ+‘ïgü:•ˆå9-.”çÛŸ>¶ˆš,ÖËÐë2'—ömmŸkËWòúñó$¹ jÔ+7ÎJñqKŒÖ8UZ»)yjµ5ƒqb9tw1B•CWŸ£úãÔZ¡«ß.£X¯¼° |`Á¢±O}¿õ,ïèÚm©%»_¸X ³Ág BÀšTÛØÅÂ)L޳æÙ³MºùÇ"1´ç†ÚÎx#%úÝA|4•“³óÔ~µùÑVáVZÚñüNï»Á}¶Œ£ âñC‰z«r¼z›ýÁcIÌGKRŒq‰5qmMùdU¦óžÔ‘ 4qrc]¢ô+ñÿc©0B endstream endobj 834 0 obj << /Length1 2216 /Length2 15700 /Length3 0 /Length 17028 /Filter /FlateDecode >> stream xÚŒ÷PœÙº ã.AƒÓ¸»»»knÓ¸»»»»CÐà‚÷àîšà~™™}væœÿ¯º·ºŠþžWžõêúh e5S;c ¤È™…‘™ ¦ Ê `ffcdffE  P·t¶þ#E Ð::YÚxÿ¥s9¿ËÄœßÍì@Y €…“—…‹—™ÀÊÌÌó?†v޼q#WKS€#@ÖtB ³³÷p´4·p~?åÔ&4.ú¿Ý"¶@GK#@ÁÈÙhû~¢‰‘ @ÍÎÄèìñ¿(¨ù-œíy™˜ÜÜÜlíÍièn–ÎU ÐÑh ø+]€¢‘-ðïÄ(ê–NÿˆÕì̜݌€w¥ äôîà2:ÞϨÉȔ젌åÿ1 ü§4F–ÿÒýÇû/"KÐßÎF&&v¶öF K9ÀÌÒP’”gtvw¦Lÿ24²q²{÷7r5²´12~7ø;p#€¤ˆ Àè=¿ÿdçdâhiïìÄèdióW†LѼYd*fgk 9;!üŸ¸¥#Ðä½êL·ÕdçòúçÙÌdjöW ¦.öL K Œø,ÞEdæ@g333 躛X0ýE®îaü[ù·ø=~/{;{€Ù{ @K3àû‚—“‘+àìèôñú·â#€©¥‰3Àhn BøÃþ.šýƒß;ïhéÐa~<ó_Ÿÿ>é½Ï–©ÈÆãùßÍeú$¢%'&N÷wÂÿU‰ŠÚ¹¼Ø8 ¬Ìf.f×ûƒÏÿfQ6²üOÌ|e@fvž‚}¯ÒÿìúŸîSÿg1hÿ›KÑî}bê?®ËÌÁlòþ‡åÿó˜ÿíòÿoºÿbùðÿ¤‹ÍßZê¿Ôÿ?Z#[KÿèßçÕÅù}öìÞ7ôM?ÿYW ©¥‹íÿÕÊ8½ï€ÈÜæ¿E´t’´tš*[:›Xü3*ÿÈ5þZ0KPÙÎÉò¯ ÀÀÂÌütï[ebý~i8½Ïãß*àûÒüï#%@&v¦m+'ÀÈÑÑÈá½ÅïˆàÅò¾†¦@÷¿'ÀIJs~w¼§ç0³sDø«Ÿœ&‘¿Dÿ N“èÄ`û/z&É?ˆ À$ó½³ÈýAï,òÐ;‹ÂÄ `Rü/â~çTþƒXLªÐû j;€Iý¿ˆçÓèzç4þƒxL&ÿEï:;›÷òþ„ý/‰­íÿ¿êÎdú/È`þaxÏæŸ¦ÿ·.é\Þ'õË{èfà_ÈòÃ_ÐÎÅñ_æï¹™ÿ ¾‡dñ'À÷bZxØ[Aÿ²x—Yþ ¾Çdõ/ø^ëÁ÷œÿÛ{Alÿ@–÷dÿÅü~1Ùý9ûÝöý-õ/õ{ìöÔï¾öï¯ ÐìO=ØYþ#uü_ebÒþ}¿íþUÚ÷÷$“ÿà{âÿ* Ë{–NÊöºþ« ïæNïwâOxÏÛÉÆÈÉâ_ï‡þ áý¶ar¶pþ«›ï8»ÙýËáÃå_ð½v®ÿ‚ïõpûW_ß½Ýÿßé=þßkåù'¸w&O ã?Gý¯5qq|/–óßwêûBÿþûõºM–ìLø‚­‚;ïëDðÝö&f)ö>¥Ó0x-9v¹<¢À¦ÐÔfn8ÞŠ¤Œ|ÿ°º#A}#¼LüâuÒÖÖž¤Òñäýl :½×ðs {p²øD¤q€ž€A]xßûÅÁ[3À² ¼G–"ßÁ…E¹ãÞ­_ʽq re,taOe¿–Sñ¹r†!F#Z7 lŽ¢À8g‡Æ™ŽýÒuîæv=oòX6Áç4†­ÄK{“5öaÞs­ZÕé.9®6!ä úØ4¥—èaªìÇE¯ò’ DZ´yì®ñ-Ûd›CjÏ=EÕ{Ç£ßú”“¼Ô¸8L˜2QÑíÒ‰¶e$‰0ì9—«²î2¿¹ÚŒè•-ß”l¸P ú¯Ì§Ó»œ8ùöS¾+§ùç¤5µÖø8£»7Ñ“q•dëÿ –{ú£Jæ7“Àê™oe3qÖAŽô¶£ Ÿ4<ïµ{‚2“òÈSò›|þï¡ñµ{*'ãuüŽ¢E_¿4|oåHûlE%¬Ö/5"ãe77õ¢ušƒ;}¤4ê ¥“úbh¨î©8Ôª;)ôßœhè¤7¢øvlÁ¾Ó~:”Îî" £PŒéàã¦2¾Z†“‚ÁˆÑîKù–d¤sîœÝÛw…Q¯¡+”pùcdÚŒ5²5wô×Ým™¿û™Øa_—m{lסU‰Éˆu¹ o+Œj%æRH¤¥ÄFû‡Žù‚‰yü§ÛÍóŒúŸ)ëÓWB âíÖñyœ‹‘Fû:ºÚ÷j¹­º=qefWŽÄÒ(ì:fŸ«b3•@Üø¿UÍÉRùÄ;SGñs§>°&PËÒ^y/M÷ÂIe'•ΟeŸ`nZó,7,a^= ñÐ^Ê™†yèèŒÙÜÚx>ÅßsAøä,¯PÐÎN<ç·ŠÚZK^Çg+ð4<^Ôí¿9/>µÆFü2xNae/?0âœq*O ;À&™SÊY.F“¯7ênŠ\Ù;’Ç»q$—뢎Úۄ燱¸ۛꜞÙX÷B“بžîºþöb6pAï<4 "ǃÑÔ¹x‚I’Ö~ɽ“«}rÔu»)èLôs¡87hÈ”DÖGl‡(ÚK8ÄL™Ë 5ëJ§`X\iéiTìÜŽT„˜@u¾êço slzÆÙ<÷,ÚßMŸI§Æ¸úÔóâÀIL‚ Iø‡tߘc#  ]õ.ß2“†LÕ9¨+ëÉÃèúw#`ŠŒeÝOWÃÌô+Œ'Ý(Ħ„ØUç¹Ë·wGEÌøºŒéuLO/ ƒcòL1ŽT ϶eâG 1Ù݃æÊãë®~¦—D/éYdÍ\B¢9Én¯øò±§¤iÀ×3Ê=š³§ÔÏ6)VëVR32ùVLBÉ]6ôÁJÒ¶4Ø‚Wk¤ ²€`~*,Š»9hˆ0jù(ÕkǶ9*Ĥˆv¯|(´l¼·1f£Yýê}7&\Ü?Í€VH`u"b¶Íóµ[óÙøº BýiÅ´Á ‡äH³³=}Øpã©í:§MÔ, …bFІX;û4 U óàú¶bÓ„á{t>¸^§Ãá(æã§~éjk%¶°We¬ÐÎkž»uÖÛv ߯©t‚i9±´\‰JTCæ=ía{ÇÀ>Î@?ú+Ñ,DòÖýÓ#JLWU××{§V-’N†¸`TªsŒ—‚¸å R–¡Aú«v'÷‘¯2jEiPYýÙ÷èšo¤úgV\{lÙ?\5a22¨¡ ÕõÏån ­…¢\dÎ&2nñ™zÑÌoÙÉZ|„£c¯>ŒsÑ€G¤m¨:„Øâ}´M*áã'¤p ¬'a@(ÙáÖʧ³§d¿µÊÀÚÅm¾UÒïd©/Q·wÑO‹Çìï‡%ŽÎ\A¾v'OÿzFgfs½ëž˜€[°ÏÕ[+°Ë¢Æ)ˆéˆõ¨€æ `ßÜ`Ö{CN+×Ê+]]%Æ8î…gÅõƒl7pzãp¯Ö¤ÚÙ€±:`ßÂö>Þ”A#ÕuRc|„ëz˜MZR‘p1£pÿ~HmK .ŠHmìèðÙ×\o¢JšÐ|h© §Øž+?©°†·^qIE˼ó,t~þsʯ€ kjo¬©ïw~jELãwÜFIšÃTvË®¤¬±$Õ§eÖ„*BqW•4û‘)攲äçÄe˜hþs£ô›C+VjzX”?XN%¦Æh‡iWF´2icã,+mÂ~«™)&c¤y9hÀ×RA mšB݃l[½^Håúů Áß2áØWÔ?Ç¡~äÉ|Óòa·ª Ùôp '£ihôWt3•ˆ˜´ÓNa€Uˆôê²ò)Îz5Á³¿÷p|†úÞš¾ÜmÔï}™(Ap2þ<«¼Äùµ’“-xL†ô¶ØU–¹§öÕ6·XÀÒm®Æ×ö㋵·çó°aN œesª°†2zae¯s ’­]†E=Èè*ë*X¤OåNŒÈÇ’÷"22Ýì "~2&®Ó£Q‰A[´2ÁÆÚ[|Øs®Éà›Ð_¾åæ=¦÷ ohx”E•bÕùôE¼ÝK|€kµƒ§÷ŸJÖ=÷njåz’Å*wDw-UH¿80IŸ‚µ‡ágãôÊÖ¹()ó¦.½'Mb˜v›éšÝrR±'@1Ëh´ï.Qã¡ ú"éRs±öp%å¨_÷DX([ŧbǹۘ VñF¦\(oþ6ÛÒ®ŠcÂfM9Û¹$›ŸÄn;|¥óó›NÒ°…÷„a6ÇîÆlópLÑðÍüÂ,s ÊüNžùï]Ü^7ÐV×Q§ŠH 4²¬¢MÊäõUÒEóQz»†* à´ÃÞëËÕ½ÍEQSƒ“(B‘·»´>d| ïŸVÌÅ¡6ÿ0£–Ís,½iJýU:<=…Öœb’å·fÙ•‹8BºŽïïî:'%¤½y-‡ôĤV¤Îè{ª„Ì0<ϤFƒé¨œ±J‹Lc¡É,ßAω‡Ã4v~r ³‚0IûäÐ}çì/¤#cIÌï`º5[ôÙíüöCfSÓ*Ë`pån¡Oé ˆÎº¿ þtV. yŠî٩݉Žú \¢&e˜….T!éÌ·ŽbÊ®*nŒÑkP5™v†B¼—~¢±[ãx}Iy°7 ¿Ô &Y’w¬q-Þ  ^ÇúÂË0èÓèóbû2>§ådÔGì#3çWWRIleî oÌD:HO_Å€î:Q¿l´;7³kØ;Aާ­×°hNÂ*?‘åLÙ(ª8/›r ¾ [²•V"bSSf<6ºJâ1“€ÊíY”é¨9o–Ñ~=¾}Ôæ­|dõp¢ºöiŸî¨µ€Îã+/Úëø¼fX%ýŽ#d¾Òoœƒsý2£ Ѷ ƒîÂW³+?âœftzXÁ:#࣠âÄ–ŒSÓéŠ,÷ý:² éF¢ï«–Ah.>›9yÑ_.£Ï­l:1““Å¿ Œ@æÂùD,µ­Ò²D² móTŒ8rÌ\Ö&ñ«y|Õ5ÖÑ<µTîÔþ¦ÌéÛ¢–?#}phµÑUÌ|íþÅ;^ý¶w–lbx%zIåA­ÀE¶tGìwi+§í¥áoçi`Ü#†n>IsOÝ]çëu'¼JЮ’Muxø^¿q±ŒÒp-ÆÔÍOk •5³žÍÅ./¦…`Ä)‚”$XPöª2ÿB_¯MaÍu©Úá­>kŒœ[˜ë܃ŸÌúÌ’@spPªÜg±>héÔhF>u’](!h”ÁIa÷%›¦&½Ðkcæ|¶±%JžF£uØS£ÓXÓu(À!¸«û£¤>t\´ð bƒ•}„ôB’¬x].»FþM‚Vôȶ‚`Õ ±pÍ„~¤Î‚>ŸÌ¬Ã╎hCžƒ=?Åãé¨G .†,6íJÍ©56„n öÚª’¢kpxkáiñ°ÏÑa/O¶.' '¾!°µ7`åÇîìôiÚ—ÃU45ï”*#,.ÛmJFQW9ž v/ßñZ*‰ä6»·¥k¢gc’òYŽ,>Z‡9B|“ÒCµ„ÊJ´ì³ãP*Œ€:–.ð Ë>ë7|ãºjé6rÂÕ?(> «ÎÁî®_QhŠ_UDTGŶga…Îì·yœ‘„ó1c—Y2V·¤S?ð4¬n?›Â“”%3óÅÅ¥2é€÷G] ’9Øm›Æêå( ~ƒðd ©z«j6%¼/5ÿdã ò‡“Ÿo€ÿµ#'!=“¥ëkC…ÿ†2œ8ŠÙ¶õëbb/Þåi‡S£X:ðìw.õE´Ô÷]Na,"çY‰ð):xý¼ë?pÒ§)da§Êá,´–ášßߪý*LÕtN÷ÍÖ#cW˜ˆ×>wkàòΡCÃÐcu®àÕ—Rx¼IÑ™/(:ÿõ^r¢ñ2nùÆî¤·ç3]¥ÜàJV@\¤d߀sˆg?S‹§ªµ¿ßƒž'}®MÛwÊ&DýX¤*̘7§~ÊÖj]„‚°&Wº"W­cŒö1ÖGH™/ù(§0¾y×xæA‰N÷¤Ôö{*e·ù¤ª*ߎÊÔXÜ#ÆJéŽXÌFÂu¤»õÜ)‰ÇSÐü¬óÒÛ9$žË©ž=c%mÓ3ôj".WmÕû¼&-2Xüúµ#Ò©‰jÑ_\³•¾áñXOâàf±ûÙá^ö*¿ùÎ"UÖçÙðmGÝ­5®½Ž² 6^{ÈgFÆ’˜]¶È‡^—Ip-¢ñMЭí¸eçg2”Ði)^…jNÈ}S—ú<¼ŸëbÍI<è¸i^Þn”íì ððá@A öUèÑå€ÝׂËÈJê­Â |!5´x´h>£îŘû§7×QŸßá±F z?¸È¬N‚ÂgŽ?­c)ÉA{saø š¥Ã'̨ÉNS9qE³|âÚ]?NæAv²JΤ›Fvž/c³¯7ã›è;ZR_”4ÞÔj5ƒx*r©2)%£É.5&·„5£¯»z¡€Š4ëÎe™?´*ÇÇ>\çö€yoÅÜìƒ sf7“ÇZVˆ½q·Ä¨”Œ_ô'e¯0ìÉ+[^¶yÃY£Ð|윰‹°BG€/ˆ{Ø%ýlÇáí9dª%w •_…s`·°ûÄÑ€«Ý• ¥­ë§u_¦ÈøùãuOŸ`¹Z*vP"x?9ùÔ»ÁÏ–¢é†_-z—Êž zT¢úo ¬ðÒ»›Ü}óÕòc¾VB.ÍKit—71ë/8áQ¶¢â2*O¿ÍdA†à¶>c¥fÓa©U§\aðk/¤„ý¥õ¶‹5Ò½Ô¯åÙŸò ù¡ÿRƒ"ïMmã¢SUÞZÙ4ÒÓÓJî2êE9ÿ©?3±”«©¦7¥qH7üŒÛ™<C™¦ä¥¢#ßþáC#ùÇÆ¬Ì =4  M#d;†°ÓÞ<‡»ÛiwbEr[H¼A/qŠÑÆþ@i”âo³ëó‘ºC¢0ž6C»ª§×B„‹Iu.Hs¤m)ÿ@â åéSPõ*E¼‡k®a‡"d YKé.nÕ³FD’›Ú]ì÷ ª8ʯó¨ÙQ]CóÓâ¡Y{yˆ;ÓýI©$&…M=Ÿ"&ö¶[Û+BòH¸nõtñöZ¸ÐÑùÕ€¸þ£etì0X¬œíë§ùŒ(­&ß5oµi,qÎÑ,+ê󨾾>)„¼‰é0‘è6Ñ|-ºa€Ð¦¿°Ñ è6suš@ádHßG þÞzÙËg_” _Çݱ¦"Z…Š|°hau£|÷Lÿ¶N3UKGùÐ6Ãw‰H•Ðt“àŸáý«1ÄøÈâ—±Ëñ CO¯`ïz¡V`<ìöç<µ®S90ðO9Œ9îØ´IdÈó~×]à¥5þ’Gïÿå꜇çÛÂ*}_¸Ã9CêÁ_òYèFÔƒ°|•4~l@iÁûY–üŒŸÊ‹²Ù‰C?–£ƒZ/¯¦‡£;·øÝ#!ÿüÉɉ’`%<ƶ›D‘£ÖL‚*×tÔ@³ Ìýæåª3oVµ°í{ Ä¢å'’,B¬±Â¶î4m:”syž‹|‡ WŸ9sW,ÛÚŸ‚ß Yá"I…ç½{ÜóΘ§»Ñ7¯™ìRÖ&AÔ§Ü}¢7å )ÕnO—ÉòRoâ˜lšÚ~Ÿ)Ö"F”¦DÇ–köÅ>Dprmk5£éÀ¯UúwIýdK ?šÎì؈q&©ö¹ø•-J$}úQîD$ Dˆj²æò6xºÁâþѪôhÀ´$/åPô²úü–|Ót¤1õµ®NŸ,¼ž…®s]y{&[s¶v e„¶˜}Öuþ:6Èì}VœðÜO¨–jÝIĘ|Î$¬—.º×3‰·EóÝ\§Í^”6©ŠÕѰ¯fRÚïOƒåJ—ìqΘb[H5ôRzZÔÐEŸàG¡1"¢-ÖëÉ;À˜Ûgœú6€EK—\YõÝuÐ’9Ï®:J;d+ÛÐbÊèùh3·¡½5ècÑ‹Øgª o©É+ mç¨*#7'·µ£¥Ÿ3{bäCÊö†*9« º_Ï\â¦kÓ÷s¥Ã/ë× îíø3qÐ: ƒ¾‹Rä†(&YBOÚ¨by38À5Aóý#À> ç(¥éoUtA ̦ œǰïú|^â¶åºù-ßAx¿Õ_·]5õ'Ã5”Ø¥Ýv¨Ff<ì‚ Hîåñy¤~âø?t—ðAÐEÿâþ–Ö³7Ùþ´ †¡»ìE©©”òLNTý+š•‘j‰ÀâÅVtÒ#0—ÿp°x,Zi”8\ù­#>g>´iu(Æ ÁõŠk7ŠØ€À風ßÎú#«]' ³ãìŒÁ+ÀîE ÑË —ù>›äGúWßÐsú¦êcïÑ“ÓÓ©WûXÞalOšÚÆiHÆJC¢T*éÛ—ÚŒ 'žÀUê"»4˜Úåo ²º!iÞ“Ç1 øfr¥ÇAÏ—õÕr6ß2‘5Râò¶ýb 0ì©(&s™ÓØŠj€%Œã¶¡Z2[N¦T™:¾<ñÍýÖ ñç³,þ¢nOÕê G!µêƒÀ¡7z3ö)6ÅBiEmÔnÛ›Èã“ÕoñŸÈŠý˜&_ ã/Õ|Odó‹¾7 );‹•dó‰tãË]ç{½„ÞŸ[È –ÐgMÑJ3¦b½~£¦\X*æä Õ¤°§ÿ¹A2Ò÷©.ÉeãaYâKWe˽ <É`†x׳a½ŸÓfÏ¡lcð•Dãý(£Gÿ1÷P@`áë™â•‹ÌK¶Šá“™ëQWbÀ]ÉHÅ‚”H õµÙ©¯ »«v³¥KPÖUˆÜà—Ž—ŒŠs°™¾gÙ#3:Ãò£•_swiW PDmÊKªÿ ÒgNcR%¡õÝó%hI2ë+8Gý¼õÝÃ$Ü>øÕ„á⨱WÊTåT©\F)R}<ëKVGy|mâ¾2Bò¿ç=µŒ¼tÍî?úX\¯ pöÌ£L¢‹¢v8Þè|qi½u×è§óêÜùœ½É3•4‰eJõõwêåµF}mp!æ+¥-Ç9—‘#·ìî? :îé\µýün.?3©Ê °É¾Â¾)+u{’·x·Ì+•æ4¬l@Or§§¤‹äãĈÀœâZá.XAÚœQ'á‡:œI“zepƒ 5œòÆžù#£àŸô¡¿àF†ã³D>§Ä\94¾Âéè‘xOäj|KGû©9>³áCFUí1ë)¸üºj±@'ä.É^%Aõ{þ¸i_(ýMƒ´l‰bÁÎYªNiòÓv´¼NÞ†¯7i`) Œ3ηô™H‘Jª }[YÃ^&ßöðGàç}ÎÇÔ‚ãév+¾Q®+©£ŠßÊßEß¶ú0 Qèæ[b/x<ãËÕä#kUâcê ÎÚîF¸§Ïx7DRqf«­·o4ªÉ \ÝBÊÊÛˆ«MÎxºÌ¡¿êyþ(ß?N™xYȈ¯2»©Gkç½Q©ÏÐEj…WìFù2éžæ® %æbÓ’_:„£ä~✽Çq¸mÂ#þúStf9uVW®K”ĸ4››`ÏaŒcðüŸüg¶rß@¨?t"8FÎYrâ`•Kù÷«ßÓ8ªci%1-€3–­2ä–³'Mõj©K’ý'v{»y<éå]t|Å캃"„ªdWìÈæI&ŠRXy²ÒqÑ”_‘‡µ±¤‘D ¹¢À,#äÞçt©0í‹Ïë²W»1-%ú«ö~ôŠÒ~ËxIµÛG@h`µaäC–µð€7pVo>áõæ6éÒ–sZôé«=R‡˜+·U·È@ôй¦F·à²a œÒ;ÿ²^í…E«®ƒý6)Çe‘"b»é3ºUÖÑæ¸j+¸x]“¶ÈaLæ ¢6†0ÉË!d0—‰/mCfVo:)x p[•”žF‡SG.ªá12E§xr“Ìé@E íoð;rø¿YÅðT«™šçr†ÞGD{Ã=£òñd¼Žþ¸2bÈYyð‰¤®ÊÔaè•~] ãFø½Ëþ¥ÀÄïA¨u_]]NGË›û‡š¢:™ "\AûU´©j5=ý$:·}ßÁõÜ…q·þ¤9tUU–™Pg®ÊñJ ®ZÖó‹Ì<¯Æà5 2¤¦sñC ±H®¦Fu®_'0á\():–q,ºm15Š•„öƒ\oÌZÊMˆh!Æv€V®æç— ›ãêÖÁ%¥¿k;„ u›t¤È¬É Þ0!›´ÖÄÌGúØñ”¤Mw°N½|õ]› é':Ë)‘¨H<ý””rEI7ͯ8E'¯„¶ôýSTYOúFcÒ*sq¥;—}³Æ¿É&¯Y$.ø4¶í ä߆¦…2`CGÃô_†C´„Q°›hk†UVÀÓšßàf8Å)+e‡è(1(ó+x(ï3ð‰mO¤É>0æC3Ù©mZÑ è©’,‹‰„p¡6®\YÆæ¹U}ÇfŽ Õëᣤr¨÷öÈai×õ§˜¾ð5કzU·€©ÅŠ\pDóßÅ?éï„n |åÍL"EB{äQ“,L=€êaßKë¿)œØ× £v7Ö6¹_ ¨3@ŽM‚d¢¿'‚²<ÞÎ*yœ†:kkE‡²5-3åc­ò|c·%(ávw㎺ÐÌÔ0üv)Z-›Úƒíœa vñ]2,ðCLŒÞ!ÆE©q”Y%ãi£qiþ¤3n©ôi2Ÿ’¢G²~|½Xü­3Ÿë²iŠ7TonÈé «™å(KÝÜÙ-‹W-í23'”.SΑ‚¹3W¸Æ§-XÁË„oTp!˜É׈Á–iXÈÅì'»ì™’ß"¦âjÞ¼©9„.lóF6YÉ“}ZLðËñLQ:t’G9Yø›ˆõXêIîÔ.çd~!ÊèŽîÚ·Åë>¸íRO™ Îmä²üu’Cá°›ZyæM‚Ô³Oš—Ñ~|Ýy¢Žíó ßÂèt,‹:œ°ø‰ ‡q/²¯™ª3JÅ”;µã2Z¾>…mNTœr…|]^ÃË^(w7 ‰ò>VŸï8¨4§8PŠ+¨ål—]á0l÷ ö‘Ç?Ú}‰EùÂyÀ‰y¹-™¸Õ€}ØYNOÀËéNZT£¸OØu‰j:lö1~Eíæ˜`Ràã÷•ÒQ†núŸÕ~Ñ96mÛ¤¨¯-à¿U먭snïçÊÝe‹™'3Ðÿ⋞]_[3›ÞÁm‚êí?Ñl<õ5¿·…¾à¬×"‚Z™‘~>¬UfË´ÝÔTŠ(ÒµÜÔCJ¿µL¤ü–¦å9,¶žû`úP’÷ªÃîÍ¢bÏn›ÏŒ¾Íky.1\Ýs¨Íí8 ‡÷l´„!a‚Âè%Lž×ðܵޔSÝúczã퉣ÛO”éTÖõÞ·»ë‹7èæõèœîÆäM•ÔÒ¯±>58>fî=†• q1LórØuêÕtEÏ6bP a¨Õg¦hÀîªøf?'ØbÕ²TŸ•â Uz˜‚WE4,P°¹JçÙ̃îØpùXoÉuÙ‡‹4TÅìD_Ž¡R ³»Q-}Ï…uU®Gòk§ŒÚ”©­&öÓûf$>»ÈZ¦“Q,j8ý·Î‰SxYp/÷~a« ?…ÏÍŽ=ƒãŒ¥‘ŽÊb@ØÖæ`ꉫ¨ÕÎ>üðTUvF¥¸¾0ÜîXÚàÇ)SÎÂyÉÔ#Ö2š°?ãuõ¥Bè%h;ª–*BQ[¾†G²ìæñºö%uË21³œôIxËÁS…lÁ¼°m…˜]CfÛ\N}Œoå@,lvæÅ-e‹’†æ‚ñÀç>£MÌ`¢J*øhUùæ—ŸªßNRByënæ]0Mj$ÍG3X€ìá×]ëK”{¦éh;ÎW°Ð'5¥¬¡c®Sû áÒùåt´¹Ó‘¨Õ¾UBÓV˜Åð•ŒÔ,ÿ¯¯‰xÎÄIZÒH0þªɦ} _tùH!È0âà¸éjEÏê[EîHˆ—PåÔÃÕXÂ)º0¸[¶›«äJz â%b%ïeŠ©J ØwÆFãÉl1"4s"¿Ëb2±”TÓžµúzk;Ú>Eð­—îb{<ãü¨)@úµjð#¸8S1í&m!kìî ßB51‘A´œe4íËi²Ií´ÎöŠ ›üÜ¥¢2ùJ+)P?*¹N¾ÙÙ¨]‹UEØ#czÃ]÷Šä4bÐeðÙˆŸjAŽO¢|ú}¶—ÿ¹yø.¹uêB¼Ø­êæéMZÁ/¼“øªÙ'%ñ×Ï/ämbݬlõbI†ìÏ­Þ“ä[¬r¡Y¹ÂiÌ›/.æa!Y˜[§Ÿ_ñ¯ì€ÂSŸµ­úÐÐÔ,i›á¦€'祘Ì{¢úœ¸kßC˜®ÃDù R}ó1Í“d,íÎ1ü‚yX u…¸åF¶NwË|j°ßØ™†6/ã|Ñ;Þ¨/À ´“Õ+êµH“}ì–¦û2æsYV]…*ñÃò=Mé"#­}è5'rÏ.?vZ[Ê,ÖvVÑ,A<\lù“‘P„ ý¡€¥Y>zˆldáQãsW*ŠêÓÄ4Í}‘­vV«À:âJÍØ3þé=»7œ¼“u&^[Ov¶@p¥-V⯠ë/ÕÁFê—4Óùº– Ý1Ó…SÛ¨èJÎYm!+E,7GH¾*Ï›¾û:ß§ŠXw ¹Ëí#,r݃8înaÉìÕæ¬nwƒË‘ïXê—¦ʼµû§S”TA‡' C‡vn§_}%˜š˜Ùkq»(P)rš1cÕœLvéT¦jŽ?·gª\,A Õ¬Ê)á„Æé†}¬?7 º½Y¬¥ˆã‘—·úvúƒpl›ÇÙ9ãƒA)=/¿0¯V•¦û)ž¨ Úc"²ê×µôD‹E鯥BL[ð%¿ádØÇ¿Ûfø‰Üp­éDmõ«‚ƒ%4'ΙfìÄ\…Á}ÂBZ{Þ…¯ÿÅÌKvcD¼¶°âS¹Ü¢¶¤¼þ'Ù³ÌÛÚØÒ¹ ?Gú¼ÉsY¹ùóyˆ(ImB}Ú:¡±‹ïu¥¨;•ÉFÅ }ÝÁ‘æ•èZç¹(.ko>ݼÿî(žû||è`|¤’°äÑÖµg®Ñv­¾–F™þ8lvɈdѤ¨ùÙBV>£O›€V·8ì#ÀƒžýCÈ–ÌøSTDàDR\IæÚÕ[FüÁ nâ ûž­ç‹Úª4ë²B¬f%çôîà ʑVŸ³pÓÆ|ÒGXy!錸Õ/ß׌tо—%Z°Ùr~©]ÒÉ8#z¶TçåM¬·Y{úºqsO5õ(a3¨–òïÌ#-qÕìæE*ÒͰ#åƒýøÔu8ür¨–qÎ`8í„’b©‹/žXñ„‘iÈ–ýc§·†€Üé\:L¬ê»¦|Yyù×!íT?y‡ñrIz¨"hèP#ìÖ&ÿcFi­)oÅá3 8ñv•˜W·rûÆŒ6H_ Ù4%׆¦cspSÀÜY°øåö½úàÙià5«æ•©‡ß RãPz-ÃXl¸ïÏÏ{´²D¯ha þqצ‚êÚÏß•Œ’ÔˆúŽÒ {ôé SøGæÜú†Ó¡ðÃÁ[­XFŽl˜ÝëÌw¢óH}æù‘ûÀ·'¶;Åš—ǸJ`-ܨ±Æ5¦ÂˆuŽ¿%My-E— p·šó{ÅËh‰Ÿp³ÞðzwçÆTýÈvdfF¯?ÕÄbÄüæM%ƒV Î=ý[ÕSGé9RøI9ãÌÆ·X¼ŒuàäV]@i*HˆðÓ«íKþÇøYC¨nqÒ«©£/“^]¸žËmªµhpþŽGD{âSÈØm~IêÑÇn!‹ èŒ)jËA©ƒ "V,1–æ‚]ê<¨˜˜4ݹDAèþ6hÀ›¡Ê“A*Ûüe‘Ld6þpE”-lU Ï”¶á(Ó›&•HØ·­‘Wb¼å>5Åýê„TÌ)„XÇÎæ*ÂøûÌÖ8Ÿ·çjº½]R"» ô{î1Y±$½Zc¡Ú—·ò[Fm͹br§D¸O’t›ÒœÔðphíé§C˜Û[qÏÚÊ"6c»©A»l]g8í½ðVœ»Îº´ñOgwáC¤Ì¡¿2¸Ò!§B®7ž2âúš+/Ô¡}á΀©O{qFlV^щEŠã¾2tWÙ¯eý;ç „ a<(fwB³Åz .ÏÆl¶—ºÉE&è4mرÒ"ݶ²7¡ÛJd²¬®ÎÅÍ*Í˹˜&úÒJ‡˜?Ȇÿ… Nô$'ëJïÛ½ùÝ"cR¿ÙÄ+Õï)ÖàÉ<d(‹¢%òç¶“Il™ŒT+ñóÙL.0– CXA*oôSÂa²>õˆÔf*†˜àikø")dG…Çu˜œdÄǽ ºFùu÷bжæÞl'¬f%„M6é„âÍ%›Ô=œ'b©=d­·kXq䱜 ™àÛbì”~³í!¡|'%¤Áþë2œx¯Žãóš‹ñ7úx M®7Ö]™µà_çGL±„ð«jÖ-êÐ}ìÚ3f:¼‹h±Þ¨ž¥²jQ->ÆT¤2Í/eÎŒøÃ}SÎï̪ioÛ Ûv´"#hgNoýDÏ0UG éÔ¢ÕáUˆÁIaÎÏ–þÓV•¦ß+F"XÕiN8°>WsãCAÀ©Þ”w<¢/ì²ÚF)@ž£'“ #Ó ˜¡=gíjˆà6‰ÜüvQ¡ û:pðìm— FJLA¹_Òxø”¦~Iëü= ßæHšÓaØ‹©Ýß¹Õð²ŸöÇ+ô¬ÎÞO½…³¡õMÁi\æu `W¦çy&Ù-à둵ú—º|#.”\g-`…Llœ¾Û²L· Àt"<¤Ê¿õKy~•¸ù‘Û•;þ½þ´Ø²±ù!Ø®û’ï½£WîMôÕK½Ú³ý¼ÿ¦mh0㙲‹6.cã¨îê›Ëü%¡ ¹GïÅäòùóÙ ÓùKݩ޻Å2ízüßGfcðyƒüÄW·€yZ;PJü1¹Êx+ðZ}ÐFŒà€æ4Yá0Æò™[‰3œpæ^¥óhåG°™ƒæd UÍþÑ*& ÞϨ«¥PŽÆÝFˆ—ðsV9=^[Eå‘Áƒ`ÙéfF$+¥®C=JhÍ;qf$%½xÛµÊ =é¨þcŽèüì|rØxò>—Ñå’b„ ¯¦3¥Eý”QpöixÆouˆŸ ‹Ý¼ì,ÂL:ž<õG2ÆýÃC´•ûà]Â|Eèõ:óJÌ=™¿rUÅõy1wH#ç~ ÑOýj¨Å¸xÞ U]ï-*ѽÝä~ùL«Žä¡KD¯× ADç5é9Û/ÿlnLÔ=h‚‹Î÷—nìâñ†¬4kNná^ù­Ý‹ãj~NTšú±?K™ÙöiõtÔ8m¿|̘3 o#AZ6"½ÂcúS¼/°[#œþî‡áPkÅŽþ”ú(HBì%l ¼ê—ß#ŸÙMô¾÷ 1ž@‰rVA¯»yBˆëdIŠðL$ ÆÅ“îU…Ø ü?ìÿ¢*ÞdÏœ„­FL‘_{e ª8-ÛSðƒù~7iV+‡ãuÍR TµNiAà†ß¬"G¾« ý,¥Ó¢ÉEÖ"çjrŠEÑ‚ýkø–-%õµD]à‰æ ¦;áM¥§ÓéºAƒ,|™‘ƒíDcr#¦*µ¼>¢þ,B”»nBÌç¸X-S'X˜†%â¨-̺?«Fx£V~T5õùØ:ˆzýCÕrWf”¬<D3N ã*"È« n˜CoÂQCSGH'á²6Ý…„Øí#¡|Ïç³Å™ÑyQÈ+äý¶T1p Z%0‹L¨ endstream endobj 836 0 obj << /Length1 1515 /Length2 8676 /Length3 0 /Length 9688 /Filter /FlateDecode >> stream xÚ´T”ë6,-(ÝRC7 ÝÝÝ-ÍCÌÀÐ-Ý- Ý©4‚H—€”tƒ€t—”À‡î}Î>çüÿZß·f­wž»®çŽë~h)ÕµX%¬  Y(Ä••ƒ (RÑ\l@ '-­6ØÕô—VsC!‚ÿa—‚Ì]ŸtÒæ®On*P@ÑÍÀÁààäàœ@ À¿¡0A€´¹;Ø  ÂP„B@.h´RP'/ØÆÖõé– –Œ>–?á G li¨˜»Ú‚Ÿn´4whA-Á W¯ÿ‚`¶uuudg÷ðð`3wtaƒÂlDY`W[€&ÈsY~— P5wý)Œ  m vùK­µvõ0‡O °%âòà±ÁOw´”jN È_ÎÊ9°þn €ƒãßpGÿCþ›[ZBÌ!^`ˆ Àì¨É*³¹zº²Ì!V¿Í\ Oñæîæ`s‹'‡?‰›d%4æOõý]‹% ìäêÂævø]!ûo˜§&Ë@¬¤ ŽŽ ˆ« Úïü¤Á0åS×½ØÿŒÕõ€øüu¶C¬¬—`åæÄ®;»¤ÿöxR¡ý£³¹x€@ Ÿ'ä yZÚ²ÿ×örý1rüV?åïçãuX?•ò[ƒžþÐ|\ÌÝAW˜ÈÏç? ÿ-¡qp¬À–® ‚öú“dý—ü4yØ`|"øû÷ï“ñ·¬ ¯Üÿ —]_O×@NùOÁÿ6IJB=>¬\VN €ÈÅ à{:øý7Šº9øï,€ÿÄ*@¬¡¿’}êÒ¿vÿ{ú /#࿱T¡OŒþ!øk ÐòéÃñÿLó?!ÿìþò!øÿæ#ëæàðÇÊðÛüÿ±š;‚¼þ¶?ñÕÍõ‰û*Ч €ü¯«è¯uUYÝÿתàjþ´‡7ì" öY©ƒ]-mÿ¢Ê_zß æ†€Ô¡.àß €•üÛÓVYÚ?=.O|üc=-Í_)±„ZýÞ.N^€9 fî…ö4â'‰àÃñ´†V Ï? °³A ®O!€§òüÖPÚïyòóØu«þHOübý[|Bdÿ«ÞxìàD €òâS8ôß"÷S¸ÓÓ€¡VÿáÁ `‡ý‡øçòÏ}Oh®ÿÀ`÷ÁþRüWÙ–n0ØÓÒÿ¡åSOþ%ÿya@ O%Úü ÔR(Ä®.¤õºF‚ăusTd’vSï#«Ï<¬Íí%…±:+höS"e°kiC†áR|âÞg¿¹%üs²FËï/ÓDÍñÍ´¹o_ÆŠö%êûÈPIYµÅ·|ï}uíšá:ióœÝø1Ô p¯=zå<ëû*‡Ãf65¶ªy•^üª˜`Õ‰yX:E›o‘=MD…ìÊJöœ çÄsêòç$NîØ#…b"3šßA,W±áwθ›iïåÚœ.Ä4ĆDd—8Ããt>’;©Š„³>eÅK_æ<›…‹)rÑYÒ–X±Øv83«ÁšÑ¦žZ÷áùvŽy)€z’/¸?’kË›ðLaTjøÕ-¦Ñ¸®µ\ö ²vkÉåÖŸº]Övi¤ õ€i>ÊäZôœH‘e}ÁΗ\ù¹EŠÇ#E‡‰ï”ìÖõ~Þ+¼:`³w—Ö3]æ©-µYÔ3¼LÓû©öËɘR‰Ês §.ræv 8U#&;²À»£˜MèùL¡èTÒ¤p܃^˜³=Ñ"ñG©V%²7A6¢({³ýê–yÛú`»z%•Ýiw`Ò‘ëw?#œjü4#§­ÄMSLÓ(‡§¸â»(‡óx?)›ï\¾aR¸ù/Í"²Gð«€(¤8™}g<‰0i˜|‹ï–Âì³›j¤oú_rIMD½ÒImÃ%E–öº9ÙMfOèIJúPȇàöV‹óñ½ey4ðà¥Ä–—ëÏ!%+ª¯›Ö”†Ùc¡bl{ýýÅG×ڎ $ï¶ä/²ò†dtŒB eƒêÊÍ4.¼ÍVÆ —®m¬@IJ iÅ0Ö/Šþ$Ñž—6‡ÜaJúG•èñ>]óꯒ3RÐC¶øvi6Oß©‰«ÜUнÎBf QÆ‹D\/ËxîM›‹8ýJIUñW²Yïû¢ ¿=ÞO½yDÏcÕI°xUwc2©¢øÌZZ—’ݦUÑ µŽôÅϘÀ“½,ž ‹YLjìT©/šÐ\9„h‚†iÑûqù3wNÔù’Ì~³ oZî®ñé¿ÔÖ•hj™äLª}L7—½Ü­Aah÷Ï®#jø‰AÑÜY²Œ÷a±#¤bN’a\”E¼;wkcä…_$ëÚ;AŸM/‰g4Ÿ¯ƒ"é¿ú•L–âÚ™¼Þ{ìý,ºár¿ J°é[óF¢dYú¸ÌþÖí¤‰”N ÑÍ/©”øQÁ iÌi²Ñ…†,Îj›l`VUƒýÛ¤ÀaÒ\Œ ³ã.tS³tG¡n·sK"DOX%eÇòseÉ—R­ nTáØDJÒ{qêXÐÔñVËoa{m‡ŽX1â¬5cÊ»åôÙEѦ敇~òعÆ›·…“¡v"¢¤µon)Íî éòuò±ñµ ²4†  ìÍ:ÔÙŽ—@¹QÀ}m¦˜àÛéV!`WÕêK¾q*~ǵNOõû ‘£"Á ÄiÖr’å)or ^ÌÄl"D›%:C£Âz)fb4=P\GÊê}p£û‡Ò"Á磱iîKýT[?.×{»šk‡Ë¹ñUwÜ Ų1•54ÏZ m¯«I¾Ú mî[^ƒ–>Ž„oV¡ÞÁcY,‡š·Öeó«þïøª&)®Pož¯‰f1v•3ÌÁ ¿$ÂÓèCì4á%k–“kd”"²ÎúâÙióIä[áûúހşÑú¨qeòB÷ã?ǧBiÁà‡”6m~ÒçÝî,´t>¼sT Tên¢:/'J ™~Ç9»¹ëý…{(³n{Ïwìò—¼r0åML‚r2ÄÞPÅòKÔö„ÁÅÅ´¯(=àØš6ÔèM-9ot/1è•ï3à>½âÎEr‰7]iÏ~Oõ}oЂec|‰ ycÇ;#gs«]7¨Û¦Ðáã5ñ"¿i3’\™Ý˜§”¬ö‡ÞB=ªVwÒlº´d]Bq?Iþ·z¥¥Ÿ]ó¬ŸÛØüB¾ZÙ@q™E]V"s$‹áçitÙOÉf(e³,‘{³øbøáBXÀ}Œ\šaÜÊV`Œ…<ª4ÎýíX‡>Èo* ž€¼Wæ¸S4òm#²#Xc’hH4Gù±,+“ü×!Zäày¢/Ã.B§èwJ¦ØÀ@úWQ´;Qùª/ 1føHá§ œD±ÑÏô`¸(mƒÏ^¨ú(Ï 2׈öÜŸ3#ôŒ¤¦^~Ô‰ú‰Â¸o{6$\ºìº0ç_lÇñR#§Š•Ë/=¥bI OËÕ˜‘éÇ̇åcƒnã·–í<ŠÕ–÷†Žž Jæ©Cã’ †C*}H8¸›¶:øm©Aÿ¹ªˆ´W3—™2¡r×«Ùæ¡_ -—QÛÕ–s‚uZ£=+&â¾ ¼ÿ o }ß–ñjŒ[}²Î{ÊãÛ¼þÑÆè ø¦nУ¦¿G5Vì=üДE—|e3<‹ê–)Æ~(‡/NwT¨K]mÐ"M{p¥Œ¯Þvq‘j¿ {(ÌmeN¦=Î !¼Ÿ7“2ÁX]Úw¢³²ªyŘpe窙@ešº0ïÊ5°L<ù.¹‚ÚÄŒ9C$¾µf ¢X|-r®šÏ¹w;ëépï§ÐúßP¶†ŽŸ¼=rÌc‹79‰˜Gc€µ°¨õ=Pn>à¢uçÿJ·¸Š=˜Z±i)F¥Ï3‹¹n´ÂJû [~¢mö—8û"ïW/—=z›™óÐFSÐ0P<^ñ¤;µ¬‹ú©j5Óé–?Þ 7“KÁ°•”gì}hÍ 8hÔ¿[.©rô˜(• âwñhd½Ü•§°‰ A)½™ç“êU§õ(ˆ}I é«(á$ ëN91òš ²ÜÌ—~®½k·‹Äo2.®Ô»Ó¨êö2íà%VÊãøb*Ž/ïcæ¸ïy^ƒfjSgóºO¡É5òˆ"³6.:‚DZ—6Dzå <ì$EdàÒ{{ ÿ8DröûšZ¬z¹uSúð½þ.‡TA$w….B§/4Ž1Ê_³1›þPÚôHKgpd5ê½–Øi¨9ê²d³à“Aš…÷«l¯ÄÓ:c)šQôÿ&€¡iê‰jf øÈtQ“RÚ$‡½O–•d¬ËÅ‹ÀàçLÒ Þ›*}X5ƒ¾C¸©Š,µõÙ–µÄFS樺گô‚2hÉ%ÒÓgkŒ¹*©÷àYÔKø}ý׎¨bŽÇŽš§û{Ôê 6 ½-ž;ëR«6‡o[¹ýÔÉA/0é ­DÀ¤¯WôèM´¢·£º-ªÐƒÀþ¹è ‡/ËÏírD„œ\?ãY Õž¶ea¡Îz—úiíÃàì¾Èâ‘xŒer EUèè‹dn1gÑÑ”›|™ôRšc/ëÜÈ_3œÃätk¿~´å .­ÆäH1 ž'Ê¿F Ÿî˜ ¹Јt±poAs%‰ïií¥õ:Ùg]÷ÝŽú ÝA±$/ùþáó0yÓ;{÷åÍ $›qÇ™D1­^BÙ5,™.ßdßÊÎj\”NòžõürÁl« æ7ÏûJÇâ–žö°…)Óô0¤Ré"Mó}ÒÙëUq×(Ó´È5<üzµûjÊ*ç}ÒAÿÎ÷Ë’Y×=²‘mÊVôóÖU}ßx7»À8Ïè;¦&Ÿä´SWϦL ü™® ød:Ý™beŸFÉnÌ©wÝ9(%cº§QVáÊ2ÝFçÙkjq óR›„_48<£4¶(ÁcB3Žot<Ë}Óû65Kœ¬Q™ d‡Räqq;]0^±£Q0m·÷‰°¼¥áFòÞßݱ°?!u‹PÔ–ñ®ê›ÚhQ­h/wÈ´O%X/“ÿjxgö‚T‹àÈL +m¡¾È%ÝéñÚR¸ïkÙœ˜ôxàÔ…qõÍÏŒMÔÍ‚ŒGÉ~91‚:~ªª€2× ™k-"Æœ‰>Éž‚Póµ½PëçÕÑÒti¦$ è|—™ª©ÊôŸi'M9î:´Öªx¼œd£>õŠ~Ç:y½J/å‰à¯¬ÚÂ8Ñw¬»…¿òö²þ˜\ ¸LuW“Ÿq9I,xÒW~‚0Ðë‘ñ0²ëué­JÅ•œ˜Ïlnp¬@E…jY®ÓîÁ-×=žÊ0º¶–S?WMtÉ o%¬×†np2A ãù²u¾Ãð$dmöxùa¸zÉüâäB¶öˆ[±PFažyƧ‰ÇlµÓÉ⑒׿®[ê˜×ïßz.1þ0Åxxí«ðÃ+«8 )ƒDœ­ áQ‚66±=oŽã’&1ƬÀ ‰!S:™ª0ôc”oR{]Y"*ÒíÛ¯¹Íì¹<ØÌé!-¿’1¢Ð$#ô@Àšb,"¼Õ–5X  ¼ TŽ@ÑN[Š;ˆ»"ë¡tàuBc¸NÐT¤ãŽœ(Ý ÷–f¸âé]&ì¦È|R¤"63XÈ« îá(<½ˆåtT‰Ï¡ŠP$pº"Y­ÇiÇw+Ïz ìs0¼° ññ4Q~9{<5¡¿l£ÅDz(¯ŸzeÑ ¢‹*ÇF,>·54U+Û,ÒÕ ÎÙSêý@\1Ç…åÌ;§¤¨a]þuõ× V™píí»_»˜êŸ¬¾õÚna)†‘¶ÅÀ›˜„Š âPE’ð²âÍyäÜqëž…` ¯17]0õØù.)ÿ#7]µ´`“•\§¬°‡©S¸}_ýaÉð/tߥUÌpÞ³77«ã‰m„Ì®c?¾ 'ønˆJ2ãU0H£N_ÇÆ ñXH;­è}ÂjɲÛUÜt;eˆ×\*ûþ-­/¼Gåî(K(XG¶æÛáêÇò¹^K×^†óÎ!òÎzd Ç]?FG[Ô܆]ÜÏmàFØ÷e8H<c–FÎq@$ö\CGgýhû¾û[Ÿ½–ó¢Ä_ßkñ#¸„ƸãlÖ.\Xj¿mmFew¥w-Zi¸¼Üjµ ;5ÕböІKª) =õ™#9¡.ÆSâBèc%õÆ¥— M8Œ`I´ $-Ç·6P–÷¿wÞž!.²YgÄqB.-¡,ÑU6Ë<Õ°Aê°O?}wC«<+(C›PÅ §^ù˜S©†&¨›Ï‹C2œ¢u?‚T06º}W剽!¨uø+¼ysÎjîè€1çÑLÉù½áä!‘´¯Ô '7¨ÅÅ/­F&–@YºZnL‹‰Q\•?’‡QêË"K&‘Çåõlj n‘¶)^*o׸ãE EFcåä,dX@ “$µ:WÊd[ƒR¡ §”@C7)«æ$=j3ưîŽeçÂt‚VXÑ´Ðèsɘ´ Y‹SÙéê”Dþ‹BDˆ~îÇ4²$D e€IÌe"SwPf”m7õõ­ÖÑÚÏW›óˆñ n^Dú.•b¸/ȇ9rÈ:;οŠÉ!UYUo;Õ]¨Ò(ÚT ÝB”]~øH:|5¶#Nùhý` ¹Û‹: ¹<· óÔ9iÅ ¿ï’ª¯ËsD BðY"kNúxKÕ"„óRû¬5öÅü]›Úì—"SCSY•ldVðk]«œ9•¬¾E+ ç»>5YfaÀ™z¼^¿6£Á3ó ÝG%4ògŵ-†IãùñwâËíj‚Ùu?`µ&q[‚*%./BsÇÅC˜¤“n Þ™bL ?S°•:Å5‹+5¦ "+xCB­ÄM‘=µw»3 i—˜eÏ)‘)ºIGlR·¼C¬é=.b¹›Êxmc'±œLïn!©n%\½Ql2Ç2I‰Ù“ï>½é8÷B‘2±–I¸ª–]«~ ^DeXÀOŸÌhQ“kíV‚“Y5ØjŸjÝý™,/ªÌe’Ñ1fþ褡ªj4 ÙF÷6…-~L¡/ΉҶ(ÏD4ƒÒÚ-þ¤(3JX03w‹×´xþ RvÜ7Éé##ŠO­o/Q?±šýÂŽI‰|›x:’HY\Êê[~©©«ãEµ¢Á¶‹½zïQz•û¹2ö–ÍŒíçºkg2šÑé@@DÎÎφxǦ-â=¾ÒÌþþ†rãøoE­þa>ŒÈ£ÛCÍIµÿÃþ™§eTvú£náT—ÀùngþÎÁ¢1l®Ó‚ѳ³Ù€éÌ‹‚`¶@­ dæBq:̶¨Ä×½ãÆÙz«ù”ª+ÅNóøæ=GÀ$ëøV‡øeHË$šŒtìË'”)˜àiÍ9öæÔ¢Hág‰;xëÃÙzIø}È¥tæš„š4\H6²ª¢ W+p°í¾d4ø hpS lI ã‚ÆæŽ¡?6o¥EcÂbÎuÅËñ»04yïJòQ–™ûìÀ1Å*mxë³±lqB~„«šÏf³w”û\Ì’@nµ[çÕ"¯º}<éM§·öþ0]ÄX ‡î3ÙÄ‘±žµ<%¼#–¥øßB¾ÖÃÃvN@”Ñe¡\‡0€¯õ·Æ¤_’‡‚NÎg³ÜTW›p ™ôÆ]úÕqžŸUÊÃö*2ä £¶Åšrç¡*ôz—¨gµîÙwçd>"ͶŸ|]XeG'}¬ØÚdØþméçHþ ºR{8²Üeëne-yÅŠ)è)蛹µéß6}4€úñÂáÂ?ÔÛéŒ"[aðHç ÓÎÀ¹}3ÿõêM(pF\ÇöbV¡³©MûÁEºq±lbiܬ Bx.z×ÎÁ#¬Püpo•*?yá͉O»ØN ea¤H‚kPW¾$òg ¶^VÑgÖvåYf!ÍYD'¼#&Œz÷úª®ì}i{u‘†î5±m~ŽñÍÌí܈ü`[dñªÜÆÅäa/òKêc,{ÑÄ=ÁhAI°Ó–Y¤´ç!q4\(ø›µP2Q…ÍÆ« ÷³é¯­¬$+¯V tôor†ƒñö]…ãhÀ—~xŒU64˜­oÐ.m4ŽÓCÒf|ÉtÞ|z©DÌ'›ÀÙŠ˜)Ê¡Ñ+¤Û-ô¶Õ?=}7‚ºå±V@q×·BÃx€YxÖX%™‡tmÚfëW—Zú9ʳ+i­°ˆÙ±~¬Ðû1!wS¡é]Cj7ÝA~Tö6#o6Ž»Ñãu6F½w0¢II¥òˆC`ê \‡ã;‚Ç«b*é—ýµ¡5: hû…­YEF{x;gëã̈BDï¾W ß}0Zb"Ô ©ˆ9î¶d<£¥ÇeJ¢ 5чåLHdr+ÁËX‹gÚ$Þ¿Qƒ­ö $˜ŠnFq&Œi)Ê |&y$’ê·`Ä­kÑžw˜ó60«ìèL3«=õ1¯œÞÀëtìÑÀX_W §Î} “&!ÁÉÂÞuNÅÓîùr¶5Rø%?HW¬ÌS°Z-« ;ûsˆŒ9Å'Uýí¤‹!‰Å)Ìí±ÐDzúÕ¨Û˜Û’J:ù¯Ä¶c ìb’ªp¤-o6z =~š#š]âWÅ–ssAI* ÚU^âZ®ßGL 2ã¦Ê(}–Bûq8+cæ4âæy#Ò„Üû`ä ¯†p§èÜz/¥÷.鞇%6Éí ·qWV‘E’ŸVrè[ øzÒ •É=¬™À #Ãðy̶¼Ü;ßA–5•ë¹ h þ veÉôá÷z»üv¿Ç Ç9åòº= *—¦/hJÚ·(rkm([‰­ ´‘»ÔÐrÖv¹5!"b(êbr^Xoà&ë§Còê_ÎË@¶ë¹<(ÀŠÂ5~_ìÃÉ_†…ì,OY‘xÂÇj7]çÜÅ3+í¶&ÖW”Q@z¡ŽVª7¼®Ž^›K›|ú!s¼ïwýÂK¬,ncÑ#â®.Ö΂'He©$ eð½oíÌõxÇís€LMK~ û'‘¹öü-%ÒØ,iE.Ÿ…ôžä)哲zYTׯ7—Æ~ 5@髪wDy_~.211 ˆ!÷ ,ݞﬔÉ+;'¶¢s⺋¾)Ê-¨¦_I_;»e$€áø)d?#JsBŒgëÃëã½êB>GÉ <é@W‰»ÿ‚¥,§Âýµ¡y0wåcnU}¾2þcCcÚÇ£KcDé÷üK¦«˜rÛÃ@|ÕÛÇz÷iœá•v£5NL4'p½¹ø-¿m Ö…lC¸÷U'§g>^¸)ÿ:æ¼”^Úè솆é•ä⯇.Èw«–å]‘»”Ÿñ²A+úndohpÛÆ0$B/M¥ùvÔ%rÔ…ŠCi°rTL0áò¼½¦Ãµ;SqÝß~Ä&œãŽm‰r-½ˆä[=½ƒâÚnSTréÃgéŸ}6Ô>µ³Uº!T“ŠÁaÈ3F§—Jêã©óQ*· ¡ºñ}³T؃¦¼kÍ2‚ —¿kN<°ÇJ"›(2Þ¡¦vø’IȪaæÌöÒ!4f£é•WuÝq·èÑeCeš,Ñ’ÿë´?‚ì??Á¿šÀœ5m…lØóî)ð5;>Ôÿ(³ãfBOBrø…k¿Êwã7ˆ…Ýý-)ù+W/Û~Cy"fE…ÿ;3nóÎ…¨Rä¹üçö J äó}ȕՒØ+VÅUçòÎyç)ë¡w“\¶ò•Øz÷»y%‹2 oÚ 5‰¨Hyu( ï98M?“=Oe®íŽk³Ž qD@ð¡ Ró¯Õo¿Ž0 xÝÑ}*×aãÐ éIKbr\©0¨PT;‘7XJ§aaEHøOvŸúpÒS¥´˜…¢µûГ(éR 59¤'ê­—ïîkd‰-8\Œ 8G8z° š‡P¨ÞÈJ|Óêçbç=}ç%•¨$ܲµ¤¬ÎZþ3½ U$ÔN$¤²˜Îz¿Hñeu×^XVh1w“½n¼y³?B¤­)¨ñ¸q†2wµ¹dÛ>+蹿1n¬wäÀc ÆÙ’•Û4-ÕyŸwcR=B’BåL-I&÷³YF3V¿6¶jdògdüîâ~öÝË”Ù˵ÝÊwÅÜŽ{ì$JéúÆ¥ÓšÐaóãtpn®‚\RJ‚6f½xÇ÷øá’*úšy%ƒóÄJï«T`QSÜqE»ruB¿Z ÖÖ#š¿bäÐ:úüd¸ÿ5â!T‚Ö|zòÐxëiÞÈbßm wã›í@ùÓ¦³*Æ(Qï ø½¥ÙEM/Ó»gâ•:ë0I«“utà@UÀ¨^ô›ù¤Ì¼7Ñ/qŸ×„ã··^S™¼øl3áêV:½+•гwÎÙtð)6Á:F]!þ`“ÿ€±ÝÕ€}t*ÊÎÿ¸%‚qƒ}ùÒ½½·É;ds$>¬pWçž_­oщ(Šz´ø|è™yÎÑý>Z´Ö3cÝÔácxÂø¢ã8y¨»0!»]?}¯5Yz¿#w|ÔYeVaZevݤ³'»£÷{s3ØÄ&ôÔnQ¿f‘/úÔï— Î¨ËI;:{‡IÅô $š‘â)í&§%>êõ•5÷ã6ü1ä¶÷{‘¼ê~¦)(s ¯=oâªóNM4§sœ²=: -ºO=‚?ë[EË4°yÆ®8i6#ÄÁÁ¨©¨CéKwh5D{c3‰Ô|CóÈ]À®Ðä‚ ¾„›»Nõ±SðãE ò¥rN±µ-žÞ¦bâ†lâkYwömÊ)dBÁóÛûæ‡áƒoð Än•7PäiÝBô(ÅÊJŒ—qýë×ÊqÔˆNå¾%Ìñõ (ǘ¤ÛÌLiÛ…>ÇØŸm#ŽÔ÷’%Yäâõ‰ÆÓƒº ™s´ŽÆö‰. úìÎxY0å6+Ñî;ª`•äKà<¹0žjgG™feiLëºêÂAOÖÆ„©£Üþ³Ÿ¸q.Ý6üÈRÔ¥'3ÓˆPƒ©ncˆß†ˆO®ºýœB©LÜðrk§‰cXEºäæ+ŽË²Ï«h#:&8w2Ò³ÁÓ-½¤{Ožœ²áÎ¥·îc®êà ©¯r †i¿á€¥ .”1–â»Cªz[gb>¯—Ä…KäôþªAN{/]ð) ÇÔûHÙ çš%š«Ðú8d½NJ½ýô¨ÅÈ n·ÏlÌOê$8 g9™ë µZ, ˜ÜÔ*H-¦tw~·âvIÓE”‹/ÛÕæå«jó3˜»rtQ—gwåžéÙKZ´"n¼‹ÁÙúÜðlx‘nË•\¶øXØØþ endstream endobj 838 0 obj << /Length1 1925 /Length2 9905 /Length3 0 /Length 11081 /Filter /FlateDecode >> stream xÚ·T”[6L‰”4H3tç"ÝÝ  0Ä Ý €”tw*Ò! Ò4RÒ JK|ã9ç=ú¾ÿ¿Ö÷­Ykæ¹îÚ×µ÷}ï™a Q×â°‚Y€eaP7Nna€”Š–Ö377“››ƒAâæþÇŒÁ  vq…À ÂH¹€Anp›4È §ƒÝ<@€0 077€—›[è?0a€4ÈbPá( `W )˜“· ÄÆÖ ¾ÌÌ–,!!Aö¿ÒŽ`ˆ% P¹Ù‚á+Z‚Z0KØÍû¿J0‹Úº¹9 sqyzzr‚]9a.6b,ìOˆ›-@ì vñ[~ ¨‚Á+ãÄ`hÛB\ÿ¶kÁ¬ÝZ–öð«ÃÞ’¹ÀðÉùï%e –0«_#ÆË/¹¸€¼1à‡ Gü_ø,Z½þjb'æOÀåù¬a.¿NT@À%õËôäpÉýF@—Âoô À¥ú/zÆ àRÿx\š¿€Kû7âpéü‹„àë~#xM‹ßHÀeù/âƒWß Ž¿£í—ÕÎüòÂéÂ÷äjûGœ˜õ!pùòÿ‚0w—?Âá%lþ€p ƒ+üáRìÿ€p-@¸ÇßNú„S‡ýáLœ~+€#øhÀþÐ ÿšárþ™ýÁ›ÎÌõ·.¸Ó~{üvà ºýáÄÝÿ€pâ@8qÏ?¶ ÎÔû75x¬ØåoêÿÕˆ–î..ð»ø¯«~ ÿÁ]ü`°ØãË,ÌRäµ]ÍëÖ«j rOŽ­QÔ•µöˆ8ƒ¾p~7ƹ<_[åÇrSÎ’æV$éêó%¡“³~ä¬ß®Æ¼Œ»²¿¦Èçº!ÈômHžpä]ÿè²SYÁÈlÆS#6ðŽã5(qÌPŒ˜õfoC»;•ÛïîÚ]w …Ž€÷¸4)änÑ9íH‘4ôknŸ Œqcð]ŒÒܵtÆï"!1—’­Q¤×ÞF1韖—³úûRß ”zª*B H }ir†H‰â³]%ù/¤JâÂK;ç"QÊç\L4 YuÓ¢ífú÷ↅ¯ÝÛü¨:‚i=ж“Þ,dvªœŠùrÈâì]Ë vêÓ~Lb}x¡Œà¢PQ"`LSff§n)A¨9عº›EÙ¼ú)Úxj¢P!þ-)B‰’fM®–“J¶ ¯Ø|éw*øIM{€}¦kYl/nÒÏ –ªv ¶Ö{–$+zwØçãAË“˜òæpǯàAê&ÑBªŽ†'4î¾,®Ìþ‚G? ï>ßp$‡È¸Z/ß»ZĦÇ|?êU?I²GœÁ×/R£XÔËUd®DkçS/x­”dk¥›°t·õ(Åo%ã£ÉÔ»¹Uk­Ó¢”a¦/Ÿ oÏ ®Åis oŠ$6H¾¯WRÈkÓäðO Y¹¸ÞÇü{W¹ZH+/q»TÉ+ªOô$á鉃ŠRû™–Ï’?¨/äÞw³±Í"ÎNR;Ú೤óUm#Å—ç/ݧŒËg—%ís¡),j/Ô%Çç0ð{½vI¸ÜòHZí1ÙT¹í'Ït]¨®i¨±xE!Ë! ±»owé^êNK¯·}GôøΖӀ0hÄÌWðòÓýÔ3Ð…háìg¡âÌÐ –”Ÿ’LqÂN¼—û’‡“::O'èð|–:œOø“3¾_”ÚÁä=BRò}ªgL 65gYÅv*Z;cÉÌW×4Þ¥,mÆ(hNuYg-FÐ,Êîg409[†t=^’ÖYS/ÅêwŒINA3{Ì8ç°¶në¦Ð©‡ÒÏB²v9ñ)‹R-ñ„ŒxöqÉmÙÔiøkŒì•’q [ä+•E+_éóزEV û;õ7®DýöÕåeè]êå˜D™K ?…]}©kküàa³’nphé2q o;Œž³m¼b³”ê+—ö·Oí®MKíÞ Îª¾ôH²û$‘½‹“ìà ¨xgM:͉i0,‡3>ð v$‚¥râÛ¦“Ø_1¸f‰¿vk?ŸÑŽW™ç*]œ·îoÙ•}Ít2Ë{6à»y}ÚÁPc³3·ûR뱺¸öŒúÑâÁ:F„b„÷YŽ«Ö%gRw—óUÎ&¤è3Ë¢uã☨”ògBµ\Fûp¸·CJCÝyZ9å©Eomµ1?Ó¥”på™w±1¡”Óíå`ÓJA\ŸdfÚŸÕú`lD‰Ÿ÷ ‹6ú"òÏS×6s:¦ `ªü £/Ü]™úO)}r^ê±[§×É%c6¥®NÈø¦_¯T± ÔÁ_°°9\}ÔñΕ²Iš|ÏŠÿT†`ÿÚÀD¥ûxYiÏIìPþ‘ˆ|è)öfÛ4¬`Z¥}ïqzËn­è~ƒ³qC¢ÆýÇ€Êeè"»ì¶BqV”%ðf–½µÙÊ_ü 'ÞÍYÖÆLæ7}„ÓVkUžR¶™z3*RõWIgdHZaF'¢}’¼Ò¦øYSÌ*,ñpgŽ8}T=.rÞ¸Tˆpe¤š¾'v5í³ë“°£Û×´$lSR:¬3R ˜žÎéÍAœc Øä;$ý屄7WTø;yÅŠ¨bg Õùq2Ø[#×XÀ†{[ÁcýÏü´æXš™|nÂ8w\(zrŸßYzY‹EDiº}4SŒ¾}oÔJiL—Ž #œš(G‘ûœ•n«“ôt†ÐÌ”äIWyY¾¨­ßˆÿzðSóˆæ¶;uÊ×~ªB?Ó†Qv}󉦄~'n‹¡[¦Ä|hè#)n«m¤Ñ2KNغ‹ž^O˜Š«ÛuâºÓ.yPî” *?.¤‹”s‰øûBæßýt*oøaŠtð:ÅZÙnK®¸ ÈðlìšÑ}*;/¡Œ¤v W{•|N•yå’?|eSö²$çæ&J‰!Cë…)P‚,‡oÇ«:VõV ³–+lTÒ·?õ"¯µg¥3ó¥)jމù:x›ó¥ÐSÀ Ê-ÛÜä^é n…ùxN3-Íö=kõ‰Ù]/x&ݽp¶Å*\ˆVF ÕŸö~„ÓÑN"8c3ð!‘2ýTŒO—΢&Œ÷ E§¹Ýyâ`µ°`#iê˜ÒX—Ð"8| U™ÊvWD¬cç¸ŠŽ‹SöâIþÔvrT„1‡9ˆùl¾w6Ê;íìȬÅÞX A0@Jœ,‡øq}öG5?“/ý;TkrßdÜ¢oOoé7➌t =å«v=SìOщ“y;Ýw>ùÔ5tßóýEG#!¡³¦1—Àöd¢{ 'Äs°ß¢Êë•K±2Rf!×NeŠçÓ5â‚@÷ûp΂Ÿ¼}suõ5°û6®hcTê¼EºõQx6%9BŠ{ênuo 9QøtÏ=ËPá,:¿Ô–3Ð72bR-˜«•ªDŰYœD–oÚ-úy¢Ãœ'šµø¸Šýný¸L$,$0…î¯HLþs‹žSxµ³m„äÙ‰ÈÌ“:¼âÍ’)—pxûHœñÞfΦ'ä€VÌœ–e¤7ÇjdÚj‡é&’}ŠÉ3ñ“¿‚§¤Ïs·Éú£¬!ËíòÏnDèƒmÉwé½i™ÐJai €Ý]Td¥þyͼŠ]•Úàíòê(z'û؈]=‚þ09rB'£tŸ.£Í¯ýú‘4³XÛà z}Q%©2Ø^>ÙªÅB|.Im­ß#öè™l È¦ôN@‘`$ÌœKnël7ÆÚfEb»³[“°Âÿ™˜Øí8e—÷ö((jÝ)ãû ý‰N µŽóÜŠî›X@€“œ‡L—œÈ“ðOwÁ &:U;fæÄSKâaPGÜ»+‰ ÊF ý±º˜¢×I¿k¥·dAôT$™ÝZ•o#¨…z'+¿eX\'ÝSNaT[QxEÂlñbÔæÙ²+¥ÞÃke¼¹T¾U¤fSÅ)qµöBWš=Ékª/‘EW‘W5Í<ÄfèåNpr^Î:bܾtì*ÐèÚª×PdÙ- “ë„Ò¥ÄÉcÄE¥XœL[É é^*ÛNLL8TˆšŒ<‰¦m¦©ñ ª´‚2«±ófóaïvtqÈÅø×4/DÐ8'î¥ÑοnÛˆY:¾Ûä'ý`[ߦ]Ÿ¯úZ¬;úôÛEXÈgE_XÃ(†c*m ýN9Þb/_‹¶+£É˜ï¸N8' ±: Þ(Ž£^Ñ, ´úI»ú¸‰jcÆç”ä!k¬èÔŠÙ+›Çæiê\ãuP-Šõ{ÝF~ÄoÖÓˆÂëÔÏw¨~ôä©òIëwI’I¾RÛ$m†á§+±6†öÈÕb,yIª”Í’ÿP&“Thn®‰µöO ¾};UWg¬¨ã•Ò)Jnìg;^Mëµ^´bÅåÌF⣥OI[Íõ …QD˜ç“Äõ•«ËY/¿¥Gy “µªŽ´ì=ÁТéš;£AÚ¾«Î<ïxð(pùë¡C½Ê‚ýid‹W“^•Û•€-©s‚šìæÖ¨ wÁp¡©¢ƒ·$á„ÃðŒ¬}dZPÊ"W§ÓF´„ò\›føÞ¡¨Ã7^lØMoóݽì‡×Š’XϨKcøeêµI¥¦õ‰Š¶”CMé½ €_箳¡§@Mú ‡„¹ÎÚbu²¶Âé1`ËaÿޱâÄ<Ç5Ë^èÍáúm®ÍH•ìdèu’|î‘ ^æy´ú«ð¥G]¯…âS¾Ç2g"_¦‚ìjtc÷¯ë-tFœÒÆÑ“nÎßJÕä?ŠVk~påh2E?P@ü!ÖŽ.§”«<k«Å@IRt2¹¢E˜>Ñ«(fjêðD“E»|`ïF› ‹Ê ùáþ¶†+¾•r“^ÚÀCÌÿÛ…»z ïRX /¾¯"¹ªÆ='æÝþ7€kæívÅý‹F„ÞFªËÁTMÚ¶À…Ú ¶IãÌa´ŒDû~œ2ñ¬>åeL©U™)õWÝ4Šn<Ø—ï»îgÕ›BˆRï÷®ÄpÉ^12bf?¹JnÊr®õ8Ë, .`H{Xy<×7:¤¬Ñ’c‹±7G>±¸³’„œÕóoÎoŠˆ„P¡°Ÿ¾ÂYÆÀI "‡>|‰¼|l‚ÏKØàÆÀD/&¼ìö—å/y£2#ãåÌ•CÑø‘º;&ƨô{P-ˆv?)=l‹|¸.Í•ó—lCÎ!2ÄMTöÏ´1ßÅy´¨–‚Ëûý“!¥ ­”ut€öv^).f·èà˜¤l$™D5°•̽5}®™t^s$¤?êºtHsÝÅŽUuæ½ÍÑ´‹g®""s‚´¿Nîaî»ñøIiÂö&-¬ý#þÄ›éÉ0fc]Œñb«yžéȧÜÓkïgeÉõ—ÎrìºýÑê¥A£ÅOíuJˆöêå*õñ}òl»>õÓ€~HÆ”hتK˜>{4˜Þ_ÖE¶({‹HG¥À!ù(‡ïQ‚‘Çñb¿Wk™MmÙJJ† @õȰ`'×»6ˆŽ€¸h9˜)ÈõöqÚ…`îM}H£éCÙ"zyvü×W^:ÕŸöìtñ[ŸoÕõîf$:O£&ù Ä{j:Ù­,eìOψyZä:_¾w)õá¾qÕ|ÇÇ®}l·òl±gÎi;«¸è'Yž/ºÔ²‡/ÛÞˆã)8h9ŠZÛwÈê¯æ ´àg9H¼Šædþ¥”ïtUÉç£[ãÀx2ÿK‘¤à–PŽÅ¨‘M¹ŒÝØPåÀ&¦ÜE«œwÉ\w óƒÕì¦_ÉΣa¸;6žj ×>ä62£ü$ÕuòFzþ˜·ŒùÒ~ȶ¶4«ô@oÔSùwÕ›Ø9O‹@øk<Ãa¨zø§ r‡@ySæÇÛ¸Q1Ë\fÁ(ØEœ@)9¡t"ùþg³Æ+\ï+"P!,RQˆêŠÂ{ eÒÊÏñNc]›¬?2¿9aÃóJz°)Fü´5Ìët?y•uÿH„K:«©%̤@¿N½+ØûÔÄ‘^#óËt©˜=²h¤%›ð»÷wùüåªS(Ça„O/8ù¨-ÊåŠèqU´É²ØÔ¼wÈeËŽüîÂ,rÅ0ÖÒûÎÙu\+zìð]Yeì” /Ù¬@üqm@l–ÖzªyÝèˆJ•À³Ì¶ÏqhÅ]³ËÅønû&èûG½FGÑbƒtb »’E¼Íàƒ>.SõÑ}À)‚D7%®Vv…ÍH¸6˔ͳõÙ)?ùORE Ò€B»µÃcBc6éTý¶ÄuÐÞ$Òk« 7ÊzÓHPßÙu¬!·Rïº ÷7N/AÑŒóˆ›ñ£·™Âúº‹‹xÓUàRâ§:å~¼Ùœ¯Qm¥º³CI€jšå¥z TziËuuÍ3äÓC{¤—~¥Â-ãäµI¡¾•ad JªÔìWBO%0ƒ¸j„êÇ›á.ɾ:AtܱRnÕd YW.Ó1p?<|T%•zþhæ¹(ð\µät÷m$'ÚÆz‡‚¦/M+dßYên1Í>«µýÍ ñÎK"ëÒ5v-P¬ó¨· ‡Ä=Úߦª9¶mùÐyi0auÞÑ/4»^~Ô«Ô6Ž­ ha‰ƒÞÑ)"Jx7h ûá<`Ez(4¹cŒ´»%a·go³À$½ZÕÿQ6ÄšÐsÆ%XŽ$ÿº“d`bÅ<£G÷\ŸöÛ=ò4¤øiÍò£¾‰CÅ‚ˆŠ¦ì¬üy•@} 1䲜ÎÂdU”·¤E¯/»"÷߬ßì[›eñ'b”º½ó¬šwŽ'R%ÊÜ =¸!,HuŒåÎ}~â„õ,ÓN}¨ùŒ³'wð¡qMaaÏ©_z ÅÊ£âˆÍ?©²Ð,[‹Ö­µGËüLŽÅ<©³ÑŠZ‡|°[J%#„Ó×Ö‚”&¿N˜p-ÉùÅÑWÐÚ„¬UÏs]?ÖO?®ÝTÝ/wÞìm”é)²Ëë8Žþœ'Põ‰¥Ý¬¢a&îÐX7ûúÕ|¹!žû³"÷Ý "îóƒouˆòŠ÷”ù[êš;ýÁ«›Ä´ê”Ï«ÐÒ {or&i.Zùß5†ä¶QföÈi­]™‹å»b®­ ÊMÉ‹¡Éœ£ÏWkÙ—¼sˆtÃxh½†%nû­qÈ´ ºÒmgɦ}©Ô{ 0$žŽ\Ù+ó4nšcþ„e e`|±VdkèÂ|È9}ò5é®nšáUYãÕ´°öMÀ-í›ìþ·’ów“,½µÇ Ïn÷ÊÞOD¨#Ù ¿µRk$cCwŸ IÂ%Ým¯Ü&Õ|h94ÿʰ)í°ÄÅÏòl¤L({,hXøÔ°eÛ½î qYÎ9®–@*µ²¶_Ul²£ÑxZ'_o¶htkëd»åŸmnK¢X:‹Epi—v»ù< ‡ó‚µØPv&ÊÐé½ÿÐ’º èE¥RÚ‰ÒÁ†dý™ rt .—(mShsó¶¦7Lf¨tÞÊþV£·AÖF×±ØjóƒÁw¦‚nÖôÍî’ŸÕ*ãF¿á—fæÛ÷<1ʱO6»ÇÔ¬qi°k?D:ÎÆõ!-XðB/Z5Ñè}w0»=ñ{Uà@Ä8ÄŸtï¼,ÝII˜LĽ¤GÓ(‘”X|z^ü>W{G1ðæ[Ëäö+#à3RÈ1žldK§}ùÞ1Pýª‡\v­)Ÿý|gLæ,üרõmÃAoà—\?7w÷oE.¨Ï q|·é6¨p”wlOBØóó%cÈW_lÓ+ã&ø)Ôô»~ëÍPTùšÏHÁ[( B4và’îæT‰#u7RÌŽ]{OŒ’Ù¹6aµâã”–Wu5ÌóÒ]8ïvê%ÇŸîò¼ ÁxÞ«a1`*s³ˆx"²áx?×7'N0ër«ÇÿÌùíÊ65šƒÕ«æ`/‰ {$Amÿ÷©½B‘’°Äå×hêO.óªxOlgîÚ™‰ ©Zö0~ÃK…˜oX°v{Ý\ªÚ­“öâ+Dgú˜<’1Жⶎ"£Ö”AK‚¶’ÕÈë­¤E;̱ËmŒ™ñ)¢Þ0*¾’ #¤ ‚zÁ¶PBä.j ðMµä±î)_Ã’/\}g²©B"“Ÿ6[”â“UÐ\¢ðÛ®À$ŒV‚‚É£ö©Eæîá<áŠ5 1ÁXß‹Òxõgz4—*ž£QÙZ±fs‘6¾*}·èát¬º`Þ.¸< ]$à,Hgeøá ý’¨þ\k•Fìûñ*"KN“¬êGÚ¯xMGnÛèo{qVæ‚N²É“x?øG¤Ê¥Ê ƒ'±=EL=?¢Á|¸‡Œ8*^Ž`§è)´‡ö^ÏèÛ¯ÈO«ª Œxúå÷õ°wÞpûˆ–t¹•f}޽nz–@óý®\84VC¶ÚEúeÆßXž­Ké±Ö®‰U9Ôq˜Ø^í&.QYh?šÙ¦¾º˜ôÕ„TݼÎ*÷Ö4|3JÅöu—EggõjøOËW†&2>%ø¯÷Õ.íªÇ}ÁõÑ6Ô ªJì(¯ÝLGŠ4J©Þ‚ü5]ñåù*ýîØ¾âÕ}®Æ^óqÈQ˜v|-0 b ÄZðl·mÏÇÍbBúCâ­÷<"á÷'¨,q©å _ Ò¨Yz6lí1! Ë”7¾ï0A½çahòJÎûÁNà-EU8ŸÐ)<”¤Ä”ØdŽ”þ‰wõ’Ó„à3 ²[¿ÌÚâêê27`»8œÉ· F±xÞÔÅ;%òÖ3Ëõ¥d†¨1Š¿’q´$V2èëÝ÷Õ±µî©OÖ"í|œcg™õ] ªúH*‡ð¢¥|#Yðƒ½b "šm)xCÂóygx«<‡¢é]-V8ªwôÐÜs§¹väËGÙäÑ£ãw‰nõ‡Út.º?Å9©ddr(ö5Ÿî–  b˜œl‡41ñã}²úÒ¯_Ùr„y;ÑáoyCå#±Rªô}ÝïÂÚÕr00ÊQغˆF‘u¿àÁŒgšì2¾tÜ0´:ü!žê£”åÒáÚ“Ç|Ø Û‰ª»}ò‘ˆ’ ‡ryϦ<÷¾ýصEÄHN½Jã†5‚™äFdEC„S5­Ý‰GJÙtý…Ë¡_Iãg½âBðËŸnÑ•|§9ŧïz½_‘_í¿Ä4ÌWËqcí±¹ØÄ*ZÐ.¤Ütª(•蔵Ą¶eH" q[ßv/»iªâƒuŽû¯¯cÚ|ðÃË\^;"ã&ñ:¼ò¡áy<¬58~-òÅE)ß&›ñVÐʦµCüÏÇ4yeHßÍ9 ºAka¨·3†ÏUg.?3"¿¹lv>T;?ïCì~1s«ÍÍ«—s[Ð/Š‘ 6 ^aƒú^ÞƒÐ㣒LÒS¨ú¿°Â>âÌô}Wý¥ˆ2jøKUJHž¥¬ùí&«i7ýë„)S†vÒŒŒÆˆŸî¬ÅEÒfA¢"¤4[¶@:Ç(Îw'põŽ»ã¾Ù ব k…ÁwŠîÏ×ç#xð_‹u6£Y] ËìÌ’'ä(ªýFÊÔKQ§‚èˆr_R„3ºLˆù!ɆDô÷…Ø|ó‚ZrýÆ­Xx©1{ãô‡hÅ7tòÅU8*Кf®?~¡òSßr|«–´ÏЉŽ2n¹³ÞsŒ2¸|Ï}…í„>7cg~ïÌ‘a…#ò°ú¸*Tø…#Ò1Kžìõà‘Q{é|ΰ ½˜êÂ|TqZòx’AØÃIHû†EËh%²AׇMÔ²”]绊&(@Ð~Xfl¾ÎdTRÏ…ÚòÝÜÊ–j Ù[üн»Œ&³Æ?ç‘ ¼q{ÙyV@ôÓ0ì ·¾5†Øzc[|’ÆKåÞx¿/®##w²ujÞWÖt 0Û®j&8 ‘ó”Øå¯¡Ž7è3ÄL!µ7ú±ãUTœñNR8í+f#U¢cqÄLV2ê,Þ%.#>^ E¤OAFKBçУaëÄSRmÞ Àèó=êltÚáMQ¼€©N›ï‹ !wqT/ÈYóô[ôÞ+µþ@Q¢Â*™”ÈÅ@ÞÃÖáqƒcesÕÖ e³V5Nq¡ÎQ³VbRr6ŽúR;lm³=îF;œ€ýÂÅx¬OÎ(ß,7Ù_Iˆ¼³-¬ÃZoÒ»—Ç×Ú£ÉLn˜åã‘©.TD B—÷Ó†#“Ï–él—pœJ¾é]7Öƒ=MÖˆ/ÂÃ(ÝWz¯ŒªÇÒ·]Íf*míõ³²‚x‚Bâv˸l6”Å— ì„»ëËÉŸ'ÎÀøNÔ m-ï;=M=µ&c@»XÀ£Ã1_Nz·–Å€ïèB+å{lI#{ã«å¦œ‹[¤¹`éœôk.ÓdvÆÞ.dÅÇø×—ÛRl·ÙÈäì|9K ’¹óÌ¥Öì+á³O¯X”tï‘ùHPŠgÅ“î¼*0wåÑϲ9=3ÊòVD”F#Ã|½Ÿƒ]ÿr”B endstream endobj 840 0 obj << /Length1 1417 /Length2 6418 /Length3 0 /Length 7370 /Filter /FlateDecode >> stream xÚTuX“íÛ%tÒ!Ò“ÚèFîîpŒ#6£œ€´HwwIJ‰(H#ÝÒ- %Ò!úÖïý}ßß±ãxö\×u^ußçù°<ÐÔá’¶BZÂä‘4˜$ |¢¦£#cA >nˆÀ¢ G;Àþ‰Xôa(8!ú˜'(}í“… ¯¡jHPÙÕæ‚EÁB¢ ù ˆD‰e!np+ 7P‰€¹Xž kæÇHÿå0ÓDõFñÆS@ŒûâÅΞ®Y’vº–P_e7¿Õ]æ 4‰œX­,?ÞýÙ‹ÌB·­RŒ¥Ùã-«Ž’)Ïib9©ÚÕ-ºû·£¹0mò­“çª9È„âd[>|†Ö3MLßHËbˆC>ßö¥ª”Ë­1ù~ð†.ô•» äÓlŽ˜×=¶`/ Ãu»&6ºXSµ:,¸Ç*s¶–°ý¥ìÛ*ú~^òˆ ‹’•c3³LS}н4ýDtù7ú¤‡³ŽV7­¤?…™É‡× çfÇŸ~ ®,ï‰3»5sSÁÞ×6¡¹Ix©LÔæ…Ò\„ºÏãs®Ï´›±ö8ÛvH¥{^ZŠÞFæ÷ÁÁãl“%{"«ÐåO¾2ÀÑR„¾;Ín@ˆDWæ@ !Éa¿ï†.ç*öQÌè=ÞÏ€Cù;ÌY5xhG» ºß°·Eûù󢈲U_k¥É¯“GÏ3ìàLíðãã­{ ±´+hûo¥ òn`ø½¬ÛØ"E í»Aߨ[yãSº_Ÿ+p©Ÿ=µynåêMvúê-B .F÷TÛüBËû”vyáÇo†nIð„JÈ]–%[ú‡Õõ;_VHíâÏO†œ”".ñf?uJ2—¥ËÑ: ”I~uUÈY¿j”WË¥ kÁ5颎ª~“)ey¢jÑ -Ô Lž «xØo}Vtó¼ j¡åkLɂߛ¯iwê´+2vÛ‡€/RV¤8ÐðLªPÜ))åÿÐ'ñóúÖ ä"…ß`Z9ènIÎJU+~œh¹G ƈÕ“rz‚÷â}ÆÞNéN"ÞIr™Ÿ"‹w²üx«ÑÒï\)†E(óû«CŸºÛJß7=šÏ!ñ>‡ÐvY©ŒÌùß2Îvù"1Tž¼ÑËþUnÐÿ)ƒ£—d‘Í×ëûB‚Æþ“.}ú­#CsY_ñ>ª|®³Ÿî?w9"öcªºR%Ð<–„u#FRÒåÎaé¸?‹7ÊÕóÝLÙ ä|Hšø;À#ûd᜙®œ·J8ºœ}¼|k^½6ÂM’€‚f1I|¸º`%F*¿\MN„{+Ñuq\™nÕÌ1}ãŽ?j’’'¬®SK¬k½µÖf[g¯ÇtìÕÌþ½qèûèÛ¦WoGŽc¨èÉH252 äç·ˆžy¼é„žo"ô·ŽZߊ=c5rï#½AKmõ>¬ít‰*ú:6"‰äw$Ã$—.^´ÉA:QNNk«bxoð?ÂÖ¨žM—~ôÑçï7YfTÛ<Ö)5kFlúyt^2z]uˆÑÎL»™ÆïZÁf-ò5R²UþLL‹Œ´ÀJÐfZWzÝa‚wZ–ú¢‡8¢]XÂ|-ãï­ kPw¥'ZøX”aœ*\3„ÑÈÉ4ÓH#Á‹%ÈÿŽ‚ßÒeá8¨Œ…ÿ4Ü ófÌ…æ †Læ\Õ7X`˜j]'ì>$b¿§Æ¸Ü mÎû›£‹Zì®9BfdÊöï=›ñ›ˆ}C»!ã»J^gî©k–¿ uZ7ß óà=ï)£¯ðÙîG:l?›5&µwkS0NÏæ:‘«Œ»ýòdvþüß“^ùE¾BDZÍ+<ˆëš ó aJ'.î¸!Æç¹^濃“ï{Z÷¸î+Ÿ@¦fÖÚÆU }[IßCÉx¥æ­¿h™7dÅK¡ `2oλ§OÍÜQE_ôŽë¥VG‡Î©ã+ƒÓKã«‘{zž÷Ä|—€Ä¶`TÎà”ØžœÛ7­0CX­åbX*“÷¡ÕñíA}”¿Ä”¶fåñÊD",é—¬YI)üVðtXŸÕ³nå™­Ý~'ß<­¦6ÞZ éP2+vlì&ù"Gçj#l¸îb·=nß^2k´^Vy’µ/l‰ÂY<ƒ UøcJóýCvtÊ—ætÃ[&Wü ÑÕ1I<@÷`™‡ãpnp}‚áìåmqgPoìBŸºÒyˆ)a—ÿòþþ¶Ät5 Fm¢¾CSb^‰-9>E5q_P>™M‚çÏíÞ‚GcR'5\vÊòæi=íþü=yűRîÇ_Ëk¿¯˜‚h-­‹OJþ¹˜~wš-p9 ‹2†.ú¶éÐXG•{AC£ùœØoï‡ôÍùmGlhµ:ž™«Üÿi/Ì$01.°ì+Úz±e|°­“:e€Ó‚Ù¬Ü!Ä1qÐúÑþ>|L=-1—Þóõᥴ› ——­Ç1µÓŠ“cÒ8n®‹Ã¦j¦Ž®°c¹œÁNYÖÝ6kßp+œó㣇g|vc©ÕêSÆ…ÈsÕüËrr‡¹ŠäñÏ2Å Ò ×èZqö±‡Ëºƒƒ †ÏfÕ¹w–§%"Ô¢FJ$uá¨Ù)z•'ê€9ç§=‡ŒVUzh±éÜE/º=Ó£¶nšçMr5<¡›Z>qŽ Z'òÄ'…8ð}(D¢«•8Ègà üªÊ*Mɺˆþ>î0IºµÁ¡$‰^Ý[êùfA¤ñ”¤D±W²Ç5“q{1é¢õ^ oDY}=dƒ¬TïþmVE v’‡ååh%©¬ÖØãm›ï–1pj-¾ÀóÒâáýœ7¾*ãÚ§!?aÊ—¸—˜í,Ù‹ƒ/*‡µäduQì£CøÔXµó”ñ]M›÷ɤ»eÛ~¢¥Ùœ "\6ü¢2W‚3Ick%ßðzF¬³«µo¯÷Ëî+§‡P呸¢bLRfw{`4ïðPJO”º wwê›ãžÄš?4øÀ!ñK¯RÞ0XŠzJ¯ Å”=JOßÖÎ-%S›E9‹ˆ;0Æ5kˆµžÊUD.p<ꪤÞ'l]ør|“ ë-ã(Òû6LW‰1eé&æP.ˆÄ“у‡ÙO¢J"ò[òcµŸÛ¸ÏÂò>·Šð»pé'cɬáÂ<›;‡iÞ¨öiV<æÞ¼âÅ“®ØZ\rŠü¬ôúa̹µõ¶…A {<¹>Ý'AŠç ÷¬z¬o›Œ>ú¬ý8É'ÏUíÉŠÒîw^·ù [›š. ÷^Ç{=JzQjž¢Å^Pz®6Ê/0- MÀù²q³`ß)e]½öØ oiúx¯á xIÆçTƒMÞxºTÉ*¬ý6ö\žîNl¸¿Ž[ª¯ ÿTÜã1ßNK‹äj<ὂ€ÚJÀ†ªòÙfä+ ‚j:Ý•\²€9óKåÏiÏ4ÔoÐ $TµXߨ6·'$f]¡JB-”§;͉Aïö(Ú›ŠsZð…•‰Ù˜.>ïê?[¹¬ã=œ\d+0Œ7þ`h)ëæiÚ¦f[¿JØÈq#¯h>øpC!$ß’÷!µÈ=Zhé\µFw¬Ïõ!FpQÇ\3y¿ëÙ¬-(°tmÑ×=ž—‘ Ã6º³õ}érM´qò86£rZØJ¦Å8âþ â-¶7íº±'xX©ËÈ`3}k-3-"¢¿ÝmŸg!s$Yf°rqrڦʓB¤>;Ÿ…´ÚŽÙPã ]t‚âž:?ÇÍ’®¬ïXsõÁ×½1»>³ì£çs :(áâ.—è`»LžKñ“=ŠÍä%ÍÎÉ5Sþü`‚.¢6-}Šzµ¿xá~iÞuÏ£_Eꉚ´{@›¶üØTY?ÿTCÐ ©Oø+ǧøF[½gWð9fRÙ,! Ætý°ÀV%ÛÜY0ÉmÖÃ’´Ài= [ƒ‘‚ßž¦Ä'²‹¯´Ž2˜à¨S»˜pxuð§2M£UòG?´ù õI´¾±ôÞÇ”ƒ‘ŽKª7ÃúßÒr&þèȦ.ÈKÀ_¹4 9ÔÏêØt;8Õ8I•lЯ”Š‚…zhµ`Ì0¡ž~ãaZÓHãûãÂÎÉí‹Ìú¯úq³u–ŽIÓˆ¤šjÄgóDY@nÃ=OÍXÞ ](ytЭ4š‰L¦3zT`ŽIm+4“†»Ü኶dUo¡=œ÷7oP\öoâ¾›’Y7µ³ zTkëW£ðɺ·ÜÚÝ1È [É«!g‰hÀÜ9éƒ)ª$¢Uï‹N|ýfÍÖ¨cÒLÑЇX>T3<%p¼ÈX8´•¬¾:I žç®Š{ÐCØ9õ¥öÉÓñ‚íÌœ#½[8‘†c{‘cF]î—u›’bÑL£=©«p㘸—Ý÷p¶^‰üã§F8²[Œ»bøœ_› /%®ù/‚¶„|àVÎ0kØ–ÝãËçj@ºÕTM“G_œ®ûP!VOr:Zr¿¹šR–Ð`Il)½‘zKä§'>ñLJ PØÖ õ”ל ·.)·1îìsþ®¯7ãrñyÉxk,ëñš¾4Æv8.={sÅiÝÆvh-aã2¼üií©ÏêBF:ç¹íSë^u ×ÑúgƒÁ…{Ÿcò¼©#H(^5FdÔ±Jë»É,1¶BÎCdöёՕ‡“†ŸÂ§}!hsa­"Vƒ'DË]Jô”¦Ñ²MD©±½ó¾¥ž9ñldÞü&å¨4§î*3£›Ú/NkÈïÉ^—cCéð7!D5^˜áƒ‡â}¨Pê9ü¥‡Þ&µ=Ö}¡Á_>Üù‘ÕîÃC~' 5ÛRä#Ó "¬Éò¼úƒè.µC‰öÜkóQZüsÖÉž†¥˜—# Ã?z¸©Ÿ-éí†ÍrËnù}îΑꨓÄ*ìÞ¢H¢sŸ¥޵à ±ôœ9æÕ8 Åç(Zöê&:r}—Ùúæj[r¶½«V¥4pï&¿j]^¹ß¥Ëô½îÚRJS“¯ˆCîÿAÓ4œ®TÊ«cóÛ„¢/qfº-œ*lœF¨¸w~²ÌRü¡nHÅ^ù,oÏb!à«UiÓÐíûì?5öM;7ÛZÆEåÎv^*"ƒø Å6ϹºêýVÃ7ðÌ­w¿YÇõ%*%Â%wíóÙ4)+v¾X9Ȫ‹zƒ"ÐnZà&•èeÃdõ9qõË pòH±(½p}TgÔLl_ݸªgàRK¹"|ôxùŒÖ¥ÈM&êäü\Þ8ýø)#;Ÿ÷ú÷ T÷»x©þäÄÙSþ²EQ7ªÎeè‚Äc¹“™„yG‰pÁ4½ì¼Áï¹ßŒó'âìyœE$„÷…RʵÜln¼)Ç v iXobÌP§1ÉtÏ ]L;šlsâÇf$l“k¿ 4‘£ÝºGùú™ €˜î'IÐgz‚W‚n4I$IÕO_Ë6¢k­’ǔ݋״UlGA“Âs2¼º¯FÔ„¦ïÝ)бʯì±é“1¤íúìÓ¤>{æÆ6>[1ª±Gv÷×a¥N¢” V£š/tÝó úå|U7˜(½-†Ì*„†Kw‡äÍr-dl°Áa4¸/mQd¹Ûüdõ°y¸gïŸ(pt¦>y?³¡¸ÙÏLK;¡áù ËÒƒ>Ž ÎÁ¢Ô^g*ÍaÛáL[áãf—ÇŸFaÁó$úG¢”ܧ‚ÍÔ®ã ̪D~]Í@I\Ú4}­Â~t€ …Λ©¥ÈÖúꇳÄxö8ý~w¼tÔë,t_—u³3½ŒÀÂö>3xÅý÷·ÝeÔ§ãä"?Å…jˆÂ¡o7íºø„(×ÄÍš m[‡ é:õ7¡°Î†îrQfrÜ@Sãgø©ÌÍü+B?¬Ù?8¬b~˜éQˆ<Ê3JY߉^mjýrhéJ¡QxFPæt¨úÛƒxŸ#5ï4즂ƒNó=U©±Êá³°µó¶Eãõ4åÞèñ0¥]kç¶."Oñ¯Žq±Ýúõ÷(?‰H¬¯&ºûºç#“ï¦*Âåb³uÒ ¶Ís¤Uønu®lÍ^ù Lܹ›ÝAYË;µ xö^˜§÷ÕÝS¯…ªfÑ•I‚§YMš­–;½)áÒFªWÊàdÖ”Üà×µÉÓË›Ç L¸2Œ5n_ŒP:ßšÌ`»…ÓI¾/¿¢Z={Õ9×רÌ,%à‘T D^±*¤w‘µ›ùÔ&Už.ß"§¦{–¬×,é¿o!ö5vêü;çtkçëÑ1G~JÂàDúé«h²꒥\ù@¥†ûƒÒãÔŸ—Ñq¹¶bA¦O«¤³Ñ_ PWªhèOÓŨà ×ç[¹ÎÚݽ¡B\tãÓ/ÜFaïVŸÜäE˜|Žš.}U5^Ëë2·Õ’z•&ÿe›Yú|Õ[Ñû‘¥^s§J¨%ok‡†-ó²òæÖ¾^ÅÂÊ*ÄåÊMéŠü|çÃ[O,NiÖUÇ%w­Á Olîdº:œ}ª}·;}ªFäƒ÷uà«·–ö„g·i‰>n év Ï sw5¬8HS1ì Ï*û%%¸›às†ÍEO¹§mðºæ¶ÔÇ'ŒçÌ?¾Êè¼»ÓÚÖõîV OÉŽ³›ö©­|ó¡ÌÞäsê¯\Áïj0dKòkòžRÙ-))h77–¿;ÖÐÞÒhÑÖt^‹déÚa/­Ià“­Í|Ö‚ËáÑž>Â@Æð$»mm¥/à{ކ{=ßœQ)3ñâS?Ó`›4‘À)=Ÿ2V?MúÉ‹îv*úŒâä‹ÝÈ™£‹X¯U™œ?ÔZ¤XØ«à7¯í5R×îï­hŠ›A©EÔ)ÝOÿ<[¤~A«YG²¹yßÌ^ùEKÓkÖ•=sKÑ„3UyO"^nWבteS$Z®#KÏŒO¤Šöàåªö¿FqWì ‹Ì}Ô9A%C}]òtÅ I6níéhT»=uñXncòÈ臭ÿÃ(ý¨Ðê鹞~RnlQ¸d? Ž@›‡L{ÌüÚÆtp§¥ûnLS}R– ïìk‚…ªH€ÞaÜ£újQ)]Æ¡^Ã:ï^…qNAr†[ÓãáÑ’/€¢–eù»Ì 5œŠÄ#?1ûU3)—Æ/'_Í+f9¢Kã²ÒŸ.EÙ§„ÎÝ'1XÔ̧kx‡z\ÞܸK«d%N×-ýlpØ7còª†HPi¡Ò.H~¾d˜U«ô]›Þé+ ºŸ+šùöÞÃõ°M%6{[Ù Ý„û8ƒO”_ùß§õžv¥ º™„EŒœnÓØT@¨½£Zù9Sxb¿UXÔW\ÙÕÞ-Áç¦Æ>‘í Ž&– ÊcR:®\kÜ*™c¹@M¿ÿÎdO*q¯A€ƒ°ÏÿÝgÂüþ­²¦N­ÅÍð!¨Â!iš\Yådm}ê]ÔÈéaµ„!é+Õ w†WRé4“ëcé #ílÉÃ’û+’ØÌ'á-áÜÅfôXÚ¢-Ì㜄+À%çwÖ,(&'åÖ½tA^6¤^H*8"pÇ:C´Áƒ³ØÃ«(ó­Th §´Øÿ6ïýñü§aUÐï,øå­ûý¨¯ÇUÔ~41ÄH[ˆ“JÈÕQíøœ“ wRý@ÌUMn+ïçTÐ÷;kGÖa¦â´óܲÑûòÇAN9Z}ChÏÍÄ,zµ76êÙ2¯r—–$k§iWM¦ï{(º”"Æ¢ eü¤ð8¶±}UÌvoá7O6¿`Ó=@KÖû òå \'P¡ÖP¼2–&‹Xú–¹áQ\¾ìúX¥„;O˜èݯS¦¢™VŽ.ñǯ:<ä˜`âÂUYQê¾§bäs+¿‰ÿòǬ€Á endstream endobj 842 0 obj << /Length1 1620 /Length2 7636 /Length3 0 /Length 8715 /Filter /FlateDecode >> stream xÚ¸TÓ}7Žˆ”tI3º[¤»$Ç0Û`£A:¥KJ¤Qi$”A)iéAßéíýÜÏýüÿç¼ïÙ9Ûïû¹úº>×w;cg60æWt„;€Õà0¿°€4@YרRX $$* $$‚ÏÎnAAÁãøìf`O$“þ/ eO0…ÆT€(´¢.Ðò‚„EÂâÒÂÒBB!!©¿ážÒ 7Ä +ЂÃÀH|ve8ÂÏâì‚BÇùûÀâKIIðý6(ºƒ=!   D¹€ÝÑA@(À‚€Q~ÿrÁ%ë‚B!¤}||€îH¸§ón>€å0#ÁžÞ`GÀ¯’z@wðŸÒðÙ&.ä_c¸Êè  (†!Ñ&^0G°'`¬©ÐG€a)ëü¥ÀøÓ€°€ðÜý±þåûm àî Ìs8A `€¾šŽÊÅÂ)¡H8Úè „@h…ß©jІ ºÂ?õ!Až )€„@Õ(øË ºÍª0Ge¸»;†BâÿÊOâ ¡ûî'øg¸n0¸,àï“æèô« G/„ ) âáÖTù£ƒ†ðÿÁœÁ(€˜”¸¸˜0ìû‚\0ñC€ Ãè‚pÀ ]8âFà Þ`ÊÓ ðß‚Ÿð……Ž àv†ÀðÿñކÁNÑó÷„ø¬„ÐôýzýçÉÍ0G8 ê÷úï ª©?ÔR3âýSò„JJp_@¿ˆ€_J\ ,,,ýÛò'ÿ²Õ„9ÁR¥‹îÓß){ÿáןáüÛ—Í\0€ë¢[ ‰ ÐoÂÿÏtÿmòÿÇò_^þ¯DÿߌԼ Ðßr®¿þ?r ;ê÷GÍ\/z táè]€ý¯ª9ø¯ÕÕ;B¼ÜÿWª‰¢·AæŒf4¿ð}¡ûá¤ÄìhA\þbÍ_¸é¯}ƒB``8òë†A[ ý ½d 7ô-‚DSó·ŒÞ¡ÇU…àŽ¿–MDLôôúá£g>‰„Ñ[éöýMf€  ŽB›Ð5œàžø¿+""žp_°‡zháo\T{zÂ} `'Ô?¨èô¯áþ £i'è¹!¡@¤Ë?°ø/Øó¿´WO ü/¯ÂB¢à»:ÿºVÁžÿNND EwÅÝ ôO4tÁ‚î@ÿ„ÎÊóBþcˆ¼ (ݽ_Ø¿Z òòôDß+¿9îóßçß—ì áÏNÃA2®¯#Ú.ké|ø7†±—W:b“-{cÄPŸž¸èàä¨Ox(Ù;¾¤|b0S5>HÇóõrÄ׺+/t)S£…¡Ú»¦tÈ_øáÛI—3˜ÑNë<*ñ$vô ÅØÞ ËŠ3Í|ú:R¢[tóÕ—â›äæC©]€; ôœ„9“• ˜ß±‹ùØ’™m5`iM’Hæi•åe¢i:zƒù’x¡ÔOóÍoÍ*1{`qñ}^_ïÑã"ížjñ—Qä4þZÌùƒ©ý4”)yZMH %±s劌dš÷(Ž¥ÛöKß'‹úÞ¤ô‹z58ë)‡ÞÕ4ÔèU›–Ëï^:¦·[Ï5ù&HHÝœëÂWó„M‰½Úã| ë ZZЃEÅÀ®ë˜ÿ©; /+¿°ÔÁœkŒÇy.jûeŒúÒ>!'EXÄ&C*Ùÿù¹’¸”1èd>w-› §e'7м­Çìºâ5ÈÊ'pö¼ReÁ”;Ýj~ß6Ð}gûÊ@9šlÑž³ûn'¥ISìü#©ª8ªVû¼ÓŽ;)?i2ب ËàM‡ºÌC©™1–$3QâBÒO&:›Yzx–Ò‘Š!“$Dän_+^ͽz&Ö,—!"ôh~ìð–Šá^IíÚ]Ãîowl“<Epmµ :ºØ—éqj¡î'Cw“¯·”,'B%¦— ”~˜Û‘—?².pJøžx¶yÚpP`¡Xó›Þ9¼f÷|ˆ¡ýa_"}ÖÛ±½žvÎŒM_†«s¬Cr‡ué~–ˆhUc’X«òbe¬©UP§í´׳{È©ñô°Õ…ÌýõP„íVƒÞâ{¥‡’ €Œ˜s&RJtí¥n‡TAŒY° á™$!p¬!Ld&€áâÔˆ¿•מ£*Úµb{ÜGZw¥Ž8<ï¡_$o­¥Ôê÷]Ü. S“üîm ºðYÐB_ü½Ÿ"¼³öë£ÝMs:•0ÝìËûËe'QͤE–ISCEª‡:7"kv"-w_¶TÀ52ð…ïùNÐP|Øáìló¢ |'¼<¿2×cb0ÊQM?.ÝÏnIšÄ<ýΑ¾–eRûIe¬CŠiä"üŠQ-ßá¨ôåho4”PùÒPZ2ßÍ…Aïí4çu¥ÎÓÝÝgª º€ÊÓƒx–bX¾¾´ 6zñŦÒ=jä#¤,B»RÿÃD"³æÝø×“¯¿oRŸ‘þ°CMšËdweõ{)p±V¢x†ÊÈ'ïš>Ë \;;3 Šn¨•CogtœHúb½ Ã)ž@¥j˜+–w¿\•©cž3[ûA¨Ü:@n¯{2ïÝš¿—*ß]—Î$“žW+7¸ð€/¢o­¬ªÃš¥ê[cFνq£ý;ÞFÊ3%Xy†*.ø4D“ v|ùýTƒyÄíndT NÐMEÍK[ÌʺlŸÙòRGÍþn\  ÑpßïÉŒqB÷ŒL 4뜴G*†‘´‘_‡-«Û ÷÷¼»’F­ [¾Ï06ë°ë*ìfk„G¥‘É.p&j=œöN™âëc«gq1-Ó•?­Û•_ICðLGHx}º'7o Œ ZS'NS(ÖK³=͈5Ù¨“tjÐú–F‡·èsGÔ¾’˜ü2ÁN‰¡NP|•jäÿœüäÄi; zÌ–TÅeáTv½( ;{U)cpg:èêmßl>RĉSùÄoiµÆ®ÿÕä+£dZ-ŒVƒ3œæË-í˜ëûnúr÷öT)L›RË |‹pÕÇK÷¾¸a~Ìæ!’Àõ¸m5ÇŒ½wqÕ42³5i fû‰­‰#~ã䨆Tš‘´Þ„lለèL^]µåÎa6Ùx$<Á\yñuv¬n…*´Ý˜¥P&i+ãÚËÃ8_Qì8[\IŽt¾È6Ÿm²†û2;©v´%rü¢‚ÜF{˜?8( f¼ïƒBÁd&ïcúÑ­› pû0¿V?ùy* ’P¯" ãÀ…ù­rû0€ÑòiE¯˜*l}ã…ÙÜúHx'°"ÇætK~ŠsÿØUMËr!Où©ãÝmW†m´=T'•l °½m°Ïlˆ¸ÀëJ¦»hñ¿hë’)©{˜¹ÕÙ·î=Ã(åFàGšHÕ ‘ꇡUùði æJ³/œ7&}haób1×Á_]Yž…=,¼XâüU›9,ž0Xbd°Åö¥©EúgûGî퉪¬3[%Žœ/z6:éø[ Þ‹`Òõ؃¢g;éâgî¸FV?¼¦}W¤C$9úöt64xÒ0 §˜Å|—«£Qò±U{áô¤1Ÿ;ë Ç#Ÿ÷Ó<ÈÒ/£wøMIAî-|r;Ý¡ø{~…:!23ì:ÎÓ¼ÑÚ±ó ”qù‡bbGùÅZ J,r®pËðÈwnzæ –o÷Õfd·”‚ê2·Ýêæ{p–ö¹æ¦FmEfØI„0¯oöÜ#Þ`ÄoCÝÃá“ï÷*îÓn´R¾Œ(ô{J˜–4çÍDvÀû(¹¸€ñ]ºj(ñãëÙÛ©º}»Ÿ_ž3Pí¢f"o_k€s¢f ”ë·½õ¾n²¨‹”î~Å)È·i.T¼—ü6>7p³†k½Ålêh9N½üT"LۉΜÂɳÀn_î»:KgåýÁ( ]@)W'uOFmÔ¿àB]ã¬ÿ„NÏÈÀ–X•[Œ}÷ù‰¿­©î#ãh_5Ÿ(ö¯D¿À©{¿B3Ó¬¸žÞÒÕŽ‚vÔŽhÜZa˜„ú"Gt‹" byêŸÁI¥N¥>nsÑÔŒ—ÂܸåI–„±žƒ06!†™¡õU=fòN2²Xÿ“MɾÞÀÎ’Ž?]ýLrB{ÌÜû¿ðÔŸtIÀî“NÜv’ 穦۳>ëØ|Ðß–#Í3¼¤Ãà„9œ@Ù#•ÊLu•áe |#Ç=6§˜êÜS£Í³j¡Ý9oÖÈé?ûðdH‘aŽöõ|ônÝ”I[:iOvò¼ÎÈ2‘ÖîÁñ¶­ ¤üƪôP)ût¡Y¤›ùˆbÉ4ú*0#“û›˜YĮӸiÜŽ‡AhÐÅõD ÜÏøôï™n1ý@ƒì-dŽÔQcbÐúF>¯3B1„¯†¯K.еJDŒTùC˜DîÙAêAfuÓz’`mAµr:º-ƒBE™(£¼•Ö8Lz0 -M'‘AÈ3ðú´;âø«V4¼^¡¦v53ô§ÝáŽâD°hÙª!åv§£Ùé#¶C)Õ¢VªdW9üÇ6ò€ª­§>wªíˆÅD/JÔ¾:OvÖݪ”½µž»§X^E¶Òîñzôp˜iùíÒøýœ8Æèâ䱯¯ œ¨?â½8á›6î-?]k»Cÿ̳¸Ì*e±ËÛþ3A[Cí÷„{§Á¾êl? è"JvF‚ [Fî¥7•ß[íPÎNÕÔæ¤„ÉQ¿ìrb¾w‹‰g°½R[pÓû]¬‘d+—ÂììãBPs»B‡¦û“üÅç,˜ß»g€F TDæ?Y&Ì”5¶.ŸJ~t»7•rGÖï2OÏ‹˜Ž³SRÞÞ+PÚw€‰Ò«/yyMÒ즨iÍ}O÷’8¸Ñ¸èËOËÌYXmX6vvÒG9m"C ç5Hƒx•úš£éC ìòHoñ“‹ÆqÚý²Ÿ;³•¼é ¢—!²…ü8Ý÷²Ù¦Û¡Rf»Ì2ö¹³uÎR½\õúƒ•;Yˆ0{ˇߺÚÔ“ÁND-húËϪì‡Èé]FÞjw€2$xÜs°äzÀ2+ɳõ¸ãð[¹Ÿè%|5îcr«±ÖM˜¤â³ÚriSBÐN—L¹ëø,@5•r ¤ç±Oè,ÍJ6©¥Ùʦ -*ïÜßÍÍÍæþn5%Ö!È©¹ðªšä2–y¦ÂñàÉwѧçOLPÃêgi†_²c±VÊ)'·NžÑ›¤yt¨KbÙý˜R$Mí„í’~ÄùYä®Àá/#;Õ™ê~¼f‘¥ªßÍ{~ÄÉCuãabr vŒ’¥›Šw;Ä•¯q§áÎu:m©ÞÏXY-ºôcåZ«¶gŸ ¨¤#)cn3dÌâ@.û¶œ:m*Uñ¾˜ò|| º|`…ŸsÖצO0|ÎvÅöZŽ‚ösا<ùGQ7‰h%m&ÑÎý;n}mövI¾Œ²ãó•¬;<í45®7j¤´$1 H$*c_óbUÙ:³Áõ’ûûGžSiwíWËUnIÃ]]ÝVü†ºB>oŽÆê åå Q=ŒF‡È:¯€*d[ëhÍ¥Aþc^þ§/+ M?©U;3½4`y£=Å[Õ6aÙ– —ªâÊ8Ç…8ÒÑåèÔË8»áHu‘qYjò'ÇCí_}•±Ÿ¢Üü¢8†«!]ÿêÙŠ¥ƒƒpZÃêþ€fŸð~#[Ëñ">ügljå35TfÍhåÇ8~ãOZ( –ØÕäÞ„u÷÷)EcŸÏžªkϸÔ=Ò«·jÆÒ°Û‰ QÆ=4¡ò_špÂÛÄ“ÌL¿½eý­¬*<­ÅÙv³²Èfd„‡M†3l]Bºª'âæT<{iIˆ> &Ù©?ö^Ùé< Öž7ÈÓ\•ÿ””P¡{lóMÚœF†‚Ô›)9’$ëŽÅªÌ%¦T¼Ø2 ò$ƒMùf“â€ÀÝ&$ÕÞísS›õWá©rãq?îÞ¤ŠÕ¿ ñ ÑE=ð“«ŽâY uP¾ÝñÈ–°ÕK§èY[ål¼ì-͸>¹e}z1Sð^'s7¼Ð C…"Æ<÷R÷—Ñv¾?w2žÀ(ÓäÅͲ]'sµ`œ‘ÙíÝ>xx}¦ü¨N¾S+ü`ª‹¸©@ЃMlÌSÞmÃÉ!–ɪq¹ÝÐ#äöÒ~¸/\ËfåS%óϵ¸þ¢@ÐãüÔî`°éa‘Ùê`Eï Ò’¦/ß^3HÄÕ™"Ãr^MWôùmn ¼KÃ1)ˆW»V÷t^5Å~G"6Ä–ý$ž#°&©¡3÷QÆ¢zåúŒdþ“ÂÂjl]ïe.×{¨²ðµeáÑhìh?×fĦ×sÈœ:R&…6ÆH þyâËC<#«Ž{cYp=YWÖ/¸?8Ã6ßµ ¿$Ÿ!z+ÄD|i­ü4Í%=Nª•?ŒZ#˜}ŸQ;Æ9«¢w«¸»b“˜\!>ÏäE:`ŠxÎÂÞ§ho¨ô¹èýÚ±—JT^Z,QÐ GÈÍ;I)›é²7›´ÞJ Þ`ÕN^y‚b¥1P©S‹ƒc0çSpùév6s¶ê;ƒ§jòpêÑw®ÄR«Ç/Yr»œÓ”âžÆôÎ|M<•Q²5LÒ¯HýÖÉ£tW´.Ü öæ6[Ó²fÑÎÏ;}lðûøLYlo—íÂø¥( ß•lèÖCòågºú?ìLÔ4Üb$ÙsY¿mWêp؉w³ýf§ÊnGDvür8³‹dEß]Yc5šWC£Uø£B_¡˜]7E3li›UÚ0ã5eMÛ"è°6Þs¬k¦F9 $ös„×MsCÄ\êSfPE€dìò]ã©(*º±êgk¡keTiO KYý—Ó¯ÉÓøý¬('uâ\ 0-É(ë¸gàbn”Ë?ÒXÙƒq4R­1ø^øŽž"«‘¾û%ù²jÚ¤këÑ3w†÷]Êî¶<£ŽÄpç[w1æ7H–Dt{D‹š³©æb@®|}ÁGoãiZ)Ëv©/¶l°áÓc7«*Ǭ½$;6Èb»1þÍÙ㇔P­“j— ‚EîÇ€è“@®›:rJyp7t-OÿÛÑ®=Ùn"5+ y¹\Süžr¦öòmAŸš§î8U ÆÙ^~gWÖ9-:Ii¦òÍòÁûÜQʩּ”{‡ƒðKĺjÚƒá¨ÀF{,â^ïïì—LsÕ&Vû il›ƒ00f‹úSZׄå*쿸C”·ï”´—£a •×C?;Š×&Ž,i•Ïx7»ô£lf Õ¾Ÿ9Å}Ž×Ä-^+“tªh3êãÐtE;år9+øØ8•šev[í?ÚVû¶ÍhK¬(êý¯U?×{¢š¾Qä–7¾ÿÕ†IóÒÕ Ðì"…ëyî-«\¿ÑÔ)6,°ð‹y·)±'ŽFŠ{ö\½‘ ÉrwüÌtƬ?¸J©ÞôSøÒû³Åtå ÷÷_ =2ý €ÌCY?%‰ (3‡oRëá…Šè¸üŽ…Xóí^ë;ÖÝØ_X²‚/8½¾R2?˜ý.TŸp¯§í¹íÔ«tjî©lþ€&ý¤–ýé+£òîzbß÷[»¸L1†½¸§>JÎc)«m7Æ7oòsY>UBsÏýeZj³4ý¦¬U?Ýé܉Ex–»é4)`+tƒ9Þ>ÍÈ‚ö Ä¢Œ/¾¼cgÝçÞDõ_.;­d¡iðÂÏR§Š]ò¾›­A–=<æ¤Å¥¨m);Ëú¼écøšöô°ÆJVàÚ{H¦¡õÇñ¦Á Y Y}Ä.@®ío­GQ±y½vA¥ºƒÃ·6™ •Ó½'ç¦àÕõ›}.–ž 5o~ðA8æÓû4âNCóÖgáú7gã)÷yôý¿· €šO\AéU–×Ë 33£äI{;r»dé–ÔÙõç—ïwøÅ`šËjq‚yò×CqÙ+„6@¤@½žàõ—D2OaÞOxJw5™^ñµ‹Ñ×ц`¿åJðZ%û˜]p?³°ÎM[3bBÇã¡$]‘×ËèÉh#ŽÖ´æ@§€vyµƒêÙ-¼+,Å›Ô>ܸ›»É/•ãXο·Q߈ԩ«ͳJsœYaФ0…FÝã+¾g•gBak%J´‡]æÆ½"Òb¼_£›aNa¦’ùº _Ðàæ‰“›M,wÌsñ1+㊞~JîÊgÜd‚JöÈ»¢×αA™kÆ<‰ŠN5@Å0¥¯wŸ“!“ÆïËÞR{Aðb ú˜64‚¥œ·®úýyy ¾°®f~QGu„ ?óϪ;gÇM`ˆ¥‰¸Yd$%ŒŒÂ³4êSú´×OÇI{ä&ï2»ac} šóšˆ0º¼3†êm¨-nm`è èAVٌΠGMÝ}l%uʾ¼–ÕüÔÆ`Ýx­>ä Bîœ*óWöqvž½Áuæ;¾Ò[[>| ³”’]ö÷ Ör6 “$¡y Þ=ÿ:!C*ù4¡ ñÜÚl‘99·;ƯS1L Ù‹»QÖä1\m:¡þS_ºÛ èÛ蘱ҙ¾|¿¯{ÿù«U~êTÚ+ƒ®0—`É2½p¹d­ùz¡Ž›7ÁºÑâ-Lb× Œ×™ ËGïÉ#åÊA<ÛÉ*†cë‹V3Ï^ÜP}1\ÑÙLÔü6u¨AºlW†|/·* È‡ï†6S´†â{ÞBAÃs²Ùˆ"bõEG$méóD’3&GX§§™"`¸¶ôZaÑ‘ûõ‘ép¹üŒÅ«uBðÛ¼3Ãö^ÓÑ^sAêüçT¬ƒº©¸QßœH•j@÷{3¹Ù?žYsžL~.˜6zuY'9df½¸¬‘Ží°²‘¬¸Äë%3PÎm«zYá;”¨b¦oêì ü€bù½¿ÌéK`Öýùzjí3ûM’I2ËíÝCA˜bìv—ò–ÇTƒGé£èA E½ØÇ.3ûF_‰š¼Õ50ý±UÝ·AZJ^}ÿÄÒû( }ú3ù‡(‚Þ˜RÇùu#ΆÏ÷ªò·ç"Œ­³/X?tHím‘ YøÕ(PòaS»‡zo5àè—Ã轘šð:^ÊÉ^êÛc–l‘çWkß7ü†·AKß±ù´PbË9âq[ÜìÁ·º®R¼£á¤]õ‘÷©;† :™‡¬í’ç©@//ñâ¤þ—|+¡#;ïXêÇÜby,œì‡GŽXXÊÔU_b-¨> —k£çÖ0Âùê5”3ç­™"¹w'1ª¡‚l”¶@³ûz–o?:q´æCC”þ1Ó…âRáG˜Øö»¾©u™7] .6’ql¦Õ(ƒïê;Š­;BYS4àÏÇxÙHJR{3–¥ì-Ä…üÛ¨Íý¸KOÝÀýöªÚÌ´[‚­*ˆ V¬ÏêÆßYŒùn´òX7t†sêD¯Å.iÊ-€™[ÎG°¶ÉìkñÎlY8§Ïv-ߌs’BC̘à¸JöÌ/¢8q‡ÅnHXµû÷¶¨3èÏOûÉL\³?¬ÊÇ…8 …ÓL+z#—ç8Fö»O` F`5²¤æká]?Ë–ÅŸ¢‹Eø­³¥êå¢á‘÷G ÌäÄQñ‡]ÖŠÑ ÌÉ9›¥M/ºpæ«ãs è‹H’S¸’ØÛ?´ú!§æPm'L3_5nÆËθàU©¦Üi`Ù$ßúYÕþŽÿ!ÆÚgh±®æà=ã¼j÷:3öˆªÇ[§žÛÇŽm‰N¯F{ß^Ð…0˜áF†i ¬~–b v°·º{¬ƒë_¬¦“ÛªrQøºrŠÿÖ‹y¶7:Íd’Y–qúîŠ×¤”ÚâiäYÁ=T#{„Á÷S^íaÏx°²,¤® Eî“7ºŠôz HØ’Mùö/> stream xÚt4\ßú¶Þ‚èŒQ "HôˆŒ1e†1zÞ"z¢"zï]Hô½—$þ“rïýÿî÷­õ}ë¬uÎÙïû¼mïçÙœìZºü2–H ˜"æ JäÔu Å‚‚‚‚B$œœzp´=쯙„S†r†#ÿ ‡‚AЛ<Á©#U{H•‰I „ïÿ ˆDIä!®pK€º@‰€9“pÊ!=Ppk4¦Ì¿~ÜPèþ}±{¿Ã20 AÔ!h˜¦"bÐEBá0´Ç?RpKÚ ÑŽ@ ›››ÄÁY‰²–æ¹pƒ£m:0gÊf ø50@âû3™ '@ÏîüÇ®‹´B»AP0Æ`‡ÂΘ„% À誨4aˆ?`µ?€{€¿{ €þîoô¯DpÄï`Štp„ <àk€ÜÐTT@»£ï Ë_@ˆ½3q…Àí!ÀïÎ!Em3àßñœ¡(¸#ÚYÀnÿkDà¯4˜]V@XÊ!`´3ɯþäá(³íÀ?'k‡@º!¼þ.¬àK«_CXº8Ÿ àN.0ù¿Œ‰ä?6k¼/**"€9`îPà¯ôzްßNÐ/3f/G¤#À 3ÌnÃ|H¼œ!®0åóñúߎ®H@ €%ŠXÀ¬á’ÿdǘaVÖ˜ÃGÁÝÆ‚î‚¿žÿ=ÃÐˉ°÷øü÷ùõTÕÕÔŒøþLüoŸ¬,ÒàÅøïƒAæ%&.ðùg-üo‚ÿ‰UAX!÷ÿt‹Ù¦uìú—ÜÅÁøg. $†µ0÷Hn"„b^ ÿoªÿù¿1üW–ÿÉÿ»!E{ûßnîßþÿà q€Û{ü`Hë‚Æ@‰‘â¿¡OaD«³„»8ü·W ÁAa!3?HD@Päî¬w‡YjÁÑP›?”ùcòKjöpL é ÿu·`¢ÿˇÑÔs8cxùÛÃÈçŸuP¤å/ E âA"ˆ¡“ ðai sÿÍdPDcB˜}VHɯc€Ö¿.- æä‚9Œ—ä .(Fi¿‰€)ÿ¯õoYÃ`î0(É—I$ôA°mepÃrf7þ¯ƒ KMÏc ;ÃÁh®©×^6j„©JcN²æ–% ýIZŸ‹BG'½™y÷~ ¹›´¦Ì'*g¡±:Wdø³{ÏŽ[­al–H&ëa±¤ç+”ûqÚ¬7ÍñŒï¾|:ù3D¬Mx½t-÷²ÉyÝèþ6Àÿ‚=‘-“Ù´iÈα„î34¡ˆ¡B'»è©<¾Ä‰„Ç|—mˆb<óX1ŽIé››ëIïêL>zó¸½L´$”š‘ÆS•=³?¾›‘6.]µÖ‹KüM®(!ö6cžC(×<®C刅…#¦ƒQÐPÀbÛ/ÇŽGiÞT®®oâê‘dÿééAðšSj¼¥—  ÁôˆÁK¸¡›}qMkM‡Ï•ª¿.L%¸ùoC 92"t»úwÛ¸å²æ "”É54Ï#×[Sbë¥àCÏni—‚åG¦ugÔ*I½µEç`Q¹ŸlŽ×Lä_PQ1Èݶ?4X›JU:Ü^ǘ”uP¾"dÙ~š†_vKaÝxIÝì\Yý(¼¿]´ˆJ½d1혹`dQ£0BÙì—¿ßoŠœY­Þê{M¥T®»(8kre œ=9Rdfz£–>b†~”XÛ•µh҉©ðšÿúÖ_»ò†.M‡@õ}zcÍ› %ªí`£<ì^^"¨nºzcso¡$$eØ#®‹ó¦Å›³:·¥#P!?ô!8ç몓ÃM U[‚¹øŒ°è©ÑÈ_Íô ‡ˆrƒ–kÿ¾17ãD¬{lKT›ˆž©¨2s·^‡†šª}òž7#“…î4€²:î:œÅ0Lv~".e}J’]…ø[<Öj.š±êc“Ñœ3—qgÆòï·'m}=ìî£1[ѹ==u5^7 = 8ºsvÅs…~à˜¿“r6¹ÿ BÉ!|ÞxZàM%’ä¾xºÐHzÝõ–¤ ˜²ˆ;?:ùätWg`!êhó9ÕˆÑÊÓóèaÄã>æ4_Ï9 ÏjT‘À§£¾ŠæWû¡xQkƒDG{Ç «ÃæïƒÉ2âUid)ÇÝîŠ|xðð’ÂGþ˜ÂåGÜc$¥Ÿ”˜¿<øvE¬VÁOæåmük?ô,ûkŽj/Ïç¿7yJð2'¹J,Ò1-²ÁG ˆö*Ÿü’äWäù °¦œdÿ°/NÕ¹ñš_~¢)ÂEÖ½ùä£~lÝ'^r1"§ÇÀŽ·ÑnàeRrÇñÓ„Š K`‹JJƒ;RÚ oež]6JTÒãUmË#NÑwðûB;ï×epµd1ÉŽJôº‘’èåÔE<ÙeêÂ/:#T‹©-Ú.§ZŒ½6õ^?´Ýä|Å^_ý±`x÷@>—îVãÉeòð{ù>d×H(áŵ3·½°v„ß*¡{­•bzQ)pøÖ #Í *šÑ§¨ÿá±Ð"0oì#ù}Eì’lº>Zž€Wm^ÌW?×9+«^Pñº¼7:ªÌǾ/þÛgù›Ï{w³¾­ã£¿3_¯t¿Ýž! ÙìhØaŸ4¸/ªpWr“-a«Íˆ‹g/Fµ‰bP×N„]x¨zg·xið#Ë»Å̪!¼áªÐ$ýº-ÕįN÷‚bž”µÏ§©~jÔ~ÌH•É«–$^¶R5žÃøH0º<±‡öâjzƚл§\±Â\oé«Ý~õ‹D¡äŒ±´ú©è®°ƒ’;·Ø2z7Ý-:̓ ¿ëÍD ½2'ÆéºV!ß]/ à±!v=TåpB|)»r¯–.ð´vofpIßYKU0-Q`§ŒS>mrÉBù~°8ƒö¹?Æ3U„ëÜ'Õ2*Ô]P‰• ¿W¯L»Ïæåqotµ2•a–|³æ~ri}¡Oa„“ÝÍAæ„b‹ÜPÈÓEvø¹§sÓão]²À2-ú«z–ºtnX÷ã7Ãe—Ƀ¬‰h~}Ž áZ5ÜiëüOã9g¸ã´"s“Ã(¥5ãÈéý•cß§‡}¤LØÂ–’í¥aò9pz´‰YhyÞµoP3°(+"n ?f<+?ÕOÂE¸¯/4Ý A––?QûaIßï’ª!‚'áËÙýÂ[äJŠHøiÁ`ž‡{CåSÒ2ÿ $½Q¼o§YœÄÅ  Õ#œüÕaNv®¬Ñ²Äa+ñ¬IûóMË Ÿê:iü›÷‹Ï8¬´éXw ¿)¹n»ìµ˜ñF_[¬²Uà—º•HÉ:I_š<ÍùÒ9@QKÆ;¬å¼.ñ}‹¸5±¶é‡]ìúk󼮤ֆÊ\¯$' Ë3dÚ5¡µ(­ÿÝRgá´èû¶Ùê3oý>‡o„øÅ !©›±ÅïÚƒâF˜Þ=:™dX“E†J)4ÜrÔ¿žå”«xšÚÜ>B~H¡W„¯>æu"©WãŠ÷ÉMë.9p@]‚i_•ð±ÙhOL·&ï­Vxĺ|oˆßzò-oBNQ>ïky=ÔÛ;\Ó8Smr‡-Ò–¿ª}Ò­Yz]ÓüöÝÎðÛŽgRY7¢©WVë<<Ù_gc“J·³l í¾ÙéÁdMø÷öŸPÅÐøõÒ2¸Pʉ&[$TÖ-ÝÚ·ha€|ÇÆsüÈXFÖ¼˜tƒ•½òYÄirð'¼ÎnË©íIÒµÐjÞpöî‡æ§=Táe‘J…)JM` |I™ºÓí)•wó¾O+Wߘ1 tn³Êd—^­=#£+6ù‰˜«‚Q²sõlP…o×<ç1Ë×_úGöKóGq¬EÝ,™‰L„?ìŸÜ`R5LBÈäâ>$zÁöà"¬ŽZÂS}ä `ñ|yô”°«ãÿÆPAF'*mõ ²*¤ Î md¹Î$³kð[•¿u$úùMªJôÝÛ¶5%xj¦Fðü¦H6/ß«v˜ŒöÞ– ³®÷LbL=óÛšg*tK3ïÖ?E’Χó¿ê4ÃÓYxžcȉS­î]Ý7ÛiÊ·JÀ-C3:ê*ƒf·ù†F‰õËÞùwä¶|/Ù ÓvzÀƒ&ÂùÆF³±àhA£ÚÅÀ±Eg;‚|Zl/P%x2|:žÔ,Ϋ«:Ëóˆø½ÍÖ!Ka‡iIæKê¥Q²v» ¹ä9¶bÕk–ŠÍ¤jÖ,‹ƒš—ê[&BU ŒÄËÖlý|’ñ>Wl½ó‰,§kzÞbi©6}eÓٵܙ’7(ü¹žC4Y“þ+·]¾ìñy„i-RgìÛîü€1з‚EÎOhŽ´òhw—ÓŽX½&hÑ+¦Æ1è3Kpñ'¿uð#˜[mËÃ3Ö†ïi_4½?T>X hJlé]ôPœÙÙ¼%;ÐN1ÙäØnÛÛ¸½dÒS¯Y®m3¥eÍHé3í>>r€á(¿nIÆÙÀ†„|~dÿäö0»Ñç»ö`i~:)fÂ×*½Ôªkü:2¼ZjÙ]šŸÔìòôÍ´Oºâ=ƒ½ÌyyÉáya’Ü[úàéÏÝÉÍW/á}þ¢Áˆ&ªdvŽñÆøºxëff?7ì!‚›o~ñD)¶{Ù*)˜>UŽ|+Àkí«>öe‚NŸ¿²Œ÷Ç™¥ÍP…ñVD»é0YøT8Åjð‹=}GÙÌ]½ø x¹¤a!h:Íl>XÃ"\´Í×Ó¶¯âvþyåeüó¦(nÍýÜ™PU½uô··¹X‚X ½¾9¡BmËFå¦ï ¸š™–É B>ª!·UŠ™äÕÓO€Œên&üH°çOኞ±[M!èɈñ3'´šfPTô ÑVJ©”„ëw.õ}z¢9øù"¨P,"º)ò§À÷›ùlvœ7]%&#Òª÷R+ݱ<=S}¨è‰NKyb¡¿ÕN8á _}B\SèkBs7o½ÛлÀ~òA·)«;x•C¡zˆäÒL5ƒ•n-?ì&׸™â·‚žðGÀqyèaaºBQÈ‚´:Cû7i.ÆÞä‚x¶&M³’%ñá’Æ•øX);ÈÜŽx:ÄÛéͳ”þÄÓÍÜ<»Ê<ÖR­^ ?FßgÕ={¨à«çWSÌ}zuøÅ œênu„¹ÞyóòR_RaÎívâ™GŒq]Ýõ%þ•'¹ íœ$ÛÏáì«-ç9ZAúIF44”›øÎ“Ôñ.”:K->—ûg_¸©Yѱ·ò&†ÃÍ6f!ŒUeÞÁ%7>ÙÔЇÌxMוžª’Wò®Ú1é^¡/ÿ³˜ 'ÅÜqÿ ß1à˜¼£b™ÉV“_\|†­_¡¨Ô´’јмsUÁë÷xæ¢#'̤ÛnU |÷”l‰Õ>× JºâºzaüŒb0yïB›+¬8’}ò¦Ç ]’~ÚxhŒJ}Ì¢Pg&Ró¥Sgì†WÎKö[#œÂTstôA> $Sü²}|Áíó)×+¯.ºàÓ—l~í¾Ÿ‚ê$ÕÅÞû í±Õ¶;1,'켊å,1à“éÓØ!<Àã x¡÷V\¤ž·xÕW¸SO”¢° à¦ý·ôqr!dM{_I—™Se{­&…uÚ`gëè¦VX5ñ 3i›¬~qzëýEÛx:òó—þp1¦¢]0›¸?MJvµ#ÁhFÒ£ºº~3,J:áÊfà·÷øh÷Þ7 MU•–íZ“ת9SÐfy¹73jú“ÀrGa˜2P%]æm/ü ÍîÎŇ'7žáš—p!¸ì„¥ ö QøÉl;?F¥ž>Æk$Yî ?ª‘ñ®ÂQâ›×“ÜÌÐY;˜ "Öœ<”Y‘ý`ß6êµæl›zèô] °2d×7Æd[姺ŽÕÕ(VÔNóÿĈFòj/ñ šÞÔ!µY‹4«(¾Ã[™M³È)¥^Âì€Úb\0˜ý G¬V90¸9ÞCðŽöª˜P {©°‚Â1A+HOѪÕ‹ÏUé‘Y}ž<S»ñ]îåQ›T7Ùc¢›ï,SPß½T{e`õè}gk#焚v›¶3j¬;ÀÂG‚3gøû‡‹¿>³¯ìjî=*ϾIÅ¢¥¹’RÅÙæW*íxäIÔ|Ø0Ô_|pjê„f>ZDRUWWÏ"n{ 6[7¬‡`_–rÚŠ-Æ9zy ¨„2‹ó´Åg2Øt˜"¿î÷È[ÊŒ¥‘T+vn){Ñäî- 欆ùZ…Wpj©jSϱ¼|ÁÞm4ƒýüŒŒI©ÓsVÆŒéHìvŒu³—‰ä)¥Ìlˉõ “USé\¨D{CœîÉQ±÷æÕ!ÞîfÔG ÚçP’Dÿž?DàQk(m%xÐMX¤Ó½RLóñ–m±Ï[Z>ŠX­ÒC[ÿüª‚‰_÷[‹?V¢1Û¬b˜Džxæ? úÉ+ò̽u§ãí:vkñöa‡ÃFÑ7ߨ ÛìºÁäu×·ÒöjOÝòX´4œ2¾*ÍG»_½Ú»v|0ëÙAªRe“—+µ£Ò¢Zuƒ•dîXçgzKúš>=_ 3VF)g4¥bǤèij˜„€hL¾G‡~Ùº2òÈ«ÜðÈG8ðšJú|OtnôF×ã¤m›S{b þVºdžÂ :㎆¾{Ÿ•г• }rëtÓÚÜ®\¿#Ê-]—´òj}åG[L»Ý땊¥‚æÅ"“^¶æ÷Ûí°¹ ™Ý„vôbi€Ž˜!÷"§“â´Ö ¨YøLƒs‰¤ÛúÈ §H*û¼Ž ™=d§'{TõdÏ´cÄðÞÁ!h¾e®;€…¥d>äï(ªô㓇£zA§ÂÎä40ßIÓ#ìªyú¦QSˆõ¥ ÀC±’Ý­QëLµú\+Ù«;f9‘5¼ÜöIé°7—â²W0ʱôzMš&3Ïö›úö¡(ƒ§£{ÁŽa ‡áu“•¥ƒLЍž.}DÌ×ćSî‹ä䜙͢Fø{Æ£Mdžß{Ä¿ýþ²!ÞÍLo-Öü¦ð‘îÓ1?ljAÞ¸oˆånŽÅGBUÂaÊ{8Æ]†çÖ¹£$æÆñG ^yáU‰ÑÍo' j¶ …3ÕOšì2-Ä cj7ü€·/ \lfèµm‰ÂR™?3°Ï’ £¨Ó×?êùWgÉ”ÙõæMžU( Œ© ÍÞP¾ÇwyûÞtTxš‹2/t'I¶‹nÖ-¯ù’Æ‹)ú"*猥>õlp™'%~%uèR8ø€Þ½/ͺó±­ý‹v×H[}äâk1FP°h¨Ò àÛx‡/^žÜt€ŸJsàjŽ!-¥EÌa3Ö ÏWÀæÖùx¬Ô½–Fã–› ¯x'pdË4ˆ6“lÎþÍ.Ár endstream endobj 846 0 obj << /Length1 2261 /Length2 18681 /Length3 0 /Length 20014 /Filter /FlateDecode >> stream xÚŒúP][òÀ ãNp‡ppwwww w®Á‚»»;— Á ÜÝÜõqgîLîü¿¯ê½¢ ö¯»W÷ê^Ýk×®‚‚DYAÄÌÁ(é`b`adæˆ)¨Ë°0˜™Ù™™Y((Ô­@¶ÀÿÈ(4Î.Vö¼ÿ°sƒÞeâÆ wC{€¬«-€… ÀÂÉËÂÅËÌ `efæù¡ƒ3/@ÜØÍÊ  Àu°º Pˆ98z:[YX‚Þãüç@mJ`ááá¢ÿ×r€ˆÐÙÊÔØ ` ²Ú½G45¶¨9˜ZAžÿ゚ßräebrwwg4¶satp¶¤¡¸[,ª@ ³Ð ðWÊEc;àß©1"PÔ-­\þ­Ps0¹;ï[+S ½ËûW{3 3à=:@MF ä´ÿ·±ü¿ èÀÂÈò_w¯þË‘•ý¿›š:Ø9Û{ZÙ[Ì­l%IyFˆ`loö—¡±­‹Ãûzc7c+[c“wƒmÝ )¢0~Ïðïü\L­A.Œ.V¶åÈô—›÷2KØ›‰9ØÙíA.íOÜÊhú^wO¦¿ׯÞÁÝÞû?dneofþWf®ŽLöVN®@ñ¿mÞEd@€ƒ™™™›•t=L-™þ  îéü—’å/ñ{¾ÞŽŽó÷4€¾VæÀ÷?Þ.Æn@ÈÙèëýOÅÿ ÀÌÊ0ZXÙ#üñþ.šÿ›ßÏßÙÊð‰ù½ýXÌýü÷Iÿ½ÃÌìm=ÿ˜ÿ눙ÄäEÔ5¥èþNù¿JQQ€7€•ƒÀÂÂÊàzðý_?ÊÆVïãkeìÍ<ÿÞî{þ³e·¿{€úï¡ü¯/E‡÷Ψÿ4º3³éû/–ÿÏíþ¯%ÿÿºü//ÿ¯þw$éjkû/=õ¿ þôÆvV¶ž[¼w®+è} ÞgÁþÿšjÿ=º @3+W»ÿ«•¿Oƒˆ½Å{G3°°32³ÿ[nå"iå4S¶™Zþ»kþ-×økÞl­ìÊ.VÝ0齃™ÿî}ÈLmÞo—÷Öü— ø>CÿWÂÞÔÁì¯acåà;;{"¼Ÿõ;q¼YÞ§Ò èñ¯f01Ú;€Þ—Þsô˜;8#üu°œ&‘¿Dÿ&N“èâzï­?Ä `ÿC<&‰ÿ3€Iò±˜¤þ€I汘dÿÐ{<ù?ôOá½ÇSüCïñ”þKÜïñ”ÿ+€Iõ½ÇSûCïñÔÿÐ{¶è=‚ö‰ç=ºñ‰í]glçøÞï][ÿµy—šü¡÷=™þ—8Þu¦¶ïù ;û_;»?^ÿ:a&³à{¥€ÿÀ÷DÌÿàûrss«?ü—öÈüž¨Å?ðÝÜòOì÷L-=-öÿ°x—ýsý{ñ­ÿïùÛüßÓ±ý¾çj÷ßï¦x~¿Ù˜þï;uü³•w[Ç÷×½-ÐôGÊò·ôß÷ÄÅï›z¯º•Ã?ªôþ¶erúSõwçN®  ™‰íÿxdcÿ£ø_§l<kþWÌòW…ÿïõqù¾oåŸÆïõqý¾×ÇíøÂýGõž³Ç?ð=YÏà{ ^ÿÂÿ™eSWç÷z€þué¾úø_oQ Ðhа4ï`Êl]Üq_+Bàΰ7ÁÊŽòu#Ó ê.ÉÙ3éÅô£™ÍÊjWÞ ,Ó¦ð£‘AÎ1Vô¢D;þªA`9Ñ°Ö ¶†k“ :¢Ž>iD ”ˆ‹§'dšE„>œ“§cR+.hÓVæ3/m;„£_ôß‚ø!Âp½žë~Y½e¦ØfŸk¥¾…iÔ™ÇG VúNæ;E˜Ò‡W%{‡5ŒröúmEȪu×Wô7¸Ý'5\[5’_Ô+E!dçj.©Ä €­±‚]VV±qV¸—Nù¢×»úÖw€m¬Þ)Lá¹éÞë«#W(ƒ5g4A¿œ®ÜÁ÷oG–ú8ƒÔrRþk÷sþ,©q!úòcnE:ÀX&]O±¶ëð\%oå7-$&_¿;> *&:³.5ùÄÑœ¶>­V”Kô‰2Ôë’} ¼¥ö«~1ã€11—öÐOo?X…t¯éAÄnõ-”äë’d¡œþ'¢­ „9yËêš’'¶/*pv“²ë€^D¹ùEõæü—¢'? €GakgêàPÌ5BŃԔ?*qyÃOѲ:‚‚ùÌhù‹xõÞ&Ý—§Ó‹e{$¾x¦‹[í¦¼²,°o`HîºfµVlg½š‘éû¤täÔs|“TïNcŒ¥>UbyL.*ð¸P6qá:QÀÑ ,4_S$¾ä¢Ày%ʲIŠPœÇÙäÅü$Þ¼úiÆQ©ŸcqÕÿ9uôv¨„_ï)œb#Ñ~R‹:“ÃU{ƒòçºY¡ |‘¹Vm¨R?õAºë˜•øÂäò¨<ZóDÓ´š_€ÒMyMò!e’Ñˑ妶‹”iÃÅJüàx*é´åi;ÿ[SŒ&z%Y^2A:¬úädD> J^ ü£Eöì7UÕ¶‚_S_£ÞË”ø¢—ÏéRå_õ˜,§íõç=xÈÀ³­p¬}ã§Èrwû‘‡ºoÍʧ4·ôkšË uÊÏiK£Ø'2!F-x-T,2ŠŒaAŠ›)Ã<¤mdÅàâ´äCYèÛžžzù€2%°" ToOÒ¸l÷k¦‹é«<|úùÔo…`Íœœ¼1Bj¨Îd¬-7`à!ðh1tWú¿»~¸aW…ÖGmœ,öÕÐGÒø€Ãí76±» X¹¼gÿB ÀqÀGt…ÝÝÆg½¸#ôJw¿ØæMyPQJã™ÀhÀ7}œû6k`¡h«É{q,¸úH]„ùHµŒf¸ô; Áƒ}{]>ïÊLø§òú.¡vò0),é›ÿn‡Ñ^²5¿,dx”œðYôéEX.qCU“Qj™X_¹jXG{íåÇL©3fš¢HpŸŒGЊd½Z¥“˜c]³w±ê¦ÔZV¢˜tŒ`©,h80TñêÕZ¢äê$9Ku’$·yxêæœû,ÁM³›,¼*j6ð&ÓÈ…Ãô¹ ªrUš%®•¯/´,ûÁÇ;½ô%Q±dó»½V÷å'|HÅ$jÝ}E÷³:‹j˜kØ(¯ÜBØUx]‡äÒÜ;¯éìÅfýܺoçA`9 ¼©Æ ôÈžÄz°x:¸Ü§ò—½úïç““_±ýpÌF{0‚:â{KìÁˆS_ Åï öøMÛ…€/yå+r<‡Á£ã!}øyE?JÎÊDú óÊÜ¿4—3Ÿ˜‚F•â‡É÷’uy^'l±ÝVf“ܨ„ ƒ1ò¸KŠ\Ëì›øçêË&½ª@U6œ¬G3A•‰˜žv…0•z˜‰d&Í9³†­p¸µ^ºWуU¬¯Zx”A2g«„27ŽÙ"7¥–´må€>z-èÚ¾C4‚Ë[C”¢Z4 ›2-Öy)ʽhM ¥&?y¹¡ºE©üÉb³ë Ôµ©ЙAãŒçs5_U>kÝêïãë1†Å{?®jœ}Ô›ÏãÇÎÕ¥”*É ÌŸº2§EôsÌç´÷…š=ô?FZµÝ§ïŸÛk>ž}.X¥øÑúB=Ý£.”>Έ‰lÌ"ÅØèÞ¶ñIÀõ””Žs_ ù|þ>à,÷J~·g೓;Ñ’÷ÄšÈ >K|Ï”ð · !ãý©íﯽ(>¶>hhñHå L•÷«|TéÔ¬Êúüð[öw3u³÷¶zýbÏ‹›¼…É[QYT> 3.ž!XóàÀQñÒ$b Ú“Døäx=Ûrê‡â’Âäû~æŽd{âoånÕ‚±´$fdðgÇf:Vˆ1¿Í³Énç>Y¾¶Œé°MY֦㟞úŒ,p;`TÀ‚(*æƒ0½²ct…N/aìg‹žÁÁCI:»Àcç$¶yìúrZLH[ŽÀURž8zõ$p´¬x@t–|*fLÙ5»ß2h»ûÚý©Ú„çGëúƒ¢j¹sp;³þæÙãNGÌ/î~õ‚t1ïze,×ß<ˆP¤]ƒ™,èãý‹ßЮ å4ÐdV¼ÚÊr—vͶê]°Áº©ÊÓ%­Ü¥(Y˜ã‰ókÇ¢ÜLIOÜuCºÍÎ^" j§²‡^â ÌRn‘‚ôݺ4Ø.GœòÛzã€6›º &YüÏÛ줭ÃY|^Ú+ •Y±}ÖŒ¹ø…ŽÙÔ+oݲ;<”ž|AýE¸- °‡† •^ì–9ÿå*õªrdceœû^ƒãS›á̇cÄïÓ4G×@»[?yß^ZYf£QMZ ÅKx^p|G%¾@ÎwW3ß™´ìÚ¨®õÈ܆96zZ© yq8ÔÌœ.߀×VoÈ*Ù²šœ1[Eé‚ gJÖ‹‹“ìŽ]­Iò×n^åÉŽ±½Óž ÷’Ûv¦+7aëV‰·MCùdáÐâ» ÷>ÅŸ­0Á¾’«fÚ|pmñ?"NÝ#‡öÏ&(¾+”™öåùŸ0œ^˜˜|ô—£ÃÊÌduZ¯47GS Œ Fýn EŠ`ˆ)²àÀJå}€We@«…Qd\_VœîÐ|ñ±Eô!9 Åö”¦‘ˆñˆD·Ør×eñZ˜†øò|ÜERoш@eÞ'äÔàÞZÈ’+Ð{ÝÝPBOCäÑó“½Ðlë¤Ñ{¥= xENuGCÃî—|¥`!I.Êk®mÕ"ut|$Ù]«:³”mì8??×b‹}¡F4ÈnA5o½©0—„FŽËÐϼçºQ,DžHç6JïÎÄÍïI67|"ÊU wxŸ/©»á?Eôù•I¡E»¸}´öOÿ‘hS©ŒhA¸ÃtŽÛ 3rug¨¯ö1¯ù{²×1q"’ú=¹fù4šõøéŠîFÓuì*Ñ›?Çv×FK)(xnTÅi¬æ÷RúO)Ó‰Û­Sï¢lxŸRÕo/òਈ‡8ƒú˜nb"–‡äƒ(Ôùž<‚Ü'"ÜÜÇ(,£÷Ej+†ÃÃóÕ~( #‰¸ E¦&åm´ÏAì´ÅkÚ¸غ™¬O‚CpøÔ÷éuRxŸÿ,k¤¤ô"”Åʺ©ý õ¨Ù©öh¥!}¦YH·6“@>,Ôq#uó|˜ 0—÷AÐý¦Ùt@Ì60ºm©h9Z•qK@ß%8å: 0G“ëh siÏ÷Êcu¹€.{m>f§û~äßÕ¾Ç+(bïïø¨Î4¿ÔJ©ý3;R¼–¿¢C/¬Âç^‰øzW>‹—{Z[á5Ü1Sº‰=y윻ƒƒ\³I0ð:¿1Þ}6š3"ÇI¹eïG{DA˜ŒÜD—^’2Èb¢Ái½i½Lÿx>˜p%ä 5€„ÅåyVÜŒn¤œýê»ÜB–M ·Š0Ïõ*pð…Éç±I¬X›5+`vT »‡Ä]$õÍ𕺿°Út`ptM§2·9^e› PåáUuÈ`OŒ5@Ž©ië [®[Ypƒ(š=îR þƒwÀC1³)ç(HNÛ˜•ì.ÒäNÝü¼Hçú2€Q߸3V|¸°ýA°}p9ãž^rÝþÊSß\ÚðÅ€Oñƒ§´F4Ó)Íǹ7P+Ìcùh@yÉd¦•{¸GN‘·ÿ1’§Øõ’˜‰OäTn5"jK{:_ÝN2†Í÷Ĥ¢Ýì7¹5–Ëδ]Ycž&¯5­—ÂѤI3ñZh8méGô,=³•ìë.6U û*[X–¿œRéãW;UL½5G+,%?Á) aŽÝd:üé^ž—íÖ…–Dæ‘Æ(náÏá_GBnké?8¥ˆŒô&®BˆŸ„·±+ŠV¸Â]öìx‚P¦¼ô«Ú†K“H‹cR…zǦ¿Î2­Ú®~²]£Ì:ÀÄGWõ‹Õr%)¼N¸{²×䦓áp×Ñ—vÃX­ïäÓ J#¾ÚŒRÄÃý¾ ÞvÎ~™:¹F»Ó#à­›ýKƒ3ÖNžb|Mà¥öCÙÞà6„æê[éäRØSF¯²]+ùUHµKÊÎ8 ºû~Õj/GÈÉóùÄ$ÈcÊ\G>.V Må®H%Tc•³¸r´ÔöN»a0tN¢eŽç>xÚb'¢8Ö ¿u½Óù¢;§3-¿¢tQRtç)[¥’HCØ£ É Fί=ÔaI%¯ô±j ïCÖ)ñ[¶ˆý'˜éPÞžøX.ÀY‘M²†ý¾½ÓÇ“Tè°JKQγë¶£eB¨A¡Àz™ª¥v¤õëm%Ù²ó»¢Û†×ƒhçÔÙqÈpÞÐ!î6m¯¬B_pÕÓ¡NéUJtàeÚžŽ‚D%Ž e»(;tMà±Ô*© òÍú9Iò˜“Ý—Tšš¦â}›Oï2“*2aLíF‹ÌX·Ð]8¯W ”-ÒÎJU JÆ.áíxó‰QmeLµíhôY‹_8 æÓ)· $ìR¯ìñ ¢U¥vÞÆEBõÁ`CEG¬éZD>r|©u°åÓ€dAH¸Æ'’¬‚˜!$dD…q‘›ôY¾¯w‹C¾LÞvØ» ˜XWbÃ\hh 0ÊV¡n­nËSÖ#³X°ToÔ“¸)ƒ5C„±ñ­‡ÄìÄÓõì¶Lß´U!é¦|dÌM‚½ó-'$òÃõ9‚>ÙÓgúpëü*–GÓ!:®9BJ«X¬;Û24’j‘ôuÖ¨Qèy%6»X94B Q,¸=çòŠF~NB|µwõ羚ژ>HÉ$¾B/V]€iééú)Àexzàf ‡8ò¶T)$VÒ l.‰Sz›1 ¿Êhü;…ZŒdq\Üäû áX&ŒD¹þ’5ÅïÖiß½grZ/ ,—™Ñë)ùL:6 á®"ƒ©¤¿Ïkz /+ØWW ÃØ1Ó²þ¾j<2 XéïW|U¼ÇgbvÒéxÍMlâíU½v‰o&©Ÿ gŽû—ëð>ãLƒíæø£ ~ž9–ì2í_VÇ;_Ÿ‡°">rIœ>ß nNÆ­ƒ˜üª‹Î-™”$§«`Ib'q'å¨3›w»“gÈ׎¿ëJ„Ã2¤ìF쨯ÑÛ LÍËÌzëÂÍL|5¯p'0Ñô1z{&Ì‘t9ºk_žÍöÞõšÊÃîàwŒ#à=÷çÀ™v05ÀwŒê$^¼Ýn²VDº12Ùv$zƒ´Žº`ÓÚïQÅz¼~•Èû`bþaDÆÛ¨½IÝ |`Íÿö3µ-TlHÎd8(HëT¨áxH´û'~1ì³Mûãc¦BzéÇ~€KúÄ6ˆ5ŠO¿5Y†EÚpØo ¥¢±f\Ho"Ž|/Ÿ=z¨µÊmdG“`ã>ž“{1(ý(Ãà*),ïƒEðµ#}"M°Èd¥7û©ìwjhÞYÓ‘Ìç“ýW–ž§GzŸéä@•Ìøkaø“ñª­ šéï[K Pm?CuD7W|à5Wx ‘–=¢¾-½–ð¬\‚Öž¬Åp™/KÈó#Σz“Ùûì’ËI)}o¹VøM,¬œ›„h{Z?pO«IM^H-ë÷Ëhe,áƒz²‡N‡êËÇâ« I¤ÐÌé2Šlx·§ ‡/¬ð‡ñªä`fcé?º¦Š²F=¨ø9B®ü{t^.üû÷twªÎ›SvÅ6ÛÙã_ƒKX>è—T;›.®y´³K,©ß)4§‰Ó*ÜÐÑ•)õ#?…°¢¹Z*±Î IŒN FŒK0õ¥ß˜H‹:¦°@;.Ë_Üp%H· x1lø>ªŽs¼¡¦ØÒm6¥˜£2³§­Q’ QΉð£}¨7@G üþ…»<6‰Fš»¶žÀŠùkloW`É)¥'WŒíbmÖZ·ïîá暑aʦNlÝ(¢ˆÛÃÃŽ}¼Ž3”ï;¤tT÷Ó‡ÂRž0†œ+'1šw ¼µ0Sº¤ð:=]oç ʯ‚Õù»©ÈÞÞÄ}=+y6ß‚‡ÆÄØñvLíÂã]¼°?ú Tø…Åõ‡ßÈw{fg¼œª9"žÜêÚÏ[  lòý'VºLóu ¹¶ÚOæ§³$f%ticÕX´™1íÜ u“CÝË„ºá´º‡1:ü .£3äq¬àx²Ær4KŽZxÐ6uMÎL‡1ŽÊÐzAäíwJS¼|:x×)’$ôó»q<…MôÞ¨ô„_t(œÁcŒKaA¬¦}ÝËÆeµî)ÌϸíY†\ó”ðI`fÛCyÏþXr9¹M0•Ø/c£ÍèÌÖ¯OqOyÛ‹XÂw¯T’¾ò™ÓÌ59b?»]“¡2ßHCO™U=«jä@ÐtÆu{ê{N…ͦ­èse²cõÒâÄyÂ\dj:çè'm>(Œ2lw²S”è»QÿJ¥|äø E<a8ÈÆÅÒƒ‡Ã÷½Ê8Tús”Só„mÜ(r½8Ãv n?ÉBìâ&¶zWu µ]¶{["±º¼Âe©o¯3ç¹·G¶FêkXm(“Æå#Ÿæe oÒOú®s:vö¯V1ü©öf½Š‘ŒëŒôÍ™<Q$(jñ‡ˆÊme8”ušb|¬‰ˆ‹;Ëš ²u1tÏÞx‹ºe=À W¦ÄzÒuWÁR¦âHU‚¸¿ œ,3ïd“Ó”²†éüäø-‚üªÑ¾-ÓŒðÅa OÝÂwë›Môòï]K’þ€­zfǾ•f0Õh‚h&7YMÛ-l$åDEÉšñ]y&+›\Ñ_D|>lwè.R¾”A(q–/,ø)¡Æ©|éÏ…J…¾:w~2Îgâî§µº²[Ðsþ tþ QSYvGÈZéÞÉÜ—„׌,Ú<ê1§e߬Fl!u{ZÒªò½š4•K>¥å4àA€€û1ž´~¨³ àªjím?‰1`6½"ÔFHÌß`ÃF9³‘š"êÏþú6Áö+±U‰¹é·‹€ÒŠÜÊ™f¬–+ͺ§îK1¨wÞ6vЄ'‡¯OŒ“'Û©ð¾|êå§&¢¢¬—¨¼ ѲñÖ EBî[¸‘©õ cÂO‡ÄË §MAe*ÑI}Z@N½A$A ‹áð–™òeøËƒN’nOÉ8’Y¶8OÎZNf87@ÄŒëΖƄ))ÃùäŒÓ‰k´(†¶½”e“Fi­ ¥³ÊÂŒlódòÌ£?w5ˆj©„ÎRƒ™»E q.}7é –ºD„ÛBש„ozÂŒ0l ® ÀD+¿½Ò3 ®Žß¯ÈŠsGŸ³/ÿá­Ü‡14»˜i@E¾N1éã!þOŽ™»ªÌpMmhÍ —7©ÜÆ…|¸—]ªøŽ{•áìd½|p][s¤¨åôÕ…Dº¨Z×ÈÇÃ!¾ž•W&YRSãß; êÁ;ì5(EŸ~PkIÎF£×¦w s[Åa|ðèÇbYy<=o'ï°ûb˜@¾,qIðe‹T>//6š5ê0çuFŇ¾è¶`´ ²ýˆ£høÜtãKƒÝ/­sK Ù„Y¿ÎªÀ,»IJŠ™¸ïI8!Äiär‰Ñ\…HF#¿Ð[uÂ}`éúv•Íazóë§ b‘N‹àáÒéŽzÎ"twåré¡× Ó…0ßs[`»æ“åT©’ͯˆK¤6Š7h’žV¦¸šq¡ëÚPõ¦–´©GÉ©°tŽ!e2žÊ²(?øQ~Þ@¨ˆÒ±)fðg ¼§8ün±–†p‰ìªY$¤R ûÖEDê*½FÿX'ùõWžIÚ¦S3rÕ÷ãhÄË® b±´z©iï›cô{·’Jaø¸lFÏ>ƒ­ku-îrwåï:zQ÷+”“7!O_€µØ 8³Ày5r.~ ftãD?¸C5ui]=3_“{ða—á'£WÆ1:ÜU#±FxéÁXÏ5²q]b] Cañ¡7†!’s+«Y8ç¨åÎ)ªÅ,cŒ>8«ã–€–뎫DâU ätå×Ðâr„¥ÅNL`í÷k¸›cº;·^Z0ËzT p·sœq毕„±d Óg #îˆg)¥lolˆù™ÚØg€¶)QyꙌ ¢ô«˜- ò[0|ófí혽4-ÅO²Ïí2Kä[Õëß.p·[޶!ÒÏ-D[4•cìð‹LnéÉLÈÅ)ì…<À´Ö,À°­±„%ÀñÅ |Q†.^à‚úZ^ê#ºT@×Ä(0þ ½ý£Y6óÂØ#ǽE$Vº°2[1ÉIôñüEÚÅ‹?£ù³SV¦]„üý§ªXLžŽ"LzM­ ö oIT|ÔrïŠó0Ä(e‹‡h1[†ó¤(ÈLk#poE]o˜·:Nޱv„+ÝSY–¤8×VÍY®Ý 6‡8½fÇQö®s¸WÔ­=÷É’ò±1›oD"ÀgOYš4×Á¯ 'ŒYrÖÌ@Å\m¡*Ÿ%¸ fÀ*zűoà´G±¸!-ÒÇ,O©¸* ŒÝ>$EÍ'Âu62’5ì ".U˜I×ùÔ¬U9|ÚÏÓñ ÖU²„˾ú*ZçD Vr„Ù"û%ô\›¿Þ¾ÉùœLGFnóiÂ=÷Qã$·¹ÐrsšÞ¢¾û*QK¹Ì—æXñÝ‘}Ég)Á{úôø 4®ƒ/x§TsJ]6•8&Û/5Ù6¾7‰’¸~SóBS€Ã¦Œé–´ØúãFÖ£ †®­Ýw}¹RMb:hs²½­ò[›j1—ùrÜ#ú1CœoÌ·eñ<ÅÜÊêÕ:8Ý›œíPú9§Ì1½öõÆ6NæÊ•-Fäó厙5¦(4ôIÙ`å‚û‹±üœaâ´°ŽŸÊR‹%O¤Å“$G˜JUb­iËOꟳ¥<´ŠqèiE¶”¿ˆ(g[AÿÊɺùi”'d£‚'SIÛ?ÃòŒR¥ûBeÇ·õ‰‡øÍdóƒÁÖ$T)ÆéðNìëÏeœ>9”H‡R-Œö¼¤ÆÕÏ_ñÒ™ËI¼÷Kbí±/› ÕÒ&<žË†åKŽN!Þñ} åÇèNRäZÅä+TŽlð]>RAj4hR)Ó–”t]ãÑhDíÖà||¾sü!g±ƒZÅG½f`8/î“xs8'êÄý”yl츀@mŸeŽïN/HƒJÞå6ȳñÍô—ͳÕñ©£™ r•ük7mFF‹Ý®½I·e>½â’7sr´Ë¡@\%YãØç™AáúE&X·Š Ç­Õ%¬0z‹U„)`x.öLÇgtñPŒÞwY´‹ÒAC˸[‚y¬” Dz·„ooXŽZŠUI—LN\ [5ƒ#NpunfŽ›È‰½ƒÐ˜c¢çC4SÓòòÀ"æä;$3Êâ±ãCÇßl—ÝKŸtæäR@íhV¥Q0-Ðìf^òð‹2ØÂ¢˜Zn¯ûØ¢’1Ârù—ÍÙå¤,EdÀ§ äêÞ:ÝÑÈ «åîƒ]zÖÜ3;%œÐÇ{Evµ³µ £G¥zÁi°=\>ćéƒ"V AíA7¼\êRf¸Œg¾¶†£Ü‰­C.;‘’dA~^“‘;9Zÿâµ;[ÖÄñTê#Öôû!ã(¦9¿B%–Þ‚êÈXIkW^sFЦd{©ùR^øqe–‰^íÓ åHíЃ}#¦.] ÅÒ Ò¢íol²¶"vf²ú»r‘™(`|[àÆOÕ_Gj.á{­ªº@¡¦59ê%RÞ? žPeX(™-k†…w½¾¥¾Bzˆµ›¬à Ó}cçëêÅn'ÒAÚ£½%ǰ| <³étÝ ­¦ˆæ{ näµ$£Œ2sóMåkä4…¹C¬i’|AÑØ‰Áµ)8é:K…CŽ1¶ G‡H²íŠ`üÍyœ%RÞ¥5<ç/É&yàç_QË3Ý.ìß|n}>m2OwÊS[e&š½Å}§ÜâW.™c¿@‘6alYT"+M»S9ìÛJ8ÚµÕaJªM) 8žƒõ… Íð… ÅÌÿP±¦ÔgM¶¹*†Í¡Y‰X3ƒë%ç|%Lø]B-Š8W^tÕëèø™yz¶k¾£´Ÿ›QêŠ-ÍÏÑ@ss€i¤ø8.Epåá-wþPjÝ—ŸœÐ³¢7ÓGë·›ÒÀMc䛞´¤®b®„‹H|$mQf<ªÑ7¹3»2d]ìcÖŠÌ2ràåN›‡¹[ØUrõÀ«÷.ñMÇnÚp'R­‹ð)ÇH<¼œÍÅVüò‘v—c%B1O==3¥ª=‡7€71¶Óª5˜Ç;|âž@ÿ{“ÌðÏÓ:îü@Í·ùßAV fÍ¥_:ÒÈåò{ðÚoîCõ¯ÂS„9¦¸´dlÕ Ð¸ß gf¾ê>P\ö¢/È-ɪ°VFP:ºaà é-ŸÖÍ »žÖnõ]¯/·pÉC2XS~õ¤Ä† ¹þÚ uÛ¨& aY:Š(ÎÐAIÜ·<ÂtùTßt•Ù1Ñ{.Ô<$Ôr?lµÃÈ—÷™2¸ŒR!Ì@q®ÌàTmkÔ |ßþk”Åð0#ª³qTÃz®p ØÉ>ÝýrÿÒçq†ñERÉGa\ã ^Ý„özjVýÏ©_2­×˜ú·£=5ÛüòUaÊ'v â‚³l°âGõÒ}ñƒÖÔ·"ÕÒ½Õr,m”|¹êÝVŠ&5é?©Wé¢k×§ro±Ji„[r2ï ÐRnÈ&aEôšd§Ï1tXXrˆÂbA”kA>Ñ„Ôî°k d[ºJâÚÃÍnV£M³ËÑߥôÅUÞÏUÆ{®vZ«ù¶n@ËA^<¹Ço팒>ôùBÁ=¡¬¤siTèºm¡>錚ƭ· ¼qWÆÁfDøqZŒÀU™·ûˆ).lºØšJ ]ªŠD”ãüC:ÿÁƒ–²¹eÌï·’žD“ͤVcjÅ»¸2q¦ÖÂñšK%eíR¤!*¶~,ƒ}ž£âËe¿•—µÚüWö"g§EÌ«_‚I–ö™Vã—2å–hõùp5ýa‚Êlˆ¼Ðyúëé€Ó=§7W8°Ê8*'é²Ê¾u¶–¬‰ø1ÏÌO.ª÷R#­$_îÔ':àíMKÁ£®V+%»~jT©æ< “äšKÚn"î‰ù¤º ¥J6æ¬)4‹ƒ…&ª]¨'ü«Jª#^í¨?"•ŠÀZöÖCtÈæ°ôú®G2’ñi‰(Ç_àUqÀ—ATø¡už…c4î+ÇÈ/ hÇœD…2ÝyÚ‡þ¨õ·.ër[ÚOÏC»äðr–^œx%"bB£š¦Zpð/Ÿ{š>î9Za¥ëËy™¨Ð!më!ÃôD†N~(îêðp,BL$Mñ‚VÉE«]4Qh²ùh,ÉÂÎ9t´üœ!θ?Ó§ (Ÿ1HÕ-¾@²÷SHÙ§ÝŠ ÞqS~:Mz1}ŠNgÜý¦R­jpÓÛê“F£ÉÆÇ­j±ÌØA2¥i»[¶É«==ÆNÝ üÓácѕⅡ©leX¦¾§]#V¼iü‚ÔŽªeh©ë/©OQ7¤„Ì”-[õ‰}K¾ÌI4YwËRÚr’U5…«7¤¥°XØnì HsÞ>ç:«Ç÷?„Ì6@kbV8ÂÑx@#4‚ð*§¹_-ÇßêgÇ”jj ¹Ýü´ƒ¬¨OËìšHTøçÁÎUƒîiötì›§¸ëÑ"øá’r_ »*É aŸß|󣥞ªj4´êtºcññ"—Wõ¶é›‡ù^Øqr=±œbu›úƒ©å¹R9‹ý Uæ52*Ÿ±ÆÂ—’®9qCÚìŽe†ZF˜I|¼]AA [}tg~üK‰ó'sEÙ8}íÒsßhÝoM˜l–ÏdñΫ¤†ã¨›ºR°î´GY?]11  Í˜ßÞRÁ »aÕªM,XóŸÛ}-dOûñeª9§ŒÙ—ax}¨mt+Õoˆµ§þ-g3‚¨9ü‰«Ÿ?¨¦‡u·"Æo ë¹Ý‹Ú]Ù¤@v)ÏÔ5.²Y´~Ì#VÞ¨ßìPf1vø®›i5OluÛ':Ï"€ã)¼c.öÕçª1ýwº JvzŸËx_,î°"ä—§¬,ƒÁ޽ £‹Báý+`%hyWƽá¸ñ‘)»SÉ15®Ã蛌*”±† eg2¶u“<üž—’ýY»I¿Ô< 1d"c„Ú>‡SèëNi7³ÎšÆ#çC¥®*ñÈ2 ᱩ3˜¡ŸÍ÷¨›Ÿ„½CâüfÈE§õÚTéJ@†´áSÄöàè8ÃìÐqq?•vîÀ/ö%â¹³çåGaQ&Íg&±6ª|•:3ý¢mÏw}w•¯»ã}ܵÌO#í¯~F?í©µT¶e&1®îXÄÍð4¤µÎD#º§Í^Ü܃¸¾a©„çö=\Èîªwäë%G á/«,®×zÌ"£ß³ËøA½žëò»Oº¤ÛÿÖ1ú¹ž?V«Jž l qt7MkxÍ{MN“6Yû3mKLKî–aAÖàL‘Þ«õ:þ›ûz ¾”ð‚e°¶6˜ª«V²'Ÿ‘mŸi@ +ˇføqûÐuÞcêjNiO-†I0©+Né bš68vþ·2‡αl$0|5¹=êðŸ·b§©Ì°f‚n¸*m{ÞØtB)”ORðÑšµ\>cäûÊ%`™g‰KWYì½Á¸Á «Åg§Ú ÀÖ;-Ù4%ÑHXE°)¢ÁÑõÅé½kžc êÀºUi¿2Æ,Fo:x°9½Â´À8¹ËéB ˆùA»Ò«þµ,Œ§)v}˜7¦VÄÌù¨k³XY!#ôo.ŸåB[ðÊ—8„Q{V ÚbÝ;dЗˆ‹ê´ &ùš1öž¦eùܯ<‡Rf;ŸCnNjc$2Ä{Ðî‰Räǰ¶‘ÞZìg/c´ÎÉûAšªÆC&KH¯º#sK¤èÒ¥a¦fFf}y×j˜Ø!Xûž‚b(µðw $Ê;j@xQ¯ëž¹ÍˆÏöMŽÖæ> Sewj¯®Þ?¶a¶ûOca§aÃnk0^Ýgê—¢žœvÆ ®F"Ÿóóq0ž‡O¨hã›»Ò_De·1KÓ*VTbžØ³÷®Mh'Yï¾F´œŽ•x^0S¢ygUùØó³ûøœhä@°Pb½ÜFàK÷(_îf4Å?h{Ù|×uX‰¿´¤.®–bˆï^àkµø¾°Œ#o¦Àá<2«V­K˜ÿôUAý#è'ÕŠ¬W ˆf¬{T„²iÇI¬DEf†a/§fó@ú+Û½Ø`ÑmäsÛÀvàjßæ­/:ÚYëÕpØ£|S>ÍÊ¡†lk³Ê èáSšõvÑ1û å!½lîNA°$}šYLß ö7¸aßÏ/¸÷«¯e»f€4{Žƒ„ÝÅaã0pÍ]¿FUy–Ãù€ÄùlñPó©Í˜0ºÔX«k®±à·r2WƒÖEI eHtBÝ/È•ûù°{÷&#qQ+~×Á• !úqpw=ÝPß`!‡Î‚$o¨®ü¾»ºÔÁ}D‹}I!ª¡ú2€’õ3H‡˜4ÝË•–E~¸9·ø×}E`µÂm¢ƒjÚ7Ú-ŒûÑòã@Þßw$ÝÚ_²1”‚‘ƒ¯ØZ\ù—,Y‹oå¸ hI~â³ÀøÃ•æ©Z² M©èM'¡ôâ×ü(*«…wsC–L{jh³Ú?éïK©qIÜ¢/üL ð'}Csù²—ÞÍ|ŽH¢òRš„ÌmÿÁ[àtÎdq?AˆX:/PLx!M¨éWU½H%#àßÊžHXÕ¹‚÷.FYÞÊ"éX§Z[:“¾•«$.{ä¸J{òËšª­§™'†ã‡¬njŠñðÏâ‘N±°Öô4]T<]8¸ÛÄ£7?|³š ¦ ï žbU¨ ú^½ŒÞ0èõÉŽ‘+Þ’WaìHÐ’RAÍØ®1¡‚»qÀ¥È8¬³|}˜Kßæxw…pSµ› -kô9HOèø¼çUk]99UŽTز?sœ·úËkFiƒMäÞ¶½ÛÜÏyedm³G×¾ ±/PÒê ³g݃¼“'ÅH¹1–¹¼¿ÎÔÈt:Ù«±¥žS>ßôNŽÎç_N c¬'‡íÉÃ`}¼ìØÈë °G§Ã†Ôí¤ZsïåUs<–'ÂÊ{çUq‡yä×W͈¿¬»LndDL‹ÿÉÛ^i¬Úðô¼nÖ’%ò9™5OÑbÁïËÅóˆ;†6‹Éj~×—ßòµG*öÛo%Ñɶp£pôx³õ<…m„Q–Wkâ¹;hL c›ZÙ„mŽŽ¬;ÄË}V›È;]}“dyMuè}æ«ÏÁÝÇ„)K茜háƒYwqÖ •Ìý¶u‚vzÃcëö‡–ŽêX­,¬y ­Bw¿”>e0 aXª4rÊöw¡I}D÷\ZÙˆôR‘"¬öÕÑÔ;Ö³Ÿëèg÷÷™çãŸðžëì‘ß9·/ ã„Õn›g”Ô 2–ùš&‘M®•á@…ý6ãósÓÃE’Ñ~R±Vƒåñ¶µ&ÝãTý\áŒ2ºec‰f$È:‚ì!ІvP·Œ,KÊŽ±tx Ô#öJQF½H‚'é]Õî€'­Åå€Q •u†:aMR8ÉdÉ7ñ͈ºØŸ¹KÞ…Ñž©íu4o£*IõO·ÇTÁ„^nâ)”<ªA·%xTBng凌uˆ¼>v‹Ø¢Õféý=T¹î„=ë;ö7h2©Ü*Çœ_ÝÂw±¹ÒÈ€ôP^bèÕ*Þ;…(‡x¯„óš¼ ÍsæFƒb™Td)˜üž(v t4®óÓý€Ïõa&"ŠGÆÆv¿9rñ[ü ó4jšÖdÆDìåNxæ\*º°>èè +A’µúãC†7|·” F3•£|Dé“l#Þá°‹vjÚ=[ÉÄDnÐñÉBPÛa[QÞ^ä*™¾šÔ³ð BÔ@g%¹å‡ÚdµàØÊéiÈ÷}~":½†ˆ3è·‚¼»Ÿ vEÿ¥É_âç¨~O3DŒsëÆ¢p¬M1»{oíb6IÚ6ä׿ª à9+FºàÁ&::yÛ}>/“ıOµ¢;Ý']Tk¦±ÜÑb³?»é SÀ4k<02l-6uòf:¢8§Á ’ÊåøFÙtïËn/³x´-UšÃ"…à ­{‡ÏÙ£ð ¿Àæ=Y§ÜÚ,]y£ø“mÔ¨õîºL‡”ü#ó~·“'†^LÎ %¾·1‹@:8ìtSÎÚ§²Â‘R ÎO/–YßÃúENÂ5çì×fzŒvW¬M²YÆýÃ"gy´~RüQN],ÍG<ûƒzHþÊtáïÀl3‰V+L¦Ý°‡c=H¯Íº}âE©\‡yæÄàôâ_A‹5Hu]蘾Éî‡Ü*Y Ñ´~Wt`ho壃ÿË«Å,Üþþïau¨@K5Lkwÿ'¬$ƒØöé˜<_ ¶ç°(A¾-£RAØŽI1zÑU÷bh‹N?@ÁUÓ€Ñ÷€ÿÍã0ùÂ˜ÇØì„¢)Þ€)‚U³ì)>_…ëeØÔí Q³h El adÝÒÝÁ7‡$÷pJÛ;M°¾›{Lõ*_uøIù1÷"Gç^FøfYæZ]íàíI×ï$9`“Ò_ü¹“<‹ÊöžÄ˱QÛ=‘~·|B'½&=ºLÄ´²â•ƒÿÖîŽÏWn7¤6eć 3é?"ãª|Ž–_"¢Æ_Á!±p¢á•#|]­ÅoQ ñ7¯Ê»‡y‹k“A ¶;úºáY!‘ç_×µ´|jæHG6 £†¾nm?Ø-ÖF>šuÐE—NJ.ÐoÊuŸx£Ûî¶„1玬ŸÅÚ`yr™>~u^®¾ȧ›j£Je86Åk'1‘820g6ì– †ÆpœQóœë|K>ñnÄ­.îN‡à¤ÉV\ÉJ%xázow‘f)«=Ì«2.m-ë=xø<‰»´k)ír•3Óß+÷©`H胮1Uø6´½QØ*•õѸ\î[Ð*Q „'ky~6Ǿԕ$È\§6gDþxŠq:Ǭ‚wÖ¸âß_MM=‡p¸»×u¡piÏe6!öý¤7}8î'I¨+ÐLI ˆˆž ÞKj~^ÔÑ;é^µáô”¾ ¸“Â÷Y^ùøAljud‰“šXS#ø-YÌù+7u¬ Gð ñÊé…ôA¢-¤‘é•«½µñ¾;G?yð}Ræû²¯Ñx+L“W|á* JP;Dû*üš«x¿ê‡$º¯>”S;$²×&ûï Ñà¹XÆüðiŸ{a­/7ë±×_T¨v„¸SÄN]{)Iåp&õ Ç~å+êw¶bÍ–ÜðÑmØ_3ÈבOGøG°q¿ÆPLç¨O †êƒTH ¨­—¹lÅÈ®Ó5•B©Ò]Ó:A,·2v7)ž} Ùo¹ÁeyŒ¼¯Yf +°’¸91¢¿þ5tâÄqöþËP¶@Û ‰ÞÒX©*`È2ºkÞ¼ž ƇIÜq×þŸì@™¼lŸÃd5?,z›–ûïkCHÞé¸Ö:æ}ÍP)•æ¸ÄJ ÎDޤņ.fÙõpá‘[zâºlåXÞüoØe‘šYéá†6;¶½X8º(ÌAãÏëþí>v£{7ZÝð‚œ%Äác|¥§„8ÑÏ ‚QÅžsv—~qpL½~c¯?â”;å˼y#3ÎA\ è{Ø_Ü%Ï49=Ϧ;™~ð–ùSu5aÕ‡Sµ² ñ0åú¬³*»ˆK QG:)ž{—ŒÖ›Ó#çŸÂgç–ó‘i%¥¶•³QwŒyyAD©ˆÌ°dÍDþOê_»¢[|ý6Z)±PÒ™r âÒ7w*¼ï¯dòÁi—îØg*$Ï#›ÊG$ècŸup‚O¹·D¡|]iùk~»ŸŠâîúò>˜†ÚÏV9¶ ;Æåó\”ên‹â´Á? [^¼4¼š9âjÊôYåÐ6ÂNDî²’‡eT‡^ª W|D/¦z.Í 'ôBÕqµìü"ìí¿NÒ?M©e¹óo!Z9r=1h|~ìÜÕXt™@YÃj>J÷$Èà´o0Ú‡Kÿ¦»Þ‡ÒJ‘ý=n."€nåìzѬeD²çÿƒf¦ lòrÕÆ %ØóªÖžlwYLËýƒj¾£Q—ˆMIBÈŒ„)ôècæ¼ÀVªì4;…ï £ƒIÏè°Þ÷Ò´Š¡ÎwyW”–Ëiu0îÔX8Ó”µáÌÈò¥®ËàAŒÒC@B–SŸH˜²‡{c¢ô±l ­Ì3†¡™Sš¹`cÖÇøS9•0öÜäù îZ‰2àÒz2éo$˜9¦,ú²~­OÜàÛYšóuÖQZ ¡­FBÃ"šrúã åwò¨—ºË¢RÇ{M¦y+·ffŽ&ŸÎÌ}¤ïU‘ZK €l½¸yµ{´(@%ÒxÍóDNÝ‹Å"W÷>ž»F’4AcdWÒœ‡IKåÖëß<ÀL!…žˆ‘OZVÀÛísÔï_¬“õP´ ùäÆyÏ‘—1¿R %¿¢ }Û˜H÷þÑóªçëÚÅBº§FÏKcÝײCî ]ÝØûÿ– ióh*ÎÝ<(ÆõTC¢M²5£“ˆÅTqUmPâ–æMR’¥·lô¶á o 3 v±` WPd$ÅŸ\>?©dÝ~øQVJ½©,p`p´ÁÉ&jó—¥Âh».ÃÚˆU±ù´Ép€ŠAk==Ò`)Êdgp•_„³îí¹^›’%d÷‡Žcá¢Má«Nßì¯Xo¼a=eoõk'ƒRfZ›(¹¯?ë @«ûÅûagâ•ZÇzùËÂ]íÆ1ä*uú·4…6q€¶¬’žÐÅú¨ÐwM?¿ê8DöG9rg'·%Û¢ßáVîAß4Ñ I课ò"¶PQ‘‹ï_0†Íð6ÛK"ŒÕéÛ—\xå‘ œ>'í0hH6@ì»*ɇþzÍ~R£R©]¦Š*èO¹¥P– Ó¹ÀÏ`Y`Å›ú„Õ4‡@mê®ô`íµÑô±{YÛþ?ÎF QµÊK÷3V*ˆÕÕ™qfzsVIþsšò >Z?*–Ôê‚z}‹­®‚v¾—..&vedáD'\Ѝ'ÔsV¢÷65]‡A)u˜~Ääša½wµYð3á­Gn4LÖ.Èæ‰•è¥ËKP¥`'¶Kö:Nín¯OŠvˆ±Lp™åáà‡þÏüþJyP±#\kœ[7[Ô1øü9‹çÿJ)îÛ°ó,•Ã?lÄiI 4H˜0ȳȳsbqÏäÞ¨ìáF±'1XÑŒ¹GñŒ0[!Ô˜+X]óÍ[¯Xp*-—È¥ÊPGMÛ‘/¤´ür¤ø€æ2dø† )?3x;t̽L­;ù!]“Œž2Ç­ìý’­“,‘ [ðtÓb gǵͺ:(d2Uºc\fÞ-¿ÑëR?„èýMó©-Üè‹60P,š4o›ƒ¿Úy˜ÓùÇâeAXƒŒC'!C{rTåSŠªæJfÑݬq|„å(N=‡:h•¾¸'ãC·2ï©phð’§š Òç +@<ÒŸÂ9  9>àúÏõ“ðÉÛï F+‰ÔD5Å“{±*•ý5vC¹ót 71´I­?~Ú¢‹p=˜>>¾Ž/çq¯y¿i·,X“Û`)LZÄÜ^Én6SÑC}Òj|¶¡­“uîÁ±¦ÎËg´×XÇ Çd§µl8ûNzDx 01Q+Z£s 3½ý8š£¨muŒ¤û»iÁF•³%Ñé}Ç€F_ïh%êÛèW Až]ÝŒ«4SünºôCùü‰ð1Á¸Óã;GVgˆÔÕ1µ¶ÜFZšˆz‚îµ÷ÎÕFcôâ­´›~ÀŠlèý#Pìê¥ðj¥»Ž»“)Û<2ŸöKîÅWâ0f·•”ºßßžZ†a޵”Yk;äZ¡„iE݇~Ӣ핎2;×DÕƒñXGŒKÏj÷.ö6-SÁîN¸ QŠÂ½/ä“‚0-_í8®®5ìΜޓhï£:k¥÷e/šÒ3'óÊ„sÚ9uS†ÛMûLš´]’ú:VÑîÒ’v–t½ï+µËƒ* rƆôÓ>9€’.YW`Ù3Î_½þ53V˜¬íqÌ€læÍÇB)Mi‰•Ç^AbF¿xLÆÄlŽ# V â™òrà?ås08ã¹™Q‡…²ú- —Hê·6t1tz[ˆäÔÙ„ð (ƒë8õ~xí¢²ðUÏßÛ °äŒ›qÕ±áCqÌàÛÇu¼ŒàÜyû†ëîtÓæ ÝÜïdßf‘øg—Â@QUk0¨‹c»EûøŒKJ†ÇXKOWg}®¥öŒM–ÂËo¨Ø‡›Âëu@Uùzwk´d‰¨Sºæ¯­pø$”„°D¥ý3ÞÇ2„§×äGŠb=BËe0GÔ€*¹Ã´ª©"$AÍ®‡ôhU[ÿ;ð¥áœ¼¸Úãm©.Ýu©[Àq8†¼Âº²kÛÏyñžÕ“‡‡;vB1¯¡‹@C5VÜ_¾hÐÄè ãáqG©·-|°ð·ÂOUÍ´::ZÐKÙqì9à’Ã…ª7{ʧ¬ž®føA-üÙIâñŽï5²ù,dUѬi%:7‘6…&Ȱ¿bãg‚¥áó-6’.0-K¬x'9fB3V¦¦án9’ý[®yÛCÎÞíw /ýñø%h‹|0¡:VÔyeÜ2Ab[Jò_ üVs.B÷€L8”ÔTŠä´F¶QdÊYªŸ8ú‘Bº=KL¹±ng÷ÈÃçw;Â0úË Ï”’ÁÊäSðó“Ê™W´½„Ëù6Ö¨CÅÆÌ¡}Å£E]–¦§ùÓ _ùƒ4Ìô^YšåZjz0Õ8Z¤eeƒpJ.AR°c“Ú76©ó||–u7‡V’=ùÜüÆár\ЕñŠB‰1.t/ëÕc³]{Ì«/Ô”m¶ôÏiÕ yÊ;ó ôA݇O²ðv0º_×Þ‰Äöž¢f×Ýñõ©gÿMãè~ó^îù:m>ä\L蜟^¸°ê¶’Ýj­±¼æû(ŒÕ,³„Ѫ@1·r´ü“ÚÞv9·A—48'Ï*=®êÕÓ»±q$fsSrî-‹¤w 57£ï¿¯­éÔ,¶n¶ñ3ÈRjéðNwÔ› ÁôŽ8Ó@ ±Çf…íCŒæ™-#wãPm×*ª§ b" ãêZEÑèãÒ[íY* —}á £´oÆŽÆ‹CtR´Ëu¬Ùà}MÌS_M(«ù^q\­n½k*Ám'f©‚î@:d–RnîGÑåKܶ(È<ç|"ÄEjý3Ä~¯²…ŠÃycíµ­ºQç: XÑÃÛýs oÓ–Nykt• cÂÚÞ£X¥^~0zšµ$Õ1rDN䈂1h7'ébqtc$Éû㉬aEÙ¢ÛúÍút^5Ë¥#x²Âhÿ8÷©½$AØØŸ a÷" ±t&YרŸ•5$4·=.ôXcƒeÆÍÆTŠÄºM¯õÊõÕâS­ÙUŽh²"Ëq1°B­ò8[ÚÕ%Î8GOÓËM|}OVkªëLA}óT.XJáò¿0žÅ#‰–µÚ”õ¸š²‹öl„R~J)X$4Þ6c{Üö)‘vèôñŽêãáèµ ±ÙÞʧ—¥G9ÂN½ô ÌÝ4¯t´›j4Qšªu·ÕÅÀÌ0¶ÁäýIðd™/E0—ä¡+ãûHþrZfµ#©ÀÛ›E£Õo%¹Oü?^š}9¨”œœ6Ýv˜iz¨yö£s÷Êò¹0š¦Šü§p%$§ej®VÖ¡öƒFÍ@®n: a_—”Ï@qÔýöKRCK‚P+×ÅûWFªÙè’jµYœ'kaböTŠ¥ä²Ú…6û·;¯=è +v‡ªg”¯MýÝò¬’︀`!öm£À²I€ýæ/¹ùܪÄu-µNƒ%ݧ‡›öÍ‘©Pi·K‡ÐÔ–ð€;M¥ endstream endobj 848 0 obj << /Length1 1456 /Length2 7174 /Length3 0 /Length 8162 /Filter /FlateDecode >> stream xÚtTÔÝÖ¾4"ÝÍP3tŠ4CwI ÃCÌÀ0”tIH‰ˆ4ˆtHJw# R* "H ê{ï{ßûÿ¯õ}kÖúÍyö~ö>{ŸóìÃɪkÀ/o‡´…© h~P  ¨e–Â@ '§!íûËLÀi CyÀ‘©ÿ (¢`ôM ‚¾ái!uOH“‰K! Pò_D$J  ñ‚Û´êH̃€Séæ‹‚;8¢o¶ù×À å€$%Åù~‡ä]a(8‚hAÐŽ0×›¡€ ‡¡}ÿ‘‚[Æv“ôöö€¸z Q÷yøÞp´#@æCyÁì¿hC\a: à:Â=þØ öho ¸1¸À¡0„ÇM„'†Ül0ktÜ`ˆ?dÍ?>À_g €þî¯è_‰àˆßÁ(éêAøÂ{¸  £¢)€öAó »_Dˆ‹ò&â»@lo¿+‡Täõ›ÿjÏŠ‚»¡=<à.¿Zü•ææ”•vŠHWWíAð«>%8 ½9v_Á?7ëŒ@z#üþöp„ý¯&ì<ÝpwOXé/ʉào› Bb˜;æuü•ÞÐ× öÛ úe¾é ÀÏ é°¿i·‡Ýüøy@¼`4Êà÷ŸŽ"`‡¢¶08‚àïì7f˜ý|sù(¸à!ðF{ ð×ïß+ËyÙ!.¾Ó߯ †¡Ž‰žâ½?ÿÛ§ €ôøñ ‹ø…DH¿Yü3.þWÀ¿cÁ{$@òOµ7Çô¯Š½þ÷_ÃÁøg.mäjaî¿EnBo> ÿ³Ô‡üÿþ+Ëÿ&òÿ.HÅÓÅå·›û·ÿÿqC\á.¾nD뉾-äÍ þ›jû3´Z0;¸§ë{ÁhÈÍ È#nÄÌŠü±Ã=Tà>0;]8êøG2ìF¿FÍŽ€é"=à¿Þ–›( ð¿|7óu¾y?‘o _78›R­–ýÓžHQ/ÔµâØÛ~æóŸ —=ßöÐôú¢ÑÑan#Œ°s ÞoÔô>z0ÍCÃçþm}&sSUænãëŽûx\õ;„˜cqOðh%$„ 1ÃÛä3Û^+TËO¿ksx>Û}Ƥ²y–Ö7,$ºÚÿ¾”¾’ưµEä¦q”¹u?õk·½†Í`šs­[™ö"‘;ô¨5<„ÛÖcÄ@¦Q_?A@óY]Ë–wà:ÍB"A×î-hVÀóf}¢*Mþb@0;aßVÚ"«Ä0F€¦u>å>“ž1ÄÖÛ±;.×¶ÌK}‡ÝW©QV2‡føå(Æ‚—ݯ&|Ü_œÔå7Æ‘ÖVbÐÛŽÙ¯%R¶ÓÑYØ Ž. ”¿v¢õMŤP)ÉýXûBBkB¬æàù!{¶­š¬»f…~M^ŒñÜsã`Ö;ÊÌCnõû…‡Vú˘œY ¦–„HŒˆ\Ó¤‹E¬HÝ ¾ì¥vÍ×ï´øA0QDuÈ<˜çî|rÖ°ÖŠ@à§ÇjÈ%U×ã‘Í'ÁÎÎÎG+¬²ö|‰€-Î'³î~xg¬•1¾"ÈÏŽ;qÂ.*÷žjâäT}㊜þ(0`<1æîI2~N² ùNG¥*[>ÚõBŒ ¬nV¯­% V„o3ÜMâ#>á`5}¥DžÜjx‡Ûˆaذũ¬Õ5ßqç!ŒÆò©iSÈß©6›*÷ÌÝö%YþÞó¼gæ+§p§}Ö¢'« l]·h«á3dªèÃÜlÊ<È¥Ìì10ö|ÃõÊ4ˆÎçª&Ïwš¸û~î´:»t÷Á3v)Ú RN ¹qkRÓg£ä¡2Õ„lßy9¥Â"©–(²¤®·\C ‚WÓÏä˜ñsàY3Ì‚lÏ.[Êwœñ×y‰»šâ9[‚8²EÚSØtÈÅÕö½Ã‚[×XCMÂ/ß MIJÏЪ.Fz3=]6W¦ƒô¿É,c^7“˜Ú©Nlº)ÚŸ]=!Ê{æ@sÿºîy©ÛÓ——K~/÷ê[äöíW" ØÒ Œ—yIJk=ÏŠ‡–J¼ÓÀ X¢ÒîØ eÕñ ž7orvɵÈh›Œð ï¼ÙÐ:â6,¦±b…Þñ …ªeïÒQÒ%‚cíÁýi]Ú!‰å~Æ‘ÒáyN·¼™zvòçèû›ˆc·8Uu ‹/ë)&­¾Œ/Ï 먂z¬ýˆÊ,½¤˜BŽ*p¶m\è;u)ÄÑC<&F¹ÒSjß÷Ê÷vkºÊtòüdCfÝihæÂÇ _÷*¾Ì\jp›M}Q1N4ÄRNÎJݱV¼æÉ}-Ý1X­…#:'zŒÂ„3xK { ¬ ÞÕªn)¥ó²ºÖò ~ŒƒùаŽm»Ò2#=ÔßÚå8Zõ:²œ˜PCß*ë#hä!]ÏD‚Œ'‚é[mJ61?õg¶0Cn É´$娑² Žl6²dlìxíçõ¢¹3?^Ruœ´Î}ööWÚ°æ÷<.?O×PŸ{I´ÎB©¯Ùpð¡4æ»GV¥²f2ûîÝøùן܆ðF"°¡"±ƒ¹4ùZSf_Zî*s -Or5p˜ÈŠžW™gêkv¸(dA¼r§l£ßdœ&«VŒëÉZ½•Y4ˆ‰¹¯¸¥î“l™Q7}” 5(°¦Í¨úº“~-Ÿ»-t‘ü&g¸?;±«N¾¡è ý£Ï$£Óô²´Î¡Ÿ_ßâ°áŠŠ‰Õ1„×,§.ywÎ_¦g¶œÕ6ZÝ;0§pð ø;3×—Å4 =8%™8Qvcï¢WôþÃBˆÁü·¢ÌÒB“— Ž9ûz΂÷Å|'w×[ñŒ’> ßo}ÃI…ÚÄ×J¼º<8 ¾ ¤v¯<%M»,=“àœfKr¥*2KT±Åz«2[øž\áµ~‚ŽÛSTÉ‚Zsb6HAkœ\ŽÛNª6Ö0Å„ŽãÓH"{@‰Æ`^-ÇU{ôçEÌLEUÀaÂi å—¦oÊHàË$ÅÁñN1ÔrŒ ñ™…«‰H'àPï í«±7A•ºRfË+‡z”ð¸O-Â(T”õG».蜈ì…IOwc0“}ÔpC;·Ä*¦¹È½»]@ÎLŸ´má6¤‚O íÇòF-ö°ûCkdHø\¨—±¤ãÓ™òÍ:®Íq+Íi—Ê«²®õ öŒÀÌélf-®M¹Âdeû=ݳ‰Ç™ð4&›n§\I ƒ÷4Aé}ŸÝ><òp°ì2‘7¦ž“ÀÍ%’"rïåÁI ±úÊË6gº{Ê‹Z#!]ƾg›ªoÏÀhU?©Âƒ¦A M<ÖIxx‡³] G°Ü ±_„.Ìv?#«ÞÃCr¿•ß)? £V¨¨§kë}ka#Yï\ÃYð#ù0²^PŸpàÎL2yÝ“Äui»G2º:˜Ø/ò¨m,…ßã5¨95ßïý·—:KÄ ËS7f”sëä´Þ½NlÃçX/ $V¢’Üôùâk‘º_fVµo;ÙYPTd¶8Õ¼h×ÞíÁó{R‘útoŒñ|Kì'ðm±+„ `åÍ$Û¶ß¾‡‘Z‹éVëÛº‡ rj)ŽHלIÊÅ£–Ë×»•53eÖwd[_ciL€<7K›ï?"0ßbná„´¾Â#n`·ÀÝi“ð4lé›!ãÃe¨ZwÞÉ'F„œü·G+¡ûó9}ºqD1w&/||KWÄ(VT <ížQ^/>|/2ß.2jÍRœŠ)säŽeÀpø0xw_=]ß Y¬Bàš=EðâÑè\)wbûèV‡ÓÂëÈ{†¨Z°Iõ®12ÿÖøiÚ¢»àsé‚HÏ•ÄWÂ4sçÈg—Žñù¿D_&°u_ãHB¦ŒUL‡Å¹Úß=üôì™(J¢fa|PG[6_U˜~ºY×6Õ¹‘åJȪKm$Hë…eÑÎõYµ,‚=—º žCÆÞòR˜g¼$T\ˆ$äúYÎPéeeç†R|~EØÀ éÏ ¸þày“çv[T$Ó~žý§üÄÒÉÐ7%¶g¥ÛMÄOmmf’‰„7I¯’ú»Â|Ón‹|«4~1äíÅo×™ÂT‹y¹±BHm‹%÷žgX`'áq7­5ÑbT‚Z7ï^zçìóúÁÙî²–Ô,™Žbk] ÒŒüûØaïå}ζFŽïj$dz¼ÔU™Ö‹FO^Ø®0]1b7"Ÿ_ßÿ¨¿Ï`¨Ö;ó%JÖlõûÖf­Õǽt`jŸ²ÙÑÐÎ>~æªC|N·4tfXb£·„=Šn0 ¨ôùîTTÁÒ läÐ"kŸŒrï7ä Ò§¨W…ax> 3µ„e6É9qg•Qês $m¾å^l¸ 2Aq‡x]ÙÒ²Jÿi=E‚Íž·¾Ï@r7RéV«=¸«àŽˆ5Œ_ç»Bù~nd²­omùR«§åS ·Ê–ñGQvvî7‚L ½/·­æ‚b¤jäOÜ¥-Œ­¹2À“ùÊ™H‘S˜ÑýdJo³Ò:1êqò°JÐÜœ¨O„%`OxAGÌæ˜2Þ××iÝ.Êö.-ð, }¯¶#ióP|Ešgæ!Ë‘/¾ ürÀ¬¨^BAò’µswò‡xhó¸w×Ëe^Œy‰,0Q°nùа\ÈXPó|Ðv•w§±RP% rä1ÁM" b¬€…4?W®b âc,ÛŠS—|v4}—Ï"Ã'G«¹Z­´µ-rœ£”Í+{¯Ÿ'ng›+ÒߤVeƒ"9A88%¾$Z¯3šÿÁ%Õu»÷’\OO¥™š‘ ïqnJ_›ex‡7c¾O£8õ$]¼Å1¨å:F@—(]««]É­kyZ~O¾;QÿëÛ¯æ ªžDXÕ?üÌ#¾¼-JÖo¾ _' ѤR^¼_Šbggµæ”/LæmTÁ3‘æºsß+²ôm²M)oÞU»Ùýpę́ û6„! íÔR®ê£2uÇm”¾¤ƒÑó¯ˆ]+ÍçTQ¶àZâðir+j½Ôäf­õd5NWô>¡gV3òeä%±c4Y-#èst‹?¼þý¦±ÉÀ:3ëUÉÌ"ëÎ×z¢* ±D…Ž‚•2«‹Þ i4lþ/Û¥É55“¼y‚^HzY¥J°Ï¾T€W€›#l¡-àCjÓVE èXä*ƒ¡9ɵs3sÆfe [5_F ÄšoªAH„×PaÓh¼™SÒ·4ÚÄŸÍ’|«ªÔª0-AêÏæƒy;!¸eäèžâÖ¦žSïv®»[–æO´/+ÎS 7oY©õõ²®îϱ1±óš•š ÷Ò"Ÿô¯.WÅPæÈ;d͑¨Ù+žìE5Å’ž£ˆÒe“ÜðýM 3ü‡ ³¤Xl×K%IªF©ßÄ9ïWEc*Æv‹#@]“¸…ÖÑ!Ïla Y_u7ŠqBáz6Ïs©×ôYcQˆõ/ºÇÎÚŸ¦ˆàx>Awò˜Üóš`˜Mg‹5ëWïä »è3sýDŽaáY<Îï\$Ød=ÞKÒ!„iFygC=ՙϒú®uáb\ºÛÙF—±†Î>XF†ú A2¥/)‚©Ó£lgÜ\ßer{Öû͈µÐŒ›1•`BÇõ Ë™ p÷öow‹ÁìÌJ¯qüE܈R…û;UO äËj‘påbÇ#Vu ÛUk BäË.Øœh[LÀ¥ã=ð£qáñ(«º¼/~A· Ý];.J®s"¡µ™uRMh7yÅÝŽGsž“äúùž[t+›ŽUtcCâÒGd(épÔÊÝ“°é™Íu”uéð{l¨‹ÑËhÏáMÒÔíÒY¶Ñ="K¬âÖ]Á;4×±f‰.“˜J·—ÚÆ²S&XéÉ_4ÅSA#ïÆaJ^æ¤`ÊïÙR§i[ß’UZ#iN)Žc#—»t ùðŽ8§ù±÷„9KxtûýÈ‘o_iw¥4AÑ%ÆÜ+ AÉ®´$)¦w~`h€”Ïé@Sûâr–M;öcy÷a 6žxÉo\Ì´ïõd_ŒNÏ-ÐVÈƸæLDz‚&Fã­?'ä ÚL!Bí˹ݹvdAG«tGMEç#^Åj e* ”^R6c'¹ïlûÒÍwΙ¶”I8˹yN&Z®¯ñŠ9»Å[-­a–z\m¦E–?²v¢MCÔò]§­YŠŒb«Ý‹Ïmòor/‹ IâÑ[nØq~No(òŸ&…«l—õû|‡SÁIQéòÑh˜è‹«WÎ×ÍÙ£Xwø¤MOª^©æÓÕèÍK©ŽlÎ`p+}:ã}Rí{¯ÙƒMC¸„Å~†»ü®Fݰº ‹O\‘–Ò(£/”2¶Ù,ÿ1#cè!l^l5Uqvw÷ñ‰ªËK $Åë1„[ïbþ®Yü6x&ÍS,Кbû|ºžÀÌMüÍþ·“èUªïþiS$9aÅ—Æ? B©FûûAy5ñ.ÖüJ™ó¶œ‘X^p^Xcå*»ÐA@•/rfŠì€E‰oΞ͊Û_ô:ÌQ'†6§Häé(íÕNx.ýæ ÃÜûJ²û&$æƒ~Ï:»øc3£öIK œ”Œ3É€×MtJTžê*³Š·q ð§i’TK#ôݪ[5@?¥l®R€ ’êÙ?"j÷läEª<²X5ÓÔøØlT+ûðk_ʦãQ·ÔÜ* O³Ò[suÁžyaѺí2`½HÌK«ôt4híbdûcKKöÓ×Ì[!„Y6ˆ³®ÞHtU 9DÑÐþÔrÈf§)ÓY×–Ü)9ŠM&Uç»~ûÂcßꈻÚý–ªƒÎš¸IµSËã‚Q ,ü0©–º¾;¦§cùZiP]ð'fsß"žó¨ÃWìyJ*ãçE®b“¹Éô–Žtï>°?1¨ :Tºî #ÙøâHmáÕyÌËY‰ÆLã¼’˜#ìôž(–‚'Wé]ÇKÑ|[Ϭ%~6èM=M¤Œ`—9u&Úï!$:å¼ìܱUc ŸÂ€\õñDKÓãøô‡ UÜ'ß«­9_@ÔŽ'^ØåÎЮ•äÕ“°[ • Wõhƒ{ÖRC¾8¾ÄôðCW§î‚žµ(ujèOõê™"ãág}HÄ5;šÀ„é›ÜáåÞýôlEÄã´ 0gâìÐîwêW{º`üÇ‹.ÛBÞwwLÐ?Štkk\…/üMyzÎ[É»H•Èz(nK¢C¾ëõ5ª£ðÃÖ¶l‚ÞÅ~¥n à kkxÍܺ ŸŽ =Ë*Tøӡ–ò‚`ÃÎÀê'ñí7MzÒÚÒ§¾ƒ 3ÈšGV‘¾“ ÀGË…þi”ïø&mh"½¢Ú“¯=ª†ÑØûé˜jVîKxïX}ß:·Ç—¸=°bÇü ãÉ%/&ÅY1Eüc¬7„ qF\”Eúln¼šR-?\xq5éìýõýOÖóug9}é[[ç¨ÃœqÑ Ô Ö8Ñ~<$B.æ{äï¹#Û|Ñc`º˜GF>‹g_aÌÄX6taŸ|¹ÖÉ\…¥Pn‹ôõm5…‡ô,ßÎåàst%'yÊ¡ÇO;x O|Ngl4¯ªŸ?É0Ÿ€+Ñi…8;1¿8|éþ2—Md5ú쵡þsU‘W\ÜÊÍcžÉ¯aí÷°/xD¢Ý‹_‹š$Þ’ÏÖ“/9qXúÔ´trÇÚ‡»µuå]éÇü™1ÔšoüV56E˜Çê—0Úýà…ý­½~ü@ºò!³xöô¦Õ¼åiÓ€Ï6›&ŠqÛx':mbN ’,¥vËÄ$P71wi˪!ÏmeÕgË5Ù²ÎÕ‰޼L0sá…ÆKñ?ˆÂã•ÉS¤g$4Ÿ°à[×`O¹çtÉ–Ñ«ÄuûÓe| ÔÃUÝ1¥äh¯Ý»ÜÜ ²M>+âO4ºÝAů ¶Tûêf8–´[q_[WoGöPL'Úµ'‡ú|ŒAðT^‘ÜÛÜ'âÁ–¾ô(]¢-_g%ö;Ûeëí´À Ǿûµã[±ˆß:•‡xüÔL­ñ“ÂêÆóóÁ×ß4{0a’9þ¼-·¾âX }¢RA>>!Ò¯”œWâIT#~û9+E<.Kvýi7=g¬¨y·¡n‚-^3MqRð•4Ux5û¨åuf/Ǫ·O´ªùvÄ´þ!{É‚9C©uVg/^?†µ@ŽúþÏWf1ïñG)oµ¾?Th©q—78Rÿæµú“^®qðœ®ÅÑ" ÀÂêN&©ÅØüób³÷ü}‘`wo‰ÎnK?âöLè$oue_Ÿˆ}½Ä5ù4-¶¹ÆCTÊ{ÿ”Î\¬=`ƒ0^c%‡-OIŸî›\üüà'î^o§¾nk¾}Îp™=ªsâN$CÈÓžÓöi¿#'ý]b¶Ð÷.lO¿ï2ïTõŸå†S®U)ÐðtÎg`˜ëx&ʧŸx$µls\$ü‚žüÞµl¤ÃÑ¿Ÿb Ñ¢2¤ÑÓ3 ˆ<¶h…Ñx %t{w7újT³TôJ »]8øäb§~Äy2ÿìÈ©·²ÎZÞå©‹¿ºå“ÒûC4H#ù-õÉÂa# Ã&ZGá„sù³°nyÔ¨`p\Š ãGþ{öZGá2bµrqL°{³Z´Äqí3%ÿÿ‰îûj©½Š1ó{»P¾w3ÀWWᨰ>³·6Õ-ņõÈM° ©!ùGÉšˆã÷ËüÛ·“PçÒ .}x~(®ÙkÙlú«?ír@½‹tÙâJÕBÃJžaúea*d_™ª¥ä¦ƒ>æNÑtús>ê­¡§)K÷Í“¤±êù¬Ý,>Ü$*š¾Ã”êüLýžâóµ܈Îõu 0ØÃ0ÐÆÞ>Ÿ%ê•I@ÍÉÅâ¬8Žë°'?®ñÞ˜“ôVÔÕX!\,é« -NóÇr‡ðÚiSßT˱¢)A÷[L:…ÈË~ÞXqxÚÌfi¡ìÖæúÕøn¿Q–×õÝrÁ²«9ÜQ¡µ¼Ø ê›cèØ¦ææ{}Gs —EO‚nð¤)âíb½‡þkâ›Ì endstream endobj 850 0 obj << /Length1 2778 /Length2 19975 /Length3 0 /Length 21561 /Filter /FlateDecode >> stream xÚŒ÷PÚÒ ãÜ 6¸»»Cp÷@° 6¸C ÁÝ]Ü]ƒwBpw×·79÷Ü“s¿ÿ¯z¯¨‚Y­«{wï=ÐP¨i²HX€Í€²`{VvA€”²–;€‹•…†F äb ü¯…Fèä Û þËBÊ hê‘I›º@ •ÁöW[€ƒWƒOÀÉÎ.ð_C°“ @ÚÔ dPf(€íÎ(4R`O'Õ{Hžÿ~Л38ø˜ÿrHØ@æ¦öeS—÷@;HFsS[€&ØtñüŸôÂï]\ÙØÜÝÝYMíœYÁNV¢ ÌwË{€Ðèä´ü. bjü»4V€Ö{óš`KwS' "°™í!.®ö@'$;@S^  ê´ÿ±Ò ˜7ÀÁÊñO¸¿½Ùÿåljn¶s0µ÷Ù[,A¶@€ª¬«‹‡ 3ÀÔÞâ·¡©­3âoêf ²55ƒüEÝ +¡0…Tøw}ÎæN gVgíïÙ~‡´YÆÞB lg´wqFùÍOä4‡ôÝ“íïõ±»Û{ÿY‚ì-,—aáêÀ¦mrtÊKÿm¡ü‘Y]<ìììü\œ #èaþžíw-Oà_JŽßbH ¾Þ`€%¤  /Èùƒâílê¸8¹}½ÿ­ø_„ÂÁ°™»Ì€V {”?Ñ!b å0äü@CvÈøqØÿüóÉ2a`{[Ï?æ1›ž„¼¬Óß%ÿ£””{¼Y¸,œ\\.>¯/À÷£¨™‚þfñ/Oy{K0@à?d!]ú/a·¿'€þïõ`üo,0dnú?cþ–‡Ýò‹ãÿó°ÿåòÿoÆGùóÿËHÖÕÖö/=ý þô¦v [Ï¿- sëêÙe0dìÿ¯©.ð?‹« ´¹Úý_­¼‹)d$ì­lÿi$ÈYä´P¹˜¿ÿk6þ#Öþ½g¶ { Øôûf°p°³ÿd¹Ìm ·‡3d$ÿR!»ó¿eìÍÁ¿—Œ“‡`êädê‰Â™$N€7d-€ 1€Õìq@ªóX‚P~)/€Mâ·è?ˆÀ&ùñؤþ ~›ô$`“ùñ±Ødÿ ›ÜÄ `{óqØäÿ HvÅ?’]é‚dWþƒ ÙUþ HvÕ?$»ÚÉ®þA²küAìš7€Më‚pÑþƒ \tþ Ý?ÂEï‚pÑÿ @,Mÿ HSgsÈädîj÷œ›ó·2d g›?-ýmìòÇ’ÅìÄÁ Ñš™:ýQCÊ4s25·Bž.˹qý#ÿÏîý£€ð4ÿñ@¢›ƒm!c÷'îß;»?ìÏ#›Å? Ò °­í¿Hp@®$6àŸ  àÿ$åý­wt…ìõHí–\ t-AnÿŠñ[ výwˆ‰ÕŸˆ½Õï7øo÷÷*œä{O‡÷@ûY@d ASëAÈ©Ùü Bšó‡1/¤ ¶¿wðÒÊ?‡É¹lÙþ¤âIJ‡ìARÛ»Ú™ý¾5­þE ò °ÿ†ÄÿË‹ƒR¨Ã5$‡ä­¶ÿŸÃææø[ú¿G ¹âÙ€N7ù_¦¼É@à?Ê i¬ƒ­ë¿ ƒ|ŸasüSøoä tþëvú'6÷o!Øhaö§E\ ÿ—Ç_á~‹A݈ò@‚üëø8 úÂÌhúßñäùmtû×™ò@‚8CÉÊTílkêüþ_!Eÿ¡y~Ø\Þ;ÿ5l®º¸ƒÿå‰áúge 9ÿú>älvú7}È|¸ý B»ÿkS!A=þ!Y=ÿ!Çêõ‡3$’Ðé? þçb7wu‚œ«Ë_o/äÖÿ/þë«è4GY˜› Z×~½­– vgÙ™¦ÙÑMe`ñ^pjw½GGLb¨Êü¸æt-‘4Ôƒ¹¼%C%¾Hþä}ÔRÒš Þöàóø.Ncj§ e~¿"ÿH¢®™„EK|×çÉÑG'À¶ºS&×Ñ•]í3έ{¯œG]_éÒhðìŽún¯â«ÇÒï,QÚ‘oŠ~Ðä™eÍR"¸°"1bŸ{`ü¸ºžÆÎ™x!WˆcBñ=Žâ*ð6X猾›ñZ)×âtî"¢&2 $…½Â¢õ–ÜOV ˜ó..Œ\™Ëfg`…Zí#÷é¤84T’Ç&`·uZ¥öm«c Ðû†Šœ¹£iâÀXëp„>GÈdéî.+÷Yµ¹°×xw0ù&Ô‰ÉBÙ-QÅÓ{wcîJÿèJñè¤vÂÐkØÐreo¹IrEú)ÄÑWä×.—O¾uF u÷7ë‰c‡i]Íöþ2™SWtÄü¤4 LœüôF>𡏫î·ÈUmfPÈo» ‡ˆeµ—X/vŸ¹OòF Rù¼ÜÝIûp}ûR+k¬!–Ì’•”uÙS興hœIñ ÃÈaå~³ÇÙ•ÇÍV˜›ÓÌÕ)^¶ù¶šÏkÉÔëpŠƒä€!¬‰u=íüg@„ŒÇG}ºÖÁÒ›CžPYó"öÖœ›í3³æ¸û±î¨Q·£û\þf9òF!™áݞ͵‚Ñ£Ûh–³y%ˇ ;‡…Å–VÇ4y  rU2z:ï’˜™Út÷²gÍ]M`¿ôËÅÈñfçÄx×®/Ùl…¿äL1x:ª5îÇîSwÊ©Aa«£…º¤ØŠ`thUï)ÙÔ°o¦ºƒ·B<+™ùjv?™ru憽V†¿Äg˜ã“‡špk¡£ä¨¹¡Ð¾®®Þê>,3ºÑÐÈ(•*‚3®ây ú%q²Á$6 yD½·<Àp(_+XD¯K·Ë õ,Ù'WŠJÄâ?ª•œ4ƒ¯ò‡Ã”d¶É‚-Þ£Åü0^&C™ázѶ ¿~_br&Š5elBUOŸT1M‡`—vOúJ‘CqsN4+Sf]M…YPyß;\“KŽS]œ÷mκËùŒ1¾^ÿÒþÕY|VÇ÷©ßàoô‰s.l?š–».¨Tj;Œ™TTüÚLW¨AØ~‡«`õÝÌb3uô«soÀ°Ö÷D¨ é.X³C‚ºŽF@ýyîm &/ûù%pˆ‘t;=&ëïzPµ´bäËìß„m·?cµÅ_Fß|Ë5Á^¹žÝ Hõ¿ž[Г9„®¡Ó‹À•és´ì^—…åjwN•³«ÞÃk¡Ð˜Ð“xÒ*ö ²JƒÆ>wz¼écÁqÛ”yüÁíñއ,t'&w¡õ1<½—ùWv‘Ŧ-وي#sò›kV€jBõ>ß²ŠŠýA¯Ü%<¢£ëYÓ@ͬr"Lǯn«‡ƒl°0¬ˆà?ÆÞödìÖŒáN ®ÃíH Çi­/Ã_ê˜>ùÌ[âõ¤³ò©‰ 5»aÄ—Óû2 »ØøûbýÃ"G§[Ž2´Þ㼄u,…ÜÏO6<"‡ý´úyÇ ²÷ŸÁ#>Å„YÁnRUj@¯-Y¸šÕ¨ÙO› ˆª]eÏ^ýy߾Ȱ2ð‘Èt1aJ.&"UV ùòÂ5Ù¥ðyþPaÊX9f±§ý*‘ÕEžä½cÜÜs(#;l®ã©k•è^  Þ€6rW?ù`Ì:F¯¿€ªK£!—OÔ9;ìχþùç‡y~ĵ$ÝTGi¥¾ö¯ÑÞË'&µ¸ ƒî‰Ä>shr /^lM™ûoè: ¨Ã Òæ•Çóù£ò×£cú 0GC£¡ó‘„ùÖ¼«”V±¾Ýè0Ðà`oìÛ /s} åæÏ$^’ù»ŸÄ› ü%ÈW:îÖÅM¿=’wˆÍÄb÷D)Çñ’ _†õ»‚ÎN3g ´ ­$ëmáp¢´ŸdªÄ(± Œz^-Â;Œ¿œïÎïŠ/¾Ö†á÷Ÿ˜IðÊÛ[íP «ó¿‡I x$SŒª¼ºÏÓ}¡ÕK ¼‚£ž$0pت—5¶H—'›UР‡æ5dÑb<á¦ÈŒšòÔ‡2¡Snx¢‡}UTu2¬ŒS¦&AÕoç¯EiII '¼IyÖ+¢×èè•8zeTÌ©äÜ Å ‡z!öžŸvMÒÓòÓurA+{hù f“²p_¬;´W;Ç5/5^“ïC€®ð‡õh“wƒ»]]_Ø+QÚavÏÓrUß·®\Š\ø’6ÈÔÓoiŒ±³&tVEs¬2¼²xÀøDõsXaL¨Í_͈»}¨á¢_ºó9éq?©U–9‘rP,#+!àzËL2gb|ðqŽßgyIn"{uåì­PëTûþ sÎе*r½qÜ\ 1Áu¼ ¬–äL|*²oëøb4-S7IVáš@C¯ôàT/`xí=Cʽô1*¬5Ë}R`ï±j ¯Û•—k~¬¸Ù'äˆ>dG½yÿЉÓ6­S× ºüñ!v QÌbË;Q,¤4ÍCM ø_P„;úÔ§A& ù=WS½„s‚ðáø§IXF¯n5°&eå+µl<Î3¬­Ì²ß$X ±Ò ¢tož•e’°FN¤Ðä;8v–þÅÿP.j|àåÁ¼èm?fnä”±É ®l nh¹Ê\-wy“ µ,õ41HRštÜ 0â¿£Æõln’ +9¡ù{‹Xv5–SÓdoû|¯>ÑÜ1F cß—Þ»X8ÆÏ‚Vñ2olK/zøÈ#ç7öa¾§98äŒ ýaQF‚ ¾edæìE×9(¸3aª+Q_š&ÊMÈ„òSÈãº&¢@¦uy_‘ð&š¿X£ ß¾grÂû±†%ãëí=R¶ËËw_µÇãD—^¼ÏE uIüsƒÓ$K¬o½‡M\W^ ñB‰ÉŠ~Ñ´pu‡Æ<ñõ¼q²ÿ¬¢@Þpø1q™ö”+[aS^ûªþ²CÕº3¥ýuåÚâ.S=¢.ðõ̤s‰òŒNJCémjòÏîuÄR… }‹‘ þúã.Žî' *%|1åúA1ʾ ³¢Qõnt’³ŽKó¦Éé§úöªWÂV¶~Qg)q<úUŠ"š;FG(â¡ùþïyfÞ8¯|¸ZÆë?d»ÜlµÑ!YqݵÚþø”1{ŠéKÇm›4™¸#~WÕùNU~­…(c‚Í;ÖÎË“ÅÂiŒÐÍ’8¯}”ü›Oamjöâ6pnºë¦^3«d‹.ç5±—7QË‘YCÁ´¹š’_Ô< {^MÏ·ÛÂ1/â-ùé Š@4­OÍ¥ÔÓÌd‹Ùr÷%¡ò7heRø»ëÒ•‘ݵo2¹Sæ{™3×A…!ú&k-ŒÀy#}¦(Ç_ÊqùŒMY~­Ä]^˭«žÚ»R“âÁ)ú_‚‰s¤ZGÖì\³‚Çy|UˆdXµÌ °fZüÒ±Þq…ë|®?%ÊE¨'æÖ8 Œ!Åϯl8<ß@GG++¤DëvÓvâµøèÐßN¾QBß ç³Pýöew8ÐQ7"Ø4î’¨j¹‚ [Й€ÑŒ‘RYx,Õó`nÓZ@Eþ-|j?OÔû™ –· áwÛJdf?𺙫¬Tíéøñ†K+*)^Ëü¦"}âÀ„lg #úijаÝ#)ž.¿æ»£Ì7ó×ú.žL©Nœèî0n—0ó^ã¦Nˆîªx¾Þ¸ÐCx‚þìç‡ûn¹®W@~Ìw±¦ãƯˆÉß![¤0Ù–iQz“x«ß¹9é¨.áF‚޵DHÞËùXúþÓš[šG[^µÊÔIÿ´6§Ø¥•Ô)®z@.•Н¾<¢¢áÇ»¾PæŽé‰Ô3 µQrD5ð®ôNB~,Úú‘I¨Ë¸jh¼Zºíh̵–7ã[v­Wcd4ƒ’‹;¹*¹¨µbðì‰)D/'ÏJçõ‰zõ5h‹«wÒ‰¦*;¢¦ØN_¹çfĉî,:JSº÷ܪxpë`[3y€x½Ò–LMæ"j ˜ç²%½8~Òçô“vvþéKB2UJ‡½F™o|*4zªkBšTWƒˆEç·#¤õE;{Õ]mý¥¶{èWµÄwi[€Á›âË@M^tü»ðÝs`þiw'´?’¤¾–f*Â"B/¾Vž–iêxèÇМ² K¼ŒV9…m?žÏõ ß1¹$räq2HÌ¢{¯ßžm™š«Î++öRcT)IÑœÓØ±`$ß³U9!˜1ñ )Á…qow}×WKH¾FÈUð®Óî›,ÛþÚõ‹_u®–¿6?£\ÐÉ#«À}nÛÂq´.½Hc@Ž>JŸ®eÊnÌ“À˜"tú¼ÙVÂKûf2QJ`ÖÎ ÞçŸS-öO¹;ÁK§çFáUú2+9ãžÞú:¿*µcÅÍÕDÝëú÷úAÒ# ”·Í‰Ô¸b–M|d)‹ék¾X-ñz#ÛàýÐ=®ÇLºM&­  ß•_ŽÇ­€lGü,Âp ×eô,5´…ô E@Å‹ˆ4>Hàc›+È|×yl[ÁßÅÜÀ§±žZjÐpŠ ><ÿôê;å ÔCízG¿Ðk.‰8/Ù }îk]ÄyM’7é EÙ ~/¸4™Ef†Xªbß.ú„ðr4ÜCÖZd*x¾ˆQfëîøø ÍTÊóžFÁ$êÁнµßW¼ûåìËIä­.ÁàþZáÐQo=Äå©Í£•áÈgæCæwt/|ÀùÐÅGd&á“öº@Iï‡*ïÞ&Œ‰ ùÄ‹v˜úÎú¸b²Vh¼ ~«Hyhê+9椗QeO_¹ÃÂL‚a1óøeøÕŸÉé/|Н(ø%‡Û£m¡‡X—QaÀWdø 3®¡n(ŠMšbcìÂ¥¤_/•³Á20³g‰hÂz¡¦@E4c¿õ&&d ôŽua;¹·(O+vÑ¢zJ2ŽƒÂ“·ÀñrùFTMg¬!Iy­¦È™n—Ø Àý†oOÞÖ­ÒSí×£Eä´!ìG¬V¯)÷m¡©÷PæÉUz¨šüÇØÞYqè3Yúå Ü6xÎ-çtÔNL.éO!»| kv´Jº£ê?ж”ø*ꬮý›‚ç~ÆÅ5R²†v}}±„bÊd<1n¢`T(_ä#©º²~m—‘ ‹ZJÑ@W׉ËÕâÛK,lè8Ý.ƒ; Ë%:²]1NsnÌ1NQöþ& “Ðׄ;E3Ê?µ"¹å"¼¨KuT§ë¼„ÌïÛƒ°ëg4¡"ñ4åw=ø ÛÖeó255ÊåØJ3Íî \u»¿ÄjØñ“V—%jÊmɶHÐùZ­JùGÉhlØýöfc9K¢ýx×S ³‚žyIö£X•ܽВ £aÀ'zKÔŸ4rÄû (¯&»™´)ZèdR„ò¤u% »B1ÐÆnÒØg3:L o*5š`œzø­Žð§„rµ¦Î«2T¦uä4ýËœLÞœ=—š¯pâFXþj·>,¯Pü^®ÍYÃÎ7Hš !äÒcWF‚Œ«:›ŸeV_Ú¬ šö…» iÑùÜ5v¶Ÿ» óKcªñ…«#àCìA–\ß<ëò²Oô—£ÑÂ~åýVˆ6vl?#6ôö‚Û¯;P²ŒÍ2tâLö¾×JHЉÖZâÂÖÖ&ÏK“,NÂsH9UŽÎ¨`q·‘°·Àl=kW™2‘ô%­±ìV3Yð>ò¤ £i_¯ªm5H£Æ‹Yÿ=E+f`é’Z e .j¡=—ÎóZj2þ¯\, lÉ‚Y-ªã 9iFjgù¸PöKlÉu _s ΰúR5 \:´í»­ù,{ϤKyÂ4­Wì—Qzç»à»ù Êqdøä]\¹•;M€ÇЍá <ë(jóHt¬Š+Ï„]žÄƒhy ]šÆK3î³zÃpIã–òj9]qÉ{ÝÆm#6>­4çšö;ó2©[Gš¶÷þ“þn5Vœ™™v-KÒ±Ùcâ¦Òsl_nÜÙ Ær(½§2=,Ò×]+ÞÅݤød—­Ï- Í.,8»p9UK«àN¹ŠYžfÄfôCÑ[Út>ú1Cã0ùƒH‰ïYÛ % ´#oÉ^ˆÜr[bâu;}FvQøi‹ucõWž‘¡KçŒBÐÁÐ'f’Ϻ‡Œz—¦£¼ÊŠ|ËÛ¶L31ª¤‹>1×*ZäÕcªšsVV*mSdCkT·&ùð”-(µ¤*½‚SÍ7bübA4¿Æq¶ÙH>»Ml}òÓËMÙ´áÍ$¬0 o‘4¸vï´¥Æ, ©`]œcûĨd¡÷€Ú¡/ŠÍb=·^ ª=>9ªy{Ös–1VnŠKâô—(xõ:ÝFú•ÿˆDÝk|³öF#¤…^Ž‚^$} ðFÿDÞo'Ò?šÉïëÂMç \?rØï$#÷y¾¼ÛÅ4Õ`¯ÿ2v}abx™”ÍC±~DVw&ûVpñ0c-6 Do—ÉFÙðåîó2ë)Þ©)ÏyÅU²4,‚– æ(>·¢f'q(ίóÏé¹mM–oq²¿ns}¹RFRJFкu]৺âÜ„¸pIS‚C:~Œ´Áátï·!Èy„_qʲ˜,¦Lbãæ U”ë¦kÕ=š¦Ûö¹ß5Ý®ž-@NÖ¤@Më*xÅ<Ž£Ó±·á†ÝA‡62QɉiÛÚó.Ø«J7µŠ®×5c°º•¿ärë:)´àˆÁ§vð|nDRRh4aæ¬så{ñ„_óã£\Q»^#jóB]tO ðEó¢<ùŠñ­'©§‡gOCc—žÑÓö{7Œ9o—¡úm‹Ø÷½Ê)‚z‘Nà IG&`Éý|VÃ2‹3“¬¥FËD¨Òm>—"Ñ”ù\­k[2'g¡û”ºQõ>r‘•ñ†{ÊF“âv?{œÕb)îLN¬}j¼Ö.ÆÔ¯Æ»·=c„¡ïu'ÍÑV(Ó'õGn¾àˆsÆ›±»ã¹/æ@Gã™8¹ã3†ÙŒi4U~ÌF‹N¼•°Ü^Ö_BÓº×âuýc1¢Ë³¸/R<üc:x þ©ŠNÛ»57 z—¨ê‡Ždh„Ä) ‘Vi„ªŒÒ*N…ñ²ßÉ[œÄ{/¡T0pÌ¡›™Úm§ù’“I6Îî³Âå¨,û¾(, 5ꌨ q¹‡hÃåÇÉ`LÉ0}/9ÞˆT¡(TU+õÕ Ëê8`}9"±/Êâ.ªÅLymæý Ai7Þña ­ørüIÆøÜò¸ð\3~2Ý_és&°ð“ Oí1BÓ~…èOÆ‘¹ÅÄ×:¬ã!zÙªö!RÉ·á˱†ãx÷VåG†ûšegàI‘ßžyÏáÕqT×¢Ÿ]õ[>)ØAŸ —~ 6`\ú)ÌcõÕ†!ì–j\Æ0ørw)ºØÏfyC ¹ý"ÆCÅ#NöóÙ48Ãnòü.ø èÝO!¥0—Ú‡½Ÿuê‡mŸ8†Ñ+©ãˆ‰>Ó†%™}ØÄXðYÊŒ±vo®ùÌîJy ¢aC¦)^®oèuõEŸË¦FÊaµu&·5 !Æ›‰š|›ÜÈ_ݕӱ ¶1ç_±‹%.û‚ØÅçÌ4“B¿À3wF©ÜE¼ôšòC` ®«‚9SÀwº|*YïWy{õ[Їè1ó‡‰wõ™ŠýGévDÐÝß>ù’ÜJÅHþÔ›&ŠSH’)´Àe Ôº5”H:¥tßì};ŸN-Mÿö»¾{‘vþ6-9jUf.:JäRÛ•kntw×Ù° Ìš Œl¢%¨ë¨ãþV{ÓÝ/Yè*Þ{ˆ^êOfML+0 ˜eù·2'|¸/»=û¯N+–RW©¶*‘–Ï<ºôЖ3¥ ÷r™|4_°‡½-¬™î­Úk9aµA›ð±*A§§ñM¯f…õ~7Öá>uiý6j÷¦’ï[&ãªÜÀÊFËêØìèÞŸ7ܯÖÞü,õ‚þª25Z]n§v^Ç^£ÆîšƒÃÔ2áµ½´G'Y÷IͧmGC$êÎæpÉ­Ÿu•„˜Œ´h’Ø©P{£«lúñ+’+ ·èFìiNߦûæˆí´'©îª.‘L#Yd®]ŸØLéÄyqW‡¡ý£ªºý _õ¼ «¤IAÜÅB1ý¦¿øeåxh;!\tà|ÿ~¼ú6ýH©U½­Ty'ÏSj³Ï«™… „dÞÓ-*ùx÷hˆ¿žSœµ=ØèËGþ=QDJW²µ6ѧ8Å¡ËÎÖ8&<}­.l‹Ï³7ßYe7æ¬tFž—Ë6òv«äwÀd £ˆ²ì 'â*Û꯭ÑjßÙgôÉÛ@Ó&4"ú¡ T×¶b’Sx»hIÔ¢ÿ`^ 3‡úBõÐøy03Å*†7ŽåH•Š,ÜNɤM×gA½Öþ…uX’át{ÿµ{’¯ zxãšÑ‚>Ô+÷ž™7IÕ®z ÓÊͦcyš寍–Ø ` ÔÉ:ÀššƒÅ%y>–¹ö°¾^‰ã(Ä^ËÝ&kG˜$H-B«ÜÈÏÓæ©¢ó/Ô™:sù•LàË®¿ Í,Z‹$z/»9‰ýòvþ¦s2ÄsàeÙ’C(œ.o40[Og{ÿܼl ™eÏÝ…ž &_Azµýþ5zÁ¬ƒœ?žÑNàjÖ¦»±­ýé<ÍÞœ¶öFÛ–/,5 9ú¼c[²K0k~îÑð@ƒI Ô»#RºcÓåH ¡,Æ‚æ%´”ÕuË—jfü•¹îGÄ à o•vö«Ìç¯ï>äVÉpõ(06 SÓÒþ}Ga^ósî.Ú— (²üÓw˜}&Ÿ€×¦vyÁAd¡ú‡“KßÛÉȧYëëBÝG0bÜÍ'XF‰§ 0¼¢˜Á‡‡¢¨ë¬ä¨tëËi¤Ç5þimýqÖ…wÏnˆ°¦]Êû:‰a°ÛálIHïÚTK¤¤œNkUd²Á$ C6NNý­˜ÕD7‚èè ü¯ IÔÈÜ‚„8n/±~±œÌx®>ZøLœSåÃuìÒ/S"Z5Œ`gïÎ<’Y§§aDœìÓ·ãóÉ4©| Óim~ÏÏB‹Úã>Ò\¥nNÙ,Á^?_j r!æmÐt½‡âGaÀm…‘ù7mŠaÖ:ÓD?¯«}?>‰ÿ’¥V½b¼OÞë]3’€?t$òæ"tçˆ yº?7Uëû¦-%ƒŸ²EþfàýÛ7Ï”Z²¤{k ¨¸…¯ŠTåô4xu0Ô"ŸKœá˜ÄÛá;ÕÙ>ªëeJ»o4Ä_žÆð•¡˜w•Íí^­ÞÁ§’_úrù €*Š„:g˜È)ÏÌk‹¿Än+ç~Þz•èÜ̼ÀjDoñºãúzd‡vm, Ò%ÉÊx”±ŸÓh—Í”P‡ÌYú2ó¡.%v$¼%…ÿ­ ¡˜Tœ¯9Šhju÷ 1GÕÕ.û&¾Fto“V™¬,GT¥Ã–kÏQ¡³D˜¬Q¢ã† Úô+¡piã爐IGaÐ0°-ؘq è?ãVq^_X•nHºÁ4™G¥Þñ3}æöçÁ,eÐ\‚š¹ÐŽ«uÆÞ¦¯wÕ{u¤)”hèiiñ£æ€&4Ý®ž\´™Å;Ͷ;îŸõ“ýÛ©vˆ<šsšç ­UJµH>åá´q)©ÏäN!5r-•1–ŒùÓÔE Iß’d(LЖUYR§(Ö8ÎúøŽ)Pgšƒÿ”O%Š¿GæS¦¾øFMwÙ“-·ÆCH ŠÓ»7<` R»þÕ.V#2Ü·»È߀–u_˜ªxfºÚcó ꮟïÒ©X¿ ²|)¥ïë‰UhÎvj¯]%Ó§/ˆ¢Ë!Œ^“r6!|Có¸,F…¯gZWeÃ.g‘'hÂЋ[:šýšçrÁT.´rÏ?½Ÿ“Ûk¼-³.8ô3„þ¸¿;ðB Of_˜Tæ‰ÕK;g¹3Ì«Ùï>Ïdž¦ÍݯԱZ-îéd›/†Î.ƘNiH½tŸ¥H©ä ¬«weÈaV… Æ Ϫ!V… 2sð ¦u^5µg*àOè+·5‡„øÏ ¥“þ{¾ÑöºÕ¾ »á’Ç}ߤ×!`å>•ªËH6EÐ6ë>Õÿ¢¦Ûæ)‹Ë‰Ž}×úa½GT^c!Û¶‹ÒK2…"ÚêöùÓÁ!Á‘i£§5å˜pêæTž›½Ï´øÄŽä_…áÒ»óz„&ÜiCidÒ]`ÙI~7ëZ‚T|î‹Ê‘žkÃu༧u)w«ØËúfxb€Ù¢‰)E/ÆŒ™?zOp˜b¦)üjÃ#áâ V6Ñ—@«[–gƘÞe;ò)óÂ’Ë:µÕ ·_lÕ¢luÝ¢½ý,45':]awU¦¢¨0)¨ž.ã‹Í‰â™âvXÜ6gn ÕÄ´· x‘¾¨OHJÂláê¼ÉIA@šöW#T|ñýŽb"þÖ[ß«­ïÐÐB^Á Êrjkµ¤v6ú±È0»K]Á[aaCÇȆ÷ {•õ=Î/Ï úŸÇ¹ž7Þ0ÊæÍtŠÈ` qu£\ÑÖä¡§êzÈ…¿˜}ÛâÞ°n9† €ÿ\vša·üαÅF®{ªAßy* ”¸“ÉñZXG Ûæ³½¸ª£— œ8/ šD«Xí+’?ñ‚¯Ÿ`É zñ{'©Òzº„×høW<±CY´Úi*I§èo.Õµ« =6/û= ›’•fp¾£>[ÜŽã=_‡•ÊË “¾üæ=C[±~ë `žrü&UÜÂèî¢èö£îÍN¼ÊðWVQë-<‹K°1=ò:ïbư½ã˜J!×E:½ýÈiôÝã¶µÑÃdU…ÃæT¢¶Þ¥X^mÅNžêg ÆéM…ýi Ô5†tsªòçÊ+[oz‘ wéC°^iß¹â{ø´SæÉmïïÈÉJ剜Dò?ÕyºDÜ\"ëåÚ}¢øÅ˜/Ž÷šÚBŽgÆÐÙ?{}xiŒWW–Š?sâÿ­ÍÐßzÛº-1ÊÉUr5C‘G«™ˆÿÌÑs¢ýS·E,%V(UÏÔþ÷ŸŽáœþÆüœåZ&¯‡¬ýn¾Â Éf§Z"}ÜÑ“ÂszVŽ’ò¿žSßõ¾—BvXZömœ:¼-W7ðöK}M'ÿMà;O=FCUçÇàúµ¬©`a‰´× “ëãÖà̤d4{¶[êºWbŸ©2‹æ§+jmB¢ …(öÎÄþ,Ç"+Š|¥ˆŽ±¯ïbK¦br¯©){À%œáiߪ Æe¨‹£‡bqc³¨Êïà¯á?{ÛàõI=æ¿‘Çx­F¹3vp7ºEM@|›örhÖµ¿ýÄÚz$%Ä'ìtšçÆlPüZý‘%t»Hú¼{ºËýU¡‚˜É…™HÔ@ëÁþÇËxI^ÙMùLK: %hñG‰ïTºmÝK‹ZÍÖëuU;"& ô“ŠàºŸ˜jM¹\ eM©ÌäÅ-“Œ‡ŒÔÌ>6l“[´ªrË kÞåN£.‘"±Â¯¿ð62=â¡{’Ð=ܼ±¿+ŠœÆÙý’M´k›ð¸/8»ëÍH„ÍÓø^`RaC1ghTäÑË}œÐ6üSNX§ß[ªú(&ôVwiú`͵ʹ×áÍÃŒio ^þÒA4MÚh'ÎÑ4±_ã>Þ6¢ßùø{ÖdÍcíIõ8$—n%³H‘oAû¼öÇX}ÒÎtOŒ·^{›²‡ShH®)&Fê|ñ}Ü9ò’PÅ1X»ó&ç5Ïa×$·>_%Ä„B÷x ¡ ^%¹'×(‘â3êsŽÂ Àë#¥ë¸9¡àê(?|¯Èn·še2 Í}2€§ñWá‘?6bB>G`I½·‡§ÖÇÜtkšì‰œÉýý™ù‚ÚaKtª¾ögMß/ÖJ¯¯ßC•\Ø41[†Án •òvÜw·¯,Tå õzØ™CöÉ|çÞ4ß Ð(–œ-´<1~]î×¹+¯é¤L¯[ÉÊK».;ÆÌûÖoÛ¤ºÍ¯GØáð’}K©zæ¶Ü}9G‰ë!Éß`R‡#ö}Ǫ̀’)%Žpí˯aŠVè NmJ(âE4ÔäV¾…튺$uRŸfüú-Bgƒ­&òn.!Lq«Œ2„Ýgzß@UW‚Ç^ ¹A¶Ý{#´Ö`yžAv‘ùUG~Ä#¢’䯗- nŒ@çÝÂÀ÷|7v”JÚÈ™o /oùl ‘å4HWUV]Á¦xè†Sš:Sü¢"÷ÛŰD –Gspdo” Ù÷CWôRÞUn Ò$¨t/~Ζ«øô8Q¤\Bs©L˜­Œ(ï”ç[„õ\#øþs×ñ0àzq<æmó¨CxúŽó«OìA8oÓOH-^ho²ÍEüb¥¢VÏÒר©M£B#s‹\îýHÁ8ˆs¡R­ɱ°ªÓ‚j‘zÉVÓÑp8♄¡ï¯ÍÄeÉ ªBì©1©q„n¸ðæõ[£«HÏ‘mø«5TÖ(ÈŸ¸¿¾‹Ú@Páÿú4HvŸÏØä6´Îñ½gnóQ±â˜bÑ-õ O†ZIËMjNŒ¥¾‰#Ü”u—\Qtßdä ”u“Ïä”O¤:9Gñ)ƒ~3GÛ±²ô}¥Àï&‚ËÔ°-zWÜÈHÛ4Ó¹`æ(Z‡©< øÙ,F<ÈRBÇ‹$°M©G‡¦÷ö9ÊY=’Î$íÈoôK% Áì&>ZÕ¦G±JKÃþVºY¤phBt¬}"½­üX¶Ó7ÁPT˜ôÉÜï°98þɨ×õj7=ßÛËJ“g&'ÅU뫦, Âz±:‚›áð}Cÿûø1 ×ë¢×™»#DJo(®ÔÍ;è bV¯O®’i5å ¬ÎÖÌ x"’|¾¸ºÝ¨Fp< Î$–Óål5ø½búS`!6écÏG÷Xòå6ž ûX3§ Izðx˜yÄ{Çx6Ì|¹æ>»–|ɾôßÞ¿xK¸<åþêaœÂzÞ³YÏ#:¼¹.\¸²g×v|ÀëYöçÎä‘k%ho-”¿ßž3þ䲩$êJ~YN©ÏL°™{\ÀVcTØ÷àù³.¤å`kqgäNºjBy×÷ìywFV¢içâÀ'øpa$RÚnÛ#æ‡ ÿŸp'j<Í ŒÛgéó#€F—ï˜bY9ÔM!?Uµ¬#ûÃKƒ8Óà¬3 a¢“d æŽu ˆÊ_¯NCºL™Ë]@*±‘ǹì“A{×eõ°³Â[„:ÿÅ—¬ôÙÅC乑Â@ÇC=Œ{|Þ„â(VÝCVíhDºµÎø\Žtã4I˜Êg|ÉÍ^óä uf± ¤húoùkq¸Ö}p0a)¯kQ^—a,ĆcÿŒèËút·üÁ¾ëB~á°Æ:‡OË„«XðÓ¿" $Å¿Œãd½– ^"gÀ…ØP}ž•yB˜³7ôLÿ…{§bþµš`1µ]K¾Ù@ÊéÝO¼´vÔE”é€Â çᲞsÏõí÷šr;AÁJ‚h˜—D/Pnß;/ꀩRcR’Ä4ÓˆmÌÝÙ:(' ÛË›s:H_A¼wÔÖÅ n?Õø~hñ@ϵ!Ä®ÔÂÓhÅ F0Ö² eúO®Ã)bÙ›¯æöždΑ–6V¾rn°rœìh®-n[úµÉ˜ÝÚ̸ï'ºÄU¨3²¼£\®/Þxs¢SÖ‚3ðñÛ¶”¯'l˜"©ºQ2'L,óêÿžbÒ™Ú0Yh?63–¬ê¡»;ÿ ˜äëí{­yFéÂUeü»ã +–&nŠX±¢W=ƒXA ™,º½Á¸ƒFªU×÷å.}U£ÑbMWÉ Šh Sö¦1"2&¼ëÒŸ¶îûh•(ãE[úã•sÙÛèë^ÈGÇæýP2Õö_Þ|E™óÓà$„¢‹ˆ¦ Õxm¥„Ħî@{›~ÿez¿´;7²ò»ì 6Êkº‘¾'ï] ‡7Rd*«éI­ƒö©/R¹i³Ùì—’–)Œ¥4ãA«c»ûð4µGWøÃMðj’¾Ì]g »Þ…Ÿîi†aX…’WŠh”ÈŽRzÚjhj4’‘ W„ž¡iŸ.m¡Š Z }°BO%†Læ³ ¥wËÎ#¸ €˜ì»-.a«Iä…¬é_X“¥ÌVî ZÂagáˆbÕÒ’VqÞúÉl 2ÛÉzôk`–^ß>uù¾I÷(Fë·_ù¤ð¼ ½f\Ãò[*@ßt a±žŠ¦E˜eJé×k±Sl”ÑÉã ‹f³œ›ù€¥°Ù<×t¨!ÙUMiîƒ6–5ëoi! C[ÃêE²‰è¹ç×Ç7jÖóÁ‘th“ß[åt‘H”ß[ëYîEã5!'p2iÄ»fG¤㶨æs먗ôë_ÏHWç==¸öm Ÿ‹¹™Å^]!+ÖÁŒÝåWèå•’iLõîâÎ ã|‘8o»ýEQUh>£iŸW«LÌNÊÄÐp<Îv[zá¦Üty^®.p˜ £Æí¶ûm AwpUŒN€èºQÐóúC¶ýÏ-g6ß”-t„¤™€ðŽê›Ö'–„Þ!L·d²žiXl 0ç [¯Ù§£á'_Cñ¬=Æ—ñÏ¥ÞÀ;Þ5$‹K4—òL :nèÀԽʕ³­„œ'kè<¿Xl`½&´F·žk§šÀ8`¬h)À½d4:PL‹œ‚鶳ů®·×ë€*B²¦£ßÿšÎ=*æT¶Žþ—ȦbŽwúgǃw8 ­Á«—0 ?û–·‚ í½IÅd|®é…—+ÚN[¾6‡"çÌ—µ#–Æt±W³Ÿ úZgÆ–?]YDØmþ ¯ ØB® Ý@fî2¨Üö…*ì ¦qkKͳ/;à\‹·@Z ‰û½©äR\(@Á¬ûèÂáHÀ—ó ¾ˆsÞo¬õ{€Ü¢z•T”<‰°ZqZÕO\h6ÍMò)MacB$ã\ö^ŠØISa˜EœÆ˜Šó«ÕçSËÅt•2ŒÇ2fjŸm J)1sÒ©´‘ÔëŸ»Ž„#}{]kãWÁ'ž¢…X9ÊýÀ|@É'[AAŠéËH߬ýҙ¦@!S8Ï"×€pÁ„}äGl³›rƒ× ³_lDÛÏÛÀÒ…Y¯ø>D䪡””ªCyø†³|YBªA¹wÕîã«NÐëT/”\i…@§ü3J6²ˆ•È&qlˆǀŒu ÆewæyCTlu®\RþÆÏgOD׌Yšz«x¼¾¨„˺ª¨µlmG¤+ˆ"ÉzýìAúfÛl%A'á#™­U)±­×.ór0¥°lçZ=L¾D†m‹_éøJÁÈüÇ×?t±|—4Ûf]b³)Y€DD~~³ö1²šÐEÕ¼BAáS2ih«ÝrÐ8Ö ¶ƒãRi léígu8Ó-:¶7ˆ5¡¹GTÑå7Ãèþ¸];þV£l ­¯®š5TPu¾EެФ¶ ÖÖRiÖM ý-A’üõ:J©½ˆC5Ëç_©tf ¨&Û%óME—=ºý¦ÝfêÏ%ÃV¤úM}i)TZ‹ù=nI°É2;àxU‡Îñøº·_Êgè_®#¹f`©õ-z*Í+fø¸vÌkmãm Ì³7Z¹-3_ȽY}¦‚ xžü™u±Ò=Gm¿á÷$\)õw0x2/äÆ^ÝyÁËš™š-–;Mu¡o_ [ †*ã+yš4©‰/üˆ±â—ªÃئ¨E³¡]¯OJ:¶™kywçrº9±—¦OFfPÙ§)ÃöÂO* g©32Uš6 HL”5èáΑŒ­^ µ+¾dwŒŠ/µ2w°ðkk¥m,4KÈ C‹/!}hVræXv†f…®+~t¶#U&å`©““uÛéGÊ$ ÜáøU­ÎWø%6šLt3;bÆKŠ' k‡ÙN/îJÕn#Þ­ì3Mȹq~ áÃÑIk^1"3ߣ°ˆæK¢ôò9}P-ˆÅ;{;¶Ë‚:×±Yðxé¯yÓ(¡æ‡ZÑÅjòpýµŸÏÌNd׈ñ½? m’%"”Y^ÀWÑoRur$¶Pté&—¹Yë}I>¹šµ, iê̹U6æü‡î$ê)j=þ…ïDG}r‚…¥s¤æe1V…»ú¿ª#kä‚q4h®Úˆ÷ÝŸu¾¹ô]Úa ºú%>™ç)Ñ<%Í®Ûáo`õ¸U9Í©§%u±Lb(?î,UÁ~ˆy×wp¸ß ©ÇåZ³×ÊyÑôQÉ÷h˜•ä¢ô°µú¤XÔ¸µ©ÌTñhãYÿ~m±X|b?øò•?Ð^Ò›pþ{{ïÏ‚í þ»-ooö§çSDÉ(ëPë¦0r­)p7ó*ìnå/½ ö·S/‰?ÏKÊÑû=§T±Q“NQ„5H?±¼ô«‚KüÒ-ý°«}FàÂ~R¯’RVoR;¨iíÙ„Eħ/%¶„øÂÀ]£}‚ËoÎ$É(chj/uÂ'uy>Ø‹ÑD6΢Áêc³ râTмï›d܃Ðy§À· ¼n6®CKSÞ¥Üþ½Õ´<·fõUÌ/éÜ”ÖÑ™ÒÇÇÓŒl –È2b7O*†ò´º9öî¾Ð~ðÿÜÛÄ_•Ž¡ÍÓÑûVñÿ H·íQXÿ ‘» 3_ìZÈŽX¸`Ke'yÍå§ûm:®É̈¸<×å|Ÿ›;'±ãMd»Ñžwž9Þµ]œú“Ÿ’üb±™µ‹Sûµ´4ƒˆYδœ},èçÚ.²ky†LL”ÅUê¼wVÆ;ùc³~úB[Ôü ölSz :¶ý [im©TQ€g5~“…Ö}Ù/ZX¨Ö&R›·U¾o­m5ÆX…Ç¬ÄÆ(p šJÑ`fÚÄ·ÞKl¹1°¼‹}BÿQ´òéüRlÈã¬ïljúÃSW7ëkøÒáÂOºûY+‡/¥u9Iå/¯ÿð^‡Ÿê…À'}zÏáÙ@g1"KˆßPLú‘§)¼³Yp½’ÌCPÅ®·Ê@ý ÊMÇ(œÁ?h€t<‡U-íÄH9¦‘ #Òè! ½7t&NR\TÁñµḛ̈¯¬S,ãlN…"mŠÝ tŽÍQsT¿l»µí bÕhseàɪ’ (>[2N*xÕ\ºòq ä÷s1œâñ 7’ÑvN·'øäD¼¹b‚ߌ›YA(Dµ}Õa0é%²*}ÓoÐ¥'ß]‹ÿPûÃ]³XT©)«ž1âÓ;à+I²&Uï{ïPëP²d¾ÛT„ù5ˆs±A ]«jJì_²U0ð‚3 Sµ÷B›¾ÆÑû]½8%ÛM^WËìŒEêw¯ÿ¦IU÷B \³8µÊ  BvžÙÿp‹E˜”>¾ÿ–jÏÿ'8¸­™û!Æ·ÝØÿߢW÷ REÿUšýMNUæ(,¾“!y¿ sx·4V+â­å0t-ñxGáê%©`Ã((im(+·½üUH‰Dk‡Ãr§þï¨á›}nGžã“}@z#•1‚žUÂTÿ‚Ò…è c³h½´¸|TTTê³=ÃS*À­›t¼â qsX·ê‹Ú‘ ¨=Чn±·<9„(Ê3ÂPÑÕ³ò–Ø¥ÉJÐq…æ:;‡²uhß?“‰/{‘GBaK) ¯F¨M=‹#² ¨Avð‚dÎÅ’Œå…5ñý³¢l»TÇ ôC‚lrïhÓ­èF`ª‹î^qw,‰!ÖyÐ#“éF,÷xzíeîºr@\®ë‡¬‰{?ab±¤4Øß(c˃ߤø%³”¶L¥S¶ÆŠ§åºNßæ ŠÍÞ¹./MzrDJWM8ü‚{p“D"$"RˆDçn†«½Ôï øÒ¼M?1¦Ä^o›@»îyH_µTÒèßµ’”Ž'sŸ«Ÿ¾øR6¿ßûš¢é@‚k ’‡{Oo–¡ûì0ûæ¾c ?‘¥rm­î2~«*'kZ;ñÅE¨‰wÚ²˜CÞÖq–€VÃdˆÝ~}cî$\XiÈg  g—x¯QoûˆýÿÒdu>çY|ò4ÉfÎ}i®S'4j\šrôÃXâ*wýÆÛÑüò<_kKƒTZÈO݈Žé¯¬Ý L>çÅ%\{/lÑÔ~ù?¥B/ƒ®¿E¨>!ÜŠ;¹4Mk½ÌÒ&¹’ö„…ÈïŸ)ÚÞ¨Œ×æIôJ)j1µÂPþ»–I“Óm šV2ˆ@†û™|ž‘Ä®Þ@¹{´pÌx¸¢Ä - Ö²ÏA…mû2'06þ äÖ5“[àä)tKEßþÂT¯ Z'®ñG†Óu“­Éý¾2RSKžþJY1$H‹sŠ-ˆ7Ï £aâ4}:–±ŽŠ\ËFÊൄýÛjw¿u×ú6 øFùÚôç–'խϳW3ïÅiŸ„uù\h%†ªÿCO¦â& ÷Ê tàìKp™+ø%Š º‘ŸÑ±w]=ÕBß#štÒú;YŒÔ…ò¢ì_À¥sý6âî­Vùn¦Ïï•`U(Ù‹N]£v>VÆŽVÔ@±8—yIVõbÝ›œ—Ï6ÇùJ‹ µ9Ó\“–Lù"ê£n xÌn ü*ù'RZä aMÈïÈF1¡ _¡\·|w‚<»P½]vÃâŠÓ“À¤ý_i¬‡Èavžâ¿e’øÔî$@³ÄCß¹s;šŽfZÐ¥<œY‰nÜ,ÿ'‘œ‘ {C6XJ ðÓÖÏ'ÒCÜß¼¹]Šøš ùÜk)åj>ÃÙ¬¾†z_ˆPÉgÂ-*'Äè¹¾œñ첎Bý›¿[-ÀÏñ@šB°`,XãOñ€ PÛŽ;³Óf’Èn¬qMñ´*ÿg~¬•t·òœ²+aŸ¼²40ÝT]›%<0SOÜ•©8¤_DJ|R‹®ÎŸž.#Å+Qž_é¶"‹Hê)ˆw'êtî>öµK°…kÌ`->çÐU´+mJínAŸJK°1ñhu_£ÃG{~d.IðBAátJÆ%µ¼ {¹—õºÎq/qÑum$Í}9È^®—¶t*”δ¼Ç¶Ä÷úà»\ƒZt,žÑñ¼T[®·¾XØ_7ˆV‘r’Æù欰ݺK5T¹a¶ 楻¡!]é!d!&™ÛÛg‰~sËφœ:©d;Z¤õë»RKè¿ÝÀ Ï¨ˆÓh:ièi#õkÉù1ŠE/t]WÓµÈ2iݵÍ™"tˆ#øö?Žš¾Ä¶*"Ýñ׬3 ãd°T†¶¡yöÒΫ#¿š2ùûJ…ú§zV¾gž¶Ûý$‰ˆ¨ÂzàRk.‘$ó2n¥BHdܸ†d;0*GKŠ„'^Å|ºçχaCP~~Y§¯©D$ñeÁ&e6°ç¥©¨¶[^ô®³ÆÕ{KMc?áýÃõü[º i¦ð_ž†ms Ÿçóêuu0Ù²³¤1 Ê:¡GWTŸ5 °S¨65Q>Ì>£œp/®þÐk¨'&e0‡KÍ"jü^iJ eÜSiíCʺŽàPæÜCaSçëæ^5 ‹‡ýïJ1•Vû±íÉ'6^ÔÔOBÙùïÆRA¼õWÐÍÄ0-ãà ®œAÐQûÜíå>˜ã˜(…ZR™º1ÏÊaò? IüêÑ=‚ÎRë‚W³—ܼOš^:Õóy=>a±Á‘Öfÿ xA¨0·)üh0Kû‹¥÷úzu¤$¡ìž£Eïñ?ˆFi᱉K`w³’4ôŠTïµ>†™T×ısb€öié;0¼[‰:èçÇÔNݺXó®;—ÈyÀus“íVL¤ö±‡òi÷pòñ¡¹Ú¸?[ŸpŽ’çÓöoQõQNͧ7ÞªLJ›hÖpŠbÖ]ÅP¹Ž…Ú$>±ñðtF+1=cÃ-l‚D”Lk DÍýþ-špO‹ÍË0ßïÚ•;¨Lµ¦ª¹¼ÝÙ¨´.,Yu‹•|!ùöZÁÞÚ%hõØo‡¢ÃiU%\ Úú(;}k %¤²@NdÕ Ø%F_¼èYÂeíqr­™¬U·‰'¸d›ÿyg>»÷ Q œ¨eÁKxþëÏf6öÊiAðZ»4žu6ÉÚ¸×@˜k:ÔPµÞ„…d0å—ÍØˆJ3ô)ÚúÜRNü?]t£&ö`®´Ë8Y¾4DN|Z•ŽOBhÄOìOå(Ž‘· ƒOɹ-AòÑÌÒï§Ì}Wðòÿ/C¾œ®’üÜÕ]Â~åiiÞ/"(™œ´m3Ý"‰@ÁÔ…,õ‹N#yÎT‰–äk^±G™ eב>7¾ÛßíÐYú„î)ëì„"=T4hkHÑ Qo}Dè[8è©¶’ν¿cTëXÀÎÿû(xx&¿–ÃÎhAÆ•þê6(œlžº6§ÿÀÅÅa¥§Äçâ$íYeX ¿gC.ÈYl¼Õ(7ëg5ÄêL`{&<„ýïÃyæ“3¯S]9ýù³û†à÷®-Úy¼FvK§‹Zl^2‰T|åß&Ójx=acg±Æ²Ì¹"OÞ,ñ[é÷£ˆý¬RkÙTŽ`_:­=>ò¥äJ`b,|X¾™ ËüÒ«4<á"P‰Ü(!¢–3ïî¨Vã”¶ÆoÝfJÆç[h«æºÉÂðâï)‘šó6×lmÀóÎäiÜ•)ë…ƒõ$GãMƒ…=±˜HU³¿{tU” ^1K1ä„Ü>€³çgïÂA=Œ>[ó~‡NnY”âF™ÅlfW µY-&A¸¾ wágÁðn9 'R¬æëõ\ËÝ|&(ˆ=’ß †ÑæqÀ ‡ño<oÏ07I¿LÅy³|Í‚lÎm:T#ÒN»ý0 ¿Â†Xì2–¸·µBêüôñÑ„ÇëQØÉ÷´ÐÆ.x“²‹ «=ÃïþxåÈÔPcrˆ¦Ärß+ÄŒ?Ïq²r YÁÐõœÿ,Ú¾@jmd¤¤ÿl×=m¨ÀOÕHˆé¾wŒgý}ºFJôç bó|9ƒÀYF&ÂÌòõþ«/†È#5ˆ}cRûÔÕº@%+ÏäÿVWRi5nÜŽZ9«Ùs+èõ#Ô£Ü)ï¼…,µÓ.÷® C'¨|J‘ÌÜDáü]øÙö+†>’¦JïÅ(Ђ>ì½îaíG°fTNiûiž^÷ŽËÄ÷ãM vå™…Sk"TÏC]6Æ¿ÓÉ¡5ʸšTöq–ü(¯o«ø;ñ3RD›Q*×å_y—Ý"-è•—mæþo[½¶ŸZÀŒ ÂýÎõbàw {Gȓ咿Cy±»ÝNQfè©æGŽtüZßó WÈŸÞt‰€œŠK"lŸgt„g˜åDk¦tµ,-“¦ÿp¯öÚ-#µ Úáxµk"[ÁÔ \UFme>˜ãBnŸµeƒ—Uß0Ô¬|ÒòŠ]®£è‚þû1†C˜%ó˜ ƒˆ=4¬Á”Ž2fü>ås $F“£V<œ¢;ù0WÄÀÚPrU™Ž| IÁ €þ@¥€”ž¥Üœzƒ<‚`bb‘…˜‡æEÑ3ßp¹k)ÐÈ<‘fEŸ ä€L:æB¸]¤Ã†».i‡ø¢!0† “b—DeŠ‘N¬ ‹K¡Ã5ÐdDƒ‘õ¥I S¢ß ËsÌÉ™®ÌÈÉÔÂèZêÄ'\çSŸº÷RY*¼»7ÍÅEwþ=à§HoxíF·]H ‹m} \oOò {^-ãȾE,–œ{·F2é“ùÚÂ#*”<é -ÛŒ*§ùmXÝß‚Çþ+ÖUò°ÈfR^E"IÕÐÆOâ¿§ÑÜÛ8AýGè9²‰Ü ½Àð5Öÿ¸‡_ôþÈQ|,ûª|«G(kß•£ìŽF,.•‘ñ™±„Ó™Y“¤nu¡ãhM#E¯@׳tÈñ%t‡! îŽS.R r6Š endstream endobj 852 0 obj << /Length1 1956 /Length2 6331 /Length3 0 /Length 7512 /Filter /FlateDecode >> stream xÚu4îÛ¶½7UJ+µ·±÷¬½KQ„HˆXUµ÷*:(EÕjUíQ{WQ£µKmjï­í›ŽÿOÿï;ç}OΑ\×sïçº\× M„”íQv0 #ÊTõLM¥@ ˜0(JÆÅe Ç `h2®›0´…”ùË@ ƒ`°œƒµÓC!ÚžH ’IÊQ Pú?†(´ @ â·è ´QH˜—*ÊÍ wtÂ`Óüç'€ÊIKK þr(»ÂÐp( Ѓ`œ`®ØŒP`‚‚Âaß…à•sÂ`ÜdDD¼½½…!®Â(´£Ÿ ÀŽqÃ<`h/˜=àgÃ}ˆ+ìwgÂd\S'¸ÇoÞå€ñ† a,€CaH¬‡'Ò†`“L´tn0äocÝß‚€?³€„Aÿ„ûãý3ùË…¢\Ý H_8ÒàGÀºÂŒ ‚´ÿiAx °þ/±ÃüªÐP6@° þiÏІ»a<„=àˆŸ-Šü ƒ²:Ò^åê Cb<È~Ö§GàرûŠü¾Y$Êé÷8À‘ö?›°÷t1CÂÝ=aZjL°ÙçÃÀ@ PJ €¹`>P'‘ŸáM}Ý`¿A?ilþ~n(7€¶ ˜?܆ý"óó€xÁ´'Ìßïïƒ#2`‡bv0G8’ì":–†9üÆØËGÃ}V@¬ö@àÏÏ?¿ncåeB"|/Ìݯˆºªž™©¶ÀïŽÿ9SQAùü„À!Q1QX –øÿ;ˆ!þ§à…§Òþ]+vHÿ©×ëÏõóþY >À¿c飰š…x/$n ¡Ø? ÿ³Ð¹üÿôý3Êÿ&ñÿ.HÃøuÌûëüÿ9†¸Â¾ °’õÄ`寇Â.ò¿MÍa¿WVf÷týïS- »ÊHGÄ?c„{hÀ}`ö†p Ôé—0~Óf?W G QðŸo @þ×v¯ .ØwëÇ_G0ìÚü;£:вÿ¹_¢` †ø’±2ƒ~ ì"ÚÃ|~) "ŒDa°.lwþšìç…J€"Ê?©ßH+¡$ ¢q$"ºH ¢w¤"úÿ )¬Ÿáˆ_ 1€ˆÉ?Hr°Ù¡ÿ 06&…Àæ?Œ¸øOÆÕõÂãçÄDìÿ‚ €좛ŸÈÝ+©bbkq@y¢ÿòÀÖãøĦpºHˆŽ“¯› ù—–ƒÿ±Sqþ brù b{¸Èa«ý+öAý±Å¹]äÆÚºaße$怹`AØß[õ­Â »K¨‹Yˆa;q÷Da`övˆIÿ!ÿíaÿ Û£ÇEplOˆ‡Ó_Ø|»cÛôº€¢ØÒ}~ÁIê‰ÆŽùõ–`uüüëÿ 惒  ²¡Îe¡õÇ%Ê,ÞB‹}¢â”»Ñû$æ êÌ^ËFÁªr'{b/bÆ”›‡–bNfèÖD ~T»X0]l¦ï¥ÆÈ0ŽWÔ:ØÍ Þ “?]óÐõ]Òij²´CÚ;2nÕwyï+}â»,è¾³8œ¾¢)Ç]óæ¨Èi‹˜§j]˜¯/.†˜IJJŒ/´A9½áJ©ò§¡F-N]¥¾ä«+'©=¢à¹Î‰W‚¸ðÙT–ÕUJ7ýôU…”¯­WtlŸ¸ZÕ™ÎðïׇñÚyô&á° D‡•Ï™ÇèÔÓ°™²uÔÞS/|–Cì¢eöx²ÀADÀ\_$dT:!~TÐ@â¾=lΤÔüÖ¾¼¨7Î +¾c6Oóž ÄÎÉ÷+˜HT€ n¼WôrZ“§[5¤LPh_«ƒ=Џ|û¯”.SOu>êÍ p4ÉË:)mjfA3)ʺ˜‹t,ÚÒZ EvC“Ó ™vÕö°8 Œ­0„âÉÝ*Æ?‹É{j ¶V PC&zÕýx ß Õ¶”hB ä0ÈÂ+‚`–'íaˆÐ™’‡4£´=|uìý°¯¦„Úü|¯kã½Hºm%äúºçMÕˆþò«ïßÛ–m@¾Bn K ¤Š<²“ +Ôo1ÎŒsû¬CveíÓ Õ0ò;ï!ŒÞZ4=¹Žo2Vò…ã;¼Â!«[Æ—ÈZå„YâíÎÊL6nÒ9ÊZ<èÒk¦òÃ䂟óŸ¾íدaJøA12ùßkhÆ)»Ö"ßnžÏ·m²¨ Q‰Ð:!sìôüó­×•ÄvÂF60eùŠ ‡l¶~aé ÀÏúî=º¯{©ÇqÛ×¹Þ'`æÍ#0‹íÅ‚ké£ïvÈcødçìºÖê¸uk6ýõÓGʘv5?Â9§Ëd¬*ä<¬H¸h^ytê^B1DPÊ¥~_).Æe¤âÚöñ{¢ܾï¡GVð[:îVñ£C¯ãvhêC÷?¼›Oíœݯ—ÞV`æ£^¬ m´>+FUù ìŽTà$ôHküë5V[¼²õìÀšÆW2]G’Þa¾îz(×\µ(Nh­{ޱšâ)îh3[³Îc×ì†ÄtŸÛý¸y»[ásÁáauâwî#+ý )ð³Tx»Q]·êíÅ=6Îï._ª†mV?äÈ«UÆW­œOJð‰pŸƒ£³ iÇ YÄö>¨Vf»’e5á¤_# ôÌ@ÇÜ|ýŸXF¸îÌßå®Y0ŽË¸5Ç=J• Jz雯QIoü>X y 3S^\¶a ¨3ª©m“h:´úz¶µZ,·<ÎI•xíAb_ŸN.§­xø^l~sbȹÈרFþ<ÊFt--˜ÈçºÚ«º°pWk‡ÍwÑ÷ޱ»D^{S”–%¼»«ÙV|ŒOM©Ñù¯ŒcJr=ƒ  N`•J7l7MiOã™sŸÖ†0§F¹bé4?*Žb²fHˆòåë>÷†µ¤žì“ ¼¢-òõþ ¾ÝŽHÍ.×›Ób¤™èô¤ûÇ%µwˆÉ*~6ZiçfÒ¥èO;•…IÞx:rîò43/lá§´|ðC÷IÂ`—êÞTyë½Ä¸]ÀP¥€tÛµí+ëÞÈGŸË‘:ÏG P‹{¦7F\•Rê4£Ô‚ûSJl^‰ÞlæÒ?6+?’iø]QyäÍwS¦v—½gìÔ†¯‘¤Uÿ’¿\­C¬Ï}P™4i,¸IÑžøyÉxå×õ8^€g’¨C+ËÆðú4²˜¬Ï_¾¬([²nÄ:ÀúÔ‡žîÛyÞ%Ê;!s»÷µY»r# › ñ, YÚn4ÖéC~4nŠÏÎc 4uŸ‹K”y3slq1â¨F\Vé28u™¢å‘SÖŒÛTBÁ‚ülzÝ5Rk¾ SÁ¡¥‹z=7š\ið"Kw|SMç¢ hb©HV“kIÙ?¿#+o,ÚÂćRêF“Ú丗«%#=r–´,b[$½ŽŽ/s;i\s¯’n0:«è$[.ë“Ö½Õ,Õø¢g覬 –Ak¿6Ï0Bž&°ÒáÀ³äxíéaÜ÷áŸÓÇEûÄ+q \ƒ¼XõjÚË9h… Ÿ,%޽~^E=ôÖøµþê@FŽÎå$m„"ˆp0ü†{f{Å=òæ0g‰geÁjÇÜŠÏ+ùý) æ†&Ú¼ß5D|޹ªvõJÍH<»˜§õ>úue^ µÊ@ÏfÄ×kLDújîyuvÞ­5!ÜCw‡‘U k=ÕÎ=­r¾ø v*üž8‚¹l”ií=éÖ _oËHd“§˜¸±P¤P4¨”iZOìðð>ô»eÂ`sÖç=TÏÞ\ ã_9;CyÞoyµL«\ZtÛÀÿÛ‚ɵ–‰Ëɨso.muæ7a.e¢YÞ›‘í7ÒæêX² …nÄñŸ<:åâ4Ó-ÉZÞu«<ßû8“¾<åîÌÁ·iï¶ôÿ}šN ‹\À€³òT€¨Ã…°·NG2òÂmo$%¢>Ê7ʱ&µaS—=}d³½Ö†Ö¹OÄ8qø(ò-¤Þõ|¡D·>è›ò­’°ñ¹©óÕT”ßÑ;3’Üû&æÅãß^)\g“иtÝêSq{™Sütà^C6=gPúWËaÖ8H§Ob$¹êè¢vk×ÚH´;éŒÞ³™çY;5‡Ù­×ÍqIgjnAz|}3®· ¬´gŽìpÔÊ3”…,fj0ú‚AIt dñkVJ 8ŽºÔ)ÑD„„þn,cä¼Dq{Îåkºw¤=8+2sE=kã'Þ”|)ÌCÀ!…S}édG»âÖnyÕõÜ„Ô/Þd¥âl&8³|Â]©RuöÀé€g,ºfßýð…ÔM©J:1ã°–ÈÜÔŠQaÇ׉dYrz5Pµ…Î'¨¡!•Ü ®]ò_ ’{k’Ñffý)Nû¨K–ðæp$6Ònå|RP‡.Q„SG YZͽILÀQè´¸ ó|–:à²1µÆ‘RBhàr] ª(ñ8bISñ8p8£ 9­B• _ Ny©¯¢ÎWSÝ3m;Ê3דNl ð°­—oÖM·NR@×d&ä†! Ïq¢Îk^¯|S1ÖÓ91®œ4´ôê‘=_ܰ¬,û0V:ãÜ|»«>A`á@?ªL%3'`øyI+µß´„qÕñéÍV]ŤœJ†Gà}nAâ½R(…‚ã[•[uñ䞟 Úì}øß#¡¯*¿ecÐÖ;—N£·œÈŸÒ`= E`R#']®HUðôôË‹ETó?Úô©¾ÌòÐÚrCC=Ñÿ>ã±Òq»ƒ8AMÈI÷Gñ» \Ö¯—¦é ¿Gé…jß4²aeÐìSÇ奲ÛqÈ›>GÅñxÔ¿°òØ… x6éER°%î]j5¿E2kPLÌ—½ß"nðd+ÉD¾˜å;—Ôn1-]õgm„Qî’ôi9÷­|š:¯ü¡„÷×ÞP°&fn Ýn†êU>ï_¬~<µM wÐÉ»ò´W’ž¿49°’Í;‘ j¸w[ø¦{¤[­1pÒM¾+Ç儨¨-3wØ›¬Ô¬oÃ}ÐcûèX?­¢?ÅØ“4ɤ·ó#©¿}¼gÒ]¶ÁᴕϪœtô;÷›W}[oN¯=¢I·7–gâLUI¢Gå$0QYò6:pïýC|æ$³BÂÖñÆ žØB;Âz[i®§À ÿÉùA¨ï=Á¾uO»ÅNÑ«ëA»œ5jì•u4¾ ›ù?KÑæ™ãk˯´öñÉOÙYZ-ç ëCíæ_Zv¥µ<×*ÏüöévÍÑ zYÏJEýÐQ¶°ˆ¡M ó‹¦÷Q¿uâ|ÎÛýu_µ` ŸVz*„(Pë^ÙÃÅ_Q±„z¼º«m'VKSÛ³kš¶ˆön¼\¨Ð%]~èÓûýÚäÊ©×SŦ¢Þ%ÿcãÚ2гñ+®'šNBC„%‚i^¶Ll:ÄEæíZOŸ_-ÅG§nŠÏ=ÍM©XO¦ÄZ—óT¥ ïåKÍÒ4ÄÒ—¥&“ñˆ•hÎ}lR|þ]ì‹öÖQs†#}™ˆï>/ rñÜg¯ áFžõ²©W( á)P=*{Që=)‡Hj ,#®Ü =Ñy·¢V¯íÂÙ‘÷HÀ†ëŸ"(T’5¿™zSÀšÏ¥¶üÅŽ)¶,ÄûrH:¡ÝcspÚJaŠ¿ÓìЇHd«‚ªwtÕ‹$wAŸÃ Ñ6ƒ—Æ}]\9r‚Ì›å—+ó5ßøº½‰ÏLì”»GÖKψ´P1l¨ßb‰,Oޏæ2öaTÊV'ˆïlÛ1xŸ^¾mW-²Û…¯s¡Õ.$•¼8OlLËF÷Èëaøì|=ýcüÒV½[ŒsyB/"µ¹Øfˆ!ŒS'~ÉEÎú×É+ÍA§q™¼ß³»Ù2ÜŠUcž=[Ä\öÓÔŽ°äîl=sóµkq0¼)©~Ùqr×X¹;k,>ÁÞcì‘ñ½¸÷ÑðÉôW&ÝlF4 /uðimòò¯}6µÇypsè‰jâÜKüÄ3¹pšñi]ÇñëÈž³(ÛïèY*¯a_ÄÔ:Ç)g_îÇZȲ AEóÎÀp²EšŒ³M2ÑÊØ¡B`ÿõ1”­còoq.‡(tà7êDÙô¿é±±\§b‚ˆ_ MöÐâu ™êÜ­(¢>:„‡¼,¡0DŽDǧsSž ¢¤U¯_ê¹R¿?­V½Þí ¸RÍ™XnS¶ €lÔàÌ2»©D jË1ë:kÈ¥†=t¼¢G®]å15Éʰ/|;«™ÏE@I*Øþnµï\ªÖ‘BòþZѼUõJ0NýÂyqèŠäA:!š±=Ô4žëjÜ« Ög§¡7EBÌA_"Ã9§žLXxÕ§Æ$(ìòÈë¹_±-âgþÁ1Øn#1»ßeNnyQ š×¶îiŽbÔ– ^ßÝnÚ;Q#²§ÝÓJ Ó­27hÕŒiŠâù\É™€;"Õ‘›öYãÌ3üˤHNÈ[%WÆ :hVbE™À|n¦$ Ø.ÓS›’h1úX&¾èZÇ܈ú$[_KÜ,Žk›2-…2ÕM+lÄ7o§+^vÜÓåÉ*åvdQŸüàóœÉŽüþÚþwoÆú ±~º:ê°Á—θxý6mƒµ"zÚEvÛ`%[ô²bõ‚–®”)Ïe\Â<éüó=Ó{wj¨_kBý=:nÎ…ô¨7¤’ó^e—¦ždšwnªí¶w{ÒF˜Vü¾ß¤ÈÄÆç*@ö¹€íš13ÓTð°¶é' Ň"óçU5ßîù½m8ƒùàël`š.%fz4ÚG×ýÁn!Ø^¾Ï9ÆpÔdëjS?¤SÑÁ=*îwêuŽÃ¬CTþ­øÎÞóoªà ¡kç®÷úÒVß áB22FŸ¶n†œ×_VðNV¥iPîìÌ/uÜlKÒŠ0Â~Blê:%ö”€Õe{ÐzíÛ¯ö·AÖ{Òœ,m:¯–ÈʬÌÐEøÍ³qH—°þ¥æ öÔjˆ“Ÿ‹"!ô‡y̰™-·M \uÄæý„ö«oÝ„Mni~ÕqÍgùÁν"š;1”ûÀÈä§¡|tåJõéLîhŸI!ËNGô­®Þäñ‰·i³¬gÏn9xÎäx-~Y›ÂV7 'yF€t¹^)­põ·dÄ.‘}ÏžxÂ&«'“:_÷j”Ä®x{ï°7¼¥Žá¸Pçä*‘5RïÊ÷#§aë`½¢™e ú„©ýñQ0úèå-ó¢þó”Í„iýŒ;uäÏŽùžÖ»מk<#jxiÀC>(ÐÌà ¶0ldøºÇºhŒé¡òMìªeÄSÖ?ô;;>3AiÞΨ ÂÛ>G…ѲŽÞh‹·™ÀhG­œŒßjLöl_dzáR  âµÒÃ}šyV#&«®èÅÊÝ•#)—MÅœ—Lϸ5ûDCù^|¦Ãí_q*}’JŠZrâÖ¡·;tÔ*‡¹`“ÃÚ™ì‚#&ë‘“ð&ûóœÍd“ýqËçÀaôNJ‰°ö ûæ 9'í´Ô¸YI9!ë5Ý@7*cÿèïU)†ãš<•Z^±mÙI¸ö¹N†\Ñö‰¤EüÎM_RÙRÃ~8ê^ZÅ%BÜ-H}s×@è”þÁ(ïõçdμDÕ¢¸³ímҾݡߨ61~úíÕª5ÏÖ$ŠTq;h¼¦&°s혉Y××)g²n±DJÓ×/À!7ÌË—ñ¾ÝT t1Áăø½;jæ©iv忌¼X‹b#2=Ïòõ=ü^oà 4òÁS™ï Ìl“‡ïË×mJ´oØ ÍßÍÆH|âÌf¦~ð@D‹óPdT­Lµ©.¨GÔþú±ª©R¼¡äEm;í'âÉyXcâ çB‘ œ‘ž¸Ä_˲—ˆÏò—§_±ÝL†´C”gw> stream xÚµT\.Lwƒ42 ݈´tw7 0Ä 1”t‡ ‚twww Hwˆ !H(ÒÍ7¾×÷ûþ­{k óìýì:çÙgé4´9$­¡– 9(ÆÁÃÉ- VÕÑpsóqrsób12ê€aŽ ¿ÍXŒz W70"ü/‚´+ƒÛd€08O (¹;xøàßã¹Y¹‚anœn`Ç?Fäú# ü”e!ÖÒP''æ†õG2`Wüؽ¹þºYÔâó7°C¬mþÂÚÝ™Kvq)ÊüM›°~ÛlA0€77÷K>Èò²²ãú#½Ž·3èOçŸfø~>ÎPg€ |Øÿ‡åãô`®î ?Ÿ;þañð¬ÁV0€%È ÁúnÙü…á—ï ösõÇàþãïŸo¦pyYC!ŽÞ¿éÞ/—ŽŒ²¢’$Û_ÿã“’‚z|8^8xùøü¼€B/~ÿDþ» îß‘Š(@è¯^á‡ôŸ~=þ¾~æ¿Wƒðß¹Ô p͂̿%nÂ-ÀmÿàùúŸ!ÿúþ#ËÿMâÿÛœ»£ãŸnæ?ýÿ7Ð ìèý7.Yw\þªPø@þ—ªúkeUAÖ`w§ÿõ*€ð5„Ø:þsŒ`79°ÈZ ³²ûS™uÿX1G0¤uÿñ¦8x¸¹ÿÇß++ø»á×ãŸ.|mþ»¢,Ä jýÇ~ñ ¼]]ÞXÜpñ |xà‹h òúSÁ.NÀ§óØ@]±þ¸PA—ü¦¿Ð —Êo$àRý^¸Ô~#!—ú?è%7€Kã7âpiýF|.í߈.Ò¼ð7‚W°üà¬þAœ —õ?Þ¨5ÔÑèú/|Ðo¼,|nG Ó¿ðÆlþ ¨û¿3À›³ûò À‘·³üñûÍ€ÛÀÿ‚ðŽÿá-ÿ«¼åß±|ðPˆ»“å«cû¯”ð§€ ú»(<ü—â_nx—οÝð¹áKµþ>©Ëï2ð\Ü¡0µå¿:ã[ÿ5(¼·ßwºÁŸšŠÀoÅÍèf÷¯x]Ø¿ œáþû¦àÙþüÅp³‚ºþ»uøéxü ÂGóüþ—‚­Ü]]á/øŸO \ÞÿÁþ\€@^ +¬åE¨•H¨}}hçU­$•'Ç·I±9Æoú©,>Ë®]î7xèI,5™Áë®’I#ý«[²Ìç¯>ÓÞû´5¢G´¿×ì¸õ½3ךùÖõišthªð@²a“šCçՎk¯^rbc®‹ûK<|â+Ïy¯†Áò•ñðÅoš;5/”±ïÊg9bucL‚Jæó,³ÈéÑ`4¬DÇ^øóçsD9S´JñlX~‡±|E>F¼o¯^©Ôáuë¥` 0"§A>'Ÿaò‘ÚKV"[ò)-ŽY[ÊæfáDøéË?–²6»à*¢ãå_bó?)¶œAl¨]19†ni58—ïEuí?mûÔ…; ݬÀ(Ùt²´‘)†Ï6æßÎwO'ÞK”Þ·ÎR1™Šã¨xQÂþq.•rxûÁQî¢_ÌÈŽeŦXg”¦9«Œ<Ãg­~ ð.¾¤:4¬[ää!°W–t‹i+:èx{i1©e6ïM+­ÉáÝùvmïNóG& ÷¸cM[9¬iŠ"Çz¼Ÿ­eµùã}½X£ Ý1yoGO,/SÂvÂh´¦›B¨MËg°f§scÿàÚŒ7º“æ¼+ƒÔþݘòŠÉD¯.:‘‚{9¦°Ûþ.MDUZèGoÁƒí|ôθ,­çßtºÐ£:¦‘¦}¬‚\3¹Ž-£_Û¸{Ÿ·® ¡“s˜+ßÛ}öϸ‘^ÄT¶ÎU‰™S^'%¿±yM÷ì¾8Ìã‹‘{ç:‚ѽÞ]Ù‘œϪ«{Ž3Dj„Wh[€}$Òæe0`û¨È–Š­õ`¼§N#ù±¸[Ä SðÔu@“ÑËöÃ> ´4jÜÔ+ø‹ì‚ÃÌ>1ÿ«ñO’ÏX”¶Qok…ÞDñUá|ú6D&SÖG™p…iňS×ú)mÅ»FIZ¬ì5ê÷Ä#2ÂYcÀ#--q´Lîj£e Žq=ü²Ú]JÂý "–í(R»ý!0WuFQ Þo¢ÇÂtZkˆë8+WL2}¢îÛãÎiöuFp×ý”2ÓÓÒâpF¨]@¼¾ðj ÃZI) §và˜ûèìÔà]ññóEŠñ$ìôËñSÔ÷=Z3ÆOÅ'4Ïϱ¸uòpP}0iÃ^Ø‹åQÜ {FÂé*êù…Ñ16(Nq5œzß6µrHzÉáa%Q ‰§ö~$½Ôú¡šM¹„ÎÍË·“´æ[kVàP­r#\Q…­BËüyž^åÃ<ÎãÓ`±èËlmWû[‚¤_Ø÷>ÈÂN>9ˆËëdP ÃMûLüà(8îÉ3ûÀ²Ê鎄´g÷òM-_VBÌøU“MŽZƒ& KÏ«"ãw½-_ö¿û¸5]ä…j·Š= °j~m;Ì™6ÜÂÕþ•_ŽŒv;½0:¿°he/QRðö жß;fò¥]ßþVÏ.B&/]À«§¦FÄ Kô¶„–TDUA é,PÍýÖ`m$ÍœäTÜo¢Kë< J&ù½°í¯Á.9Ä&·“Ø+be³ã½€á³µ´q*ù0º1©´hÚD¯}Ž9ð9sZ>—µ‚ ›®‹ãävè#¬À¡¸ËSwÞ~GZ“oiß|ƒÚ‰]|¿¢P@û '†;ÒÛ•àª|¿g9ÊP LÆi^ÿT.ÔaìK,DbÒîÕ7ÝNËõsÑPPÄBÇ&Ôk Fè2èÜU`Ð.’x¶ ¾ÿ¢}fW3ÔŽ]éŠô©Q+è+±¾ôó™¶xRµc H0Îc4Ù±èÝiw°·G×+/ç>¯”Éh¤È9³"´|v“QîǵëmÆc5{‰_ëK’¸Z!1û¯|K•{5® ø%¹" Në8ô7'³’²ŽÒg™¥|!1ÚVä*XŒÍÕ¨ñ'¦H‡¾OP<6ÜúêJ[§®Z'0AàúXAaœc;±9èÅîÊ~¹Bz”Ÿ.§‘ízÚ’nðT†þzÏ47 ñÞ‘ —hcÉ£‹ÓPÜ/ˆ(·ÎR÷V‘\Û'm„Wð³Ø/ä²ÙCt9© ‡ÐµçXÅ»€dNúဳmXΑ:ùk>­[üèå£ ã””ø÷L³[#v2—¾µ’šëòÒ a“çÑ­ÀØ™-Þ¶ 1h®8ª;Ê4Ó[îû¶õŽDPx57©Þ$Æ ¯UéUaæÛ‹ôÜð÷ÒJmÌBºÖ€>ÎÓBÌ÷©©°oÓ‚á—§4dÆê-ý´uZ(W†ÍÄá#h‡çÉÚ™Úóå ÙŽlâxo;êZñ_Ô|Ó­6lÿYö¼ªôÚ<ß™ý§Xí©™°/`ܲ•o¶ÞÃÉä!$..Å.=¼z’usÎ;þ&ä•fP<+±ÇŒß¼Àk>§Oé'\Cç¥5 •9æøQ§þ=ûÓò6Çdò‡åñïùƒÙ‹ªÞ|+¸½bÌûÜfº-›¥mY ôz3¤EÝxr“£ÂEû¼ ˆÁ™Ù²õ „z9ÕUú®&"‚ 8+ï÷-Œ|¯ßµ>Ëÿ’§ÂT”! õ¸†×½©JôÞCôdIMƒØ7_røNžÒ¡p›]ðjhfHiG—”V&5KU´r_ï{í‡cí‡ÑàTà æSž÷×ܑʌ4Z#ˆ[‘xŸjs‡ŠAªÓÛþŸ¢ cfaèQ½/_­u”^´,´2¢¬ö:^Nb†}¤e20<áè¨d­ :áþéõže\öLºÇSÄHÏ#0`jlÓàȉ¹±g»S8®hùÖ–ôÝ‚›ç†N,SEY±Ñxë=‹L˜BE8¬„Ó<þ"¿׿_àr©Y"“òSunãÔGÔÛ;~ôu‡Èmš0jWN–æ$ÇÆ‹¼¤a/óz²§‘šUú3|¼aèéÌŽ¥[¸4Ñ;3¾AêK–rÉ»3¦œÉÔÕZY2OEçë¶dnÕ7dP[3Leú«ûUPiÅP¸¾¥ ç÷â÷)ÿ øx^U[h±¸1"b«i>ªˆõõ *äÖE£¦£½¥Âœ9Õö“<•2“Ó@;¬õuÿþ]•9b9{É‚¿ä5!G¬ ÃOk|·¤wž¥&^¸F9 /‘q÷½MÒÒµš‘¨ò×g§Æ_Í? \É;]Ýéojd@)­9žxöf„ªø¼Åg>ø¸Ø_ÙÑ~曞Ô_?Þ¿Öm à2àÁÑÎÛvk}°ct?­@‘?Ó+ÝÃ4ŸïãP½»þºéßo–ÛA⎨GB’gý8|;¿”ä7K~|e·ÖôáÍö wèH¡ÕòlíA\’8~(BóY<ôEd˺¦Tb¥ñ³5éE>ûÐiB$—Z rN»®![á¢EÄ^<}4*†±ÉíBHû¶¤A;Ò\ˆ’œˆ£©¢uhc§lÁž“ÀŽWŠ5÷æ3#ìGµš¸òó%ÂÈðº0ïbIE‘¿Šðx$¼Ê[ó!”­¬ÃÇÅI'ÉïãJ—=d“À£²hšgìס™GM‰äÊÏñ/àMÈ—}‹‰nQÌ8`Ñ®&4X¦õP‹n…d¾Æ”š­îqòî0çYä‡Ý þ:ʽœwLáöL~ÄâSvÁÒùz½:KT5þÁ¤q®óõÏ· ŽÔ妌–E(Î÷¶Y«´‚òT,]°¯µÆzQ3jyÝŸü?ª›G¤îÆÌãÒ yXDWÜyXÌD8ác FäÚµ–Þ§ˆ»’Öõ‡¨x´ÏÔ¤7¬v>]1âDᓜ3Ðö³ëä©¢ñFOI«¹ÓËåˆ%]}ÔFÜt/J2 ÅóñÊÄMúÌp(üÌèÜÍ3Qíû¡ÙÌWó6;¯Ve*Òª‡‰bZ’À²Š9U:z=ìk"ÿ@þ·×ï^†âU»êÔFþÇ$ý…cV|6£Êƒuvëµro›¼R'ù Sæƒ •Åg hã' ÓÄh}…J¢Ú£ Cä/~dÏ5Ô,ڵݥlHس~.$Í©\ÌoŸ¶ˆÝxâ;5p;QéaÌÃLv JÃŽÔQ‡À( ^,©ÒŒ…lQ_¹t~“ykÃ=êä&$A3nž·ãQ°Ø’ “\"tšMo§ÀZ\­zLø™ŸŒ°óÃÞ2®ûi%-æƒtvF°Ö³º;°Ó…pâ±²º´þYÃ…Z–AMÃÌ|9,ØúzÏ£®õ¢„_'AÚðÐã[Ú…Wì9Äã+Ht–"Å8÷ؼgL[@¦_KoÝ»ùC]Øu9›Ž7(˹)Ú­μîK!^Hc!^`kÊÆgœD1´ÁŒK‰® ‹P†ªhw¤¨-ãëíñlAèo&ÕX Iß±¹€M¯0~p™©°l=nŒ¦I rò^ç¡;ŒPþÞDü7­ÆßÜó™…|–xÁ[oMÉÞ´Ý•1I8íù¿Þ0r™xÁÑ)·VUL]ˆ)çH­‚é…l3´#'¡ºhžü…ØG˜ó”ªíÒ@¥ÀBûö\WR ]GeTu ./Þ›­É <ðM©'ý”ˆ‹þ ýÛ3Œê-nB[hèÏ þižÇw'λ‰|©•^.«WÙ>Â=Öô’7-äSW¦~ÒèǬLè^£"gy/VÃgñ¼FBÛpÍ xgTblMó®¨NÃÆõœjZª‹Uí¼.·s4˜~2OûäPíœÛÞæO›- ßcÎ'ŒùÕµ3Z; £ì9äÊ›\mUœODv™RzîY)õ£VÝEU˜m«þÅB½.·hÝjþ¬í=NµI¦2ë)Wêám#Au+FZ§í»z!£ Qnm©ø–³§úÊb)Ûšñ¦@!Ñ©^=QŽ*U¥™ïZ` UA/ý€ÙÔø“#q®ï~œÛw[ð㌦X3m/áþ¹ëÊ7€“1 Ŭ0¢« ó\ëiX(Р?3ýƒ¢cS(újî>Ðs¨‹tY¨ZÍ)XZ7 ¼ñæî]üb\’ˆc`¯Šˆ™XIùe'¨lгƒ0mç*L*^ôc2§‹²¤ìöÓÉqø¿ªŠÇ¾°˜Ð”!“œ*Ÿ¦y¾)~‚®^z/?»Å°‰!3‘pFk¬Ù±ûÒMTMæEª­pZR©_Ü˸‰.÷÷~@ ŒmÃVƒ«º¼dÚ˜Ðuág÷.FzíîX‘Ψ/¥¶É•j‰ctÏß~«pJ/äËñÎjÙ–$ ‚W&ö§f;ù×7>|~Éhª0ýúa»å^«+oµ ÍðáuG¿—BžÏ´µP2ýŒpý -ž] ÓÌ{ƒ`ñ½¾ªÕzåݺ+í7žï¼ *C² Nì陃‘_3¾“6ÜÓÜfï..é©‹«èKbêiág&ûH'£rê{î Mº£ ä)C¤¾¸rôþéÈï׺'ÕÆ‡ 1‹UüÚ+Z¼á×AÐ~´ÇñS!·‡Z$†ÉŽ Y®¾dò3é2ÁOT{+Èý ÂŽî Dhs®!È€ã[)š§†ˆrEaWùÍŒât’þèW0lK³/ è_ÇežBi™Xg4”„+"bþ ™½/¦Æ¤ãg©ý‡* jk]Œ…(ÿúŽÜR˜ýÑ\é3 U·ìêְƒÂWÉ`#ËúF½BÚŒB1“©Àè/'[/Þ'¾ò»¬²(þè5ó&Nâš–›gÙúsà{eë‚ÁÏßçè{ésÜ ØEFÁgÒžæùIÑGI•Q¿&(šBÞôÑéRÍBÕ`i?‰%eE¬£ö¼98uqöÃß·í >¸›¨¼™ ¦ï/Jäͳ@·+Åî@P>¥yHñ`7à6/¯ï"­ktœ¹f¹± o„CȱnüîS  6U$á.–šÚfQµyɨ n¨ïŸâ9Ñ£aå{$Mn¦œˆ÷,^.Ï.0…¨›YgäqÍeež1q%…¼û|œEþá |ü\Ù`ÒÑxCÝ`¥eî¾°ÖÔ’¥X•}×OR²«j"aà!à) …Å+n~žAì.r¿_×¶kòDú½¦ÁÖ@mšÓ–Ÿ‚oÍ›÷Ÿ‰/ÏȤ1ùììx:ÊÙÛŽ–: Ÿ”‰Ú}ÀZ`+ðÁšôµ >Æ&á1 r¥_´ôLÿ•Rl© êRE$–Ø}ÙœxÝ]£}ˆu› ý‰·p5—cȪÇÔf@IÅÕ$A[â_"QxûâÑè_ZßYÊ¥§šÏ#$­_ðñû_eøc-니~ÈL¦JwQÆyŪâ~K7÷Z©³¯‹`ƒc{8Ê{m•“|¼I9æÁ 6­>ã>ÔL%˜eùºŒ7¢*Â#Ê‘M¢¸d‹îRõ&ÔKÂ~Ï죆àâYgz‰ÐÂÖóŸH!×8üê3Ëå@^g|—wúÞ·³Í'ìL+Rª¯â‡i¯1 rÇ×£6 æ}¹4˜Á`ª×O%hz{¼“ñEîåe´VúMÖ·=óœ ¤Ê\Þ͹˜‰$(Š4OQùOæ¬Ëµ ¿.Ü·cg²_*t÷–8;~Hûå\y¸aˆï7dÀLy908#Ž‘X1kõ•²~ÌÂz>ßú»1š·æ¸Ñ°W¿x¶/FÉl"gho`Šw‰ˆ¸÷ÐÇֽ݄·7r¦GXŒa¾‡s#EȉtØÊí'f›ÒW0£N מ¯Åõ;>D”gÎÖ9§«Upþ×/1£af5›„8Lâ¤/îå‡Ä.A]¡ Aɘ7‡.+©y—ÉäÀbut–º»í-¾go\ìyb£×R~ž?}‡Iò9ºu›CŸä­wm[ {yHl–†ç®WÎIñª¿‰˜h’‘@ &Â÷…àœ¬yÎéve_¦´ù9ÍéRú’ùŒÑS^ûmºTÁˆ§ªÚ.ŸSÜl”€ϱ×='–T…¥l«¢|¢ãʤƒÄÒpûñ¤|8æs vâç^t¿|FS£+—?Éï!/S-QàXK.|Ð#¾5™ݱ9É•Ãõ ê$Ó>:µ„&ƒ£*ó÷-?v»ŸPtí'«ö<4@Ø_ÛéîwÖó`²yȹt9fô¡h£~T“q[€'û@÷Ím:Ä«ž*>LÃØGJE-³‰(hçëy%"[mâwÌñç‘›Dr"Ôd¶¥6¿ŒR¦•‘Ò.I~y>Š^zìmd^ (¡{ÛZ»Þ¬Ðƒ6å˪LU¨6€áGHÄ*FþïHƒ>ö†ÙDdðÈ¡J«"¯‹hF™¸4#ÞgªÕâאַ>èðÒøg‘¥eaÒ»…¢ùÕš:ÎÏ‘QÕ¸§>W)¶axÆs¼Ét³f.e”z^6tº º_Õ@õÏIÙ´ê_<ÍIþ.`5 Ì^9Œ>ÞöŽU„êZ7ÇWì'(“~L» À$Ïù¨I—§GZ¨pÏ)c½êGŽLæ3ÔêÏq0¡–P+ÂÜD“(?gdíùy×2×™¡m{eJ 7¦\°p.ðÆiÔ±£CÚ¥oîO¿7Ô ½Q™ë1³ %É »ÇÕÁ—á>k™à« š—X±µmÂf»ÞFP*°v ÝÐz•¹9V¤[,Yë¸èa?vç¬T,¯VûLZ×û¡\ ¨›˜Nü‡ù«XON_$Øù-m™b׾ߵ·/ª¸#®Lþ†U]»›MHq‰´–P[<ë2¤(š1ÃÉß\†Õ0»pZ…»HÑÖ…£ÖÈ´£”_âiËè&õ‡æ­\ì^x¶›MÕ ‰Å·× ¾sÃκ/×Xq†ÍµMðØ\, ¤*lZ8/¹¸Æ}Ó<…TDá)ìçF(§#ÒŒ)í›o8 ­Q+uß“+ÏÍ0 ­^ D „h,V Ë¤îÃv“nx÷;¡d›4±ÃÝL€Ý=ÍT³ðlˆ]´¢òJ"¼H[ñPžn1TËoÓ¸Âq_ C:=ƒ¬—&}´ûVpù„ÐÛ+’ÕVV½™À"ne›4K‚Æ!LÍÍýz:FÉ_x~MgÄ¡—¯å¨âUS<¦¾ÑD†™/ÃÏ©žœ5ŽÅÂ!Ùš/B›¶›_lË?Û3ö3…ÓlˆØRÔ”µ¸[­6s|‰]oœ'%^¾|ãC®³ËÝÀ]7v·N7¦€˜²Ïmm±\Q‘gôãÜҢŒF*„V­oŽLé\}mwA1Wõ>äaóðØ*äÕåí)ïžg|ò ¶íj´Ÿ;l†ºôõ¼B—ŽCõ !QF”9ÖÊ;úïlRŒÂv3Ù;‰»†ø9µÉcŸÒcæºÒ©T.¸LuÌ(›ØÄTܦF„veÍîu=ÜÓv̺âÕÞî馉?ºÀuÞ& –OfrHÕJ:¦Ìâ½Lý“m#UTN‹éûG }k±p©U?ˆÔÕò ?‘Ö%›ë[3éÏQ¸Í!Äp[.Ô/lª@y&3“ Í u¹o´Ç³âN'È4‘9‹¨Ô˜ð¢üþœGgŠnV´URPÕXËJyÈ,]´´óJr%,}M­/glǦš'—``ö !ÿâvošÇl\coýV—Ê(È#RÁ¨ßò~Å+;Õc{«kD[êæÓ›[êt¥~¾s#+ŠwdœKõtq±´òÉZp!!!ãeç”8õ8wæU–6|}׌q…l¥ôÍèRwç’^p 79‹HéBy÷ÙtÊ¢3›F@h4VŒ·ËÝÎzø£"^RŽÒÞê¼Ê h-rãåã‹™+UAã•“$øÄdâ*_å>§ˆø<¿ïŸ×5qUS ÈǘJ4rä~¼X“Øó&() Ç2Ïj7"õ%ÿûN·lc7XwÄ¿'åá<æÊÁñÝ~½„ë’aäb6…w¥B¯ç-ßÒPã PyUJ è£=¹ vúÄûñ—±È3r-aúÚ¨ÏZËè/1s0„&I­k{‹Žk"mWs;,w¼6%±ì$¥¤q+Ö¨N»bŠ8€·µ„¤Í 1ð+ÛyFØÌ,™‹sͼOÓ­°ìA-Pê]¡P2êáÐåÊõwÐo013¾¾.lÁ{⇜`l¾M—‘Äï¢'ŽŠváwM¦HÌͧèëûˆÌš{í»âPÖVÔ¶œšîÐxÈ÷2iïlkCÿiŸCc½=Š”§ã~‘ÐÐ?ÂøKÌrÁ°õ—p¼D—îù'CC i÷L®s™aÊP9wV% É3u‘>U=ì8) Yb„ü»¢ðzÏŸ_ºž^›^±sÉ’é ¾ÙIÀ-gHñuE8U¢Ç"{Γ¢?Äš¼ô±Qæ„ûæNð ÎJí[ù“u¢ÍNŠ)mIÎÚOçA²ßy2Q/­½¬Ü~P¨lݪhöºc©kÔѬ!Ê[ãà'“ãŽuáäW)ÙÎ6õćD†ò5PËôáØRuN2 Ò¼">Шj’zÉiÙñê€ÖpÍviëÀ#–Âòjú2€SðøL“`›03€·»Ÿ¢¾ecŠ1HEÄFæ«7•›Ò ʲš¥@›ÙžÒ¥ÈƯ=肯(¬¾XOS£ß®ï̦´Ú¤ËÓõœ“µ _š_—@·ÖÈ"U ¹tIJõíü¸Fo"ßË–û>1§t¹f$ût_âã¿>0~à‘&µ,¤~.ž|œ&(1îü¸—ê'ùQí˜è9ò£~Ü©ÝFÄþòô¥d-@hn‡ÚÎ=¡ø<½ò–yQ&Še±Åsµ^¥¥sÇåÂ\Ö’ CwŸ,™§ç’Œ¦) DÌ&Ýåt'zXããè¯N5„Ô“U°3ŒŸ_㘥>§ŒööbÞ>ÊÖ~öêZï~ª)Ñ l[hÊ !_w[(mFÒ:Vö«úà·û”±„DÖ DȈ헻`ÄcÖ‹@ºgâ½X¸«¹¥ox,¦qS_‹Ø)Ùø¼* ~Î>>ÙßaGÚ/ñöîÉUWéÄ+çdKä…Ô±Œ¸³Õ,ãéSñ±,Îáù'BŒh91ñŸ€9FybñõÃ~F#ô—ÆFÔü¸“¾±yþŠ;"=µoê;â"ææVybj%]X(uC¯³=P^•=M!%×Z Øõƒð±y¢Õ\*¨Êv$¹È^ð¸3. m0É è‘0¸†OT=Џº±¾‹Dѻ܂(¿‹eEPÍBK©ï¾üš¯Ð nîà Š%ðý1ž½$4Þ}‘ëf©²”ˆhTš6«õKèÙæƒ×J? üb|EbBwg¯¿ótÝ× fßÙ†¸ÕÔÆ³N2"w÷Vnæ‹t0üÈÙ dQÃSFh%-رýªƒAÈä'/hwꇀaÇà4^k‡ =‡éÕ—eQþ #æÚõöx®\Ë_Íw¯B³ÝÅà³ /$å%PÓ'3–’2Ú²’Sx•µ÷C¬V4_Ýî—.ít6Óñ‘pfÿwÈô[ÇqóÓå<­NúÞþ`l‘~~MüÇ ÚøŠÂbÔ-"Ê*²_j°þt¦§6òéþzÈ…°Z~«èEV{’°9T¹÷ÍC滋b“èLXB†#ãÃ󫜖º˜¶êé7ßqJ!æÍï—jØ-»yOo5”µE‹ceX„Ê,ù#l¿õˆ¤° Fˆ#Ùrœ:c3©>gÂNA¡ã®ØŸHuÖçË ܱ’’‡°Æ4N“WÍÍ¥Òg•K÷ü)‡IÌÙ²_ÛÍ.2dqÛò9EY§œ`͈Ígx¼ ¢Oo&nëqeRÑH%Å’Áp®Fo¬`Žé."lóíMðÖ´ßqÐ×”µð{²[ƒ3i­½‚2u©ýHtaŒ5É ­îj•9Ûe}R¡ŒußLªÇÜuüi´DášË÷­Ó@îìV4æÅõ& ÄÝšl{7}|Æ9ŸÚ(NÍ¿b˜„:W éò[¦J¿¤Í{‚ž”Äñd‹¨o”2Šôл#öch]œù[Tÿp,pµ94? ªäú½)ç©L% ¥GµÙh÷ é`…CwFûÅÙEH6žÞ».CåMSšëi÷ü„½ «ôs¡ÞTÄGTRÙNÝa2ÝbØ®>L‚99qŸ@Í• <ÊLÈ ï×pýˆÔÒÏ—;o°)€?Ÿr¦àw'¼ý䑵WÁ&³zÔa F£q²Êµ´Y[´°BÂê0)˺,UÚwíùÁ¶æiT½×^ -~‚hù+dRK‘ù È褠0ësA¸CjÙ©/Û¼øÑå.ÇäA‹Ç—æ[l`þ0ôl¬®[Xd:@k´éãÙãšãÀíTw7 Æ83eñüX„aZ±6TØáíC÷Ð#1ö§ˆÀ$ròÝdb ¨!‡Á0°\®ÓÇ(Eê22û<,º¸—©èx#+»>S…R}¦›]Ê»¸S£nµ bëE²üDqRùå„ý«õj«*wÖ‹Èe™r£G5z.•SWç"’Û­?‡’—üÚRñ’6 ]¹©®È5×½a®á4ÏûD¥ˆÖy¬uÊÇrå$êÃß*©ž>Ÿ[p3¸¨ïTãqŦ¨ænH±ßtÛu“CÖz¡‹šYôMlV‚¸•sn²mûÉ:ªFåÈæê°m|ph‡Ñ¤jä´ÀüÎ`ëÙ–Umáz&îúqvMyìT«ÃçíAÞ}FdŽ'Oj‡$#“ê¦ A€S’¹Imò¼wºôWhaÁòXhuƒ8ºq Ìàwõ;1ñ S%†ÝÛ|D=d õŠ„SÛ¯¾¿aÉKÊÿzñ,1ÈknŸ³ieD_'ÎÍø äÎP†„Çá^ùfæðKZ‚·CÉײ_®t4GÓÅÛß›1X2WÂrl1Þ™¶ÔÏí“­˜Ó5\é:}Þ‚„¦¸š÷ÉËíÈHü¿Î¤l ,è÷Ç»œ[Æp Œ„Ip®r1§v…Úfâ42iVˆ¬…MºõšÁ¬¼fŒFÔÒǧ§höÊB™¯kßS@ÁÍHG˜ÁÅlyÄ|ì³Êój”}iÅEÛeªn _Fw¿ã.ø½q˜Ò™·¢f¶ÐT8…Ü%r@H¹†‹üYòdLÔ-f÷j×îh*=+³Shdó"âœï½dzUå-¦ÑÜ@ÿí¡’]„!Nì±@¤V0:Rµ"Ô±t5Åi‘õîÉð¹ endstream endobj 856 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GðÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/@̪X endstream endobj 857 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GÈÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/znªb endstream endobj 858 0 obj << /Length 711 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH $úï×3C õz¿¿Ì¼Ìï÷íÌÔÝÞÍÂg)>ÜÐ]úÊͲ߻sððwÕåäÚñÕ¹ÚÕÓéð"Þû®ÚºQé;4mÝ_%‰= ”uS×'ü¯N¾%¼ýFwÚ´‡.HS1ÿð‡Ãأʧ`þÖ×®oÚ/ñx§ÍŸm/çóÑ!ƒõZÔîàKú¼îNNÌ~Íéóûì„ÆgEʪ®vÃyW¹~×~¹ •r-Ò²\®­ïÎbÊØ&jâ©r ¡‰ÖAªCu é±Àad)°ôXyœ x¤ &äI)RÌêVÔ˘.L¢I@õo×_¥Êpi k-cÀšâp¡ [À Âàˆn€cÂXçz3æ‚N­4Ö´ˆW Yf„‘ŸÓË%€ Ä9%bë™*Ô©Bˆ+Ðé›|¥© A…Ä_F:CêÔ9èQÔYƒ5ŠÀKÊEê—9r¨ÏèW8f•a¼D>éÏSG&ýx¯VôŽ _kU8!¼ò8ºŽ0L5#àD½ ÔJÒ üXê'9ÅŸ?‡: iÀYI WFñÜæ¹›çn endstream endobj 859 0 obj << /Length 494 /Filter /FlateDecode >> stream xÚm“Mo£0†ïü ï!Rz ˜|U‰ÄAÊaÛª‰V½&ö$E 6ÿ~=HÕUAgÞ¿“ɯ÷½Ÿ«ú~üÌÙ´uo$ø›ßÇÆ›LD-û t÷  @Ùö…½›Zî¡cÓÍNìtÙ=YñNËk¯`T=­áRêo ÞæøôeCîŸúòÚ•Úç(>”ÝÕŠæ™ ²ŸAæŠþ€iËZ¿°ð™sn[­6u…c´^0XaÁhî\je?ì„î¼0bª”ÝprOYÙ÷Åû[ÛAµÓçÚKS|ØdÛ™›óøäoF)õ…MZ³©}ß4W@Œ{YÆœmG;ÿë±<œñ®9Ü`‘;‡äKÖ Úæ(Áõ¼”óŒ¥E‘y Õ¹¡ât¤ba¥bi<Îg®bÌÅw­ü:/]×åvYsäˆâ[ä˜â+䄘#ψ]íœôò‚â9ò’8D^osâyMìîÚGÈ‚X o‰ä‚îBŸÉà5Éà‰<øÇ»’ÁÿÂò k£(Do9Örá,Âq¼B?"tŽýEDqì)bbœW$ÄèYÌèM»>sb×gEìjqÞ(ŒæÃ×po¿$îÝ}IdoŒÝ·œn-p!J ÷ýmê«ÜÏ-þøOÃÓ[áýL‡ endstream endobj 860 0 obj << /Length 683 /Filter /FlateDecode >> stream xÚm”Ooâ0ÅïùÞC¥ö@±@…ìü‘8l[•jµWHL7$Qýöë™!LUõz™¼±ŸýSæî×ënfªöàfá£onh/}éféï}ÜÝemy9»f|v®rÕôvx¯}[îÜ(îÓm¶mêñÁ›·MyºTnrýl²î£nØûˆûw÷wVžëqTrv¸Ô§±nfÜïõxò®Ÿ ÂWÅ·ªÀ¶?®ê¶yêQJé yS¥íN2ók1Ÿòë¦ê¯‘ÄJ‹ª.Çëþ—g%мûFwÞ6Ç6X¯ÅüÍ¿ÆþS>ó—¾r}Ý|ˆûoÙü»Ý¥ëNrl6¢rG¿¤¿ƒçýÙ‰ùÏǼ™Þ?;'4>+JV¶•º}éú}óႵ”±.ŠMàšêÛ»˜:ÇÉšx«\Â_h›`­•×:„‚ôÚPˆ©€p/ *,}!†–$ÇB -fu[Ôǘ6LÔ ü·ï¯Qe¸ }›Ä­µŒAkªÃú2$mAG¤sÐ ÚA‚ŽIã:×±×ÀšJãšõ "Ê”4ú3:KšŽaÐCg´þ"× sªê rJ‚_i:6dPtk69uŠÌ©3È£è" ®™PÝ€^R/z0¿ÌÐcPç_Y̰€Ì*Åz~ÊŸ¢''Mùq_ ùu¤¡WG”5dÐÒoé9JÒàO¨ïpù¥×Hº+8¯QÌÎhfgBfg"fgÌÎÄÌÎ$ÌÎfg,eÈ@ÓyÉŸ1S“3SS0S+™©UÌÔjfjCfj#fjÌÔÆÌÔ&ÌÔ.™©]1Sk˜©µÌÔ¦ÌÔfÌÔæÌÔÌ4•Ì4UÌ4ÕÌ4 ™KÝxá׆_|þ0®n£¥¼ô½Ÿ:8Óp–À©w{]ÛAþp^N3ž^Šà?ô'Œy endstream endobj 861 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 862 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MSÇ“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ‰ç‚è endstream endobj 863 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS§“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ»á‚ò endstream endobj 864 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MSÏ'ûK}êvÂÁ}¯‡£ãütÌƾ`ŒRþØþ\wíœs¬Û*ëÌpަWl:*;ÔmÕ_Ű=¤EB²ª.‡ë=ËÆ]’·ŸçÁ6›öÐEË%›¾¹ÃóÐ’‡húÒW¶¯ÛvÿE™;Ù^N§£… Æ£ÕŠUöà ºÙŸweÓŸ¼QÞ?O–Iz^UÙUö|Ú•¶ßµ6Zr¾bË¢XE¶­¾IîSö‡‘›:.Ÿã¡t¼r€A¼&ÀT±H>Åä4€"÷€P¸X ¤H— BMéÒ@5Ú*08WfH© ŸAX vŒ.2I ##õŒ .z†Ó˜Ëˆ0œQæa8ƒtcÂpNò0œAŒ‡á2 @݆s·>^ïl>^wùo×_áj4RrtåÒãsľÒ žùxØ[ ¡Á%QLu®óQ.Ý¢T³ ¼ÀÜ‚øÜPì½ÍKß—péûæ¸éûæ¨#}ß‚pß×MìâÔÇÄAM²–¼Ž3ð•7CB¿2>†Û*ó¾Rœ{¼@¼ö8ñ©Ž¤ú3îï }cê¥$f Oˆ#ð”z  )õ’ ÚÒÜspW)Õá9ðùÕNàš{=¸g-‚_Z¿´ ~éYðKÇÁ/¿tüÒ:ø¥óà—‘Á/³~eâæ}Yô%áŸ-tÛå¥ïÝ:¡UEk ¢ním›º²èGkp\ºx{)¢ÿÔÞ‚÷ endstream endobj 865 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 868 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúx²=7û¡i'Ô·fØ[Ê7³Ì–Øçs ~›þÔtíœs[(Ú:ë0p ¦l:ÊÚ5mÝ_”°-tB²º©†ËÈ}W{X¼þ8 æ°jw]¦lúj'OCÿáô=Óç¾6}Ó¾³ûÏÂìÄú|<î D0,—¬6;ÛÏúþµ96ýÆÝ•ñöq4Lº± MUW›ÓqS™~Ó¾› å|ÉÒ²\¦­ÿ›KhÅv7RKås|…*Z© -–1 Üb[Àd¨©0·…°´8¢‚ÅA ‹å i‚É$C#.ÐC¡‡Z\w±ºFÉ|TTýÝôí<\`Gc)y ,©<$¬g„ àˆvàÀ1a×ç²³[ RHדLÄ1>g~¼À8÷ã ãâä”·5ð„ó Bœ…€{’ °$.ô çë°ó 3Çqd­‚®AáEBu<§µŽã¼ñÜqè xΛˆà_¯ÒñÉSæ8q$0ùpûJA· ýRÒ5æÀ aø©§'¤ž!8!‘†žèœIDœœ¨ ¿Ð•ä =cN|hHrªƒŸ?GŸ„tº»Tœtâ<•ð¹QÒçF…>7jæs£"ŸûܨÄçF)ŸEYQУ.Þ?÷yRÅmžTy›'Íoó¤Å×Ozîó¤>OZùO÷yÊ„ÏS&}ž²ÙõÎÜ/ßýÒñ6á½>zÕ¹ïí{èžZ÷Ðá‰kZs}Ý«ÜÇ=ãã?FÏeð‡†§y endstream endobj 869 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°ÛªT«½Bbº‘ ‰B8ô߯ß{ .Û@ãçñóŒ=˜»/Û™®Ú½…œ½Ús{éK;Kîºàî.kËËÉ6Ã/k+[M³ç'öÒ·åÖì>Ýd›¦yÓ”ÇKe'Ö÷$cßëÆS`vÿfÿÌÊS¯fûK}êfÆúVGGùf–¹û\b¸à·íÏuÛ<1ñÈ9w…¼©ÒöÎÁ|Á擬CÝTý¨„íAW $«êrGø]žÜIÀâíÇy°§Mshƒ$aóW7yúÔ÷ÌŸûÊöuóÎî? sÛK×-ˆ`ãθtJ!±'™ˆcøÀ8õãŒ3?NaœâOœâ¶<Dg!Àƒ;IXô ôÀÍ0z)rЃÌ@« kÐpÈBQ]^ÒZä 7ž!‡î /½‰ü òU Ÿ<¥Èɉ#“ÜW ºmÐ/%]cXß!õÔÀ ©gœÎÈ€žhŒœIDœ8QN~ACT/ès⃕QøŠøôQ¤ïRsÒ ç©…Ï–>7:ô¹Ñ ŸùÜèØçF+Ÿ­}n4eEƒ=zG~æó¤óÛ<éâ6O†ßæÉˆ¯y2òkžLèód>O&òy2±Ï“Q>OféódV>OFû<ãódRŸ'“ù<™ÜçÉ>O)÷yJ…ÏS*}žÒÅõÎð—¿tx›à½>zå¥ïÝ{ˆO->tðÄÕ½¾Æ]ÛÁ*üà3>ýcÀè¹þ¤C§~ endstream endobj 870 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúùd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúÅd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qض*Õj¯˜n$HPý÷ëñ#xÙö?ŸgìÁÜýxÝLTÕîÌ$|äìÍôí¹+Í$ý¹=wwY[ž¦ž©L5ÎöOìµkËØ}ºÎÖM=—ÝZè”Bºžd"ŽñÁ8õãÆ™§çÿðGNq[O8"ÄYx°'™KâBŸp¸ž;2uçAfÐ*èY$TWÀsZë8ÎÏ‡î ‡Ἁþù*Ÿ<¥Ž“G“·¯tÛÐ/%]cœ†ïz*pBê‚Òiè‰.À™DĉÀ‰rò QA¾Ð3æÄ‡†$£:ø ñ3ôIH§»KÅI'ÎS Ÿ%}nTès£f>7*ò¹Q±ÏJ|n”ò¹Q”=êâÝñ3Ÿ'•ßæI·yÒü6OZ|Í“–_ó¤CŸ'=óyÒ‘Ï“Ž}žtâó¤ç>Ozáó¤•Ï“Ö>O:õyҙϓÎ}žtáó”rŸ§Tø<¥Òç)]ïÌýòÝ/oÞÑë«Wž»Î>ˆî±už¸º1×÷øÔž°Ê}ÜC>þm`ôRb©Ç endstream endobj 873 0 obj << /Length 744 /Filter /FlateDecode >> stream xÚuUMoâ0¼çWx•ÚÅvHB²ó!õ°ÛªT«½Bbº‘ AI¶ÿ~=~/íö?ŸgìÁÜ|{^OTÕnÍ$¼çìÅôí©+Í$ý¾977Y[ž¦~S™jœíØs×–k3°Ûô1{lêáÎ’›rªÌÈú?I›·ºñìÃn_ͯIyèûíÁ'ÛS½êfÂA­‡½¥}Á`¶Ì>–™[øÓt}Ý6LÜsÎm!oª´=ÀLLÏ‚Øt”¸«›ª;«b[h „dU]ç‘û.öT°xýÞæðØìÚ`¹dÓ;ÙÝ»ÓyLŸºÊtuóÆn?г“ëÓñ¸7Âx°Z±ÊìlO{?6æ_8½°^߆I7¤­l+Ó7¥é6Í› –œ¯Ø²(Viªs ­ØîFjb©|ޝPE«`)C‹eŒ·Ø0j*Ìm!,,ލ`q°Œ…ʼnr‹ƒe‚É$E#.ÐC¡‡Z\v±ºFÉ|TTþÞtgí<\`Gc)y ,©<$¬g„sàˆvàÀ1a×ç¼³[ RHדLÄ1>§~¼À8óããüþÈ)®kà çA„8 ö$`I\èÎ×3`çA¦Žã<È Z]ƒÂ!‹„ê xNkÇyã™ãÐäð"œ7Á¿ _…ã“§ÔqrâH`òáö•‚nú¥¤kÌ€ÂðRONH=CpB:# =Ñ98“ˆ88QN~¡!*ÈzÆœøÐdT?!~†> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G½;~æó¤òë<©â:Oš_çI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³Ë¹_¾û¥ãmÂkzyøÊS×Ù7Ñ=¹î¡ÃW7æò*Û#V¹{ÎÇŒžŠà/zÞ®Ö endstream endobj 874 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 875 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw7{>o§aœIä> §·”óѲH˜ø´åŸ8‡ýøU¨/RʬǾÙï0ñ˜_xˆù•ÙË0öÓ…ŒxµBiÑÝéòE¿Ý.‰ÍïÇSÜ=Œ/ûb¹ó_iñxšÞ‰áçbþcêã4Œ¯âþfiåñ|8¼E°²X­D_RÁ4û÷í.ŠùGÞRžÞQhúV̪Û÷ñxØvqÚŽ¯±XJ¹ËÍfUıÿkM;ÞòürÍ­S®lÒÖ‹jU,•N±2Ô@  "À–,Àû  ð õTË[<€5€ €¦¨¬Õ –€ê1Õ"à†á›×cvÃ÷GÂ@†m¯gÎ üKÖÄ §â| +T|5f©øÚÕàlù¼xZÇ1¸YîëPß^ê ¦å¾dbË}[Š×”_Q>kUbwñ88Òʘ×]´‚k¥ÁÁ•|'à%Ǿ¢ËïjÖò{ g䈵”ÓrŒsqkŽé:n8Ÿú7ÏxIuø†ªì¯³ÿ½Éþ÷eö¿¯²ÿ½Íþ÷.ûß×ÙÿAfÿ•ýtö0Ùÿ¡Ìþ!û?4Ùÿɳ4åmFºåt«ñÏÑíÙèÎÓ”^z­è¥À1Œñö öì¢?z ¯ï.¾~lŠÿP}éL endstream endobj 876 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö‚Ïöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õRé̯ endstream endobj 877 0 obj << /Length 749 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4ÖËÙþ\Ǻ™qÀ¾×ãÑa¾Ûf.Çnr K~Ù~¨Û扉GιKäM•¶'Ð0ó 6Ÿ˜ê¦ê/dبB²ª.ÇË ¿åÉ]o?‡Ñž6Í¡ ’„ÍßÜæ0öŸÈð!˜¿ô•íëæƒÝß0s;Ûs×-°`1*ÿìú w®VPÆ¡±”<‚XRpE±xAqqH'pˆ#бÏåd¬žRHìI"¢~°Nýzë̯SXçÿà'Lq›œ@ BÁ]ÐÀ¥Š!–„~5p³€5È1¨AfÀUÐ3h¸dS^C¼¤ZÄ 6ž!†Þ -µ‰ô ÒU ž4¥ˆÉ #!&x®ôÚÀ_JzÆ bâ,¡§\7ŒcÂÀ}(:KC­¢³Ô*º;<Ë5à®B„€ sºà¤zFœðÀ-Î(ø˜ðô‰‰?¾±æÄîY ï'-½Ÿ´ò~Ò ï'z?éÈûIÇÞOZ{?iò>ú¢ñ™÷™Îo}¦‹[Ÿ~ë3#¾úÌȯ>3ÊûÌ,¼ÏLè}f"ï3{Ÿ™¥÷™YyŸí}fŒ÷™I½ÏLæ}frï3SxŸ¥Üû,Þg©ô>K×7É€fÌ×ë4,Ï}ï%a€0úêÆ^çt×vP…?ðÓß ¬^Šà/®7 endstream endobj 878 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 879 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq9;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF ׃ú endstream endobj 880 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq5;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF#üƒÿ endstream endobj 769 0 obj << /Type /ObjStm /N 100 /First 940 /Length 5940 /Filter /FlateDecode >> stream xÚíø—¾tØ=¼±ÐœJ0,HHe`4 =pylA-‚Í)€±*”AT 9´µ-±ÔLD}"œƒÑµIFT«õƒú€r úUe°Ö”2 ä¬Jí"–ðo%<‘Øæ,¶Í—¨'%± >Aˆ0…3Bt Ú’Ô -4dè’Uî¤ó%ŒOÁ s,i&)(NaM$ ØŒRøþ¡fAžD™rP3H™òX‹Ø†Ò¶`rJE#¾ÿþ@/ªÑj2ŸŒVUñ“ÿM’í´ûî@<›_>»˜¬¦ðäEñx1ºù4/‹Ÿ×«›õ =_Ì/×ãjOÍ¡>Ôߥ±æØôÝÁ?ÿIÃ_üuSât>[ˆóõ‡Ýb£<?®ñ™:G£e…0…ø¡š~®V“ñè@<šç—“Ù9•²x±J½僣ùôr;Þ÷âìø»\B«ÄÖ_³±êŒµé/^OfgËÉæñÉäãÇjQÍÆÕ²xÞD\Ofëeøc=_UÓêã §”¸œƒ\—ˉ¸ZŒ>Wb4^¯*1ž,ÆëëÓê‹XM¦—•¸ó™ø°¨ºŒÆãj¶—b9YŠÃÙ|uY} [Œ«ËÉt:j?­gW£Åúz:Z¯Äüj>«~ãâ[ÞŒÆÕ¯µ4ÿ#ìÃnÕ£ûÿ¤Ç“â½wd¹…xóö]®ìû.³õt:+›ôúÞ®Çóé|qŽCÀLàÏG«Uµ˜ÁÊL·¾¬Ÿ¯Ð2Ýi±øþ{TY$_Fp§´¤št£Ù3óA·Xß(öÀx4ˆ7?ø­3¾³k‹¬eÀ³ë7®CŸW+Гx~r ÆS}Y‰MQâæêãÍâêCñ¾áDœTŸ'ãêÅã£_Õ{ ¾š‰™¬~=xûïÿÿ•”®‹‡P§28sèR aÑ¡¥EÛjy8\ú2@i¼:ÄP¬<Ä Òb(ã d˜(ÍaÄøR§fF®µ; $Û€s¢,$#ÚC\_5 ç2Á0z ‘$´sývbïR2ž„™(L¬”òЧ’™ÎKç@2ëN{ Ç•~ ‘P¢ûµÐÂMå¡DˆØàYÂÄõàQ9±DÊbO7c…ÈÅØ"ÃD(5bÌ̦–³Åz‚øœ4—Õ!CFY$ÔžÙ‚Œˆ…î!DõDÍ¥v X4  "hÄÈc„%3ÃõT:YX¥&å§Ò¹C G±Žã›Tz­‘ï¼,Š. Â2 ”(\~JíZ— Øþ ¶Dïë¾0>l’q3„ ‚Оªõ´Q(qS¸ŒT4w (ä˜I°J#Å3‚êA¡žXs„Ÿ!¹„mEIdlšœEÅjÒ»+I52ÕóQ)\æ- “·ç}¹XœY$&0WhÂl‘E£ÃaDçZ£E6 ˆU<ŠÃ¸UÐÐîÀö“¥¢ƒú¥ÃiËžÃÍ ê¸,±ÅP»ÄA½ÄÉà¨sW‡G8¿¸ô0Ce*­BÊSpˆ~Ió,û—¥1‡¦¾ÀÆUMeÞË!¿[JöQý¶ÎHDº2ÂTB„ÿŽŒúö2ãe‚O¸›1hD.M)é&ÍyšQ© öt¹í®¤Ñà4bŒu¨„Ð A“ÚÃÝr‰[z•0ïº~ Ó’˜Êm +s¹rßn‘Ðæï»] ˜LöæM­ÑóÒIº J°è=ƒÃe,ŠÚryd&n'o3Oz¢ïÐD>ƒ”袂 ÉÁà€è¨‚Cwæa €Y @ÍgÞ~‡f㘰è—òRJ²ñt1ŒDFZyá’'Z- Ú.dXÍg¬)MRŒ§åܘ“´pIMk#Nt›œ0b•¦Å„–'Mž ‡™TÁ6Áu ZëÖîR’ºmú¿{·; ¥b{k=^Çêº`ùŒÝ ª¼M~£}ž!\2±ªp~¤2#2-‘1ÐZC™¢ÕŒÃ¤ÙƒnØ“ª1“D³JÇxF@à <8æÔÊ´|3‘Ü¢$B †3Ž\$"ò @pɈ‡ÒÉ~4͈¯9É\d†œx¿¬¥¯ID\ªÆtl#x¨©©¯˜šgL  ÍK¤2( 鼦Yë›Ä”&¹B´x£#©„f8Åh.EäR4€Rp˜T4…-ÁqÐT³´Eâ,(¤€#|êZ4÷¬þ+CͦÁÀð…ö°/ªå|½ÀLne»»Õ³ëÑUuTÐþ¶‹åêøÓh¹Øñt”ß½ž\®>-))ÉŽ,ý9%ñ/1h2"ŽZUlOƒ´ò0ŠAÑä ðÆ *˜48qÀ‰ãtâRS(ª Ú®K·•h~– ÙÓâC=1^àçàœÑ¦¤4:µ×¸Ñ¼liD†æúÊÐ½É 2 Mív ïR&ŒeÄ–i‡¨8 "^=¬‹¡æ“–6œ¦ÌcG½dö2‡!`î¼¥éã<n€Î÷6ÕƒÆ5Õ‘½©÷Ð4°”œQo¤Îû¹$'—FΑ5´<+Ö]É-æúÅÖ–Ö#–ÜÂZ¡~ ,?7é0´u3(zÆâz*É!~ûžúïò?¢¤½æ"¸Ly*S¾$O %Œ".ù)Zç–~ÂÈ tý&ýÒÊ_ ¥Œ2Èÿ«”—ý”·0ó6Ѳf›Ã/Ú»¨ÓVÍ&HMkº5–r È£sšâÊ%LÂLR=HìÅi#%K¥,£l5pÒ(F¿Þ!NÌê-íS{Ë*úÔ$VÛRÏ0FR`lÔ˜?e†¸žàqt°Í<ܱÄÞÙ¾>RÎ…KM5m)Æ5¦ó§¤(Ì¡œD Sˆ&õ%å¢`5ˆ” Áö+xwJZñX͵ÊÄÊ%˜c `ëÛ¨úO½*µ¸rÉ-Ì]”c¾À¸0ü¥ 2í×"mó"˜œ‡¡ž±D‰9Ê¥ ÉÁAm÷06–©x‰J •’dŸ–’÷6L•œäcÊ]Vïrem­MÖMªS¶u£MnÍuìJ×´°.RÏš! %®Œ¥’t“?eYqK›ììïc‡÷#§h®XÚR¢“Í’¶j˜r§lÁ8NãP»7¼]å|"ïÐiÿ͸㌠6-m©¨LÇ4°9Ó0ópöcÊõü g¿2áÌJ‰ŽˆÈÓÓög¿¯=P‰iÍG?äÿÊ´ v¸yvi èR™ §pŒÊòmX%y"ɹJ¡¥:O0¦¤$U¹™ïùSMr­±ÝFé]Ê„3+y¬†[¼ác ry̳µtÂ6`é°‚¼Ãé@òP|0€ñ?­&1ÃÄ)êŸFPäëHCi†¤2FÊf-µnäšK%ç‰[Pg¤·æ.É»iËû`+kŽ5”,'“ áS²ÑX²]÷vŽÒ6´0’ÁQZ# á¼jíU"–úß;IGP*%BMjñÚPPVゥÂèíy#¨ J[ŠSJM=E0[ÒE{&Ü”L¡·óÊ ߌ*K×ÜXʵln×6wˆÆ€#QYMEÊð4Ï©µYé(Ã…YèÔ·âgš6À:Pˆê›gL.ÕQ-cStqñ›JÆ“—¸m7d:•Ü‚ïSðyš6mçÁm8zæèø O–l‚ÃW1ã%©7ææeÏT‡û1f.-ö¶øº$cg8*eiIƒY“#ä¹úõ–±á<+ÕP˜Zšì)CS›A[äûеäç¦5—–ÎÆÐZÑ·J¢z: p”h¥ÄdIEÇ ©•§t¤8 f/Æ¥ôÛBêêÒþ²¤s'Ÿ¶-5¾H)μóûÀ“¡™gé8¹WÏ[³)]:b¨ëÊÓ¾1ƒI}¹‚Fnñ^¥CîØÆI0¸õÃ#>SCÒi&Ñ›eÏóÓ,Nó‘´ÍRúÍQ 5éæ<ÏŽ÷‘"U:øˆE~˜±ÉCó0›Z•çsmv@Ï2ò¶6ô¯zT0Öü8-`®›ß2`¶È=s;-cœÙÅãiÎ÷f|Rª’2Ï„‡Û¨oÂΛ†´¡ üÍá¬j†·u’~Ãh·–‰€%mdõL{ÔÚÒ©ÚàHª°mh†Ð´•ѱB²§Ì@~ò¸±‰ÖIPJ­ýPÿ{oÚç'Õr¼˜Ü¬æ >ˆàÓ‹‹g§/_¿û¯ãgGod ¦£«eaò£ŠÖZ¼t¸áAÆÃ%¾žN G7?T“«OpÜÀaðÙ‰ÏV£édüpv5­ @¾ª®_aúþ@¼IÀùX<þ!Š#q,NÄ#q*‹Ä™x&~?‹çâ…8⥉b,Æóé|åõõH\ŠJ|'ð÷jóõB\‰OâÓ_7Ÿª™˜ˆßÅT\‹™˜Mf•˜‹9”7â¦ZLæ—â±K±œ|+±ú´¨*±ús.Öâ³øS|‰}Dz8°voËx»l_¾zóèâ‚e«d«Q¶øzŽ÷#Û2Þ"Ûã¹¾¯ZrE‰ŠmrÝ´#K’dõd~gy†]äùæéùÙékçñùñ€±B\¶J?ªÈåieGžz#Ïr@˜^e²Ô2—å%ˆaJ"@®×-®d¹ Wo?û ¸z48r…oÿKC?Q¶L™sUf6âÊ!¶ŒdëÃb4®>­&7—ó?gøs»eA6Ñ4­oÚ ë¸-*ê}4¹âjÇ»åf,¾L~9YÞLGmVÕ—U[Œj1>y÷êí/?‚Ï..†ŒC‚5Æž D—Í5)[¶·•Rm9>@KbIº8(ɾ#{"ž6“î—Æ½¦‰÷a´ 1þ^­‘BÅÙ÷vÕëÑ”ææfb^á›óÕ"w|¿m\ßúúCµXN®²I[+)ÓÐÆ+ÒKì—¦\á‡T]NP¹¾œŽ–Ÿ†f¼øWµ˜·5kvÑìÉÓWOÏ_‚fŸ M­êioÂWܨ¾Ífª½eîת=µ¢R_€"_"ß°%-ÕÚ@áç’õ¥-•Þ¾yó䄤a· Cû$ mâ=É"–ƒ² k³³“OôòáÉÅkbÇo×­¬£/ï‰ ÙA•²2Yõj{&µ“ƒòêäüÕcb1Üâ߉GYÞ—ù†A¯ÛÜìägŸ?9:º8n^ MFSÖ“±ü&,÷ò²?øYž oÅ;˜¤ü#œÑ5LËåhv)F+tÁwu¿Ír꩚]â¬nœ2þAÐôqº‰¦[ÂÒßÚéŽ.úfº^’Ÿ®–¸z6›Àë›Ìos•Ýöõ„9ÚÛ«øÙËç?<:#“ƒµá08†p?co±˜Ç`£|ëÀšù¢¹% Øÿ²…í<õëÇgÛ®Mkž)øóPoâÙ¶l[³]¶Ù>¥IŒÓWÆ#Ç7`«N«vòá§O¿<ŽŒºÿV{õ½è7èAý¦mKñ¦þ³Icä= ë<ûÑÑOÇ?½BƬêµX*u/ŒûøÆ“곿՗ÜM&;­¯¾yrŒñÉ‹ÅN»f‹VÞLÜW–‡Ó,ø®óÛ³-’÷¾Åkß-þ¦@Yïägß¼~õöñÏ(ú8 úX‹ßڼћAÑ¿jÄ9a7³Él·²|ë»W??:úX=?03gk^j óŠ·wñ9~0±r kÊY2®¨ûÜð•sÝfk'ïwüôám³.†Ó¶YŽÍ=í³\¸ãÞw&O{ÉlLlö!‰mÚE ¯BwMå|}g°LÔš¼ó“‹Ÿ_ÿrLª_ÓD¼·ïpLxD¹¹A€ßæk·ô»‡g§8sSŒ §­öß’b,ï1ÁXo|ÁЖãÉ„?=uTüò÷´÷Ý%ýx9ŸN¾-Ý!‰Nm¯-/}ã+[ßÛs•wÛô®g—@Ñx¾¨n‹ËìNkÕ£ãg//~$³˜84¾CïŠ|³ÕÜ£½ä±ðh8¿<üÞÁélÑi!Iüs'jw[ÀNžœýøä9èº4 aat1|»<‡ÃÜÇ=§ÎÁ_>M¾Œ§£kœ!(ÏLšÃ©ù^¾Ž kv µ-Ms×o!m>šÓ=n Ÿ¾%F¿Ë~~¦ò_Ÿ¡èê_ŸE^+ÄÅüå æÜ%Räv§¨{zÚ¥(î@‘êSäw§¨wþØ!IÊIx·¡ ó@ M¡OSØCoÓÃ.IºGRëWƒÊf¿Ô}Šâîõâº$ÙIºE’iHÂÙuIråî$uOºõŒ÷+Ee&$ß§HîNQç§KPß¶Ë–ÚÊQ$û©Ý)êÄt(R=Ó¶±eÙù¯O·(MïaGíc“.A=ÃöùôÙL ýÙïöðƒ.=}«–-ò™U›>Avw‚:iõ.A=£ÆœÅV£ÆKöÚÃcwÞ]‚zFYú­Î¿kÙ#h‡ÝNLwèÑ=“6ù¬·¹¯ÞbÑ{øêvº¸KNÏ M¾v8™‘ûäìá¨Û™Ú.9v‡åµoÏ~/ÝN_véé›sË#J›YOÂû=|t'ÇØ%èkñ‡ÞÈ÷×z¿‡‹îgò:4yëBæ³UÃ÷mÈï᤻i¸.A=£nÇCùÂÚý>ql;¹Õ¥§gÕ*÷Ò*›da‹Qï᤻Y©.Aw«ñç‡=ŠöðÒäL— ¾—šgø1åAû„Õ¬J‡"+ï/âW”{íá¨;ö.A=£ÖC++~ú¹GЮº³ãíÔ³jÝ’ŒÙ¼ïK(lñÕÏGWÕö¹ó5îšà~{äP›O&—ø9ô1LŦY(^†ðƒÚtÕü¢ ~׎¿³ºÇšcÇB§±4Gà…Ž©uŽßsÚ{ Ã;·ÂÈ„‹_‰Á/Ðð•ãEüþcp¿¸çkúø©U©úŒÞ¾cXŸpóYðkF|•éšôá8£1þ;UK endstream endobj 920 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240822094717+02'00') /ModDate (D:20240822094717+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 882 0 obj << /Type /ObjStm /N 83 /First 706 /Length 2542 /Filter /FlateDecode >> stream xÚ•ZmÜ6þ>¿Â³¤+ê]EQ\^KÑ$ r½/wèדּ;èîLn^Šî¿?Ò–mQ–¼= ‰f(‘|øeg¬VhœÕ Ñx XU#-à¨%i4r¸Æ™F+‰#4:àwë㎪±à7`Bã”jÀ˜Æƒ#ê×€vM 9zC?¡…Z…«À¡I…_¤·ø®W¨’¤Ü²€n€L"6© ´#0d ¥!üì­oÈ{8B#…òwôL‘!ì ”(Lj¤B9b‘ ÃÁ?R£#’!cDÒ ŒHZ4ŽI‡!!@éÑ>F$½· H¤ãAs8Òíq11ˆ£ÂÑ{Õ(epÄuõ1¥â@M£‘iÛ(«ýÆ#`åIЉ@3Þ‡FKÔóA4ZƒÅ˜k0_A6ÚcH> b Œ!FÔB"ŒU¤eã…Þx”š€<ºµD¥Ç¸¬´² XVƒÂÐXc-~H ¯H°¥ºB7Nô‹1ÉRÑÛ8JTÀl8+ J0 ßO!¦~1 J…üQ¤$&ÅDQa… D)ð™è×Xú ›8-1© I ôWi±ùá‡Íõ¯Oߺæús{×6×o—ý¹±ü~ìðµh¾l®ÞÝžšÿX-è+Æiâ†Ñ r‡>ûýãøÛæÇk> ñ¡RÎÂsº*¨Seð0e`ô0†á»q.Wÿ@Í>œrãâHàd¦ôËåü°Û“Þ»ÝñtnÜàçC‹Ÿé¼è¿95wç‡gí0û ?Fþ&¸Qñó±û£?nè[¦-'í©š¶¶?uθ-<0&[†Ùµ³õz^k¾•a¾ãÚ):=®ÆoW/!w)&—ÆqˆŠ» Àf¦Ú¨L;¤Ú¦Dµ™©ÖaM[»4\S¢ZÏTk³j‹¥­ˆKÏiÐP¶5hG\™ǫ̈ª0}–¶Ø6ÃJü¥Îœ¨™xµVãïX²Ñã8=æQæçdIž,ί,q"çìH³¢ ®*%GÎÉ‘Yr T¢rN¸ºëÀRƒ‰’,5ã·ÊŽ‚95ÀS؆‚Rt0³,в`;J;BÌœ ³fŠmˆ"*1s. n*°ì‰R!ˆ)Á EÝÂé&^ƒZÉ#°hØ ¬Þï0“y›áWªÝ¥ÞB! ~J‚ç95{3¾®Ÿ8÷P×t)å¾À¸ŸwnÅLÊ~ ÍÜS³–Êp… 8÷S»B¤I㬟Øú¬y·v,Îý6k·&õUj½sçÍ/f Ï Ô¬/¬ëð~mÓÃ%ëÖÙ!<·Û¬ÛŽæ. [xnµY§eš¬Ï–ÚìÜe³&Ëâ+˜{jÖRY‡â-Q§™¬!ªÌü”…¬çòvÈNͱGg쌭gôæ¹·¹ûfÍ×¥­·ÀÂÜD³š*Ê¥*daî¦Y3eVÒŒ”°Ì4룩ÖK­=i¯®n%=^dñæ;_gêVØÑ^ìõS‡(‰·®Â9•f¹t ùm ’jQ¼4ÝhýSûØáƒÎ‹·‡íËžÛãùªápm^¼ÿz8œ÷‡s÷\Ñ«ƒ…T\áCxXˆqµŽ”©X’bEb9<^]Ø=îξø·y2«ÉÔ¼!±^ˆ-‰ÍBìPtNå„Sÿ¹=m/íÃˇý¹Ýb™)®ýC”’‹—?‡ð¬âòå[»ý½½ë¾½;Ü´§îª§\“a®¨E<-üôñ!„2Ž›ÝÝc÷x8>ÑèËkn?ÿ„ó^Ôæ± µÝqåE_±ùüôæ,++Ç®ÝÞ“ [¡„Uµð,'wÇÝíëž~S êô´ßÞûNôäðCàß÷-a¿ËãÛÔÝ/íywØ}Ÿôv!¦sÝ»…XQU©çbžAsÝE´É,mϱ¿îî.Ǿ…›qDÂ2Ù*„d4_¥©Ãq‘!QÈsÿóÚÐ8cÉ}$ëFJ!¾pAÇŒI%´]ãÛà(¡-˜ºQÀ‚×Ùë´ll˜ k0tƒ:•ÐåA1 Ý,ÃA Í3;ÔÌÂâ|›¼N«ÊÀ¨Œ„LìÑÍÀ•J(ÍÀÖP–¥K%}’Sž%åØÈ".y5/ªÀêË¡ ÔŽçÿ Av¬`(è˜& tÏI±Ó¥ÅA–¹š•a©¾µ¥a*º1iæ€.K:¡Ð§5L ɱŽi¡o7ÜÓ¸Èë´ª Ùq&­…ì8›2H ”mÚÑŒ›¾%¥‚þReÊ ¦¢wLtžù4a±vOÝ–öõßúãMø\HOã]`–R!Ž—îYJÅèÊ é“.\'1G°°Ý_žsýµWeB"ruCµ&3!‘<Ôq —I×!Óá0^'!ã5xöG„`BâÝr‰¤ôp‘¢t«»J—Ö7`9 D ŒÏs§ËÍ„ª?°KrD7ñ›Ê ¢/È)!²‚œ&óÕKôé|ŧ!Ÿ¡˜Îî¢ò³!›>»BÖüÓÞUtt쀨ÍÒÂl_<²èWÅ3JËç7…ÀígWãqgk(ðr…ªá胱DÏíÍÃð®m|Û3Hè°O¢ABOÖƒŠÈ&)ñ§ 6þ´ÁÅÑÇqèú><~ùæ!}7W}^â›4?üXÿãœa4qŒ(‚ûKË òè&‚aø?¼þÇ<Ã(㨪—ÜR¬‡áÿûŸý ££‹£cXo¿kû*ºŠ› üµ’­d7Äg€/?!nŸ1°kY]X}ÛpQþv½ÿÌ›öÜ>î6ÃohæŸÛŒ¿ŽIÞQ÷;(€_aßu·Ýõ¿NÝüSš_¾uûW}Œxé˜ÜýÏ`v endstream endobj 921 0 obj << /Type /XRef /Index [0 922] /Size 922 /W [1 3 1] /Root 919 0 R /Info 920 0 R /ID [<967C1F53691A08546E75C50B94D4C06B> <967C1F53691A08546E75C50B94D4C06B>] /Length 2221 /Filter /FlateDecode >> stream xÚ%˜Yl]W†÷:wò;N<$NœÄ=ĉg'qbÇCFÇö;;ñ[®xA¢ õ¡í*UE¨ jUPhZчJ­[eoèC £T2çûí‡OkÿçÜã}öú׎sÖ²™¸ŒmU :q.çÌU}ìÒ(Œ¥Z© Í@‚6ŽÖI3²hÐNÒÌ<Úu´4   m­ƒf9¨Hœ•øç¥ã4+Á6´:´všU m/ZÍí ­ ­•æ°m?Z ÍZP‡víÍzЀví(Í]`7Z'Úš`ZÚaš{AZ7Ú!šûÀ~´ÓhiÍhgКiêÂ!´!4Ý¢‡AFÛOS:†vM×Ë´¢]Bk¢©hG»†¦®iÓѵX†¶‡¦p­M¯¥äu¡U í¦Ù zÐ4Î’^Ї¦1m ÙÐŽ i8OÓh«:šgÀ šÞM©8 Ρ©Ï;ia´54¥ñ<I\R¬A«¡9 ÆÐv ÉãàÚN4y÷"¸„¦þÉ>—Á´hÛh^hh²Þ50‰6ˆVAs L£é=dÛ"¸Žv gçfÀ,Ú,š,Ì¡Ý@£*róà&XËæÜvJ-·HùM-ÁÍUp‹êQ½Ýº°`ƒ[T*] 6¨`5+æìkºãÉ¢ÍÊÔ–Ý y¢+€ÿ D—ˆT¿xÈf‰pŽÍ1tA3HÚÉÄ÷:ÖÌM¾¢I¶i ä7ø€#V x(`®€ëv ø4`à€³–ÔB HÕ(«@Y 1PLÒ ”P Ø…˜å˜PE˜‚¥˜´˜æezæ}ˇ€ÑÃi€½Ã9Pm®¡Qo9Î2. ¬F† º0d®iB¿åfêÍ(“0\ÀÅb7™á*cÚ Ôg\0k˜tÎZ7S´vpt€à$è] ô€^Ð6yÆ 3`̰–À2XêÚ47ä—+æÚêõ2TEÀü¦r¹Iw;€LƧaÎ\ß_ô ¹d_LÝáæ%pà¦â<ŠsÌu•iwéóX+`Ü·ÁÆ&7;` ç’Kº9Pò Ê€ÌºandMÐUªéé X7÷Z«#ÚNÿ–éß“%s˜•´Õƒs‹ÏêQµ@kÊ. GKÂa £ÁÜ·us#ØÇC»‰´$4÷ÔûºªU£ ´˜ûÜ„4­ÇkK¯•˜ÑKíæ¾Ð£[XJêd?`/1I—zÍ}9è–S¼Ö¢Qpœ5÷Ì]eö.Ë`ÄÜsëº0ØØPöÑ®‚"˜©_¾9¢_L€Ip̰èÂ,¸ÈyTçÁM°€¦„êñK`-C´VÁ-4eú6X£©œ¯½à]4eƒH;…is/—Óˆ#b%`K±@d#·¶‘LG2kyßp €S`ÝìãQ=MG$ñ‘ÔF²Éy¬7÷Ó¿é¼Ù`Ä}àÀ ñ(H³ÿV›î;Ìßz™{÷¿ºÚØD̵!À QÛÜÛ̽ÿX7wÒÉ~  Á) ¥ü ОfÿÏwfµÏé$>^# ÇÜžÒ­ìCÓÄ^ Ý^‹fî¡î› ãf¾¨&ˆ£f•×ÕÄ/‡E,/€‹à’Ù+?Ò-x#ÊSf?–†iâ4ÀkKųßmýçÄK’7œ% ³Ò°OÄ>QöÁ9Q¦Y¥œ+/oÌ›}¸õpSÄCÅ»¼Ì73›ÉUKÆš›h{@•%ïu§ÿ|sÐÑÄ/ÅtL?yMÍjK~ðP‘d@¤›ïÊ·t5   ”ƒ Kzÿ£«ÌÅ:K†ï©¹Ôƒ° ì–,é–f°ß’wÔ<cà %ŸÑ…Ãà(hm 0S»@‹%¥fÝ̤_¤ Š2—°F“­A‘e¬Ø¨b·%OI?ëg¤è,8mÉW§Ô<´H™'[žlù €¹|¨5`'Ð4RÈ›'ož”ùF€‘> stream xœ…QËn1Ý÷+î2Y=B!´ªÚ"¨ÔEÔ…ã¹L¬›úÑ¿ÏõL lP5š…Ïã^”ÀÅTÀ5ˆR@e%` eS݈ L ×À ×Í»û{`s2jg2"Ü,>ˆ‚s^¥àõíÁy¸ÙÐá«k¯×ÞµIaf‚ñrÄ ü¡£ÁŒ¬¼<> 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 12 0 obj << /Length 8424 /Filter /FlateDecode >> stream xœµÝÍŽäÊa¦á}_E-í…hþÿ,-al@u/³hdÀ‚ŽÖ±a_þDÄ÷Eƒù“²jâËH&3#ždfUw ¿ü>þðñoß~Sþïc™»ãø˜Ç¥Û÷i\»mþ˜n>>þüûþøÓ·¿ûéŸþñç¿øíGßõ}_üùÛ_üÏo}·-ÿùíýïþãÿ~>~þ÷‡oCÜáã×߆iì¦õcÞ–nÚ>~üX·n_ò—üøí·bÃg×½9umøñc9ºñ8÷bôËømíæñÜ‹ ï{¼¹ýzûûM¿Œßã]œ_±á}7÷rûûM¿Œ?¦nνØð¾ïK×—·Þý2~è‡4Á¾v(·<Ù#Üäz=ƺßô×CÝÞ—{œ·<ÛcìÆËQÎ[xËm [7MÅÅ–g{ô—Wná=.·1Nݶ{[í1—™WnÁ=^޲wýå(ç-¸Ç˜áX»}= Sn9í1Ç©Zì‘¶„=楷bbË×sÐo*öЖ°Ç´vk¹G±åkÓ¹\oc™Òý:ÝF±åkÓm[¾îéëQnö¸ÞÆ:vs¡R¹åÑñ6_²Ýîq½mèúr5[íoóõ(Ûí/G9ºµÔ¡Øòlá:“‹-¼Çå6ö½ʳ-¶<Ú#Þæúr”õvëm„õ³¯ºå–G{„Û_Ž2®·{\ncìË]ñê]ny²G¶ Ç—Á¯ª¯ŸÕ0‹Â$ÿªúúY]Ó§®_U_?«Ë'ùWÕ×Ïê¼Ä7<_U_?«Sz©þªúúYø"öUõõùóòÑ×ÕZŒ.ÏÂT< /µ¸Ïa•mçi¯¯«µx¬Â _Ïg¤¯«µxŽÖˬ[‹Yõ(fÝÚ—³níïêéÑØ/+e¿®”k=Ý«¸ªÆË*ok¹þçý²¾çý¾Ÿ}ˆœœŸFo¸ï§ãÿ¥þý¥þþ¥þÿ¥¯?ï^ßÞõÓëëyu|ý SiØÏ]>Çuxñ)ãqþ:^ÂÆ zÊņϾOñçԵᓗ¯^løì[ú(üÔµáq_ÃÉ·¯ ûòyeTlxÜÃ\ŠÛ׆Ç]o“N]÷°–Öóâô†Ç}v÷O÷>}D|êÚð´Gx;RL~mxÞÃÃ9=m¸éÅøøÑòP<¾ÚpÓËó‹Î¯½ÚpÓËÇ/<ýty~ú龟Ÿ¿é:?§r~¾örþ„7ªÅµ’7Üôrþ.×õµ¼®¯—~ësß/ësßïûqñãüüzÃ}?ù9*ž_m¸ï§ãG Ÿ´:ú9õS|÷Õ½áóë«Ã»¾)Ü¿58ý9ø+¾®9§n9O.oxÜÃsQàâ ûryr¼áqsñ<¹½áqù^Ü?mxÜǵÄÅ÷a//d½áyO?‰qîiÃM/Ç×çg,ŸŸ×^Þÿ€Ë:OÚpÓËÇ/à²ç§ 7½|þ–ëü\ÊùIý<ÂtœËüœû~~|¶ëúÚ^Ö×K?ß¿¸ÇëúßôÓíK¦âùÕèç§ôÙÓï~ † Çþ‡øç™Ÿ~÷§oáÝ”>º ï ÷ø†çˆïÌþüûqŠoNÓßÕa w)L=LËåô¦ïÈcÚŽø.Ó~ćÓ‘LñLJæÊ‰¥®+-< áaæ‘©rnCxH¦Ê£5Ä´«<\CxPÆÊéÅ&+ذ§~¹é²ˆŸïð¸ô•óÃãÒW³1<.}åüÆiïŽÊùÅoŠ•Çl\B«œß?Ü­œß¸¥~¹íûÍ\ßa²ŸVÐ:oŸŸÞ†'ô´‚üRÍë$B\yH§q¯.‡)>Ôˆ‹⢄¸(!.Jˆ‹⢄¸(!.Jˆ‹OqqC\Ü7ÄÅ qqC\Ü7ÄÅ qÉO7áâçqqC\Ü7ÄÅ qqC\Ü7ÄÅ qÉs½¯ÄÅ qqC\Ü7ÄÅ qqC\Ü·&\”¯á’ã’ã’ã’ã’ã’ã’ã’ã¢Sf\Ô5ÆEqQc\Ô5ÆEqQc\üt#.z¾5ÆEqQc\Ô5ÆEqQc\ÔÏõ\´5ÆEqQc\Ô5ÆEqQc\ÔZp9¶ø7ÄE qQB\”%ÄE qQB\”%ÄŧŒ¸¸!.nˆ‹â↸¸!.nˆ‹â↸䧛pñó¸¸!.nˆ‹â↸¸!.nˆ‹â↸ä¹Þ€‹×â↸¸!.nˆ‹â↸¸!.nˆ‹[ .ƒ~uqC^ÜÐ7Æ …qCbÜÐ7DÆ •ÉçŽÌäˆÎäˆÐäˆÒäˆÔäˆÖäˆØäˆÚäˆÜ|Nò&Ï'G'G$'G4'GD'GT'Gd'Gt'G„çs4È“— Ò“#Ú“#â“#ê“#ò“#ú“#”# ”cAÃÀ‘ Rc‚Ô˜ 5&H Rc‚Ô˜ 5&H ò¹3AŽL#äÈ92AŽL#äÈ92Ay AžL#äÈ92AŽL#äÈ92AŽLP^-y™0AŽL#äÈ92AŽL#äÈ96ÿ¥•AjL¤Æ©1AjL¤Æ©1A>w&È‘ rd‚™ G&È‘ rd‚™ G&(O$È3€ rd‚™ G&È‘ rd‚™ G&È‘ ÊË … /&È‘ rd‚™ G&È‘ rd‚™ Çw­k|ŒöôHC¯Ç(þCM5‚Ô˜ 5&H Rc‚Ô˜ 5&H Rc‚|îL#äÈ92AŽL#䈞åmˆk`OKx–DZx–Q¨ÓØ#½H­{üsÚË€å郀yþ0`Ž ˜#æÈ€92`Ž ˜#æÈ€9"`ïŒÊkìoxùà5Ⱦ9²oŽì›#ûæÈ¾9²oŽì›#û戾 sÿu%LScÀÔ05LScÀÔ05Ìç΀92`Ž ˜#æÈ€92`ŽïáÏð¾>,™ðßiª{ì;Àp‰y,–§æùÀ92`Ž ˜#æÈ€92`Ž ˜#æø0|yÈk¬0¯AÌ‘sdÀ0GÌ‘sdÀ0Ç `G¼'ÀR«–Z°Ô*€¥V,µ `©UK­XjÀtîÀ+€)VS¬¦XL±˜b`Û˜ÆVóôaÀ4*€)VS¬¦XL±˜b0Å `ŠÀÛókLk°˜b0Å `ŠÀ+€)VS¬¦XL‘ j€©1`j ˜¦Æ€©1`j ˜¦Æ€ùÜ0GÌ‘sdÀ0G̱ 0mÌc°<}0ÏÌ‘sdÀ0GÌ‘sdÀ0Ç&ÀòkÌksdÀ0GÌ‘sdÀ0GÌ‘[×ø—ë05LScÀÔ05LScÀÔ0Ÿ;æÈ€92`Ž ˜#æÈ€96æ±M€y,–§æùÀ92`Ž ˜#æÈ€92`Ž ˜#æØX^c-€y 2`Ž ˜#æÈ€92`Ž ˜#æÈ€92`ú% ˜¦Æ€©1`j ˜¦Æ€©1`j ˜ÏsdÀ0GÌ‘sdÀ›óØ&À<–ËÓóüaÀ0GÌ‘sdÀ0GÌ‘sl,¯±À¼0GÌ‘sdÀ0GÌ‘sdÀ°}ŠÿÍ€©1`j ˜¦Æ€©1`j ˜¦Æ€ùÜ0GÌ‘sdÀ0G̱ 0mÌc°<}0ÏÌ‘sdÀ0GÌ‘sdÀ0Ç&ÀòkÌksdÀ0GÌ‘sdÀ0GÌ‘;ÆH¦Æ€©1`j ˜¦Æ€©1`j ˜æsgÀ0GÌ‘sdÀ0Ç&À<¶ 0eÀòôAÀ<0GÌ‘sdÀ0GÌ‘sdÀ›Ëk¬0¯AÌ‘sdÀ0GÌ‘sdÀ0Glì‡8/07Ì sCÀÜ07Ì sCÀܰ|îXŽXŽXŽXŽXŽXŽ-€å±-€å±Øçô!ÀòüAÀrDÀrDÀrDÀrDÀrDÀrDÀrDÀrlìs5–× –#–#–#–#–#–#–#–c°#þ“¹ÀR«–Z°Ô*€¥V,µ `©UK­XjÀtîÀ+€)VS¬¦XL±˜b`Û˜ÆVóôaÀ4*€)VS¬¦XL±˜b0Å `ŠÀÛókLk°˜b0Å `ŠÀ+€)VS¬¦XL‘ '8-ÀÔ05LScÀÔ05LScÀ|î ˜#æÈ€92`Ž ˜#æØ˜Ç6æ± Xž>˜çæÈ€92`Ž ˜#æÈ€92`Ž ˜c`yµæ5È€92`Ž ˜#æÈ€92`Ž ˜#æÈ€Åßë[LScÀÔ05LScÀÔ05Ìç΀92`Ž ˜#æÈ€92`ŽM€yl`Ë€å郀yþ0`Ž ˜#æÈ€92`Ž ˜#æÈ€96–×X `^ƒ ˜#æÈ€92`Ž ˜#æÈ€92`ŽoÿªdxÞÂì Öfï´Ä_Åɾ©±ojì›û¦Æ¾©±ojì›û¦Æ¾ùÜÙ7GöÍ‘}sdßÙ7GöÍñoh”Ǿó môXö-OôÍó‡}sdßÙ7GöÍ‘}sdßÙ7GöÍñoô—X?×X‹o^ƒì›#ûæÈ¾9²oŽì›#ûæÈ¾9²oŽo}£™MNÍ75öM}ScßÔØ75öM}ScßÔØ7Ÿ;ûæÈ¾9²oŽì›#ûæÈ¾9¾õ^Å<öo¸Š<–}ËÓ}óüaßÙ7GöÍ‘}sdßÙ7GöÍ‘}s|ûWÁáŸbø\c-¾y ²oŽì›#ûæÈ¾9²oŽì›#ûæÈ¾96ù¶ŒñeßÔØ75öM}ScßÔØ75öM}Scß|îì›#ûæÈ¾9²oŽì›#ûæØä›Ç6ùæ±ì[ž>è›çûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oyµøæ5Ⱦ9²oŽì›#ûæÈ¾9²oŽì›#ûæØäÛ:ÄUȾ©±ojì›û¦Æ¾©±ojì›û¦Æ¾ùÜÙ7GöÍ‘}sdßÙ7GöͱÉ7mòÍcÙ·<}Ð7ÏöÍ‘}sdßÙ7GöÍ‘}sdßÙ7Ç&ßòkñÍk}sdßÙ7GöÍ‘}sdßÙ7Göͱͷ#N„Šo©U|K­â[jßR«ø–ZÅ·Ô*¾¥Vñ-µŠo:÷ŠoŠß+¾)V|S¬ø¦XñM±Í7móMc+¾yú°oš?ß+¾)V|S¬ø¦XñM±â›bÅ7ÅŠoŠm¾y5ù¦5XñM±â›bÅ7ÅŠoŠß+¾)V|S¬ø¦Øä[¸Å¥æ›û¦Æ¾©±ojì›û¦Æ¾©±ojì›Ï}sdßÙ7GöÍ‘}sdß›|óØ&ß<–}ËÓ}óüaßÙ7GöÍ‘}sdßÙ7GöÍ‘}slò-¯±ß¼Ù7GöÍ‘}sdßÙ7GöÍ‘}sdß›|Û·ðßßÔØ75öM}ScßÔØ75öM}Scß|îì›#ûæÈ¾9²oŽì›#ûæØä›Ç6ùæ±ì[ž>è›çûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oyµøæ5Ⱦ9²oŽì›#ûæÈ¾9²oŽì›#ûæØäÛ±tÛTñM}ScßÔØ75öM}ScßÔØ75öÍçξ9²oŽì›#ûæÈ¾9²oŽM¾yl“o˾å郾yþ°oŽì›#ûæÈ¾9²oŽì›#ûæÈ¾96ù–×X‹o^ƒì›#ûæÈ¾9²oŽì›#ûæÈ¾9²oŽ-¾MýÜMßÜÐ77ôÍ }sCßÜÐ77ôÍ }sCßò¹£o9¢o9¢o9¢o9¢o9¢o9¶ø–Ƕø–Ç¢oŸÓ‡|Ëó}Ë}Ë}Ë}Ë}Ë}Ë}Ë}˱ŷÏ5Öà[^ƒè[Žè[Žè[Žè[Žè[Žè[Žè[Žè[ŽM¾ cwÔ|ScßÔØ75öM}ScßÔØ75öM}ó¹³oŽì›#ûæÈ¾9²oŽì›c“oÛä›Ç²oyú ož?ì›#ûæÈ¾9²oŽì›#ûæÈ¾9²oŽM¾å5Öâ›× ûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oãï û¦Æ¾©±ojì›û¦Æ¾©±ojì›ûæsgßÙ7GöÍ‘}sdßÙ7Ç&ß<¶É7eßòôAß<Ø7GöÍ‘}sdßÙ7GöÍ‘}sdß›|Ëk¬Å7¯AöÍ‘}sdßÙ7GöÍ‘}sdßÙ7Ç&ߦ>ÎLöM}ScßÔØ75öM}ScßÔØ75öÍçξ9²oŽì›#ûæÈ¾9²oŽM¾yl“o˾å郾yþ°oŽì›#ûæÈ¾9²oŽì›#ûæÈ¾96ù–×X‹o^ƒì›#ûæÈ¾9²oŽì›#ûæÈ¾9²oŽm¾¥§â[jßR«ø–ZÅ·Ô*¾¥Vñ-µŠoz‚Ù·Ô*¾éÜ+¾)V|S¬ø¦XñM±â›bÅ7Å6ß4¶Í7­øæéþiþT|S¬ø¦XñM±â›bÅ7ÅŠoŠß+¾)¶ùæ5Öä›Ö`Å7ÅŠoŠß+¾)V|S¬ø¦XñM±â›b“oóÖM5ßÔØ75öM}ScßÔØ75öM}Scß|îì›#ûæÈ¾9²oŽì›#ûæØä›Ç6ùæ±ì[ž>è›çûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oyµøæ5Ⱦ9²oŽì›#ûæÈ¾9²oŽì›#ûæØäÛ²tGÍ75öM}ScßÔØ75öM}ScßÔØ7Ÿ;ûæÈ¾9²oŽì›#ûæÈ¾96ùæ±M¾y,û–§úæùþ9²oŽì›#ûæÈ¾9²oŽì›#ûæØä[^c-¾y ²oŽì›#ûæÈ¾9²oŽì›#ûæÈ¾96ù¶ÎÝ2T|ScßÔØ75öM}ScßÔØ75öM}ó¹³oŽì›#ûæÈ¾9²oŽì›c“oÛä›Ç²oyú ož?ì›#ûæÈ¾9²oŽì›#ûæÈ¾9²oŽM¾å5Öâ›× ûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oÛÔ 5ßÔØ75öM}ScßÔØ75öM}Scß|îì›#ûæÈ¾9²oŽì›#ûæØä›Ç6ùæ±ì[ž>è›çûæÈ¾9²oŽì›#ûæÈ¾9²oŽì›c“oyµøæ5Ⱦ9²oŽì›#ûæÈ¾9²oŽì›#û戾ýæãßÒÿ~þÃùár_Ƈëïþ!¼Ñøøá_Ò¦Ÿ-ñÏôGúzÙº¥ë2>…?üøñ7ãö·?üáÛÿø!ÝòíÐuí†bèúxèC—ÇC÷©›Š¡óã¡ÇÐíÇyèôxèÐ÷ñé;¿clXÎÅØáùØaëÖóØ¡>v\»q?÷;ÆNs·ŸÇ>n‡yêæóÐi>v£™§±Ï§ã°ÆóØï¸Ïkzé9}>!‡mëöbìó9ìk7c¿cJá¿‹±Ï§äØOåóØçS2`ÜÅØçÓjûø*sš’ÏçF|Uœ‹±Çó±õ~9/£çójœ×n-Æ~ÇqÃ[ð±ûç»NÝ^Œ}>ŸÇmìæù<öù|÷¡ë‹±Ïçó¸§ ÜÓØçó9^ ŒÅØçóyê×xrû|>OÃÒÍç±ÏŸÞiœÃçièógwšÆn=}>!§yˆ—Â_CŸ?·S¸þÞÇÓÐçOm¼º™ÏCŸ?³Óºuýyèw<9Ûҭ硟s¢áhý¼ÙŸé&!¼ÅkîxÕWá|çgrÙëçu7tãßÀ¯>šwCÃ+e¸p«>‡wC×1¾èTgÎÝÐèÊTŸ¯wC÷±›nVÉÝÐcŒ¿©¢º6ï†ý¿ÉS7ávp|©Ûo0º¦Ô8ß(x;8Lªq¸á÷vp˜VÃvãþíà0±†éæçvp˜ZCóJw;8L®~½y‰½¦W?Þ¼¶ßï Ž»‹Š[9ú!þ‚úÕÌíà! n.£îÍâEzýúívðÏ7Ž·ƒÃKÐÞß\±Þ^†ø›³ê—Ê·ƒ×!þ¥×ú5úíàmˆï¦êon‡ë¢u¹yWr;8̰u¼y;tûf˜_a¾û^Oa‚ù%†ßþÝ¿² ñÖúûÎÛÁa‚ùe†ßðÞÌ/4üNûvp˜`sóÿvpüW ×›n‡ æWþHãvp˜`ãÝG)·ƒÃ—ËG8ùéüaÜ?&]ã…v—/–t½5÷ý秺{Üpý,nã'x˼¼Þ ¥£†·7kãQ=´å¨á5fl<ª‡¶uïãõkÓQ=´é¨G¼âj;ª†¶õØâkiÓQ=´å¨Cx¸46m:nx÷8ìï;¦ã®m:î8uÛƒãâùzlÓqÃ…éÔz¾ûî¸ÇUÌߨ~ÃöÚqã·•–­Ãס× g5†7ŸS5îSü0¾õëÙ9æ_¥^‰ú5Åý+@9ú×ë½{fèYÍ¿ºªåYÍc[fSþ•2MÇõئãúW=4×c›Žë‚½é¸ÛvÜ#ýÓÈmÇÕØ¦ãúŸ,m:®Ç6×ÿ”`Óq=¶é¸þ'¾šŽë±-ÇÍÿôNËqóئãúŸÄh:®Ç6×U½é¸Ût\ÿÒ¦ãzlÛqõW»ÚŽ«±MÇõ_¹h:®Ç6×? Ýt\m:®D±é¸Ût\ÿèPÓq=û=Ÿ’Oz—9¤÷–§·™Ú0‡‡5ýÍê!¾ Šï3ÿþW¿êþþ׿Êo6ßœbÞÏ„7ö[¼ðM¤»ùâ×î^xôç%ß¼ïÜ5º¶Ìw-þÖú×»kºùt×¾µôþþÙ#?ïñÿâø_üþ„s£Ù‘O[úEï­sÓÍÇûöóŸýŽï½É÷.\º.û_ïÞéæã½û¡¸wðùýÀÑܧ÷-ñ‡«Âÿé¦ÇxMô²<á÷ˆæÁË t®>xŒg0¥_–¹NC9xN?žp38ýÜÛ´¤ ®Æ‹Á[üVÂÝà%žÓ_·òn¯½~—b}pú½žs:ç­_ËÁSúÁ—úà©P,}|´·±¼ÛáYû€Móà û'þ>§’»¼÷éŽç¼…Ë®óà-}&3x–oS<þv”ç¼Íé»ö7ƒÓ£ç¸&úrð?V¿¶}þFÕ©|Àâ'EóÝàeÚÒC¿_&Ix7»ÞÎí%=`Û®ßåz¼¦oÒÖ¯iíïéaÛrUíég[ïÃÏæÁGú.èÍ`ú峟ƒ—ôC7ƒÃub¼Ãñ&Žðàƒßa°%IŽtü£œžñý{ ö´ž1®ªcÙÊÁï0ØÓÜ:Ò?ʹ=õï08ÒbÔËäQ.É`Ó â€88Þí}ËÁï0ˆRüæö4¼Ã žg¼û‘/ßc —£Á¯-Iâ»…{ Žcý<þVNÏøó!÷xp:óµ\UÓøNùzyÀ¦wxpz¶×¾¼ÛÓ; 4XólY/G~‡~ßý>Ås^.3lz‡§§j>Ê»=¿Ã@ƒ7].C9ø<Ž~(¿Ã@ƒ×}ôKÏyðÛ+ƒcŸ?_n¦ o¯ ŽmýÔ;<±åà·¬z’_™œ¿½2ð¥vš$á%¢üƒt)3§×pQ~‹Áã”Î|œÊõüöÊ@bOéœÇËóüöÊ`O aLÏóp\¿Ã`_§ÏK¹áâöÛ+ƒ}Žƒ‡à°”ƒß^h= ‰¡áàÛ+ƒmMwxèið; ¶¤W¿-4øí•ü<øí•ýµ ÏÁˆÁÃ’aÖ;‰ÏŸgÃo«¿½}îð›ã÷ããÄçxü÷›ñÓi<~£úÍøõ4âÍøãõ ó;¹ïý¬c¼(mˆßеïK<^zÇýÿþôÓïÿôÓüôñãÿù÷?ÿëÑqóíÿg°~ûendstream endobj 13 0 obj << /Type /XRef /Length 38 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Info 2 0 R /Root 3 0 R /Size 14 /ID [<84301df4128a70f8eb08236e8b4e5e19><84301df4128a70f8eb08236e8b4e5e19>] >> stream xœcb&F~ñ‰ Èc$†øÏ󃉫¨CÉa?b endstream endobj startxref 11798 %%EOF NMF/inst/doc/heatmaps.Rnw0000644000176200001440000004470414334451255014725 0ustar liggesusers%\VignetteIndexEntry{NMF: generating heatmaps} %\VignetteDepends{utils,NMF,RColorBrewer,knitr} %\VignetteKeyword{aplot} %\VignetteCompiler{knitr} %\VignetteEngine{knitr::knitr} \documentclass[a4paper]{article} %\usepackage[OT1]{fontenc} \usepackage[colorlinks]{hyperref} \usepackage{a4wide} \usepackage{xspace} \usepackage[all]{hypcap} % for linking to the top of the figures or tables % add preamble from pkgmaker <>= library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") @ \newcommand{\nmfpack}{\pkgname{NMF}} \newcommand{\MATLAB}{MATLAB\textsuperscript{\textregistered}\xspace} \newcommand{\refeqn}[1]{(\ref{#1})} % REFERENCES \usepackage[citestyle=authoryear-icomp , doi=true , url=true , maxnames=1 , maxbibnames=15 , backref=true , backend=bibtex]{biblatex} \AtEveryCitekey{\clearfield{url}} <>= latex_bibliography('NMF') @ \newcommand{\citet}[1]{\textcite{#1}} \renewcommand{\cite}[1]{\parencite{#1}} \DefineBibliographyStrings{english}{% backrefpage = {see p.}, % for single page number backrefpages = {see pp.} % for multiple page numbers } % % boxed figures \usepackage{float} \floatstyle{boxed} \restylefloat{figure} \usepackage{array} \usepackage{tabularx} \usepackage{mathabx} \usepackage{url} \urlstyle{rm} % use cleveref for automatic reference label formatting \usepackage[capitalise, noabbrev]{cleveref} % define commands for notes \usepackage{todonotes} \newcommand{\nbnote}[1]{\ \bigskip\todo[inline, backgroundcolor=blue!20!white]{\scriptsize\textsf{\textbf{NB:} #1}}\ \\} % put table of contents on two columns \usepackage[toc]{multitoc} \setkeys{Gin}{width=0.95\textwidth} \begin{document} <>= #options(prompt=' ') #options(continue=' ') set.seed(123456) @ \title{Generating heatmaps for Nonnegative Matrix Factorization\\ \small Package \nmfpack\ - Version \Sexpr{utils::packageVersion('NMF')}} \author{Renaud Gaujoux} \maketitle \begin{abstract} This vignette describes how to produce different informative heatmaps from NMF objects, such as returned by the function \code{nmf} in the \citeCRANpkg{NMF}. The main drawing engine is implemented by the function \code{aheatmap}, which is a highly enhanced modification of the function \code{pheatmap} from the \CRANpkg{pheatmap}, and provides convenient and quick ways of producing high quality and customizable annotated heatmaps. Currently this function is part of the package \nmfpack, but may eventually compose a separate package on its own. \end{abstract} {\small \tableofcontents} \section{Preliminaries} \subsection{Quick reminder on NMF models} Given a nonnegative target matrix $X$ of dimension $n\times p$, NMF algorithms aim at finding a rank $k$ approximation of the form: $$ X \approx W H, $$ where $W$ and $H$ are nonnegative matrices of dimensions $n\times k$ and $k\times p$ respectively. The matrix $W$ is the basis matrix, whose columns are the basis components. The matrix $H$ is the mixture coefficient or weight matrix, whose columns contain the contribution of each basis component to the corresponding column of $X$. We call the rows of $H$ the basis profiles. \subsection{Heatmaps for NMF} Because NMF objects essentially wrap up a pair of matrices, heatmaps are convenient to visualise the results of NMF runs. The package \nmfpack provides several specialised heatmap functions, designed to produce heatmaps with sensible default configurations according to the data being drawn. Being all based on a common drawing engine, they share almost identical interfaces and capabilities. The following specialised functions are currently implemented: \begin{description} \item[\code{basismap}] draws heatmaps of the basis matrix \item[\code{coefmap}] draws heatmaps of the mixture coefficient matrix \item[\code{consensusmap}] draws heatmaps of the consensus matrix, for results of multiple NMF runs. \end{description} \subsection{Heatmap engine} All the above functions eventually call a common heatmap engine, with different default parameters, chosen to be relevant for the given underlying data. The engine is implemented by the function \code{aheatmap}. Its development started as modification of the function \code{pheatmap} from the \pkgname{pheatmap} package. The initial objective was to improve and increase its capabilities, as well as defining a simplified interface, more consistent with the R core function \code{heatmap}. We eventually aim at providing a general, flexible, powerful and easy to use engine for drawing annotated heatmaps. The function \code{aheatmap} has many advantages compared to other heatmap functions such as \code{heatmap}, \code{gplots::heatmap2}, \code{heatmap.plus::heatmap.plus} , or even \code{pheatmap}: \begin{itemize} \item Annotations: unlimited number of annotation tracks can be added to \emph{both} columns and rows, with automated colouring for categorical and numeric variables. \item Compatibility with both base and grid graphics: the function can be directly called in drawing contexts such as grid, mfrow or layout. This is a feature many R users were looking for, and that was strictly impossible with base heatmaps. \item Legends: default automatic legend and colouring; \item Customisation: clustering methods, annotations, colours and legend can all be customised, even separately for rows and columns; \item Convenient interface: many arguments provide multiple ways of specifying their value(s), which speeds up developping/writing and reduce the amount of code required to generate customised plots (e.g. see \cref{sec:colour_spec}). \item Aesthetics: the heatmaps look globally cleaner, the image and text components are by default well proportioned relatively to each other, and all fit within the graphic device. \end{itemize} \subsection{Data and model} \label{sec:data} For the purpose of illustrating the use of each heatmap function, we generate a random target matrix, as well as some annotations or covariates: <>= # random data that follow an 3-rank NMF model (with quite some noise: sd=2) X <- syntheticNMF(100, 3, 20, noise=2, factors = TRUE) Xmat <- X[[1]] # row annotations and covariates n <- nrow(Xmat) d <- rnorm(n) e <- unlist(mapply(rep, c('X', 'Y', 'Z'), 10)) e <- c(e, rep(NA, n-length(e))) rdata <- data.frame(Var=d, Type=e) # column annotations and covariates p <- ncol(Xmat) a <- sample(c('alpha', 'beta', 'gamma'), p, replace=TRUE) # define covariates: true groups and some numeric variable c <- rnorm(p) # gather them in a data.frame covariates <- data.frame(a, X$pData, c) @ %\SweaveOpts{fig.width=14,fig.height=7} <>= library(knitr) opts_chunk$set(fig.width=14, fig.height=7) @ Note that in the code above, the object \code{X} returned by \code{syntheticNMF} \emph{really is} a matrix object, but wrapped through the function \code{ExposedAttribute} object, which exposes its attributes via a more friendly and access controlled interface \code{\$}. Of particular interests are attributes \code{'pData'} and \code{'fData'}, which are lists that contain a factor named \code{'Group'} that indicates the true underlying clusters. These are respectively defined as each sample's most contrbuting basis component and the basis component to which each feature contributes the most. They are useful to annotate heatmaps and assess the ability of NMF methods to recover the true clusters. As an example, one can conveniently visualize the target matrix as a heatmap, with or without the relevant sample and feature annotations, using simple calls to the \code{aheatmap} function: <>= par(mfrow=c(1,2)) aheatmap(Xmat, annCol=covariates, annRow=X$fData) aheatmap(Xmat) @ Then, we fit an NMF model using multiple runs, that will be used throughtout this vignette to illustrate the use of NMF heatmaps: <>= res <- nmf(Xmat, 3, nrun=10) res @ \nbnote{To keep the vignette simple, we always use the default NMF method (i.e. \code{'brunet'}), but all steps could be performed using a different method, or multiple methods in order to compare their perfromances.} \section{Mixture Coefficient matrix: \texttt{coefmap}} The coefficient matrix of the result can be plotted using the function \code{coefmap}. The default behaviour for multiple NMF runs is to add two annotation tracks that show the clusters obtained by the best fit and the hierarchical clustering of the consensus matrix\footnote{The hierarchical clustering is computed using the consensus matrix itself as a similarity measure, and average linkage. See \code{?consensushc}.}. In the legend, these tracks are named \emph{basis} and \emph{consensus} respectively. For single NMF run or NMF model objects, no consensus data are available, and only the clusters from the fit are displayed. <>= opar <- par(mfrow=c(1,2)) # coefmap from multiple run fit: includes a consensus track coefmap(res) # coefmap of a single run fit: no consensus track coefmap(minfit(res)) par(opar) @ \nbnote{Note how both heatmaps were drawn on the same plot, simply using the standard call to \code{par(mfrow=c(1,2)}. This is impossible to achieve with the R core function \code{heatmap}. See \cref{sec:aheatmap} for more details about compatibility with base and grid graphics.} By default: \begin{itemize} \item the rows are not ordered; \item the columns use the default ordering of \code{aheatmap}, but may easily be ordered according to the clusters defined by the dominant basis component for each column with \code{Colv="basis"}, or according to those implied by the consensus matrix, i.e. as in \code{consensusmap}, with \code{Colv="consensus"}; \item each column is scaled to sum up to one; \item the color palette used is \code{'YlOrRd'} from the \citeCRANpkg{RColorBrewer}, with 50 breaks. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= Rowv = NA Colv = TRUE scale = 'c1' color = 'YlOrRd:50' annCol = predict(object) + predict(object, 'consensus') @ If the ordering does not come from a hierarchical clustering (e.g., if \code{Colv='basis'}), then no dendrogram is displayed. The default behaviour of \code{aheatmap} can be obtained by setting arguments \code{Rowv=TRUE, Colv=TRUE, scale='none'}. \medskip The automatic annotation tracks can be hidden all together by setting argument \code{tracks=NA}, displayed separately by passing only one of the given names (e.g. \code{tracks=':basis'} or \code{tracks='basis:'} for the row or column respectively), and their legend names may be changed by specifying e.g. \code{tracks=c(Metagene=':basis', 'consensus')}. Beside this, they are handled by the heatmap engine function \code{aheatmap} and can be customised as any other annotation tracks -- that can be added via the same argument \code{annCol} (see \cref{sec:aheatmap} or \code{?aheatmap} for more details). <>= opar <- par(mfrow=c(1,2)) # removing all automatic annotation tracks coefmap(res, tracks=NA) # customized plot coefmap(res, Colv = 'euclidean' , main = "Metagene contributions in each sample", labCol = NULL , annRow = list(Metagene=':basis'), annCol = list(':basis', Class=a, Index=c) , annColors = list(Metagene='Set2') , info = TRUE) par(opar) @ \nbnote{The feature that allows to display some information about the fit at the bottom of the plot via argument \code{info=TRUE} is still experimental. It is helpful mostly when developing algorithms or doing an analysis, but would seldom be used in publications.} \section{Basis matrix: \texttt{basismap}} The basis matrix can be plotted using the function \code{basismap}. The default behaviour is to add an annotation track that shows for each row the dominant basis component. That is, for each row, the index of the basis component with the highest loading. This track can be disabled by setting \code{tracks=NA}, and extra row annotations can be added using the same argument \code{annRow}. <>= opar <- par(mfrow=c(1,2)) # default plot basismap(res) # customized plot: only use row special annotation track. basismap(res, main="Metagenes", annRow=list(d, e), tracks=c(Metagene=':basis')) par(opar) @ By default: \begin{itemize} \item the columns are not ordered; \item the rows are ordered by hierarchical clustering using default distance and linkage methods (\code{'eculidean'} and \code{'complete'}); \item each row is scaled to sum up to one; \item the color palette used is \code{'YlOrRd'} from the \citeCRANpkg{RColorBrewer}, with 50 breaks. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= Colv = NA scale = 'r1' color = 'YlOrRd:50' annRow = predict(object, 'features') @ \section{Consensus matrix: \texttt{consensusmap}} When doing clustering with NMF, a common way of assessing the stability of the clusters obtained for a given rank is to consider the consensus matrix computed over multiple independent NMF runs, which is the average of the connectivity matrices of each separate run \footnote{Hence, stability here means robustness with regards to the initial starting point, and shall not be interpreted as in e.g. cross-validation/bootstrap analysis. However, one can argue that having very consistent clusters across runs somehow supports for a certain regularity or the presence of an underlying pattern in the data.}. This procedure is usually repeated over a certain range of factorization ranks, and the results are compared to identify which rank gives the best clusters, possibly in the light of some extra knowledge one could have about the samples (e.g. covariates). The functions \code{nmf} and \code{consensusmap} make it easy to implement this whole process. \nbnote{The consensus plots can also be generated for fits obtained from single NMF runs, in which case the consensus matrix simply reduces to a single connectivity matrix. This is a binary matrix (i.e. entries are either 0 or 1), that will always produce a bi-colour heatmap, and by default clear blocks for each cluster.} \subsection{Single fit} In section \cref{sec:data}, the NMF fit \code{res} was computed with argument \code{nrun=10}, and therefore contains the best fit over 10 runs, as well as the consensus matrix computed over all the runs \footnote{If one were interested in keeping the fits from all the runs, the function \code{nmf} should have been called with argument \code{.options='k'}. See section \emph{Options} in \code{?nmf}. The downstream hanlding of the result would remain identical.}. This can be ploted using the function \code{consensusmap}, which allows for the same kind of customization as the other NMF heatmap functions: <>= opar <- par(mfrow=c(1,2)) # default plot consensusmap(res) # customized plot consensusmap(res, annCol=covariates, annColors=list(c='blue') , labCol='sample ', main='Cluster stability' , sub='Consensus matrix and all covariates') par(opar) @ By default: \begin{itemize} \item the rows and columns of the consensus heatmap are symmetrically ordered by hierarchical clustering using the consensus matrix as a similarity measure and average linkage, and the associated dendrogram is displayed; \item the color palette used is the reverse of \code{'RdYlBu'} from the \citeCRANpkg{RColorBrewer}. \end{itemize} In term of arguments passed to the heatmap engine \code{aheatmap}, these default settings translate as: <>= distfun = function(x) as.dist(1-x) # x being the consensus matrix hclustfun = 'average' Rowv = TRUE Colv = "Rowv" color = '-RdYlBu' @ \subsection{Single method over a range of ranks} The function \code{nmf} accepts a range of value for the rank (argument \code{rank}), making it fit NMF models for each value in the given range \footnote{Before version 0.6, this feature was provided by the function \code{nmfEstimateRank}. From version 0.6, the function \code{nmf} accepts ranges of ranks, and internally calls the function \code{nmfEstimateRank} -- that remains exported and can still be called directly. See documentation \code{?nmfEstimateRank} for more details on the returned value.}: <>= res2_7 <- nmf(Xmat, 2:7, nrun=10, .options='v') class(res2_7) @ The result \code{res2\_7} is an S3 object of class \code{'NMF.rank'}, that contains -- amongst other data -- a list of the best fits obtained for each value of the rank in range $\ldbrack 2, 7\rdbrack]$. The method of \code{consensusmap} defined for class \code{'NMF.rank'}, which plots all the consensus matrices on the same plot: <>= consensusmap(res2_7) @ \nbnote{ The main title of each consensus heatmap can be customized by passing to argument \code{main} a character vector or a list whose elements specify each title. All other arguments are used in each internal call to consensusmap, and will therefore affect all the plots simultaneously. The layout can be specified via argument \code{layout} as a numeric vector giving the number of rows and columns in a \code{mfrow}-like way, or as a matrix that will be passed to R core function \code{layout}. See \code{?consensusmap} for more details and example code. } \subsection{Single rank over a range of methods} If one is interested in comparing methods, for a given factorization rank, then on can fit an NMF model for each method by providing the function \code{nmf} with a \code{list} in argument \code{method}: <>= res_methods <- nmf(Xmat, 3, list('lee', 'brunet', 'nsNMF'), nrun=10) class(res_methods) @ The result \code{res\_methods} is an S4 object of class \code{NMFList}, which is essentially a named list, that contains each fits and the CPU time required by the whole computation. As previously, the sequence of consensus matrices is plotted with \code{consensusmap}: <>= consensusmap(res_methods) @ \section{Generic heatmap engine: \texttt{aheatmap}} \label{sec:aheatmap} This section still needs to be written, but many examples of annotated heatmaps can be found in the demos \code{'aheatmap'} and \code{'heatmaps'}: <>= demo('aheatmap') # or demo('heatmaps') @ These demos and the plots they generate can also be browsed online at \url{http://nmf.r-forge.r-project.org/_DEMOS.html}. \section{Session Info} <>= toLatex(sessionInfo()) @ \printbibliography[heading=bibintoc] \end{document} NMF/inst/doc/NMF-vignette.R0000644000176200001440000004337414661566336015035 0ustar liggesusers## ----pkgmaker_preamble, echo=FALSE, results='asis'---------------------------- library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") ## ----bibliofile, echo=FALSE, results='asis'----------------------------------- latex_bibliography('NMF') ## ----options, echo=FALSE------------------------------------------------------ set.seed(123456) library(knitr) # Helper functions: hook_try <- function(before, options, envir){ .try_defined <- FALSE # remove hacked version of try if( !before ){ if( .try_defined && exists('try', envir = envir, inherits = FALSE) ){ remove(list = 'try', envir = envir) } .try_defined <<- FALSE return(invisible()) } if( !is.null(options$try) ){ # signal do.signal <- isFALSE(options$try) if( isManualVignette() && isTRUE(options$try) ){ do.signal <- TRUE } # define hacked version of try() .try <- try_message(do.signal) assign('try', .try, envir) .try_defined <<- TRUE } } chunkOutputHook <- function(name, hook, type = c('output', 'source', 'chunk')){ type <- match.arg(type) function(){ if( !requireNamespace('knitr', quietly = TRUE) ) stop("Package 'knitr' is required to setup knit hook '", name, "'") .hook_bkp <- NULL function(before, options, envir){ # do nothing if the option is not ON if( is.null(options[[name]]) ) return() # set/unset hook if( before ){ # store current hook function if( is.null(.hook_bkp) ) .hook_bkp <<- knitr::knit_hooks$get(type) # define hook wrapper hook_wrapper <- function(x, options){ res <- .hook_bkp(x, options) hook(res, options) } args <- list() args[[type]] <- hook_wrapper do.call(knitr::knit_hooks$set, args) }else{ args <- list() args[[type]] <- .hook_bkp do.call(knitr::knit_hooks$set, args) .hook_bkp <<- NULL } } } } hook_backspace <- chunkOutputHook('backspace', function(x, options){ if( !isTRUE(options$backspace) ) x str_bs(x) } ) str_bs <- function(x){ # remove leading backspaces x <- gsub("^\b+", "", x) # remove backspaces at beginning of line x <- gsub("\n\b+", '\n', x) while( length(grep('\b', x, fixed = TRUE)) ) x <- gsub('[^\n\b][\b]', '', x) x } isManualVignette <- function(){ isTRUE(getOption('R_RUNNING_MANUAL_VIGNETTE')) } try_message <- function(signal = FALSE){ function(expr){ tryCatch(expr, error = function(e){ if( signal ) message(e) else message('Error: ', conditionMessage(e)) invisible() }) } } knit_hooks$set(try = hook_try, backspace = hook_backspace()) ## ----load_library, echo=FALSE, include=FALSE---------------------------------- # Load library(NMF) # limit number of cores used nmf.options(cores = 2) ## ----load_library_fake, eval=FALSE-------------------------------------------- # # Install # install.packages('NMF') # # Load # library(NMF) ## ----updateObject, eval=FALSE------------------------------------------------- # # eg., load from some RData file # load('object.RData') # # update class definition # object <- nmfObject(object) ## ----features, echo=FALSE----------------------------------------------------- nalgo <- length(nmfAlgorithm()) nseed <- length(nmfSeed()) ## ----nmfAlgorithm------------------------------------------------------------- # list all available algorithms nmfAlgorithm() # retrieve a specific algorithm: 'brunet' nmfAlgorithm('brunet') # partial match is also fine identical(nmfAlgorithm('br'), nmfAlgorithm('brunet')) ## ----nmfSeed------------------------------------------------------------------ # list all available seeding methods nmfSeed() # retrieve a specific method: 'nndsvd' nmfSeed('nndsvd') # partial match is also fine identical(nmfSeed('nn'), nmfSeed('nndsvd')) ## ----show_Rversions----------------------------------------------------------- nmfAlgorithm(all=TRUE) # to get all the algorithms that have a secondary R version nmfAlgorithm(version='R') ## ----perftable_setup, cache=TRUE---------------------------------------------- # retrieve all the methods that have a secondary R version meth <- nmfAlgorithm(version='R') meth <- c(names(meth), meth) meth if(requireNamespace("Biobase", quietly=TRUE)){ # load the Golub data data(esGolub) # compute NMF for each method res <- nmf(esGolub, 3, meth, seed=123456) # extract only the elapsed time t <- sapply(res, runtime)[3,] } ## ----perftable, echo=FALSE, results='asis'------------------------------------ # speed-up m <- length(res)/2 su <- cbind( C=t[1:m], R=t[-(1:m)], Speed.up=t[-(1:m)]/t[1:m]) library(xtable) xtable(su, caption='Performance speed up achieved by the optimized C++ implementation for some of the NMF algorithms.', label='tab:perf') ## ----citations, eval=FALSE---------------------------------------------------- # # plain text # citation('NMF') # # # or to get the bibtex entries # #toBibtex(citation('NMF')) ## ----esGolub------------------------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ data(esGolub) esGolub esGolub <- esGolub[1:200,] # remove the uneeded variable 'Sample' from the phenotypic data esGolub$Sample <- NULL } ## ----algo_default, cache=TRUE------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # default NMF algorithm res <- nmf(esGolub, 3) } ## ----single_show-------------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ res } ## ----single_show_model-------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ fit(res) } ## ----single_show_estimate----------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ V.hat <- fitted(res) dim(V.hat) } ## ----singlerun_summary-------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ summary(res) # More quality measures are computed, if the target matrix is provided: summary(res, target=esGolub) } ## ----singlerun_summary_factor------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ summary(res, class=esGolub$Cell) } ## ----get_matrices------------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # get matrix W w <- basis(res) dim(w) # get matrix H h <- coef(res) dim(h) } ## ----subset------------------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # keep only the first 10 features res.subset <- res[1:10,] class(res.subset) dim(res.subset) # keep only the first 10 samples dim(res[,1:10]) # subset both features and samples: dim(res[1:20,1:10]) } ## ----single_extract----------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # only compute the scores s <- featureScore(res) summary(s) # compute the scores and characterize each metagene s <- extractFeatures(res) str(s) } ## ----algo_list---------------------------------------------------------------- nmfAlgorithm() ## ----algo_lee, cache=TRUE----------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # using Lee and Seung's algorithm res <- nmf(esGolub, 3, 'lee') algorithm(res) } ## ----algo_ns, cache=TRUE------------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ # using the Nonsmooth NMF algorithm with parameter theta=0.7 res <- nmf(esGolub, 3, 'ns', theta=0.7) algorithm(res) fit(res) } ## ----algo_pe, cache=TRUE------------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ # using the PE-NMF algorithm with parameters alpha=0.01, beta=1 res <- nmf(esGolub, 3, 'pe', alpha=0.01, beta=1) res } ## ----seed_list---------------------------------------------------------------- nmfSeed() ## ----seed, cache=TRUE--------------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ res <- nmf(esGolub, 3, seed='nndsvd') res } ## ----seed_numeric, cache=TRUE------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # single run and single numeric seed res <- nmf(esGolub, 3, seed=123456) showRNG(res) # multiple runs and single numeric seed res <- nmf(esGolub, 3, seed=123456, nrun=2) showRNG(res) # single run with a 6-length seed res <- nmf(esGolub, 3, seed=rep(123456, 6)) showRNG(res) } ## ----seed_WH------------------------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ # initialize a "constant" factorization based on the target dimension init <- nmfModel(3, esGolub, W=0.5, H=0.3) head(basis(init)) # fit using this NMF model as a seed res <- nmf(esGolub, 3, seed=init) } ## ----algo_multirun, cache=TRUE------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ res.multirun <- nmf(esGolub, 3, nrun=5) res.multirun } ## ----multirun_keep, cache=TRUE------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ # explicitly setting the option keep.all to TRUE res <- nmf(esGolub, 3, nrun=5, .options=list(keep.all=TRUE)) res } ## ----multirun_keep_alt, eval=FALSE-------------------------------------------- # if(requireNamespace("Biobase", quietly=TRUE)){ # # or using letter code 'k' in argument .options # nmf(esGolub, 3, nrun=5, .options='k') # } ## ----parallel_multicore_alt, eval=FALSE--------------------------------------- # if(requireNamespace("Biobase", quietly=TRUE)){ # # the default call will try to run in parallel using all the cores # # => will be in parallel if all the requirements are satisfied # nmf(esGolub, 3, nrun=5, .opt='v') # # # request a certain number of cores to use => no error if not possible # nmf(esGolub, 3, nrun=5, .opt='vp8') # # # force parallel computation: use option 'P' # nmf(esGolub, 3, nrun=5, .opt='vP') # # # require an improbable number of cores => error # nmf(esGolub, 3, nrun=5, .opt='vP200') # } ## ----mpi, eval=FALSE---------------------------------------------------------- # # file: mpi.R # # if(requireNamespace("Biobase", quietly=TRUE)){ # ## 0. Create and register an MPI cluster # library(doMPI) # cl <- startMPIcluster() # registerDoMPI(cl) # library(NMF) # # # run on all workers using the current parallel backend # data(esGolub) # res <- nmf(esGolub, 3, 'brunet', nrun=n, .opt='p', .pbackend=NULL) # # # save result # save(res, file='result.RData') # # ## 4. Shutdown the cluster and quit MPI # closeCluster(cl) # mpi.quit() # } ## ----force_seq, cache=TRUE, backspace = TRUE---------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # parallel execution on 2 cores (if possible) res1 <- nmf(esGolub, 3, nrun=5, .opt='vp2', seed=123) # or use the doParallel with single core res2 <- nmf(esGolub, 3, nrun=5, .opt='vp1', seed=123) # force sequential computation by sapply: use option '-p' or .pbackend=NA res3 <- nmf(esGolub, 3, nrun=5, .opt='v-p', seed=123) res4 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend=NA, seed=123) # or use the SEQ backend of foreach: .pbackend='seq' res5 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend='seq', seed=123) # all results are all identical nmf.equal(list(res1, res2, res3, res4, res5)) } ## ----estimate_rank, cache=TRUE------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ # perform 10 runs for each value of r in range 2:6 estim.r <- nmf(esGolub, 2:6, nrun=10, seed=123456) } ## ----estimate_rank_plot, fig.width=10, fig.height=6--------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ plot(estim.r) } ## ----estimate_rank_hm_include, fig.width=14, fig.height=7, fig.keep='last'---- if(requireNamespace("Biobase", quietly=TRUE)){ consensusmap(estim.r, annCol=esGolub, labCol=NA, labRow=NA) } ## ----estimate_rank_random, cache=TRUE, fig.width=10, fig.height=6, fig.keep='last'---- if(requireNamespace("Biobase", quietly=TRUE)){ # shuffle original data V.random <- randomize(esGolub) # estimate quality measures from the shuffled data (use default NMF algorithm) estim.r.random <- nmf(V.random, 2:6, nrun=10, seed=123456) # plot measures on same graph plot(estim.r, estim.r.random) } ## ----multimethod, cache=TRUE-------------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # fit a model for several different methods res.multi.method <- nmf(esGolub, 3, list('brunet', 'lee', 'ns'), seed=123456, .options='t') } ## ----compare------------------------------------------------------------------ if(requireNamespace("Biobase", quietly=TRUE)){ compare(res.multi.method) # If prior knowledge of classes is available compare(res.multi.method, class=esGolub$Cell) } ## ----errorplot_compute, cache=TRUE-------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ # run nmf with .option='t' res <- nmf(esGolub, 3, .options='t') # or with .options=list(track=TRUE) } ## ----errorplot, out.width="0.5\\textwidth", fig.show='hold'------------------- if(requireNamespace("Biobase", quietly=TRUE)){ plot(res) plot(res.multi.method) } ## ----heatmap_coef_basis_inc, fig.width=14, fig.height=7, fig.keep='last'------ if(requireNamespace("Biobase", quietly=TRUE)){ layout(cbind(1,2)) # basis components basismap(res, subsetRow=TRUE) # mixture coefficients coefmap(res) } ## ----heatmap_consensus_inc, out.width="0.49\\textwidth", crop=TRUE, echo=1:2---- if(requireNamespace("Biobase", quietly=TRUE)){ # The cell type is used to label rows and columns consensusmap(res.multirun, annCol=esGolub, tracks=NA) plot(1:10) f2 <- fig_path("2.pdf") } ## ----hack_consensus, include=FALSE-------------------------------------------- if(requireNamespace("Biobase", quietly=TRUE)){ file.copy('consensus.pdf', f2, overwrite=TRUE) } ## ----custom_algo_sig---------------------------------------------------------- my.algorithm <- function(x, seed, param.1, param.2){ # do something with starting point # ... # return updated starting point return(seed) } ## ----custom_algo-------------------------------------------------------------- my.algorithm <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(seed) basis(seed) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(seed) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # return updated data return(seed) } ## ----define_V----------------------------------------------------------------- n <- 50; r <- 3; p <- 20 V <-syntheticNMF(n, r, p) ## ----custom_algo_run---------------------------------------------------------- nmf(V, 3, my.algorithm, scale.factor=10) ## ----custom_algo_run_obj------------------------------------------------------ # based on Kullback-Leibler divergence nmf(V, 3, my.algorithm, scale.factor=10, objective='KL') # based on custom distance metric nmf(V, 3, my.algorithm, scale.factor=10 , objective=function(model, target, ...){ ( sum( (target-fitted(model))^4 ) )^{1/4} } ) ## ----custom_algo_run_mixed, error = TRUE, try = TRUE-------------------------- # put some negative input data V.neg <- V; V.neg[1,] <- -1; # this generates an error try( nmf(V.neg, 3, my.algorithm, scale.factor=10) ) # this runs my.algorithm without error nmf(V.neg, 3, my.algorithm, mixed=TRUE, scale.factor=10) ## ----nmf_models--------------------------------------------------------------- nmfModel() ## ----custom_algo_NMFoffset---------------------------------------------------- my.algorithm.offset <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # retrieve the model being estimated data.model <- fit(seed) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(data.model) basis(data.model) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(data.model) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # 3. Compute the offset as the mean expression data.model@offset <- rowMeans(x) # return updated data fit(seed) <- data.model seed } ## ----custom_algo_NMFOffset_run------------------------------------------------ # run custom algorithm with NMF model with offset nmf(V, 3, my.algorithm.offset, model='NMFOffset', scale.factor=10) ## ----custom_seed-------------------------------------------------------------- # start: object of class NMF # target: the target matrix my.seeding.method <- function(model, target){ # use only the largest columns for W w.cols <- apply(target, 2, function(x) sqrt(sum(x^2))) basis(model) <- target[,order(w.cols)[1:nbasis(model)]] # initialize H randomly coef(model) <- matrix(runif(nbasis(model)*ncol(target)) , nbasis(model), ncol(target)) # return updated object return(model) } ## ----custom_seed_run---------------------------------------------------------- nmf(V, 3, 'snmf/r', seed=my.seeding.method) ## ----options_algo, eval=1:6--------------------------------------------------- #show default algorithm and seeding method nmf.options('default.algorithm', 'default.seed') # retrieve a single option nmf.getOption('default.seed') # All options nmf.options() ## ----print_options------------------------------------------------------------ nmf.printOptions() ## ----sessionInfo, echo=FALSE, results='asis'---------------------------------- toLatex(sessionInfo()) NMF/inst/doc/NMF-vignette.Rnw0000644000176200001440000016515314334457640015374 0ustar liggesusers%\VignetteIndexEntry{An introduction to the package NMF} %\VignetteDepends{utils,NMF,Biobase,bigmemory,xtable,RColorBrewer,knitr} %\VignetteKeyword{math} %\VignetteCompiler{knitr} %\VignetteEngine{knitr::knitr} \documentclass[a4paper]{article} %\usepackage[OT1]{fontenc} \usepackage[colorlinks]{hyperref} % for hyperlinks \usepackage{a4wide} \usepackage{xspace} \usepackage[all]{hypcap} % for linking to the top of the figures or tables % add preamble from pkgmaker <>= library(NMF) latex_preamble() if(!requireNamespace("Biobase")) BiocManager::install("Biobase") @ \newcommand{\nmfpack}{\Rpkg{NMF}} \newcommand{\RcppOctave}{\textit{RcppOctave}\xspace} \newcommand{\matlab}{Matlab$^\circledR$\xspace} \newcommand{\MATLAB}{\matlab} \newcommand{\gauss}{GAUSS$^\circledR$\xspace} \newcommand{\graphwidth}{0.9\columnwidth} \newcommand{\refeqn}[1]{(\ref{#1})} % REFERENCES \usepackage[citestyle=authoryear-icomp , doi=true , url=true , maxnames=1 , maxbibnames=15 , backref=true , backend=bibtex]{biblatex} \AtEveryCitekey{\clearfield{url}} <>= latex_bibliography('NMF') @ \newcommand{\citet}[1]{\textcite{#1}} \renewcommand{\cite}[1]{\parencite{#1}} \DefineBibliographyStrings{english}{% backrefpage = {see p.}, % for single page number backrefpages = {see pp.} % for multiple page numbers } %% % boxed figures \usepackage{float} \floatstyle{boxed} \restylefloat{figure} \usepackage{array} \usepackage{tabularx} \usepackage{xcolor} \usepackage{url} \urlstyle{rm} <>= set.seed(123456) library(knitr) # Helper functions: hook_try <- function(before, options, envir){ .try_defined <- FALSE # remove hacked version of try if( !before ){ if( .try_defined && exists('try', envir = envir, inherits = FALSE) ){ remove(list = 'try', envir = envir) } .try_defined <<- FALSE return(invisible()) } if( !is.null(options$try) ){ # signal do.signal <- isFALSE(options$try) if( isManualVignette() && isTRUE(options$try) ){ do.signal <- TRUE } # define hacked version of try() .try <- try_message(do.signal) assign('try', .try, envir) .try_defined <<- TRUE } } chunkOutputHook <- function(name, hook, type = c('output', 'source', 'chunk')){ type <- match.arg(type) function(){ if( !requireNamespace('knitr', quietly = TRUE) ) stop("Package 'knitr' is required to setup knit hook '", name, "'") .hook_bkp <- NULL function(before, options, envir){ # do nothing if the option is not ON if( is.null(options[[name]]) ) return() # set/unset hook if( before ){ # store current hook function if( is.null(.hook_bkp) ) .hook_bkp <<- knitr::knit_hooks$get(type) # define hook wrapper hook_wrapper <- function(x, options){ res <- .hook_bkp(x, options) hook(res, options) } args <- list() args[[type]] <- hook_wrapper do.call(knitr::knit_hooks$set, args) }else{ args <- list() args[[type]] <- .hook_bkp do.call(knitr::knit_hooks$set, args) .hook_bkp <<- NULL } } } } hook_backspace <- chunkOutputHook('backspace', function(x, options){ if( !isTRUE(options$backspace) ) x str_bs(x) } ) str_bs <- function(x){ # remove leading backspaces x <- gsub("^\b+", "", x) # remove backspaces at beginning of line x <- gsub("\n\b+", '\n', x) while( length(grep('\b', x, fixed = TRUE)) ) x <- gsub('[^\n\b][\b]', '', x) x } isManualVignette <- function(){ isTRUE(getOption('R_RUNNING_MANUAL_VIGNETTE')) } try_message <- function(signal = FALSE){ function(expr){ tryCatch(expr, error = function(e){ if( signal ) message(e) else message('Error: ', conditionMessage(e)) invisible() }) } } knit_hooks$set(try = hook_try, backspace = hook_backspace()) @ % use cleveref for automatic reference label formatting \usepackage[capitalise, noabbrev]{cleveref} % multiple columns \usepackage{multicol} % define commands for notes \usepackage{todonotes} \newcommand{\nbnote}[1]{\todo[inline, backgroundcolor=blue!20!white]{\scriptsize\textsf{\textbf{NB:} #1}}\ \\} % default graphic width \setkeys{Gin}{width=0.95\textwidth} \begin{document} <>= # Load library(NMF) # limit number of cores used nmf.options(cores = 2) @ \title{An introduction to NMF package\\ \small Version \Sexpr{utils::packageVersion('NMF')}} \author{Renaud Gaujoux} % \\Address Computational Biology - University of Cape Town, South Africa, \maketitle This vignette presents the \citeCRANpkg{NMF}, which implements a framework for Nonnegative Matrix Factorization (NMF) algorithms in R \cite{R}. The objective is to provide an implementation of some standard algorithms, while allowing the user to easily implement new methods that integrate into a common framework, which facilitates analysis, result visualisation or performance benchmarking. If you use the package \nmfpack in your analysis and publications please cite: \bigskip \todo[inline, backgroundcolor=blue!10!white]{\fullcite{Rpackage:NMF}} Note that the \nmfpack includes several NMF algorithms, published by different authors. Please make sure to also cite the paper(s) associated with the algorithm(s) you used. Citations for those can be found in \cref{tab:algo} and in the dedicated help pages \code{?gedAlgorithm.}, e.g., \code{?gedAlgorithm.SNMF\_R}. \bigskip \paragraph{Installation:} The latest stable version of the package can be installed from any \href{http://cran.r-project.org}{CRAN} repository mirror: <>= # Install install.packages('NMF') # Load library(NMF) @ The \nmfpack is a project hosted on \emph{R-forge}\footnote{\url{https://r-forge.r-project.org/projects/nmf}}. The latest development version is available from \url{https://r-forge.r-project.org/R/?group_id=649} and may be installed from there\footnote{\code{install.packages("NMF", repos = "http://R-Forge.R-project.org")}}. \paragraph{Support:} UseRs interested in this package are encouraged to subscribe to the user mailing list (\href{https://lists.r-forge.r-project.org/mailman/listinfo/nmf-user}{nmf-user@lists.r-forge.r-project.org}), which is the preferred channel for enquiries, bug reports, feature requests, suggestions or NMF-related discussions. This will enable better tracking as well as fruitful community exchange. \paragraph{Important:} Note that some of the classes defined in the NMF package have gained new slots. If you need to load objects saved in versions prior 0.8.14 please use: <>= # eg., load from some RData file load('object.RData') # update class definition object <- nmfObject(object) @ \pagebreak \tableofcontents \pagebreak \section{Overview} \subsection{Package features} This section provides a quick overview of the \nmfpack package's features. \Cref{sec:usecase} provides more details, as well as sample code on how to actually perform common tasks in NMF analysis. <>= nalgo <- length(nmfAlgorithm()) nseed <- length(nmfSeed()) @ The \nmfpack package provides: \begin{itemize} \item \Sexpr{nalgo} built-in algorithms; \item \Sexpr{nseed} built-in seeding methods; \item Single interface to perform all algorithms, and combine them with the seeding methods; \item Provides a common framework to test, compare and develop NMF methods; \item Accept custom algorithms and seeding methods; \item Plotting utility functions to visualize and help in the interpretation of the results; \item Transparent parallel computations; \item Optimized and memory efficient C++ implementations of the standard algorithms; \item Optional layer for bioinformatics using BioConductor \cite{Gentleman2004}; \end{itemize} \subsection{Nonnegative Matrix Factorization} This section gives a formal definition for Nonnegative Matrix Factorization problems, and defines the notations used throughout the vignette. Let $X$ be a $n \times p$ non-negative matrix, (i.e with $x_{ij} \geq 0$, denoted $X \geq 0$), and $r > 0$ an integer. Non-negative Matrix Factorization (NMF) consists in finding an approximation \begin{equation} X \approx W H\ , \label{NMFstd} \end{equation} where $W, H$ are $n\times r$ and $r \times p$ non-negative matrices, respectively. In practice, the factorization rank $r$ is often chosen such that $r \ll \min(n, p)$. The objective behind this choice is to summarize and split the information contained in $X$ into $r$ factors: the columns of $W$. Depending on the application field, these factors are given different names: basis images, metagenes, source signals. In this vignette we equivalently and alternatively use the terms \emph{basis matrix} or \emph{metagenes} to refer to matrix $W$, and \emph{mixture coefficient matrix} and \emph{metagene expression profiles} to refer to matrix $H$. The main approach to NMF is to estimate matrices $W$ and $H$ as a local minimum: \begin{equation} \min_{W, H \geq 0}\ \underbrace{[D(X, WH) + R(W, H)]}_{=F(W,H)} \label{nmf_min} \end{equation} where \begin{itemize} \item $D$ is a loss function that measures the quality of the approximation. Common loss functions are based on either the Frobenius distance $$D: A,B\mapsto \frac{Tr(AB^t)}{2} = \frac{1}{2} \sum_{ij} (a_{ij} - b_{ij})^2,$$ or the Kullback-Leibler divergence. $$D: A,B\mapsto KL(A||B) = \sum_{i,j} a_{ij} \log \frac{a_{ij}}{b_{ij}} - a_{ij} + b_{ij}.$$ \item $R$ is an optional regularization function, defined to enforce desirable properties on matrices $W$ and $H$, such as smoothness or sparsity \cite{Cichocki2008}. \end{itemize} \subsection{Algorithms} NMF algorithms generally solve problem \refeqn{nmf_min} iteratively, by building a sequence of matrices $(W_k,H_k)$ that reduces at each step the value of the objective function $F$. Beside some variations in the specification of $F$, they also differ in the optimization techniques that are used to compute the updates for $(W_k,H_k)$. For reviews on NMF algorithms see \cite{Berry2007, Chu2004} and references therein. The \nmfpack package implements a number of published algorithms, and provides a general framework to implement other ones. \Cref{tab:algo} gives a short description of each one of the built-in algorithms: The built-in algorithms are listed or retrieved with function \code{nmfAlgorithm}. A given algorithm is retrieved by its name (a \code{character} key), that is partially matched against the list of available algorithms: <>= # list all available algorithms nmfAlgorithm() # retrieve a specific algorithm: 'brunet' nmfAlgorithm('brunet') # partial match is also fine identical(nmfAlgorithm('br'), nmfAlgorithm('brunet')) @ \begin{table}[h!t] \begin{tabularx}{\textwidth}{lX} \hline Key & Description\\ \hline \code{brunet} & Standard NMF. Based on Kullback-Leibler divergence, it uses simple multiplicative updates from \cite{Lee2001}, enhanced to avoid numerical underflow. \begin{eqnarray} H_{kj} & \leftarrow & H_{kj} \frac{\left( \sum_l \frac{W_{lk} V_{lj}}{(WH)_{lj}} \right)}{ \sum_l W_{lk} }\\ W_{ik} & \leftarrow & W_{ik} \frac{ \sum_l [H_{kl} A_{il} / (WH)_{il} ] }{\sum_l H_{kl} } \end{eqnarray} \textbf{Reference:} \cite{Brunet2004}\\ \hline % \code{lee} & Standard NMF. Based on euclidean distance, it uses simple multiplicative updates \begin{eqnarray} H_{kj} & \leftarrow & H_{kj} \frac{(W^T V)_{kj}}{(W^T W H)_{kj}}\\ W_{ik} & \leftarrow & W_{ik} \frac{(V H^T)_{ik}}{(W H H^T)_{ik}} \end{eqnarray} \textbf{Reference:} \cite{Lee2001}\\ \hline % %\code{lnmf} & Local Nonnegative Matrix Factorization. Based on a %regularized Kullback-Leibler divergence, it uses a modified version of %Lee and Seung's multiplicative updates. % %\textbf{Reference:} \cite{Li2001}\\ % \code{nsNMF} & Non-smooth NMF. Uses a modified version of Lee and Seung's multiplicative updates for Kullback-Leibler divergence to fit a extension of the standard NMF model. It is meant to give sparser results. \textbf{Reference:} \cite{Pascual-Montano2006}\\ \hline % \code{offset} & Uses a modified version of Lee and Seung's multiplicative updates for euclidean distance, to fit a NMF model that includes an intercept. \textbf{Reference:} \cite{Badea2008}\\ \hline % \code{pe-nmf} & Pattern-Expression NMF. Uses multiplicative updates to minimize an objective function based on the Euclidean distance and regularized for effective expression of patterns with basis vectors. \textbf{Reference:} \cite{Zhang2008}\\ \hline % \code{snmf/r}, \code{snmf/l} & Alternating Least Square (ALS) approach. It is meant to be very fast compared to other approaches. \textbf{Reference:} \cite{KimH2007}\\ \hline \end{tabularx} \caption{Description of the implemented NMF algorithms. The first column gives the key to use in the call to the \texttt{nmf} function.\label{tab:algo}} \end{table} \subsection{Initialization: seeding methods} NMF algorithms need to be initialized with a seed (i.e. a value for $W_0$ and/or $H_0$\footnote{Some algorithms only need one matrix factor (either $W$ or $H$) to be initialized. See for example the SNMF/R(L) algorithm of Kim and Park \cite{KimH2007}.}), from which to start the iteration process. Because there is no global minimization algorithm, and due to the problem's high dimensionality, the choice of the initialization is in fact very important to ensure meaningful results. The more common seeding method is to use a random starting point, where the entries of $W$ and/or $H$ are drawn from a uniform distribution, usually within the same range as the target matrix's entries. This method is very simple to implement. However, a drawback is that to achieve stability one has to perform multiple runs, each with a different starting point. This significantly increases the computation time needed to obtain the desired factorization. To tackle this problem, some methods have been proposed so as to compute a reasonable starting point from the target matrix itself. Their objective is to produce deterministic algorithms that need to run only once, still giving meaningful results. For a review on some existing NMF initializations see \cite{Albright2006} and references therein. The \nmfpack\ package implements a number of already published seeding methods, and provides a general framework to implement other ones. \Cref{tab:seed} gives a short description of each one of the built-in seeding methods: The built-in seeding methods are listed or retrieved with function \code{nmfSeed}. A given seeding method is retrieved by its name (a \code{character} key) that is partially matched against the list of available seeding methods: <>= # list all available seeding methods nmfSeed() # retrieve a specific method: 'nndsvd' nmfSeed('nndsvd') # partial match is also fine identical(nmfSeed('nn'), nmfSeed('nndsvd')) @ \begin{table}[h!t] \begin{tabularx}{\textwidth}{lX} \hline Key & Description\\ \hline \code{ica} & Uses the result of an Independent Component Analysis (ICA) (from the \citeCRANpkg{fastICA}). Only the positive part of the result are used to initialize the factors.\\ \hline % \code{nnsvd} & Nonnegative Double Singular Value Decomposition. The basic algorithm contains no randomization and is based on two SVD processes, one approximating the data matrix, the other approximating positive sections of the resulting partial SVD factors utilizing an algebraic property of unit rank matrices. It is well suited to initialize NMF algorithms with sparse factors. Simple practical variants of the algorithm allows to generate dense factors. \textbf{Reference:} \cite{Boutsidis2008}\\ \hline % \code{none} & Fix seed. This method allows the user to manually provide initial values for both matrix factors.\\ \hline % \code{random} & The entries of each factors are drawn from a uniform distribution over $[0, max(V)]$, where $V$ is the target matrix.\\ \hline \end{tabularx} \caption{Description of the implemented seeding methods to initialize NMF algorithms. The first column gives the key to use in the call to the \texttt{nmf} function.\label{tab:seed}} \end{table} \subsection{How to run NMF algorithms} Method \code{nmf} provides a single interface to run NMF algorithms. It can directly perform NMF on object of class \code{matrix} or \code{data.frame} and \code{ExpressionSet} -- if the \citeBioCpkg{Biobase} is installed. The interface has four main parameters: \medskip \fbox{\code{nmf(x, rank, method, seed, ...)}} \begin{description} \item[\code{x}] is the target \code{matrix}, \code{data.frame} or \code{ExpressionSet} \footnote{\code{ExpressionSet} is the base class for handling microarray data in BioConductor, and is defined in the \pkgname{Biobase} package.} \item[\code{rank}] is the factorization rank, i.e. the number of columns in matrix $W$. \item[\code{method}] is the algorithm used to estimate the factorization. The default algorithm is given by the package specific option \code{'default.algorithm'}, which defaults to \code{'brunet'} on installation \cite{Brunet2004}. \item[\code{seed}] is the seeding method used to compute the starting point. The default method is given by the package specific option \code{'default.seed'}, which defaults to \code{'random'} on initialization (see method \code{?rnmf} for details on its implementation). \end{description} See also \code{?nmf} for details on the interface and extra parameters. \subsection{Performances} Since version 0.4, some built-in algorithms are optimized in C++, which results in a significant speed-up and a more efficient memory management, especially on large scale data. The older R versions of the concerned algorithms are still available, and accessible by adding the prefix \code{'.R\#'} to the algorithms' access keys (e.g. the key \code{'.R\#offset'} corresponds to the R implementation of NMF with offset \cite{Badea2008}). Moreover they do not show up in the listing returned by the \code{nmfAlgorithm} function, unless argument \code{all=TRUE}: <>= nmfAlgorithm(all=TRUE) # to get all the algorithms that have a secondary R version nmfAlgorithm(version='R') @ \Cref{tab:perf} shows the speed-up achieved by the algorithms that benefit from the optimized code. All algorithms were run once with a factorization rank equal to 3, on the Golub data set which contains a $5000\times 38$ gene expression matrix. The same numeric random seed (\code{seed=123456}) was used for all factorizations. The columns \emph{C} and \emph{R} show the elapsed time (in seconds) achieved by the C++ version and R version respectively. The column \emph{Speed.up} contains the ratio $R/C$. <>= # retrieve all the methods that have a secondary R version meth <- nmfAlgorithm(version='R') meth <- c(names(meth), meth) meth if(requireNamespace("Biobase", quietly=TRUE)){ # load the Golub data data(esGolub) # compute NMF for each method res <- nmf(esGolub, 3, meth, seed=123456) # extract only the elapsed time t <- sapply(res, runtime)[3,] } @ <>= # speed-up m <- length(res)/2 su <- cbind( C=t[1:m], R=t[-(1:m)], Speed.up=t[-(1:m)]/t[1:m]) library(xtable) xtable(su, caption='Performance speed up achieved by the optimized C++ implementation for some of the NMF algorithms.', label='tab:perf') @ \subsection{How to cite the package NMF} To view all the package's bibtex citations, including all vignette(s) and manual(s): <>= # plain text citation('NMF') # or to get the bibtex entries #toBibtex(citation('NMF')) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Use case: Golub dataset}\label{sec:usecase} We illustrate the functionalities and the usage of the \nmfpack package on the -- now standard -- Golub dataset on leukemia. It was used in several papers on NMF \cite{Brunet2004, Gao2005} and is included in the \nmfpack package's data, wrapped into an \code{ExpressionSet} object. For performance reason we use here only the first 200 genes. Therefore the results shown in the following are not meant to be biologically meaningful, but only illustrative: <>= if(requireNamespace("Biobase", quietly=TRUE)){ data(esGolub) esGolub esGolub <- esGolub[1:200,] # remove the uneeded variable 'Sample' from the phenotypic data esGolub$Sample <- NULL } @ % TODO: pass to 50 genes for dev \paragraph{Note:} To run this example, the \code{Biobase} package from BioConductor is required. \subsection{Single run}\label{sec:single_run} \subsubsection{Performing a single run} To run the default NMF algorithm on data \code{esGolub} with a factorization rank of 3, we call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # default NMF algorithm res <- nmf(esGolub, 3) } @ Here we did not specify either the algorithm or the seeding method, so that the computation is done using the default algorithm and is seeded by the default seeding methods. These defaults are set in the package specific options \code{'default.algorithm'} and \code{'default.seed'} respectively. See also \cref{sec:algo,sec:seed} for how to explicitly specify the algorithm and/or the seeding method. \subsubsection{Handling the result} The result of a single NMF run is an object of class \code{NMFfit}, that holds both the fitted NMF model and data about the run: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res } @ The fitted model can be retrieved via method \code{fit}, which returns an object of class \code{NMF}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ fit(res) } @ The estimated target matrix can be retrieved via the generic method \code{fitted}, which returns a -- generally big -- \code{matrix}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ V.hat <- fitted(res) dim(V.hat) } @ Quality and performance measures about the factorization are computed by method \code{summary}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ summary(res) # More quality measures are computed, if the target matrix is provided: summary(res, target=esGolub) } @ If there is some prior knowledge of classes present in the data, some other measures about the unsupervised clustering's performance are computed (purity, entropy, \ldots). Here we use the phenotypic variable \code{Cell} found in the Golub dataset, that gives the samples' cell-types (it is a factor with levels: T-cell, B-cell or \code{NA}): <>= if(requireNamespace("Biobase", quietly=TRUE)){ summary(res, class=esGolub$Cell) } @ The basis matrix (i.e. matrix $W$ or the metagenes) and the mixture coefficient matrix (i.e matrix $H$ or the metagene expression profiles) are retrieved using methods \code{basis} and \code{coef} respectively: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # get matrix W w <- basis(res) dim(w) # get matrix H h <- coef(res) dim(h) } @ If one wants to keep only part of the factorization, one can directly subset on the \code{NMF} object on features and samples (separately or simultaneously). The result is a \code{NMF} object composed of the selected rows and/or columns: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # keep only the first 10 features res.subset <- res[1:10,] class(res.subset) dim(res.subset) # keep only the first 10 samples dim(res[,1:10]) # subset both features and samples: dim(res[1:20,1:10]) } @ \subsubsection{Extracting metagene-specific features} In general NMF matrix factors are sparse, so that the metagenes can usually be characterized by a relatively small set of genes. Those are determined based on their relative contribution to each metagene. Kim and Park \cite{KimH2007} defined a procedure to extract the relevant genes for each metagene, based on a gene scoring schema. The NMF package implements this procedure in methods \code{featureScore} and \code{extractFeature}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # only compute the scores s <- featureScore(res) summary(s) # compute the scores and characterize each metagene s <- extractFeatures(res) str(s) } @ \subsection{Specifying the algorithm}\label{sec:algo} \subsubsection{Built-in algorithms} The \nmfpack package provides a number of built-in algorithms, that are listed or retrieved by function \code{nmfAlgorithm}. Each algorithm is identified by a unique name. The following algorithms are currently implemented (cf. \cref{tab:algo} for more details): <>= nmfAlgorithm() @ %\begin{tech} %Internally, all algorithms are stored in objects that inherit from class %\code{NMFStrategy}. This class defines the minimum interface %\end{tech} The algorithm used to compute the NMF is specified in the third argument (\code{method}). For example, to use the NMF algorithm from Lee and Seung \cite{Lee2001} based on the Frobenius euclidean norm, one make the following call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using Lee and Seung's algorithm res <- nmf(esGolub, 3, 'lee') algorithm(res) } @ To use the Nonsmooth NMF algorithm from \cite{Pascual-Montano2006}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using the Nonsmooth NMF algorithm with parameter theta=0.7 res <- nmf(esGolub, 3, 'ns', theta=0.7) algorithm(res) fit(res) } @ Or to use the PE-NMF algorithm from \cite{Zhang2008}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # using the PE-NMF algorithm with parameters alpha=0.01, beta=1 res <- nmf(esGolub, 3, 'pe', alpha=0.01, beta=1) res } @ %\begin{tech} %Although the last two calls looks similar these are handled % %In the case of the nsNMF algorithm, the fitted model is an object of class %\code{NMFns} that extends the standard NMF model \code{NMFstd}, as it introduces %a smoothing matrix $S$, parametrised by a real number $\theta \in [0,1]$, such %that the fitted model is: %$$ %V \approx W S(\theta) H. %$$ % %Hence the call to function \code{nmf}, parameter $\theta$ is used to % %\end{tech} \subsubsection{Custom algorithms} The \nmfpack package provides the user the possibility to define his own algorithms, and benefit from all the functionalities available in the NMF framework. There are only few contraints on the way the custom algorithm must be defined. See the details in \cref{sec:algo_custom}. \subsection{Specifying the seeding method}\label{sec:seed} The seeding method used to compute the starting point for the chosen algorithm can be set via argument \code{seed}. Note that if the seeding method is deterministic there is no need to perform multiple run anymore. \subsubsection{Built-in seeding methods} Similarly to the algorithms, the \code{nmfSeed} function can be used to list or retrieve the built-in seeding methods. The following seeding methods are currently implemented: <>= nmfSeed() @ To use a specific method to seed the computation of a factorization, one simply passes its name to \code{nmf}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res <- nmf(esGolub, 3, seed='nndsvd') res } @ \subsubsection{Numerical seed}\label{sec:numseed} Another possibility, useful when comparing methods or reproducing results, is to set the random number generator (RNG) by passing a numerical value in argument \code{seed}. This value is used to set the state of the RNG, and the initialization is performed by the built-in seeding method \code{'random'}. When the function \code{nmf} exits, the value of the random seed (\code{.Random.seed}) is restored to its original state -- as before the call. In the case of a single run (i.e. with \code{nrun=1}), the default is to use the current RNG, set with the R core function \code{set.seed}. In the case of multiple runs, the computations use RNGstream, as provided by the core RNG ``L'Ecuyer-CMRG" \cite{Lecuyer2002}, which generates multiple independent random streams (one per run). This ensures the complete reproducibility of any given set of runs, even when their computation is performed in parallel. Since RNGstream requires a 6-length numeric seed, a random one is generated if only a single numeric value is passed to \code{seed}. Moreover, single runs can also use RNGstream by passing a 6-length seed. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # single run and single numeric seed res <- nmf(esGolub, 3, seed=123456) showRNG(res) # multiple runs and single numeric seed res <- nmf(esGolub, 3, seed=123456, nrun=2) showRNG(res) # single run with a 6-length seed res <- nmf(esGolub, 3, seed=rep(123456, 6)) showRNG(res) } @ \nbnote{To show the RNG changes happening during the computation use \texttt{.options='v4'} to turn on verbosity at level 4.\\ In versions prior 0.6, one could specify option \texttt{restore.seed=FALSE} or \texttt{'-r'}, this option is now deprecated.} \subsubsection{Fixed factorization} Yet another option is to completely specify the initial factorization, by passing values for matrices $W$ and $H$: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # initialize a "constant" factorization based on the target dimension init <- nmfModel(3, esGolub, W=0.5, H=0.3) head(basis(init)) # fit using this NMF model as a seed res <- nmf(esGolub, 3, seed=init) } @ \subsubsection{Custom function} The \nmfpack package provides the user the possibility to define his own seeding method, and benefit from all the functionalities available in the NMF framework. There are only few contraints on the way the custom seeding method must be defined. See the details in \cref{sec:seed_custom}. \subsection{Multiple runs} When the seeding method is stochastic, multiple runs are usually required to achieve stability or a resonable result. This can be done by setting argument \code{nrun} to the desired value. For performance reason we use \code{nrun=5} here, but a typical choice would lies between 100 and 200: <>= if(requireNamespace("Biobase", quietly=TRUE)){ res.multirun <- nmf(esGolub, 3, nrun=5) res.multirun } @ By default, the returned object only contains the best fit over all the runs. That is the factorization that achieved the lowest approximation error (i.e. the lowest objective value). Even during the computation, only the current best factorization is kept in memory. This limits the memory requirement for performing multiple runs, which in turn allows to perform more runs. The object \code{res.multirun} is of class \code{NMFfitX1} that extends class \code{NMFfit}, the class returned by single NMF runs. It can therefore be handled as the result of a single run and benefit from all the methods defined for single run results. \medskip If one is interested in keeping the results from all the runs, one can set the option \code{keep.all=TRUE}: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # explicitly setting the option keep.all to TRUE res <- nmf(esGolub, 3, nrun=5, .options=list(keep.all=TRUE)) res } @ <>= if(requireNamespace("Biobase", quietly=TRUE)){ # or using letter code 'k' in argument .options nmf(esGolub, 3, nrun=5, .options='k') } @ In this case, the result is an object of class \code{NMFfitXn} that also inherits from class \code{list}. Note that keeping all the results may be memory consuming. For example, a 3-rank \code{NMF} fit\footnote{i.e. the result of a single NMF run with rank equal 3.} for the Golub gene expression matrix ($5000 \times 38$) takes about \Sexpr{round(object.size(fit(res.multirun))/1000)}Kb\footnote{This size might change depending on the architecture (32 or 64 bits)}. \subsection{Parallel computations}\label{multicore} To speed-up the analysis whenever possible, the \nmfpack package implements transparent parallel computations when run on multi-core machines. It uses the \code{foreach} framework developed by REvolution Computing \citeCRANpkg{foreach}, together with the related \code{doParallel} parallel backend from the \citeCRANpkg{doParallel} -- based on the \pkgname{parallel} package -- to make use of all the CPUs available on the system, with each core simultaneously performing part of the runs. \subsubsection{Memory considerations} Running multicore computations increases the required memory linearly with the number of cores used. When only the best run is of interest, memory usage is optimized to only keep the current best factorization. On non-Windows machine, further speed improvement are achieved by using shared memory and mutex objects from the \citeCRANpkg{bigmemory} and the \citeCRANpkg{synchronicity}. \subsubsection{Parallel foreach backends} The default parallel backend used by the \code{nmf} function is defined by the package specific option \code{'pbackend'}, which defaults to \code{'par'} -- for \code{doParallel}. The backend can also be set on runtime via argument \code{.pbackend}. \medskip \paragraph{IMPORTANT NOTE:} The parallel computation is based on the \pkgname{doParallel} and \pkgname{parallel} packages, and the same care should be taken as stated in the vignette of the \citeCRANpkg{doMC}: \begin{quote} \emph{... it usually isn't safe to run doMC and multicore from a GUI environment. In particular, it is not safe to use doMC from R.app on Mac OS X. Instead, you should use doMC from a terminal session, starting R from the command line.} \end{quote} Therefore, the \code{nmf} function does not allow to run multicore computation from the MacOS X GUI. From version 0.8, other parallel backends are supported, and may be specified via argument \code{.pbackend}: \begin{description} \item[\code{.pbackend='mpi'}] uses the parallel backend \citeCRANpkg{doParallel} and \citeCRANpkg{doMPI} \item[\code{.pbackend=NULL}]{} \end{description} It is possible to specify that the currently registered backend should be used, by setting argument \code{.pbackend=NULL}. This allow to perform parallel computations with ``permanent'' backends that are configured externally of the \code{nmf} call. \subsubsection{Runtime options} There are two other runtime options, \code{parallel} and \code{parallel.required}, that can be passed via argument \code{.options}, to control the behaviour of the parallel computation (see below). \medskip A call for multiple runs will be computed in parallel if one of the following condition is satisfied: \begin{itemize} \item call with option \code{'P'} or \code{parallel.required} set to TRUE (note the upper case in \code{'P'}). In this case, if for any reason the computation cannot be run in parallel (packages requirements, OS, ...), then an error is thrown. Use this mode to force the parallel execution. \item call with option \code{'p'} or \code{parallel} set to TRUE. In this case if something prevents a parallel computation, the factorizations will be done sequentially. \item a valid parallel backend is specified in argument \code{.pbackend}. For the moment it can either be the string \code{'mc'} or a single \code{numeric} value specifying the number of core to use. Unless option \code{'P'} is specified, it will run using option \code{'p'} (i.e. try-parallel mode). \end{itemize} \nbnote{The number of processors to use can also be specified in the runtime options as e.g. \texttt{.options='p4'} or \texttt{.options='P4'} -- to ask or request 4 CPUs.} \paragraph{Examples}\ \\ The following exmaples are run with \code{.options='v'} which turn on verbosity at level 1, that will show which parallell setting is used by each computation. Although we do not show the output here, the user is recommended to run these commands on his machine to see the internal differences of each call. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # the default call will try to run in parallel using all the cores # => will be in parallel if all the requirements are satisfied nmf(esGolub, 3, nrun=5, .opt='v') # request a certain number of cores to use => no error if not possible nmf(esGolub, 3, nrun=5, .opt='vp8') # force parallel computation: use option 'P' nmf(esGolub, 3, nrun=5, .opt='vP') # require an improbable number of cores => error nmf(esGolub, 3, nrun=5, .opt='vP200') } @ \subsubsection{High Performance Computing on a cluster} To achieve further speed-up, the computation can be run on an HPC cluster. In our tests we used the \citeCRANpkg{doMPI} to perform 100 factorizations using hybrid parallel computation on 4 quadri-core machines -- making use of all the cores computation on each machine. <>= # file: mpi.R if(requireNamespace("Biobase", quietly=TRUE)){ ## 0. Create and register an MPI cluster library(doMPI) cl <- startMPIcluster() registerDoMPI(cl) library(NMF) # run on all workers using the current parallel backend data(esGolub) res <- nmf(esGolub, 3, 'brunet', nrun=n, .opt='p', .pbackend=NULL) # save result save(res, file='result.RData') ## 4. Shutdown the cluster and quit MPI closeCluster(cl) mpi.quit() } @ Passing the following shell script to \emph{qsub} should launch the execution on a Sun Grid Engine HPC cluster, with OpenMPI. Some adaptation might be necessary for other queueing systems/installations. \begin{shaded} \small \begin{verbatim} #!/bin/bash #$ -cwd #$ -q opteron.q #$ -pe mpich_4cpu 16 echo "Got $NSLOTS slots. $TMP/machines" orterun -v -n $NSLOTS -hostfile $TMP/machines R --slave -f mpi.R \end{verbatim} \end{shaded} \subsubsection{Forcing sequential execution} When running on a single core machine, \nmfpack package has no other option than performing the multiple runs sequentially, one after another. This is done via the \code{sapply} function. On multi-core machine, one usually wants to perform the runs in parallel, as it speeds up the computation (cf. \cref{multicore}). However in some situation (e.g. while debugging), it might be useful to force the sequential execution of the runs. This can be done via the option \code{'p1'} to run on a single core , or with \code{.pbackend='seq'} to use the foreach backend \code{doSEQ} or to \code{NA} to use a standard \code{sapply} call: <>= if(requireNamespace("Biobase", quietly=TRUE)){ # parallel execution on 2 cores (if possible) res1 <- nmf(esGolub, 3, nrun=5, .opt='vp2', seed=123) # or use the doParallel with single core res2 <- nmf(esGolub, 3, nrun=5, .opt='vp1', seed=123) # force sequential computation by sapply: use option '-p' or .pbackend=NA res3 <- nmf(esGolub, 3, nrun=5, .opt='v-p', seed=123) res4 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend=NA, seed=123) # or use the SEQ backend of foreach: .pbackend='seq' res5 <- nmf(esGolub, 3, nrun=5, .opt='v', .pbackend='seq', seed=123) # all results are all identical nmf.equal(list(res1, res2, res3, res4, res5)) } @ \subsection{Estimating the factorization rank} A critical parameter in NMF is the factorization rank $r$. It defines the number of metagenes used to approximate the target matrix. Given a NMF method and the target matrix, a common way of deciding on $r$ is to try different values, compute some quality measure of the results, and choose the best value according to this quality criteria. Several approaches have then been proposed to choose the optimal value of $r$. For example, \cite{Brunet2004} proposed to take the first value of $r$ for which the cophenetic coefficient starts decreasing, \cite{Hutchins2008} suggested to choose the first value where the RSS curve presents an inflection point, and \cite{Frigyesi2008} considered the smallest value at which the decrease in the RSS is lower than the decrease of the RSS obtained from random data. The \nmfpack package provides functions to help implement such procedures and plot the relevant quality measures. Note that this can be a lengthy computation, depending on the data size. Whereas the standard NMF procedure usually involves several hundreds of random initialization, performing 30-50 runs is considered sufficient to get a robust estimate of the factorization rank \cite{Brunet2004, Hutchins2008}. For performance reason, we perform here only 10 runs for each value of the rank. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # perform 10 runs for each value of r in range 2:6 estim.r <- nmf(esGolub, 2:6, nrun=10, seed=123456) } @ The result is a S3 object of class \code{NMF.rank}, that contains a \code{data.frame} with the quality measures in column, and the values of $r$ in row. It also contains a list of the consensus matrix for each value of $r$. All the measures can be plotted at once with the method \code{plot} (\cref{fig:estim_all}), and the function \code{consensusmap} generates heatmaps of the consensus matrix for each value of the rank. In the context of class discovery, it is useful to see if the clusters obtained correspond to known classes. This is why in the particular case of the Golub dataset, we added annotation tracks for the two covariates available ('Cell' and 'ALL.AML'). Since we removed the variable 'Sample' in the preliminaries, these are the only variables in the phenotypic \code{data.frame} embedded within the \code{ExpressionSet} object, and we can simply pass the whole object to argument \code{annCol} (\cref{fig:estim_all_hm}). One can see that at rank 2, the clusters correspond to the ALL and AML samples respectively, while rank 3 separates AML from ALL/T-cell and ALL/B-cell\footnote{Remember that the plots shown in \cref{fig:estim_all_hm} come from only 10 runs, using the 200 first genes in the dataset, which explains the somewhat not so clean clusters. The results are in fact much cleaner when using the full dataset (\cref{fig:heatmap_consensus}).}. \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ plot(estim.r) } @ \caption{Estimation of the rank: Quality measures computed from 10 runs for each value of $r$. \label{fig:estim_all}} \end{figure} \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ consensusmap(estim.r, annCol=esGolub, labCol=NA, labRow=NA) } @ \caption{Estimation of the rank: Consensus matrices computed from 10 runs for each value of $r$. \label{fig:estim_all_hm}} \end{figure} \subsubsection{Overfitting} Even on random data, increasing the factorization rank would lead to decreasing residuals, as more variables are available to better fit the data. In other words, there is potentially an overfitting problem. In this context, the approach from \cite{Frigyesi2008} may be useful to prevent or detect overfitting as it takes into account the results for unstructured data. However it requires to compute the quality measure(s) for the random data. The \nmfpack package provides a function that shuffles the original data, by permuting the rows of each column, using each time a different permutation. The rank estimation procedure can then be applied to the randomized data, and the ``random'' measures added to the plot for comparison (\cref{fig:estim_all_rd}). \begin{figure} <>= if(requireNamespace("Biobase", quietly=TRUE)){ # shuffle original data V.random <- randomize(esGolub) # estimate quality measures from the shuffled data (use default NMF algorithm) estim.r.random <- nmf(V.random, 2:6, nrun=10, seed=123456) # plot measures on same graph plot(estim.r, estim.r.random) } @ \caption{Estimation of the rank: Comparison of the quality measures with those obtained from randomized data. The curves for the actual data are in blue and green, those for the randomized data are in red and pink. The estimation is based on Brunet's algorithm.} \label{fig:estim_all_rd} \end{figure} \subsection{Comparing algorithms} To compare the results from different algorithms, one can pass a list of methods in argument \code{method}. To enable a fair comparison, a deterministic seeding method should also be used. Here we fix the random seed to 123456. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # fit a model for several different methods res.multi.method <- nmf(esGolub, 3, list('brunet', 'lee', 'ns'), seed=123456, .options='t') } @ Passing the result to method \code{compare} produces a \code{data.frame} that contains summary measures for each method. Again, prior knowledge of classes may be used to compute clustering quality measures: <>= if(requireNamespace("Biobase", quietly=TRUE)){ compare(res.multi.method) # If prior knowledge of classes is available compare(res.multi.method, class=esGolub$Cell) } @ Because the computation was performed with error tracking enabled, an error plot can be produced by method \code{plot} (\cref{fig:errorplot}). Each track is normalized so that its first value equals one, and stops at the iteration where the method's convergence criterion was fulfilled. \subsection{Visualization methods} \subsubsection*{Error track} If the NMF computation is performed with error tracking enabled -- using argument \code{.options} -- the trajectory of the objective value is computed during the fit. This computation is not enabled by default as it induces some overhead. <>= if(requireNamespace("Biobase", quietly=TRUE)){ # run nmf with .option='t' res <- nmf(esGolub, 3, .options='t') # or with .options=list(track=TRUE) } @ The trajectory can be plot with the method \code{plot} (\cref{fig:errorplot}): \begin{figure}[!htbp] <>= if(requireNamespace("Biobase", quietly=TRUE)){ plot(res) plot(res.multi.method) } @ \caption{Error track for a single NMF run (left) and multiple method runs (right)} \label{fig:errorplot} \end{figure} \subsubsection*{Heatmaps} The methods \code{basismap}, \code{coefmap} and \code{consensusmap} provide an easy way to visualize respectively the resulting basis matrix (i.e. metagenes), mixture coefficient matrix (i.e. metaprofiles) and the consensus matrix, in the case of multiple runs. It produces pre-configured heatmaps based on the function \code{aheatmap}, the underlying heatmap engine provided with the package NMF. The default heatmaps produced by these functions are shown in \cref{fig:heatmap_coef_basis,fig:heatmap_consensus}. They can be customized in many different ways (colours, annotations, labels). See the dedicated vignette \emph{``NMF: generating heatmaps"} or the help pages \code{?coefmap} and \code{?aheatmap} for more information. An important and unique feature of the function \code{aheatmap}, is that it makes it possible to combine several heatmaps on the same plot, using the both standard layout calls \texttt{par(mfrow=...)} and \texttt{layout(...)}, or grid viewports from \texttt{grid} graphics. The plotting context is automatically internally detected, and a correct behaviour is achieved thanks to the \citeCRANpkg{gridBase}. Examples are provided in the dedicated vignette mentioned above. The rows of the basis matrix often carry the high dimensionality of the data: genes, loci, pixels, features, etc\ldots The function \code{basismap} extends the use of argument \code{subsetRow} (from \code{aheatmap}) to the specification of a feature selection method. In \cref{fig:heatmap_coef_basis} we simply used \code{subsetRow=TRUE}, which subsets the rows using the method described in \cite{KimH2007}, to only keep the basis-specific features (e.g. the metagene-specific genes). We refer to the relevant help pages \code{?basismap} and \code{?aheatmap} for more details about other possible values for this argument. \begin{figure}[!htbp] \centering <>= if(requireNamespace("Biobase", quietly=TRUE)){ layout(cbind(1,2)) # basis components basismap(res, subsetRow=TRUE) # mixture coefficients coefmap(res) } @ \caption{Heatmap of the basis and the mixture coefficient matrices. The rows of the basis matrix were selected using the default feature selection method -- described in \cite{KimH2007}.} \label{fig:heatmap_coef_basis} \end{figure} In the case of multiple runs the function \code{consensusmap} plots the consensus matrix, i.e. the average connectivity matrix across the runs (see results in \cref{fig:heatmap_consensus} for a consensus matrix obtained with 100 runs of Brunet's algorithm on the complete Golub dataset): \begin{figure}[ht] <>= if(requireNamespace("Biobase", quietly=TRUE)){ # The cell type is used to label rows and columns consensusmap(res.multirun, annCol=esGolub, tracks=NA) plot(1:10) f2 <- fig_path("2.pdf") } @ <>= if(requireNamespace("Biobase", quietly=TRUE)){ file.copy('consensus.pdf', f2, overwrite=TRUE) } @ \caption{Heatmap of consensus matrices from 10 runs on the reduced dataset (left) and from 100 runs on the complete Golub dataset (right).} \label{fig:heatmap_consensus} \end{figure} \section{Extending the package} We developed the \nmfpack\ package with the objective to facilitate the integration of new NMF methods, trying to impose only few requirements on their implementations. All the built-in algorithms and seeding methods are implemented as strategies that are called from within the main interface method \code{nmf}. The user can define new strategies and those are handled in exactly the same way as the built-in ones, benefiting from the same utility functions to interpret the results and assess their performance. \subsection{Custom algorithm} %New NMF algrithms can be defined in two ways: % %\begin{itemize} %\item as a single \code{function} %\item as a set of functions that implement a pre-defined \emph{iterative schema} %\end{itemize} % %\subsubsection{Defined as a \code{function}} \subsubsection{Using a custom algorithm}\label{sec:algo_custom} To define a strategy, the user needs to provide a \code{function} that implements the complete algotihm. It must be of the form: <>= my.algorithm <- function(x, seed, param.1, param.2){ # do something with starting point # ... # return updated starting point return(seed) } @ Where: \begin{description} \item[target] is a \code{matrix}; \item[start] is an object that inherits from class \code{NMF}. This \code{S4} class is used to handle NMF models (matrices \code{W} and \code{H}, objective function, etc\dots); \item[param.1, param.2] are extra parameters specific to the algorithms; \end{description} The function must return an object that inherits from class \code{NMF}. For example: <>= my.algorithm <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(seed) basis(seed) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(seed) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # return updated data return(seed) } @ To use the new method within the package framework, one pass \code{my.algorithm} to main interface \code{nmf} via argument \code{method}. Here we apply the algorithm to some matrix \code{V} randomly generated: <>= n <- 50; r <- 3; p <- 20 V <-syntheticNMF(n, r, p) @ <>= nmf(V, 3, my.algorithm, scale.factor=10) @ \subsubsection{Using a custom distance measure} The default distance measure is based on the euclidean distance. If the algorithm is based on another distance measure, this one can be specified in argument \code{objective}, either as a \code{character} string corresponding to a built-in objective function, or a custom \code{function} definition\footnote{Note that from version 0.8, the arguments for custom objective functions have been swapped: (1) the current NMF model, (2) the target matrix}: <>= # based on Kullback-Leibler divergence nmf(V, 3, my.algorithm, scale.factor=10, objective='KL') # based on custom distance metric nmf(V, 3, my.algorithm, scale.factor=10 , objective=function(model, target, ...){ ( sum( (target-fitted(model))^4 ) )^{1/4} } ) @ %\subsubsection{Using the iterative schema} % %NMF algorithms generally implement the following common iterative schema: % %\begin{enumerate} %\item %\item %\end{enumerate} \subsubsection{Defining algorithms for mixed sign data} All the algorithms implemented in the \nmfpack package assume that the input data is nonnegative. However, some methods exist in the litterature that work with relaxed constraints, where the input data and one of the matrix factors ($W$ or $H$) are allowed to have negative entries (eg. semi-NMF \cite{Ding2010, Roux2008}). Strictly speaking these methods do not fall into the NMF category, but still solve constrained matrix factorization problems, and could be considered as NMF methods when applied to non-negative data. Moreover, we received user requests to enable the development of semi-NMF type methods within the package's framework. Therefore, we designed the \nmfpack package so that such algorithms -- that handle negative data -- can be integrated. This section documents how to do it. By default, as a safe-guard, the sign of the input data is checked before running any method, so that the \code{nmf} function throws an error if applied to data that contain negative entries \footnote{Note that on the other side, the sign of the factors returned by the algorithms is never checked, so that one can always return factors with negative entries.}. To extend the capabilities of the \nmfpack package in handling negative data, and plug mixed sign NMF methods into the framework, the user needs to specify the argument \code{mixed=TRUE} in the call to the \code{nmf} function. This will skip the sign check of the input data and let the custom algorithm perform the factorization. As an example, we reuse the previously defined custom algorithm\footnote{As it is defined here, the custom algorithm still returns nonnegative factors, which would not be desirable in a real example, as one would not be able to closely fit the negative entries.}: <>= # put some negative input data V.neg <- V; V.neg[1,] <- -1; # this generates an error try( nmf(V.neg, 3, my.algorithm, scale.factor=10) ) # this runs my.algorithm without error nmf(V.neg, 3, my.algorithm, mixed=TRUE, scale.factor=10) @ \subsubsection{Specifying the NMF model} If not specified in the call, the NMF model that is used is the standard one, as defined in \cref{NMFstd}. However, some NMF algorithms have different underlying models, such as non-smooth NMF \cite{Pascual-Montano2006} which uses an extra matrix factor that introduces an extra parameter, and change the way the target matrix is approximated. The NMF models are defined as S4 classes that extends class \code{NMF}. All the available models can be retreived calling the \code{nmfModel()} function with no argument: <>= nmfModel() @ One can specify the NMF model to use with a custom algorithm, using argument \code{model}. Here we first adapt a bit the custom algorithm, to justify and illustrate the use of a different model. We use model \code{NMFOffset} \cite{Badea2008}, that includes an offset to take into account genes that have constant expression levels accross the samples: <>= my.algorithm.offset <- function(x, seed, scale.factor=1){ # do something with starting point # ... # for example: # 1. compute principal components pca <- prcomp(t(x), retx=TRUE) # retrieve the model being estimated data.model <- fit(seed) # 2. use the absolute values of the first PCs for the metagenes # Note: the factorization rank is stored in object 'start' factorization.rank <- nbasis(data.model) basis(data.model) <- abs(pca$rotation[,1:factorization.rank]) # use the rotated matrix to get the mixture coefficient # use a scaling factor (just to illustrate the use of extra parameters) coef(data.model) <- t(abs(pca$x[,1:factorization.rank])) / scale.factor # 3. Compute the offset as the mean expression data.model@offset <- rowMeans(x) # return updated data fit(seed) <- data.model seed } @ Then run the algorithm specifying it needs model \code{NMFOffset}: <>= # run custom algorithm with NMF model with offset nmf(V, 3, my.algorithm.offset, model='NMFOffset', scale.factor=10) @ \subsection{Custom seeding method}\label{sec:seed_custom} The user can also define custom seeding method as a function of the form: <>= # start: object of class NMF # target: the target matrix my.seeding.method <- function(model, target){ # use only the largest columns for W w.cols <- apply(target, 2, function(x) sqrt(sum(x^2))) basis(model) <- target[,order(w.cols)[1:nbasis(model)]] # initialize H randomly coef(model) <- matrix(runif(nbasis(model)*ncol(target)) , nbasis(model), ncol(target)) # return updated object return(model) } @ To use the new seeding method: <>= nmf(V, 3, 'snmf/r', seed=my.seeding.method) @ \section{Advanced usage} \subsection{Package specific options} The package specific options can be retieved or changed using the \code{nmf.getOption} and \code{nmf.options} functions. These behave similarly as the \code{getOption} and \code{nmf.options} base functions: <>= #show default algorithm and seeding method nmf.options('default.algorithm', 'default.seed') # retrieve a single option nmf.getOption('default.seed') # All options nmf.options() @ The default/current values of each options can be displayed using the function \code{nmf.printOptions}: <>= nmf.printOptions() @ %% latex table generated in R 2.10.1 by xtable 1.5-6 package %% Wed Apr 7 15:27:05 2010 %\begin{table}[ht] %\begin{center} %\begin{tabularx}{\textwidth}{>{\ttfamily}rlX} % \hline %Option & Default value & Description\\ %\hline %default.algorithm & brunet & Default NMF algorithm used by the \code{nmf} function when argument \code{method} is missing. %The value should the key of one of the available NMF algorithms. %See \code{?nmfAlgorithm}.\\ %track.interval & 30 & Number of iterations between two points in the residual track. %This option is relevant only when residual tracking is enabled. %See \code{?nmf}.\\ %error.track & FALSE & Toggle default residual tracking. %When \code{TRUE}, the \code{nmf} function compute and store the residual track in the result -- if not otherwise specified in argument \code{.options}. %Note that tracking may significantly slow down the computations.\\ %default.seed & random & Default seeding method used by the \code{nmf} function when argument \code{seed} is missing. %The value should the key of one of the available seeding methods. %See \code{?nmfSeed}.\\ %backend & mc & Default parallel backend used used by the \code{nmf} function when argument \code{.pbackend} is missing. %Currently the following values are supported: \code{'mc'} for multicore, \code{'seq'} for sequential, \code{''} for \code{sapply}.\\ %verbose & FALSE & Toggle verbosity.\\ %debug & FALSE & Toggle debug mode, which is an extended verbose mode.\\ %\hline %\end{tabularx} %\end{center} %\caption{} %\end{table} \pagebreak \section{Session Info} <>= toLatex(sessionInfo()) @ \printbibliography[heading=bibintoc] \end{document} NMF/inst/doc/heatmaps.pdf0000644000176200001440000151345614661566506014747 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 85 0 obj << /Length 2829 /Filter /FlateDecode >> stream xÚÅYK“Û¸¾Ï¯à‘ª²0xñ§rˆ7;ÙòÖ®=•¤Ê»…‘¸#‘Z’òØùõéF)Q3ãÍVå"’ÐèÇ×4x´ŽxôöŠ?ó|s{u}#M$2&E¢£ÛûȤL‹4JsÁ¤”Ñí*ú¿µµm‹¾ª×‹¥â2ÞØ¢ßûŽ¾î›–^~hêÚ®aÞç…Lc‹ƒ"~_ô‹¥ˆÛê MºYd&.ʾi«ÿÀÔ¦^ürûëÅ£œ™4u<1!u´œ™Ä?.$.\È<~X$Y\¬­_*FKUÂ$ œ[óÃû›ò2a*‘aÎøÒ*þç"žÛ9‚s&s¿XFB#°V/u”D´”9Ë "l]V°[~m_pm$Xž˜ª˜Цþå°>t=M•ò¾d±äRã‚3 ]ß$Ö&‰–J1¡Oð®ë[Ðè…õÑ—"‘Lg)¼Hà>% ·› l)s®Öµí{K_+Û•mu‡±õ36 Úá‘>ú†žû_L¼ZˆøP†ÕÕÏ\(ÛÚmÖÓ`U\v€ #LòØO>B ¿îÛfo€´ j€ °ú¯¶ì»WN·K¡X.Õ%Ý¡Dþ6‹¥Îó¸èèÙÚþÐÖvE_w8ã+½÷K/÷‡º<Â18J&xSïîç0›3m²0§ªäÉ,ˆI=Dáíû«äJä:Eî%;Ê”¥à¯~ò¾pBÝâŠvi×~»ބ޻˜=\©tȽîÄS;æ,‘›ÑôŸyÂÖ°¶÷Zß²‘ÐíÚË ,DŸÜðP>Ù‹¨ ¶XæF–l,“”IM¼+P¿ÊÈxÕ¢G M0`ëuUcè:j«vû­Ý! MÜ#ðÏ|w À™O€@‚M¢‚Ê Ø$¨ l“‡‰ààš'ñ㦠À³VÐç¦Zo¶_ƒ›¢.ÍAþTˆùÛ‘ƒé’¢¨ bÍ=Å.H Pç<°EÂ4„‘£Ë2iÎ29ÈDî6z!¾ZÄh¯Eòc ð[^Bž,áÙŒuùäŽL§c¬¿"q‹zEzÅ€\|®Vq¤l¾(¦ÕÞBÜ#;f A‘LíHäRÿv¨¼Tîó 8Ó-˜þPäa ÁÈÛªÀ†aƒRN³ƒŒ{·µá¯ºé ˆô"ösB/LTwh[ï3M‚O¹ï]ÖP<=ºû £û¢íéÍqO‚%xÃþÙ<.Àê©‘Ï$r 9ZŒ< 7¹;ø]wEÐ|Ø`”Ô´õãe³Û;6¥‘‚þQ?^–Àpî&±jŸ‡RH;IDUïAù²fÄ?B3¥Sª%¤f°½€ré „ï€®©èÑ]„ø¤2ã@q€êð±|iÿØÚmµ«ê¢­lwr—Bs`M\v¡I~ ÉVB)“ûMl# pÇ? 2·öÄbÀ¶^ >@¹tŽž´óƒÝž±e€bP¨˜±l BNóÔ9ç¨ÈfØ”žÍw6oª]=c'{©D/¨³Áÿ‰ÿAÍêŒâÚg»“Md*/±óGŠ!¿Ù Ú‹ñ×¢/NjHiv{&M–½ŒÇ—Ëö{¤9q·¡ø„¤ÕTœÓ½¯¾@¹éJ Þ O°¤ê´Äœ LfìáXôz¶âLYƇ|[6öþ‹î¤çN ¢A¤ºÈ¤È¡˜:9à|C<áLyì$„v×}ôê°Jt@(üÏ_iŽn:>­\} — .!.†a °æfÂjJ¬~´o «‡£þyÉ!tòq>¡úÁÞcû œ)]RiD,ä|Q%R¦s,à±×‘‘29¯ˆhù±¿Ã]»&íªqp¥«q "CØd‰¯qdàË O*pàLÎõä‘eËÔoçI•ûÄñ¶ å)äŠÄáOé¸õÓ\£û¢]ãAçQàóäÕˆ¼€t „ Æü÷ ˜™Ó!a8|õUçän8Oˆ&9ÓǨèg¤ãù¸÷ö3çr† ¾s3Œ%Œ 9®éUÐ*ðWl×M[õ›]ç¿«WYOYëðz8g?çÊo0‚’.^˜ÄwÃf˜ÊÁ9ÉŠ½;þåñ—jßJ :¤SŽrÅåîõœu ‡ê,ìšLl4Ñ'üŸsyT¨TsÔ8KÄp†ÿ€U™øĨ4þÓŒ$àà蘥Ræ!þ¸/›¡Œ NnŽ”g@éM{"õjŽ?ÃT6ñnŠúhò¢õê›…¿ƒ|éÝ#•°íæÈ ñ4p…Ñ/î@äyŒ¼@3œd,/áä)BL4ZÛÑ×–A“pöÍ}áA–iŒæc0Þ:gOD˜D Ô ØÀŽahˆvDœ#ÓT9Ž7AWϱQF'q/›íaWw4Ÿ`q¤)èÑ)¾ö]×Å€<|ö»(‰RœeÇÆë@—²³””ŽD_óÍ6FK*Žu?õÀqž;s*ßæ±Ø½‘™ûÆŽºÐbÐ…#t\¯ ÈQtÌBø§­î!2ùî<-v12׃„/Ò_h쌬®Mò¶¾9 peÓðj†¨«<³ƒ‹Îù­#|æò“a\ ècj­f€Û°w±Ýž°CAùѧ†Ùñ0‘é—£v†àYfk;6W?8XÉeLËq‹ˆwÇ«3€0µ|Ùðl•ðÆ–Å!Mî/FàÅ]Œ¤t1B#P„y»UÔèÂÁGw ·1Ò˜ø°§? z싪õïéBí+êÙnhpUëù(‘.¡Î×0G°ãÿŸ«»“Cœ¿…‘ŽA‹»Ã¶w—7Âñƒÿ9‰q =ÔèÞyîÝÇö퇨bè(¦f’uKR}ÖQœh\b=|¼W!Dù./òÐù>b[liß™EMf`+'àŠ¦•:N Òpu%f‰Ì§Z€]ðú ׋Ì)Ÿ£–¯¥‘£%ðëÊ!zëœæ°÷츪îàmëÖ`c徕ÒDˆˆàõ¡uå‹'T”àÏäÄãýÉ6ð²r]|ó7‚8ulLÃL!ª7Ö·ªyL> /àNî"&T9ãô€àƒ¥3Êá¾§7<0@‡eê˜ûJdº e·Ë®q7¬0Œw+$Ì­ÊÂo_Bm{_P-3}Æ> †Å¾¸«¶U_¡¿»0D9"Á}³Ý6#î N ÉvÀ‚«ƒù}UJœÒ÷Øs×cwCþ²Š4à˜\½žœ~þv{õ›?:‰ÈÀ‡º<*wWŸ~áÑ FA¦L=º9»H¤Ê¬¹·ÑÇ«ŸèÒr="8—tÏ,9¹ œ½ØQP¨˜ Šýãm‰<ž™6 Åã¾ßw¯QŒk0Áu %8k—‹eJ—'ËĸŚv}Î +Ày :ïŸg.?Çì.ýŽ©»!˜\çü˜Ýϭϯá§IÆ@ù§/ˆŒ,ϳ¹ëW0óŒÔ32 endstream endobj 108 0 obj << /Length 2767 /Filter /FlateDecode >> stream xÚíioÛÈõ»…€~¡‹á}d,Òm²Û¢] †Û¦ÍæÃ˜ÉlxíŒãßwÌP¢Ì8v4¬¢0 gÞ¼y÷1’Õnå¬~@Ëh¤M²LX(ؤڊ Ý5áU †p\Å`Xt½¶fÆÁÎŒ«ì@0¸à•lÜwŸ1{‘‰QÁ—­ÁìÈ=4æÿs–>d«8d`¸ÌìN¥¡ãX Š*ЦbHÏFOEN²¢%^ÙÉZ*Qž³@f¡ü\\•Ó’Äj÷ñ”µ£¶C©¢(YŸK†Ki—8’Ó$§˜4™jOJ]7½@¿œ‰&‘QVY¹à A0…àXå„÷é#rìÔ\À;wÔš&¢®Ç-¿‰ü0à‚O¡ÍjHHÜÉðà"¶Y X‘â)sö„äŽÁº\õZÓÍp²q=׎!PÎIéKæ†Îçdc;ɸvmÙôÝË—¡7ƒ1ñí( ¿†ñØöí¶öxém· YÀw÷¸¹ôÐõÈè wO @¿{šÚ‡&—ÇÅ™7 ½˜’"ˆ9 ñÔMxË/žëÜW•ÑÈàÍ– ~ a7q!ç–EUpÊ =NNC…Ÿ:©+^À܃O1bà÷^éhÞñ{&ôn§ L»òÜœx7«øPozÞ¨ô+L&`¢3òò<;ñGyeM9TugHËu4 <ˆFÞÔ"9âÜtç¬;]6ÅÐ7•à, ¯€²Ç‚Ãâ±Ü5ªÈ(5á¾ZïÐ2#§SXœd¼ƒ}R‡‹/j–•ÄUwô zý¼/(™¢'õLÒH]­Ì†_=ln$/8µSÅ8íu‘¡…Ä‘«ó €ŽáŒ XÑé¡¢á%/¤êòÖÀ”%évõ\4Ä^/Åp¥SãgLÐ8³A^PnÆY$UéxVµEÝBŠdTB”‚%|=d²ÀÇ*£è¬Ðˆ?¶à¡&R\«8’ÞòÒ? ‰(½—ªi K®×šÈÄ\Ù¨ó#“é¯)úg1¡{šº–.AÕ@¢mºM«¸Â"D›/«r¦_|¸Å…ß`q‘©s´‘ z  C;T‘1%ANì½ì»eýb耖¢£€…´&z'È;Fko¤F®Knui%ûk]†SÄÓƒÈG3‘£™ .ЬÁ`äГÐ*7rÁ¾U¢eMžÌÏg[/“_HdÄ&­—lcdòÇȦ¥_ïÆÆï5ƒØ]5¡Å¾duãi‘‹éÆõ<+pÁîÕõP¡øuEÙñÞ}(”RÒ`z|ူéM”£¶ã*QfÅšI8`ÇóÉ Å Ÿ¨ù((ØC§ƒwV7uðÁêÓ –yÇCËσ&¯£~q£ Ÿ [JLa ¨Â†Lò˜{8\­šal áš¼$1÷8¹4{ *ãhwÃO®–ûÙÖvo\lTH± ÓÒÞÙì¼Ô^<©| ´ÓQÑß?W9v2B ï9®Úaü~-;\¯““¹i  S  ‹‚_Ëž@¯6Ff†Ù•Í7%¸˜•R€ôÀ—ñ«Jñ&êg ´œÇ˜ô¾ÆÄåZ›{Çè…Òûô½Ã\ºÛÇI_70@'`ñ­Â#ssçU ÓúÏ'ícý)FãĪKúó£8Ëqf°û4çBî(tPÁègîàtÞg °è"“óWg4=N¬¯Îsu諳?Š^ð½™îÈBºÑðA”²üò%š¾C{»N¸À\SzÀ ”îü:=þîYµæ`êàÜwÃä¸o8ß‹ g÷­,m×X S…ƒ9Ðkú\=6 ~(à¯KèLf²ŸSúä2Sty_í˜Ù®©¤Ñà˜m¦MG¦o8tmÙËN7 ¶—¯Ÿj·º;yñ#@¦x1tðIÇ“‚|syöëöIÎÊ]%±í¸Ð ù¶Æ«¬:ÃéÀKì4NVnìØ¡¯”\mÏþö(bÎà¤'еC¿1äñä…ùêŸ~uá…>p³AüCN8ZŽsrqiˆ£mS–Í ±ŽÀ§¿]yL—Ü8¨ô,bdçÚß e Åâ- Gu9ᥞÍ_y·mA…^°ÐMòhrO>”%9xµ¤é{'-{h­úFu ò@ǼZÚ./þþfáº\’»“Ö â{v™í‘÷þý¢ gIeøðxÒXÜUv x ;wZ×í‹¶ƒž'rdÍ']¼?u奻îúÔ+¯¥¼pÅ…~ü¤#?u­¨ºQÕÒj©ŸT'òÔu‚ßðuý³ëNÎ…U‰¶-o—æ@Éö|i]dÏN .^ñÚþÑNn:ep»á;üx^Õòè×7#nø¯“çàßKs0~²dµï:K³ðÿñ¬Â’\<²Bô>å ¸Ÿ_/–¸f~ìtŸ«ôǸ–4F«”õŽö³¨5šñ¤QBÑÿ‰G úIöV‰J>;o{øÍ™õ¡½¯Ì¿÷»¼m—½r•ßä¿ñezÂ?`y¾W)Ú¯Û“¿JAÿÏ]¥œ|¤íþKË)·í'Ý슲½'ß.^Éþô™Ø‰ªOÓ÷Ò™íâÙš•Rd§ûé³ü¶nßÍÿ"ÑsRÛqÒÕÆÇ§þMÏc¿F~syö_AÎÑy endstream endobj 117 0 obj << /Length 1925 /Filter /FlateDecode >> stream xÚÝ]Û6ò}…€XX+¤(ŠRÐ; wm‚Ú ö!@ÛÚ¦×:ÈÒV¢v³÷ë;Ã!å8@Áæ°€L ‡Ãùæ µ,™ŒØÞ³»;x¥çÛ×W,‚‰~Ï_‘”yí?æ1ð"Ì¿®8pÁ"*aœG¹*’¢,¢åö áYZ$¥*"Éެ™h}õÛEœœ/l ¯²Èà™9aó_·W/^)•°IšG·ë¨d‘âø o«è÷ø›Ù\¦2^™uÕ/ÛÝUÚšþ%l7ø©»®î{ëfEƒ¾ÝúéfØš®ZÒ‹#²¨ÍìÏÛÿ\$ܹ˜ ß“ŒEsΓRJlyñ¾ÎB |–A§‡0À‹~wÒ}7¿˜¾êÃ Ž»º¦í¶“)4ô“ìürMé~G¾wd!ïzwÚnLç=mc¶4ªïeÞ?µÕɺÓÛ/îN>NvAñµûÕP¥w.}CÆ{wéF.Ïâ¬û#‚ßNÉíý Ïíò³Bb‚,ïO½¯R¶ç—èÚåëSÞU&RŒ¡*>$6ÏX±\ªózýQš9¨! 4Ѹ™ôÆUθYJbˆLÄuåDÃ¡Ï 0 Ú×.9@Ó(Þ¶8NqËË\m ˜ë×X žb3c Ûc·yÕ¬ª¥&ßr\yN©ºÄÑЀiV¦«ŸªæÎ{œ’ cò¨´«‡Œ×ƒ¡eÆâÛé‘Bž{ñs(žLO^Ñ[QzsÙ ÇR÷Æ3ÊD¸¤'°Ñc´×ÛûÚ\û¹mÛ[9 ‚ët‹xµÈ§Ã_è¾êÊÖXcHÝ÷Np\X8=diHàð‰L@Bii~/¢ñuÇ:"­†Lk%o!¬8n‰r•HQ‰O´âÓ¨½Yµ_å7×MÓZMÙ踤ÛÀÞ[‚>ÁÕ÷. ìŽÀìSÕ•E…>Ñd»¦_L÷ikìÆŸ[=A Dé h Ú.ÇúqøèT0r©°Fkõ.):¿AÖÃAºÏÿ÷˜ ”Îñœæ½óƒ4†³—4¯‚;ƒ5•7–Ë€0ûPõƒ®«ÿùUŽ9„[ÝÝKÀpâ¸]Ãî4å•é7¬ì†à©ˆ†v°(§¤µÑ™Ú<Ì$ú`pH€’{c©ÄÎ{È€ÎÔpXõ7zryXÒWa9(Y×õ‘}p󳈀”—»c×Ëx*@}“‹€Í—fçbþxûá]€ä°%°{tÇK§½ ˜óÜŽ‚®øáõœ{I¦|vƒÃwê.ãrúEÈs'Œ óHô·ë®}œR€LØí}ÆÈÔªÇ{($úº p $ú|Jæo¦ä> /ExtGState << >>/ColorSpace << /sRGB 124 0 R >>>> /Length 34863 /Filter /FlateDecode >> stream xœ¬½Kï$»“ž·?Ÿ¢—ÒÂ?Uå­ª¶3° ÒÌNÐBI6:¶¤±¡¯ï$If½OôŸò,N÷iF¼LV^xy$Ÿ¿þæ×ó×?üúoüûï_üã¿ý—õë¯ÿöÇÏãñøÕÿù·ý¯ÏÔ×þëüñïþý¯Ç¯ÿøÇó×ßœÿýÃÏâðë_ýñ|}~>ë¯ý±•ÿùëùX~žñïÿòë×ßþ1&…ËöÙ~ž‹¹ÜrYö×Ïkr“:—çÏú.dÿùë½þìËp!årxülÅs9þ6–uHê\Nåc¼LÍ÷Ï_¯ýgÙ‡Ë )á°o?ûSæðyþ¼>CCJ8t9ŒÅ*wýý³®C1ǤË%Ëe]žû˜Ët¹¼/—–TnÙöó~.CÒåÒ—åžËöüÙ–1—!érérß›Óåýþù¼Æ÷hH —íóùy¼t.ërülc.cR¸lŸ÷Ïö.dŸ:ŽŸe.4&u.¯ŸÇ¦sYžÏR¶¡¸CRçré¸]¨f|^èü…Ÿc¼Ðt¹ôÏèžËë´=Æ\†¤Ë¥FCñN—óõ~lcq‡¤Ë%ÉeY—Ÿõ3ä2&u.ëϲÜ\jR¹uûÏ{]†¤Ëå}þÂ7ä²Ïls’.—óé®ÏñB-ãÓåñúÙßã…†¤Ëe¸/·\–Z“ ¹ I—KŸËP¼RÜÇÏñ‹;$].Y.ç+µ<Ç\†¤Ë¥Ëeü´N—ÓwY†OmLê\ÖRqÊ\Öckïϕ˘Թì?¯û…jÆç…^ki@û I—K_n¹¬g»t|ÆâIƒ‹W‡cÒy¡³¹XF—1éréïî-—õ|žñBCÒårþŠçgtiI¥¸ÇÏ{]†¤Ë¥/Ë=—eýY_c.CÒåÒç2<¶Óå| Ÿïá1ŽI—ËûS¾cËûù³¼Æ\†¤Îåñ³îã…ZƧËzv…žã…†¤Ë¥ÿE÷\öó]ÞÇ\†¤Ë¥Ïe(Þér¾˜ÇXÜ!érÉr9¯¸oc.CÒåÒåòoþ©z¨õ¯£VyVÑù½ý<­èþ]ÚùŸ}ý²ÒçÙýÜ·Îj þÚ‹ª7÷¹EÞÛÏòÌ5áÏóN”~Ü·yP¯«Ú%”еtZ;sŸàæå]zO¹%ĵïæ[æW‡¯Opugîo„Ý–ã´nµý»tò~ÞŸ/ëí–nGi!:sK8{ï?ë2˜ûì<óÓ|ì½¹%”nêÏçñmÕ¯×ϱôæ–Pº>?Ÿ}0wÙyæçgc .¡tV~Žç·yTŸßÂ:˜[Bé–>mo̫ÃÕ%Äóú2ê³Ûüyõæ–PßÒ™íÌ}‚›KõôéÍ-!®}7ß2_ãö ®îÌýðÛr:½ÞÜJÃV¾­/óí¦¾Ëh§7ׄÒ1,}ÔÎÜg™¿Ê+Ò›kB”üË<¨÷çÏ{ȼ%¸º7w…‰¢-Ì{0ׄP™õqö”½¹%ÔÿtëÍ]‚›÷ÏÏkíÍ-!®}7ß2_Ž÷`® ®îÌýGçŸàq¾žÞÜJÇ÷çóþ6ê÷þsl½¹%TõÙgèÌ}v‘ù™×:˜kB”üË<¨_ÏŸýÕ›[‚«GsÆ‹vþŽýÑ›[BýˆÎ¿¿Ì£ºôß½¹%”Ž~¾õæ.»È|/p¢7ׄ(ù—yTJ/»7ׄPwæ®0^´sd¿¾{sK¨ÑãùmÕÏs0þì–R¥Ã=8t9Fþk©zsMð›GõÙõÚsM(}ÔR%væ>!̯ò¤zsMˆk™õ9>^Ÿ½¹%¸º3wÂoÌ9Z_¶ÞÞJǸ0£/ó×}ÝK§ap¨)e¬P>“Þ¡Ï2.°ÿ,Ç`® Qü/ó¨þ”!co® ¡îÌ}i®Â­Ñ'R<åpËáÕ –º”+‡Ë¡ïØx7çl޼ÉíjEv¶*ßöQþ:ʈ¡3·„ÂüÊØ®·^ùŸÝüut¨)eôZzkÊaÌ¡TrËàÐRêÇñ†<¯K<ûèPSâ ‡[ûÅ“û”+‡Î¡/UòìxöÁ¡¥\9|9ÜæR:sƒCM‰:‡áéÄÃÚWï¬O9*kcKéÌn½ƒ¥Ô¾çy[‡>ϸÄYô÷cph)…~˜-n9ìK|ðCJ¡¶epÓ; y^—8®.QŸrÝÉo‡1‡³&|½‡–r:œÝ¿mtèS.‡Ç…uú”(ƒp¸å°]Ê>åÊárîLܨm+]ôÞ¡¥ÔÖþõV÷[}öLŽÑ¡¦´u Cž×%_Ëál—épËáÒÞjJá@e\48ôyÆ%Öwy•{‡–rÝÉ/‡{!—«Ã×§DÃPª«GÁ­ƒCM¹røvsØåô-%r膧s=¬íg{5åÊáÛaÌáØ†'R¼78ô)—Ããg{Œ5¥vÊ÷ÎFù=:Ô”Z‘žMøàÐç—8Ç8Û:8´”ë>|9Ü ¹DŸjH‰z‡¾TW!ÒÜ5åÊáÛaÌáµ\]«>¥pÀ‚Ó{‡!årx78Ô”(ƒp¸å°Å4Åråp9 -ˆ7(Ï÷öóøô–R‰Ãùú;Ü›¤íy åú”JÇžËèÐçy]â iH©{Ó·Þ=6¹RêÇ[îCç0ä—xe} -库_÷BžU÷st¨)‘Cç0”ê*äñó8F‡šråðí0æðy”ÑKïÐR"‡Îax:ñ°øp†”JÞ‡r¸åpþÌ÷:8´”êp6å½Ã§_ây>ƒƒ¥Ô!Óã%¾ yþõjJýx·çà0äy]b-S¨ƒCM¹îä·Ã-‡Wt‡”+‡Wßá¼JuòY÷àðlÌÛаp¸åðººI}Jþ¼ÖÁaH¹öè.)W¾n9|Ê4ÀàPS®.‡á ‰fëz¤}Jí¢<6å0æP¦šöÁÁRªÃ9ë†<ãgpy-¥’ºM:Ür(“òŸÁ¡¥Tr6£ƒCŸg\¢ ßeph)µ›ôx+‡[…0lƒCK©9œ]Á¡ÏóºÄ^š™Á¡¦”y«šƒps(·zth)µÛG‡!Ïëk`Ï!%Þ(ápËáuuû”+‡WߟÜE!Ÿ?ûgt¨)‘ƒp¸å°Ç”Ôråp9 O'Öò‰°£!åÊáËáþ¸«³×§ÔJìì^öCÊåP_£Á¡¦D„Ã-‡OéÐ5¥vrޯѡO¹^WpOŸr•áÛaÌálÂÖuph)×àå0|­ññžƒ…è ö)m³(‡[ÇëÂñ}JãñËèÐçy]b¿ª >åúßcû3&:‡”z£ÖmpRÂá¼Ò²-å*×Ãýkt´†”È¡sîÌu£WÀLŸR›Åsh«Æ^û…«ûVƒCŸg\â|¸Ïeph)ׯør¸r½º¬}J‰n)sc½Ãr9<#ÐlH‰2‡[ûÏcjÊ•Ãå0Ü™ëF=úåJiû!n9|~Þ·KÔ”ÚÁxŽCžq‰ãØmH¹~ŗýK`Ø!%rèúR]…ù3¤ÔFíùú”Ëáquzû”+ÔàÛá–Ãù1£CM¹r¸†ž•w´–Ï“oCJ­Ïn·ý«¶/†”:<;à½Ãçu‰Ç5³Ù§Ô¦¹ü(ápËá}õaú”Ö¸¯ƒÃg\⸽žƒCK¹îä—ýK„H )‘Ãèp•ê*äó!åÊáÛaÈa=‡]ûp K‰‚Îax:ñ°ÎOÚ_¹!¥â¦ÚQÿr¸åðzõcÿ+¥vzoCžq‰³»¸¾‡–RQð9È·ήþ²-¥Á¢ÏèÐç—8MüÚ§ÔÏÿ` ‡{!?x2¤Ô‡õþ Cž×%¶˜œR®§ùí0æð|Ä<ëR”s@68ô)áðx_ÝÅ>å*×ÃýK Ø¥D½Cg®u\ó½}ʕ÷Øò\Óž}JmPήþàЧ\5Üsp¨)W`×·Ã-‡­ÇWÊ•Ã6ÌÏ×K»nÑêSj×ý¼åÂá–Ãþˆ[=¤Ôf†<¯K<® Ü>¥D8–ªE9ÜrxÇäãRµ×6:ôyÆ%–wÄ )×ür¸òCJäÐ;ô¥º yD—uH¹røvsØ1<¤D½Cÿtâam{L¡)õÓ;®p¸?î-ÐßRã>ïÑ¡ÏóºÄzuÕú”ëW|;ÜrxÅtöråÐ9ô¥º ù,CÄÁ¡¦DÂá–Ãë ïSJÄm´ƒCŸr9ìW§·O¹ÊðípËás¡¿>åÊárZÒhXÏÎÿñZJýôJxá·Ã-‡²v`th) änƒÃçu‰õê&õ)W@å·Ã-‡WL€)W—ÃPª(äë} ‚ú”Ö4¯Êá–ÃÙ­zíƒCK©iéVõ}ž×%Ö˜¾RêÏ<«Cå0æpvõ·×àÐRZ Ò18 y^—xÆtöwR8ÜrØc*yH¹r®RE!ÏAÓþZʕ×Ãýgî1|RjEºårXKÿàPS¢ Âá–ÃëÂn}Ê•Ãå0¼!× ³öÓ—WJýü—·trØÎÎ^qw¥ÔÊüììôCž×%žÝ‚.å 8þv¸å°_]Ö>åÊaïû´W©¼k !ÛzK¹r¸;|ýÌÏ5m×§Ôæ}Êå°_D«Oi?s“c%\êZJ}aÎnöàÐçy]b½âô)-n9¼bvH¹rèúR]…|ÆTò9‡[û…¼ú”+‡Ëá{¡ÊßÿãŸÏ³,Qùœ#ãöÿÿø÷ÿ×g _–›´ÀÓ£0¦µtþûúã×þ£ôß·â||Ï?×µ—åU’×ë8ßïãKRz†ò*¯³2>%k-Øù£;ÉVºvBòùÔü·ç¯òé%µn’}-¿âu–ú¼ÖÖ¬Eû ɱÉ».í)¿¨“쥧¤îØóø·zë VbëåU>µHŸ³en7ü’ìkk«‚ÕÛû^êÓ9n'y ¥ özÖ"ív­KR‚ßåUÎqÕé¼×ßòeéHÈ«¼ê«ò~Õ«œã¡NRCÍ壬OÿÙ®õî$¥‰Ü“§_…¯ó±v’W‹Ëù~ú¯µ8ïåÏ÷𼟥Iâ«,å·kÿ[Î6kýHI»½íX‡«ÔÐg¾JýŽGÿô˲[yþ*[Œ±ºÊºÖ‚ÕŸôw¬†E‹Ë¸u‡vk¬–¾|ó}Žøj—ún{yÓ_Çna±TЏ+r4k gzëb~ù5îõkô*é9hÞe`1÷»Zh¥*[}Iö£(_Çpsp¦?Èä:-lîP lDk ÷›ª˜K¸æ.˘¼my'•¢ºÍýêc+Ý(õÛ÷ô^¬šì5ïÒ•™»N >£’¿Žì jÁRso@ òš+c ˆÒÍ+ÖÉe‹õ]¥×iÁ>ôkÏNå[æÈÍïrvÀÞ²ä\ µRØ> h­!h­Ad-S2“ßÊR&ï&¿çåìpoò:üf/% cú:ø‚¸#³lëô´l¯ÌwµM„£u/ Ñú‘ߊwSë´.Zˆ@Ö6ŠÖM¾én}Ã;½Ö^Ëþ®mÒг)ǹûú>Êô=•âóÈÞô2µÇoz›ðkÙaGmÙ&A¿½k­‹öÚMz oUÌoï§vÚ>õ޽—× ÙjHüÌ[Ÿu×õ×6ëýyÛÈ¢Ó´ õ{E³}êÓ\–AsÈw:-["ɯ‘[Õ ýåuøM3@>W¶2JÂo¥¢fÙÊmµ¦:ŽÚ=Ç?uÑÕÔ[R†Dò:IɢH·IØ×[§ü®Òë”QÖkÉmPßòR¯w96H8WŠ2Ò`þµe ${©Éu ¸ã Œw¸ö(° û£kÅ`_v;Ç+‹ü~¹e¬@g²ž¨ Û¤Šgt»YëœÙ»ûn«ˆ²´Áß§v?V‰˜„(K£Ÿ÷ÛøÄ%AÊrÔ*ÄðÌkï%HYø*š²4#òê×{¾ï¯.?ä)j¨oæ)ßœ«I§4dãö½¿7ÈS¬`õ›:ìmkä)í9¯õZ‹}€&!ž¢8—Iˆ§¼÷ç¯ðýU~ÇSÞ[mÅúŸ<… ö;ž"®Â<Å®RÌ«ÿ-ÈSÔÝ$ÀS̨ÉI3#ÑXÉ5DNøýdr¢ú@¦r’Ý â)ºŸa¤,Éu˜²ÔßóªcÂòÂö¢,ji¤,IÙ€²˜xŠ[5O)w®VTõÙ:gs Q–¤ŒHY;p¦,éu½(‚æb/ª÷æÍ^Ì ”%-9°³"{á–ÙKòÝ"{IJŽìEõÛ]£ÙK~Md¬ƒìEÍã¸F³oÚö¥=ùþ­$"“Õ Äi²¯ŒèMzd:|W™é¨^¶ié$×A¦£Fž®!¦“\˜Ž[5½Iï*0´» ¤'-9ðŸôIJ¯¬È¬ÀŠÜªY‘[‘a-ϬHÍ&ºF³¢¬–'‚¤y§k4Wʺ¦D›²ÚTö™LqχÉTr SnÕ Ê¬H›¶µv·Û@îý´‰ß!¦Mü>0mJîÐ&|j®”–i¿•L›¡2Ímr Ò&¬+™6q_Šh“ÏX[ ð^ 1¨Wm¹ßÇúU'3ƒj#9š¿†çƒ Š{s Ê5šAÞ5rã¨ßKẽF“©lLB¼*-P¬ì‹d¶Å×!¶åVM±Ô Ūý¾¥,VÓ<¶h™‚…VoÑÛxµ× ÇÅ4²Œ"Õ¶¤|½F“¬gݘ÷i›ôúwä R÷Ü4SC®!Ä•]G3.³"ÎR#e×ÏJJÁ@ëuÄ(ÊÛ#×ü†h @Ï5„´TÛlšß1­ÚzÏQCPëýöw÷Ꟙ©Vrßkmµ­ñwexë‘k©Y|Ó` ªÑ\ƒ‘B왆1˜‚Þ!"–Ü9anæfÂ[ª vò-Ô"\ÙÂåf€YaÖÜÊͮŒäJÌž„h&@ÈEÈ®²[ðÊÍÀ©ÂŒHJ –C4ä"DUª#"ͪò+!ÂJ*yfXÙSFˆ¥:S.šŠ ‘ÆXa¦¢äæ2ÈjMM«Ö^c¥Î$KE¿¸QVRu2ËR‘™!"˜¥†FÑ=#š¥&C4¢ä"àYa&t¥ÀLˆˆ]%}€¹€¤i¦åfÄW H„ˆø• ج¬ô@°Â¬aUÚ †•ÿd@[yé™x%/6"/…EBDÌKñm!ôR+DD½²Ø+†@šp…yf¹hŠf…Hã¬0kžåfŸâkŽh¹‘Vöã€i…Yã«r¿JhXY9‘`%5;#¬ìA†¥%\„+ét0ÅR‹BD+»åS±T!"•Ý=$YÙ@”•=\dY*^ÀE³’FŠiVF/8T‹¦«•4]„¹ôdS@¤_ª÷wú•ín~©¦Á4¿¡_Cx‹iúuÄu Aè5ÇU߃öq¬ë¨!úÕ¨ÎQ‡v›3ЦAú%ßoÓý’·i(ÂK¾sMLÌ­D¿$h¤_jÚ5D¿dµa¢_ɯEú¥æ \Cô+¹Ð/·jÎåV"ZI™hñ=G¢•ü.&Z>T_åÏ6ŠpMœâz.šYç"ŒíJÞW¦_’‚˜èW˜‰sIdê"ŠäÊî‡rÕÖi«ÕÿëyÑŠ99Ô4²ü>!?“#Í„~¹øY˜”™™H™›qá\rÔ%íå\PWˆˆ”eï=’²ìJHÊ^Ë5Ëô¹½nSá^.Rf í’½2)K ¤,y…™”©U3.BR&‰¢‹ˆ”%퓲ìF )“£)ËŠÇ«ù¸=KB¿Ô¨ÙEšŸ¹yŽ”¹H™™‘”%]»¹H¯)S!Ñùž‰õ ‘ægnRfbbÉ·œ01nŽ˜‰ÉÉxËî0±0kúf ïJÚŽï’ÃGi&æf¤_É£™[f"\g¨&ÍL„¤,»¯4ä.Süů[ý•]‰&}G¦j’Ûºˆ¨š„I.Bª¶¼¬â*Ôa¨¾˜ªIZã"¢jIÓÁTMN†¹ˆ¨ZöUs3ò³dÔÏü,+ò³¤ác~–4±Ìϲâq0XòÌñ³&"~fMʬ™X@¢_0µs÷»¼Öã$‘~Iðjš™5Œ¦Aú%ï–iˆ~ÉïØ4D¿äð¿i~ÉŠÓ4D¿T<¤k¦èWÓý2«¦_fαs¦Á} Tgâ\røÑ4ȹ’{œKŽXšf.ÊË4å¥9¦A&¦j¸¦A&–” ™Xò½2KÐd”—‹ˆ‰%ŸìÜzÇi&æf¢_nÖô+ÌÏefŠçr3Äs™™)Uò4˜RqE”ÊÍsñ\.¢Åˆ¯˜W#JÎä""ZÉgÈDKÅлhŽh¹ˆˆ–¨™ˆV˜q¥¢Xi¢)ve"bWn&v•Ýû9ve} fWÜ2»Ê®ì*ÌSñ\.š¢TÞåBJ%Ö_„ˆ(Uòº%”*éÝ!¥’S].šY¡è"`Wa¦5ŠIU“,RTaê.Â(/ýï"bWä$J•ÔÉâEà⢙Ջ.BJ%Ù‘‹ˆRI\g"¤TjÛá!¥R ÅEû¥H²‰æb¿\„±_\}$ìŠ;(Ì®²â»r3Pª0kåìÈ“›)F+㣕üJ¢TÏó{xáÆån%ò$»¥MÃÛg©/Ú4DždL˜i¦V6 '·þf ­±16ÍcjbLfÅý²íkŒ°’Î4Dž$A1 ‘' í›fŽ<™F“'³R,•Y!–ʬš™ QòîÎEM5 "¹TÎEHˆTm¨)Ñê@7S|”œ%2ÑÔîW!¢¨)[Â\+ ý~%Šš2._ÙMy¿{FMÉé2QԔ쉛yTv#G%_8GMYhj-äêí¯‰RÉe`."JeqõêŒÎ•‰(ÂJór¥’!º.BJ¥fjL„”J¢-¥’]SÍÅ]¹H³«0kJåfâQn&%釋¦x”õ0€G…Y“'7cr31&Ùw1&ɼEŒIÎL»hf ,Mí"͘ÂL4)©]8Jöî]DŒIsL„Œ)ûÉȘäxÏES+ ½“ + ÝL4Iò!MÊ 4)Ìš¹Q˜5 r3R¹DÃED}äì§‹(*¹5È‚Ü ,ÈÌÄ‚ÜL,(ù˜%_± 0õQ{š¹ã˜ä(QSÒK`B”ô±˜eWBB$çE]D„({±xu`òì™qóš"µwˆ‹ˆ%£¼d“+5`¢¹è&!!R |à?³ÏUˆ0ºIÄ»ˆ¢›2–1µÕUˆ€&e šäfˆcr3q#9¢›äó<¹%Ù ]þtÓhÆdV¤I2‚Õ4D“’R M’-QÓ`Sr¹8&Óà>íjifÓàÎVIÙ(º©Yy+5_kÜê @÷º6ò9”"9æîûœ7Óð*>UË™÷°RÕiÓ`t“¬MÃG݉5¦¡è&ÙodW’Õš†ØUò{˜]%¯±«0c“s™h.ŽÉE¸q»jqL„ìJv\\DìJöA\DìJŽXM4µy{ˆˆ]Éùj!»²³ÞŽ×í…Av¥® ²+®vUY[Å“ë­xÈ®dGÜDsV.Òì*ÌD©’6h2–ÊEšR¹™¢¦Ü äÉÍ@žÌŒû]%õÔܶí!"%k¬7ÂñQ ä¸h*>ÊDĮܬÙU˜5¥ŠŽØÔÊ<áÊ<ÕO4ò¨¤íå˜'9‘ä"¤Tª7n"^¯§&M\D”*iŽ’H(Å‹]4µŠÏE¸a{Ò5Ÿ‹„rFBqÙ•$o.¢H(pë"Š„Êîq.7ç23­âs3¬âs3D,ù`(•›R™™(•›a*7ÃTf&òäf"Orxm"^Aǃ!&OI+Éä)©Ù˜aÆ}ž’rNÅÅ DSŸ0k¾ãfà;aÆ}ž¸:˜ÛóÛE@}¬ùŽ›q]šæ Q…UB4s2] ‰ú$½>¦>Ùmêãfà;aƵr"(ÔEC$æB4sÚ\ˆfbˆ\„1DÙH×Ê% n²V.y ‘ú$ƒ}^+—4¸¼V.ûM±”´¨sK!ÂýÁ¹y›ÛĦ™ãF¦ndVâF* Ó4o¤xŽiˆÉÓðª8U˜¹‘úlLƒ»†óÇ($¹äš™Uq¦šäVÍܪ ‘YyUœˆorÍ̪8Ó! ³fAa&ê£hºhjç¥ 23° 0kêfâ;jÅEÈwduî¢ßða $Míù"â;²]sÑoöMR•Ç\ Qˆ4õq3òìæÎñß13ð0ÉQd.šÚ±;DDrd‡ÍEDr$32Æ©ãB4"M}¼|'̚丙MÒ${~‹(ç³QûD×÷XQ¯!¢ 5Mè"$9ökêDtùÿAD$Gº]D$G¢\áš6µÙTˆhM[òº1õ‘ãMõQ3…ˆ"‹$Æ÷î0EÉÉQdQv#ˆ¹™Vº%].¦IYéçh’‹(²(éyrdQÒÄ3yR!!"ò”tr9Þ()^²þM ’M„ëß²âͱ+M±+aÄRRYñþQr–ÃDȹ²â1çâ~É\tS Z5ç 3îQ.‚ŸBDqLÙ³ç=ÊùÃNVÐ%ï3Ò¯ì>ý ³æ\n¢fÍ®hJfͣ¬ɓ›1…׿qÝ4I“\¤iR˜57 („èj|pÏo·jBdV^‘&Ö!»fŠ™†X ³2Í 2 ­H“Ÿ´ip‡$…<› ‘ 0 ì$O[2 ¯HSsô¦!B”Ü7 Dfåݽùé! JîF%%ÇÈ"Ù“1ÍÌŠ4Ó M’Ñ4S4©i&¹h’›5Mr3E ¹‘™1ZHí?">ANL⸈Oã+!M’ÓZ."š$›fñnJÉ•˜&©Á´‹ˆ&É&ÊDs4ÉEC”|HI Qr%`La¦}“²Ÿ<µ wˆpEšš=1’'µUUˆˆñNðÓàNQ ®7ÍÔ‰w®!Î%×x4 ¯øS=qÓLq.Ó@5¨q­í“ëJM„VÙ«>aå"àQffØÊÌ´'”›‘&©IMÑ$”àNàü 1cÊ®Ä'ÓqÅËŒI"Q|”ÜÀDS{‰‡öš230¦0kšfÍbhˆ„ˆÛ¤dp®¿çN¦síåf"DI2‰nRA.‚tn¦¢$Z1F7ecù¹è&ÌÓNQÙ»<µ?xˆ Ê̼'wJ™&%!šf<¯ŽßŽ„J¡Ñ$IE>uøÀ‘PjËÓÀ:Àfen¤êMÓ7’!¦™Úªi8J…˜¹‘Šž2ÍT$TÓð:@ÅšL3Õ4S'Ó¹†¸‘dg¦™Úa¼ih‡q³âãŠÒ7ÍÜ:@ÓM2+Фfåµ}üD1É¢i’H(… ]DäIÎ<¹ˆÈ“ Í0’'Ùp»ˆÈ“\èi¢d%!~Ó yRXÏE¸’PÍ•›ÉSòyrócrÑcr1¦ì1"c’M¯‹¦Ö šhnÍ ‹`Í ›a*3OW"¢IY9&…ã˜pp‘¦InFn”•¹QRåM®ø³~í@åfØÊÌÀ‚¬©O˜‰ïH^é«)¾ã"Š7Jìd¼‘‹€¹÷RÌD…”£’#¡IÉ•€&…¸‘w|‰Ésr\„ÜH-£5ÑÔis!"n$g\D;EeWÂè&9 tE7eW"òäfMžÂ¬S U 6ÉͰø™‘%Ý&DrÂÔES{7™ ‘Ü_ÍE¸‚Ž«9ŽM’«q]D±IÙo"ÆäÃHX+çfˆ7r3ì0nfŒ,’Ë]4s‚œ‹%½®ÉÈ"Ad‘™‘Išã¢)näƒyâF2¦ÝES±I.¢Ø¤¬xs;Œ»hŠ&9 šäfØýÉÍoäø ÑV*ƒg}…Ÿö<׳GôÄ]Ãu@ºk(ÞHŘ¹‘º[®ÑÜÈ­š™u*†È5Ä‚’2" RÀ¦A¤*T×Ìì eš)ädAül‘©Õ4À‚Ü:Cd`An¥ÝŸ’{>µû“i)œâ"DŠš† ‘ÂJ!"B””.Ùw\Lrºhj­\ˆ86é{ñŽ‹86‰Ÿ¢0käæ©ÝÈC„»‘ :碩õo!šaA!Âõob6ËESñF!Ò,ÈÍS§Í…HSŸ0SdQVÎßE “'!Â=ʼs° 0çkÚÆ(œÍœ+ç" Da&¤úÈ!Ò,ÈûSçÊ…£…ø™;W.D-¤†Â!Âså¸óÁ4)»Ò$Å\4E“B„§Í‰.|ˆˆ1©5.šbL!ÒŒÉÍ@“ÂLQH*8.D´ÏSÒ 0cRkC4³ï¸‹€1…YÓ¤07ÊÞFäFI'‹¹‘š÷s®ŠËîФ0SĒнˆa F,%ãŒXJ^‚¹B„;: à"âQjÛME,…Hó(7óéxbM~ˆfÈSˆ4yŠ(E7%í¹sðB¤)•›‘R%µð¥rPª0kfMžÜÌû1q»'nô™*"O[ˆ<Éržýw#w«fLfE𤦓]3³zÍ5…$GæMƒäIEBº†È“¤H¦™‰B2 '·jÆdV InâF¦™‰!2 ï0Îwi’ln›#‹’7 “ü²LCŒIv™š†£T#`š™ÆMCŒ)Ìš&…Ys#7#!R³Â!BB$‚t\ôÛ¢q»ˆbˆ$*sïFÎWšŠ! ‘¦InFn”¼¾“ÜÈEC¤šrq ‘jA]D1DYñx7%1!¢™Ý”B¤“›&…W¤‰€?M­H Ñ$ '\„;$)xi" I0gá"bLI“;oä= OaÖŒÉÍ@“¬¹Q˜1Þˆ›±¹x£iBäf`Aa&ê#Ç."ê#y¥‰ú¨éQd‘²›#‹$évžLÇ"Ùç÷Ž/¢ì7!r3¯S‹ÛBDñFI ÈÜH…C¹hêdºáþàj†ÉDS'Ó…ˆÖ¿eÅšͬ ‘›…™¨ í ÑL’‹€ú„ã¸ŸÛ )Dšú„øŽ 5ß ³&9afcf`6aÖtÆÍ-”t“9ZH­j ­=KêE&9ÙÃ’ƒnÍl tÆÍšÎ¸8L˜qÇ!î/"qqóÌÞB!¢5bI7m’Ü]÷'î–íVŒõQSòMÃûb+¢oš):cˆjVà0n%â"'ÖM3E\š†ˆ‹Y¸4+³q‘C<Óq‘$¤i¸ÈÆÄ4Sñ;MCñ;fÕlÅ­©£ÐpÓ EIÊÈ»Z«~TÓp¤Ž¬W]„»q鸘™÷ Ç…hfÿj1qQ˜ÆE|þÛŸäv+ÞÔ~A.bâ¯ËÜ~A.Bc@¨6į۳çóßÔl´‹ˆÃdÅ›ã0.šâ0&fˆßq3°3c¤ŽM»ÏtS¡&â3ÝÔÔ¨‹fÎt —ìÑðÎ@ª³è¢)ââ"".I¥6ë㢙3Ý\„±>jÕZˆfö¤‘&9ѹ"f“Ý'ŒêÉ B$ÇÍDrÔªƒ!Éž¸h.~ÇE¿cfŠßq³¦3a&#ƒò¼ã‹«Á¸µäHµhÈELgÄþî!B:£¦ ]„tFQfÍÑIj"¦3rÑExz›Ø½ Dë#Û|XC±>É-çXŸäHÖžq33·vˆ4õq3ñ7ßI:RÌw’AÈdT‹€úø“¢z’†o2ªÇE@ˆÌL„ÈÍ@ˆÌL‘:n†H7C¤Ž™™ï$OxjX æú¸¨›ú˜£o’Ûdô1Ü}ZÎc¸hйˆ‘ p(2EˆÎnù+Ù“ZvLÃܨ֕µB?¼õlš¹5b¦ÑÜæMCQ=²lŒê‘LË4SëÉLCŒIF4 ®'“£mÓàžÔuHj­ækí5¼'µš<1Í̞Ԯєʬ´r̬š<™•“Y)~GŽ4L3µF¬i€<¹÷¤æ»ÌŒIVÓ.Âý‚ø½™Û©ÚELžTÍE3;U»ˆONS?áÉiÉo¢5bfFÆ$ƒÁ\DŒIÎiš“ŒÀq2&±}@ˆ¦“‰1eÅCÆ${Í&ÂX¹PÑES±>.¢õd² k"¤TÙ•˜R%ï3R*9‰å¢)Jå"¢Tr Œ‰¦ö! ‘¦Ta†UfÖAò”4ßs{R»ˆâ‚Ü qAnšä1<áLª]4E“L„kÄ䬋ˆ1Éa«‹p˜êÆšSò©s´Ä@&Âh¡¤9žÛÕ:DD©²w)Uv%¦TÉÃÚ³(D°ÊÌÍÄ£$5Ñrñ(9§b"äQI#ù[5H"äQüj2JÇXÄ£$Ä2Ź÷ÅVÜÎEo¤vvtÑÜ*3aך“QH."J•´Ö|"[:ì…ˆ%7CÄ’›ñì5®sçÎ^ °+3»r3°+7SÄRÒµœÛ-;DD´2¹öÌE´ë‘\cï"<‘k7fbY3eL™XO昘‹ˆ‰% Ê$;Ÿê2¹³¶kˆ‰É§Ô4sLÌ4K%¤iðœ6Õ4ÈÄ’²s«¦_f¥X*³B,U³R,•Y‰RÉq·i¦V¯5 Ÿ§¦“i(–J±šW¯ÉhuÓýJ~ÏÜ굦Á¸+Ù¡6 11Y4 ®^s3Ò/E@]„{!©©Z1ýª•y»Këx—~·R¹Fy(û â¸+E¶]DôK6ˆ.¢¸+¹JÁDs+Ý\DL,©Í˜‰eWB&&‡E."&&;—&B&&ƒ{]DLLòPMí¡"bb²â"bbr`¢9&æ"ÍÄÜÌ1ZмºˆèWÒLî±d"ÚcÉÍÀ¹Ü œËzȹ’Æ‚9WòÛ9Â*ib&#¬\Dkå²âÍ­•sî¦Ä &eIõɤLÎ׸ˆ×Õ‰¹A!)K:ɺ:>LĤLAqM‘2iRÝlÍÄ kåÌŒœKÍœé"¢_2lÕDH¿’.ääZ9q4–ZÊç"¢_rÑ ‹ˆ~É¥ >0šÚyÉED¿’»ÇÑXÉ1·xˆð¬8îL21“@ÃDsLÌE°2ÏÍ£åCYà\n¦h¬äš;AÎE£åfÚU÷é«~ʹ2J”¯2ÜIª¢Lº•én12é»ÌÕÔŠwöªeüûàÖ5S¥u®/ÿìEËPø‘´2™t+S>µó3[àsXl•Ë.«úDú<ÿòêEV¸©ö(3AØJdÒgéHsã”J7¯`¶yíÛk˜Ïl•X;|íºÙ HµG™CªÝÄÙOày¦íº‡lOSíæµÌ1[A=×Wik]1ýf”Ñx»î6ýjœCõ·]wú>—{«jöÙèyÜ­®Ù§¯[Fõíºïégtîë§M_·Œñ[}³M?ßs¨oÎ6ý|ˈ¿]wŸþŽÎÿ¶ß:Z©¶ŒÿÛußÓßQ™·nUÎkú^ƒÌå“ ·2m™Çn×]¦¿…Ï«Ì`Õïw¶®[Ê´v«s–yíuÎìw´<ꀼÞçéë>—2çUëØÙïh)á­Îù̾ÏËòð:g^º• îú)Ì6ùËò.jµª›}­–2GÞªœe^{x•sLkËŒù“Ç©t+smõë~3Êôy»ìkºÈ™´ç5ýˆÊdz«qÖé7ò(ˆ±i§¯[¦Öíº³5Ýr¼½ÆyO¿Î¯ÅkœÏt™Ë|{»î1ýn¼eª®>£ÙZ²À«qÞÓe~¿¼Æ9¦ïU™¡·v^»—‰À6R˜.t™Ü·*vö¥\«×9û¼öUæòëž}ÀëóYf kwcö÷–Ó«Úg›îõùñJç32Jp@«t¶i‚R¸uë¦ïs °Ênšùtc•Îô½*VéÌVÐk7vÝé2—0ëNÎ~HkÁ7Ö¾ná7­ÒyOß«p¬[7ý^‚óIiª=ÊLf½WÓ×-§U:Ëôu ű:gúŒóæ‰LZ0ŽØ§_ÉrZ•ó™~5 ɱì<ÝÊtE½UÓÕd q°*v¶Ê)mAg¯»•€‡g2¹’i ̱îälÕ¾•ð9G»_°{ÇÜ—Lx”ùûgîÇ«frVXŸÈ|—ÿ ×ŧv¿4 ilN·†Ÿw¯y’F•í½·¹²™Ëö®qŸ‡&vš©²2²›+œ‹°tÇZC|jtP éEX¼PVàtW:ýÎÏn²x&ââ½j|D-¤oÓ㢹»·®e^}²x&Ââ=5º»X¬r颹âmŸÂ¼¹xQßð]Ћ°xm“£¶žþ°añŽñt,CñΦkÉ> Y<añ–zfy \Ø-<ÑEsï^‹˜›,ž‰°xŠö¢¹âþ5û4dñL„Å{mÈvÅ\»hªx%d÷}ªx.âO£V{{#ß–ñJsÅ[—2ŽŸ,ž‰øÓ8® ¨ãXÑ\ñ¶wéÕMÏDÜhÔzÏ¢0-€ÈEsÅ;ö3e²Þs¹õî5„y·OÃESõ^‰u}dŸF‹&Ýëz§­Ôq·ºù}­œ_^<MÕ{5lu¶Õpo­õø´¶ãDSÅó³ù¦Šç"®XZ„l a‹…D~ àÌ»ç[ÖO=\qµ\—EÙê£ñ¨‚É»gû¥ÍÏDüiÔHæt½›_NÏ–®ÎÏDüpkOù]#o˦ç¾\-œ+ž‰¸x-JÕÞ½!D“Šwr¨W~¯C¶ž·*» H³Õu»ÚÖÖçÞmºb7E]û­à²µµ¹3×h+sg®ÑÖåN]£®ÕÕw¥­Ô¹~[½«skkwÁVWî‚­®ÐÕ¶¶÷»„êÅ4E]‡;ó›Ú*Ü™{ÚÖàN]£®ÀùmýíL©ÚêÛ™RÙÚ[}ëmå-?úóàâÙúÚ™{`«k¡m-7õÚ§åkke!¿¶&–Œ¿ù¶Æ•Œu-+kwŒmmêÔÝl+S§îI[— EhëOÉX×™‚±­'zUÛjÒ©ßÛV˜BÚJÒ©"´u¤_[/:usÛÒ©"´u¥3W±µ¦37ÎVšB+ÛV”’±®ùI¶ntê'µU£P„¶:tªmmèTÚÊй«|Ôç’>ˆ¶*~h[ý ƶÊsê'µ5ž”ßG}.Þñª+9§~Y[Ý ùµµdÜÔ'àÆ·zÙÍØ¸ÏÔ=i+2!¿¶òrêg·u—”_]g1ÕIm«+gŠ`k+§®ÒVVN]¥­«„Îx[?9U„¶zòk«$§Ê×ÖHN¡­„"´õ‘`l«#ɸóËnk §~Y[95pi«"¡mõãÔjk)¿ºÆqê'µŽS?©­oœºJ[Ý¥n«§îB[Ã8U„¶‚ŠÐV*NýÚ:Å©f[»8w•ú0²j«ï’¿tÁÏš-(ÚÎnéÞNf´ÈÀÿà3›Ò˜`=ûVg™^õ`¼òG+Ó_ýÝÿÜšÊí|iψåZ‹ñ_þëÿÙEÑ6/ÊÙÓ\ÞÿäEi¹–¢üïÿéÿéJ¢Ð—äU{SÿÔ%i¹–’üÿáÏ?ÿÃ0ký—<Ü:Ò¢ãÿÝ?û—ÿýŸŸ=Ö_ÿìÿþÿë?ÿ÷¿þîoÚoRo¸‹Ï÷üSÿ¦–ë°âE5^Œµ.nü§.FËuXꦿD/ÆÙ™>ǧÿÔÅh¹~/uú‹žîÙ«±5aßý1•g‚ålSÎOº¿àø«j„¹m6l‹Ù;ÍÙBM;7jí7\é4ï§Òžíš³3û|(Í£í3[6±M3:ÍúÛ ¦•жé4goThÚFJmñûóq×|¥SW¡y–a‡ÐÔYÌv'Þ¿ÑiöUi*Ãn;sø‚÷NóVÏGÅb„¦® š|жÞò³À:ÍiUšç/ß·Ì7Ñê4‡|>‹ÿ’Àoš|>¶Ü¿*ñ=?¦E>ŸúÝ´'ëÛAtš]} ¯ÿúkËíNóVÏçÕN nûí÷lå#švEWôM1:ͦžš®ê4‡z>jš¡Ó|ÔóQóí¡9ëoõ|^k;_£þ¹<îš]} j†¦Ó¼åóiÛˆìUù¼½£u›Ð´¯ îåç»ÀtšM=Ÿ6gùŽÍcoš—ª«lÿ¡ëQÞ£›æ£ž û Í+ú77M{š-l»kvõ-í.·0™×q×¼Õó9ÚkÛä½nïè»PC¡QVfSϧmäÖjß\°Ó¼Ô·p,~ê{ÛwÐÔé3¡iuHÛÃfûÜ5‹|>b‚½Óìê[hÛ/½«òµ~•í­žOëu´ëukOßu.4mƒÎ¶/éò¹k6õ|öZ‡¸f¹k^ê[Øk¿èe[uŽïè9|¨çcÖ´35oíé©YÕó±‚Ú1·öôÔìêù¨xÈNó–ϧí³ZïÞqkOßKØ)Íã—×Ú¾KP§ÙÔóÙjòª[‹·ö´… +Íã—×ôÇ­=}¯eêTh^oûrZÝpÓ¬êùlµiI·öôÔêù¨H¢NóVuÕ¶?ík+õÉøý¼·²‚д´¾AÇ­==5›z>*°Ó¼Ô·°-þ…¶zkÐìeChZS[;?÷ Ó¬òù´š öa[{zjõ|VûBë=X¶»æ­¾…Õà®[²ÝÚÓ÷C—Qó::Ír×lêù¬­i±=·ö´ `õ-´m¬ÚF¿Ç­=}¿ šúּꗷŽ»fUÏgmuHmñ÷[{zjõ|ÖÅ÷šlõðMóQß‚Šl Í»LÂ)ÍÃjœG¤½i6ù|Ú{µVØÏ]óRÏGæ„æÂ7£æ}mä·ßÚÓ6-/4¯ç/ïÁì·öô]ù¥ÐˆxºNóQß²׳oãïù<‚RŒqÛi6õ|–Ú£:j ÷[{ú)ŒÒÔ:¤õ®ö[{ú9ÛFUW- ¯Õ_µßÚÓS³ÊçS{ ­G¶ßÆ´Ÿö­yÖ:¤í~¸ßÚÓOÝü@hj‹}Ô»·?n¿g)œThZKZ5Û­==5»z>ÏÖ*ÖÞâvkOOÍK=Ÿgk­êSÚníég-»ÜMkyjë°ÝÚÓ‘Õóy¶V¤ö{·×~×êù<­v¯™ßÚÓSóQß³պµß»ÝÚÓÏv¾ZJg1\¦wš]>Ÿ‡×î­=¾iÞêù<>­¦®AÍÛí÷Ô…÷BóöM»K{ü¹kVõ|µ&8j¿w»µ§Ÿ=˜Û¨i_h}»·å«lõ|ík«}ØíÖž~Ž.'4"°»ÓH.ö¨ogëÍo·öôÔH.öh¶öa·Çí}•e¡©o@l·öôÔH.¦ÖptÉÅÖtÍr×.öÿ“‰Z X ñÞ&×±½ÊÿRÆ ´^Kì[¹=ŸmiúëÊõYšŠ«‘üÞÏ:Du#!RÛþ†èSwu¢Z5ؠÛ/½ÚÝB$vý ÑR÷–¢ý{ѵ…H¢½´âJ$v± Ñ«îìÿ-Rgo„è]÷©"q之޺gª‰MåCô,„D‰ÄÃ!Zëy"B$t QÝ©CˆÔNË!:ê–®BÔFºÃ‰"!z•VV‰Ä~½!ªç)‘8ÌE¥ï$_Xµ_oˆ–ºk»‰Í­C´Ö)¿Ejãâí¥©U"q@Dˆ*T"qÞTˆêÀ@‰Ä–¶!úÔË…Hlwn¢µ„¬Ê[®NÿÑRú‘J$N¼ ÑVOž"q¸mˆê¨W‰öï“­Bôª ‘8 #Dïºí³‰W\TÜå-W{¤‡èYC"±¯rˆÚîþB$Nž ÑVw¥"±±zˆŽê”Hœ‚¢v\“‰ ðCô®g‚(Ñ÷! .ZuÓìoQ›Žja÷×hy–Ξ‰c;B´2*Eï_÷“B´Õ³ˆ„hÙ/ÑûV¼º\]‰Ä‘ä!zÕ-f…H¢OéñIÑ÷QI.ZËÅ¥Hœq¢¥nŸ+Dí ½Ë¢v‹ÕÇVÃ>Æç´Vš¦Dõ×4Ñ­u_×£nI&D⬽ë!^BTÝÛ^ï·nNÙ†ä%^X½Ë»‹6;xK\é{?ù-_²È¨ßøFl[=ÒEÃÙ^!ÚëéT(Îd QÝ%õë‡è]÷ýGÑpÚ«‹ö‚Ñæ˜h=ë6æ,ªÅ;%:ð™Ýò†·ñ9íí´ gå†è¨£¨aƱ¿W"wxa¿Ïk Q;í EÉ[.:õä!µ}ÿŒÏéXêÖÞ,zØ8`­%øELÞµc¯=Ò—ÛÚÃÀ™.: Q3QclÛøœÎ1á'©#Z¿ßµsx·Á-¿f"ƒš¨E› ¨MÃí·®Û«NA±è5°9U.Å¢ún·ðÕª@Qý4¶[£Vf¿“[>žÿ¢w=ÃQÕå½WÑ8@Y_íÐMÕžåvkÔÊ„¤¾åMTÙÑvûžÞK=CE SÞ¾§sx·ê[ÞDµ¹Þµ2ߣëqäbˆ^õ¨,Õ`=Æ[þ®{ ±¨vÝÖ[¶ x¸åõC¯cÂõÖ¨}žežH¶îîÕ7b½5jm—RÙØíý.³,ã-ÿÔ%¿ØÍi¡ë­Q+HPßòÚÈ4V°ÜµÂÐô [oÁV‡“Ë8,‘¯O}Ë+Qns‡Ëø=mºZû°m"p¿§²™Ñ3é-¯µ¡^Æïi{¬õ¬ê—7ä´Œh¡FGëŠ=¡RÈeyŒ¢£A«(G½Ùõ7=Þ£è]OSC¡½Þìúçãv¥·¡Du¾Ôà9~„寇¼å-~i© Àsü·çR@)ïÚ¤ÎsüËnSyË[dQ›¡yŽáöÜëiwÑÿ4Œ=GIï¶fÉvÜš8¬ÂÅïÕ7÷8ÁÅÄF¼w>Œ"/‹ï§8qž‰‹Ïþ¶ïÝ>/>êÆaxœE.~?}ëʉML\V1Ø&ù¯žyÓ…ÿõߊ÷ãoÿú_Wóëüñïþý¯Ç¯ÿøÇó×ßœÿýÃíŠÿêãl(Î&i/‡¸<~ýùk/»ñ|üßÿåׯ¿ýcL —³Ž.uCu¹çòzÕïû\ƤΥžÒ_È2>/ôª &ú IK–¹KðŠ;$u.KáRã…jÆç…Ú¬Àp¡!érÙëäÎå] ¹ I—K—ËX¼³¸:eÕwLº\²\ÎaùÙ$ ¹ I—K 9¹¹´¤rëöÒÛ\†¤Ë¥/Ë=—­G1ä2$].].ã+tºœO~y¯Ô˜.[Y¥òÒ¹¼÷ºî¨ÏeL —­œ„ñ.dŸzÕiìþBcRçRƒfd.¯¥n¯:wHê\ê2ÇñB5ãóBG]?<\hHº\úgtÏåì&ï·âI—KÿŒ†âÅ}Ô𿾸cÒå’å²}Ê—;ä2$u.k™]jÒéRE>G—!ér)MoÈåüìÏÆqÈeHº\Þuèp¡–qyŒõ,—áBCÒåÒß—{.ë§àø!—!érésŠwºìïÒUŠ;$].Y.¯WÝߨÏeHº\º\ÆOëüÔžu_þS“:—µLƒÉ\>eaà:ä2&u.•œªŸÅýÔ£zú I—Kÿ‹n¹¼—O¬Å’¯Ǥò£ë΃Ët¹ôe¹çrVªÏϘËt¹´P¸Á¥%.ëVàà2$].}Yî¹ìkt ¹ I—K—ËøØN—÷ÒjÐî1I—Ë»öd.ŸåQwtìr“:—ºëþp¡–ñy¡W=4¡¿Ð˜t¹ô÷åžË§ö%‡\†¤Ë¥¿/CñÎâ> ÑŠ;&].Y.çûóÚÇ\†¤Ë¥Ë埬³jÇÃ~¶ýs© %ZgªO9Êèa·žÏºn¸÷°¤âò©°½KŸíu•ºÀàPSN‡½Ç'ÆÖ:»Þ;´”âPëÖÁ¡K ‡¥ÖʽCK¹Êðåp¿ÄRøÞàPS"‡Þa¸5q«Ž Ö{´”Óáy”)±o‡¯»]–Mï£KK*™,u:©wéóËlÝoíSŠCþv¸åð®Ëëz‡–R>eÂrpèò¼.ñ¸žyŸRî÷ZÛáo‡1‡ý¸îwŸRr($jpèóŒK¬¯rÿz‡–r=Ò/‡{!×Ò­jJq¨ó•ƒC—r9½ÇS9Œ9<¯»‡%•<–œÖ¹ôÙÆUÊàhth)×ùr¸—s»Þº>¥8ÔÅ«ƒC—r9,e38Ô”(ƒp¸åp\5@ŸråÐ;ô·¦»UkièG—šT\ÞmúM¸ÜryÖˆÏÁ¥%—½Î‰ .}ÆÝ…žergt©Iñƒ¤Ë=—½LîŽ.5©Ë¥wé‹w÷ì½–Ñ¥%u¹|»|ýèµ<•Ñ¥&]¹ô.C¯ëê…ŸûqŒ.-©U’%J¸Üs92ñ£‡¤âR×Ã.}ÆÝ…1B“Ê~ÖùårÏå]ÄF—šÔ¾¯çÍeÈøºP9úu]ZRww¿]¾Š[·;]jÒ•ËàÒ¯+î¤aLêr.·\Ö:m6¸´¤+—Þexl×cÜ+Ã\ZRqÙkì›p¹åRN2\GKjÝæ²¤apé3¾.t~û:º´¤R¡ï5hY¸Üs9{*ÇktiIťʗ!ãîBõôÑ¥&uwW¸ÜrÙêÞeƒKK*±®#\†¤Ëeýþ:¸´¤®,ß._ZKPâèR“®\z—áV]·®`„utiI­óQb„Ë=—rÕctiIvëŽÑeȸ»P™¾¿¹Ô¤öÁ–ÀårÏåý}¡·•¥P²}t2¾.´Õ±ùàÒ’º»ûíòUÜzxÄèR“®\—¾x]q«‚’º\„Ë-—£DWŒ.-éÊ¥wÛõº+ÕàÒ’º\¾]¾^†ãúÑCRt7G—>©sy^ÙÔ:'åÉ+—[.ïgWÜ>©Uͥѻ _*l¯Ñ¥%u÷åÛ嫸kh.5éÊepé‹w·MŠ.-©ËåÛåëGoÁòǤâR×À.}Rç²”§Ñ¥&]eQ.÷\êÿ£KMêré\†&*š¬rüòò\,éÏ bJøæ·ËW÷º.NŸôgåŒÏet2î.TW™.5©½ ¸Œ¹”C¡·÷àbIí³/@²w2î.T,o.5麻ÊåžËsbcR—KïÒ/Š[+ÚKêrùrùþÑ¢.5)r\†Çv=Ƴçó¾¹´¤IΦU¹Ür)'´~ŽÁÅ’šËÙ‡]úŒ» =Ê8st©ImDøxi—{.uoìÑ¥&µÏþüæ—!ãëBçðý]ZRww¿]¾Š[ƒìF—štå2¸ôÅëŠ{ µÔ•Ôå"\n¹œÏὌ.-© çÎ~×èÒ'u.%ÿæR“®²(—{.[]£KMêré\†W(^©òöoÝ•Ô:JM¹|½˜ÛëëB-©¹|¶›KŸñu¡­»uCÒŸxnÚåžËëÕÑã>éÏŠ‡öÇÍ¥ÏøºÐºw_@ŸÔ:mgõ¤\ý¼ÇÍ¥%µ\κhp2î.ôŒY¾1©¸Ô€xérÏ¥Ž¡G—šÔªÃýîÒg|]èìù,ËèÒ’º·îÛ嫸ëw5$]¹ .}ñºâ¾Ê,åèR“º\„Ë-—mé@Ÿtå2¸ôízŒÛQ‚ —–Ôåòíòõ2¬×ÄâԪóÿ;ºôIËãšg’®²(—{.ÇõÙI­»U6\ú¤Î¥ž<ºÔ¤®,ÂåžK=`t©I].Ëð™_Ÿ}Y¦rŒ.-Éb‹t¹çRövHê~‘p¹åÒbñ—–tº”ùÝÇè2$u.k^vHºÊ¢\î¹l×¼èÔåÒ¹ ·ª»uÏ«ù’ìexh—1—õñˆ˜ž1©uqžw—>ãëBïw7OÛ'u¿èÛ嫸k7™Û']¹ .}ñ¢¸e÷–˜¯’º\¾\¾ôÚMÈôI­ù|¾o.}Rçò¼æm‡¤(‹t¹çr\s·CR—Kç2tõ®®ßó¸ãÔ*Õ³—¢\ßÕó3º´¤6Ìý¬7—>ãîBË5—<$µAù…Êå–K9ì=º´$ëV¬£Ëqw¡Ç5§<$]wW¹ÜsÙº‰Ì>©Ëet¹Šw÷ù¾æu‡¤.—o—¯½^s»CÒ•Kï2<¶ë1–#Æ>£KKú³Â¸2º.·\Ê’©‹ïöI­{þåÒg|]h=º'Ý'ýYûÙKQ.÷\Žw÷böI­™X?£Ëqw¡G÷û¤VyØ_.·\ÊÙN7—–ÔãÙ7]úŒ¯ -¯/—–Ô=éo—¯â®ÝxŸÔš¬³[8¸ IËóš’®²(—{.ûU©I].Ëp«º[÷è&Ÿû¤+årÏå>Ø+©5YçÿŒ.}Rç²uSØ}RWárÏåÝMa÷I].½Kÿ:_¯w:‡¤6àØérÏ¥íù=¸´¤öJíw—>ãîBûµŽiH*/CÝsFºÜr9Ön*¥OjÍçk]†Œ» -Wq‡¤ëî*—{.¯k {Hêré\†âuÅ}vSØ}Ò•‹r¹ç²wSØ}R—KïÒ?¶î1.]uØ'µöìtK—[.eùßÍ¥%ýYCAÎzqp2î.ô¸¦Ó‡¤ë)—{.Û5m<$u¹t.Cñ®â¾ÞÝ„oŸÔåòíòõ£÷nZ§O*Å] \†¤Îe¹¦‡¤«,ÊåžËëš’º\:—¡éަ¼,dßGKjìY» —¯ÁÙÅy¼F—–Ô†–ïmt2î.ôì¦jû¤ë)—{.û¬0$u¹t.Cñ®âžÝó÷Í¥%Y‡`•.÷\JŸåæÒ’ZÕ\Vö.CÆÝ…–îÖõIíG—TÊå–ËóÙÝ—>©åò9n.}Æq¡²IÀ5ËÝ'uw÷Ë廸[7áÛ'E.w—«xWqïn·OêrùvùúÑÛõ‡¤V5—¥,ƒKŸÔ¹,Ý´qŸt•E¹ÜsyuõKŸÔåòf–¯W¨{¥ÖaBæJj•ÇòÖ.·\ÚzpiI­™8ÇúƒËqw¡çõzI×/R.÷\ökòyHêré\†â]Å]>Ý$kŸÔåòírÏe{t¾}R{¥ÊåÁ¥Oº\Öãš’ìGoÒåëB[‡éû¤öJ•Åø½Ëqw¡íš6’®û¢\î¹¼¯iã!©Ë¥sŠ×wéf–û¤+årÏåè¦Gû¤.—Ëå{}WݘWmÝ·ïõD—2W·þz~J«»•·7ÛXÐ5m³§oÚ4Ò4eqÓKjÄæ™®©KÓ…Fm3æšOÝ¢ç[£v`5M[ß"4jßQ×¼êNE⾉í,M³×5 ê÷ˆ]]sÔ­uEÙÄN¥¦9uÏQQ6±—¥kêš¡Q»&»¦m³#ž©ØqÔ4mÍ„|¦ßÛw¹æU·ÐÃ÷`ØáÏ4mM‚zÄþ¸®9jœ&^gØlÎ4ŸGÝ#FhÄ.‘®i±†xa×8×Ô3&æ¾S zW›e†¨m„w¹¹¯‹<Õ®Ò!:êæEß"µe¸‹Z6¤E‹³¹MϽÐO‹¦oØô9D¯Â4õãZŒ®*žØiíJ0(ýîýæJ޲›‹àHvÒ]Dà(»‚#9u£ìJŽÂ¬Q~så=eÀIyé2åOÐS~%Rf& åfRnF Å­)9Ýé" ¤ÒV€0PVix•vj i¥%®ôy2þJzJŒ¿²+þr3€®0ÒRÆÆhVö>!ÒÊ^ DZÙ¤f ¯ò‚ ÒÊÞQDZ’ƒ™hi¹‘×£Œ´’Þ!­‡<ö1DºÔ‰¨>ÚGÐ¥. ®¤31 º\¤A—>59D¥Ã‚byñ•¥ß(´ìJÐÜL¨Ì͈ÊÄG{9 aM¢žÄ¹²®AT¦MÓ *SÇâ¹F£2}¦k(êIÞö¦™‹z2 ´ä:ÐÜJ¨Lޏ›QYR FeâäS×ü•¸°i•ÉfÛ4¿AeÃÑ“¦AT¦Žv ¡²ä¾!*S§´»†P™Œ10FeP¯5Mߤx¡‹«I´n"ÄjÉ­#¬æfŠor3¡2Ù"»ˆP™ G3¢²ìÇ*s3@±0þ23á/7#þRÓ4.šŠd2â¯ìÖP$“™t…‘–Z›h.fÉEºd§ÊEtåWBü•ÔòŒ¿’§ÌøKvª\4ßd"Šor³]éÍeü¥NÍŽ¾ á/ã"Â_IÕÉøKÆ“ºˆð—-¹ˆð—œc4Ñ\Ü”‹4þr3‚. p\D +éLFH¹"¤ÜL Kâ !è’!ç."Е•žb¬Ü¬‘VÚ Ð•ÿdÀ_yéŠñ‹ÍPLâ“TÜDÅ$ßrA±äF`œ—›!ÎËÍS ËDs ËEºÌL ËÍ»Å/Ö$èr®ìÇèr3!-7ÒJhFZY9i%5;#­ìA¤%£0\DH+ét0Ò’‹3\DH+¹å“±[."¤•Ü=FZÉ`¤•<\FZ2úÀDˆ´’FŠ‘VŠI0&ŒG¦–4]º`ZÊEˆ¿DïïxÖ½š‰¦Á5¿Á_CÌŒiüuÄu Bè5)V߃öqøÉ÷®!üÕ°ÎQ‡v›A Ó þRï·k©ÆÛ4?¦Þ9×h(fVÄ_ ¸†ð—š¸v á/Um˜ñWòk©YÓ þJ®øË¬ºÜJH+)##-¾çŒ´’ÆHË'ˆê»üÞåd!Ÿ {!šYÈç"ŒK^XÆ_ ƒ„Hã/7#èRÐ4D–Ý'Ž «ÍÓVëÿ×ó&¢å}j¬é"@eù}B€¦†.!š‰s´0kTæf@eaÆå}É CT–4˜s1a!"T–½÷ˆÊ²+!*{-×<Óg|Ýæ"ÅB¤Q™›1&LuËBD¨,+¢²äfT¦턈P™BŠ.BT–4ŒÊ²¨L s\„¨,+/1ä-‰Ãæi€]ÑT"ÊÂL¨,éÛÍÅ„…ˆP™ êpÑTLXˆ4@s3 ²0˾e†bÜ1SÓñ!"(–Ü‚baÖøËÍý•´7ý¥Æ!ÒPÌ͈¿’G3·ÌÑE¼ÌQÌš…ˆPYv%^æÈ]¦$&,yÝ8&,¹.sLúŽŒÕ¸ub5E“B„XmyYÅU°ÃP}1VS¸&D„Õ’¦ƒ±šš ‹Q=aµì5¬æ#xhÙ°ZRhIÃÇ-ib eÅã˜0þæZ€ ЬQ™›Š…™ðWCLíãÜý.¸´3þRäÕ53 %MƒøKÞ-Óþ’ß±iÉáÓ þ’§i©ÐHÓÌá/ÓþjVÀ_nÕ KGϹ÷±Rm\Ó è’ÃÓèJî‚.9b1ÍLœ—i8ÎK rLƒPLÕp¦!(–”¡XòÁ2KžÐ\œWˆŠ%ßìÜòÉi(fÀ_füf ºÜ H+Ì^¹™1Uò4Sq%E˜ÊÍS]!¢’¯˜4JÐä"BZÉwÈHK…Ô‡h i¹ˆ–©™V˜q™£XÁíÍñ¼rÀ+3#¼Jîý$¼rÂ+nI^eWxåæ©ˆ®Ma*!¦‹1\„˜*yÝL•tïSÉÉ.Í,hŒŽ¤†Wa¦IU“,h‘ê.â8/± D¯$y0Â+9ªqFqχ£¿²· AWV!èJj÷¹=ºBD K’IaôWrË碿\P,Ì…@—™t…™– ¯r"­ìWrôWr¥©»B¤‘V˜5¼r3b*É7\D˜*© ’"Ä%D3 ]„˜JÂ#¦’¼ÎE„©ÔÎÉ1úFL¥HŠ‹0úK¡dOE…£¿¸úHàwP^eÅxåfÀTaÖ@*  '7S”Vö+1J+û•€©Žs„szr+¡'Ù-mÞ£K}Ѧ!ô$£ÂL3³ðÐ4€žÜú›=ºÆÆ¸iæ “i25+ïÆ¥pŸi(ÆJb8Óz’¥i=Ijoš)ôÔ4€žÜ ÑTÍJÑTfÕàÈ­„ˆ’ww2nÊE„ˆÔj91"RÕ½‹¦â¦Lˆ(Ì!%ç‰\4³—–‹0nÊ–1×h¿] 㦌ÌWxS^ð^„qSrÂÌE7%»â&B •ÝRÉ'ÎqSZ ¹zl"ÄTj%XˆSYèp­;£we"ÀT@Ì]D˜JF隈1•š«qa*ɶ\D˜JöMM4yå" ¯¼éLfRfF %ñ‡‹¦€”‹4Šþ‰FOaÈdf„L²+î"‚L4¸ˆ “œ›6ÑÔ®Y!šÙ5ËE™ÂL8)©]8Jvï]DIŽs\D)ûÉ™ä€ÏE3‹ ])Ì„“$1⤬ €“¬ÁQtÜ5" ³†AnFì#Wi¸ˆ°œÿ4ÆB%·a›™™`› %_àäK ã(Â>jã³Q$“Z"ŠdJz Œˆ’>#¢ìJˆˆäĨ‹e//Lž=#"n^D$¶‰Q2!¢d˜—ìy¥flô<ßä"DDj‰ƒ‰¦ö¼ Æ7©xQ|S2 œÛó*D€“\Nr3D2™Á‘œwÅ7ÉçùZKG ã›äO7†LfEœ$cXMC8))â$Ù5 F2%×™‹djÞ^¬Ît ín•”â›ÌŠûX© [Óà>Vmº×å‘Ï¡É9}ßgÔ¹ò©Z®ix+Uš†â›dÅØ4É9}b•„i(¾IöÇMCðJÂÚ¦ax•ü †WÉ»Eð*Ìɤ]&š‹drn¯š¼’=!¼’¼’CVMm"‚WrÆÚD¯ì묷ãu{a^©£7C„ðŠë^ÕQÖVùäz+Â+Ù7Ñ\Œ•‹4¼r3bª¤šŒ¦r‘ÆTn¦¸)7z²Г›iÏ«¤¢šÛò=D¤dh‹0BJ‘ï÷LEH¹à•™^…Ycª0O-Î3/ÎSEJ_Žz’SI.BL¥ºãÞ½Ä%{jÖÄE„©’æ(‰…RÀØDs ù\„›»'}ó¹X(a,w^Iôæ"Š…’!·.¢X¨¬«O ËͺÌL ùÜ ùÌL1KnLåfÀTf&Låf©Ü @*Ì€ž|ÌEèIޝ]„‹èx4Äè)i%=%5£§ìíâè$3ä"ŒNâNi¤æš\„{Sñ`’Ñ“œ?óõzr¡§lLè).M.­3¢§äá&{S%ÅCô”TñŒž’Úš—Ö%Ý_Þ›J†©¸ˆ¢ždÜ€‰xo*Å´]DðJ>ܳ»ûø`,”Y1JµiMûP©oÍ4¸ OõqLCðJÞצùÍ)†¥CTîÓ>h8Bª¾^õÞúɇ¦ax%¶wͼj‚Wf%x%ë"Ó¼’]Ô¦ù¼ÃáMó›MØë[r|½fn*Ó@ÜT³RÜ”Y!nʬˆžøÛ˜Œ›r‘FOnæ3Uä‹=ÉÉ!z’=zÊ~2-­33-­s3,­33‚#Y¹ºÁ‘ ”4‚#Ùž¹ÁQR<GI ÊàHv*]4sÚ ‹I®å"ŒzRs´&J¢žÄÌ©‹'ÉQ¢‹f¶fwA&7d²æ˜ “› 2I`k"ŽzR=!d’”×E™’s2¹÷R# aÜTv%RnÆ)5¾7/ÃS‘á." %{Á&B ¥¶¥ÑÔ2<ïHbÜ”¢’.š9m0DSqS& fžÜ<™\DIÎy˜!“U¹·[W0ÐESÉ»þ¸³¿¹¼àN޳M„‘WYñø B2LF^¹–›iv 1LÄ»Pñ³ŸÜ…ÊDÅÜ PÌÇrŠ…ܹAWrkæ–Ṉ@WÒð1è’ ]4ce"]Ù•x·(î¡3è’ÜßGߺ24€ +ùM“Ëð\¤A—›i…Yë0Ã":3Ó":7z’Ð.fNú ¡§äÁ2zJìzz=k+†qSª>s ©ä:¤Ô¤µkf¢©\ƒûB‰»mRjZØ5¤T¯È4SKö\C@JÅ>™ò©ÚÛ5„©’²¦2+)Õ qÍÌ’=Ó RT×P4•š˜£©ÔàÞ5M•ü@Zfex¥úð!¢¸)5&uÑÔ¾P!ÒHËͯ¬1U˜5r3G=q]–,Ù±H.Bx¥mˆ^©Á¡‹8êI,o G=}c²!¼âšsng©á’=19á"„Wjk”¼ÊŠð*Ì„©’Ö"Ù] N]„‹óTß8D´³TRM%'r¥’€.nf梩B¤AW˜5ÒŠÁ+µN"D¯’×m^…ý%Œ‘–˜UrÑÔY!"¤•¼„Œ´ìÑ ÒŠ®¨FZaÖð*ÌS¹€T˜)JqEMmj"ÂTÙ÷9µ/DS…·:!ŠÑõG %âÝC„@о9 " ¤ÜŒèIM¬†ˆ6@Ï @ÊÍ€žÂ¬!“›qÑ_ò²Îmj£6žÂ¬ÑS˜ =):á"DOY9y(î.2zJFOÙ€è)é20zÊn¢§ì£æ+Ö¢™+iz ³†LnƸ)5I¢™]B¤”›H…Y©@=…yæì=ñâ<Á)C4™ÖGdr+á$Y35ÍoNÙ§+\3…“Lƒ§ì©V¨i¦ç¹Fã$³"8R±®!p$ûmMƒà()9/ÎScMÓàPªŽoš©Sö\£q’YI„gGª#Ö4Ž’’#8R‹O]£ÁQzÂIa&p¤8´‹)¶¢™Ý¢\D8ÉÍ€“ÜLKëÔ¦¹.bȤ0‰‹2ÉFÈD™Þõ®/•=ß7Ño"¤êës¼Çâ!dJê†Lr„좙óô\)̸QyRÄIr„ê¢)œd"ÂIn&œ$Ѭ‹f¶$wâ¤ìÍEœ$»®Ö OmT"“Ü à(Ì•sÅB¥}ÂI²ãë"ÂIÙ•'% ã¤äÕ`œ”pR˜ eOÁQÒ&O‚#ït8r3€#7S|“äo&šZp" ™Ü 8)̹Q˜¹™`PRuÍm" ƒÜ Ø'̸×SRΩˆ£iìfnÀf\.'ÂBC„QDj2ÁǸ3gÎ…h&ŠÈG¹E” õy¹\Òà&Ëåø%dì“öû¤ ./—Ë~Æ,%-ê\ÌRˆp“pnÞæ6 ‘ÆI¯­ÞUGf%p$ÉMÛ„«‘˜i¦À‘i0I}ˆM3ŽLà¨Y©L×`Ä‘:MƒàHŽøMƒ ãT]`Gê³iÞ:œŸ8Æ!ÉØ¥¦™Zç“Ì àÈ­¹•`Œpjš¹…q!ÒˆÈ̓ÂLØG-ÒtÑÔîK!äfˆ-23`Ÿ0à‘S(&BÀ#ësýð Û ¹hjãïà‘ ›‹~³w’ª=&£ˆ\¤±›ðd7w𘈛5à 3¡Jf¢©m»CD(Göج‰E”#¡‘‹(2H1à¢¹È iìfˆ òÞ…F9a&h“´ÉÆß*ÐÙEmÔž!Â}–Tૉ0HNºˆPŽýš:]þ¿!Ê‘£nÊ‘,×»´¬Mm8"ZÖ–½nˆ}ä€ÓDˆ}ÔæL!¢Ø"ÉñM„±Er¶ÆE[”ÝGn¦ÅnIŸ‹qRRúIœä"Š-Jºž[”4ñŒžd‡‰=%½\Ž8ÊŠÇKàÔ(ÙD¸.+Þ¼2ѼrÅ,%•ï!%§9\D ++ƒ.î—LÆ7¹Hƒ.7óFå*üÉEÉ”={Þ¨<ù°y]ò>#þJGê…Yƒ.St’›!:ÉÌ€©Â¬T˜!âÈÌqäf\ÇuÓ$Nr‘ÆInpf@DÇ»ô» ™U#"³ò¢4±Ù5S0È4ƒd UÓÌÁ ÓТ4ùI7 ï’¤˜§iÉx¦D¤\r .JS“ô¦!D”Ü7@DnÅ-¾ùé! JîÆ%%ÇØ"Ù“1ÍÔ¢4ÓN’ ±i&q’‹'™™p’›aù™™)^ÈÍ€ˆÜLñBj2%çȉiñ9r|%ÄIrbËE„“dÛl"ÞQ)¹ã$5švá$ÙF™h'¹ˆ¢ˆ’/)‰"J®É͸wRö“§¶â.JSó'&Bô¤¶« ¡§¤x zRdÌEˆžÄ¾].Bô$‚‹4zÊFIà=Š8JÞˆ^)e"Ž8âÚ WÉobxe[¶»7Š(âÈ͸TM âLô»Ý—dAæ"޼+:³ûRˆ¦0•‹`Y›™HÉQ¿‹pão™e¢¹Ån.‚˜%3óßjfËE¸ûRRR1xÀem*ÂÞE„ž’.:£§ä1zJ*µ=©‰zJšFO’ƒ˜ÑS6øBô”ôß=I‚é"BOrÜÇ“„ž²[ŽèIN˸OÎS&šCO.ôdfÞ¨\Q~!zJ#¢§¬ô€žÂL)ûçb¬\èÉFûM%cæ\4³ù¸‹S¹0•›S™™0•› SIäèð1“ƒ$ꉇ“QO.ÂîTÏûýúy¼SS«ÉÛa4 .¹ÏŒi4è2+#-¹€‹hÚfÝE¸ˆNv \4µˆÎDM•¼ÉYvªíqÑÔ‚;!@“U¹‹ e7šli\DMvKLÄM ¦\D-ûMÐd†‰æš‹ Ë̈Ê$ÄpÑT<–‰ I à"hÙGÀËð’+!@³Ê£}Þ·ß„Makü ©3 B„-éf0@SÅEÐd$£‹ I¬å='\²§"ß\D-©€'w€r‘haƽž¸†IÎÓKJ-+=´0kTT‚b¢¸ˆ ˜ÜÓE»%Ù¦‰æ–ì¹–ì™™–ì¹ð—™)òÊͰdÏÍ€´¼ëH‹¿.FZÿ˜‘VÒãM¢©¸ÿ0¹ÏE°Ïͯ$è1«l`5µu¸‹^…™0UR70¦’aU.šŠrî•1UÒ~óRÀ¤ÃGð*ÌxžW3“˜ÊE!•½„¯²—p^¹à•Õ)nÊÍ7efRn¦…|.»ò1,á…|20ÂEyÅ‘–œ9p!­äÉa<–› ^© ˜÷ù ÏÖá•*‡kp_(h^Þ'æŒ]3¯\C]ê š‘–ê긆Ͻûæ ¦áÝ¢]wÍ̹w¦AÐ¥Vy¸ý‰ž¸kf@—it¹•–úhM3µ¼Ï5t™–[5¼r«ÆTfeL¥¶iLåfÞ\p˜Í)!RóT!" ¥7 ©ì7!RÓ!šR.âmÆE•"RÙ•H©îxˆf€Tˆ0¢Kôá]4¤B¤”›H%U©¤Mb ¥H!" eïsõë>ŠH5lsÔ÷y»}9S‹ C¤”7ÝSËCDèIuü]Ä'ç‰î1zú>Ÿ0D»%*¢ß3sr^ˆfNÎs¢§ä-Kb·ÄIˆfv‹r©0kôäf€LaÖ):’2…Yã¤0ãYvÜHÌ£ipäf^Þ'F5!¢å}ji©‹0Æ*{Õ§b¬B¤Ttç5 ³FOnÈfÄIbÆES8)D¸8¿B ™²+ñùt\ñ2dRÌßE!¥¶Ñ̆â1>Óè)Ì2…Yã$78 3""n“’M¹þž;ŸÎEŽÂLˆ(é@&ñM"Œ"ÆÃ…™v‹RlÅǾß” æçâ›\„»E%ïòÜ&á!ÒÉͼ/wJ'eœf<µŽßŽ…Ê¨â$‰EΚôü´8Jìã“ÌÊàHÕ›¦!p¤b \3³/”i8JĸÁ‘ˆŸ2ÍT,”kp) ‚MM3!åš™óé\CàH³¦™ÚfÜ5'™•·˜Þ53KMC8ɬ€“̪qRúD2É*ÂE ¥ ¡‰=©¹§zRÁ.Bô$[nzR‹=CÄ‹ ñ£NГâz.ÂÅ„b¶ÜEˆž’7Г›ç “‹¦ “‹2e!“l{]4³lÐESËC¤Ñ“›2…yæÔºNÊÊ 8)Ìɤˆƒ5Ý€“ÂLà()'ƒ£¤Î›[ô" Ž¢/£Q˜5 r3`Ÿ0à‘ÀÒES€ÇDq”=Ø©ˆ# r3î!¥@˜w))+Æ!%5F‚“’+N 3€#3#8R§å„Á‘XI뢩3çBDàHN ¸ˆv‹J®ÄñMrDé"ŠoÊ®DèÉÍ=¹ S˜5N ³GnFD”tWÉ)SMíß"BDjµ‰á":®æ8:I-È E'e¿‰ “›5dr3à¤0kpäfŒ-R+C4sŽ\ˆ%½®¹Ø¢iœäc_Gç¸h ™Á‘ŠjÑLtRˆ(:)+ÞÔ6ã!šÂIŽ('¹Yã$78 3"¢­TÏú ?ýy–ŽÈç·ˆhIw EÉÀƒ¦Ap$ï–i48r«FDf‹"2 Á ¤ŒƒT(°kÉ µi¦ö…rÍ 2  ~¶ƒä‡j€AÍ:Edˆ"jVÜ*¹çS;@¹†‘Ä)MÈHR"’\ÉDˆˆ²âñæãjšÓDSËåBÄÑIßëwB„ÑIü˜…Yà 7OmI"Ü’\á9M- Ñ r.SóY&š‹8rD™yê̹ö13Æeåü]lÑ8}â"ܨ\Ñ; rs¾¬í‡côÔér!ÒˆÈ̓d'ÙE…yæt¹èµ`¼¿#s§Ë¹ã…äXØExº÷>'eWBœ$¡€‹¦p’‰øÌ9Õ‡wA&µÌ#º—SÉEäf“ÜŒqH2<ÎE´×SÒ 0dRËC4³ù¸‹2…Yã¤08JÞFGI/‹Á‘œù3.ŒËÆ„“ÌŒ1K2úÂE³”c–’—`nW§á®NŠø˜”Úº'DS1K>ƒ˜%7ãybY~ˆ¦Ð“‰=¹™â›’ÎöÜix!LefÄTI-<‰©\¤1UŒ¾!’ÉÍ€žl¤Í{2q» 'nô=%¿ÐS˜ 2I^d"„L’¶¹h 29úÈäfŠYJ>*DOn&ô$Ëy~lgГ[!©Y'ÉùdÓL-`3 Å!É‘yÓ z’±¦!ô$1RÓÌÅ!™F£'³dr«ÆInGM3EdÜfœï.â$ÙÜš†b‹’7 !“ü²LCIv™LCI6M3·Íxˆ`±›™'…Yƒ#7#"’óÂ.BD¤Ât\ô»(¢r›£ˆ$+soIÎWš‹"rD™ÁQòþN‚#a‘jËMÄQDª uEeÅã•Ô”¬‹fvTrŹYã¤0ã¢4òg¢¹Ei."œ$é„5ǼK’¢—.Ò8 f-L„)is'#Ž\GÞ?ˆ#7CÄ‘™)âÈÍqÄíØdÄ‘‰hI™›aI™™ûȤ‹ûH`é>Â>2FÚE[$Çì.¢Ø"‰ºMÄçÓ%""Ùé7"¢ì7"r3/USëÛ\DGI ÈàHDyw~æ|ºá&ájŠÉDSçÓ…ˆ–ÀeÅ£è$7Ct’›!:É̃ÂLØG÷™h.ÉEûĘ #ޏŸÛ)D°€ÍÌxÜ ±Ef¦Ø"7´13-?s³Æ3a¦x¡¤›ÌñBra‹‹hùYR/2ÊI¡7´ 3à7Ãâ13ˆ 3î:ÄýED.nžÙ_ÈE¸L,é¦M‚˜³¥9?C1fÅh5'ß4¼9¶Bú¦™Â3¦ fãVB.rf½iæ‹i¹4+!³r1+!9ÄkD.…˜†‹lLšf.‚Ç4ÁÓ¬´pˬ«£Ø°i£$eL¶¶V)Q¬Ž¬XMÄ; %Å#äbfÞ3HB¢™M¬C„ÈEq%§À-ñMn·âÍíd"F.ü¾Lîd"1F„jKüº={>NÍG»ˆ@LV¼9ã¢)c"1a†3\q3ÅêÈá´‹ðd7ÙMMŽºhæd7ox¹$&ÙHõM4‡\\DÈ%©Ô&£}¼2s²[ˆ(ÚG.\3ÑÔÆÔ!Ò('Ìm²û„q=YAå˜QŽ\xà"D9jÓï2NEð¸"xÜ É-çhŸäH–Ÿq33· ¶‹û„Úð$)<É(d2®ÇD„}ÜLq=IÃ7×ã"@Df&Däf@Dn†X%C¬Ž›!VÇÆÉ xø O.3a7öq3`3cüM2p›Œ¿qì@[Pˉ M!"!"’Á.šADŸ³º¬¼LLu\Ãà¨Ö•µB?¬õ4ÍÔ21×hp¤']Cq=ª4 Æõ(¨åš™%e¦AȤB\CKÊÔhÛ4¼1u’Z«ùZ nL-fO\3³1µiS¹U)³zr«†LfÅ5ÒpÍÌ21×hôdÖdcj¾Í ™T=í"Þ3ˆ_œ¹íª]ÄèItÒB4³]uˆðü41òsŸŸ–ü&@OnFȤâÁBDIÍjº!“ŠÁ B&±…@ˆf “‹2eÅCȤºÍ.ÂhµV1D3Ñ>.Â%eª"ÂTé•S%ï3b*5¢Lå͉šV÷£lfá1…¯K£?’O¤Ú¼‰Ö*dË_ØÍ{7ŵ›¾w’¼CFåZ!3óŠiÛ2å/j²2¯X¡‚B®b· Y¢Øf;³E±Ý›LQŒÆE Y¢õ.dŠb,¿wB–(Fѹ.Òž%ŠQ'd@¦(F£…\¢˜B\ÓÇv–“^²ä¯ ðݳ4!.écKèÒdžХ-¡kc-l¡k÷·›9Vã˱šU.·kž«\N!ûF%Û ²¥²ÍöiKeôÀF!»´ŽœªÓiIe¯sSZÇ”…L©Œ©âòIe q©L¢Ø|Ìå/}l ]T!QÈóÍn²ä/–¸:KþÚø¾r9…ì|,RÍ7!Kþbuƒ ™ò«f˜çö¥ Yò×®÷Ì|¬ÍŒð]®ýq¶_àÅ4F´D1ªh(äÅ⢘>6ä¯ùغÆc3k·„\ß#§!ÍÇæ÷ÈÙVÀ.ïcIè3R÷\>!K*ÛÅ÷¦TF%Z…,©ŒžõÈÊŒ<…,©lInîo²”ïþ¦ yòǦ¤Â¥²ù˜‹búØ”¿ØUeâò×ïoÿ~úúþéË·?~ûúöç·ö!}>~ʇ|ùµõÛû_oâ¶öýGÿýjŽ„|ø)ízÿçí§òóÛûߟ~yÇG‡mKJåÉ^?ÎÞÍJæë ¶¹Ã²ÝO6;X‰pË{:ØIŠçÿÁzþàÜÜñð{Þ\oت8þ8œÏ ‚Îìè붘89à+"ù€ÜÏò8ÊÕÁ¶-¸<¾ØÑ]¥ýw.u;`Ù§ˆ£·Êu@š¬ç½Í ŸË;Öq‹·á|~ÀŽUñUus!;Ƹ†q‰ù|ódçî×ǯµmœán‘¦Ä"æ³#³„)öbÝ m4ÿÑÜwd[ê½¹7µ´Y—¸[â;4I¤ƒöÒi·CK³X½½omûÃ9¨÷­W–Ø ö¾µÜ-Bƒ½ÃÚ¬e‹ƒìi¾Aó!Ræf´#“„DöV´C‹XJÛblÐÅä`ãõ¾µd9«2­ë†l¡ýÕÛ{{_Úü’6VfƒžÇ!aÜo‹Ï#É¡&"Ýì·l‘#1{Ëݱ-ø¯§m'¶h–-Û4O;4œ™õ³—®aFy7Å3T‰ÞÀR?`Ç6&ô6gï"8c‘X½L-êŽMA\M°Þ-êLY|6ìî™qàaŒÜSãº$ÎÃ{Ýý|U9¯ÃJp¯¢;‰ÓÖýÞ»Hð‡Õë£$D_¹ß›o ÁºÇ·œâø€uo¹fÀå^G¥J¸·ºZ?ÊÖ$¿¡ŸÝë¨ùkÐí…ANýì€kËÞrøƒí] ¡¹¥Ç0FÞ½.´˜+ö6?[åDïõ®£ÐœÝÒÛœÝï EαÇz×Qˆás{»w>‡æñÞÙäwhɵ/¯Ñé’Eluîi•êçÔ·öàf›Ó›{›o? ÂŒ†wèä\«×=3î[-1Bî&g‘µ:ë¢|‰~€!rÏÈ\å$¬û½Í÷½»5ŠÞ.4çw„CÅ=k(Ãëns½å”ÓÊ;7â!*q#ï.›ÿ[‡tèms<ª}¢ÍÞ¾Šg”P,A?›å ´Ç îF‡ ¢è,奈áV-âr³ñP5¢¸¸¹Àe¸*î¿7V9nŤôšî˜¢*Õ»bs‡$‘ÜJskosr÷ó5 ãëV}nÉã臻¯š Ô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 132 0 obj << /Length 2278 /Filter /FlateDecode >> stream xÚåkoÜ6ò»ûP-±|ˆ””kq@ÚKÐ àÆß’~à®d¯.Zi+iíúßß Z®¼y¸¨s9H¼Ôh8œ7G3ŒÜF^]0ÿËá/#œHÆ©Pœä‚Q–çd³»øÖ+bQ/•e¡ÈAðr|I ‚ÿ9,VV<óhG,§Œ—YN¸ 9ÃÃwä"=n-¸¤B°ŒÁ©àœ2–) ÎhÉ )cXAsžgdƒ›g`ê¡í)4Ú?Ÿ“FÍ<›X‚4æõ‰sg=ä i.ùocØqïCuœQÐÛ.Tý‚\\Z;°rªœd”eè° LçþÇëÍŽ,œcáLi)©.à7åÜzÓ‹«‹o_æšhZæ² W×Ä#œ«Š¼M^¿x¾úíêgÀT&×”3 ¤-ÎÕª(“~•fyž¼_I–ÔõŸt2mk·¸mnºzšj‡46»O‡'-,j\t›©é;/˜–BÐŒŸ–Njª¹ xt•–L… Ái}Zª’2ÉO}Ús¼5(÷mÓ4K®{\°2Ù­pü!6Èâtt«ÆÿN½û5Uåp'Ü}‡´Ã›®ë'c¥vƒÙ ÎûÑ?oÍä0G»ÙÃkÞ´ˆíÁد'Ót>jÙR48öåSn»(² ï898X=›ÜÓU'¸*Ù6!;°0ƒetÛlLëvxV¬a}á3Mßu7F÷èý ãÒTnñë+^ž¤º‚J¥ +÷òÈ“ˆ^øAF3²4B_È@ÔŸº…Úú¦î0;‰ÒBG,áÜ… uªScS*“Îø\ !_F|(È på²`Š›ñŒç Es=Ç/jÿ!5H.ZÌ ƒÔf•>¤˜åP ̱ºwƆ »E_¨ÛûU!Q1…ÉK\£—£8#ZÒ/OnlzÖÌßeðÜÜAòüfçrGU·î¹ïR:ùœ8bú/yÒõN›{<ñºŸ|»zk{áwq¾Ÿ¶þ]m&¸ƒý˜Á!B›»l×û®óõn1‚Íί°åêûîc³ÛckÄM-æÆýqÓdºÊ¸F»ÃÚÌé?7¦(eeÄr‰‚Ù¯¼ï7¸ä+ž<!{,tyLäEÔ§Íy–\m/pšn:§Y^œÖ' ‰SÖ86ëÖO.ÂPÀl¶M}ë…ºk‚>g9 ³ƒxp°è<Çbrö•³õ¼]Î cÜdÙB¢7µgï vÝzÐH÷~'|ä#ž:ijZ °ç ~LrÂyUO¦iý¼Ä¬í¨9`ßjŠæ$S³nZ(‰pxµTÎÚŒžMÛGCÐÍÐøÑÏ šç§¸Ì~Ûl>9T‰èÌP媟«DÞFâIŸ3Üž<+ ‰8_Üû¢ëø?_ôŠs—¿vÜ–r€/à;ÁÙÇÚËvl=w‡Ûƒw~Î5%”ù“ë*öCwÑí!ÿ\ªòX$Á½Ï‘¹ÜÊÿö7F*€ÿlëˆn%ÄÚA–))/±ÕÜ’7P.Y=C‚[æ¹×¤ÁR1I¥(£.: J•XŽêÃæ9·J§ÑxHj–@p ¶ó_†Î?BãοԮmjáày;óA¨O;øb ôâ–/ „¾j¦±n¯Üx‚Æý@2kZ3€;÷¶«ÍxlCX ߯èñ·+; 4ØÏ®½[+*2(<¡žÒÞèmÓ½_©2175 raÃ7¤„H=3Ïgÿ5‹°ÝœÑ¥‚:‚³Bläø‡H“伌cáávfK÷ø/D¹ˆÌ endstream endobj 128 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/coefmap_res-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 141 0 R /BBox [0 0 1008 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 142 0 R/F3 143 0 R>> /ExtGState << >>/ColorSpace << /sRGB 144 0 R >>>> /Length 3896 /Filter /FlateDecode >> stream xœµ\K$· ¾Ï¯¨cr)—ÞÒu$€p<· ‡d³ ì"»F<6’ŸêMVKêf¥}˜ži?’%Q%‘#¶ï6±}ÞþýòCùùæí/z·}ûã˱DZáÏ¿ý3PÙþóò׿mÇöϱ}?Ÿ_DdؾÆïAnÚ™]¹íËæô.Eýú¯mûñ…Pƒ‘–Î"¤V»UD%!–# Ãj²Ü/› »VD ¡4åöà‡Äfj)!u-va‰–, 5{°D ¡4øåýPèòH ”ΠöCS†DùìABi Ȇ“+vïˆBi Hmš/›÷»£-E(A†ènCž *ƒ’: ØåQ“å‚û…ÝK¢†P:C•“„à¢l,P:j b˜)Ìî$1“’:ËJŠ–»5T !!–£7! ðZOY©³`[ÎRŒHK!¤Î‚¤Ða ,ÁÇ&ÄÚ’:KöÙ¡ f$‘BIEÃ|b¨¢,9`±D%u%wéÆR¤>™KHEÙ=(ª( E6ìÆSE„ÔYp¥x·E¥RgÁ}DÌs³ë@Ì¥¤Î²’µ R©³HÛ%‹T»Ö”… ²å,f¨BB,H q¡8‘‡]iâR”ÔYR”p» D %!ðebI$P`Ѷ„…’:‹Ò±_†R”Ö»•T!u˜ `f"в`PäÜ®¢ˆ’: n—“uÀâ,©¹„ÔY$”%“âK›]ÂBIˆ-È')J¨]T!!$…4°(X³ i:Jê,+);žJ!$ÄrÄ…²$RìFXYe!¤Î‚m9K±n?,•BHIùá&}ÿ1§9d‹DL&oï¿Â„cN s•‚¹7öºAÊo?xÙ>¾ˆÄ. ÈÃg íb»PY¨S‰íöù뜹1%;Ó” Z˜RøLÁ Ö[¬ja ó)^‡ „ø8¢bˆÊn« š¦A° ŸGü4£Vèìc×Nlqý• K±_´`T=À$…º ƒîµàùµŠª»QRê„‚™Ù/Z°huì,é =ÐÅ6ú”DÕÊÀÜ.éɳ´:--L½%âËÙCcÔº“Ó‹…ÔÀØ6J oyßF§¢ó*X–ê¾#z°TªŒé‰)–µ÷mô6Ú'&„Ztu;µ¦ù‚K-PßÝBÓ¯[Ì&ëµÃScF=Ðb"v’–QvÇÆÛ95E–+S;«äþF¨< ©ªléygôÒÆÔîÒEK…qÅ«2f;J¡w½lÇÑ2XPÜY°*›ÚXâb®5Ŷ¦(›[cÀmSž¯zjhn{×›\š¡•-0ëcdw®%nQP÷=Þ¤_*C”Ý÷xmÔ:û®ôv—‹›tDF­lÌK¤eD”%«*»o#™5S,½hÇIà”QKMœgŠ¥XsT*°N8îzPPl‹2®°ƒ™üN;Þ†’ µ²qìfe\ãþ€ßŽÅnÇ¢ljcÜ_¼{Å[ŒóawóÍAçöúqËçÛý#—i['DœH_¿l¿“¿ß^?¿üá5I^CuÚËu¨j`ë…µšÇ¡°³>°Vý86ÂÖª‡ !Sû7¬c`Õ‘6! +XíÓþ a-k5l¡°^Ø '°c pñ:iƒ%¸:ÄWÌp,Xp` Á`FGI£`ç‰Á ¿”N@ÌÁŒn–>ÄóhfŒCu¸xZŒÀŒ1¡`F1D3£Ÿ•¶)h`F7+ (¢¸ GîÄ&OòÓw Þï8éÎGû +a‡ßæÓâ º`ª&ãýt"$Óù†…XD´·Ê‡7ÚÀyÒ÷‘Ò“–Ÿâ§0æ˜aFzò OOÁ°ô䣞ž‚aéÉ'"<=ÃÒ“6xz †¥§œN0¡€xšòSSñ4å󦦚jʇÚK¬)ŸÌ5å©$3ÂÌM@|}ûõìhhT ´qëòìwÉRO=;Z‡ª¶œâéfd©§žHÕŒÃÄ̵g›‘¥’ž%SÏä ,¤£©}š¼òw‡<å¥;WN¤+ÈÀÆI-@är©tÌ÷™ƒÈíd¹t;ѣƲG:öš‚tœ¬¡ïdUlÍ9H†Rô,tÁ !Æ·  äÓ¹ÍDŽó+ȉ˜¹5Ñ{¨Òéhj òé@ ré:y ¢'§äc/@é„W;ªÉ§¿9ˆÜ44Mg´S¹kl ng Wn© ¯¹‘Ëš21õk"wÎ 4„ $bçªzêœAêÂñUza¥Î•^RÐxޝN+HŒaÉdžU4„ãÄŒšÂÛ䀚ÂÛ˱ ’ÓA8Èåh é ä4ÐtfJ :—+5„ƒ›ñš J !œ¥ é Ì ä°ÂÒÖSÓA8¸¯ =„ƒŒ„šBmRcG}5k©¦ƒP¦KŸYI5MVÂ8õëbXÑά„ãKÏš BŸî¤Ž4Ü… 1Y '×Y4„9Ò;L~'Ú¹Ó•ÐñŽ4Gœ[oº޲Ë*hººzit†UÓ•Ð¥uýt÷XA³A˜çÖ1hºo9+h6ó¶iš Bã Ù 4ieƒ¦+á(ۡƃðr¸úcÀªceD w× ì:xçÜ£fx\=œqƒSá Á}nœqáVá¡ÁÉmwû?¼Q:\hoêÊ÷Ÿþû˯?ØÞÿôáãÇOï?}øúËÛYíùçÿ* ³N¥ÓÍZ®e¼Dßs…!uTmu–â¬>K¡$ÄÒK?¨`P ÒA˺(©³àš«“+r™6—: *W¢‚A‘:r‰ RDHg¥˜ë<BB,¨HŒâK‡s™%ulËYŠ )ñK!¤Î‚¤Ð¦Â…¢MGH•a¥XøÃР¤Î‚J¨¨àè˜>Þ¼bE”„XP»œ¤Øã¦jŒ’ jb°È’NßÍ¥¤Î²’bLô "…K/碤Øt6³`Bê,Ø–³kÎuc”ÔY:ÌaØÃ¶CÒº1Jê,¨ë,¶«©Ì I¡¤Î‚Ês¨`0ævCQRgA…Xg)N¥#lb.!uTBEƒ"¯óîŠ(©³à>:Iqq£zPs ©³à>"æK,ÄòÄ\Jê,+)æ¦nŒ’: *碤Xƒ,óPC,„„X-g)VÆä*"… ª&%.,^œëÆ(©³,¤x=,…’K/碤èÞyeÁ,„ÔYP!Ö'³£")„ÔYPÙ ,GY‘"Bê,¤]NR`vM¾Œ¤RgAå\”_º,|ˆ… ²å,E…sÝ%!$…4°˜¼Øà¦#¤Î²’â]4H !!–^ÎEI±ó’…Y©³zê“”’‰Bê,×êÆŒiã“QCtA!},¯^¥¯”0GÊe¼…U±.ìÖÆûL“ךŒš[3>†¯Ê6«ÇbXçØ6fÔÜÆIýXQ¶°qt¥ŒÌÄ+e{­ŽÌhw½ÌÚ˜‡w©’Ìøô©.•’Ùãz-™•:u•Z2ˆÒ†äJ-™µòr-™÷Qöb-™…0Þꋵd.¦¾ª‹µdñ°MŠ‹µdÎØt1y©–ÌAy¹–ÌÅJE{±–Ì ǮՒy¥®×’ù|Qt­–Ì;B‚+µd>ˆøï¹~³Z²’!Þñ2Ž[f-YÁJ‘ŽV˜µd“[œd×’•㜚wž¦~”B^NR¦ó!Æôq>?˜>Î[÷Ùã²kž>ÎÖé㼃œ='b—-ÝTfÞMÍ—ÌôqÞCLRçrkð0±>GäS™9ž=.qèôq9Ê=ÎÑ×ôq|¦sÌ1{üˆë tÀYª {}ÚÃT"¤jÔÌUUnQO©`Î¥ÿzp* H…§V0_Š)­`¨f¸§V0T3Ü£ Õ ûÔ †j†½­`x Ï=@('wÃÉs¯ ËÉso Nž{qòÜ+Èqò܈“çÞ@œ<÷âä¹Wçä¹7'Ͻ8yî8yî ÄÉso Nž{qòÜ Hœ<÷âä¹7'Ͻ‚'Ͻ8yî ÄÉs¯ ÉÉso Nž{qò܈“ç^AŠ“çÞ@œ<÷âä¹Wæä¹7'Ͻ8yî ÄÉs¯ ÃÉso Nž{qòÜ+h²Žó܈“çÞ@œ<÷ š¬„ãó¶âä¹7'Ͻ8yî4] Gyî ÄÉso Nž{MWÂÑ1lqò܈“çÞ@œ<÷ÒÓ•ptÓ@ÏÍs±¶&¤rI~ž{ûkyîWÏ+yå¹W¸»–ç^àúø óÜ­qÑC®ä¹¿üfÁUm endstream endobj 146 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 155 0 obj << /Length 2435 /Filter /FlateDecode >> stream xÚí[[sÛÆ~ׯÀ¸§æ»‹«ZM§Î$¤i:‘•‡Ž‡°$Qá 7>çìY€$L;¢\¨tê‰{ß³ç¶ç|¬xX}Ì1ƒõÁÞÃ@P-Á¾ûÇ'>Ûâe,Y›üidg{Æ9O`¬ÁÐ&cœ;z!wôBJ×hü¶©*ŒnB?JÉ´mJ*lÖû ¿A°Ùœè íLˆT£ÛP\]gÚô+–X8ÀWò‚AÞçÿ*þÙ\eç‡\EÀx4¸ŠES—ö¨@QË¡Ósn¾ôw oHÏíÉ›¥=8lë¼6¬ž{ëÓ ü9‰¦7ØÁãŒÇ#÷x¤C7V·-£‘HœÜ×ï¯QA9wÁƒ–T‚K~=W5ËM‰.0r»–šÖª%…À µý5:…þž0]-ÁCàô®ÖÁåç?ê‚ánØÚ-3½°WTZP[ð€­%«QU[¨NÛ+ü@ð}©ö‚Ì$ÜÉ»ÿQï4‚h< Ô}ç¿9nÇîÔ‡t^ÒYÂÿø»âÌóɽJŸaMk"ßN’=\oFôÁHA$3"¶ñó‚ ‹x± ľK‹ÄÔ„wX¨¦ª-“Ö¥bÓ¡PºŠV¹nTC¹d·’@@‡…G|£š-™^òÅÁŒœ3_F{ÀùÎxè“ÈùUO¾M:¢„q”tdºÊšzÙ(8Ž‘Ézñ7ËÛuaá H'tÆfsŸ ÷™fô´2îòzÓPûA´ ±!/|Zå3á `ªª½Ýì7Ê xD] ÷Ùu ©QŒ©Ñ´B„’‰0ÚçF¯—Ñ Ô–e„±S7ñÇåyiÿ!á .Ëá¤6¥ã ³8Ž¡±DJê3|•]]ª.Omµíƒj]Q’¤rÛRÝ0 [ˆ*«<Ë´íPEa§ÖK ZÑôã PÂòÀ)3~‡S‡Ô3ˆ™€ô¸Ç#€žÛö’bä±ø 3Šäó…Ç„”#-ÜÕ68JSH k­H†Bl¥ eLlIºP©+bÛ´ _cåXXæwfíŠVªDûÆžÞ*éj²0Ÿöüâ½ö¹Oð EZc†3/‰ÆKš/- F3ßû,[ úã{žucIâ6µ)¨µï- [ÂIá²Ì(ÞZ—ás°‘*£°dnçz©ûfË2lb¬ ªg64.PUKmg Šåaÿ|ñÖg¼‡õ£èËò)EaýCw ÈÒƒ ¬9ž·Þy-x)¼´×ßZä< c÷¥nóÌÐ:¿Ê[äb(+mNˆÞÃöÂÁ2ƒbåfàALR0#¶Þ œŠÝn/7@‹-ÜŦJq¿{þˆC€ò /°8ج2ZÚxß“»âV¸ê2oé Ò€ÃØNØú[j¬ÉMPûÖÿ`}ð?p[¶4úÛ³R5ØÅ°3¹=pwÂÁÁ üTF°×]®¶#¡¬ª´¥]`ëEIÁä*Üê#NIŸEžÜ¹,½VÛ^éA`E‹ï#p ßC6cnã/^€qè  Ât¥[Öz3Pö¼hQ¡Ù‰b_"̃z„}qQËÿ7øK"3Bkë5\`ÓfŒžOž=âG&Eǯ/‘Î044C™FŽiýbõû)0eÎ×驱þáx Ë§$þù””‹©SæG¥Í!8U 2ö-Ýt€Q£y a÷{#©?P°Ôè²¾£çÏP3Y‚)lóSݹÿ±NaØdÿá0­õÂÞ¢SšÄÉÏ'ôHÃÇIÝÒö1å3‘GbJÿUã°aòÌëxu÷Yé?Véõxëáçxš‡z“-ªjZdÕ>HßË'P©è%¡OV@ÏzhÀšq]uM~³Áû«¥¦Ü^dZ¥+ â©r]èg§«)¸BÝ<æÙÔô¢ 9V/le·ß¶ó ý‡o¿}²§y“‹"§«I§y`Xäm÷)§ƒC8©Pëa.ÍÜ7q>Åc¼§0‰“ôR¿“89š>š,T;m¥&?Ã×U¦žô 飒©S¾UÍ+Äíg/òùbý87øJwâ$ߎ9YãË«E}zvwR/¨žÜ Q{ÏëÏQÀâȼ§þúGÏÉ ýã›bçÞŒ*&`4ø†Bá¼:ûžsIß XEö+|‡A8F èÙû´âÐg! FÌö¸y`Í8¾×/XÌíÛ/«™ôÜ®[·øýÛ‹ü¥ªX3ŸÍCé®ü:*qñÍ9V7Ëø1̸A#8¡Ë«™HÜ/j˜WàXh^6ú›G™|ü+e ~TâÃýÅ`%ôñÆ‘"±ü sKu, endstream endobj 162 0 obj << /Length 1539 /Filter /FlateDecode >> stream xÚí]oÛ6ðÝ¿‚è^dÀbù-©X¬+: ÒyOë[Ž…êóä&ݯßIɲblN­é0$–Èãñ¾ïȳ•J6xîoO¦îùþõŒX ð¾x|F8áLÑD)¢§Z²*g̨â‰Ñc0´KÝ>xþ¦”äÇzv Œ&&!çe>¢¸c†<¢‰”$ e:B渠DL“(&\SÎÉ>#›GJr±‰'ÁŒd„S-ñ™‡9Üvþ »ZΞÿq’€VYnH†I"j¸\“ß‚]ºŸÿ¾üy%€ü¦Y <àÍÍgWùlxµìí&§Bs¢XMjË_‹Ä“X“;‚à_Èq‘Æ?™ÁL%1Wíï‹(㉊nÌb%IIfápaÁ ‚)~‡‚sʘÒ@ÜP&¸v“4R ²Âí=8ìáÅ~¤Ñó Ìz¹ŽÀÕP‹p(ï9çx“ ©>Ô¢8öûšåŒâv¤ìÀäWdvmýÕç’€ ’@$HŒØ>tŸáxU’Q”øÀê)%’šÞJÃ>“ÑeIÆ6R‡còÝÕ LÀÔLЛ3¤-Îr›ÍC™`“¥íaï'í6mÝ(-Šz.’à®ñ+µ{¯ófW¤¸òÙšºô›ójSÏ% öeÚæuåéÜÌC€Õ‡¶ãà±?0®:^§kQ{€AݶuéVêÍh÷®¨ý¦Oyê6¥–÷í¡ÌªÖ« Ô—JAÉþ(ìËåû__±”4ÔÕc6ˆBB 5O)þç4ÑÚ-6m^Nì~gUÍö9ŠtF\o¼ ¹·ä6+v›ƒßTÖM[xKÞm³Ê©²Î>eE½Ë«Ûηβy»-=ë½wJ}Díì^¥Åç&onzÓÙÿ·Õ‡bí½—ëÎÈÎSÞÀ‡&[wnõ&?Üù* ­5Ø©Ðß uÕùa}Å(Äñõ1a|¾„}Â\ÿ_‘!^ØUÙpPfm>H`åÙ:Iþt’sTèà*mÐ2ÒÄç>¿ïr$îæO@Ýùþ7•éΡ 68ÃJ”>H+É"·Ó -»9îÝt….²(åq`ñ]@·hr\94ÖŸ8l·as¨V6­œÔÃY :¿@h°.ª¤éd†0Ê6é¡hO¤ÛB®Çdõaï:­° à;]{¡ÓÊå‰0p[JÔi€¤UU·¾,H£‚vŸ®ðG?µuGͶF8–œnê½dëf{‡ÔmÎÜ"9¯@ XòÔ:/ÀpU—;«R]eÔ×2õoiUãÁƒ„ÿçÅÙ,°‚H T­3ô¶T¶r!¨_ëD’½H‘)²RʤùÉ.l1€n·™•Уuº†8±i‡1lonCy–[[s„š[ ‚ïC'PÚӛ¦½]‚•ÏnÜdm‹ù0ôx$à4í# ù|l^¾ûá\ìÁÑõ˜ G9­<»ìö:ézç:„.p¼*çe‡(Á]üIEÙÈ]B MÚ¤¥wIêN 7gtä‚FÇ“$z_ßQPr*cqL®ébB >ö81^m Þ ÷>nqŒ€èìq.Å<ÛÆˆHR8œÃê/éc¬)FÖf»è¨tð}øhú—¶pžÃ¿ÐŠ=ž¾D9±2ÃØaŽ€Ž~¹Ù»ÌšJ—: X=9Ó›Ø`¯¡1 u—Äc £Ï§~1¥äbb³ó/úâÁDغëXy¹# `BQ’ƒ¢ÔÝ(Œ«IßÍmZ÷3›ãØúLÆ£9ºà o–Sú>k¾†Ñõ‰ÑW‡úÏüO¼uvá†u…=Ž Mr,\vÐì²Užn2¼öâÜÞèß{‹ O kÈ2Í«§uPð®~T%Ê~cgñNAŽð³·Y›ÞfUÖ<{Z÷‘8Þ‚¿É³ºÈ›vê> /ExtGState << >>/ColorSpace << /sRGB 168 0 R >>>> /Length 5632 /Filter /FlateDecode >> stream xœµK³7n€÷÷WôÒ^¸Ý|“³´+IÅUNÕd´›š…,_å’ä‰%Wf‘|4Áö9¼Ö,tíKá#ÁøÑ”Ú¾ÛÔöËö?O.¾þøßÿñÍöí_žŽý8Ž­ÿù—oÿ RƒÛþ÷é¯ÛŽíÇ'µ}~yR(°}ÿ¤‚ÝuÜlp» Ûû-˜]Ûúë»mûËKiNïIg1 ÿ£Y<©9v­X19ß÷›Q{ð¬–ÒLØSsPÊîÁpMYÒ)bÕ®<+%g n+…¥4íöÅlØ£b9°”SÀì‡å”5 »â,¥ t: 9¸¸;Ír`)M Ë7Íû-»·¬¥XJÐ ‡›˜…2qšåÁ“NÐ+VLΆ_Ú“aŰ”Sà¬Êƒ:Ôn×”%u"]{0Í@DëÜͧ¦<é¹ÊÅYü;– KêD޳ÕXˆX»«ÀEXÒ)Òë2æâÝXÒ)ÒåÂ-,[ÃðO̲yÒ)bÍž”œ‹ÑÐNŽå“Në°«XA9cP72ή žtнë ç¢-Õ–©Ë’Nãq챂rÆPP 8áöñ¤S¤ï£!}ÄÝ*®.K:Eú>bêa¤< OuyÒ)r•‹W{²<–tŠhßL'ˆS»6\„%u".c.AïÞñ\XR'ÒÍÔlH²ûáùbI§ÈE.Æ*¨Ë…'u".œ\„’@–g¸K:EŒÝÓXPIg– K:E`¾Q‰”3Æ¥Öí6ð‚XÒ)ҷ˘ ,J.ñ\XÒ)¢ÃnÉIXiO£°aIH§Ë˜ ,xz(ˆ%u"].¬©pÝ…õBñ¦cI§ÈE.V©=– OêD4J.BI K–Ò\„%"ý>aÌ–,7Ä’N‘.—?ßlFß|„m§;tÛŒ*›¶o><9œá °g˜fažR0o½ýöü´ýô¤HZ&ÂÏÆàjcD€r–0wú ý5,þÎÝè³.*’¡¹&U>Aû@±Ñ÷E]("í×aúaŒîà̪‚š+ª% øÓÅžºR0AO`ßjÃÅWåî¶§ bQØýŽ ÔÐ't¯Çj•¢î*èRd‘ÂmŸ»¯ ·ØY°é ºØã˜ Šu¥`nŒ@eA‰H)¥q-¹ÔzKaåüa{꺓©b‰Z#1lYG˜‚l¼¯c08x üuG݈´ƒ"/lq$ÒF6Ý×1zÔg¥Žºèê’íT›6µ@­{𻹘ãpìö6tóQ¡h1…dõÁ »£ãhP´­Ô—:R; þ¿£y̤ja—#ïv0h•`2¼Ô‘Ú]ÔT¹ÐS«S`-l±5l¢Üå$(­…ZkaSiS|9ŸˆÚdjY›RØ\›hÐ×3Õ¦üýUO‰ê–l@3´ñ3‡…eö¹– ‹BÝñŽV|m+ìþˆ7¨£µyìØ)¨‹yLîˆB]é˜ KÑ2¢Ê’U »¯#›5q#í—7N…ºÔÑá¤xW4í [´JèsØL­®…ZÖ±¶ª#lìÝýݸ•,Ô•ŽÒf·¶¨#îì nÛ±P«íX ›êˆ‡‹o^õç‹ÑÙÙ|ýïÐ…Û«Ÿ¶ìß>äßa” ý w¿½z¿}¡¿Ü^ýòôo¯(çkΨÆvh|u]'êGC@·Ý‰ÚÇÑÑWw¢æqTÁr˜RdžÖut¬Z`½ÆCæÉú6Õ·²Z€õû~` °¦û®ä´[;õ^XÚÃð`m½ÐQ:ÂQ=¼0.Í‘¸%©…nFϳ%µb‡NskR 6a‚åö¤úÙ€E™~,t³Už[”jæ¸:±é!úÝš¸k¿E‰sk¿bµ"÷ó|Z¼‚M8U3{gî Éƒ®](:ÀN-Öq‰žÝa¤ÓH({¹ÁNÐ\@ìXÖ nò9ÄÎõ Jxç0‡Ø"]¡¨áTrY\½ãuŠn?Ò¤B†× ùBöT(a ]@ÜET!ºð˜Bü× O‚)i­‡ ’ ˆï92d`ö¢½‘ ŽC0 cOÞ£7(î^_@ì”^!°~ççP(gnÏ! Õ¼€Ø1§A4¾€˜·¦BZ6Â)ì\S÷k’PvB5H6ÂQç‚qH6BÙéP!#aƒ4©ç ‡d#”]š šá­[­Bvn„·ÇÊMPð‚6hj„‚G­AS#Ì!ˆÏå´>ËcOð)5hj„¢†P›†›a†hÀ*Ï[ÏOPp'5hj„‚/¯AS#´ŽËkþþMVBœúé¸DWJó’&+!Ný¶(†ïÜÉJ(» 43ÂH§¹ƒÌ])>"&+áä X¡™Fº'9\®ïÜéJ¬ÓAsÄØzÓ•P¼—©Ð̃#õhPà ;] ­ëüÔÞ ™æ¹U„ìt%”ü š¡§¡:fFèš®„ŽV¦ 43BÉOØ Ùac{oŸ-ï㽡í‰÷#‚ÛÝ…D…Ó ï 'Ÿ‚ãêÙð…³OÅ]‡/‘+;|á¨Zp<œ=™«³º`ú¶0u˜| úþí??ýþÛóöæ×çŸ~zûæíó‡OÇbÇ?(œÒ{ -lŽ.Dœ0ûXHžtŠtqŠc.¡†Ge²¤N䌘âCA°q°< ’'"]´â˜‹GZâ겤S¤ ôãCA°›K<|“'"] ÁM.0–câ¹°¤N¤‹}dIXé€s9aI§H¯Ë˜‹‡¿ <–tŠt¹ð¦‘¤sðY×t,ééâÇ\|ésáI§HyÈ3Æ P“cÀ΂xR'ҵˋ?…»ô겤N¤k¦)ò/ôêò¤Sä*ØcxTŸ KêDÎ(Hž„Mpd",ééusÁ-¯á¹°¤S¤Ë…›9˜ýAÞ0HÍ’N‘.~ñ&è37„c³¤S¤‹jヺ°ÏsžÄ“N‘.~qÌ%hL]–tŠt‘‡ÇDxÒ)Òé2æa®^K:Eú\XSˆqxŽì›Ž'"W¹ÀÞêˆ<–tŠtÑ¡< DœÉß\t",©éts *Gw¹°¤Näeá–ZÑæ›®p¡…^œ€î:à2Sx…‹÷Z·XÀSó•ÏÎÎDšÒµÉÔ\Ùe]°+¥³0nëÒz‹ej®£|UP°+%Ÿž –"Îg:Ê.ÑB= #»)Ø}¹ ·ñ¢egj¡îéxÓü»ÔQðÂzE‡¹Ko/P u=o}ß[ÖQÇ@~GGîÒ/Ô}›á76[íkÚÚúû:òK›BÍu,smä›>ï-F ]i#8m õ@‹±«‚ÝÓñ&¢¹l4/tœå…z`ä1Ã/ØõÈ» áÀyçRGÁc^¨ÕÙº`«íTÄ õ ¥U±P«³LÁæ:¶mòš6¦}V°¤MÆ.´ ÍEÛ”¿¿ê)QÝŒ-÷Tи¡Yœ# u¥£t‡P°eÓA>Êëµ\Ä u¥£´Ñ(ØªŽ´µ^nÇB­¶cÁîÏü:blix`]eS@¡îÏnüV´`Ìnì"?â±zuŸW¨ËvnÏ ö€Ž¼×ð¸pÑŽ3µÜ×›ëøY0¦cžyI¦³t¸3/‰£tÞ`¤œyQø&¶¾Ü…HJ‡ã£/wáÂÆcÌX_îBpŸÇ³l_îBxžwwüæ%Q˜ÞG ‡6/ŠÂôÑáM¬yQf8 Þ>˜Ea8ÐÂ&˼(2˜„Й…pðÎʼ( 3‡/,˜…3†ä3/ gŒJ¡ÙáŒÀ:¡ãÕ¼(v4â—¼¬ä…$z‡˜!vô³DaF ZÐÆ¸Õ(ÌÂêÃão‹Q˜6°C=ÜEf]<=ùeB 5«^"•cOhê˜R× MâV6Õš¢BÇ òc¢¶eÐAr!C‰¢'\¤54Å$Ö©øšÖêT i"ó¾%FVÒb ´V§â›Z«S¦urX”ýu>ÅZ¬SÖêT|YÓ:åúÅÏÎ:hZ'Œèƒ’hƒÛ†Z¬SÖêT|_Ó:åx¯Y?hZ'“½P‰ü•´X§-Õ©úÊ–ú©Bó9‚|‘fŠP½Z«S…ÖêT|kKöT¡iŽ#÷–gxI‹u*ÐZŠ/niìUhZ§|¾‹äõÃÞê Å:hZ§â連™h™Go­Ÿ 4{©·B™# 4¯SÞäÉRæp\¬Sñ®õSæýDsy¤ØÈ¨|-Ö©@KuªÃ¥~ªÐ¼NTF{ª‡ÖêT¡µ:ãR?Uh¾>ÑÕz <¯zh±NZ«SñS.ÍåšÖ)Ç'ƒ%¥—[ Å:hZ'›!RÒNõv®½Më”#ÜCþT§ÜÈh^§ ŒÛŽ›’ëT|¦kýT yho”­Ê—/ ´X§­Õ©øX×êT ù¾œöùžwç´X§-Õ©úd—êT¡¹=ÑWçÏZ«S…ÖêT|¸Kó^…æóžÍ£Ž”4¦‡ëT µ:ŸïZ?h¾>QeÏ-ªÚA‹u*ÐZŠx­NšïamÞºÑ]¯fÐb 4©Ó#Î Õ…°*GH°®@Å.QR[ª¸Ào©Õ uÑ•»™ Ðþêýö×/¾þôúKøëí‹¿¹}…ÿ}þðüåß¶Wß¡GÖµfãéi‡°ÃÔG?²¦/ý¼!AvGª¹2?’ÜÐU ›p[ÿ¹Õȹ2_˜Ï!ºn<{ÆJ!0TB¤mMpadŒd >Ï!ô3Ø42^ìÁqÛ1Iê—ç"ðžZ…ß/LžCòæ{XO-}õ#095Eé42Qê—ã­ ÃÇ({”Ô?Î…­ÎŒAÅ‘1’-8ëʈFæ/õOþ;ϦaXOIRÿHŠ¡¯€†µžÖS`œd 9(>ÏÚk=0Qê›êKB87 mMÇo‰9¶:Óûa=ÆJýcCÜÚ‘mXOñRÿä êü~€ÖS`’Ô?’3¯1?Q§ŠµåÈÄq’-Ø<ƒÒòÃzŠÿ.€Ô?’ó´1ß[]-4Ï[cÅþÉ3­vÞ¸‘ Ò\eóLŸSÖSKOuÝ2¦X(µÆh@GƒÀdË¡=¬ÖSŒd‘lÁß1zd¢Ô?¦|³Ñ¨Ð˜¸+©LžChßë‡õ+õ¡QÈò\ò#$[0y)ÁžƒýPxœÀPÏÚ÷ºa=F‹ý#\wŒ“lÁ¨£Ì8ùÊv`¢Ø?Çùu‡ó|Œ:Œ„é§c¬Ô?šv¼>?5¬§øÉtP[ÝÁ¸a=up¤–úG –è#õvn«»gÕÈ8©$çoÇD©4í¨> stream xÚåZYsÛÈ~篘G+U;˜ûp)[ѱ²]{É©l"ë!‰1EhÐñþûý !B¥ÇÅwv)Ð4‹+O œä!^ @§dO³áG“Iz—HFÖδkß6¡i¼hÙ6-VßÎóí—oEEN^&`g§ˆ¦a0¶cQ/€E¢k‡…² å¶cyOÑÑ£EÄÇò1 ˜°º¸Ùaí À{iZÄU4Ásí6£p/€Âb¡“sd1šÚí«wžÔ?-iARÍ•¡cc8'SNp+éÈ»¿ðTÖ¹;Ì`Ë!Äzn£dp)ôKgV EÎ/ÿü E‚@iÂ&Óñøjͨ(Pfh¬ª°m˜‰šKÔ"[†iƒ²Èm¥¦%–“ß6J‚§Û2LÂ'•¡×0c#Ùeh¤lÉõ†2€ã¢¼€~sÖVL(èê:/'lFá§ïõ›‹:­sÖÖWƒä 5cãïgt²f&ÜÇù½$1f÷ŠE9»§“ûyAJ‡÷z>ưhf÷ýnv¯0ÞÏïI€ùÜÏy9zõÑ1#…´ `ò±,²‹ ©NÏXò)ÿ^?.ÕÁÐçãB˜Þ¬<¡~0½¼ÙÁA{à?GáÅm¦vÍà÷iW¤RŠFX4NOñžÞ ÍÍŒ²ž²ŠÙ˜Dêg™Dú%“Hû “œ”ˆ"ˆ=§$ý«Ó×J(#‚R"¯Ä¨õÏ>ê1žœ³7ez;Ê*ö󴾟ÖlÃi–—ô»1ö㯂ºúB’¶ö"ꔃäCzGÏÂnZåE’·ùø[^²tü4ÉŠáhrCo[%Ú¤^Iò‡ãb<\M÷2ywrBS†èmŒ~µÀk>£¥ÚÍOþ1šMªÑÃãÓÑõu+Ù.‘â%w£É´‚%¿NQŽóëšÞ&Ãz­ªQrS¦ßò$ͦužd£2›Þ]óïI=óä.ÍJl_Êc0%Í28ŽÀ¢U Ç–5̯“¼“ Î1§]çítr“–Ó»q:­“⦘ä_“,%z-”Þ"“n§%»8ŒB±j_.¢ÄØk ]XD›VgoE¢ì’±[w¿üü…vӆܻ;¢`žµ&µZZ“Z<ïÀÞ$zaÜ;­Û¸^í†õjÿ{Ö«y¡õjV®Wóµ^Ÿ{¸FÅs´j©DGòèƒ II˜Ùr¶¶Ï’ e_“Þ#OÓŠ>µAV-éÃÇ}“îïXrQ\Òr§ðµ8¬É8Á?m7sÊ8®¬Þ6x–¦¢¶¥sö¡*=Ͻ¥ŽæèC·"e¡U´_9{!•¾²ÑaeLí…áÅ”g1ƒ}”„ö#/}žyíÒ›úÈåy‘×Ì"¯i¡Ñ'6m+gýÏ}‚%æ™3XZ¨L´W\B÷Ø$¹±v¯âyãSÇeþŸ¼ÜÛù;z¨ø €Alð6.°)F˜=¾GqŠ{l½`jlÄñø5JOA{ ^‚G:«Š,*tC´Ía´ŽO<.ÚýäAA/Íé;UëH”7\4š/îYñ¬Ù)Ú.›Få-a¿Éâb`Zåz­òzQnC`{JðrËi£/UÊý¤†íËéý§†th?j endstream endobj 171 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 179 0 obj << /Length 2175 /Filter /FlateDecode >> stream xÚÕkã6îûü «l4–lù±‡~ènoûÂmÑé‡C·GI|ãG*Ù“æ~}IQö8i:7{‡[ˆ%Š¢(¾D2bq"ƒhöo¶'Sú¿ûê& `!€ï‹wpÀð(aE’Rp&E”ÍÍ/7,áE*Ælè–Æ}pûM“_v7?À/bEZówø9Ù}1æÓKž±"Žƒ¥(X$3<‘³"Ë.çÑÁæ#9y±ˆ¯‚™ÅNeŒÿEJ˜çÀ™º–£¾–3…½¹¿¹}—ñ €[ä~ ˜"c)ï×ÁOá^™ÅÏ÷ß^å@þC$£΀/ÿès® *ï ·ïD4 ÷’`*"'Á¼9.–q‡k½QCÝ¿&î§ý™˜íX¡"$mÿ xt¶åäH7‚‡Üï4Vvõд'I¨Œ‡¶]OƒÎ¬µÑë¿=ÇË’(ÿ¿ÌdQhº…ÈÃ¥qÏMVˆr¤ñ®ÒF™!»ªT5AËz°½6U»¥ù`§¡­ŸT¶WméQ-a]µ )Cµõ+îwÝb ‡¬-Þ Ø^rÎ 9Þ,ágv³LÏÙwÀ9„š Å"IÜ-D¾E¶ß˜…ä¡>hóܽӔñt2°=ik²rÜHÇB£Á’àEƒçΜc–ìb–r/lù܉ËŠ"XÎÐÑMÞëÁ™FeúÝìæ<ÝÀ…p' qBß[ò+RÍ¡"pBÄÏå©K‚C:Z­,#Ld.>µ—oZÀã<„pÑШÛàƒÏvht»YØ[í•%ƒÀ ÿ:‚ÁN«¾Q{šèv[µ ø^°!2¥“wªqã«á,O&«Á‹s‰ZäS0ƒ‰³…0g=[Fµ¶V½¦›‹‚‘ä^FÞÁ•}}Å÷ñ¥˜¿ŸåU9ˆ2'‘ `3?O«dÄ8r÷WË«^Šy1uŠ!SˆÀñÊÀã?ZgNgYÝŒÜN ~þñä󳌃LŽZ8>ðþ‹ë%gï²Å׿S/àýaI€å„w z"þ!âÒpü¿¾È|L —ð¯-2z†_ËèÏ‘œ“¶ö®;|j¢{iIçØC–]•ýÕ˳տuÙ¿º¶!làeŒ¶×µJK>©J3åX_Æ ¤kX*KÈï9$sÎPÈÃ9Hèm×ZÝÚÁ[2lToª__û„%Ÿà) çc"RŽ/g-Ë}) ´çŸ;H¥–"•áºsÅçuÎ]N£4|ÿw¯¦W¢$,I}‰âÑÙb™‚/Üï*ÏßÞ`ៅ%Ú^ Kãsê8d5ÉO…èöEØrT]ibFE(§Aj!Š>¥6Îôh£jt#/(ønTÙw¦úê«î ëÁiŽgÔÄ@ iÁnÁ.<[®£âŽ{Rfäìò‚AT£ÙTôš<òv‘¡špJ6Ž£Ñø-MÉ«r®œðœÙžÖFGCÿ.x¸wkØjò­´…0#…uµÝy3Æuç¶]ãô¯PöÐð¡íÑC­×[¿Úµ~PvC½¾táÝÌ®±¾½rŠë†žæäª0° »/–&ø¤¹;2` 6$c°¯b,±Mš·øL¸Å ÌÑ‘áv m‰Ê¼Ôa Œ“©no›Í…€‹!žÿ׿Qš½4‚§)¤S§©Q3‰T^ZÙ#]¡‡+tÞ%¤dq,Ne…’jž"k{ŒM¡Ã®«}Ë‘\-°T°On{R"BIÄcxó2×uÿéç(Xü[—ÊäÁÁa5ðd`»¤~„bÑ•VqH™oÞpAòÀE ÑYGãR7&Žƒ vGœBÇrZ°œÇÞx1Øj¿‡¢,á„r[‚ƒ0³„˜âo'‹Ö™í-ö``ÇÀC?¿[@à}Û¡ ˜7Fü»ÞÎÉM–ž™G1 {̲ÇúZ·¥Æ¶BžÍÞÈÂ5WÁOvÚõ_sl€*×!¯3Ý ü·Ñ½Ù82z«ÌÚ£¹—nt^Tm…×ê+פE·í•é©/ 3움‹‚Ï£=OÔ‘EÜS"LéÛÀ¸c¢Ž|CXc¬³F.™Hblû$阤{ö0¶àW3ç®2KÓY»|tÚ¨«µ ¯·tšev½…è²§}ªUõÑVÖoþºÃãÈ»~\[ *P¡»IN±7–ÊŸŒí%ëwÊÝI`‚Í^*<<¥u$$—<@%Qy²Söâh»ËŒ¯Ÿ<=ñ€"4wžk û=ÝÓô‡2I|ʉz¡ÀÛQéC ñ­GfŽ„7n#ÝK¬*ÆLÊjj·#ÖÆoé;@–bê#Ý]b#¶‡ùŪ=# R ¸s¿øƒg^D‹"|è+FOÏÎ#Ìonǯ endstream endobj 159 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/basismap_res-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 184 0 R /BBox [0 0 1008 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 185 0 R/F3 186 0 R>> /ExtGState << >>/ColorSpace << /sRGB 187 0 R >>>> /Length 15173 /Filter /FlateDecode >> stream xœ­]KÏ59NÞ¿â,gª*—ªÚöF$˜^£YÀÐ F¼Ã¥‘øûÄv.vÊÎi£^|çÓë<“ÊÕq9©ýõë×þúã뿾ýMý÷ç?þí_}÷úÕo¿mïmÛ^ü÷·¿úë"=Óë¿ýî÷¯íõÏßöׯ˿?~Ûðú r^û¶¿¯øúBÖ+ìïýxýûëEëß_¯#¼Cz¤Jî~ï”y2 ¾^ç;Ü"™«kÊ÷û"O&Á×+Þïx?“%;ïsãÉ$(Éé½o"™ Zòq¾¯'“àëâ;…g²d§ó.žL‚ÂïûàÉ\]W^@I$£ =÷3Y°K-ä“'“à Šxˆd.hÉÇõ™'“ ç='OÊãû¾D2 Jr~ï2™ zr©ÃS$£ åýL–ìó½Kå(èì‘Ì¡5I,º6žL|°ÒGÉ’}nï#ód”äû½ï<™«ëÊKn"­äÏdɾÞÇ.’QP’Ó;‘Ì=9¿7™Œ‚ž÷#Y°ÓöŽO&Ac³d^­ZòþŽ‘'“à ž8ÝÏä©Rï÷v‰d|Aõl‰'suMyi¿-ðd”äf•GòT´ô¾’HFvÅE2SוÇ÷D2 z­=’%û~Q$£ ³Y2+L/Zxç$’QÐØÏdɾÞ[É(èl–Ì¡7IS òòÄÏdÁ¾Â;m<™È.MÓ™º®üxÇS$£ •ü™,Ùå÷É(èl‘Ü Ó‹¶¿[$£ ±ŸÉ’úBÅ=’ù¢Ú–Ø­,?'O&ÁLÜ¥ï<Óý(#ëÎ,¹ ¾^{~§H ›þ;Œ€ hågò\¼’Í-$ù‚ù<ßÀUö 6˜x2 Zå=“%;¿Ï ’Q€³_Ž"™ zrY}‘Œ‚ž÷#Y²¯÷-•£ ³G²¨‰^1¥"S’ÐÔ½k€ICYë[¿š€7:Gæ@I·àÀ¤á{UP24 €(U/äžúȪç¬& ¥é['’¢aƒ“„ΑÅñÞ³ ¤?…˜4\ïó’”à¢pßÀ%ßé””Œ2<Rñ ëKºà5Ó+ªXpÝšà|Ì2(€IC±(ŽMHB&K×Ù³(Ær–’àc^·˜ ™¹Ñ3$´XD à:G æR@ɨÉ'`Òp÷ý‡ ÀK5 ßÇ!(éÀ¤ázç (€·No,¨¾($Á,Š­¯ææË— †Ò€ëY„÷%%ý)À¤á|Ç$(`”j²lš³ ¤kP“†‹Û/C‚æ¸%€Kt@É(à 5äí/ I×ÀÂ|hÖÄ^ Ÿûä€*ù‚}çy(€Ù¹ÓûŽ@ܘ_›=‹böݵàT¦70i¸opupI¾`[%#‹ôÞn @ɨÉ'@j81ü¹ébv—t@¾¹¹=$£ ÀœEî¾!!¡$€K Tì.(éeP“†ë¦,P24 €hÞXW†ý«:@j8ö²uÜ8 JІ²Û’¡sdq C“KúS(©¡º} âr"L.é€ë|ïQH2ÊðÌY„÷™%%XÇ.\2{7Y…dxŸ€ICêû! ?«˜¬}–ã’¶UTssߣÛs œ®sd±½Ã)(iO¡&  8@ Næe .€È Î!ex& å1§,P240¯™QQX}€’®AH G& — Q6CÀ%° 3‰K¾ÀU¶]*`ÒpƒK°¢à)8€ëìYC};€$£€¹xï%]ðRB¢ (™^4 O€ÔP6øG’t Vó¾¸ÜyIpK[€ @jqlÄ„¤hØÀ㡳gQ ’¶­ô)ÄSLÒ=|\BFï%BçÈ·ˆ€’Q“O€ÔP&¦p IÈØ;$€K`{o§ ¤—AL²°'»á B} JFž€IÛ+@ÉÐÀ¼uFc¥a&q NÅaWRCŽï€$4p’p#‹R±› ¤?…˜4” z—” ÀK5 yŒEKº0iÈð6KP24 €­mðÅ0ë®.)€ Ûë'`þWì1!ÁA[®³gqm}24¶]H ¡LæÍètX•-=‹b6ïIH‚U]¦02ï$—à‚p#‹­oÄ„¤·¦˜4$x«+(€—jrïÛI!¡-Ì­¤†bp^·N|†ÎžÅy£—KÆS<s!ãpqpI×À¼T½×ÕßG ÉÐðÌ™†ÛK°±À¤á.€ƒœCÒË & çØFqÉÐ0b¤ô³]ÝȬêb@)€IC1iÂ%$Á¢#‹8L5.!WöcZ\‚Ê®sdQ÷”´šÔ“† oÿ%CƒŒRBnðÒCPÒ5(€IC‚·„€’¡xëŒÆb\BæÁ¥¤†2AwW—àâ^Ìà:{eód<Å02sCkHÐøO·pÉ„÷5PÒË & ×û¸$%CðšuÀ+(@I× & ÷0r¸„ Î \2'¼þ”Œ2<R¼FÜ€$]‹¢éèQOB‚®žãÖRCÜE$̾|㡳gAÛT ÉxŠ`.ä= .AgQéÎÀ%0SH¾ªëOH 9ÁË%È€ëYlÜð’^ `Òßg”” ÀK5 ¹óˆ¬!¡,’ Š¡µ_@ZÜ/ à:{¼±¸d<Å02ôH@!é$`”ª2ŸÃTã’¡á˜óK3—t FJ8á¾ú+T!Án¿G0½òß)³ ÅBgÏ¢¨ç!$Ái&œ'@jˆ; êâì0ç-\çÈbÓ —y°«©á|Ï;$8‘sX¸ÎžÅ™¡¬@’ÑšÀ\È€\ÔÂà’؇ÑË%½ `Ò†“K†à53*j‘l\Ò5(€IC†—`!¯]¸dbä’Q†'`Òpˆ:.€÷ÒÞi·4Ì$.Á,Š1 ænÏ^Ês v˜bê ×9²#”KÚSh€IÃ9bä¸dh`^ªQÈcÄErI× & ×0´¸×p)€ 9 JFž©BM6 I×ÀbæìéqC‹K°Û—EPL( ‘HÒœ$ tŽ, i@ÉxŠ'`Ò0ÚB240/U/d1YûÐãÚF`ÒPŒœ| IpCºO®sd!^[PÒŸBH qqb\òU‡À%®a.rÉ(Ã0gqôÀ!é8€×L¯(Øže ÉÐðÌUF—àš&— À>Œ^.éeP“†<ÌE.ào'Wþðã·½žY¹ËZSª¸¬‡?þáOߊý†'H` sékåÿðíõ/•Ó˜Wùœc‡vzrjj¯•6Œ¦1ò+eLáa-™åGçžœ‚¾á‰®ÊoiLι1úÖ(EW×¶Ðx+­l5J­©ï«©²;Ø£‡n¥R„¼™Šqä‹:¹á R©ÍQŠ÷÷Õ#Äm/ë^Ëç†hš§Œ°ÂÙÆ¡m›s—¶(ýb‹œs‚¯Ð×"÷o¬Z¥a+cív“ÔXÛÅs_<÷‘øøÛ0àÊWÁû!ÁW[5üÔ™Ó f`AJØgNñL\é̉¢B¤j¯"‚„!”¾.°Gèê«9¨HJí¥[0HqAº ÊÏ,I7ÿp/E8õá›"kì ^{G­ì2üƒh§|À9 •„KÅqÂ3íé$ŠEÔHêíˆ0ºË£‹Uf‡S* ë-`!÷ë$Œ=ÓH0w´“˜SNeÓ™´Æ-Õ|BWÝn$í¢Ê¯þloN7ž¡ÔrÚ oª|?‰â§œ9•ÍØ®5n]p·Þ&i:3ŽNMg RKŸ 7¬­],5òJ%Ðê[3ðÈIFñY¥§È;ƒ{ìdŒy±û}Æµæ¸øZs„æ¤ÝÓV²¤¼¾‹†³Ô‘ijéMï°¬1*)B£;ä´>,bFZ‹®9,kT‚oXb8Å¢=!Ê@µ‹‚äkµðÖ7Õ {-€Î ,Ûã<íl0zìÌéÊàÈtvÂ{ŸÇ"§ mÄ‚R_Ñ.þ ~Ó%ÌõûŸ–Ï«/ }KW}sê[YëkFŸÙʾåðÚ¿¡l\òÒÖÒ*‚Þ¼9we›W¶–Ö¸¡ìs.«GXݨ¾3·[e§sm#<ž8&w¡³luŒ…·Žœg­(*ÞÄè ¯=ÜBÊÖÂ[Wëãæ31¾ëðÎø’fÕöj‹ÐÅüˆÓw1T ƒFÔE;åŽÆy±áé&Ýc¶Tç¶oúe×tK$ÜûîY´Ó·8s"Ÿ³s—]öX›Õ¸Ö ¨^]_ß‹eçuÙVU,{¬cÕöÚÈ©nUgA`eMêÖp«ŽK•t åvmë3†Þ#«$jõHö›x¦²Ç ˶W: úòì­r,»)kA7w±ì¦¬Ý4ÛЙ¶²Àò¤L•»Ÿ”‡Ë+VI–[¬/~Tn» Þ2}Iª$ˉ¦oÊÉð¢éØF2ÜhËŠ°¼k-yéH›÷·•dyÒtßf#¶eåZ~7}¡h¤Oî8­E>úã„áÓHrÒl¤O9-'Û%§­cdøä ÇæÇ^´’,§œ¾)n$ÃW׆°å¬ëé¶·NYÒ:Ëv×)»›ÆZøë”]g™;ÍÁÐX¶ÇN³$:ËvÙ-žká³Sì£Î2œvúÒÕX–×N_†:ËpÛ­[ÙòÛ­Kh9îÖµayîú̆óÍ)‡™éº[N̦ïn9õšÎ;}W×Y†÷n]BÛ}·˜ÞLÿ݇¼ ^K·|u=Ýp˵¥ÝòËõtÓ·xVÓ·63,'œþÆ ±,ßÜrÝ0]v=ÝöÙÙãdå´S¬äβ½vŠßX>·]gÙ~;ÛrX9î”ÝlgÙž;2kqm8¤Áaºîôív7QmÞâ¹,—ÞÒ$Zyúìu賫Om/Ë××Ón½çþµ±V~=»eVŽ½çÆ±³>yöÄ;³¾{0\{Ëñgúö–©¥sï¹ï¬Þ=uL|tï©ýô£O…?:øÔ™ÑôðõtÙ·~‚…XÕÒ‘í¹ròÙy­¼|ö~Õróµô•GÏ3Ÿ]zÚø\ùôÏqgN½¥…azõ–»VÓ­·ÎËòëõ¼áÂë醷®íÚ-Ç\O7|p=Ýp·µtËßÖÓ ×ZK·¼hKÿ†éF[ZĦíƒ[Äp¤--}Ó“¶ÎËr°-­Ä•‡Íž ?ºØäê ÷`ºØô=%Y.¶REø<:Ét±ioº+iábSvìdª)ÛÆF2\lº›¥’lŠÿ´‘ Ç›'PI–ãMwè4’éxÓ|•´p¼ÙU¾p¼)ûûJZ8Þ”MA#ÙŽ7Å2m$ÛñF9¤n¢",Ç›>vi 7/5•d9Þô¹¥‘ Ç[Ø–ã­§»Âä:ëCœœœšëS œ\ì;Ëp¼-«Åt¼õôQqr ÞX–‹Mw¾t–íbSLÂÆZ¸Ø”íDgÙ.6ÅÄï,ÛŶ(¡åbëéÂà¤!ÙX‹88Åì,;N èËž ·xnŸ3­±,gšnpt–Ë™ÖYf4Üj¤™.¶e^–ã­-ø¦ãM5ê:ËpÇ-gÐÏî85/Ë·lÓ·¬-Ó×Ó w\K·o=Ýp±µtË™ÖÓ ·YK·d=Ýp…õtÃéµnWËéµ®kËéµî –Ók—åôÒ7<õ)ÀM]…>ºÂ¤3¯±,WXOÿͦλK§—¹ÝX9½ìUê£ÓKºåËçôꬅÓËÎkåôzºå:ËvzÙvéÒée—ÐÖÖY\aêêúѦZ‰]aêÚõÑ&håŠxk¬O!oÒíÖY®˜·Æúè ÓìóEÔÛª½ì°·UÍ/âÞl+oø¶¨ùEäÛ"¯EèÛb¾ˆ}Sóe¿Ù»YÓ×ÒáoöX_Å¿-Êò1N›ÑWpö˜X…ÀÙ{œU œmµ›®»e[ÅÆ-žë“ëNë¦ëÎ~÷ý8Búüøhùó¿,5ùúþ_ÊÞö]è‡þÞ÷èFØŠ~ÿõúÅþË×÷üöߣæ5õ(Û^8éÚ¨ÇO§ºŒ¨SC£:Ÿ)Hå¡ÅŒBÿÆ]&(OZ¹Ìwšæ­˜¸ÛÄjTëqA ¸åDª·¼¥ßï;Q³“a°Û}ÅŒp' h»ŸÊ¼Á©Œyzë·Œ„2‡õò–7]à`jöVR>ÀÍŒÞ¼Ô Îf¤žN깃˨§·šN¼Å¨·÷Y/˜ø©š¼Ì>h5Þò^7x¢±¼·“zã¾Ëë¦â–sõޏ}Ãí26Ž·žö ·Ò؉½}bßq›ùz‡|]'Õ^áíÆ¸HP·¸¢—{à&óu—ùÀ­:>¯»B7–Ùý¼á÷7æëæÆœàø¼Þ°Ã=ÃÔ¯w¿J`áÐPðNŽøeêW—»žÓ .säºËœ#8αÌ¯nx¸Û¾ÚAý*y§ý<Á•Ž\÷ó^;8ÔýÜ nuÌ×ݾðU êWÁ=çÜèÀ|ÝýùF¶¯Û ÛÐM€eöÎ9džÎ¬gïó;º °?_n.:pì»Nô`5{»óq ×o€Í*qÝæ.|k·.eÞá{„ <ùØ5ÜÍøóqèû¹øá`ìVîºJøö±ÜÝ9eððãóºë9ïàýÇåÈÝ%sê’Ÿ{7ép×Õ›‰”ÜùžW7‘Üù^¡™HÁÝ'¯³™HÑ=oôY`¾~.z.pÚpï7ô_ ×;†^ äzÛ(lèËÀ­;ß=دÜù–}}¨}ÃK=ðCFÞU!ÀÖžºFpç ß §)'¹« îs¦nuº¹ÞP󺟷ìï/êVÁk©„²Ã?ª•ãöe”-~®SŽ»Ì o‡Ä.é6BÙäGêVÑ]Ïe—_-¤}óŽýûü:縩©YH§{Ú¸¶f!?76 )x—²pá7ûðqÝãîh­>w5ßøµ-Ì×í°*»ý½N9Þç~“û³;_ØíWëÙ;àþÒXû†w,IJۿêœã¥–ÍþA]c÷6o,›ý\ƒîª‚KÝ«õì.3\«Y­g¿t‡74ؼީ.ÂE²ÕÏìήÀ¬›2w]Áf¿.e½Ìâ.Ê¢Ã83„Œ½›Ó½žÕÏ‹2¸@$C,#¼¿ë¤~l³¼”*ß<«öæÃbM¥ÕT$vs&2Ù‹“ÄnÈ4Ò0YO£¨c# ƒ‹4Œ!ÖÓ(TØHÈ`=4ŒïÕÓ(Œ×HÃh]=‚r4Œ½5Ò0ÄVO£HÚ9MïN‰Ý)©k£hY# ƒbõ´k%b8¬•ˆQ¯F"·Z‰Ãj$R¨ª•ˆqªF"…£Z‰uj$Rp©•ˆ1¤V"†Š‰j%⋺gûksPâw"ú(äÓH¤ÈN+8DŠÓ´1ÓJĨK#‘‚+­DŒ¡4¦(  ´1NÒšø0ÒJĨG#‘‚­DŒa´1€Ñ3ÊkL£§cÔ0GW.ùèÊ…‚!¥HH+1is]K¼íi­†:Z‰—=±ÕÀEWPÔ¢¡‚­DŒAtÕ& ºÊG1‰F(ôð©Ï¶jÜ¡§5èЕ EƉ?h%b˜ ‘HÑ€V"zö=U#þ,ã=öVâeO®5LÏJÌöäZƒî\MGw†> ¬sÕ EÕYú0xÎH¤9+Cá,[#Þ¬D lóôÍÕf ¼f%bŒš‘HjžÚ¬Ñi®ÂShšQŠ@sÂÏ,K}µF"“Y‰I›ˆ[âmO¹5lNü©±R¡Fbí þÐß±,1àªóŸþñÇû±í õzj$r0âלð‡ÊõÝ÷CÑô¢\ Ì8Ü–û(†6ž[1ŠmQ¦ÇŸ»¤U„é½°cÇÏ"ÿÜÅ ­ ¹éÃóùø zéÑ[N˜F©PúñƒF*ö!Rš$q£“ð}M‡e:éÄÓ®&IœÄh¤cÃØK“ùa»NÂ×B6I×줌Gdg’~ £“. ×4I"º½‘`ÊQ*B±î¤ˆçjM’ˆï¤O%›$¸ÚH5HÖ$‰“%ðÌIÁæ”ñ(³I‘¿Tï}3H2ð·‘ÀæXT„ŒÅí¤„çŸM’¸ó¤“ôA¨Ÿ i¤¬B=,¹“ôA¨Ÿâè$}êÁótêƒP?ÑÒIú ÔÃÕ;É„Ï+¥:É„Ï`õFºÌA¨\]ÚIæ T‚é;É„ÊÉžFºÍA¨œ¢ï$s*§:É„Ê-~dBå4E%Á«c*çõ;É„ÊdBåÚ‡F2VÂM½Š·“¬A¨ÝÑIÖ Ô.ch$c%Ô/Íè$kjŸ‡è$kj·\v’5O¬ì ó›ÛÉ\ Ï„ÅÃ`—3l4WBíÊ‘N²!Í­:É\ µë9:É„d\$kjwzt’5®L:É\ µ[^:I„ÿos—>e ®˜£¡¾â]“à ¿õÓ(Kzftõeüš~3º3±¤Ã«ÓNWß®é©Ów¾OðnõCBöx¥{ól_ø¯ÿü?ýð§ÿùqÎrþGùÿê·Jþ¿ýÕ_ãè~ýï·ßýþµ½þùÛþúuù÷Çoô€¿ù–À?ÏáÍ׫þ]fŠT?w)$P6ýemfàòoŸ–¢Ùñ†€p½=› 9€$P6îñV“†2?´¨ nðm“t@™j÷MHRð Ç & cî8€$ áp#‹ñÁJ!éõ ¤xq•€$/Ë%€K:b$€$£ ÀœÅø$®€†N— ¾¸”ô2(€IÃÙ?`*$CðÖ鼎ã’Ðcâ…`3`Ò@oÊ8€$ !À3à:GGÿ°¯ô§P“†»LVHp£Ï…˜dƯ…d”á Ò/^8€$]ƒ°šé•þ©h!@×ñ0i¸`;*$À…Ž[`:{püm’ÀSìð×'`.ä ï"%ÔiC®sd‘ú窅dÔä 5P<¤kVªQÈÖ¥ dhx& wÿ4° À[§7Ö‰³ „²¸‚˜›;Á+n@ i€Èà:GèQ”ô§P“†k,®\24H@/Õ(dèa’®ALð=¥ dh`±œå}{B¶¦¤LË)ªI ¼Þv©"X_aó+!BqÏèNý àBRÇ`V²‚­$„D dÇC9ÂõŽlØ! Jzµ*€I:­%4«–iE˜dp÷#(ex¤ŒèIQEÃ0^;£¶Jß„Du…ØUȬ¥|a—Õ9~› \1Ë( LˆØ)IËŽg|„DC‹€ðââîXÒB¢ÚY…ÌZb„à!@"Þø" \1Ë(¦\BPÄžHLZ޽ì\Šhý{Ç8Dˆ¤´üqJ‰XYžGF(!(Z8DTÕ¨º2tƒ[ˆè¡ÁK¥@f-%¿ëÕ.•'WÌ2ÚÆ&Hˆè¡áö! 2k¹™ùÎEu]Š"ŒÊ&  !«Ý'äQÜ‚$EC‹€ðâ±âžck'DL‹™´À¡ã !$Z8D4ÛhÆbKœ‡„ˆ2:Oòè ×0¡„ˆ´À•½"³Œ²Øf {"2iIàñ— -d7Á5‚"¦ELZŠAv !u)¸§R@¸ˆA¶±å¢Q 2kÁ“›‚"¦…A„ ÓMšýb&ž=r@K(YKØÂ¨:!"ßĵIˆP<2‚wK§„ˆ&2¸óYLZàÐñ¤Š’!2R@„â‘QٌͱÚ}BÅ=!dRBPDû€tL.bÀ6—\4Ê¢A&-Æd‰êP "Dr^l‹ÈE¬,OÈ#£c8„hháÑl½÷{N!¢×ûòè {fN1.-'" ˆP<2*Û”#H‰Ø=!â&8´ !(ú"Ê á"Ù™+‹FY4Ȭå[&!¢zW]ÂE ’Ù>—‹XYˆÔrl3N¸¨k™!YiÆíµ€¨ïˆ5Ȭb¤w ! µ¸IˆPÌ2Jà#–±'R “–ý›!¢e¢¬•ÂEñ—„ˆ•å yd„qm‚¢¡…CDUª+ý%„DLË2k Û0Ï…ˆLœû˜ \4 p'C”AYÊþùR!Œ"3ò¹ˆª.Þ"³ŒÂØB Ѩ 2kÁD AÓÂ!¼x¬¸ê+!(Z4Ȭå/„ˆiaaFt³îdè˧ÑÆ½tò0NÒ>Zˆ`™ˆ°¡xdDn!9Uâ©Bf-9C´«€¨šç×áŠYF;ÛˆqѨ] 2k¹‡Ñ&DÕ =$Dˆ$ ª±²(IKé¯÷”‰ž A6±µ¢Q 2kIìõ1- "š5ã¡„ ˆ&øbí«I˹3’‹êPK"ŒÒ-ÞW {¢'äQÜG $EC‹€ðââæk¼®"¦å y!C1Ë(¿ïm‚ ˆ=‘™´”­‚Ø7vÑÐÂ!¢x¬¸ NØJŠ˜"µ„íÛ!¢f,s´„pƒlãŒõ²¨YK‚g‚"¦…AÄÐC­ì.º‘/DÔ…®Af-wJ‰h¨…8A¸b–ÑζP\D È¤åØÆVAˆHK±gD(ÁÝDIBHÄj÷ y7‚+!(Z&È(Þ(.œgÚ%„DLËòxè0^¥ÑÐÂ!¢ÙX3îÃ&DÕ8¹tȤ| YBHDfE¡ ˆP<2‚ì§„ˆ=Ñò(.{9$D´mI÷á"9àð“„ h”EƒÌZðz AÓ ¢ªXÕíbk9DC‹™µ\,PŠ‹ªI$Dˆ$‰·PCÄÊ¢@&-`Ë !ÑÐÂ!¤&NÞEÀÒ}¡ì¸UȤB’7 ©"€à” BñÈ(ÅñZGˆØ=!â^`WJоÐóá"a-D_ÍaªB&-'Þí $"Hž BñÈ(ÝâEÕ±zyBÅ l#ÆEC ‡ˆâ±âÂÁš ‚¢šQÒ!³–|Q‚¢jV\"Œx3 {¢'äQÜclç„hh™ £x¬¸çØþ Ó¢@&-Řå›Â!Z8D ­1Ô6æŒ"$e9Ó ³–²u“XˆÈÄ ?Š{Fpæå”*¢IõäQÜc¯u†ˆºÔyO®xdT¬èû”UãdW!“–~ª, UDS3.塘e”áM¥„ ˆµ´™´ÀÕm„D´|†ÂE ²M¡²hYKñOBÄ´p¯*VuÛèRBÔµ¨YKfÛ.¢â^ûá"‰Q$!(beQ ³–üb‚"¦…ADwÝ{ÏlÛÂE”|õC<IfH\D]ª˜?"³ŒÂx!#Dã‰4Ȭå‚K $EL ‡ðâ±âbJІ 2k¹ÅVaˆr=!—A«]BPÄÊ¢@&-a›B!Z8DLÅcj×0ò…ˆIÎ*dÖ’Û“pÑWs ˆPÌ2Êð¶GBPÄžHLZâ6–,!Z8Do·XÑ—ônUQÝž*dÖך& !m¹÷ "³ŒÛBq{"2iI,Ü_ˆ¾šÛUB¸ˆA6ùŠ©‹FY4Ȭ%ÊWL]Ä´0ˆ¨ªQuŘݲ„ˆiyB ÀÂÞ…ˆ–ò4C¸ˆAì8%E£,dÖ‚·ôHŠ˜–yžðêRÌ×D¤{§ÓU0­ÜxÄë—_Ã0_bQ9N"NKÅi¥† ‚ÞŒüæ &ã<8ú½sC™UŠb ¦ÃÖ(/hDûjª´PºÌRÐa +•Ž{˜©x®q?EåÐ!_=Â!¥Ë|.Œë³9âF‹ÆIp•É‘7{4Î 1¾¹#ø ­Z¥ˆu+u/ÆbTºMOƸnû¹Åõ´ã=×¾ Þw\9|µUCš9Ñef6I\4ÒH˜ë̉"‹m’¸h¤“0ìÖ× žzWZY¿¯¦“0Õ&‰‹{©ŒÿÃ;gìé„·¡¾)²Æ“ªµ÷¼_£“2¼GÓHÊ }ÁØa÷¦‘”":)Á›)¤\•ÑHž RHÚ1øNŠ`È($íÞ†Nº!êÔ™S™J6µÃjW0tÆÂùr‚ ÇÍž–Ž2ïdu5Ó®@èk8|i¥W®ªè$ŒžÓHÊUTæÃ^æjT“™LXv2Æ!™ý^^°ÓI7x·ÍÞ(ï•i$¸Ú°BžwåtÒÞUß°¬ñ)I¹N¥“N0b}òF|ø†e Y1[„"7œ)óCZ´2¼Ý_¬wò–§NŠªµn0x_¾XïôœàÎ`w',3Á±XïäuWÝzÆ×ÖöÂ/î2ë$¼€ÙgÕ—¯¾¥«¾=ö­¬õÕªÏl ~NÁgb„ã†]¾³"è­¢s÷ð–Qgã–&=ÂìFõ垹ݢ÷žæ—·auÒ ;J{䈾‰Þù†|©e7Úþy©Z#Ñ{ß­/’œ-oYV󣸬«‘ʼ£›bÚuSt¦ØÂl©Žtßô ^Yšbâ.±¶÷-óN\¬˜jNÕŸíÜeï<ìÕCìë{poRR:lONJâ9Õ%ë,HÀ÷R¾áVœI¹>­»=Mh$åú´N:ᕯ³ÃϬ܄¯|;˜16×g¶U‡šÝŸÄ½ˆe¾œË)V9†S¬/}â>ÓÆÑ]eúzT9†Mß7Žî@Ó÷®£;Жu`¸ÕZêÊ6ïk+Çp é.ÍÆÑÝjËZ5œmúêÐ8\pZK|rÁ [§qÖ.8ióUÎ'œ–é‚ÓÖ­ÆÑ]púx•c¸àô-pã莹6^ Ç\O6sÊêÕH¶cNÙÇt’é˜S¶nd:æ4GB'YŽ9Í`h$Û1·x&Û1§A¤;æôå©‘ Çœ¾Òt’î˜[7®á˜[ÏpÌ­+ÂpÌõL\ÃÝIºcn9ùZ޹åüj9æô[#޹uñLÇÜb³sëœ Ç\OÖ]pmM6œm=Yw¶u+Àr«-žÒr«­mí¦¿è$ÝÙ¶\,\O6]pö°X¸à›·‘lœb’w’Ç×H¶ ζ.8e_ÚM@Ó§\öÝIº Nß67’í˜[<“á˜[9 w½Ì|tשíd¸ëZòÂ1÷Üv’í˜3[då˜{nü:éƒcN¼òj$Ã1·n–cn¹ Z9æž[ñNZ;æÔAðÉ1§vÍOŽ9uªýä˜S'@Ë1דuܺô¶cNùDB'ÙŽ9;§…cÎÞe޹–¼pÁÙcä“ N œâèm$÷4,Ür¯i¹àÖ9.¸¶O6œm=Yw«µdÃÖ“uWYK6œb=YwŠõdÝýÕ’ G×Òa9º–f­åèúà½Ð]KSÝrt­s2Ü_Kƒoáþ²ç»Oî/¹ªže9…Oèî/}ƒ^9†ûK¿ð¿q,÷—ö ºrl÷—²Án3~LÙì5ŽîþÒ!•cG•)NÍÆÑbú»ûÊ1œbºÓ¥q,§˜æ.¨Û)f×µíSvã•c;ų¾qL§˜bbVŽíS>òÒ8ºSL©³ŠK›’Ê1œbú4Ò8ºS¬bÃ)Ö“=Ñjô!ZMÎA´ŽV“Kx#N±e…XN±–ü!.Mn™;Iwé’N2Ý_Šu×H¶ûKÙt’éþRŒôF²Ý_‹âü!Mš„dF )&a_žÌ4å|'™h‹Gv9º:IwtéfD'y]dF ­–áþZæd9Åz²îÓm´n1讲å4ùÑU¦æd¸Ê–-b¹ÊÖõd¸Êz²î*ëɺS¬%¬;ºZ²áÒêɺóª›jº›ª'ë©u[©u ©u0Rëœ ‡”¾[é¤uü˜ºÄ|rSI'['énªn'¯#ÅÔ™uå2w ‡”½}rHIY#¹Rd;¤9Ù©§¿¬‘l‡”m_®Rvñ\‘b´vS©Ëæ'7•jð}rS©ëÒ'7•ômu’'~¬‘>ÄI‡X'yâÇ:éƒóJ³±íø±U;™ñc«*·ãÇl“m?fWù"~ÌÎi?¶ØOÛñcŠ{¼“Ìø1{j¹Êz²?fìEüØ¢ ŸâÇ´Y{?f‚Eü˜½CYÄÙ–·åV[÷2;ªlñLÜjêÀ¶Üj?õã~Çêã~9œ°Œ°{ŸßT©gÀouªþÍE•Z¦82ß©âãæŽg R9þyÝxÖŽ_åI+ׂ ŸHÍö­˜'¬_Xj=.¨á€U ©Þò–f(Ý©ê‡'ԸÊf¶ûŠ™`Ym÷™pqA¤<½õ _¹<‘zyË 7mHÍÞJʯw,àÝ¡ÕSà 1Àûi⺩ ¢ p(¸›7Ür€\wU•i2Ô)Ö]æxA°v ¿4@$6¯wª‹é„0äºó-Ód¢n•Üu•ñóž8|{™Å%Ž4£b=mŸéV) ØÅO½ÉRŒÐÌG¬1H9—”;á;’ ƒ\ÏzåÀµ¤$ Ÿ¡·%íî€\/Œ‚}›«`eQ0‹B/=)È÷n÷mÔ‚aè±’ FÆbé> fQ3( ‹tbÜq¾/^0Šov̤س(7«Ø ¢))ˆÚW0‹²(˜AÉ;qaØÅ™wQ0ŒÔvõ1‹²*˜•Ë£ó:Û}¹^œ;qWÁ,Ê¢`&c´Ç//¾¶t5¥IYÌ ,æ1 lwåbQ|ád{† rÁPx_.…îÛÔwó\(xÞÕúeQ0‹icëç$Æ Eè»Zߤ, fP­OÇ\¹X”ˆ¹ÐÑ“|ˆQI|¹”+.ŒÉ¸‚¨d:jàj}‹²(˜E‰4 … ¢’é<ÓràŽùÖ fPV3(1c·¤Í,F%šxR(Ì€ÖÊãÜE.%'Z, xç)r¡c®\,ʹQl&æµ ë‚før1(9Üø,ØŸ³´ú耇+““ñêÎ —Ù³]hÖòÁ“"Î| N¤'ÁSÀðl<:\âËÇâ€Y–Ìùb·¶|ð<Š3ƒ³˜ê_>gõ‡&õ çÑëý€Ž¹æv“³,›Á gÛÂB'võÄ‘/‹³°¹ë!%g>gÕwè´“/‹0‡×Âr*òÁRÊÞÛ4 е鵿d Ϥ Í3ʹ—ÎT¹¬B“³*›Å‰8~N¼€0§É»G·œùXÚHÒlzŠ­w=íåËÇâ,¶øõ€˜3ƒ“1úB+ἦ|ðL™3ƒ³°vê14_>çÄz»ÈÙåúC'לùœÅº]»¹ò19 ‹·žšsæcpN ‹¦—?õ /‹³è×õlž3‹ƒ–/¹.Ñêq>ŸWÑâ¬Êfqn\ƒéàïNY6<5èÌÇà,¼qõ ¡/‹³ràÒ‰Eg>'¡Õâ†æ‘}t­§&gác¨g(}Ïcrh=Å£p¶@䃇1]¶˜ÉYÕÅY¬§õ$¨¯LÎbœÒ‘Rg>g5_ÓÙT_>g±ÎÕC®Î| N¢ùzk»až‹õåcqVë¥õõQ‹³,›Á 4Ô#„r-¡»¾|LŽŸ‹fÓtË|¢î@]9‹³š¯é\°3ƒ³šwè(±/‹³šGéô±¯ïXœU›Zœ…ç½}vÕÉY¬Yõ´´3ƒ³Xƒëk—ÖäÄ»Z‡þ:åƒg²]{@“³ª‹³ðmԣ߮þfrVõf惥ÊxYR’c¡ž0wÙ£&gY6‹ƒ3(]EtO}‡²;ó18túôDf–óN=ûîËÇâ,öèõ¸¼3ƒ“C+ä¹Ë|脽/‹³xY廿D“sà=[)Eù’œÎñûò±8 ?R=úïÌÇà¬æ^º-À7XœUÙl®¾ar²®éRßgµÓu ¾uÁâ,ìzÂoîµ8˲œPŸ>ÕÜxÙè"_][œÕX »œùœPïBm6Áíï59‹÷šõ† g>=‰÷ÞF˧^JáÊÇæàóÜ[Ûm‰|ð g>gñž©^}áZ³LÎ"àªÞ–áš{Mβlg1꥾|,ÎÂV®·{8ó18«2ºÄ5¿™œU39‹~M÷ޏÖ9›³¨7‹³jºÞÄY6‹³*›ÁY¬Yõ_ûXœx^u„’å'òÁ‹WœùœE|H½«Å7XœUÙLÎfúwê•0βœeÙ N>Æë–¶½yÆ—ÅY¼“¨—Õ8óQ9?õ.˜PošÑîøCߥ®Ê;æÐ.?ø»k¯Ç­6F€wå¯ó½SŒÊòá§ …£4 ã\·ÆÁKójnÇT6¼·Eá(›sÆ)à'G \gœ2üΕkdîÎÎa…ƒ“ÝIx×…”qÊs*¼D‰jâª/'kí£aŒS 7…£¼XèœÁ1 GY¬'jí£9çTÛGÙ`uN„°g…£8m'¨í£LlŒ“µöÑþŒskcL)ê Wšž'Á(U8'½Á×õ1Ìœ¨µÝ¥Õ^âÜ3çÔÚG{ñÓ9! gê©×qΜ µæ|dœ¬µ¬À8·Ú>ûU[†ú„ààÁ4…£¼”bœ¤µ0È8§Ö>Ú ŒÎ¹ `Pá((Œ´öɵ5)” Μ¬µf€0έµ¶YꜻØGÙ˜2NÒÚGÛ,1Î¥¶bô7NÜ`£ pÇãµ}C”q²Ö>ÚËIƹµöÑœœ³ÃK…£8'ií£½(aœKkÍÑÛ9~Nàɉ©öhàl3'hí£mL'kí£Ô0έ¶ N¬½<­§°QÐÆ}—fm¸=qâ$­}´ ã\ZûÄ{{µ™>OëiÄ{>޲‰aœ µö2‚q²Ö>Z0ãÜZûh“ @Uá(§o'iíC·Ÿô5i=-œKm%˜¾s28ÕŽr6„q¢6Wi°Œ“µöÑ£ŒskíhäÔâiüà•e G :fœ¤µæädœKkŸ@sÚ½yZOãÁç {͉#/ÝyæDm,hAŒsjí£3έ¶=ýMâ©l7Šiœ­Î8˜8ImŸmÜךò=s.­}D“5’¦õ4mxŸâ“ƒo¦•§õ4ÁPÑ8çþjLšÖÓ„/=Žò"¸spï¬p”sŒshísÄPg6XWÂÌIZûhQe,ašÖÓ¹´ö9p!ë*Mëi P…CÎG|ª4­§ ä -²ÈÒ´§-œSkŸçéÚ^ÙGÞ“£ppŦ ¥ÛU¿Œ´öÙi%ENœÖS:`ªphUDk1Nëiá\Zûì´ZÑÞÓz w`ií³Çö…!Z''NÔÆÂN«Ú½í³Œsjí³×ÙzCœÖÓ”À¯qÆeøqZO '¨íCsö 8­§…“´±°omv§õxâ\Zûl7ÍÔxmvœž'C`•¡9W»8­§å¿¨úJYF»7Në)8µöÙh„bïŽÓzšNŒW84Únºa;ÎÕ/¶ÑÈ¡«Ã§=mádm,lØ;ÉšÓzZ8ª_l#G"Ú°q›úè¥ûÅ6ì´ˆÓzZ8ª_L;œÆ8§Ú>Ø23=Ï­ùžûÞôkK¿fΰ}¯3 ÞåñÖ/ÔYóÉûü?ƒ«…‚ŸäXÝîvÝÚßñª½1ªŒ§$j#áÏÏRU+–ƒùw•0­×Ù÷o?c1H+ãïG14ÿ+Æyönñ3ãìW¼üƒ»IÌŒè+ÿÝ/~óÃÿüã/KòëÿúËןÁÿ?üé‡_þþõý¯éÉ4¯~SÇäÿ3>iW–ëÁ­!ô}íÏX Ò*.‰×ßݵbÃü3ƒ´>®ÐïïL¨Uöª¼»æ¶HWéÁ.¨j<À«E…jpùÑ¡N à«·IâëK„·QÙ$ñQ¬NºámRâ__j¤€f¤M_Ðë¤D_)´HâËtÁâù õ¯ÕÈ_%GK©ý7À•n’ä÷V:)Ã~Ç&‰ÏÁt:m’ø¨E#E$ñE©NJà6±IâÃ3tÁ;›$> ÒHy‡Í¢I’Ÿé¤s Mêè¤Ld›$>GÞH§>;içßÎê$}ê_,é$}v’øS'éƒpS?¦ÓH—>;I|Ѫ“ôA¨æ“ìAxtSìˆ2§Û„ÏoØt’9±‘Ëó8d•ßæ T>±ÓIæ $’ø´W%A¬˜1kÿæßÂí$s)ñïu’9‰„vÏ¢ö ôË„Êç•:É„Êww;É„ʇ„ÉX 7õ«ÍdBªÜLïÇ!IÖ Ô¾õÜIÖ Ô>¨ÜHÆJ¸©_¼î$k’¥·%z&Ù¸æJHou6œ#æÚ3WB2ãh›7·“¹’o~Ã`—3l4WBísád Bš[u’¹jØî$kÒ&Ê YƒPû,w#™+!½K2HÖ Ô>ÐÞIú ü›»{¦;§sûˆzÿëšù­«jI?]½©wI‡ÛNW/T^Ó£{¶ù•ž;}çûoˆ•þ° ¯=ˆWûmü±ï[ÖøïÛÿÂPw endstream endobj 189 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 199 0 obj << /Length 2423 /Filter /FlateDecode >> stream xÚÕ]oÛºõÝ¿BÀ*CR$%v+¤[‹ÞaÒäehïƒ"3±}øJr½ì×ï’’eÅÍ’‹¹@b‘LJ‡ç›ô9¢Ám@ƒw êŸ >iÀ‚˜2Â% ”ŽI¬ã ¯¿€õ.°¨ ÐT»Á—ÁþK’øÏ‚Öb 2áÑGà4!”i‘,%"UBU°ˆŽ€K Ö„s*ØqÆ¥BqEʹ>€ ")‹EãòðrßÓ÷Š&›|íùTŠhÊï1Çö:ÆR}(Ey×?TËÅõL؉Êσҵ×à VV ë)ጣ+À:0¢ûŸŽó*˜¹ÉÌ­"p'•Â3¡0 ‰_-ÎÞ&*PD'q\ÝiÀ¹ZŸÂ篖¿^ý˜r‚ ‚3ª€´Å¹Z›e$æMÝ™ºÛvnº)›Þól±°v“¬ì7º^F\‡~õ­© bµKZô²r7Í2¦ðµ|¦L Ô›ë>+j3 µMåF]Qß––z~øû[l·u÷Ò ÏÐn]äëÑγӯýÊ™TUÖ·Å¿Q)ÖPXTKå´ÑÕ¦¼÷{™Õ67~aï…ÎÙ®XZ°ðå~³Úä}ñ¥èQØûéžd%L‚º Oqxf^›EY Ý;Z¸ H³vú™JZc©ˆÐÔ@ÒŒÀ ­Ü º×2õ Ÿ„ è°—ƒŽ²Þ«°(ËÁº;Ķ$ïO°ôkmÔˆÕõzóž6 åMÙl=k“õU¶ñûeõÊ1q=QÎÊÜdÛÒó‘—Æ ã©•°) æwÝ2ÙhörÛõ¦%ÈØ=½h>û@õqíõ"ðu0EŒ†ôMò»C™Ãê‚Û@¤â1áš;ÕÂÀO—á¥÷è8‘.\prh¢W¸šÚ¼§Ú-~Në°C·jp"hxé'(®ãŽ7øøn|²+úbh5Ä ¸¨‚Á„™„M˜a …ÜáSE ÷cIL%ÎnÉÓ0ë£ySm¶½ mØe®éFY{»­L¨G·‘i:¬!è_3zdkÀS`3çÅsn»` ˜›¦uŰ?ô[ˆXËd à™ÇÜi˜ÞÒÐt½›:ÙaƒK¾àFB€;ûôé‰ËØêAV!ã gÙ|—I~©ÏOþ«A{ÓM“qÓl :Ãí¿âgo™žœ±æ„ÃÑÁ¼*’w™iZ¡àTŸ C&Œ¹|æô«á@…kÉ¡~3ðÙ8Žmº ž-(Ž·˜çqèå@ØÍ¶=|îXÑl°ù¨>H3GDq’(1q¤Ž*sí¦ F«Û]ç7oZ7Ùé²ÊîŠÚ³Ýܸg©§©Šÿd¿îäç €ƒƒ%눊°qya6qàó¥C•ÀšWÎ>$³M?ÁÊ`q ZÐÁôÓbÎÏ„¤úÛ˜S¼#±@$p›qÙá‚§àei*ûmk‚›Åų˜yº€ßÓÝÀ¦® ‰_Š„08“7›¬}¶Í¬*bã§Vqs9^Âò§èÙô“8y¸Á¸ßá÷ˆðTLPÞjžO?F>•²<ÃØa΀Ž~×ÉÝ)x}B„ù§z•*üÍ"Ñ!åÄs £ÏNÉüËSrÎO¬v{¾ Öd*<ßN€ÐôI<»ONÎã?,mX·nãpŸÌg9’žŠóãû”η×ï¯øáº€·Ÿï¥{ù]tÿò„yÞª2«ë7MyÒdŸ7_²¶Èúo&MÓv?íéU]ÿ3ßòKóLÃ]øé#l%Øâ‚­0y]n >O}ŽŽ~Šy˜¯Nrev}êrJ«Ã¯Ô V—P”S[ÿ䶨²¢þi-ñÆÕ#)º>».Ê¢¿?­Mè7–n{ýóÚg_ss¾æjnîØõ3[\³7¶ñÌÿ!Sêÿ¿¬2)œ3*ˆ"à’kÛÐ\Á´’c2´_ ë<àì}%ƒ¿4‹‹g€žŠ¹ß0b ÑàŸOjQL’Ÿ±õÔËÖ^ Þ^ÑÄ`GëT<B:u¹âÔx°öƒ¸÷W ÜlÐ\ ®;Ŝ߻²¬ÿµüjV OøôÇ¡Ôû!óŸÏœÑÇjêv4Ô¦]]XIl´ Åhåóò¦ÜVµ‡Úâ³ûE“.N÷ud$Ñz¤î¾ª ¤ºrÛ½'Ô®Lk+ñ@í› ÷n¼.L›µ9BÖ¸àXÏÏ·Ý\ù^&c%†Ž1™0&“1ÕâØVÄ%sÓ®¨Š2mâß{t“uÛÖ“rªÀ…“öKvk°,껥io –ùU¼ÇGf޵,;ld•³ûj0u½j›Û6«Ü¼è\1~Ut›2s¬áÆ«?>æ ‘3-vò4K¯7p‰åÛ8Üd¥é{ß]Û’®›ÌÍã 5^E€Óëð BÙø2À‹«–çÛGZ)Øw¡#ƒ®MÏ÷Ú] yÿn<þ†­Q=m×iÂÒ±›øqÉUhãž·K ’ìLû˜‚”´MW:$-ÛÃlþÄ®WLO›^éc;ÂYÂÓƒ¦æ²fk#´hûõDrÌ7v€Yü¶J“Cã”óyO³âƒÆõþ`ƒ\ÍàL‹¹ÍåŸ~¥Á à¿ØÜŸ;‹Uµm;Р .ሳ9?ÉggŠMİ^•N:~€ƒ¤:ôe} [Üœ¤C|ƒ]vȵ}Å@`GSƒ_ùÜÓa yÀt®Óë`vɶë} dcs~é_Í“—@ÄøÚ‡¿xàù¦ª¤r€‰y‡0™HÀSJ°¢ë›ÇÕÍ)™"bï‰ÝºÙ–+·ÙÚ¾„ñÅ2î ×öcj·3fOã‘mGÛ5?'1„:D¾PC‚ñ]nXÝá¢ê±oNš ÊÓ½~q÷âÃn°cÓ“,#³ð5+i2¾`—¥tºLýϸ-ŽÇÀ#/Å1µâ{OzìÉÿù«zÕ±šñiß0B>Wöõ]Ýõ­Á‹°uV—+ë8à Ÿý°¼ÊÕ©alßLq–r_ ?}Ë5æNýÂK±2Î5ñü"žÙƒ˜p!)¢†w5ÒGRÙÿ“µµs¿é^¡»ŸA~>ËÛ¬&m´Œà4Úà 4R‡ÿ[‘¦½=Ã+ iL`¯?"¯o|› à£ñÁv!æÏùUFcšSÀ&išKtcþ ’ endstream endobj 192 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/consensusmap_res-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 205 0 R /BBox [0 0 1008 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 206 0 R/F3 207 0 R>> /ExtGState << >>/ColorSpace << /sRGB 208 0 R >>>> /Length 11755 /Filter /FlateDecode >> stream xœ­}ÍÒå6’ݾžâ.¥EßárÛ {":ÂŽ·v³¨ÖÔ¸Õ¡’Úª’=~{ÈÄ%<‡þRý-ŠU…“ÄEâ`çÇŸóãoÿõá_ôÏ?}ùÿüÇÇwþ0=§izô×?÷ßsj ÿóá_ÿí1=þýÃüøSþó·s1xü·s8ž1<¶žkz|~ìÛ3¼þûÓãñç&åe°îÏmƒ1‹eÝÊ-ûÃbo$çe½çöÝßÈ&&ýrYæÜk¬¶¸&é4ÉÞ]k"IåGçLÆÄ&u&§PÇ\–ŒåÌÜÈ$&æõ—åì¶G0I§ÉM.Ë”ÊMqMÒibÚK_¼l²¬ÏÕ:À&a“1—òëÁ¤OÂ&¦ e“JÇÜ7)›tšÜårÈÐÐçb’N“Þ&©4ïܶ¢51I§I_–!—uÖAéÌÅ&u&Ë3NƒIM*Å Ï0›tštesY×üë{#“Ô™tMÊdœo”‡•mp£IÂ&C.ë”o´Úâš$lbŠWªîx;:Û¤Óä.—-=£Õ‘M:Mú\LR©ºPs57ꓰɘ‹Î¥z“ôF“ù‡ª3IÄdÈ%æ² Ug’ É¿¼×Ì´þµÄ]îTÿ7ïy]å>}ÂçÇöœö+lÙkØÊO>aM(?ãyƒ÷ùµÜó¬qÚ{XÊèóÜÀ }Yö2ÚŸ°&”ŽñyDƒ› _ùÏñU<“RËŸgzÀ`È!;8XIÉE<Šb{“g»Å±<§¥Ç%!ó—gJWx,á–õdó—”W:ƒ>Ëvƒ4•A±ƒ%!ÃÛs^®°eÏóZþêpMyݾ7èrlùç²Xý[öËðÝÁ’ÐØ=Üe×àmz¹¦O °eg!L&sI °Í¼ ö{K…‡¢ånå0pM ðè”)Ër6’rc0ä°,Ïc1’‚ Œ_âœÂË9&¥µl`0äûÛ)Iieè Lž/ñ”ç¹ÉˆGR^¿âb02߸U”Ii-´70y¾n‘Òsߌ¤Ü 9ùá8I}©^…ÌÓš<ëê $åU“Wƒ!‡ud®)¯:36¼†Š5 «1”v `0äŸ×k )/Qu&Ï×-¦ýõlfR^9\ †r“³õ )¯zƒ>ÏWEåv1šÂ ÆB.Ûs5MNS¸Áx‹´?ƒiršrc`sX§8tšÂ Æ[Äcè5åÆ`È!ËÄvƒšÂ Fgå!ÍŠWSn †â4ô“š‚ ®ó¼¾äiÕœñ<êÍårOð凟?äG¶2[J{΂Üç½øô×Oÿ¡h26І½ÎVšûœ™£ùÉ#÷ Õ¡‚¹'(S¹ <å§Ð2—ùÁ8Ïcs~þÒ9LåI‘–Üdj%Å£¯ž9Á‘–n”Áµ§Ÿå¬ÝâIÇ6gó#Å|Ý·Ô“òí ¤µü¸u/÷ËOû=)NwÎW-P8 7î_ç€ýŸKTËkk\·Ð•¨<Þ4 UÊ3æêhO2óÖÿÊ5Ï÷HcA²Hs±c²”ÉBP& A™,e²”Ê·'%q± ö¤$.^iT, 3±h•3±4PYÄüóò¨¾ß÷þ·ßÈb_¶ÒTryÏ£$& …™,f²øF¨ +‰ÉBa. $5%ùdQ|—¨,e²”ÉBP& A™,uÊBI>Y(É' %1Y(Ìd¡UÎdÑ<â’…’|²P“…ÂL 3Yì”…’˜,öÉBI>YÌÓZV™.fÂP˜)Ca& …™6¾šö4W‡4¨c.íäP4–oŠÕXL g¹w ÓÍËe.á4Wj§Å¤Óp¦†3ñ(~£¤çÆbòiø~Àœ²±œš²L$0ÀT@S L$°W@Êr HYN)‹ Hq§€Ô%T@Íe>)Ë) eQ)N¤8à^)‹ Hq§€”åÐÊÞ * ©€¦˜ H`* ½R–S@Êr HYT@Š;¤.¡j.ó HYN)‹ Hq* Å©€÷ HYT@Š;¤,§€òM–™ H`* ©€¦˜ H`¯€”岜RâN©K¨€šË|R–S@Ê¢Rœ Hq* Á½RâN)‹ ¶˜žËÍN`* ©€¦˜ HàÁæ§,& †s©@)‹JEq.•£–uŸJ®ÛPù<ÒŒžu_.ãBRPÖ€ì”E¤8âT@‚S5œJEñ©€xPc9¥²¯eÀT*3©àh—’¨€¦Ø+ eQ)έ²¨€ç‚=©º„ J¡9’¯Õð_p# ›ÚäRœ Hq* Á¹€§Rœ è¦]RÕ}µ7Ó2©TæR=•¨T¦RØ+eQ©(~#4+‹JEq.ØèÕ%\*P`Í‘\*h\S–S*Ê¢RQœJEq*Á¹T§RQœKŽÊâc XÝ$¨€fRØ' %1)̤°ói§±øÓj(Åe…ÐXLV ¿™Â±6Gù¦p/÷RY¡IhcqYÝÔ1•UÙ¬Îd¥øÍ3ЩØî[c9Å&»-©Ø¦bØ)6!Q± LÅ&°WlÊrŠMYN±)‹ŠMq§ØÔQN±5÷úĦ,§Ø”EŦ8›âTl‚{Ŧ,*6ÅbSzöZ¶T^0£b˜ŠM`.6èJ!Q± LÅ&ðØ`£S”²|;‹ŠMq&¶æ&«—ˈ€~³1{…KEq*Å©T¿ÛÊÆ›'—Šâ¾ç¥Æº‘ êîb.ÄÍ$P`*¹T`³•ŠÀT*ßH6zeÝìéá%u†¼‹JEq_È»9Š ¨9’ HqçX£,* Å©€§üF@°©+‹ Hq. ›¾zz]ÒñÜn&vS |# ¤Y!1‰ÊJ`ï¤,ßJRcÝL÷ÐtVYTVŠÓHåÛrýr/ØAÙ(Ëœh,*6ũاbœŠ­áTVŠ3Y5Ü) òŽñÂ$0ÀN É) !Q 천R–S@Ê¢Rœ HåPs¯O@Êr HYT@ŠS)N$8âT@ŠS)îÐ:ÏåÀ& …™€¾ --(‰ ©NIL@ ;ÔX>5–O@ÅÔp& æ(Ÿ€^îu ¨±|j,& †35œ Hq* †35œ ¨á\@°5/©ð@$0À7á¤Y!1)L¥"ðTþ”å{¯¡±¸T`£U•ŠâT*ê.Øè›#‰Tî…²¨(§¢PœŠBp. Å©(§¢PÜ)Š­V"…ÀT;E!$* ©(öŠBYNQ(Ë) eQQ(NE¡.qŠ¢9’‰Bq§(”EE¡8…âT‚sQ(NE¡8…âNQ”³v"…ÀT;E!$* ©(öŠBYNQ(Ë) eQQ(NE¡.qŠ¢9’‰Bq§(”EE¡8…âT‚sQ(NE¡8…âLåЀ?~ߟ0žUjáŸþk®±Ç÷ÿñ#¡Î‹ü?¤Z¸zÛ÷ŸßÌë·ïÿöá¿|_³¾ç¦UΉyq—·s÷zHRÇÝÞÎsë ¦ÐÁA^ærL[Gžäܙԕ¡F>ܰи_7žäx–—K^]žï4O²Çª”¿ž6x>«”Ç£P²GÎÄ82)(óä¬ã ²é!;®²µƒygªe G¹Û¶ôGÝøÊ¦'¸ÊÖNGñ”MO£p•­6á*Üëˆ Zº*©>Gæ4gñô]~_ñÚ®âé›Ô¾âé›Ò¾âµ×«]ÅÓ÷T}ÅÓ÷P}Åk/¯ºŠ§oÒâ±D¶2Ã;ï¤oùÑâÉL+I "͆D‹—béKöTî··wôÍ+_ñôÍ*_ñÚëX´Ã 5èP‹6CrOßfñ¯½C‹·Õþ8Öv‘‡˜þ]WñÚ»®â½^0`¤u)°4¡=ݾâéîj_ñÚ–lWñt¿*-ÞREXÂP]ñt?*-Þ’ÞcÊýÂjH´xÇVÚÞyí÷úЧ{}Åk=s¶ËW<Ýaå+^Û–Eï$áBx³oÉY<Ý¿â+^Ûôâ*žîp¯ípïµ¥€Þ©öx1ձî¹;‹§k¯¾âµ[Fš—¥ŸEî[4$gñtÌW¼¶tæ*ž®WøŠ§ë¾âµE Wñ4rLŠ÷ÖèÊz÷@³IØzÝóìCžÿòñË_Ú3 ž5R*+Tž|ëEÊõÇï_ g‹s;Êj[mø@­º˜óÎÅ\MÐ7ˆVŒB;Þ½’ë5†ô&¯fù­Œùá—Ÿ¿|úùËogÑÔµsc û»ÿÉuð,š&´bLá¹Ïï^ Éuð,R­£ŒÓöÞÅÐ\Ÿg—´>ƒèõË?ýõ—ß>}ýú©û1`šÒ˜ÛT÷”ßQžA†5K]ƒ\ÓÈ9fÄY‚Z ßpê½G6ÉÝ–0r¶q¦X­z]FNùøÅ…³ÛãUÂy³œ¥œø8{Ô;Î4rÖ qê€|ÔäRÎWÄ©ORû±œùg‡–J~›á¬¥÷œºÜ.µ×6Üuœ ù§<ñN};|_FNBþÙ×Y‰Ô‡álõ¤Ù+gi¿Dž5Ny£ùÊ©+ÃûQ™1œýS$ž-u8päŸt´__8C õl©+gß­5ìa9ù'ÕÀ^çëû¶Žœ„üƒžÎ_œXÖ˜'¬g9+ÒBª½‡´Ô}I#'"ÿ¤ªê½Î ‹Îü“ªB¥uïóÐFSYóœyWÏH›8úGTjLÛÈÙ‘¢´èª¢}~OžŠ!ÿDii5 PÚÑÀY‘dR/ÊKû>r"òOToÖ}û6räŸ(µ\ÕšÒP×G=ò pæG›,¤a`Ìœ€úªX‰ì¼)íuàìÈ?QúÚ+¤hÛh˜ê‘¼WN½Ã^§¨)¤‘³"-ÈVgéIÒvŒœýSOÉØkØ. ãi(“SÀ ÝùiOCý–àH"3¢a<ͤ…P÷ ¥ÇNË1rväŸCDZm4,壥€S'HÒ3ý œi!lA[táL#'"ÿ„:›Þ4 ãiæÈ?a‘û”z‹ÃxÖ²¦85!ÕÚ‹ÃxZ¾ˆ´êè+½v<¦‘³#ÿlµIuÿYÆÓ ŸÆœéÑzú8Œ§¡.HNÚU9Ò7 œˆü³Õ>$UÏÆa<Íœùg«½»Œ(1m4”oÉNíCŠÚJFN@Zؤ­-(ãiæìÈ?›ôlu‡ñ4Äò:ÀYšB¥ß8ôô8u´+;ïNB}Õ&=AÃÆa<ÍœùgU…Ö:X†6šê cWŽ(Gâ Ãxš9iaM±ã,#gGþY¥©ÉqOÃ^O€¾r¤©óÞ8Œ§™³!ÿ¬µÕ¤ª¼pÄ‘“VéCꈆñ4?×OÈ?(òÜqèùõ‡$Ç‘ÖyÒG–€ÎýSKk¯¢m£q*û¯œ¥ZËl$ ãi,òBœ:ãõ†ñ4ÖÅzÀaÉg~NÈ?(NÝqVä´ìÓqòZ‹é8;òŠ¿8ylDþYj"³«0Œ§™³AÿH`­þª0Œ§™“–:‘YžiËGà‘æÚ‡ÈÆë0Œ§™³"ÿÌuÄŽµö´Œœˆü3ËHZ9Ûq)ÛŽú*Ù•-³ÅmOãVÁ¾rd´ª^Ú†ñ4֯ݎŒ ÿÜö†ô­GÝV¶¬{]t‘¬—¾±ƒ×ðꃲB‰A|MCY¥Æ,øÆ¬²R`÷‚oç*k§¿ ¾~"¬²¥™Üë¨n{h¬™þ.tødc-ôwÁw••Åý_ÆQ÷|mHY7þBï7)‹ùëwKe–OŸ­[ÛþéØýÙÈñ$?û ýèèŽM˜J/ß3}ÑÛf=ttÇ~áFß_ô¹ï ¼ëªËpúÿ¹´‘õ±í¡4•rïÚ Üãóǯ¿þøŸã-Ç?ÿÐãcökÙëÛÜZ>jš‡¯áÔÿ×–Ú¤Ó$ iÓ¹¤­LÃM.6©3™_ßÛµçEÙ™ÙÝÈ&&ÒÀ\â<Õ²õÅ5II¶Y“š”otÌeV֛ؤӤ+˘K\Žòldnd’N“þ™Œ‹Öº/Ïüè> ›Œ¹äÞ¦la2&}4±Å+UÊR­ýÑ}6sÙÖòŒeLLÒÛLr&û£m6s ±j¿71Io3ÙRY µ7ꓰɘKÖÕ4TI‚&VZYjSy`0R³I§Ižªm3Ée/S\›‹I:MJTt±7’Œsqwɵ»‘M:Mú_4ä’–7Å5I§Éz”VoL$©üè­ ®ÆÄ$u&§`/¹¬±ÄM.&é41¿¨Ï8ÿè£FMÏ`’N“›\R™.¶¸&é4és1Å+U·—1ؘ$l2æRÖL‡âš$lbšP6)‘¡Ã6)“tšÜårì%Fmr1I§IïF“”MR*+ÆÄ$&}Y†\öò2Ëlr±IÉR"(Ö¤&e“i.«—ÆÄ$&]Y.¹ä;C.&©39›”͸TÝZ"²öG÷IÐdÌeŸŽrGkÒ'aS¼Ru¡¼SiŠk’N“»\ò„qr1I§IŸ‹IÊ&åýõáG›$l2æ"1cb’ÞfR"íCÕ™$l2æRÞ»³ƒ°M‚&ï6Y ¹»›&‰(•¶Ùþ/›%e c’ŠÉ^†Gd2äRÞŠmƒ‰MÊ&e_SLúŒ_7šË;v“1ѤlRê$ “Kq×P¦µÆD’J.©¬#“ñy£­¾khL$I~QneÈdÌe_Ê>c"IÙ$È‘½‰Éø¼ÑZ‚ìÖD’ŠI¬¯œ“1—[¬‰$e1&}Æçæº'ΘHR1©td2æRö©ìÖD’β“>ãóF¹œ“5‘¤3`2æ²ÔuNc"Ig.½‰ÉøerL¯QÀ¤Ü\Ê:×ùµ1‘¤;“á6ùÙ%c )7cASÙvd jÊÁÅweHX­‰$ÝšŒ¹”Î|0‘$lb´}j}NeiȘHÒKÈdÌ¥l¤8¬‰$½ÊbLLÆç¦µl3&’tæLÆ\Öùt¡Izµicb2>«.ψ×ÙÖ®$Ý™\Š;—˜¸5‘$lbŠwwÙº£O:s&—½—Ù¹5©Ig.Ƥ—Îq*w[²&’ôº2sÉRk°&’ô*‹5é3>Qv@Zí/’¤ó]M.Å-ïlM$é,Kob2>o´oOKÒ­ÉËšg¡S4&štgr¹QªÛ€Œ‰$ÝšŒ¹[Ùèd‹[“nMÆ•å¶ÝšHҭɘË>‘$“tgrqã²–¥sc"I·&—ÆÎ8I‚&×*]ö º-$Êd£~x+ÏŸ£Wø(Ïy~ïðy×3¢^Np¹ÃË0oðòÈŒp¼üÔX©|ua¡¥®ÆÚRÏ´,µ;Þnð2t ü¶¬µc]! -_5ÖÊ>|È‹Cj4“ÿ‚"”ùßk âåðŒê4P*°ÐÕXs=̆纖sE‹Sµm%Ö‡XP-I¾PÎÔ"0U‹À\-ŠSµ¤×·Ê±Zgj!-LY\C°…)‹kè¦þ¸†’~ËœiHq¦¡†sµ …åÆâjA‹¢EÕ¢8U‹âT-‚ߨ¶keQµ(ÎÕ5¨,§ZÊÍÆÕ"0U‹À\-ŠSµ(NÕ¢¸S-ÊrªEYNµ(‹ªEp®Å©ZwªEYNµ(‹ªEqªÅ©Z÷ªEYT-Š;Õ¢,ŸZâ”êËRD- 3µ(LÕÒp¦–†3µ4œ«Í™‹«mÙi,ßü¬±˜Z§j¹õ ÕPÃ}j,®!ÔZ‹i¨áLC gRüFCHÙÅ4Ôð ¹hc95TŽàåó3…©†æRœjHqª!ÅR–SCÊrjHYTC‚{5¤,ª!ÅR–SCÊ¢RœjHqª!Á½RÕâN )Ë©¡õ¨/1 L5$0×âTCŠS )îÔ²œR–SCʢܫ!eQ )îÔ²œRÕâTCŠS îÕ²¨†wjHYN •O3×ÀTCs )N5¤8ÕâN )Ë©!e95¤,ª!Á½RÕâN )Ë©!eQ )N5¤8Õà^ )‹jHq§†”Å5Û@ZêË9LCS Ì5¤8ÕâTCŠs Á¨,¦¡†sµ@)‹ªEðµ ×‹Ç«Ñ³ocÝh©AY7BÊSÕâTCŠS N5ÔpªÅoÔbEåTKy¿åfÖ&0U‹ÀT-8ÖXTCŠS )îÔ²¨†ç‚íVYTC‚ßhö§Êâ‚jPÖÍšÿ7º©M®!Å©†§œkHqª!ʆnZ&ÕPÝhÌçg 3µ(|£Ô[5SKÙZîSKc1µ4üF-`Do,¦ÅoÔ‚Ú}cqµ 5ÖZÀèÖX>µ4SKÙZÎÔ¢8UKÙZÎÕ‚ÆŽÆâ#ÒX}q€ÏϦث!eQ )N5¤¸ïɧ±ø“l+ÊâÊ‚PU–àws9¤WeùærÅ•…f£Å•uSÇ\YŠSe)N•%øÍóйÞwêMYN½­õCnToS½ ìÕ›²¨Þ§zSÜ©7e9õ¦,§Þ”Eõ&¸WoÊrêMYN½)Ë©7eQ½)Nõ¦8Õ›à^½)‹êMq§Þ”Åõ†žÃRƒe˜Þ¦zøFoЗʢzSœêMq®7Øî”Åõ•£,ßž†Æ¢zœê­áLY gjøÍîî®Å©Z§jüngo¡\-ŠûžëF-¨Ç‹Ç]´NaªoÔÛ­²¨Z§jQœ«¶{eÝìº)«/ÞXT-‚;ãàE5¤8ÕâÎGYTCŠS )N5$ø†`kWÕâ\C75|£!ø$»×ÏÑP L5$ð†n•Å4D4 ,ª,Åã²|+Lu3ïC3[eQe ÎÇ!Å}»¹‹Ïð r”åŒU(‹êMqª7Å©Þç± Å©²gÊj¸OCõ5l>kS˜iHa§†˧¡Æbj¸OCåÓPcù4ÔXLCŠS 5ܧ¡Æòi¨±|j,¦¡†3 5œiHqª¡†3 5œi¨áN e‡”c“™†¦ø.Ò€Ô ,®!¨eSÐ¥ žøí¨kj_²…íêŽæò¥¨B…ÍúŽCù8¤9¾ý­Ô<®­B…¢¾£–O¹«·Š—ò.¯r½÷]–¹| ¦ra·zÇ]C9¶r½ªŸk” ãåŽ›ç ‡pñÈvÇM©|­pÝ?7i“žëïmkî/gýDµW¶ëR>†%\oc^×­œŸ_¹^Ñ—O„oÒ_œ³»áÈ+ôùt=úçü}~Í7éÑ—¹ib$ôéévÈÐÁHç—§±xù¡é¶xúMýÈ[#%FB_k¤Hª=9 ÆY{J¢µ'Ÿ;”ëÖžä¬=%ùjOI´öÐ7—ÉW{r4ˆ³ö”DkO>Õ$×ÃTã¬=%ùjOI¾ÚS­½¥~ª;/×W¿§Û„}µ§$_í)‰×ø‚z#¹jO·múj¯‘ø˜['TrmcnÛ êª½FrÕ^#¹j¯‘\ýžnØsÖž’ø˜[ &×ÃnmtÖž’|µ§$^{u¦'Ýr°;R}ýžnërÖž’hí…ú”!×#šƒÎÚS’¯ö”Dk}‹¾‘|µ'›œµ§$>æ®å×ȵ´øŽä¬=%ùjOI¾ÚS’¯öd‹ˆ³ö”Äc,5.*×Ãn}rÖž’|µ§$_í)‰Ôž÷KÍçúI·.|„P¶}•oÞ,²Xõ±-¢àQ©¶òãäÃ÷õ"eú½_óÎÏÎe?‘æZ‹ñÓßÿÚuñ­(‹ìÓyç¢H®¥(ùôµ+ j²­$óþÜw/‰äZJò??~þüÑ,½Å¹Ë‘Êì#gð¯ßüó¯ß>²£¿ùå·¿ûoïÿ$¿ )ª‘÷Xv¾óoÒ\Íò5ÿµb”ïÇÏï^ ÉÕl6ÀÏ“­™7mï^ ÉõºûàMÞÝêgó ù‡î7€' F˜‹¦¥ø%0yN£ê>M½^9ÇŒ82˜/ð>sÝÌzå€Gíˆ3•®H¯WNþëÊÙr¹^8KÙw 8{ÝoºÃû,u{Õ•Â÷'®ˆS£JrmÃQÇ9öP†¹^8ké¿ {gCþÙëC®€“öU"´3âlå“}€SG;¹NÙ1uåÔݰrœýÓâí‘§ãÈ?©î½•ë…Êg¹g—… sòOªërœ„üƒá^œX¾« 8 ÔÚqV¤´ßq"òOª½‡\[`¨ãÈ?h âÅIe›àÔ¹N€þ©½‡\gGþ‰G tð>{Ùi8µ÷+à¬H ( Öq"òOÔ§½ª¹8œù'ÖÞC®ÎQ¾‹8õ>Þ稻¯ð°ÒqväŸX{¹Žœe*%àÔ7ä 8+Ò‚¼ç)WÀ‰Ð?`¡§ãÈ?¡ör½pê·§örœ€´ê;rœù'ÔÞC®Îòœ‘‚Ì‹êpV¤…°µ("äD䟰ʊ‹Üç9ò -¼8kù|=àH‚ô!WN@Zs}¸«WÀÙ‘¶Ú{ÈõÂÙÊg?§> ð>[ù¤)àÔÞC®€‘¶Ú{Èõ溙s ÿ ÷'”]€€S{¹N@ZØêú›\gGþAÛx^œü ýS{¹ÎýSå 8 õU›œ=:‘ûÈ?kÝ/%×ò.”áä±ùg­½‡\' -¬µ÷+àìÈ?kí=äzáìeg3àÔÞC®€³!ÿ¬[Eä 8 ia­½‡\/ùØé•SC6rm gþ‹' -¬µ÷+àìÐ?u%P®#§¼k…üƒˆ;Άü³ÔeJ¹NBZ¨³\/œ¹¾qå€@zÇY‘d7ƒ\' ÿ igGþ‘5¹^8KùJ/àÔÞC®€³AÿÔÞC®€“–ºh(× GŽ*¼pæÚ{ÈõÐmKgEþ™÷’ WÀ‰È?sí=ä 8;ê«ô]Ôx ÎV"ž€S{¹Άü3oíWÈIH s}U®N(ß·œÚ{ȵœ8=pVèŸû•+àDèŸÚ{Èpv¤…¹ör½pâ+¤e8SžÈp6䟩örœ„´0ÕÕf¹^8és³œÚ{ȵ-£wœùgª½‡\ÆÅÐÆêŽs -Lµ÷ë…³ã¸ØT£°r›jï!WÀq1´ýàÅÉc#ôÏ+¬ygˆ‹ý£1Qék„8»½rÏ—ècáÿ¡Œ î¸jy]<Ê+aùøåÇ/glím¤´¿ú¹÷‹k®C´mFjňûëî‹!¹Ñr´FÖŠÒ«e¼c1$×ß-ŸKç¨Ñò_~þòéç/¿}¹þ–~ƒo#.gÿŽ¿Er5žÅ;ÆZ1æíõ0ûŽÅ\gñBf+ÆtÆŽß±’ëïóì>·78¿üøÓ_ùíÓׯŸÞ´²8<ÝBêð¿¦#¦º"Oë:P`pZ—Aä^ËX0›ÖU™c,¦y„2¥K!Z¼y(0Zªk 2+™§Óº"C“XÂŒãÒº2ËJÍ>P`¨T@êÔg?¶£Òºþ1µµKAi]þ¨“¥ÝvkaÁ1i]©qžR–äº" UvÅ3S`DZW@êS]©½ž²â€ôy؜Ԟ¥À©¬|ìµ ÚC(0- ºæ£Ñ²î±×Yß¾½„ £Ñ 'ÆGeˆl”y ÀP´,zè"Ýb+9àH´¬yìu6ZÜj)08*Kº¬7Çc£²â±×ùën‡†|…ahYðØkè­ m=%â(´¬wèÚ¡Zd ŒÊrÇ^´“Àg ŒAË J„6Œ¶yˆ‡!è¨N¬ Föñ7S6¸B Õ+“% Ee©C6E$¨Ë–•9_)Ù8wØqøY:¤Hv"S`DTÖ9ö:ÛOv•(S`ð9v ¦É.˜†Çže•c¯ÏÉŽ•™CÏ¡û¸R²ce9©ùEÖ8¤kJv¬Ìx–%ŽTi1¿%N8î,+²  •]ž÷£Î²¾‘j´$Ù±2Î8è,˺dlÇÊL1gYÝí1ÑŽ•™ಸ‘j½E;Vf Œ8ËÚ†ôÌñ°¿eÁgYÚH5ˆíX™)0*+ç“”¥À¨,l¤Ø={ÊŠ£Í²®‘ªC£+Ë Qp1 ž å1®Æ?eU#m²²jô7j–E e¢+ã†#Íú¸W§£ÑŽ•™ _–¦Gé ,Æ>eECƲrŠZO 8Ì, ©NG£+3F™WÕcýùË6P`àS–3’l“´ceŒ8Æ,«² b–Å d£+3F˜e-#Ͳ>< ô”¥Œ$K‰6Ž/ËJ† åÁŽ•™ÃË袓#ž²Ž!£°ce~ö‡ÁeYƈuìX™)0¶,«±öÁ®Sf -Ë"†Ì1‚+㎣²†ë5ر²¼Ëÿ`ûüIqeô®ÌI¡NôR¦RÒ„#èMÄ“ƒÊèEŠ“cʲz!ó¥`ÇÊ4á0§,^Äú‹‚+ÓŒ#ʲv!S¬`EËÁT0à_» 903ر2SŒ÷×±8Öz “ý- qÊÂ…P6;Vf Œ&˺…Ìý6;Vf &˲…P9„Ë2î±”U ™.nv¬L+%Ë¢E¬3Ø-…#ɳvàuÚŽ•™ÉhÓz£lx¥¬XÈÆòÍŽ•™·WÊ‚…Ìc7;Vf Ü])ërÒú¶¥7WÊr…L}7;V¦€÷VÊjE”`+3n­D‡ œ¸³RÖ*d‚½Ù±2E¹’¥ŠP%°ÙGÑLû*e¥Bæä›+ËI‹pùE6×éè6íF®dB¦ñ›+S‘+t|ÂI{*5n©”e €ÈÕ?¶”ž®DK ϽR!‘A¡ŸGg GX¡³`i-ÁãÜ¡Ö÷C$ç¥Ô‰ì¹´µ”ðd¡3tk]Ù½Ðw k ì^è èïBg7V¢¿ëpé[w¥¬þ.ôÝàÆ:èïB_”PÖÊý…NJn,î/tªscÝø œ?ÝXÌ_¿[(s–ºùզדüô¬*=vtx@Ý=ýèèðÁ[úºttxrâ==¼èsßAx_[†{ÔÿçÉk=Ü©¼£,ÝØw?ýöåë§__¾~üË?ýøõÿ¾ãù åè›<ÿåßõ¤ïÚ2Üãóǯ¿~ûøC~ÈüæÇÿ||üùßúéñÃ/ß>JÒÿþ6÷o>¾L>~ýôåõS«úçÃÿDPz endstream endobj 210 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 215 0 obj << /Length 2013 /Filter /FlateDecode >> stream xÚåZmÛ6þ¾¿BÈ}ˆŒÆ\¾“Ê]p@zÙ¢-®E7{@‹$8hmúåbK[Iö¦èŸ¿’ÒZ^·µ·QnƒÃ9|‡3ó —&ó„&_Ñø}yuv~Ái’‘Ls\ÍF%ɤL „j•\M“7é×Åh,KW­C©œá—¦y5߬]1â&mê@ºÉëÚMã€2~..oÖùM¨¸b¾,Fð½»úæü°>87°¾.=y;Ð÷ìq,±R´ŸáÔ ¬ã’S7Ë7«&Tj×4Ëb^G¶ª¼¨WyãHÆÜ bKÆŒ‘LŽçõsl=£DH•ìþVóä>ñ„ ¬eÉî¯ï¹O<©ç««³ŸÏl’&,± Æ-,áF&“õÒ%·$36Ñ”f’Ê%³³Nbæø þ/{zíéJFm3B­ G6]ÖÍlSœ|l^B üÍtè¸Gƒ~É›±â*}qòôL3¬œKÙÐqv7=ð?i–åé›8¶'Èé-UôôùòªµIB9ôÜ#†ù? Ì<;y~#Ìý#Þ'ÞB^Ô¥GwÚj¨R…º©Ú+½O óŸ,#oc°Õÿ…IÆCJàÃNRƒ¥Ã+#ã΃öˆÐL…ØuoÝo½Å_Fþœ?„ϵ׊ÞaaaRµ+êMªë¼©–Ãéõža·ìö<Òb²ÚÏêÝ<º`¢œN¶‡Þe ëÎc»èµg¶Ë"üõàTÛæ½n%k Qw=À¢ZËãÝ€½ÅôˆgÚÉã¾êŒ…ÄXÕw.ݳÀá7i­½¶Ç…§˜ã–þp¦Š|bC³ßÔV ЇéªÐ&½],ÛCÇUnV¥š‡•óÕ*К…v\ܽp`ÿÂ16–FJY„oH±Àˆ:_Çsˆ‰°{ >ÖLˆ ìž¹— Q?»<ȱþû`DHM2qX©_ÿøç:Òy»øŸ/ ÿótTäç3"Y¦•ï±SôMí¸H8ÿz­“” ??tžú®Ó¸õÒŠp°a¿ãI™Î‚™Î—ÞÍùï0èVÈD›èé¡€àÜHfÅN:Še­y†Y9±,özéÀ2á—è)M]U/ýå€Z4/ ͺe¤Í\ÞlÚ·8"-7U‰ÕírêP®G ¢&Ý€_à 1úE+·ŽÝüG.pUã"Ï󓼈AO!Ć^dÑCÞ)‰Q žH¨àî¼Â@yº¬ ¼ƒ}Ãñù£äékûMK?jâß2 Ð俱¦,ºsÄ?J†Õ=×g k®ÃÝÀÕ„Zx Xñz¤â? ¡rp'Švqe>â"'§6ûàqIE+±Öô^)N1zÿy|Ôj endstream endobj 212 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/consensusmap_estimate-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 218 0 R /BBox [0 0 1008 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 219 0 R/F3 220 0 R>> /ExtGState << >>/ColorSpace << /sRGB 221 0 R >>>> /Length 20047 /Filter /FlateDecode >> stream xœµMÄXv\÷ý+ji/Tâ÷Ç›lÞÉÀkYÁ’í¬–þ¿IÞ¸/YlFvöBmOGŸªWÉI&“äi¿þÛWûõÏ_ÿï—¿Ãÿýí¯ÿý¿þéë~ý¥ùn×î«ùîÚýŸã2|ýúýeünš¯n¾»þ«m¾‡ùkÙþ‹¯ýË/_ÿˆp龇A…kó=2\¾öÍüÝL?ÃmS¿-pèÇíŸÓZ-³oÇïnfÈÐ5û| ó:UH× C–fGÖvØÿ9¬Ò·Û¯U«î×ïE†ÃòÝ6ì—MÍò•¿rYêõÓwß2dí÷W¡_v¤ëëõMÃ÷Ø©%ÌÝ÷,Ãeÿ±2\¿[µ™ûuþîÉ–Ü~Þ1SK³¿ŒC½±†fü)2mÿ¢Ùþ“ý/këW~hûD„]û½’a¿ý(º™ÙÌoc´ýgj葊©G*Æ>S>÷‘zƒÆš|0Ö胳Ÿ)~¤Öôƒ±ÆŒ˜¤¢HE2å@ju ¯`D Š µzÐÛæ—=@*z€Tô SÞƒH½€±zÆêуLyZ=cõŒèRѤ¢™ò µzŒ×0¢HEʰmÞO߃>B*z€Tô SÞƒHuؼ€±zFö€½7€=È”÷©ìë7«`DŠ =È”÷©ì›é`tXwÀˆ =@*{Àæd˜¾}\„Tô©èA¦¼‘zû0²l¦ÁÈè×Dõ SÞ¤ÖþŒì›-0¢HEŠdÊ{€TïHgƒQ=@*&©˜x¤ÖÄÛÒõRõù7Rõ©ø|¤æGà`¬‰cM<õ)©ø©÷98kâÁ¨O‘ªÂ‘ªÏÂHŇáH­‰FMS>ñH­‰cM<1ñHÅÄ#Ÿ)Ÿx¤ÖÄ£&©˜x¤bâ‘Z?oÿÅ"'©˜x¤bâ3å©7ñ`¬‰cM<1ñ™ò‰GjM<kâÁˆ‰G*&©˜øLùÄ#µ&>5ñHÅÄ#ÔšøeùžG9ñHÅÄ#Ÿ)ŸøH½‰cM<kâÁˆ‰Ï”OY/ìô˜í»ý-¤fE; û> boÛv¿Û—_û|ÅÓö²ÖèójžöÝN…>žãv™.¯Óãal×íâeÁ‡±Ûö“ÃË‚Ë0šï_ãëO,loCýþrûӆן^/ì]†ýj;ù7Ý¡ëqX/_É´ß{6éíw‹nÿÏÍÔÜ¡í¼7TÎêÚÛ®[7äíû}xt1ïØ¡ûÞôÂ;n;Ìöæè–]öïIõà;MÛ1àÍï;ûnU¿ßß±K¿ï¨ônæŽ]Ûïa¼Ù»Ý²ëþªwª7ì°½;,“Þ•ß¡íöþrwqÇvÃ~Q¹–·ÿÖò–‡ =¼å’ËëÖãTßñŽSûyËÃwíÞòéWo:ÎA¶{q§æõšoyøºÓ[ oy€¼åá'oy€¼åò–‡“þÞòyËd-/Ï»ZËKÈZ^BbyOÏôñ±¥=?²ÿˆÿÝmŸ çý¹ m~”þŸÿë?ýšŸ]ÄKh{_Þ^¾y?yü#Öõ§?ÿÖɱ”mk´MþÔ—s.▱ヲ/#~êϳFO^Î~;iãSþ?üË_ýË_ý÷ê%¥LÎÇ·þ[ðS//)S,cšösAŸ^FüÔ7_Òaûø'0~ý§ÿó¿þåßÿòoÿö—j>ȇ£$Ûn?vüû1ãåkµuØ'kíç+3ŒŒéFü×Á_˜¹gL|U¿­»¬­ßw/„iâ@cÅáÆ…é[Â,ëðUVØWfjCh*fYsڮǿÞ×ù ßí̘iþÊWbY—+3°í³Œ+VÛ…™Æ_Ç«W"˜ÌqúŒ0ýñ{šãûÒ¥»2=Û>Kßâ/‰×ãÂLtûtù—ìL{e¶·zÂß.ÇÓþ¾0Séç+s(¶ìþ^˜mŸyÍ¿~gÆ+3³.°:…™÷¶æøÈ¶ÌûŒ.Cez¶}æc߸¿b±­.ÌĶÏ<öócm+ëÂ|¼{ĤîoŽ/Ìö†Î¶Ï|´z9®´Þ·ï…Øö™†Æt/ítefº}Ú[&fâ…Y÷¯Ç-× ®L϶Ï}´h¹ì6fbÛ'è÷­staVÖ…)¦æhÞ¼¼ög;èØö™°5#¥e¸2Û>S¼ÊG[çyº23Û>S¼bÇîqŸ×¦Ý¿a#Ìñ—ÄÕû¼^˜žmŸ)ÞCŽw…yj¯ÌD·Ïñ–ã lç+³².ÄñN2¯ýéºýÄaŽëF–ã4Ë|ÙŸnÌȶÏX]q2_ö§3³í3Æ{ÈñŽ5_ö§]¿ŸÃ'Ì|üõëñÏn½2=Û>ã4VLwe&¶}ÆqþÊwƽfe]‡§‘_˜a;ôcÌq4ï¦óeº1#Û>c¿çø@}ÙŸnÌB·Ïñ/æãÕ›.ûÓnÛ7².ŒÇÞ7Þµ§µ¹2=Û>Ãñ2×8M—ýéÆLlû kó•ïôÓeºŸ€gÛg˜4'Þ^˜i¿ø‹1-š³1—ýiw|N˜ãÝ=ö(ÓÔ_™…mŸáx™¯¦Ëþ´›÷2„‰wÐc‚¦Ëþtcz¶}†xg;Ža§Ëþtc&º}ºlh¼o]˜•nŸxÇ9övûµZ/̲µH˜x'8Ža§ËþtcF¶}z4ôx ºáÊ,lû°³^…Y÷O„™§Šé®L϶ýŒ~2Û>}¼‡ǽÓeÚ,†} ¦ßö¬ }¼‡{üñ²?í÷·%Æ[fn^®I;™…nŸøë×ø×—µ—1¦Á;Nœ²¿0Ý>Ǫ¦ã]aœÖ+3±íÃN/VÌʶOwñNÇ?ÇËþ´ßö¬ ÝÜ~åÌxÙŸî—±í÷âMÇqïxÙŸn̶O7Ž_yÔ3—¿gûDͶO7ôxgÛ÷+ý•ØöéâÁc…ãeº13Û>ÝñGWãe—t&N%ÕxÙŸöÃ~í+aŽ#8"/Ÿi7fdÛ§=ÞCâÒàñ²?ݘ…mŸöØcOÇ«76—¿gÜ/%LìIf¸ìO7f`ïUqåo-—ýéÆÌlû´±·:¶ÒpÙŸöÇuT„‰=ϱw.ûÓéXÚØ‹ǽÃ<^™‘mŸïîÇUÆ—ýéÆ,tûÄ»îqÜ;\ö§ý¼ÕC˜x9&h¸ìO7f`]h›|wýñ…™ÙöiÖx§Þÿõ0\þžå»aÛ§‰÷¸Òú²?ݘŽu¡9Þ ¦ã¸w¸ìO7fdÛ§‰†Ó=t?Ö¶°íÓDÛŽcØá²?íW~^¬‰æ.Ÿi7f`]hŽéŒ£ùá²?Ýz^¬‰Ç1ìмÎèÐðóbÍ1ñ `¸ìO÷óätû/‹+f¤ÛçØ2ÉtW†œû½'Gãp?¿¹ÿxváÑ=gƒŸqñ½ }Û7îWk/ ¾fØôñïuçu1ŽÕ7Ç‹Á(za?¨ý&§¨ÔöA@ü.zM>¨^þ]8õ;Çé‹ù…åßµ ¶|5É¿‹ÞŽj–½£”Þ^ô~‘ ½½è­) n¶»”Ú^oWeècR‡¼Ü”^Ûw gŽÓ+0ïñ¡ÂéÅ÷ø\áôšÕ[|ûDuâÎ{ð¾àmýá~“Ø]~Çñ¿—q?ó?lÿOßñüëßÿõý§¯¯îú«®ÿWý^ê>Ù/`¸Ð VÄJA“±pÐD¬îçÊXܹ•±§–¤Ü2ó{´n_B}çõⲞ%”¸s‹¿Ë$¤d4ˆ•&c¡£A,îçB¬îÜÊXÜ£ÅßÿRòÄò®Fº Çvÿïd « V-ÈX´ bÙĪˆ½R-ÈØj ¯€¼òZHµ±jAÆ¢ˆU "–-@ìµjbËÉ×Oí”/ci#kï´|%V>²öNÌ—±jbÑ‚Œ¥Q¬½Së)iX{oÜã6´ö^¹w³Yô¼sçW{§âËX:ÈÚ;_ÆjÞ#–óŽXÎ;í/ ©kïÝ{ô…ݯï»9öA¬æ±š÷ŒÅ¼G,籚wÄjÞ«yÏØšw@Þ¼òæ7ï€Ô¼#V󞱘wÄjÞ#–óŽØ›w@jÞ{ó¾Mòd/c5ïˆÕ¼g,æ=b9ïˆÕ¼#VóŽXÍ{ÆÖ¼òæ7y¤æ±š÷ŒÅ¼#Vó±œwÄÞ¼RóŽØ›÷µ¿Sìe¬æ±š÷ŒÅ¼G,籚wÄjÞ«yÏØšw@Þ¼òæ7ï€Ô¼#V󞱘wÄjÞ#–óŽØ›w@jÞ[ó>ì—´kMÆÊ¢ŠXiT3ÕˆÕ¼g,æ=c1ï+jÆÎ¼'dÍ{BÖ¼'dÍ{BJŠX¹S3òTÄbÞKQ*bkÞRUÄÞ¼·Ã^/c5ïˆÕ¼g,æ=b9ïˆÕ¼#VóŽXÍ{ÆÖ¼òæ7y¤æ±š÷ŒÅ¼#Vó±œwÄÞ¼RóŽØsdwÃ\/c5ïˆÕ¼gÌçwH¶±jbë¹ÿ ©nd¬ºÁ¾ôKHt#cOŒ H¶€VjbÕ‚ŒE «D,[€Xù±«yG,æ}{«Úÿ‡œlÄj²«ÉÎX¼“G,g±šaÄÞ R3œ±šaú†Èòæ%$'›¶œlúÞHM6b5Ù‹ÉF¬&;b9ÙˆÕd#V“Ø;rÆ;W^ÆjÞ«yÏXÌ{ÄrÞ«yGlé R󞱚w:º€,»QBÞ¼’óN·©yG¬æ=c1ïˆÕ¼G,籚wÄjÞ{ó¾½à7þ»ŒÕ¼#Vóž±:r¡Û' ÙĪˆ-›WBª[ïú€,ƒKB¢{G.€Ô¼#V󞱘wÄjÞ#–óŽXÍ;b5ïˆÕ‘Ë4ÝÙë2V“XMvÆÖd$'±šlÄÞdR“±5Ù€¼É¤&±7Ù€Ôd#V“±˜lÄj²#–“XM6b5Ùˆ-×0ÏwFºŒÕ¼#Vóž±ü ʆ/ 9ïˆÕ¼#–óN+HÍ{ÆjÞé˜RŸA[Šë„¼y¤æ±š÷ŒÅ¼#Vó±œwÄòLÌÍÆ’-@ìµ`™ïŒt« V-ÈØjA@²ˆU {-¤Z±Õ@ªˆ½òZHµ±jAÆ¢ˆU "–-@ìµjb¯Û„Þ¸ç2V-@¬Z±Õ‚€d « öZHµ c«€T {-äµjbÕ‚ŒE «D,[€Øk ÕÄ–el–;Ë\Æ¢‹”Xµ€õjAÆ¢[W'$ZPbÞ‚ŒÅ¼glYN²æ=!1ï‹y/1Ÿ÷ŒÅ¼#Vóž±5ï ‰yÏØ›÷v¹3Çe¬æ±š÷Œ­yHÎ;b5y¤æ=c1ïˆÕ¼#öæ7ï€Ô¼#V󞱘wÄjÞ#–óŽØ›w@jÞ{óÞ­w6¸ŒÕ¼#Vóž±5ïÉyG¬æ±7ï€Ô¼g,汚wÄÞ¼òæšwÄjÞ3óŽXÍ{ÄrÞ{óHÍ;boÞc#ÊyG¬æ±š÷Œ­yHÎ;b5y¤æ=c1ïˆÕ¼#öæ7ï€Ô¼#V󞱘wÄjÞ#–óŽØ›w@jÞÿqÖ¶ýåq~KÇÔãÅÛöØ•ÕïÖªæ-kÕ~ûû«¸í±+«_¦½âï¯úÝZÕ¾%÷Ú½4ýL­U¿‰¶óþ¬Ÿw4[C7]ÌmÏ}|ÃþX•7ÍmÃ0_Ím·Ï0.WsÛs)ß´\ÍmGj˜—ýqOoY½¨Ûž¿Tëº?ñ-{áØîySBØí }ÏB8nû¾{Ï%8íþ<ª0ü€¿mÜÞŽ^ýmÏÕUÉV·ÇʬdOƒÛsíØJáö\{UØâp{î®Jö”¸=vW%zJÜž›É’­,nmjÉV·Çš¯d+‹Ûc\aß°¸%{ZÜø›ð{ZÜÜi®$nö:nö,Ÿ 7w”+ƒ›»y*ƒ›;Q•ÀͨJàöò„”êmŒ ò‰–"!­K!ϾKÈRVä­öÞòyËä-wF{Ëd)¢ò–‡Y½åò–È[î;ô–È[ oy¸MÌ[ oy€¬åå]=Öòòtx€¼åá& oy€¼åòT‚¸f^./Žöâ1ÕÑœ%:LÈ[.|ö–H.="?!oy¸NÕ[ ¹<öD脼åá²Boy€´èˆ<@8!Sc9Ý ÞèòyË$—G™¸hG.oãé—ÇÉD<9!¹<öˆÖ„¼åáj oy€¼åò–‡¯¹½åò–ÈZ^~+i-/!ý¶Lž ›·<|‰ä-·<@ÞòpÎß[ oy€¼åá­·<@Þòý‘‚·©]÷“3žà-¡Ï Þ¦xÿsÁ[.㳂·\¼ ‰o,£ß¿Z?½ üÔŸ§žlÕJìFÜw×_×AMûõÚù’±¸»-cqw[‰ùÝmˆÕ}lü].!qwÛí_©îyËXÜÝVbçùÒ ‰{Þ2÷¼e,înËXÜÇÆß}w·•˜ßÝ–±¸»¿ R÷¼ñ÷Å„äpì-8!q'/MÈzvã´Ìû'ƒX5±jLÆ¢1ëÆÐI$“±¼”¶hÌí+göêbë‰ì é'²“¥„Dç2VíÊX´ ±l;d¶ e×KH¶‹V×®í¸qîe¬Ú…Xµ+cÑ®ˆÍý ¹?¢C Hí{íJÈj Õ.Ä^»YÏÃNHîÑh©Îe,:‡XïÑØN4 Ý9Z@–1!!ѹŒ­vÍûiq}´—±hWÆ¢]%æíBìí»²ŽöíÊX¶‹Ígx»2–Og½ûãd»ØÌ'd=÷ !}¼HÞí*1o¯OB²s¬>€tçn~ÓMçô‹{³ŸÓ¯“ÙÄv¹sf¬šˆX4QŒ[BêY#7ëÔ­e‡J y­d‡&dí) $ºŒXt9cÙÚ›×^µ6c½÷#;ˆ„T?3Vý¤Udí݇²ªÒÇ¡z°núy³<¯ŸÝzçJÌXõ±×Ï„¬~dö×O@ÖÓ@òú™è'bÕOÄÖÓ„òöª€dkiéÖf¬ZKß Yçf™­äµ×Z@^kûõÎø˜±j-b¯µ Y­ Èl- ¯µ€¼ÖòZ›h-bÕZÄ^ky­äµjmÆVky­ Èl- ¯µ€¼Ö’­¥ã66wÞÊŒEkÅV¤>«fì˜DéÖÞ,D·–¾ö€Ô'XÄ¢Ÿ%MD¬M"lÃò>«²Ì— É~޽ʪŸ«~ÞmnÙÏ›…è~Ò÷1@^?É~ÞüMªŸóÔÜ53öšH51cÕDú‚d6×D@ÖÓ2’ûOÚ°„Dk«ý'bËÉ™ì'-5 ÙÏ» ¦ú™±ÕO@Öw&€t?o¶§êgÆ^©&Îíþ?d{M¤š˜±µO Èl" ÙD:B€¼&ÒM$H:sÉ·] Y¾Ñ„´‘½QRç’{ûO@ªŸó~f,›x39ª‰«Î!ËØûô¸´wÒŒeçè_ H~¦¼[ˆú&%bÕ¹Œ­o$òÚH¶‹~ìIȱ›&dÙïòÚȺ6 !¯s€Tç2C,;GßCÒ{¿›ÑMD¬šˆXíçÖî΄š±ìý+yçq‹Xv±·Gäuì­OBŽq2!Ý9¶ïäu×9@^ç©Îe,:‡Øë\@æ' Õ9ĪsˆåÞYZö[hµ½,cÑÄŒeçØ°Hq²a¤8oþ8ÝÏ»ßd¹_²Îˆ÷3cÑÄŒEç2¶Ú•l{MH´«ÄêS«OBÖY@Þ~.!yæfyú³ßÝòt?YYö[ò´‡$c¹§¤µ$Z[bÙOrÔH÷“},OHŸ›aU$ûIK Ⱥú§@εu ÉýçÝo²\† ‰†glí)R]Θw9cÑZÄf?‰~fì5×ÄýqYú˜5cµ§D¬÷”¬T É&²vtó-#+ ÙDZ_@º‰7Ë“M¤CãMHí?«ý'bÕ.ÄúûDÖX@ª]‹v!¶Î·ò¾™HȲ%$›x÷›,ãîÒwÆÝŒõ>‘U Ú'fìxx™Ç¬€ô1«^½¹Oä51!«‰€¬ëd²® HHõÞý&oO Hu9cÑeÄjO±jmÆjŸˆX41c¯sÃpç÷ÍXíý˽­OBÖqh@ªsëv±JÒíb‡ €¼v%dµ ÚÏ!Vû9Äj?‡ØûDHu#cÑ ÄÞg¿€dc«Æ VAì5fî Á˽­ Ù£»…x= èfßÅf×.@¢]{ŸÜ²>¹’{):w€T»«v!íÊXõ(cÑ#Äj±l bÕĪ1ˆ-çê2wŽáŒecèðRÇuón 6[H´ cïS oo’µ7ä«R-@¬Z€Ø;þ¤º‘±èbÕˆe7«n VÝ@ìucï|Ä{ݤº‘±èFÄf7©n öºÈëFBV7yݤºXu±× @ª‹n V݈Xv±êbÕ Äœ»xÚ½­Í{ÞÖiY/VÞçòÕyönó–óun÷§7rêo²]s<1ù÷ê¼ =†÷œ¯óîmmßsÍÎc·oý·´¼óÔ]ÆÏUÂóÜ_ÆUÂóÒ_ÆÏÕÉóþxûñ=uòÒL××ê1ÚO`GO½tóE`üø…ZúyÎæ;*îe{ßm^ÄÇb¯¦çÇÓ¸LËþ`ÝwTÜ˼îÏ’d*—µ½¸‹Ë^=ÕÅe¯‰žæâÇÆV •¸ø±vµ Å[üXöšè©-~llMôÔ?Û&ZY‹]´’?–'{J‹ŸËƒ {J‹íWê”?—%'{J‹Ÿ ž“=­ÅÏ]ØÉžÚâçîÂoñs÷7ØJ\üÜ9žìi.vG£2?W'[©‹»ú¬z£v+²È[ íðdŽ@ÞòðÌoy€´…’=®\Ó}åƒ0¬å%¤£Ä*õêås¼åºqx6øMçØò–‡ž½å²ª‘·<ÜÙé-·<@–»8ol³<Š Yrà„¼jàn¹¼ÓÎÑü€äò˜ˆ)!ïÕÃíÞòÉå1_KBÞ«‡kȽåÒ³G™Ÿ·<\në-^1!$d¹‹ójC¹ë.Îe´.#~êÏS@O†«r…2;‚Nð³îâü[Nwq=`äH9—ñYwq.ãtWÆšrÛ®(Íp\FüÔË€±÷°\Fh“?½ŒSÆüÆ€5mžŒ}jrÙM+·½2“sÅP)39W µ½2“sÅPÛ+39'37ÜöÊLÎC ¤Ìä\1ÔöÊLÎ…i¹í•™œ+†H™É¹b¨í•™œ+†Ú^™É¹0·½2“sÅP)39W µ½2“sazn{e&犡Rfr®j{e&犡¶Wfr.ÌÀm¯Ìä\1Ô@ÊN T µ½2“saFn{e&犨͚˜œ+†H™É¹b¨í•™œ 3qÛ+39W 52“sÅPÛ+39fæ¶Wfr®j{e&犡Rfr®j{e&çÂ,ÜöÊLÎC ¤Ìä\1ÔöÊÎÒfå¶Wfr®j{e&犡Rfr®j{e&çd–†Û^™É¹b¨”™œ+†Ú^Ù™Á´ÜöÊLÎCm¯Ìä\1Ô@ÊLÎ…9lLÏLÎCm¯Ìä\1#µ%“sÅP)39¦ç¶WöKÅPÛ+;!X1Ô@ÊLÎ…¸í•™œ+†Ú^™É¹b¨í•™œ+†HÙYÇÂŒÜöÊLÎCm¯Ìä\1Ô@ÊLÎ…™¸í•}5X1ÔöÊLÎCm¯Ìä\1Ô@ÊLÎ…™¹í•™œ+†Ú^™É¹b¨”™œ ³pÛ+û"±b¨í•F®j{e&犡Rfr.ÌÊm¯ìû‹Š¨-™˜œ+f¦¶dbrNfm¸”}íX1ÔöÊLÎCm¯Ìä\1+Ý>äk©Â´ÜöÊLÎCm¯Ìä\1ÔöÊLÎ…éöKòž™œ+†Ø^jr®˜‰Ú’‰É¹bVjK&&çÂôûyàg&犨-™˜œ+f¦Û‡˜œ 3ìý<39WLϺÀLÎ3Q[219WÌJmÉä;¥ÂŒû—ÂÏLÎ3R[219WÌLmÉä›ÂLü¼39WLϺÀLÎCÏ‹1“sÅÐóbÌä\˜™Ÿcß»TÌH·Ï±e^MÎC΋ýΓ£/&æ™^ñvÏOå2½F\¶Æn£X›þ 3(S㜔§qNÊÓ8'åiœ“ò4ÎIyç¤(ò@D"Ôý¡Ð Æ:/ÆêO2Î<0òXïæ÷ˆ®!­B*ú“)o RÑ”uÝÿÿ¢)Ц äM‰Pt"B¹O¡×hˆèD„²ôJ‘@T'è¢÷)d„ˆPw‚^0ŒÞ§°KN‚±:‘ ïR1ýH­} ¹O¹Y£èD¦¼HE'ÚýNjyP†T}§‰T|©©èR«`Ô7˜‘ZÕHÆé«`Ô÷ ‘zõHÈêGBVA Ä’±¨HÆVG²J’hI‰yM2V=éšÃÅ*z©ê Rç@ Œu¤Ft ©jO¤²=ìÈ)ÕÚ„`¬¯À¨öDzÓ½tÝú½> ¯= ©c®›¿Ø;èJH4-cÑ©ŒU{2V§îþ yŽŒnšþ¸sA5-RÕ4¤b©Ú#E*÷Hôý4Õ©He§h?À8Ÿ`ÀX§«Á¨NEêHȺ!!¯S Yäu êbÕ)ĪS[¤;ņãéªS‘ªN!U{/vŽŒÜ{Ñ)F÷µ%Õ¿HuÿX£Á¨þÑ! FöÎ}0ª‘z7$dEHÈë_B∱:"D¬:…Xu ±êTÆâ(±×ž±=L§ê²Ï6”¦âºÏH­öãµ'¯=ÁÈ+BÔk«=Áxí F^WÚÆèXíäµמ„D{«ö VíA¬ÚƒXµ'cÑĺ=ì*Õ©;줢=‘ªö •íam F¶‡6!ÙÚ¸`T{"UT#µzŒºÐ:RÕˆHå¥ÖˆÕµÖˆ½‹­rÎ5'¤f±<—póºy—ñ$$¿Å¹[½õ•iB^§æãY÷ªS‘ªN!U¢ýFï‘XƒÑb{¾`T§"õÎQ€±Îðã}ž Fõ/Róó ïó o”ÕU@Þç)@jï…Xí½«½WÆbï…X6Nþr¨dTÓ"UMC*÷^¬ÙÁ¨s‘êN±£:©×)0ÖÞ+µ÷ŠTµ'R¹÷B¬ö^ˆE#J,ŽÆ«=b5ψÕ<#V󜱘gÄÞ<ïσèåÖ„ËÎTäcÇá¸î®ÈçÚËöõ2œ—ÇÖ>åcƒäþÄ®—Å>ÖV¶»´°­ÑÇËmÛv®ã‰>7ƒ¶Û›n3Ö¿õ±ñ²í‡Ë«ô˜†ãݺ'·ÝÞ•Û®"o˜v÷ç1žäó 3OÇž g¾]¦ãݲÏ_Ûý Lõj·¥kŽç žäX?äw A»v=ÔœCú@«Aö­94ùúÇêÆ$×”>– ‚çt>ÖT‚܇mñ,¢ çÞ6‚\Z[ rmŠÔ}q×Å×€m›©h@;&“m‡¢u·MÛõEên6„Õ–³ k±€Ú/Õ0 ¨[œý-Ó¶€&; i}n=MvxÿbZO“]š¢}y\RõæÅ´9ñ3šEɆˆ$ ³*„=m4E!lax挵2<±C.=üŒµ6<åÃZž‘ ×F F® ˆð\¹6&sÁýçrmìÁÈ`¬µážukm¸ã×70ÖÚp—°µ6Ü )ׯ ÆZֆ{Ònºp¬í塦`äÚ¨t9în“kcÖÜÙ#×FeŸÁȵ1eî²Ö†{)äژЌµ6Ü•a­ ×´ëmÊ Œµ¶¼:ÞZ\^Il­.!käò¢d¹¼ø›â|q^”©7,±h$$—Ǥgy%§·<\ß&—ÇDA yËÃEq¿¹¼ã=fÏ ˆôÆ%ωNÈ[®:ò–‡+4¼åò–‡Ë:¼åáËn½#ONOÈ[¾!÷–‡o­}lBÞòðµ¢·<|á#—Çž—œ·<|Kä-çï½å²–—'ý­ååéXky ‰å}Äòy¨Hög¹¬†å3¡iù¤åsòû~†?~êËg.c;˜û å3—?õå3—1œbŽ.#~êËg.cûHðAËg.#~êËé~Ô’ËèÆòxý.#~êÏ3xf|¯S«d£ôÓb€Ûïþ äJüÐË”³XÄ®Múœâ‹ˆz™qvX‰EÌí'ŸXDüÐË„³£3,bjŠ<és‹ˆJçûòN‹Öb*üÜ"⇾7ÝݲëÕÑ)À¿¸ç‡yNO„ꄘæ4‘ž[‹˜åôD¨‰INO„:˜˜ãôD¨ê‰)Né¸QŠNO„Š«˜àôD¨‹ùMi¹†‹}j9jûbvÓ¡R1&7=ê.cnÓD®HcjÓ¡&6f6=*|cbS W2­i!¨øIM Aµ‡Liš;·ý­€DhZª\ˆæ«¹ˆI AuzLKZ*.dRÒBPm!S’–Gܤnj¤'2PÁ*’žu2i"-W2é‰P‹³‘ž²ïÜN„ú ™‹´|(æ =¦"=j+d&Ò¡²B&"-' ¸«yHO„êó˜†ôD¨©YHO„Š ™„´œ‡Ù¿j!Hüá/Ò¡šB¦ =j)d_6–óT\RȤ'B½yÌ?z"TQÈΟ52ûh9õ÷ÝQÁ'9…~"Ô™ÇÜ£'Bõ„L=ZNdr;!3žHO· žu2ïè‰P5!½âÈÂÍ„ì+¼©Ø“HGO„x ù—5‰¬Çc ~"D9z"=µzãè‰LT J„£'²R§'¹ä$? ìøP7z"#Ý.Ä6z" ~&M¤=NŽý@˜kôDzªó$ªÑ™Øð3Ó艬TæID£‰l;>êò$žÑ©Êsø©=‘… ?³Œ&Òï×.„HFOd Û…8FOd¢Û…}éS•n—c‹¼FÙv|?·Ëï=ã^.àÛËŸëÇi¿À›N\Go éÛ°c:‚Q@ÃâøEM­£4÷Ž]Ð"ÿ&z?M@«ü›˜[Ð~}½áMª“½…”ÞTôV&Pz[1·hR7‹Ý¦Jm­·+2À1û†Zìt²ŽYôZцXô~ Å;bÑÄÇ wÞ€/ÿ¼Xt÷S1]ß_½¢ãõW™^Ñ~8N´*aV¤Ê˜…T(³"µœ?`,‘eØŠÔzìu2¼©¸·©¸·ïö/¸yÈ5B²Œ& ‰»KÌïÌØÒ7&$Ÿ2r3êNÂŒ-/P«iBžƒnl‹ÌE§"UB*:©òÐEªDt‘ŠžˆíŒÔ!=‰ÔzîÙž›5šê:@¢=«žd,z‚X+µXŸYö’„TO[NÓ©žÐr2]íÖ©´5¶7bS¤ÒרÞHL‘Êžp£_{£1½ýë¥ß±½Ñ›"•=¹Y£§ÍJHõ±êIÆÎ“E’í¹[§×@–ü4!m?½ùM¦¾±}ú_?«ç"UB*:©w<Œw<Œì}ó ÆëÑ¿HUÿ"õöSÁ˜û)@ÖS«²ž0W i®Ó¯»÷Ôª„<Ï* ­ôfµ$ºZb«•€¼VnŸ µV©j%RÑÊH½Vãµ2õ)+RKΕŒè_¤ÞÑc0Êp©ê_ƲiÔ2 Híÿ2V¢‡R€,!kBÖ³²„\ yöℬcJ@^ÓÖþFËŠT5 ©hZ¤ê˜2RuL©÷Ù+oŸFt*RµO‹Tµ'RÙĺ=äDkB–`µ@Ža5!ïÌ ½Ÿb“È‚²,wâÊX´gˆ{”è;ReúF*Tß‘Šž =Aª Þ‘*…7RáðŽTI¼#UïH¥Æ±¶Ÿÿ YÊÔ9ÎÔ„´^˜ìز÷€‘íAlÙN’í¡•KH¶‡ì£òÚÈ:çhOÆ^O=A¬zÒ 72T¤ª'HÉ0ËÒÆÒ ƒñ:Œõ=R2¢i‘ÊO8ìŒÚOEêÉR²Î0$d=»@¼‹¦e,:•±·ïäu*!ù=9,LÈú,³-vÿODÿÄŸŒh¥X««ÁÈ®Ò>#»J'>ël ë“S2¢«‘ZV0r_IËŒnðÍKd6×à„Dƒ«#ööŠ€¬ÏS Y¾‰9¾‰„Ôtû[µ©Úƒ"µZŒ· Æ;* ÆÛƒ£Ÿ½LNà&#Z©åŽãÁc¶u}FB¢•%ýC¬ú‡XíA«ãOÄ¢S%vì{ y{ÅqºqÇ"UB*>½Eª>½EªÎ\DªÎ\Dj¹+“³©œ}Ú¦`¬k“Àx®•„¼Ù¤f?c1ûˆ­o²Îš'¤z‚ØÛ÷$dµמiºñÁ"UíA*Ú©jO¤ª=‘ªöD굌hO¤^{‚ñÚŒÙ@^{©öd,ÚƒØk ¯=€T{{íIÈj ÙºSŸçó«8ŒüDvó{,Ç9Ës Fµ2RýÙ‹õ.ï³ÑÕHÕÉHõ§,öù0ïJŒ„D+3VýËØq‚%d]]‘õ­UBÞ§,@^W²>eÒV?ö~½MŒöÌŠ>ã=£ºJûŒ×Õ`,'-Ùà›ßã5Œhp¤ÞÙ“`d¯o^Uso È;{È;{’Ø#VŸÞ«OoˆÕ~±úô–±øž±×¿u¹1ÕŠÙ F"ÇŸ‘Z¦Z0–©Œ:VÔkÑžHÕþ/RëJ`0æþÚÿ!Vû¿ŒÅì#öŽ?©F –û´»¿Rõ$cçŠÁ„,'íØ,7NZþ]%ÑžLS-k?Æ:ËƺæŒÕ´dxÓZû)0¢HUÓ2¶>é%$šVbÞ´ŒEÓ2ÊXt*cÑžóöd¬{Âf¾]nŒ²¢[Áè£<Ö0Ž;Œ×ž`ôQ9#ÛCŒ×0¢=‘Šö µ>§ñöS ‰Ne¬Ú“±hbÕĪ=ˆU{«öd,ÚƒXŸÏ —ÄŒÝzã¯MF¶‡6ŒÕž`¼ö#ÚƒTô©×0¢‘ªFDj}Æl ÕĪ‹F V@¬X5±jDÆ¢ˆ-îØ¯7\Ñ¢`t#Øtƒql¹`t#ȧ00ª‘z{Ž`¼ž€=‰Tõ$Ru„©<ÂB¬f±šýŒÅì#V³XÍ>b5ûˆÕìg,fñgËí‡îâË}lí·?ùU˜û\{»ê«1÷±ë´Ÿ‡‹2÷±ì´_—õãrÑæ>•¦åU û\Ö;,Í«7÷ùz×öÕ›ûxǦ}õæ>îÛ¸?Cæ-oîØu——è1Ùw¯ÞÜLJþÕ›»Ô¸ùÞÜq_½¹5« Ooîc 'ÈÓ›ûXš¤ïÍyzsûUAžÞÜÇÊP§7÷±äéÍ}®°Z‰së`-âÜç[ µ8×E+o®;ƒµ7×}¡Þñæôôæº#\{sÝ!®½¹î0ÖÞ\{UÞ\·ìµ7wªß¿ª7/&èÉÇqyžU<¤È_&dóÉF–Á1Ÿ #—Çž‘ž·<7¡?R¬;µkh±nBŸëNÛְĺ¹ŒÏŠusź¹ŒÏŠusź¹ŒÏŠusź¹ŒÏŠusD¬Ë÷¹Œí°5}u\FüÔŸgàžTí4ê½/;î³f]ü%§Y·êûÀŠE|Ö¬‹EœfÝî:[¯Ÿ\°ˆÏšu±ˆÓ¬Kô¾õ,â³f],â4ë––ñU,bÛA´ˉúÒ1¾SÃ"BéûáEœž`¿aÓîOpÃàþ¦;¾ªøi3aŽáÂŒ\‚Ê$ÃCe Ì2\1-Í0Ípa†ýš‚Ÿ ó WÌH}¾D4\1TÒÊLÃ…é÷¯CTÃ3S¥/q W ÕÚ2ÙpÅPy.³ ¦Û~$e~ê†+f¤Û‡ø†+¦cÆvF®0í÷J·O¼½½‡+†Ê€˜r¸b*&ÒáŠiŸj‡ ³¿¬Œ!g†*†Šš˜z¸bˆªˆË‡“iWnDbúኙ¨ä˜ˆ+†J´˜‚¸b¨FŠIˆ ³p[ÓW 51qÅP÷SfæŠ/&#®jc:⊡V8v>£b¨)‰ 3qý;¥X1T¥Ç´ÄCerLL\˜‘;ëØ)§Š¡j<&'®ª9dz⊡¢?&(.ÌÀ}‚LQ\1Ô É$ÅCíˆLS\˜žK™¨¸b¨ë‘} W1ÔÛÉdÅCÍ•LW\˜Ž 2™°¸bF*&ÊâŠé¸‚xùºJ‹ Ór«(ÓW •—2qqÅP-3W U±2uqan|eî⊡bY&/®* föâdVnÉeöâá.^b/>ªUföâá^ab/Nd9>ÿDÈ9äáŽdò̉PÝ5³'2 ß3±ŸµJ³3º'Bõàìõ‰PC6³'2q7³ŸÈðÔ^|"-uñ’¯à¹¹œÙ‹O„êÑ™½øDú§öâi¨#™|!žÈÀmòÌ^|"TYÏìÅ'Ò>µ'җ󩯱ŸÈD%ÁÄ^|"=UÞ{ñ‰4OíÅå£ÄöÖûÐ^|"•{ñ‰´\Eüó»ò>¾Ÿ,aÈO{ñ‰ŒT«LìÅ'ÒÓíBìÅ'ÒÐíB¾(IäPƒŽÓì‹yÆb@ž±g,ä‹yÆb@¦±8)ÏXœ”g,NÊ3'å‹“ú´±xœ×·Å`ß4ƒ~ÓX ú]cqâo‹ÿ#ÅÃ~º–*‹§ëï2•ÅÓ~™’TÜ!7cfÊo»D*n°D*n¥Dj)~ÀX·R&Ão¥Dª‰KÞHÁXã݈œ¸3cq3f‰G¨%$nÑÌXÜ¢™±õ™„,Ad9qBÖ@§m6©¢CªÚƒT´'RÕžHU{"µÆkÞ1CÁX*:0¢SHU{2V=A¬z’1ïIÆ–œ8!ÕÄ–|!!KN\ ÕZ.@^OÖùFNŒTõ©óèv0Ö£ÛÁ¨NE*:…ÔR6&£ÚCG'¯=Á¨öDꉌRBl=Я@¢iˆ-uPBªiˆ-eqBÖƒ: ä<¨3!Ñ´y¿Y¹!Ê”w ©hRѤ¢'HEO2å@*f©˜r¤jÊ3󜱘çóÉÍØR&$&7c-ð%mHÈ’ÈyH_BÖ>bÞ/yÇRHÕ<#ó©šçHÕa&d鯲À’SVD@^§©N!VB¬:•1ïTÆêsÄØÜ|‘ªž =‰TwEªŽ»"U³©ÚË Ç]‘ªyŽTÍs¤7ò2ò%OB–”7!½`%HHÍ3}gäÍ3 5ψ­sX YщÙG¬f¿ýHj-ªÙG*f?R5û‘Zš@0–&Œ·#Ú©u ŒêT¤žh7!KŸîÛ%ä|S’×)@ªSˆ½Nò:•èbÕ©mÚ:}Ü©êRÑ©Håq}‚ñŽ»‚QûžH-yu2¢S‘Z50–Œ÷=cBê\bu.!cù©…}äµjbu„…XaeìHÑò>µ,íä©jRÑžHÕ)Ru4©jD¤Z)ȶ1õI„]oÆRÔ‚‘=¡Ý Æì ÕĪ'[{@^O©ž V=A¬z’±£sOÈëÉÚ݈k‘ªž u¾Qc}£Fî{è›F0ÞQ^0– :ùí#ëR0²´³ÁX×À1ÏIJô/ ©Vf,΄#ýËX5 ±þö‘uõícœo’­d¿iiº!.ßÚ`,M`2¼ÁHeWÙœ‚±T1`¬óã`,ýn2ª«¬ß`¬k×ÀX]ãu5!«« ÉOow¿I48ckšèuÆÖç´„¬Ïiâ½ÎX+;Ø ì7šÞ(;è #Lÿ`0Ž”ŒõùŒ–²îc©zÁXgZ’qÎÆƒ½F*ŒTu5cÑÊŒEÿJìÁ&äõêbÑ¿ŒeÓn&ÏûÖ*!­`#ß.,]+Ú¥û®`dÿè_FìA#MCjÉsÁhy.ëa0ÖçÊdT§n^ ëœ&Õ´®¿—çÒyäí©Vf,öˆEÿ2VMC¬š†X4­Äbï…ØRÊ/ýp¯ÉeSŒhO¦ŽŒ%Ïc}Vã#;uó÷xû©`Ô~*RKׯ;+“Ú§!–Ç”7/»ìboŸH5 ±jbÕ´ŒEÓ[ªÐelߌ%;LÆí‚ñ>ÿãõ/Ñ?¤ÞÞ ŒsGoïŒÚ{E*«N!V{¤ŒE{«=bÕÄÞg/@Þg¯„D§{‡ý.RK´›Œ#Fc‰Áxí ÆÛ{ãu Œµ÷ Fí½"Uí‰T¶±jbÕžŒE{«ö VíA¬ö2ˆÕ^&cÑÄ–¸}™F[© ƈ&#{ÂöfÁx= ÆÒ¹ƒ±îæ#z’©Õˆ`T#"UˆT6±jbÕˆŒE#«F V@¬X5"cÑÄ–Rw™Ç[¥.mQ0^#Àˆó‘zGXÁè3q¬cÁè3qìý>ïL«Á¨FDª©lbÕĪ‹F V@¬X5±jDÆ¢ˆÿ8Ñî´ýèWÑîc}ç´¬Ñîcgè´®ÑîcÅéÜ6Ñîc%ë¼ÏG½àçJÖ9Ćïè}ç¡Ý‰ôŽ£wÞ†j©ëó?uê.¢ÝçêÜïOç}ÇŸ!K›—YyËÃ%)ry̨·<\Çò›{xXúür ^ñq$ä;ü÷–‡¯D-ÑnBÞ«‡ïQ½åáû)­Š%ÏYOÈ[¾Ôò–‡/ ¼W·<|Ãà-gnõì§IB¤hw32žh7¡ÏŠv×mkX¢Ý\ÆgE»¹ŒÇ¢Ý\ÆgE»¹ŒÇ¢Ý\ÆgE»¹ŒÇ¢Ý\ÆgE»¹ŒÇ¢Ý\ÆgE»¹ "ÚåÇp¹Œ¦/ µ.#~êÏO*v‰ï—}à÷YÕ.þ’SµÛ^§ëõƒ)ñYÕ.qªv‰ï·þø‰E|Vµ‹EœªÝRwþ1 ‹ø¬j‹8U»?|¿¯ÇËXÄgU»XĩڭªÎ;Ë.¬˜æ>X±r‚sú9õ>³hk>8—é öK¾kþ°{*Nr˜¹˜”I‡+†Ê2™t¸0“2épÅP1)“W “2épÅPY&ûˆ_˜‘‹I™t¸b¨˜”I‡+†Ê2™t¸0“2épÅP1)“W “2épÅPY&“¦çbR&®*&eÒኡ²L&.LÇŤL:\1TLʤÃCŤìLEÅPY&“¦åbR&®*&eÒáŠé¨x™H‡ ÓpY&“W “2épÅP1)“W •e2ép2Ûþ—ŠI™t¸b¨˜”I‡+¦£b_".ÌÂm™L:\1TLʤÃCŤL:\1T˜É¤Ã…™¹˜”I‡+†ŠI™t¸b¨˜”I‡ 3qi&“W U“²ï*†ºI™t¸b¨7“I‡ 3r;)“W Õ“2épÅP?);¹\˜»3™t¸b¨¡”I‡+†*J™t¸b*ö%ÒáÂôÜŸÉNrVÌ@žD:\1-ûépa:®ÐdÒኡ¢R&®j*eÒኡªRv‚®0-×h2épÅPY);G^1ÔVÊ´Ã…i¸I“}ÿ]1ÔWÊÄÃC…¥Ì<\1ÔXÊÔÃÉt+·i²Ë *†:K™|¸b¨´”Ù‡ ϳÿÉsÏCµ¥Ì?\1Ô[ʾþ©*.eâÂÌÌ/ÙPqÅPu)sW ue²+\ 3q#'³W õ~2 qÅtT÷K<ÄÓP3fä¦Tf"®j e*âŠi©ò—¸ˆ 3ì÷1†Èˆ+f¤Ò_b#®jre:âÂôûå…„!>⊙©÷—‰+†ºo™‘¸b¨a—}UV˜n¿Æ›1Gç^œÄ3ÒíC¤ÄÓ±.0+qaÚv‰–¸b&¶}ØD3Pk01WLûÔM\˜ýCcˆ¸bèy1æ'®˜ŽÚƒÉ•,åÌÝÊÏ‹1GqÅÐóbÌR\1ô¼»¨bZº}âñ‹©¸0 ;/ö;OÖ²aKVœ|œ}teÅkÓû²b@ž¬'+äÉŠy²b@ž¬)+NÊ“'åÉŠ“òdÅIy²â¤>-+^ÛñmY1Ø7eÅ ß”ƒ~WVœø›²âÄÿHYñö9ZÈŠçëïÂÿ}ëq ß­×ít;*ï÷ïL»mH¾þÇ×_ù»_þ?2b`õ endstream endobj 223 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 227 0 obj << /Length 1919 /Filter /FlateDecode >> stream xÚÕkoÛFò»ÅÂýBÖ†ûà’,ZšâZ´w×»Ô.PÀ  ½²Øð¡”U÷×ßÌ>(’fZ«€z ‹Ëáì¼;› ‘pôÛÞO^íïß^„>xž¼ƒÁoH!£«u³ïÊÇU’Fuy ¾2³AÜš}?‰¦£ >ê¹UAé­ðPdÏ‹žR–¦>.ÊìÙ=QÐÌGO7‰‡ˆ·EîãgµfÁ4†î‹‡cL{ a—ËŠvœZ*hÍÖCgCŒG’Æ2×»'oÊ}UwSÏg zF “AÍjÓ6‡å‰ø æº,Þ­|ÚÆÁ×Î-I\-äÇÔ.Uַů^í¬ŸFÔ¬(`â{çùÀüÑ2Î'A·Ù×y_4õ’3¡Äª˜ÿ±39Ô÷Á.ô®µ^" •Y ú·qª,Ž•É`¿Í8ªÆ¥«-P²b k½ª,þî³¢ìf¨ͪ]©S`èßA©:CgøûÍÐfeZëcr=h}lB¯ˆûW“1âÚ]Ö£³‹é1Ðm$rÓdBˆ, ú§VI„?ãQp R‹8‚úZ¿³+° ð£!™GY± ¾7l* ´Òý4ô»Îš›‡н‚vܱä$T$Žùw¸‹³ ©‘ çAÑY$‡õ«ë1ÆÌàäMµËZxcÁ½…8¦<¦W’àÉÖîÊì)êÚ¾n 4mñ[fâÒihíöCÒ;x㶘Z†,Z½#î¾ýð¯o–*jå„Ò>B', Ò£4[û6ß ½&Ø^…ÁŠ ¼=w¦ ágS ½ib±‘¡9ô¹c\×ÕfÁpŠÙ{‡¢wòd ôऔ¦=ßOg¹¤\¿œ­å¨E¿@9R”‡ÃYÆØân¶`6íÏm2=ÿœt |Œ~ æx&¤ðû!ý>.> stream xÚÕW[oÛ6~ϯ°‡Ê@Eó"Rd€>¸‰’¹‹“ÌVº¶›v¼ÙR&ÉK²_¿CRrl×¹(]€ ^?žÛw„ ¹‡×~óéÆÔýö÷°üñ òØ#Á!Raè…L ECo´Øûsqq'±6´[õ¹j¡Ý]DÞa¶÷+üÕ j‘ Ö¬)ÿ˜ìµÜA½dâ)ì1EUÒKÆÞŸ·B(÷uªóÙ¨°ˆû×zX.†7n¢Óé,Õû­oɧöQ$וQ!" «kXŸ³¢{ )A…‘ jÑ€$)q’ëY—ázTβ´š”³ùÜ S­ÇV$òËÌ-]µùÚ-Þæ³²Ôé{3SþÕ²t2‹aÚ¢Ò¿w3}7\À3ý›ñçºR—MÜæ0M³rXê±›VO¨`†éÃ¥Ò]*üI¶L+ñYj +"Ź{Wym$óÇz‘•åÈš9 ®ìö®6Ü»–ã ðfmb¸ø{uD!Ñ•ºú ;ÕQÄ0«E­W2=Ê[ÿµ’Û‹$ãd-Òe„0!ÃIFM ›õJ¤ ô˜B˜z¹ö&&`yùûÞB2b‘™rf~•p’Û‹ iÓuñ&[‡¼®ËÄSc—½TôÅ7ÖO„ )’Nns©ÖMxèfüÆï õ ˆ0 %Ø€²rÓö"H‚Øš¶rÿ§VÀ¡žfyãû_&[1²uÿÿ=DêâõŸ ‘7¨8o•iR‘9eHòš,u´w9Z¡´„`×,ç˜ÁÍ<+«MX»w‹SCïÀrnfiÍžž™[Zœä™¡ÏÛB\–Ρp›ÃÒ™­êKþXu(¿€Y­Äu º, Ýî·Ûéb‚ò²qæS,cõ ×c·»ëÎýßõÈÐv‰ ™ˆ?mÛ{7è‚p—¡4(¤ÊðÅ—oØÃæ'›0Ò»µ¢ "%ÁCÞÜyØR»iqΑUE™Ãs÷ÎèÚØ¢\Ì«g;Á.rôºÙ_© dUŸ#ª&k ‹Âu9ÐWuÓI¶¡òšn‡ßl˜¾R‚·Îl<ÂŽjrï»ä/ã WÀEÌ M2SLÃÓ€*“ïwµ@¿‚ªZï—" nFÅò.˜¦Ë§Þ&W¦EUˆB mþ’“ÌFçh8_õ¡ëø€!©\µH'—ÉçóøƒN//è"9 äŽFÈôËGõ©]ïK¹¦öô¢÷»v¨E"l¢-éö,Ænü(FeúºFÎNN:IüJˆ“ a±™” µwv'þçgàŠáÃâY¼j o/ :Çñà9gYͲ‰%Î;çqÿ9ÀÏÇ@ÀxNPßÙä´ÓÛmfèíqÄš@íöÁÿV\Å'ñùÏà±ú"†(åMôõâÎà¢÷âÓä9sšVõÁ½»ÍÉÀœ„Wæ«[º‡ ¿{Ô=è$ݳSýÑŠâŠÃëëI2[ThgéÎ’ŸI|e„x™g7ºý1_…žOBñð‡°ý6rÕn\A,²e>Ú 2ò㫯ïâ¾(õÂuŸ¦®O糫ÑC—ó^ :û¼ýešÎÒ©Ã ßÅ:ß Õ°áêÌÅÕ2-—*¥²0t““dð4ZPàmô ´½a™ÏîXÛfC/Ge±ÍM‚Ñ'Ãå¼Ü¤z"  œJ’õµdӮЖü¡„$q endstream endobj 224 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4FrYST/Rbuild19e73085381c/NMF/vignettes/figure/consensusmap_methods-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 236 0 R /BBox [0 0 720 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 237 0 R/F3 238 0 R>> /ExtGState << >>/ColorSpace << /sRGB 239 0 R >>>> /Length 9873 /Filter /FlateDecode >> stream xœµ]A¯ô¸q¼ï¯˜cr‹EIWq€ à`œccØpÖˆ?ûÿG"«%¾®žîñÛƒŸ±_½zÓ#V‘EªÒãßéñ§Çÿýð[üïWßþó_ýøý·†gZócxæ´ÿœ–òøöûŸ˜žÃðÈsyæñ‘Ò³ÎeûÇ_úáñ€K~–ÂÀuxÖ‰‚Ësaà8ÌÏ¡20MÏ<30ϲ0pÜþy¥àú\(X–g8Õç˜XËsÊ œós¦à2³~yý¯¾,é‚@ãþHfýê2ðW¿_Iò´ê8·g;ù÷ùùÛO?ûû¥eµ©¾kÝ—ƒ¾ú»ô¿zkYmš eLÓsI_^Fÿ«·–Õ\+eì|ùò2ú_ý°eóøœº_¿ýñÏÿó—¿ÿô·¿ýtù2[£^^¾L{°˜û÷h+ÜG·5Ží·wŸ­ã|ç¬Iãä ¿Ýù/œôL«ÆIåq|Zžîœ²hœ¡¶ß^ÛÏ|çlÿ÷=gYËã¨0•WNÞ*œ¥âvÎpçŒEã´ž{mÿ¼×yãÔQãÔù!WbY—;gÕÚg™VTÕ¿Û gÜ{o…ÓO÷«··§hí³Œís†Ü8ùΙµöYÆ„oÒ¯Ç §ì«q 'Ë7Ù9éÎÙú-…Ó-/kcÖùΩjû4õ–ݯá³jí3¯òíwÎM£Óþ Uá,å!jX¦tçLZûÌóØ8»F—2Þ9³Ö>spÅz[½pêsÐÚgžÆ 'Ý9£æ…¹õ]©ûPqãT­}ææê¥¶Ÿy¸sV­}ææÐ®î%Ý4:ï[(NZÐ2]7Τ¶OwÁÔ®ÁPîœEkŸÚÝ\´ ·ï³MÅ´ö©]ie¿»ŽnœQóBíªiΛ—åΩZûT´æôèÚ»qV­}j¿ÊÍ­ó|»Öëþ”@㤇Læy¼s&­¯ªí›,ywÄ®×gÑÚ§ö>¤õ û<ø:Ã>b*œö K›¢ÎÓ|猚jïCÚϹ¬wNUÛghŸ3´9úëxºsV­}¦Þ‡4æ<ÞjKûóV…Óû>#zOwΤyašÛ·_ÛϼÞ9‹Ö>SëC„“_9ù™´ö™Ú©÷Œ»ÿnœQóÂT&(zç wNÕÚgj³‰Þ›Î¯ãéÎYµö™rÿœýºÕõVÛ66ªíÓþanW¯¾Ž§;gÒ¼0µÑ·÷ÚuîœEkŸ²ö;»Ýu¹]ëòLZû”uxHO_çåÎ)ZûhwNÕÚ§´>dn-[ë|ç¬Zû”Ö»÷¥Ö›FÛ¾2…ÓúÝm{2Ý9“æ…Ò{Ц :¥;gÑÚ§ôž­Íak¹ÕVŸImŸ,íýÖSÔöé=Níê8Ý9³ÖW•Þ´9lÍó³jí3¡íä›FçýI¥ÂéÎisØšê3i^çzáä;gÑÚgì}Hûç:Üj[ö-s §÷!mÞ[o·œ§hí36ÕÌÍyÓZïœYóÂØû6âOËÍ?ë~¥pZËÌÃuóâ…“Õöéß~íÿ\ïœIó˜ô8û?w΢¶O«ª¶^aª¯Ýî “Ö>¹ývŸL·ñ4íöÒ8mÆ[ÛÏé6ž¦] gN™ÁL·ñ4¥ý±‡Âi}HmóÞé6žnœQkŸ¹ŒèÙöqe¼s­}r›QÕVátOSÞ÷æ(œÖ‡ôÙÕtO7NQÛ§/¬µo5ÝÆÓ3k^ÈmÒgdÓë=í˜Æ}¡ú{Nj}Hߨ<ÝÆÓ3jí“Úˆ]ÛÕ›†|çT­}RI§¬ßÕ¶h}Uê£b›-–Ûxš¶±QkŸÔG«ÖJå6žnœ¢µOê#OÊm<Ý8³æ…ÔG‘6ï-óM£mÝXá wßÕPnãéÆÕöé½n›÷–ÛxºqªÚ>½i *Ówµ-šÒ ½{_8õXÛzá kï©÷.e¾sŠÖ>CïCÚhWnã鯙5/ ­'¨mÞ[nãišÅ·WNwhSw¹§gÔÚgènksØrO7Žº.6tç4G”<Ü9«æ…¡©³ÏæËmL\0›Q>3Ìf˜qÁlfüÌ\ 0qÁlúÌfÎÀ1ÌfþÀ¡Ð6ßá©Ìô.°®wÀTÙ‹$0U¶jÐÅŒ:`]Ùæ%dz'®^Ì4!© ´i¥˜ 3f耉 3Rˆ(v1“†¦.Pµ˜ D#ˆkF$0 !¬¹Ï³¢ÁšåLƒˆ{–£¹@H4 h°f9æ%Œ¹@H4Ïh°gDš „DsŽkFtÀº ¹$žu4Ø3"ÍB¢Hƒ=#R›°ÿu`æÀÌô¡.Ì\˜åqfz˜$r¦ÊV-S6`ªlUG 1efʘ(0U¶êµþ{TÙ€¹²•¹œ˜²Ç”Íl%™²³™®tÀDÙÙÌW˜);› K3e L”Í8%¢ìl¦, Sv6Ó—fʘ(;›QKDÙÙL`8¦ìl&3 Sö8Y!3efʘ(»ÃTÙ€™²3efʘ(pLÙ 1eŽ)$¦lÀLÙeŽ)»“¨²Ç” S6à˜²‹™%0Sv1“ ˜(»˜YP3e3 J`¦l‰²‹ýD”]ÌD(cÊ.fR”ÀLÙe3Š(»˜iQÇ”]Ì)cÊžÌWY Ì”=™¯²>`¶Æ¨êc2_p-0Ñ;¹·›Ì×^“Ë=™/Ã>`vgªÞ*MæË°‰º'óÙSÇXW™9f2_œ}ÀÄ1“ùâl³¨c&óuÚ¦º©c&ó%ÛeÌù `æ À̇¼ÑIÔ€cÞ)æ ˜7y¤˜7@bÞóHÌ€™7&ÞóF'QoŽy$æ À¡çXeIæ< 0}Ž¥m ó‘À!uõà˜@¢>R§ 1 Ì|¤Z$ê#Õ| 1¦>Ró`æ#‰³H÷SÇf¡î€™7So¨š[ÍH0©7TÍ­fPØ3o¨­¶šñaSoß{CÕñjF0ó†ê·ÕŒ#ƒÝj óÆjÆ’ ̼!0ñÆj™mD³š±dæ·¤>Zß„•iuNÃd…œò‘ˆ8â#˜ùHH! ‰øè€#>RÈGB">8ä#! L|tÀºù$æ#C>ñ‘ÀÔGjk$óeîSi³!1 Ì|¤J-™/~˜úHµD2_O6™/‰?`æ#µãIæKâfŽIæK≖’ùêx™c&ŽIæ«ãSo$óÕñæ%¤ÞHoÞTÍesUL`î ÍoÙ\+;`æ UÇÙ\+˜zÃøî±]zBbÞÈoÖÊT¿es­L`æüfUÌúÌÙ\;`âl®Š¦ÞÈoÖ¿TodsýKà˜7ö—³ó/À1o€Ä¼!pÈD½8æ bÞ‰yCà7@bÞ̼8æ ˜73oL¼˜y£ÃÔ€cÞ‰ypÌS2çT€ùú—¦c˜7fÞPýÖIÔ€©7Ô¹HÔj#€Ä¼!0]ÿR …DïMTuƒÄ˜8F`æ ÀÌofÞè0õ`ê µ{‰ypÌÕ Û8æjFðpÈÕ æ8æjÆõoT3Äï€CÞ¨fˆñF5£ýfÞ¨f´ŸÀÌoT3Ú0õF5£ýˆ7ªø'p(Xmê!Ô€©7T¿Ä¼!°î ÀÔ€¹ 4g»ë‰¹@àÐ]7H1€Ä\˜¹0s`æ‰ 3Ì“$(plösà˜ {Ejy³"¥º`±W¤sE 0uÁòfíIuÁòÉÚÓb¯=-Ÿ¬=-æÚqÁb¯H-抔ÀÌ‹½ö´ØkO‹½ö´ØkOË'kO‹½ö´üÒa†cm/Qþ$¤l¿ÊSý(n\ó3çÙÊþ2¹õ£¹²Ùìµ`†bn¯Ûü$|®ŒËþ&-Ëí-unA{îð¹ýì·h@wë”ù»4Cÿ…ZÆ[£?³¬ßÅú“*÷÷ĽÖìŽQœö\Îñ³Åi¼ú?¶|w™ÝʘödÎ×’ÝҘ괿Fì£hÎiÏæ|Q¤?èrÚÃ9_.Õ™¹ö©†U²ØTC¤›p/±†î;áž¹†þ8¸*îG°¡?ÂîàɆþè<ážÑ†îD7¡žÑ†þAážÙ†þ$9á^ ÝéwÂ=à õNÉäžé†îä<á^Ò ÝiÂ=Ó ÃÊ8à ÃÂ8³ ÃZ>£ £×é’lmÚK°aÔô—\Ãhã\b _^–ó&ÕPÞðJšIQ_êR(O^½+o~“n¨–7o(gâcå-ïµ×ã.%ñÆR¨<”Ó¡XV,ùPX±äCaÅ’…K>V,ù¬`ò¡°bɇÂúêäÃmhú<ùäO“…þaò¡Ð?L>ýÓäC¡ÿ’ɇÛHÞö œÉ‡¿ûëßþéoðCõT×þ·sÖO»íØ8£nêѬÆXôsný[¢ÞcOùô¿¤ªµÆ¨…kØœØ[Ë´“ʱªÇÝŒÏ_æÈ[4vÆZõWht…õ˜›QrÚ;= HéÇ;%êq8½ceQÈéý~§Œ³zlÎ*¬LúQºN£zÎ*¡¦ÀëÎAYÕ£uäi£ÌKàu‚©Ç ê&Lˆ; ¸݆ [³>ì”;…8±ƒÔŠü/vÚŽ×G|g•Àì”:_WÃzŠ"…C½§ÌhÀ¡æÓ,qÐýÀ¡þÓÌ$f@ã Qª‰á=˜Qw`F,£ê@€º×ô>:ãôAàeÑBØAⵆ†=PظÇë£ä—<äÀNá"ÿæK ÜZ2:8ÔZ.zç%^J½¦f£wë´Lzpt¯ ke0&—$®È\¥g'šóK^_h\ëⵆÆ5P˜×Ô—Ñæ$“_ê5þ)Üküâ0¯ vÂa^Ó/í©¦IiÍ5òÑŽWΨŒ¹Âa£6I'äË)óÍ_Œø²SB¾ì”Ø_2æ› ù”ˆ/;%äËN ù²Sb¾‡øhȗ‰øœ/Áa÷€éÍ,”Wò¥p"¾'äË:³Ð:³P€_Öј…v0äÀN!ì`È 0ò¯Z~éê@þ)1‚C”:P]9íY¨ºnZ9cîÉoVø¬:™{²¹Â÷AÄíuЩ½˜4–Àš÷÷^˜îüÕqÁáõ#ÝI¦{pëteú³WÇý n¦;yµN·j݉É{dëKµî”Ù¥e^^˜îà4ìoœ¼RÝéÃ)µXÜ“êNy¼ìC§[ÁîèáT–=áBu3k{EÚÉt·iš[ìðÉôW»Œ¯ÕúfmýU‚n5äýå´W ºý’ÓíÚºµ›ÇáµÚ—·¾ýƒYùôû×"QÃî”T0Ç,AÃîhV0Ë 1Ãî)îàà“âÎ JòÇŸwjðIq‡ %û3ƒOÊè >)îÄà“â ʸ?6U(J^ðIqÇŸwZ°PŠ?,ø¤¸³‚OŠ;*ø¤¸“‚…2ùƒ‚OŠ;'ø¤¸c‚…Rý)Á'Å|RÜÁ'Å,”ÙŸ|RÜÁ'Å,”Å|RÜéÀ'¥zÃOŠ;X(«?ø¤¸“OŠ;”iðçŸw,ðIq§Ÿw(°P’?ø¤¸#OŠ;X(Ù|RÜyÀ'¥zã€OŠ; X(£? ø¤¸³€OŠ; X(ÅŸ|RÜAÀ'Å|RÜ1ÀB™ü)À'Å|RÜÀB©þà“âN>)î`¡ô=RßS”üß“âŽÿ=)îôß“âÿÊâÏþ=)îèß“âNþÊêþ=)îÜß“âŽý=)îÔ_Pêàý=)îÌß“âŽüJò'þžwàïIqçýžwܯP²?í÷¤¸Ã~OŠ;ëW(£?ê÷¤¸“~OŠ;è÷¤¸s~…RŽõ§Šó{RÜ)¿'Åò+”ÉŸñ{RÜ¿'Åð{RÜ¿B©þ|ß“âŽ÷=)ît_¡Ìþpß“ò…Ù¾Xµì=R;Õ=]&½¯ "rt${¤ÔsS?ÇT#Á¾ m7r\_öÎV'©9^4‘T_úÔè¨NZéwÒ2}AÚ7k2}…•é·RO;‚Å›J=ùo+õ|Ît= dú ‹µÖ§ɵãæ"}Á­'7’è öza}ÁÞF¸}…>]è@_¡/ýë}ÓÐwÒŒ£úþüí?þý7$Ï·M€Ënæ²§¬´SGãþÈ%oyü×ãç~ûÃÿoñ‡ endstream endobj 241 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 251 0 obj << /Length 1644 /Filter /FlateDecode >> stream xÚµWKÛ6¾çW=É@D“õÚ¢‡õæ6ÎÞ²AA˴̬,µþúER²5Ù.ÐË®83$¿™ùf8Ƴr†go_à³ÿËë‹7)å(Oh2»ÞÎf(gñ,¥ÂI<»Þ̾7”àù×ë?†}‹7mê¿@Ñ/ß_~¾0Öp292Š(ŠÒÌ[-ºV-*¹^IÍ's¸‹´5&#’:ƒm î}ßymŒu'K8–ëFµìenïm-µò»¢|´¥lµÇŒQz̪.µ‰a4U;ÞM=k K5µ,¤6ßÃe(vfš¯+áÁe!û_ëã}Ã7bco»“ÜÂáv]ó½hGÌ Ž1¯7Ö¤n´•r­]´Å,ˆ++˦4(>ðè7¢í™ójùûÀ—_¬ŸóØa"«âps—»}¼m…ÒzÇõÀPG¦èˆgÐ.Q«¤7iUâVN}Ö WãBÛ—Úþû)BW³…©†£ÈQ„Cï_Ñì²òÌføÙÊT[+lä^q¨Õ¹ÇQ 仾U×bp*vWmy ¼ï;·O—â–«»ã¢5%çy]ž5„1jey¨M­Pxh&eÕ ö±4Tn¾÷ÛH—CO¦VYh@ûŠ.*Â¥Ë6H¡üQê¥RNlbÀœX‰vÇÖGêw±Q]ñºôb2\Ñötç•h½.²V+éðºOº`ÍOÇwD›ñGxJŒE¨åæb& =½ÏÃyÛ<¦G§·™ßA‡]ç©džwOáB«v¬¢x²Bï¥Þ©±Ñø÷í¸·íj¿;"vàIÈŒ$mÓô\ #'Ng­~ô´MIl…5L ?j½€‚BR)±›¾¯'Ö³/!ÁÃa5ïŒ{i¼åÝ·¦{€E†Û~AzÅ¡ÓUVøY4@}¬æ†DìÒ*€_±x6 ZYñÙd`uðjZmÝÔµ(¹–¶XížC¶†-/àõ û¨ÂPÈÒü”òoØÜÔ¿< ~¯Ý`šäGˆ!1Y< i®àÕÀÔ¼²(pŸé7ßO›9L$÷ûàZbo1oÅ›Èä2ƒ‚q¢$Eö¤ìx4Îr%Ù¶õÄu$C”EÞèÂHXJúþïlðõb±¸Z]~D+›üƒ‚ øÏjT¹8óê·ñWÒrüyôSºüŒ/ñ9_^þØ>ýOö,ÈžÀG¨Ú0‚è§u™ž½¾~ñ¿DS endstream endobj 263 0 obj << /Length 251 /Filter /FlateDecode >> stream xÚ…±JA†'\!Ls­ÝÎ èÞ±žšÆ…Á+­,ÄJ--íÄ;ðÅy‘µ²4åB–[çO"h£ÍWì¿üßÌì¹Ýf,•4²s n,Í¡ÜÖüÀÎéc%ûÍ:¹¹çIËöRœc{ªÏlÛ3yz|¾c;9?–šíT®j©®¹ fDT„¿P&E—{åh+ç•9G2ËÏD~þ>/BG¯Eðô$E7è~ }§ø¬€ŸK…ÑvmV›:¶¼«$ê,HŠ@•%¡j»}¦W”}þa³ÂzHõ‘ ¦OØ#b£¼A=ðb2ñßãà~|Òò0Ž endstream endobj 269 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ31Ô35R0P0Bc3cs…C®B.c46K$çr9yré‡+pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä00üÿÃÀøÿûÿÿ üÿÿÿÿÿýÿÿ@¸þÿÿ0üÿÿÿ?Ä`d=0s@f‚ÌÙ² d'Èn.WO®@.Æsud endstream endobj 170 0 obj << /Type /ObjStm /N 100 /First 883 /Length 2915 /Filter /FlateDecode >> stream xÚí[ÛrÛÈ}çWÌ£õà¹_]ÎV,É·ªÝµKrj7Q©R ÉŒIBÁó÷9=)P%Zljý `0Óèéžî9Ý= ”L2åÓt3L[»e::f$3†ºq¸‡È\²LEË‚¸;ƒÃݳäâ@ÅÀ”¤÷#¥G#h¦tÂ%¦¬Ç8Ñ{I=4ìЈcû(!ä1˜]IÐF…† `¬ÑÈlÓÚ`(EH ¦Z:¦½qô&ÓÁƒoêh©4É ´K4f1*$44Sàœ ¦ËC–oÊB •°IC)™• \¥bVŒGÜI8èaµ&±-ªÌ™›YG/)•Hf#V‡^°I£ÌT¤’FÃ1z4YAyæ ”´±y$ æ^Ð$ §a– xº¤À#Éa´Czh£™Wžžy{ó–Ø@ï¤h“ÐHä’yi4lï#º5Ö7Hh¤aš@Öu’­I$ÜaV• †VžF’C:5ÐDÉ0Ö°(É-j ­eÑZLsEG+ ÑáRÔXŒ‘‘%Ifpš%S9tÀ ³$ÒLQ4CbÉ(ô°dÉgè˜Á Σ¹)tÒ.°ä-5ðb¤%ÄŒ))3Ðpu%%Éæá Òå*-á$0¡RpôÁi•#­ÈêÊÑò“Ã+¯È!µÈÉ‘à¬tUÔJ~p$ÞîííórVØ}ǃçÏâÿÏK&^ΆÕh<;"Y>1ñÛxöb6_ ïOO˺œ Ë9;‚¯‰éx¶˜C1ñÏEÕ”“ò´Á–³bT5“r>‹³ºø£ÅpÑ”b8®‡‹éé¤ü,šñdTŠi1¬«™8©KÐà•b8,g1Å|<|V5£òTÔ˜[ ËÑx2)V³³¢^L'Å¢ÕY5+?‰aAüæçŰ<üôSÖpŸa}Hc&~ÿëßÌ‚ä¸Í“ÉF2%#§eÆîá6ÝBL[t^×§cb¯šTõ!ɇÈä)ëÜ$?¾üܼ>lЦd-»xUÍöü9¯O¶t¯¹`ÛîæÇöè`wì°öR¥eÈ©°ãÚìÿ´l.ªV*~wòrØNúvŠ1§WcïëjxX60¶x¿ÿЉå熭֡õž÷ÅY9€ª³Ö›3Â:¼>å¼ZÔä*¡¹ë±Ø­>³#Ò xÁŸØŽ ö8Æl| MKþbc“§¦“HéíÝuwßÝÛ¥YI¶W—E3®fû´´OöŸ5­Œ@Ád;¤mû0†÷²'ìu]œçìÝ¢9_4;y=F‹aYӨ军n®ŠºvÖ†L9‡‹“&?R§ˆ_‹)év³es‹7å䲋Áj/æ€F«°=Ks-˧»Õdt=ß>*Äô=¡B«aö/¨WÕ£²Î.)ÅñVìá»ï˜œ;ãQ†c+™8BvМb®‰‰§dŽWö?gŸÄ‹çÏ3{ñbH(Å_ÞÒß“Ms>&İ.f¼~z^W´ïxUŸ ÷ ÛèO1vëò_e½Y¯we}šîzéU~XJo!½NKñ‘MpŠvâ¿È[ÿ‰×Õ‡ŠÝž¼9­ª“•Üí°»‹A‹ØÃk:;1˜À×›¤Ž!€üóA·8ÏÖ‡=ØêŨ#û1‘K$ ÈŸUá–õñ¹Ý«·rÊ9” \"ŸEâÈ‘¹"{$Ñ×p,Šd!nûdxÈ{x ßH‡d†S ¦ŒäYÑvÄ “z¬Pº uN’ºà™(ë(í2ñ¶°Šœ–QY¦’zCX…?¹t¯°š®†Õtß°šZm©4iï]xítRÒT–ü¿…W*Ð#¼öøö«n½ï» ¯_ŒÈÈö¡P"Jˆß"^àIiU¼ç‹“y™Q‘+n06DÅ©tIrªEQÙq`‰—š£L»%4„{„ã”_n•äžÔ…(ÿ0³úÈ9¼äžu©€\™¾7-]|¸¬•¼)ŠòTNÇ£ŽK¹.ïØ>ÜGǽ¼ˆö #¿Z°OÛû¯–ÂKG‡"7#¢xƒtÓÞÆsë‘X›´qŠpÏ*É n£ÓŽ4T‰Û}äÚ{¹ùÕ8FÆí½°Ó©+ØiÓ=±Ó¶«BŸµóÝšîÙuÏËþå³ïî¡»ÇuÌýÒ=eÛÖ”®vµ§¬wܹôåµë¨g§„)½P6¨§¹ÒS¥žvîQd'n±€‹ê±îŠÎ|XŠþM‰ D¢“Ö¥¨«U½«¨'Óáɸϰý§©Ã9Çã´(×Å„«©(j ÚséÀ>úeOðÈN¿oLŸ/?•„¹"°¥z¨ÏyÄf¿PïjÍqlàê^gFÝšJÅC¢Ÿ)9n]ê>âÝáÔhïàůüàëTd )óJ$y_ü kæî ×$Ûn«Nº'¿… áÏ‘¥ÏÅÄJÌ-Í2ÄË¥ª“[ë>)(jBºŽÎ»/ëké´çA>h5»vb¶1÷CÿÚ±ýŽË™­÷Å…1q~vz^Ÿ°£•¬b¿üc<,^ï«#¯‘’1çP¿3g÷ÌcÇ+”ÿ¨)˜‘šÓòˆÆçQ—ûƒÅ u4]æÐ¶}ûVË3­¸ŽPÜ`MŸÈ»vÔÄhƒ¢ÔGÐ ‘ë®J’¬uyI0ʃ1©\¶Ã}×î÷Øë®ýž–¦ßß·í×…(’bYÀ–r³ÓÔ6¨’™qÈÁ¡¤ó‰ho¿-2bZÔÿÊ•æ7 :þ¸~7WØÜ«D^ßóÆèÉ'Ú+p=:ÞÆ-HÚ‡6ÐVwHO,¶o»­=J¦Ið2‚1cºî–¹1>£ ‘ÄèVäm;JÂò!ÿ6˜¶c¾v4-Ÿ£ºçh/P³OÝá¨'X§eA ¤Ga9GDbÙ)Ó¶»«G}¯4ÙìÝÕSx‰® 8‰dÎ×`rðé_j(>XŠ Vå D§ÍýÆÈŸ@Y;s‘zRFöLs|óÉ–YlÛFõ_ЦS¥Ë¥¢Ÿªçìè¢}ÜRíæj˜9ö4 5¤ŸY÷+gÊ .‡ò·S$F»,gñj\Ï›½EˆŸ‹ÞÃoãQóqž5«é‹S5ß+)qŸçŸQ/Ú`;$Ø×Ÿ®­Ÿ/ ãWiRAŸ!üêúÈÑáü=Ö…f˜Jmï˜úNމÝAÿœqg¿TkŽ©úžäeÏ êŠg†Õ§Âÿ¬ÚÓ endstream endobj 288 0 obj << /Length1 1376 /Length2 7685 /Length3 0 /Length 8628 /Filter /FlateDecode >> stream xÚwP›ëÖ.ÐRܽXpwŠ»{q( @°@ÜK)Nq-ZZÜ¥X±âÅÝÝ¡H‹[Ú½÷9ÿ9÷ÎÜ;™I¾w­gÙ»žç› ¦‡´5Ĥq†sðpr‹dÕe y¸ÜÜ|œÜÜ¼è º`¸#è;:ƒ> CœEþB Âmr@ø#Pâ PqsððxDxE¸¹¼ÜÜÂÿ!P€Ðl Pç¨@œA0tYˆ‹lk¬óÏ#€ÙŠÀ#,,Èþ' í‚‚­€Îu ÜäôXÑ èÐXAp¯ÿHÁ,f‡»ˆpqyxxp`œ¨­ ;À ·hƒ` ¨;Èð{d€Ð ô÷hœè ];0ì/‡Äî„‚G°Èöâæl ‚«t”Õ/]@ÎÕþ°þ¾'Ï¿Òýý;ØùO0ÐÊ âätö;ÛlÀŽ ÀK5N¸'œt¶þ : ñ@w ØhùøÓ:  ­>Nø÷|0+(Øã„ÏÈõ;Íã5Ë;[ËBœœ@ÎpúïþäÀPÕã½{qý½\gˆ‡³Ï?'°³µÍï1¬Ý\¸ôœÁ®n e¹¿1&ôÛlApÀ nnnA!Èò´²ãú]@×ËôÇÉóÛü8ƒŸ Ä`ó8ÈlzüA÷ÝA8Ô äçó¿ÿyBçáXƒ­àK-ØýßÙÍ ›¿Îû‡‚=ÆÜôãpÿþüëÉô‘aÖgG¯Ãÿ¬˜Ë𥎖žÛß#ÿË)#ñøp¼pð¾àðððüþ3&üwÿ+VÙÙþ«ÝÇ{ú§e÷¿9Àü·@Xÿ™KòÈ\€ùßD7á~ÁmõøÅóÿM÷?!ÿ7–ÿÎòÿ$úw¤àæèøÇÏüàÿðÀŽ^#™ëT:äQ Îÿ 5ý%]ˆ£õû”áÀG-H;Û:þëÁ0°'ÈZ ·²û‹.Ùõ~ Íì Ò„ÀÀ¿_-nîÿò=ªËÊáñõ{ääèQ<ÿYRÞÙ bý[e¼B¡@/ôÇ%?ž^|xåh òüÃb§3þxÎ`¢ÿÞ¨€ë‘ù°?µ(¡M ZÍ·¾wæqÚc[Íè³£Ä=#ùÒ5Ý”hºRÛ¾÷®¾úAOÛTr\Ý„°5ó®<º=kº‹ßNoimW¨bÜsDëE™L2äZfN‘Ò>ƒsP¢²âŸxâLž_Làgü¢V‰cC÷;Œæûèc´Ês=å½TªË k'£'3"¥|rŽ?8Æè#³›¬B2ãSø)jE|&K0ü]ßü›®ø)U}2ZMRè›"ñŒ@µ6úöl« ¨£¾Õˆ€‘‰ºÕ'„¡PÑ&¡œ®¿Ð<“p}OG©oˆhÍö¥ƒªýðH¯Õ7þ©OôΰÕ…8Ázk¦¿ÀÝõ3®à˜¢r’ Â2ݼÆKâñ!\?yí~Xtm¾q÷¯\ÎO—öOìC}?ÁL–Eº0<…H4‡o-5kwŽ¿ßl‹µë7®«$<' Å5oÛ…ó>ð%Ô ž¾aWæ%‘Áþ^’)Ô§’ºÂ=Eè£ÐC2Õº±6<¤¡ë–Äž¸Ïlý^,¹ u„Èÿ¤©a:Á™æ`>:D!ù>hSè(K²'òYï¹[¾\‚‘±SšW°nbq;`š?µÎñŒ¿/~Šx ®&æÏHmRê¡¶Å×Dípµ[Ó LÎ!n·w/c 96…U¹jÓÞVô†ÐÝÅ‚ŽÚ)?']ß#©h*ÄA2Ä.åUòªoÓEÉWÇ85üŠõ'*]QÕTØÌÇPí'j×Ñá¯ÜUçò¨¿€LÜPÓÔN´\cÄôã•¥§Cžï_ [PÌ—™÷ä> +Òé7¼–rwˆè‡7pÊSøz—´å3D³4ª0_ªRs ÝÑž Žá)IÏ ¶NKJЖd}È$&÷{ˆ²Žm…9¾ÀhÃPPÀ’1ؼá Ñ¡¢yèFÊçe­;$69dA%$bÛôÃQ¯ä9JÃå¼3Ic¤çëƒVhŒF;dcEÙ­Ë•˜0k%§&âVØö.Öøh®µð¤ p5?÷uȼqÌ 0Ž>Ù¶š§ùÎÅd7 …{Mð;P{Ä 9ýNÄî“Ç2o3]³ó7è½oä¯1]üïj(‰ ¦£>%†¿nø»9“<êK7|5¯xeömk=~Z:´+Tfa`i”ØØ‹ÆXKÒÅ:Ò² –PvÚ"m¿ó¹>Çc½^>úžB6†AÀ®£µ‰Íû©9ï¶”‘©Ð¹ŒÌÄ¢ÚT+òM°È.öúRc§€#™3·¥ð['Ó–“Sö®ùÂ&¯èž³éÉGÐõ4D©ç¾¤$füþø˜w©¸.Øp‹ ³=™¯7¡¤ëSU&JAþû¯Ì/оÅ×>¡ÞX1´ãø3ÒÌ£«¸ÏÀ°qüR{…]§=¶GW}6rÞâ—ÆðÔߤ¡]1jq|uy½ÃΑ¦ÎX-X‹×ˆ— 7Z¹}j¥ ð}‘¤^Ðð‚¶æ5kkNåáü¾XeÔp’\LT {³ÚO{¶Ä¸ÃÖ/mß/²û3i=¹;/íèž”¬¸KÍû­íÎÑN£÷[+Çɳ¢±ìÛ¶M·»Ý9;àž¨DEhÇñò¯ó*>ùY‡rr€T0vjzÏec“P>‰S©n×ÉaÙ;W(Óz†’c.ÊÕû^1¶ä†}=wØg¶tÎâ"xVFX6ºuJ’z;Vß`O;Öo„ez·'ÝmI[a4c)RM`æõˆY9õÔSyëÈ*}¶~R¥](ð43yÞÝNm‚´h:j˜Óçh;ùdà‹C¼é+–é§Ð¹sd!¦ã&‰•UA¥ìœf Ä®”–¦®z<(zÓzýxLM¶bÿtÒǼ'Fþ²;)è‘zœO±ä#e›×ø²‘ý¦í@ÎÉ]ëòq¥4×A²wÆžƒCžåβ®tutºà&NÜ3ð•Á ×)x‹5XRÕb¾?+· wîžü—ßž­èp[\5Ni‚Tþ—(‰i¥ŠÀÒŽƒÛëã¢'gáAž´ŽÐË­œ[¢"cÜx$ÄÒïÝX_1wàö‚¨|ÝêK^ëÞŸÞl³¯I|–Ú¾Ñ&Ô”KüÜ=øx|¸à¦¯0e"mçPI­/G^Å}/ô”úRÚÓãcÖgm=”áÊ쵆 „ù‘¼›…óÏ\:ᜅX(å2÷W,M{ç²P~‰é1ÛnÏ^/3ç[¼äM‰l¼Ï']ð¶äCæÞÀøvÎAª«_éÓRve®tijÜ "p”é]_ÇJ‰¡¼ãÒ8 l¶ß„7JH´‰ƒ² ø´F9Ò™¸½ÆV¾‘fÇЫ ¸QW–ÂÈMnCðá'/ÊÉø¢Å©c¾·Í6=%)Äéœö5ÖN_«’x¤Mð¦8úùÓ×®Ü΋fÃAÿ›N_¹`¨2Æ•®]P7áœp rÐtù&†¹ÓÀ¦§|%~lz3‘†«î;œg­reòªX»DÑ+ç3¿53îŠÆ» ŠZbÇk“€©C_¹>zÚâñ‰ô±¸øÈô ¿ipÁºåäyÎ º,¥ø!nÒ3PIsýóU¦>ËR(p´qÌk:M½¨òKmTþlÁ:>Ý%f55’¥z\„™ã¿¹Äó3£sæ]:Š˜h€5{…Ù„ÀÇ-›LvÍv—áBß“r‡m¡&Áº3* 0Fس°ú*À¬íMÍûLñ< ©æJ;üÝL‹ c…ÐÖev5†I'=Š÷-»µ2 ÀVúJjgˆçŸ*÷¼ó§>}«qžqGÔ}Hªž(ÿCdtu™Ö3ûÆŸñ7ojâ"žÙ6‡RÛ¦¬@–±h(õž¶·Ø…,j^džÌðžï6Îd×´Uç°ÖjWÓ¾¼$5 ‹67‘Œ1€ë ámŒÆ¬£ÝÖ¦(sZê,ÏÎ`)¿("Ì1öð`vLŒÅC?Ž xmL‡Ï±È Fœ˜´JÍÛíE¨H:ä]]çßœ ñ›M ¬ã´Ée×Sï„17òÚG}Êú 2ðKŒhjÍ-8 óŽsïX›]_gfmRÌ5ÍFäÂ1ŸªÉ"ÚŽ£‹8[ª …ݨ5u¹¾{žØ ݱaÖ%ü¤XC[¿Fg§LD´ú#Ö¹šápm¤’àUO’[|: ™jái OC䆘+­\ÆD4Wºð ÙôîÃdªêsrÒ~//_%Â\Ÿý·zþÄbŽmƒÀõSJäTL„Ö@¼#ØÂLãì*ŽùXK×íð”„ÂpdWJ„{¼Vh¿=NöÞs¤ø›òL"†,«À'tù½þu±)ß^n#c=!‡Ç…2çtxÒŒ€BÛ nX030-éÞ~ˆW­G,{b]°?šìÉÇxÿuížx‹vò{{Ú`¶¹¾RU‡h,­$á‹í¿ÝÉ¿=µÔe9©ÀÉ¡~[#Qç±·ä~[³æKOÂÉ¿ŸÀ*5“\@_…¸ ÔZv¯›@Ñ¢…±¥K¾®‰]»³<«P“ÝlNf+¤\BzG˜LqíÉé);>×“ÍøºM¯0ÉoÎDyëy”:sàf€DÅ–3³}Md{AN’ôyÑ …9ãÇs¼ÎäCÊцژ\ 7_ }P„-Ê…V‰pÞE®wÍ+àË1ª½ô5Ÿzàì/͉wî¯êl¥ˆ ê1 :ˆ>ÙPÔ‘±8‚;äû¡ÉwnáÔš„)icõ Ñ*¤í7Ä­ õ]ô9vóßÒ³+qhsç×G™ÈÏA$ÚÃW5hÎ:-L èä#ˆA¼Å›zug6Çñ]cŽÙ/•Òc*ógœ¸„˜?þ†\Ñ#¸@’¢ä¹ÿà{£'ü¥€££ºc Ü! OÑeì~ôÿ°÷V\9J»#%lT1ƒ 2N{õ‚£˜ÄY:é¼Ç÷oYO»å{!®T¢maSÍ#\Ûx1MûÆ…˜j¸ÓG¸†òϺ˜?Q‹r«%Ä[pOg…Nê#èc³²­·"é¸©Ç W‰p7ãÚ ­¡Á[y½^ Òîo&Ô˱0ù_?¯J+æšJ f¢1Þh ¡a}¯Ãdðtd "/@Ÿ>+Ã=ò—±[_U¨Í[¡å5i4eß ˜¨’‚‚˜ ±vX»#^ ÞÍEÏÏZäcT¹èH24€}¿E^Ã}ŒQ/‰-Å®ÉÕÅ¯ß ’ÀúG랿ŭ+öàå_Æ i·æ²<’ó7f©¸F±å/ÈåÛ½_RdDàrÑîdÀI¢œ-k'lc!¦ˆ F‘ºìîcî^wúy¨§áq!ø }) üÀÍiY”²aOc´#%™¿õúâÁÛkÚq’å×=m5`áä\5—`d#¸}IÏ 2žv„:Ç›`…”âǘ¹±ã°*B&†Wuy|¾ðFáš-ÒyÒŒ[”µ¹«¨†ã5 ;/øCL~áxý¡Ý5ÜÀ_¶6ïÚéÙOñЧ5à æ6·Ä¯O¢+mï>¦ß<5FÊ‘`õž“Ráv111=›1Qñ+I¡}+;#±ã°Ni17Î~yTIªNÙm«ÉFCçmDÚÁÒØS6;!ÎPBšþ‚Zɸ_ü~Èl݃ýg¹©ÇÖ²ƒÓ¹¢TŠ]­•ó{ºè¤kãIs‹jŽÇqA®ò8HmÚjÅh¯Ug¥è}çä ÊÒ"'θ45jž™&ñ±r«žoíuÝ/ö|fñ›xR®²§nK;NÿâFèÔ¼Õ¶DÆ+['È®š™3•%‰:Ü<<Â’³Æ¿Œyƒ½ÈC‡Ø i*InüLB¤Lmh•©y9ëþ™ðaøãõ¦ÙÇnþ{¢~ʉD{Ê—ŸæD€. –Äë>Ú,§dœQ˜`%%üu§·„!¯MLÌc½PÜA2qøÉƒ½T©¦/…Ãqÿ…‡Ã·0?VÃû¯³ªŸì Ò~Z¹˜ø§ ‰µKmÄv¤òÕ°oÜâÍ }Í„(,¨1|BïíkÖÙ$á¤öUMcCøÒ+ü ¦ƒìí!*8Ãòl„ZïŽEŽSrhaZ¸%³Â†_û‚·ø8f̰±q ÕƒŽ Ç\Û›ÕhÐÅumÕpCp}ŽÊg·¡s¸’±£I´Š'7ÐïùŒEuâ° 5a:¥s+VËTlÒ5h3é?m“!îúþËgB•®’R9£…Ö)U9òþq«ŽË}æ-±%â°^„"•wçO4¯â“è¾Q½Ófk°Ò[+¡ÔÕ]CdÎb¡®¿“W5³^`¨m§ýñ É©Ú]œÍè+èê1¥xO6›q“E¿ª>¦‘Û:ûàè4.àÊk¢ü6`5%ªia¨í0Ÿ6L ÈÇÒ…žƒ¨!¸«"XCýtrG°hkZµÖ›U^”tåz`ˆÏ£"è×–dd &ñê +64HQן«ô“-º¦ú–iÛ¶[dÃÈÞg2;}üsUÌ„«ë0p¡Ö0¨LR 2rôuMÑüa90çnÚé$ò¢ªùPцyb.3ùXûvRnª%Ë”#ñrSó§ Ó¡ûÄHI‡¼Š~À°±p›ÓGQ¤°Ch,6‰&t8t(Zëi6~¼¨œ:˜¶Wg/hðiŸ.£f<þÙJâÌ@Mo“Œ¾"sÀ*x“ÄxS¹À@ZLªaw#C¼RàB²‚`Ï/ŠKw@±è?7ˆ[¦öâ|ax/Nú§[G ¢À´­¹û ºÚ6ä£|ECOž¿2K­* Ÿáé°Ç| 5­Ë-|ŸËŽTø0(‘“üªD޵@:[:µƒ O§ŸÀw©zc ”_ärV#"0RåI½õbµåJ<î*œ,Ý×`Š íû­ºî ÜU?¢‘õ-”yöÐ!)CB#1bÚ/ñ¦Ö0 U¬ÖEúÙt¨Ú‚›Ÿ1Rv]€+Oiû`¦Œ) ë¦ï~~ïÔ©U;ö:\6°¿ú–ª=S/v¼ø1Ø8… åú\ÒA’a‹Ò±èE¹±¬ú(¶BøBG ‹N5‡Ä˜s¦”tû̪3‡ ù‡¨X†u#5îÓ¯Õ+ë=ÒsL{lBR^^Z:nxlj#†ÞYN{s|ž3gá`Ušè2˜[äh¼udÍœ8”T¶ÊPò§cKpÒ ~€µ×Ò œØš±]‡Å+ ¦f;%ÕÆÍh–"ä@ªÀ™›âçáIuŽ –k°òÊÄeŸZ F€ŽËÃÔ$f5b^j\ù«eÛ‚'ÂE—£CÜEè M°È‡"UglêyQœÆ$Àž”ô*Zº¤mLçS8×·û)Oùª…pYºÞé~Bë¶BhÇ_*LÕÖiQ9pàÿð“pQ5ÙoN”O,ya Nl? £g†4ùâr†[ûˆö…”t$ZÞö©¥+á>¢)ÅE«Á4«þËwTêeðùiv[sTsÓºîˆò}Åé+ïš]6EßxÔ\óx¨©¼bÜ Ðuá}ŒmlÚ”iºó‡_)¨îÌ•rÕ\µgój–%x{‘3ÖëÇsÚe¢ Š’’@•¯úº8k^f» e¿>Û~pò_M·¨6âÚ] óDõÙ”V±JÑÒ¾ÊÇtu¶f^ÆYxï•öãóDnÈB·XEöÝÓÅŸJ¡ÞÚÀÅ³Þ JÍ»êû3‰¸3ûáž=ïe¥š¢Ô]†ÅŒßEsHÞƒzE‘Œt÷ÏÞ±…iç9\ÙvDÿ"$ #I"‡´Ñ»b›UYNŸT¶®Ìõ¡±nÜ=B/çN}ËED>ãê#kÄʼìÐóÆî_T²<*VÈ)aW|§ ç‡«µÔáV¨X"Ö¡·(i(“ÊN¿w­rª¦á±÷”aJÊÆ{¡;&¡ 2e9Ù$`0ÖBxº×ŠDB¶Áã!Ex[n”ÕXNK ‘@Äì4$)Q€ŒÌí!Ñ‘Ÿsî$ ¹&_;¢„Mø&ªEñ™“ǭדÙÒêÕ6Ó?5nTWÈšÊÌ÷^@ÚÙÜñ*ÿæ’¾¬ŒLP‘Úέç̼¨”ŒÙ„w`Ãh³Õˆsb]QòriÍE0RÜÑ ‹)ºs[#+J”h*'W寽„„òs*_ëÎXÜ;ðaà£f.«ª¬žk¼CBbð.›#Ë©õu¸Sl¡¾¡VÅ:Æ\ÂA§¦#¡5R=(ªiì›ÅbâÏu šä\uˆõ÷Á|©¡íŠ€@×y'­ôÄ ®",åy9uo"‹ä*#aÂçÐvîÓ6‰+ƒK*æY;¨Á÷;O“ ~Õ: Í|Õþ9:- ,å1Í[Æ ~·ßç:iïùnWƒ*ddË™À'ß—•pìÙ¹n,_“߉×2ÊîÒºŸùo1•Î4Ǧyýóúaê/&¬²ÚéáJˆÛëÍð“ŸLB¨Ì¬q.‚H3£N‡Ñìa†[ÑSôc°¼ŒÔ…,[¥Î÷.ŽË¯±¿lñä ÌÎܶˆé¡ƒÓˆ‰SË?¥Ð÷´:rs=Å«+¹´aìF±.wölÑH‰¥ãæ8¸Õ#R÷ÖšÜ4ºJ÷oÿÀâ tÕ#MþÑ6áÍdzlú+‡·3IÍ.£R¿ ôËéîçUß:úp¡¡¹{» Ô¥2âÔUž'olÎ>ªÚˆ‹Ê‚3€ip¾[àyXêí,ÒBBë̤ä=ír8ëi¦æÈißö)Ͱ¢O‡d ¹–hU&öCpÎKî¯fÅò*eIɧ·³~ã{1²Æ+âZ;Õ<ÙsÈ(ЇXηŒŠ-£t63D ºoÏtu _rÑÔè$¾y-)Z0vfðH㣥 ¯³àÆ;,–À–Hò|c›*ߙӤX^yY› !õJe4/níaÐ~A?‰ºü€ï•bÚaܱ n[CÔ¥çüɇõU*Ù÷/ùÏiì˵ìÚ(Wšί@Cöµ"\€ 6¤‰ÍjÝÀö+^W+OˆhÛ¬ïjiX(«`÷ ®; VÛN×5ßôPšÇ[¹$Ÿ­ãiL価¯qUÙ‘±©\$ßR[ŠðAÓä9«Ä“ÞfªZHu?Ei–°•x+’7¦mUUë%†Íè`f,äÅò‡—ÔWd§Hªƒ1xv/ÖÝÁ þÀ‚S¤ì{þë¡´üÌÊWG½¦Üx”ߤHƒU?›«Zö²¼à\M™%Ãl<•™$ãå$"´‘‘jºSBfßÔa· Udý{¯ÜÙÓ¿è0©¿¯É´óæºG‚´²rq+®Ëþ}Üí`™è+S¢ò°¥0¦õZ FA$aîÒxƒ³ètƒ Ž,Xixšõp䥌”LG:hpŽÉ)fŽ¥ÞŽÓ%³íIÜ´“mPA§Û lXFŒ"˜Ø—Ð8œЖ4Þå)ÆV èΓxr°ÿIj„n6“‚ ç¦J1lݸisìYBôN\ß@‹>iÈÿ[?¡˜9¤LBE2°óŽÍž*ߘJÁ*[‰™¯>…áœÏêF(Ù+\Ù×’IÎÊŸ¾w‰½‡)ôî«jmzà€¢&øåˆÆA-a¯´[¶]g? ›fö×ËtD€/Åüòé¡êKwÚ·–Éq<•¥ŸÕ|ø~âf˜ýz ?dÌñsÇ ë}å[¦;K§y5õà§R?ZÑ=|ÓEÆ|ºqLªDUAõ0`×ò¥:"àk ûÞðA66)é^GKP‚—`å¦(éîQüºÒ„ˆ±øè½\?§ï8v,Ï…bÒ¿,ÉéÐj²½ªR‡÷aâ'ÓIPÙ¿Wî7~r“W}½Ú•as_%C)m&‘S6`–avR²‹à½Æâœ/ m>þ'ݵ×ÇPn‚RL‹{ê§€A{VZ@”t€”:µ¢»hËô£tÊxðµôwë7ý¹LG‡‚rÔé6­ƒ•¢UÑü—èСOô¢½§CÞ¥=xMBÌŒ´Ëaô_.¤³wÔ³ýü˜Ÿ-g\]•êFÜðA²n¦¥ ×Y 3÷_¦W •Økò©'mÜYE9œRùÂL{)"žãg38>£*)¾'cˆõaâ”ò, ïïÓ‰ªï”GyõkÄÞÖó4[T%2ŸØ£]æÒ{>‰ø.N¨­1']í†æN.nEÿñŒK¿|9c!,Êb¥Û¹î|þuÚÍ+©…˜uºÄŠ&1ƒ£BLÆk6Û† Ì—42U‡f§W¼þ¼ä²ïƒúYÙl¦ÛÐö÷ÁcôÛŠ6‹éƒMžˆq꣬c3§\³üœVíÉç)þ‡ƒ—Å endstream endobj 290 0 obj << /Length1 2003 /Length2 13893 /Length3 0 /Length 15112 /Filter /FlateDecode >> stream xÚùPœÛÖŠ"ÁÝwwwww§qww N 8ww÷àîîšàÂeï#Ùç¯êÞêªîSÆ”5çúª«É‰•Té…ÍL€ö®ôÌ L<Qy-f+ ,9¹š•«-ð?rXr  ³‹•ƒ=Ï?,DÆ®21c×Cy{€Œ›-€™ÀÌÁÃÌÉÃÄ`abâþ¡ƒ3@ÌØÝÊ Ïq°ºÀ’‹:8z9[YXº~ÄùÏW•)5€™››“îow€°ÐÙÊÔØ oìj ´ûˆhjl Pu0µºzýŸ¥««##£‡‡ƒ± ƒƒ³…5ÀÃÊÕ t:»Í• P0¶þ»4Xr€š¥•Ë¿ªæ®ÆÎ@À‡ÀÖÊhïòáâfot|D¨JËöÿ2–û—àßÍ030ÿ—îßÞYÙÿílljê`çhlïeeo0·²%ä\=]éÆöfÛº8|ø»[Ù›|üº1@BX`üQá¿ës1u¶rtuap±²ý«FÆ¿h>Ú,no&ê`g´wuý+?1+g éGß½ÿ}¸6öö>ÿAæVöfæ•aææÈ¨noåä”û·Í‡öÌè `gbbâäà@OSKÆ¿¨y9ÿV2ÿ%þ¨ÁÏÇÑÁ`þQÐÏÊøñëãbì¸:»ý|þ©ø_ËÌ 0³2u˜-¬ìaÿ°ˆæÿÂçïlå Ðeú?fÓ_¯ÿ~Óÿ˜03{[¯?æ1£–ºˆ†ªí¿Kþ¯RDÄÁàCÏÎ  gag03³r8Ù™~ÿË£dlõï<˜þøJÛ›;¸ÿ•îGŸþ“²û¿g€êß B ø_.‡É¨þ º;“éÇóÿçqÿÛåÿß”ÿÅòÿ:èÿ7# 7[Û¿õTÿ2øÿÑÛYÙzýÛâcrÝ\?¶@Þácìÿ¯©&ð_«+â`köuҮƻ loaûß6Z¹HXyÍ”¬\M-ÿ5.ÿ’«ÿµh¶Vö@%«¿®=3ÓÿÑ}l—©ÍÇõáò1“«€Ëó¿!ÅíMÌþÚ2v€±³³±,ÓÇ(±°³|˜?ÖÑ èù÷ì\?\ÅùÌœaÿ:Q£È_¢!N£èÄ`û/âd0JüAÌFÉ?ˆÀ(õ±¥ÿ Nù?èƒSῈëƒSéúàTþƒ>8Uþ NÕÿ"îNã?ˆÀhú_ÄþÁÔÁö£¡ÿ‘üÕWF³À8ÀÀ@æ Û2·úƒÿÒþkôÝÿ¸³ÿ¥wpsþ߇‰Å?à¡å? ;€ñìL•Øü~$oûøQ™ÝÈüQÇ?Êú¸Hþ Ù>l?5ÿPdæøGýqÐŽûæðFüUë?gþHÍåOaJ—KèúƒÁõú#¸«¥3ðøÈÎÕÃáµ¹ý~Ôæþ¾~˜ÿ‹ýÚÔÍÙùãZÿûÊù˜öÿ࿟!@ 'ÐvuÉÁ”7Ôº>´ó©VσþpŠžüP3šÞgÕ¹Ëí"T2uMVð¶óƒpòh?òƾ8Õ½ÐÑ›Ïi[#TD{’rÇ‹ï«á•ÙÃØ•Ì¡éÂSá†A|z5¡#ß7'_ ð6Ðò\'7.D¥|´'ï’ž ƒåëáK‡ÊG5²p¯åsô±ê1zA% äy&Ù‹Ø$®ôÐ4¨WžH ÷ó¨9ÓïD2_haýÎbY‹|tvXâž½7+ÕX\zqÈpt° ÀïQ'f)|DNRd°–}J‹ãe£‹Í –ZºŒØêˆ{VùÊǧwDZ‰–#íφǛ*ï‘‹Œþ°UÍéÆFÍmà,™{c6,€uQî>~ÃôŽ®ZÈr²q=Wb‰HH´% ½§„ì>‰8IYæXÁÉäöŸ£lL|ú²Âb’çªÛçcì‰pÞ Æùtí7=-iýM÷NMû\@m”ÔxŒÙ’8‡Òèü›æÈP5ê»(^Yì,˜¬õDݶL7âû€Â·SÓÁ5¾£g!x°e'µC·Ð³r]àl\†5LŸý§qÙ—(RÕüZݯ§ƒÙ"&¨‚•ò Á¡õœ5¥ÆÆ…)‘ù”¸­w%J%w)~÷‡^Ûœ<ˬêEç ¥£\;" Jí3¯ Axe,2ÕL K~Ã)å û¥2D¥‡TÚ>…–ÿéûê\OÆ+™ãZñ ÁÆ-wCŒ €ŸSçÆ¯,k#AŸöÔ†­¥›>ƒ i×DßM³½ß»ÃVŒN¶úUCL‡¾&¥¯:}AsM6ű©þ"¿µ9Ï_Íí±èjIñ´ãK%ñs¾¿q&'[aÈ1D̹žA(:þvÚñr ,Ó#ÖAÖÚqœa.›A8Ë3CˆsHÛŒca{è„mãŒÃ¦à–…Þa„…ž«¼Ýt²É3ž+SŒ¥të7Ñy–£ vçj¹ø[ž샆‘_;UÝ“þ;¿MsQ—å`Jw"ш͹ ”~ÖøAK–=T @¬¥¡%7§AB³%upyÁÔ¡ie°Ï!žqlPpàùè¤ü« *F@ÕjüQP·ü©?qc¥HæÐ£†ÒN/D@¦²Ý®+À‰%‡‡0’)ÿVµ»_æ’ˆhÑ6ôM”¯‹ðrꙹìí]3qPUlI’ªýsáà¾?il€! M¸>Á·&=«+bŒg™I«¬1§ñ4;€lÀ¼+÷³ê3(¢ßC¤•¤‡‡q (Ö.™]}¸;²·Ž2žÜâ1“ÂO§ŒâuÎQ79ÅÎ)~“€Iÿ‹WÃM˜7Ñ`iA>öë"85xo—’Æs?79£ù•ÀònÎo²ÝópàÇ7á›\^Š€hŸ››„Bß\w#jÂ~±p||Ö¼Õ£dY²dô‚˜ôNk@}FÊܦË@¶VÇμÊ{dRQ¿Bsà„iTËÙ—ò W/1=ùFUn©•+åØÎÅlgó;ɃW=vöˆdÒýUw Ý0íéFjŒcLÙÕ"üFû¶ô*y\­:.ŠNc„!3²ß©›Ép®Œš¨A+^Ó==ß±K o+ÙZ•e}¨Wù'AÂ4Å:Í:p?×t2W“q­BéHBJ‰rï&ñ¾•¤Ž$=²±ˆrDJZãÛÞ&ˆÅ9:á¦s~ïAçÔäXr+²æŠ,H›ÕA{;*……Fõ„úFà{—s@N̼JE›WŒš-¦@;åN½Ôù<ü÷l0ýWêçž·:Ø^7ZtÛF³û¶¦­Þe¦r.I˜Oj2º<•îS¸¯aG1‚š‘ OÑò4íµ V—ræ·æ Œ%‚p _§& '‰s7öD~ºêß{ëuaeBTn}UaLwf+<=9Å”ÿUš‚¹’¹,á0r d§ŒÓ¿ hÔéUš$t[^n.v®QJ0Eš’K¢¤Ç„6Å@)Þxd•ô+RÅ9¦ÌXË‹·ï%1‹ŸË]¢Ì¥Ïlý¸¸!ñÔí!¯¨–P#æ"“6®Œ×Þø«/Ä æ%¨Km«»åŽ¥ZçKµ‚Ëö\ÜË R@7¹HÈšeÌÍ:þ2Ýî­@ÎQî­ÃÙÔ5©ìéĤ\@kË”r©ú$'¥LUóeÁpæìM•)³’ôfÂî#ƒm®ò¨õ¨¹uN©R#,óE‡· Ëhufà–<­lKhÛа9É#«Á÷Þ—‡Î|Fξ*þqúcòÀ¨£û|‘f|!û#Ðwa¦ý–½è*ܵ9jKð> TùiWdÛa <ãw–=¸ï÷ñòïÖ½ÇP¥9ð+xgä `X¡ïkŸ%÷FÜ[‚!TyvNyd€Ž*CÍ£HO{Ü™ 1¹ã›|Úºö#©ÍUwÃ[`q§Ðèó;Ý»K!\?É~õ’¡gøQmà®Í·ÌCóRâcrÆáªQË‚á•<ðÄ›¸Kî§É:B×øòßJß?“XkAth¹€¿É;ã®ü¯i<Ë^”{%9!>£1ǦÍ$UŽü2=O'ÈŠÚ»ïÉ™rÍAŠ×ónL|ÅÿyŸtíå n4yÔ­+Ú$¿•1i[²§aƒ ¥ô¨W¦gd²»¿HöàÌßM=)˜ÀXŒûÈÇ—é€&¢Žüót•³š!—½l[¤y_EÞPÄmL‚­AŒ¶OAà‰ÂlqTrZé”f“ÌŸ~CÐaî ­éܔҽ¬Î80oWuš+°úÑìq<çEúf–ñÖ?~ŽLî2¶íŸ©|Ž|š×§Š»\ƒå9¼1fi/œEÛØð Ë=Ü—ÌYú-TÏ3”g[ùkÐÅøˆëdµ[²}N#ʼãN¥3o£û´hB”Ϩí"Ž^ðâ^Ÿ—þöRÒO•ŒÐØþq×~¹ÙÆòÒ#ù­&Õ+DâgZè–ã@# !z[Òw?iš­F,Ñi/Á EÃQPˆN¶TÔWž½ä:ñã\ ýPææ9«gº’Y &3“cÜö3œ÷‰œ-s6Iƒ‰J›D*ŸãIž Xèô¦ß[úô@™–ÜäqÓ EAŒºœ× ËÑGZÔ©ü€¨_C†M.™ß†Të±²OèŒ]K½¬@ë®g'œ·‘7ÞH°â¼Z åmESäËû­¬—ްæˆÙŒXÅêå8»™ l_ó>Zµ ãv_DbÀ:HΦ›ÚÜ+d.D?Ùåÿr_ÆX¤fÉH^OO< #=Gàxžõù} ýZq¼Wݬ'á~¯~¦I×h{Kî ¡kѸ€|fÍá_„* ·€±A’˜h`c+Zé…Ô¾AŽÿ›ˆz†Ü¾YsQ"K‘]9Ý«*`}áØÿVÇ©ë¼lÈJ:?,ˆ¬8Gt\-“Æ3¤|Pÿ¥ü8…úŽÈ*Ô•M'3EdAßî02HcäËšâKRP`õ}'µˆÕï6Ørz0õ¡\]óZ5-ÎFÜ0ÓÌè hõOŸé-9/¹äóÙ¦âÃxŸpóìO4ìZÿ¶sv¿ÏTº‹#EHÌ…6 ô¼éØ7|ì(—hýžçU^žR{7ÍŽ4«"Äèc~ª,zíWa6Ö =²ü࿲ïÜðƒ¸œ­ã-g6á¾#Æ\©À¡å<°G~žÖ€’. ñ‚Ãq]ÓÇrerôr”1r6ãç„õqƒªßÜïs™o¸Y—ð¨Å惨Ý%k,˜Ò­ïL9'a=•9K2êhoU¹M/|kƒoß¿'4& áRÏ©ÍøÏÈê€ cüRb‚ˆ†”QÂô§ðçÞ£(ÚrïÛ3x'è¦îŠÐb?Æã·W˜ 6V@^©/#e†Ø[r‡dÞ°p<dãhà ’zø‚yJüû¶Iáî­Ï:O‘ ´ }µÛdóý°°-Ô5OâÆëæ¨áðþšâÒçÖCY—V'J&1ß©–¶mWîrßΞnÛZÞ^Ü\Þ®TE’ FýSU£6b WÆ“BViÁ{¶,ržþ÷BâòA,Á@Œ¨ËcÊea†›^>¥‘þTÁC2F“ü}rS•Æ ð]ûNâO4!û7yÜèè\QD Hn†jÙ?3˜›á‰(.h €… %nÒ¾÷Ï¡´ïKLeM$p>Á±w[D ¡Øðç\ãÔÍ:0}“†Æäfþ &û'²š §ê¹Þá7 ùÑc ÙáùtÒ€à…Ì1˜­@óëqÕ®é~Ax/-£­Hî¬?:¸wØ#ýQ.\·D–&š¦i‡sü Ú°H¬Á€~ :³@P=2ÞâJW|5•^rty®>±³€Ö¹mŸH±FR6¸§1ã2=kÞ2û"d³±ÊÉIYqøJǤCxãy‡ CQ,Pæ%3DÄ×±WcqqÄ 6’žb>ÝŸ£•~œœä+íéÇ6Œ,ÒÍ6‘”U%à&|"ɨ¾Ã¼Ú{_àª{l{%|VÊé0²ŽŠ¸aÑ(éBlOñ tœœ„j0#±ÑE£k/è9pÖ|oÔqNêuY†Ë|žZ'|î ð£>†Û6»S·—ê>mC¼r?,!‹¢Q–˜ÉõueQ²ùÕýâÂ-g2dœí¬}†¼Ç¡_œï(BÏS^ëÕ–6 iÇïøL'ÇVÞ2›ÔsmÑ‚óµ¿t(ˆx\‘ÝÝÂu†{Ud ]¿n†gypÐî²v˜PKÚŽ3¾VK/å/"Öq£"aNÑx-Zã´nRÉaï®úQb[fÝÄ0KL{4AnÛëÞw&XµÁiµx§ÎÚ³çÅõ Qµ9Íä·³8Ð 7#¸êZ–“Ÿ9V»oí,hN±Ô¬a?%€"zKÖœ¿¬rç¦*Þ޼̻ UßIV^,ŒpE8$aßFNE’ _GÌ´.šÐïãÚ´Äý@ê²ÎÃÂŽ€š¨†'9¶¶ÊehoV¥¡A‰| ¸¬ é¯:à¿7÷È1·”! <¦°7C¢|2)Ä«bxòmøH‘?ð®3ðEJëZ¤}‹’asü×2kÌeˬl<‹ñÞ}vM­¸yÖ_« þvç6°*ôE-ûÎRu§.)k‘k¯:%‡•å Ÿô÷écåó7cXRO|3Íu¥0Êm7ÂY׃Æt·#¼‡%—!Úo%)t'f³z·=±iç5 +½'m¸âý\ ’‹ºÈshˆæ%^BœZº¹ðÈÑ P?ÌP5)9:d„K_$ïe/áÈüE âˆ÷ürö?ÉË6À ·èð<äât÷!|ùâà‡>Q-¡œ·Å­ƒ™Ô¢d© …9u´æÞö–¡^`ÕÊU½vÙÈ¡oðøõJzb ³2)Ä )Œ&C…¯oûf¯™ä’‡üÔ*ý š¢ê%|µI æ+ˆžwƒ¤??­ñT—qã¯åðªFØwØð±ùwgîrËÖé‘#‚½û®9r8Y¾qÏ´=7/cÒkeS,®ûg²]Ãâàþªößá‘êº}òfÇç§ÊÝé¿·Ì#¡fšÀìþDYðÝñh] jÔãÙvŸ‘D$²ÚŽêk³ª»ëQòÍ †°]ù‰ñ!yõ¥~M=½¾BØúÒes‚&·£Å€¾\.Å[eã9HÑlàO£ƒNuÊlÑHÇÉ ÿÇgËVæŸã»óW*¾ˆ$à¼}ïG¾³D×%nDßÐC¡tªÈ„‚Jæ¼qœÅ0NÉïVßu4Àô7¢‹‚óˆÈ´rÉSä£ÍÃõ3°«hTâÂðÝÌÛƒ0¥±-£BµÏ/ãýÔ¾27SË.+1 Œ È£ÛΦ9{~êľޫ{|î õ!¿:s3Ä Gv¬_ü¤K€ ÛÔ‰Á^àoÄzÊ,à¸}n|Zeýbæ 65ü3bE§ZFwäwí¦îI Ðp©—Õ>Œwf3_R h¨Ç,6¾Ä¶¥K$Ï,+ÓíRà@¤ *Åq—P— óÛzÙx¨&­~mèbò› ­J0é®ÊhyÙá[êì9ƒE`d:J8œbÈ̪qͰÅ1˜Ì>”ò­´‹®íÝýg/éàÏDÞ¯Ó[žßW•*u0÷ĵ±Üž-Ð!…_!cv\Sõñ>h ¸_^‘ð·UCuò†fÉ <×`3]›uA™ova›Û×'#â=¡â3â“kÌ]äj¯Ê^Ï.7{÷*!𛬵%ûü>µ;·ñJŽ´©^Ðsñ'5’Û“±L# °`f×m2Uï°Sk¦»;ÿt¢¶-¥´ŽÚI ÿÅÔF:aº­…õé:/ùw%=UMÄ,5,Wº2ȯ%Ц‚œô2ÍUL–yRÛ’"­¦çnŒ±žw¼ˆUÅïzÕd¿ûµÇéÈãìˆ,ͤO^µu á)Ô¿z+¢ç `©Tö.O;ÖÇÆíÏQ¨ç=[ê$7Ÿ‰Ìµî}^€d_ü:]o¯SŽ—iœŸ•kS7—SÂÍL`º!{½ªšéª7,Ô¿ÏvæŒ ß”õíàg̹½ÇÞÖ%ª^3ãŽáR^öš]šu¯[ô'{I’ ™M2¼ =¢ôßÈ@÷`Þwfª&vÏÛ Än;’E_‘Ë^”ˆ«eÐÅÒ‹ÄÃæÐnîh\ˆ^)¾,]ñà©:S²íL4­…pý®3ÿ>ŽØ£tzYüÑ;¹/!(úøòÂq)/@ŠDÒ¨Q‘:ò}'cz”Œð ºÆ Õåò[dÌ1˜2 «æy·œœEüm¤ —Æ0ÔƒU'¾ÐÇ/ x L¹¯ÃËH­¬W¬Ç«ð3õÃ.DYEŒ?nŸ0¡¸IÆÈÆæ*üÄŽG¶:sp¢•WÒ`{E?£¡žY• üŒò̧íüdYÍßíÄw¿¡†á¾Í,Nÿ€wÑ€h= Á·H0,c/Ó>­ ËvE†Íˆ{6å(ñ[xÃU‚¢Ó½P?bºrAšù4Y&]ò¦Å‘™?eׂm8È5‹í…°S–ò•Š©’9:6l"8Q%ìúŒ|KÑ( M ¯U»^,úÛ?ÿ”di‰ 8Ý…´ªõõv…ùmæ‚!â×pÁÊX“|UÊ»‹ÝwpØä-Mÿ*¨ÓÈdbp“ù Ûži¢H*y]óæÓ/.åÝ/”r 5¤ª5^³ì–PJ¡FK’J¹ihútØQE-Óöƒ\n ‹Ž¬É—W˜ªñÏ %霫4‹+¿\Jfä¥7-°ûÜO!PÜ!P7º2}1§1nÒù ¼âÑ3 ’þ‡ðô(ud¿N²]Ö¾ùê’ñÎÆ6Ho‚ëˆ-êÞû¬–‰&”\è3ý° xèžä5‚sýLrõåhôÅd¬Èï)êÒX8˜Î¶ž#˜ýÍD˜b<"‘M˜L((¢HßÛÚŸ]³¢ÄçøV8ÞŒªd6Ì‘eº‰¸FŽöª:L¶&VYª6J …x£ Œ?²é…œ6 ÆjOñf²KÖ ¼tœÂ-ã ½á‘ó䙢]Nï6t ñ%BÔò2’¢&Àk´ëÍœc²¶»ÕÞ÷ëOœ©vÍQ; ínÄ8Ðl¹“·xg…­0˜ô׉[„?KHNŸ ßcd|¦_¾$TÌ'v²À¤X?LÁ[¦ºWêB#J{ ¼Õ9YÜ_BÌaÄñ²}I¶¥¢ùvÔ/> Å*¤2BcŠÏ…( »-c, ¾¾™Œ0þ:|S!*µ|ÞR…,Z›(ȳ©H Ë{›(Fõv¢‰Êí'£€cGŠŒœ”Ç5ãíôk}$Ô¢ýæAä‰pL³ü9VÛ-‘ñg÷-Uÿû-GvÅûJù™Ü¸’!ƒˆOñëýh´ôñU¸ê=£4:yÍ8™!6U¡Ÿ¶$t?å“9¯QuPª¶í(쨳 ”œ®Œ 哌o4軲ˆ•Ê^tâ—Õ¶0,Ôe^4Å^xìr<ÁUCk™Mü§]­ÁéÌHÈ„ª¬oða6zž”ö•É®«šWnnÏw§¸A›K†3S_p摵9å‰Vz˜ŸÒJÍ.ÔÔÜKo®|ÝuïKZ-ßïõG¶¾’·0·º€/rð…†r¯s]íËA¥ŽDœÑO¶·,ìܨ#(že6¤Y4m{[pÎÌkŒ£²y|7”˜¶âfümØíòÛ°ŠQS^è•è:˜ÚÉý\(HÌ!@¡ªŒ"%)c9æXÕ8-ÿ8•aïFtóúe Ëß,"YÎâöBËö×WS>6NdàÆÏIÐT·Ì¨8»/ÆŠÑ}KW( ï^ºógKËLÒƒ¾Ž$õ‚¦h–×®9H=6®ÁìHËaé´f-eª_ƒÊ3ÔL-—Ù„k© 1JE‹ñ2K‘`×zpy—¡ÅjþólTnÖ‰×ò¾H(‰3UÙíýŠ6)¶tv΀+fO);åúG·Nž8_R£DtK©ã \TOˆãmO‘íÜ$Z`ß»G¾TÌhʽòÍwÝYÒt6H+Þ=œ”¤ {O9¶Gq½ïb !©˜üœ¯Ù^W?Š_LÓ_–ßWW©¨iÄÇ‘Ý=&õ—l½ô7’VÉJÖz©î®Í ÙLôìíµÖ6¾q—x5n£ËD_VZ!¯¾¿9ÍØ]ñŠqÜG1& —’LÌJ*Žú©|SÐä]–F¸2-l 'ÿ¶:`NÇŸ›Ï?Ü<2ÔØðâõ“{ίîè³éUz³èÊ9-­ãQÆ€ï:éªTâ ‚4>pDŒ%} –û³8É•ñÎvª6à%˜­g;q,K ™Ù Œ+’ª¼É±uÀÊG÷šëJdx:kñån*½áGH¾òÏïTž_.ˆokÞ0à×c•™rÝ…#ÔL•«"ß¶ÅG½%?—t“õÝŸ~yÜ>ü^ÏÈúÍA\LÎ}LB–~/nÂÂàÄë3»ÜsZNÌèØE=5#y=P¥¿qçWI¾1Yt®=kó:5c°J;mîÖÉE¬@$C‘åDjc àût»¨ÄÊòœè&j•žîvÎB©~Õ [õüã>³u›Tº¶Î‹ÝG¨øô•ÅÅH;ˆ2×Ch§'ûUâ/­úAS‡-U1”j¢D?J,aæ©QEvœšæ1ëùeªÈ¨n˜Ø6 ¯ç»æpßð¿1“ }rRÖ8™]››ùŠW”Ìâ¢I‹¼ÀÑ"š"ã(¼ãV±‚‘ÚLs»B 9²•;f3Sñé×HUÐ[¢Û¥HcPX£ë¨¿­Ÿ¿mé'Ó!Waù¤u×&”ĉý5‘í†i¡Ï÷«•WÍ1Gü $!$3c"RÜÈØCšP‰‹%Š3Ùåë€^Þ²/ý/wK­ÜOªXFHUÍ'BYmÝÞ;3¦¾)‹Š å0R+ Ö!yÃmÑ2\Þ’Ò7ÄÂÝØžÉ䤤îHHwµ[¢µ:3¦ˆgmy%J’ŽË2åröKyr]–:Š>XÀo½i²0ÏºÏæJ%NŽï¯qÑ–høÍ?ÉD}¢×|l©Vgw¨crꪼÛÆ˜xá–¨¯3ÈXNŠéuš3º²$ÜEhñ(úÃeçA8°N<¸‘ÎÍŠU›¬‹Ö=Îκ8l§!æ§7ˆñ¤áÑaÙSñQg?ý¿Õ&t;”#y‹d¬–j3ŠÞF »òv~p+×7ôëÀ:‚¡mˆà©±#Xƒ´Û^ë‘©|#|5"ù‰Ð¨¹Š‚eƒ,ÿcضªÕÇÌð. 5®øHÍô[¼’Ð}¡ ‡‡¹0ìHïl ‡Ñ‚\kF_ŠðͯÞ}ÿVéI,”.Ùਯ ?-9âܬ‰0$ Ò}Iº‘'•‰ÁÈó]·³¥%k0Dмºð·ÄiØ”Dl¬Zè($Ÿ="›_` ˆ4Û…Ò _sü±¨ót0Ý.Òòn VÎøÇÑ45ûÀK6<Úí(]Z»X šV;ƒ… ‡øöHÎÛ°3”K›qqǹý~¹Í7¯qu&>¥Ý -àÔ?©úÁ޼ª§V©öеmÎS'!Ìűs6©‰ÄO<“+êt"ðyNïüò|Nn.XauÈDÌ›oœ!r‹`äÐhØå8t£6è:y±}À’òNp¾ ÊU¦–È}§$5`´…Çé·¢Vïe°çϽKì µò ϶víÇ”.<›d‹Ô± fo›$;pSpA=ô¿ óå(Ù›â ,o¦G²JáUµã0´_ —•w¸ÒA£Û?¦~Zé¬ ‹ 0¤ÈîÒ–­W éEýØbßñ0DŒ\/±š¦ý =ºØjàz‡%$µé&Ádd±ž”ãà ú_ß^'ð#TZg ´Ž#Š)uqr71ºplR*üô¼‡tmš „xÒuyç÷ÄËE4üäÚ@Y›üt=ôd_E—K›pµ¦àV+®H7žê+XkæªhcF[ã|—èKŠe—?’›Ýñ¦GªjŒ¥DpI#UqÀŠ`_¯=²?kþôóÅÍl„%íý²|8¤ÂgÊ´õ¯Pq¦„ÀMFÿL·ò”5‚¢ Ø.crIÒ%ÛÕð n…!_‰´çŽÓ IÅô¥>Ò]è²­ïÈ&ÀÝtnÞ´¼o7ÈN¤¢§ò¹Ï ^á2ÎýÝF²™Ü„±Nóp4hìGgVìBtÝÝòùÇ'++,5#øÏ–}*½[.–@ha;ýj>‡†‹ëY»h Cb ƒÏ *4;`5áŠ9U€„‘âãË !Ù7œÛmÙ¨Øñ.KŒŒ;?Û2É’A†‹þ¨f2c&å(ŠèlP¯ÖlÙ€h/~Èv&{¨ÄF´²´$ ¹TºÝ€sŠY¥ ¥Rfû™qŽ˜öélÙ§2?Ôà ÈdqáÙp‹ÂzÙªXÃL«ôš _æ°",gŽk­ š`z¨œY率Ðˇ(Rïð÷“B¶—~­¬c€oA—*ä£U8UégR¸G*Unå••ß°cvY^Þæ!Vô„ ó·^8!ÁWIíTA:¥Šd\;%AMIÐ6Ãr¶:Rqµ&‰Þ·ÀÁ“†’K5/Œ”o6…‡·àiÞ˨/èC‹-?Údºã×=†Q~Õ¿L0ó/4HuŸN„ó9cà`'Hî^pÛ ÅFí_ÆÏ•Éï<äs]’€_ öã÷ª×/£Ã™ªJqDI2m“Mcm=™A¶4u g²›³Ôo_€A&Â"$¼sÿXø­“n@:’·ãE5ÓŒNgºÆg³–ô…„ùr‘ã-—þ¸Ž]ƈÔ4Юµ÷iÌì;·w„Öd8¾SjQM|AÕ#]•ÛEðbeÜ[ƒ‹«j·2úÒ1?¼„QVXôÞ¼ÏP’”³++>rÈR_[ÞºDît’ ³‘_ –WêûíùÚ7‚ÖÜ\ep˜Ç;%hK/]ˆÖQ"ä³£·ŒÒä*£@6ñ¢"=ºhséçÒL¨å8d’n¨plß›°TJޱ,SåVšâp/ÛÚŠ7…—d–2¸âVù'”9ÓyøÀÄIC¯(Z®Ï,H0I*Fcº´4&Y®Ÿ=áݾ–ÔÏ´ºœæ˜¡^[C+³ÝµØVq^MÁùkƒC=Ÿ°¹Æ…ÌFWhB¶Õ)ý£7žhãÀw xƒÑ¹àÇ@«4öTP_“2IòSÐ\dêú—¥™šëËĉüQº8|™/æ!ìmQ¬ÕðÞ¤J¦}·Û‰Ek**KÕzÌáÙZØdÞùáS¤Ádû a^5- 6b„?#ï/Á"÷2ñš½Píƒê³kŽ¢Üg¶âO§> mæ½€iªÀ¤ÃÏ/ ±è9#J~ »2IfÏ«Vÿتý©¡äËŸ ‡’¶E)OµtÁ2鉃z;!â˜ÏÉv)²OôÚq‚'_:BxYX×V«Ï(YU™î]®uÓY‘„ôËÄ}Øi¨ìf4Ú&’ÆE®6"Sì÷ö¡8_8ˆ÷…Æäï+HÒsôtC®– Ád3èh?e F‹÷/:‡dìâ}g›øžVåÇ!ôÖ†ÖÝHxj¤ *ú9Ô§NÚ÷@ÿÕ{²:áÜ?œz¿ ÝéíÒ×cÒªPDŸœº'ÛÓÚb´p÷ԉЇ³gÀ-ÁÓÅ­:#6Âæ{‹å 2ȉÈ+ âJä¶E œÊükPÍõÄÓ·¹*ÐJ°kwص…ŸøÒ¤$öx~ã8¶ë‡“v´U`K(™i“ÇŠ\”í² ì@Îû–\”ý°nÓÉ6‡‰éŽ *Vn-Õ÷„|h¢Ï±hFGŸ~|’Ï"’9¶¯bÈ?b kƒÿ¥ !×;@­Ðú0Ô¦¬–­Ÿë2ôìœr£¥<ÛÁð„WtžOyÝ–d(|Ê£³­gÞ>ÄÑ>©êMôí_ïݾÁDqBæFÒå" e*ØA@6V©e~dêÖ¯þ1?Uçǯ±X Daæ]Nå<Á•a7Zã2¦üéÇZÇASjJÕ§#23L›P@MÜB¬Ýø±Î ñïƒn!‘°FÖ{yÁ1ß;_Áï¿ =jI¾†®ÜÉõCd\ VÇͱ•¿b ¥jis¦+bŽ¢šÒ´WÜwÚ’Í;ÉÚký[¿1Ë@¤¼íÛ¬…kÁrîÑLлk2~9ÆÀ M-Ô+);+¯w¯ÒZå!ÜR¸½Spæ‚“ì:ðÿ=L(í"•-SÏÉ@¯ž2Þ‡è4«Ð?`uïWŽBãuBã]‚þ³(6ÎtB‡¡Âi9= §ˆÁ•sEkni©ÿ]YÔÝ^„rÉJ¨…ü^àú¶,Åä0dý½+19ªÎBë®×Å–K¹z×Q·Ÿ\s½„LìÛ§0~[Ëøï¥”3Ÿ~L–6³,ÿ˜cI4ŒÎ£[G™BÝ”V¿aµéÿ4•¯M•ó-Q hoœW/”s,µ'Ô:d–#7ô5t2UZGJ«Ë(šx£áêR ò—Œ“ý}UmD(5qkŠ$¼£þ£3Y~Þ}¦]xYò;®¯ˆ=j^àhrê,4:ñû¥#vNT ë|ŒTi×Wþj}¿ä>¯Ä—0ÈÌšeU¥­WWÞgÃÔÚyºªt’à¡pã7™>‚|%snÓµ”ršºvÝÈ/N¥vÑhꘄ¯P|™YÏwœ}kÔM ècŒÝ8$Œ-/nÚy´¯S·$yfW›õÊË»›[ÁLÄ(1ÎpZÍüænôßSL!Û?S5\u®ïÀß¹ sÂaü0l]-˜°0™Î~/ÃoÊ6 )×þQ¦.!«‘ИñT‰¯°§9žZô<ßZ†ÔÒ£qâøø…pÞiS Ê¬‚û!ÛíáóÐ%N/ÏÏ*pÈšA/³8×ÑÄÏ Ð]š·eø¿ç÷=»¯¶K~›Ö LÅ7¡c‚<‘1€ Ò9Yuþ 3Pÿ)x!gjÎ]žG;+ˆR.Üá§-ÏD߆þíÕåÀ2{ÆÒ÷ù%¯£°/à€„üÁô¤¨ƒb%Ó‘²üô”žòè¨d”üzA Çûày×óVÄg³žOÌm½§±CKCÏ8=Ƹa±3ôñ#tèo‡%¤N~t÷¯K›,È®µŒóQ‡w:¥übÒy*Iaf>÷Ì™ƒ®„­“‘‚¹q Áª<éÏ _ÝP:a”®ãŠé5ÅU<ÃK˜& ÃåìHÕ@pv6Ò¨-Ҳݻ/ðtÅöøŠ}ĺeÒD‹j~~Ŧšì©Gœ'T\ ©ip'òÅ+_ÌYþg_Þ’pu À*Ó¦«ÝéV $B™“Õ!Ñ'rÞ‡ç2¸KÜ8¨_%Ü`­HGÂ4ÕJ»êsZ»¤±a–)uÁÇØêhê›»LH]©N¦ª j.1•?ycÙ³é +mÁÑÎQæ/‚SZf&{ž,ŒÁ¦]úlëp ÷œÆÎËOo›.~èåQ¨/^†ß-ç³Zå§0zèý9|å[¹ŽoÂ8iy>¡¼>8Nû%e.â*àCñU`»]WÏC-ž ÀY›1™é¬/?÷‡GAÍ8#©’j¦Â‰PÀ¨cárµƒ3{ßfì©Ï®j¬ …?×½_Üvò|\¾¾OÄ‚œ²=ËoC÷~2´ØOz{ãS÷ðÎP·@VŠÚcq–á¶`Ã|?n£óàÒœéwì)ɬ ¶Gç *Ü D~M»q7Ö<Ò¬Z­ohÙÃbZIMG*ÍB¬ôú…I/Và@%$ƒbå=qh’ª PöLS±EY‘€s bÞ–ºÕ€#i4eA7eÑ(È ãaóØÛx_IEM¬·Âv¡Ûüƒ¬~[¾ÓX/)ˆâg§¨€ dš«ž" ^ƒ•Ò|¢†ì;­dÇ:ø´Mò2·KÜA~ÐÀÁot"ƒø•M˜`ÙD[eÞ÷/ôðk¹×ÞÎMˆdøS°“Ô9É_¦è%ùBjÇè*äîñCgÂ6é6¦œüÇäc²®ÍÆ[ÂõIàÎT‹Ï°‹OÍ ûÏ­Y´qFweÓÅÑ©B:áŠFx¸U³Utû:ï»ejËxÌžëÁ}|ô@dÞN›V¡gnÌIå œ›µh=·4­‹Ð« ÏS1›“ò ÓR§JЀÝv>m\G8^rÙGRG 9g‚þÎ!Q¶3oè\Y Ò‘Tîy= 'û»ó§3Η*ŠMëóW!‰p!‘ZÖÓßÙ³¦~`F´T:\s=eYkÉ,Ɖ2Áùlg±ä·’µ*£«$K¸˜WúpÔãhGºûè×$9†®™8lú…e”k¥ve%ÅÁÇQ[õDc§3¬BR¿¨–„§¬ep…öò䯷/rXì ¿:­%"º»ÝÛ‰‰ÜAôߦ[ÑLLÖà2ñíøìÓÔ´m3s¢UβÙBZt>ÏwÔ{Ý­Δ5UnÈÑóHѳ®p훩ÆÀÍe2e4¾Mè Í7» u‰3P½¹ÅcW&ìh×ô½ÿÄ9[ûžÙ2®Vãà­‰QHÄlÂAÇ efeèYh)¿›nGÓ\9ÈáðIÖ{S+(½¡Éøæ\*¯¼!7È`¡>¢¢â6t½½ž›o[™2jc«ÊRÐRÞú˜7¦ ‹Ð[¦-,lD€Á~ž«s †áì]œMŸfpÝ„`[ñÛ¡“!vr¿FÜ\¾û–ž{-~5©E¼3™XKÉÉ´¯×+C•»[Ôq¹ª¬|½Á¡õ°±õz?¦ª}¾<åR᪋ܲ»¶œ´¿t>–=vL`YUGÍ[÷Îpõ´2׫{»UÎ´ÖÆàÞ#ì/¢¶XQlÆO4RobÜ1ûC9 I𢇳kŠ6Ê—•<Åô3Dï(è“Gä.›“¹®´ ƒ© x¶Ò  UÓ[=MÚ,Qñdìï«ÆíÔ×ë:è¤ÏbKšml³¾ê’b½Ë„øAE!KHbQÚ=M‡p¤–ÀáÂÓÄ£åH­ÂEÕµ].:t- Ó, ¼b@8¸9mü¤WDô¸Õ/\;r<ø–< °&¹mˆÜÝ:JØǼ€hІ’ˆGKßÌtÚl3àÙ‚1²5¡ƒk0Á﵉Ѿ[œ…¥æÕÔrÚ,cáS„´#WSPC£h¨Žñú—„ÒGÂÅ Ÿ‰RðºL±…•ߥ£¼ ?-Wip¬¸ö•^A<„<ü4 ·ëDzG|–u¢^´¤cj,a–ÝéF¿­« ¼øÔ§ÞKÄÎsXšâæ=>ʳ„~ÂmÆ:?$±Ô»¹áOÚò³£ÚŒŽâƒ/#Üä=%‹®Xìjr•^aè{ÝÓ‚¤Ó¢þ•<¢âçc¢Î1tMþ§1¼ Î7 *,?‰K™¸šüè%ÞÓ'KŸ¸(#'©C`7/%Ê+j;bœBî!ýöGÿU¤Z endstream endobj 292 0 obj << /Length1 1892 /Length2 12541 /Length3 0 /Length 13722 /Filter /FlateDecode >> stream xÚ·T›ë.ŒS\‹ îîîP¬¸»'Á]‹»µÅRÜbŃ;(îNq(\¶œÝ}Îÿ¯uïÊZÉ÷ÌK…åEX¸9²j‚lœÜ€rRS^DÈ¿eV@W7//èzš[³þá^ÃËø§’ýñK~>Ž`G€åK@?Kà˲‹©;àêìôóù·â¿2;;ÀÂÆÜ`´²!ÿöþ"Zþ…_.ßÙÆ ÏöÒ{ì¶?^ÿ<¾´—dïõ›þçý²ÊIɨj«1þUñ?: °'À‡™›ÀÌÁÍ`gççð¾<øý·S›¿Ó`ûm+²øÿÊöå˜þ“±ûß @÷÷pÐþÛ×;ðK×t¿›Ü€›Íüåýÿ¹Õÿ4ùÿëð?¼üßšü’q³·ÿSM÷§þÿ£6u°±÷ú›ðÒ´n®/ ~ÐÿRµ ­ØÞâur®¦/c ²²ÿçm\dl<*6®æÖõÊ_rÍ?fÌÞT»Øü±TÌìllÿ£{,s»—ÅáòÒª€/sóß!¥Aæ`‹?Œƒ›`êìlê…ürÅ/ˆàÃþ2‰@Ï?[ÀÊ»¾˜^ŠóX‚‘ÿ¸On«ø¢¿€Uâ7â°JþƒxÙ¬²¿çK·ýF/L¥€Uå7â°ªýF/vêÿ þ;Ó߈ÀjöñXÍÿA/ÍËj¶9¦ÿHØ_†ø/øÇò7äzA–6¿í_âZÚ¸ÿæsÿA»9ÿËÁ Åê_ðŃõ¿àËAÙü ¾äcÿ/ø’¬ÃoÈþrÿÊôeÜYÁÿ@®îË·Á¿Ô/©8þ ¾þWZì/]~§ýº{ç~¡»¼lŠß/—èú[ýÛÕÚø¯Ê_’sõÿËàåÜ~CŽý_îþ«ÓÌÝœ_VퟛॠÿƒÿÜë@ 'Ðyql.b[òõ¶ZœÈƒy{Lxšz[;•žÙgѹÝíñ#}UæûUçkñCß0—7¥é®Ä¾“ýò9l©G oMVm{ð}4NT›ÜnC^˜Àë/<¯ë#A"fÖÛñýåä«dÛÝ)Oë䯇®’sëÑ+ëY×Wº46·­ºSÅ£€òX:Å«côe†:Ï,k–€Á•™äö™'ÆÌÕõ4vÎø3™|"#²ßQ,çg½5ޏ»Yï•r —.B*B=Ø+ì‘I‰½Oòøó>ÅEñòaÑE–$FsM"í¦N\5ä‹B¥ÃãëÃûÆA’¥›“añæªÔCûöê9عu¼_¦~± »¨vìþÂóŽþrÂ-RõY/mIkç\0žOfد W5Ë—Y!‚Éo}QDE y•‡{îñÛI "MF}îÉ÷N8Á2"™su˜ˆiŸë¾³ãý.=E0™µ"<ÁæCÏ[‘ۥźš¼vë®áF÷±KbÅ+c®-žXÉ?¹(Þ÷µR¢Ï††gyØ\ø8ô4¼ç¬®Îâa‡ñ„œ·`jûÎŽzIX¨Onq'3õö 5ºþxweBLIŸhNN®¡ô( Œ¬NN‰+=×hy<%ø ‹ä´ªq±üçn¤Xˆ4JU²Eò¾+t‚ßEïz«ó`^¦£55É/ªþø¬1‰âT·(’Òò^R4ú VV4à{þ¥Á.ÀLÏË6òÃuú±©ÜO‘¾ÔÞ>ºùÏ\FÇ¢dðùUh´ ‹X ƒ£x“ ®yÕTþPÔ¡=“²PtN°µÿ–L«SITæH˜òÏ8‰Y ÛgèíL£Y»+Õ£Q6Ý Ú9u)Añò©ÎÄC~Ô@ëˆ8Ñ•"X¬ظøfyÍ \îo¤Oq+ýĶŸå%ÆÈ4u}€”‹2P.b­Îë©rŸÔtÁ—z?}Ê·¸1r¬³8:C¤«†_¿Aç"Ön-¸óí[Æ[S‘üŒ0pç™Jö†ø¡|"á5,²;Ñ7¶FÍZyØDJ°S&.ÎtdÇ^ï³.uÐjîÊÊw•K] ˇèüF¯"[ÛžÌ⋳I{¡&tѳ݊âݤpÈwá²J­¶7È: äMXw õç÷‚|DŸî <*=Þ3Uù÷8•­“~¨á„è÷ÙÓðIûU šcê}/£'I«ÃhJ~«‡uÚ†¾ÎŠØ)‡:Ñ#Èél}ÛL…hËêÒºÎjÄdLJšý•l†P2-»Ó·Eœ7¦Çncɱé)²^ÍÃL‘867ž ˆ-ç2nËEÕY.}GP7@*ƒËmžY Ûqñvþ«V'ûw/š§×Bw§rÓ¬¯m—x"÷Ú ßQÆ'6*6°“ò%ìOýd?—>«£×¨2‘X½µ¤n¢Y´ÿn„Ûygµ¼€ym-!àÏ«„î9b§$MÊî/•ºã •P3”B¼iŸÖ‚T³q¡W„šÎ©ô§í½Q1NÁÙUÚÉèFfBʆø3Ëù¢êùÂáedÕYCÖf]œµÑÙ¥ß ‹œKOʤ¥T³l=X–ìô½#„+’î÷¶T¤ç„¼ö´ÂçØæ¤Gv¬–ÖÅùNÝòN'#ûC­øÉm^‹˜¶ªêÞ 6ZW‡Îó3•3š/L¤f‘C¾´Âc'úç:¢EÓ™Þ“¢Ÿ¹7±Öª ò™@MüZfE¡âI?è¹ø®sǽã†Eär’pGø6rt$ÃeZÎ!­±«EèQpqv—V´–™(€ 0ÓÞ¢N@NÑò‹õlfv-…zûϬ"\Õ0t“gAxGÓOÜÑðŽÝL;òµkQ+Î<&QMŽŸHgÒf¿ ŒYÌÇìÎ._ Æ>6bYü ],/ã;€…5$ù°¾<ë Y?ÒAB2 ¡ªLL¡nƽlø_Ôoÿ;ŽÙ'öõë´BWO¯Wl!q!uæàm² º]ãó·ß«úz¦*9­9+ ÂY£«Å–ᮈV GKøÂï´ø®Ø GîØz]~äC§ˆ˜Ä¥ên*¤ ³ N jô—¶m.’꤭#`_:tcAuÙâ…//u£€°æ'[ʸ‰ï>Ѱ$uÊÄú÷B©5EñÊ€U/#Ý9sÀTà¬8§¾UFç}Mž¤žM:ÅÝ×$—1JÜ Ýªî.Ë&(üzÑ20¾ÕÌÎþ„ßâ;~V ê9›FR9 Û¾t”‚X%"çô г­»åRúîÑÿ²,eÀ#ëø÷™IÚý¦¡×tï–ˆŽi-)¹2F1v%?\<ÏúÃS¿ñãÑ`i|½š½4äZÆ:6ßtº?!§¦³ý« 5þã5}A‹ƒI¦ÚØ­ÔÁt8Ž2—`G8–N Z|C–XîFyÏŠµäiNË×–Œ¹¯t s'ì¯ÛMîbTeñ7ôj‘œ7$ùŸÞ•ù€+ûL°ˆMu5%\bs™Ùa¹]–ãm¨kõÆu7µçŸXå)ܾŽe^ncfŽÀNõIYÉ¡£xò—P9{ õá[#‡—©ÇTB¢ðò›Vý¬ã "ÕŒ Ç=\\£ë.‘¼J9¸sIqvsŠÇ{ýWÑ©9[gxdýØÔ‹îÊN‹Œ!à”X˜Vw{0¦ãU›c׿%¾ƒÁ¤•Çâ—ôé\þ¼ŽüvãO| 6Ùk×ÌôH½%U5¥„oð(%_…*Q¢Xoò‘:Öä%d_h¾¢ðÀaц‡Ñ €ädn†+›£$¼¢$ÈHZÁ¢> Ü1:Ë$&>{âHg|™_½²³GW§ ­¡óxxY§èSµY~;s«ýœí|Dm<' ŠB1˜ë,}tÌ\£,u¿Uʪž-µ œúᄆßgõ•¨ä£­Ú¢“gfcï„ó˜ ŸJŒLð¥ÉnÄíÎ]V‹ƒ&IÐÜ@Škê˜ÊÈ5qWO@h]»åØ9Åa-H1F8ˆ ÏÍOãµÄ¿7ÊVÞzj šyh“k`3Èi^}c¤RÜ:xU†§°ÿ4#[hñ³NŒRœ–;÷˜‡ó3¦&<¾ydD›â¬ŠŸ3càoOÚd!BG‰ ö}«çâQTH–ö<‰¸60ÄÖuD ®É?ª”.NZÝš¿…s ÜijPx•-¤äAÊ)Œœ²Ì&élX©I ÏD/[9ر(`m´zlØÓTÓg|ÅKŽòT/÷ Þ£iŠá¼ ¢[#C‹øÈZ²eÂÃü5¬Á"¿­JÛu~ÕgÙ^½V%ý#=Õã~އˆáêžÏ×*¤[cyù[}ß‚êSÓÓtù݉RI!‡»øV@N±Ô5’ÉbàBWòÖEÌvthVS¨/¶Úúïa"]ê~]‚k6#´oç£Kß+KríoA<õˆòv°  ©>ÙTÔ’^Ý`ÿ é’çÚš s…éDOòQ"ý‘)9ü|¦¦þ†süWDf¬t1ï";¾Ë>äõ¸M^’«ò¤ó6‹DÒKÿøyΔ Õ°mâ8)ÞÙJfjN½âiFöç™wµaéPùH5qªNCúà±/ 5:'ºBEZiÑÈtãu Íù87šK')K+M‚@¯«(y=ƒñæZí»+Ò÷ã¦õײ™`ÛéåfÓÇs¶²Æ•¾ca–T±A÷UùsGìBA ƒ¾u3ixŸòwÍB¹dtol3fRŽ7”6‡ñN¡£.^~’GûÔÀ›n _ÛzjV?ȵOmã@iÕx%L“IqTÂ%Uª£$¨bʾŠîq–D5˜ç%ÇkgÑ¿lkÞºY+Ù¥Ï ?9Ö¶Ë·RtYCcgÕŒÉ"û ð í÷X]>T€CWþ葦n× {JðÆç³‚ä¬ñq°§^_F`êÝ^ëv`Áè*@¨5µ#LšV ŸìU6L~Jt`͉¶¾"b²£¹®V››Øfý’2<(ž:º=ØRá\ªßwÙ݉cóÐ<܇öRø Ý½ÎAaçä~Î<‹ û€~迼a õ颜;¹ßÖÔŠFEòZckfTôŒ”ûðé\ìŽø Фy Q3ú~l~G¦ÝÌ‚˜ÎvAy¼Êó˜ºDžAEN`ΔkkÂâ¢l~Û[Ï»JÂäh‘<†¶PŽëÑ|ù'AHríƒN)eû–HÕ±”õ¼ÕW¡Fà³~aüû3 1/'JFˆfaù$^WÜ—Hz·À©p؇çU+h“è·â§Ù,›ô]º¨ȸø¡S]'§âùPºòÝ †X†Îu7Ÿª€Q±`¿LõŒø[¨ôăù3ÃCÉ[A´;üÓÔ(DPW¦š[žA_Í$ÎÒÙûiaø‘AGÝnæA¾<Á‰%à™²GͯçnwYÚÙ£LŽ|Ý Fä:ÎŬXÓ»1EºžÝxÁEÊzû·ƒÖtÉÏ%0½Š€à%TFlóÂÞ§õ²é ïåó 6*~Ö‰±øúP-=ŒÑù¶ÕOÙÖ¦ùùX9ÒOçPVæY8`;@¦ñ%Ô½PJGøkf‘é¬$ûö•)IÿކPW¸§'tVS*YpžX/ÜøÆr6ãeÿ¦xy2¿œ¹æÓ›òò‚¿äéƒOoH+²?9Êa~•¥¨QÓœ¹8\§_h«ü1ûìÖ:¶Ÿ¸e’¥;^ZüJò浬üi¢æž__hRn†ˆ²«û‡ÆÏb£¹˜º°¹ð÷ˆöÚ[ã#œõ׎šEôyš› 4ËGp}Ž÷d’# ……yýuË‘–Ë4ïªØ~•êˆ6hä9F© êŽ^Çw0yÕ6žîVçg&LÐs¡kÖM›µÁ¾Þ´E¤8K·,³–Ö¶èµuÍ1>/æ Gzj ›ñ5¸x ®J×Mx7ù ù4S1·‰Ë}XÞ4+àâÒ 2HRÉÇ5™âÍYk,<Õ06¹OLêüò1à¡ï¡o½®Ÿr>·”޹yPÆî$«ž¨ç_ƒ·®q±ˆ«ÖÔ×%ÅÞê“ïchU4Ôø‚­~–õŸñ×}¾êð!‘äÚu e=dq"…  /¬F¶G*ø6có]ª±“_‰ô’Þ ÖŒ @Óì$#"56)ÜÙ•ÿXûê„ôh3H íÏ’¬Îh¨{ϱZèŽXë©°púXhúÔI¥™ÔTWëQr &»(!>´‰B¬1âN×£¾l¸¥zhb|ÅœýXñ­}BÞ¸Þ›GD“¨ ˆ6Z‰ídÉ·çKùÜqN¢ë™tÝ{<å˜ F²„O?ö$AMhå †s0ÍŒüÄÔz ™žPøÖò‘¥q‘Ú!-óRT½+šnìqoT& éFÒ©wÓCñ©äÑê¶ï~H«¹óAR|+—>8QJ#t\ÐòFâL*ÕYþì«“l}60*ß4²¶Žˆmi‹EÙ­(ü9 B¤ÒÒÉ´s“õí)®8Gñ{wÏa¯pÞ­`þ@ äOšÝ„jô z9éлH¦D!Rå"v]߃üK[ŸÄ@ɱßq-}µô銭Éèbù#A¹¡’‡< ®#AÖn¤B9­”çQ³Â>'¡ya'L3UÛJóq½,…•ÿËx¼ ´t$[Ð, fÉ´EÍ(ÎrÁth3WÚÀë£yÝp3×cÉ©s¯DùSH‡¨åãˆÜËŠ‚²|Ûû}^]SMJÏ/]†t¤Ñ”:—6DoÐ)ð׉ˆÌŠŽr£4ªª%óÙ[ ýyöR% #Q¼R†hìó@ÅÓ"cUëØ-´ÎÎPÓúH8_]¤…°S©j^¤ËóvR\þf•Õà«^A}šl´ìÉÏ?Ò¾2¼l”]ö¯K\%¬Yr_‘áöki ?Е3sÞN1kO”㈟q•Q©Û2¿e¸§DÇ*)TFe߇Üä=i’ê&|¸ÏfìgšLS‡õ:è<”Å—>:<“^‚W/]{{hbôj¼Æ˜¾Åݾۥj¢UVæÉ}_‚‘’Øáqƒ85')Ç`>FBàZò˜{òeÀ+VÓ½¡·ÔŸyuøA?ŒSIÞv vÅ’NFß#$©Ê¬.D[ùÕš¯e5=ù,Qîn޽_6mèF2ˆ4C¸œg\ͯð2/<Ðüââᔡ1ìÞ´ãõ¬Ëðßú•¯_=à}ζ̢ý|kÄþï“x8JQá?‘eIyjÎè(.剭SÜÁ¥Miǰ›wZ%UaRà.3$’YLjRÂ.7߯QyÐÁ*¦dÛ±ÞÙ6tª‰âÇÛÙ©‚š”bóÕøËx:¥ ü%×Ò¾$fáëX!ÉÇÊ$^Éà¯l•òðkd"qß›ò ‚s?Ù†ÿ™m£)rRxŠ×á>@„ó…7eÄHµœ îäYËu|ÂèKŒ–6ËÜõ@æ–F2ˆøT°-¼æ›™ljÑðÕt¨*‡ñX9Jh>Wþ¦p }EK?.¤píýøkTu,Ô¸3XåÁ‘”„ÓþÙÁôÏbRXøˆî‹÷mî„“È.7çERÊZ(2ûé¾þF—ÇL(þzÝßÙÀ`ú^®Î0DU´ØCfä7ª M<3´V/c®“tv.,•ª>ɀ嵣’×[½öz…µ¢øÓéÛ¢9Œ€»²^ ‰‹Sâv 7;—vý„ãUgEíN™ U ¶îä]4r|­u™Ú·œHú©'Ú6îÚ Ï:H óeUÓû´dB¡ÅÇϤ–9:<“÷tý×ËyðNNω‰–·ÉÊ¡ ç…Üz*X±®Šc~s[ð‰>4…æ_9¸! â%{l]óê*CÊ¢c[¸$.KC|äð*Û¯8­«O¸øŽ„AV6 jŽnâ;Óàh‘³{dQkÝ”².0²*?gWýPäe_N¥u‡W÷dnßûÜ ú ‚e”AnàzzØ{0ÎðÔK… >Ò%]í!•MíÕû¢¸ÉïXf¨œ<ä‡w.Åé$[mø» Lv;uΔËuH0-`x¹(Ï|QËÛNÞµeÚ¶¸kÍÇïfÂb3Ò“q¸ðê:q¤þŽŸ0J¿WZ“éé”Gðº@ÂCW?--»"Î5׿K_HhŒŽŽé`{ûÚ›êNÏR™x&,&Å[W%/]̰7_D‡à}·vÓj¸ !FÖ5êÐ7™_Xê ‹WYã\)[;íÓõE-tçÎ øÅÙr!÷°•(òB…µÇ‰q¼NòÞñ{èRbÚìQRŠ{e¯êoZ‚âERZú7tKI¾Ö쩳•Mè!3ë ×wy¨ëEõuù§°Á)9¬fŒ±œÉR-S^òX蜥04{(Sv"TÞ²Øù;ˆ‰‘hƒ ¹áfÚ ñ§ \;úéUÅÕ}a7±H°s$àöjDç§a¿ƒòRé>òqV5Öƒpe&Ò胚šå<¡‹m 7„šV«ÓAK®$!¶W×·â–úèßZB1 7 ÂÆôv(¬Òê÷ošJ9µÐЂ:·(+g¸1´…At1ªß‚u즛Öã<ãà;>Šzc=0ŸØý”Æg“<9 ø~ðòÁåí„ó“Ñ¿áŸÔw'·X€ôWÄÅ<ÖsÑ"œUZ„"Ü»”–Eä‡yç¸Ò<éòo%-íÈ×}ÖEÓ! Y°ŸÁLQi¿xH´§¡™ˆêjŒw#iïNVÃ~ˆCÇ“.¹[ôr• 3ZÆ\Ô…=0¬Ì©õôY­ÔÍÔDgݯŠÞ­øÂ^ç™ì‘{Wˆ¾{­ýaÀvnÀðóÁkGä[•ô^|ú¨X§äã¯t_DøX¢â,”vß¼^w«‰I°a ,‚*!ÖW]>áq?–þ™(Šf1Ô“× {Ì?âdƒ‡õ÷Õ`­^7$V _°³ÈúAM̰5Ù—ŒÅ«ÞHˆyÚ¸›]‚{ÓÜdlÅÕ»¢õ–3ÑVϲ«Jc¿Ãyè`ÈžÆ7Úq¸ær°Šs0 :Ô;“„%[ž—(î¶îûM=ë„Äð>)^X— T-úä?G)%Ön§XKÖ‘©›ùs=ž;Íçvçêð¾yýˆÝÛ‘,|íš%÷ë›Ú€¶®¯Øâ½’_„ ßÓŽ6.‘ár¬Ó—%*ÂÔf•ƒô€JûÃÈstl¹c ‚5‘wnd2»(-HÛ “µ«¯9¡äÐ!™[åði¦DoɯâÝ6'.'Ké¦j^YÏ©è^ u(Æ6¦®ýZÃL­âùÞJõ'ÌÊÚ£®„Ÿ¦¸n ·Naœ=2 Wó,NGŠÖL‡ ´"{r¥¼Ö²òîº9Ÿw¹ÍàÿÄ!Y ²>Üû˜„CsYì$2¾4#îIŠ Q@®.oÃd`g%À_=)ýUÃ9”žÏဆ†ÕuúH?2›¦SðS{gŒ¸­€dÖñ=ëmmŸ#S÷­=tì;̨´è³W©•¼†£*þ¼€Ôá×5„ŒŒM¾øD»Ò@¥T˜Ô‰˜‘®ã›À™o|m+ûaÖ„&â|.T‡Ú6ãçºjrG1Ç"¤Ò¾ã²gyCòüQ+o,¤•ëáïÍ|:r4(4žH˜Ék¬™<¼vo ûÎeŸU¦³Ë¢Ê|X·tJêû©˜¤–¢™õïØÓ ‚j¬£^€Z,#¿}žÒÓ*®xÆ ÊéWíE2–Tm^¥˜}Õ¬K˜z[ß@Òv'G-‰: ±‘¦3×/  ¸%ÄdÐ1—PPºÏâ¶XÚª°Ÿ÷b³¦•¸5pÈj\RŒ*yÜ3âD±F¼va¬Ü¶eÄ8{å¶Þ:òT02«ä~¹òçžÿ!”'êhR®OÏlØËhuwo²ÿÊ–Éþ¹2=‰[‰5 Ê)1à…^7Kâ~@D2’÷Wü¤ŒŸÈ™ç›'•jý]…D;ĉl<‹mSñ]vÎ1˜4$nbÍH*÷¼ Ïb€Û@ÒN–>•SÄÖ³‡ÊF64IÓ=Æâ"çêxiîGu—ܤpÆ|ÞêÓþ$ÏÊ mËVÔåì°Éµ:åµ`Ríá‡O€£‚¿hM„ø¦ªÚu³a½×ÎûFO¯Ð¸Ë˨ =áÝ(ï§.×RãQº¾.ac±"7+:õ ×æÊ®°šªå»“÷Ç…ð“Ç7÷˜˜àd?t[cÇTxaØ=áõôæ·šÝ<ê§Ö½›Ü£+pZ¼+ŒžáÉýÝžúµ†É¯V¢j92ïoto{ýå3n¬Ü\¦=ˆQ›Ó…¶êiìŒH&&TøjeB¨%6†VÊ`Jª5Ò£ö9ÙßµZøµ •rKP™0^Í5€ªÑ2ô£ªOBbœ:ºOp˜¢8öÏï}õÓœLçøÑŠLNH«ýìµ6kþXÅTæÏ+Þø%¯ýýሡÀÁ¬ÙéP°ë&4êÑÚݱúI£À^† ï/E™õÖ$ž±¹%Ljµ8‚é*LíÝêPœ>fBXyQgr8Žîþ¢ínUVsþÚmÔ°ÒmÂPð9ãH`ÞæÌmÍØoØ‹Y=,¦ Y:þÙÞ¹}©Ñ¥vžfô0fÃ\qQ…mþEïRû'… I3J¾@Ô(ߘ+}¥ú;ˆ¿6šì½Ó¤‹ñö—!Aû,LºµvÝJ¯©˜]þ‡W¯åùÛ6~ÖßlïíjÎ1^#•›K|Èb1âÄ“âsšÝïJ¦&ÜÀ@·Û½Œ>¦¨ kb>’Lg¨‡8›òa×ðEKæj×SÕ$?QE°HH…—]¥mÑFhu¨ ë·vÖÎÂòfï;´Õ¬FžFÉìŒ6Oy<»öõ)DßÀEª¼è-´?ÃGºñg§U…lצWto–ÓÑÇ"Ó*4Ž=Ý1øSÝQ›ÔönŸŠîkK ´’xŽ]›ìؘnëV ‰Þ.F4œ‘~¿Õ_sDäêe8AÈÍÍY¨áJªŽiYUhø^]ôJt»ö |Êç6‡š’Et–AJå$å¯É˜¬û<òÑCÆ/"|4 1ó5*"û8IÊSÇ3EmW†Î#Š/[gIÎ:¬‚ÜF¿"¨$ì¢=‹ËíÿJGvúPáÎßGóKÕ”}ø½Ð·ý’ê8'µ(Dìdx< QJ Ñ©¯×ÍD@‰Ïã‚þØrNµ‰Ñëß×ÍϦH";Þt:ô½ý}²ªÃÜf”GOMã»ÓAÀð]‹_Ùáê¬M6ÑàU6ÚÏOË)…¹VA¬Øô½ë‘!úÄÙ:sµ=@}®AR‚˦Ӱ¹Œ ßsóx?3âIu@Eô³Ãu Ô™Ä\Buî´ýW ƒ¹:,v5—…G*ñ§9&¢ ’ bh¨‡´ØudBG/™[JaaÐ<Ú0ã’¾†[¦ïƒ“ƒ¥ s‰Iì¢WÎ ßÏY†ì ‚+mòç‹L˜jœöc|%Jeé³’D‹Ýî¸ö±öS= …..̳•ÎTË Ôj3· óí1‰bRÖ\>üj¥уTþðz››²ÿÅd d5{‹PÇþì"aµÛçj>UÏÓõxFÌóAu‡ã®Ap±*ìvgS•jVúìS•\%¡øEå®vUâ$ˆÌ[ŽéÔa?6w¾DT ÏÚŒHûÉß–GT­‹g”–u…ÎPM(MIxÒhÐY@~äZ%²ž·/»Ì–ú’[xñÙa€z+ [½X,Д€É†G„2<øó‚]'_]óNÛEQ–v3C4³Û½­ã=¸,ä´ñÔøóX÷m{_ž*9‘N Ézfù³Ä%•‡\´.Þ'Þ·„ᚯ¹ªß¼o,l¸0úD»QBëÐ4öä-:ÄUH×î˜è÷3ˆ6UÕþ“)‹~„ ë§á¾u?u4…|k±¬]JÜé·©J}ë\†!7>=”wmvÖÂR õ¬p¤‚šAеŸ¸Úó¡…VI_3ð.e–<‘ã_”½}¸,ZÚó½nµR=ŠÏ-†~²âH¼(öaƧº¹ëÀÁÕ˜þ,à †Ç™»‡wZ|ž}FO® ºÄ&CZÆ>¨Õ\è"¦îT¯{Þ¬Œ&%ÍOUÂFí;=:D¦U¹… ºK f­q>e‹^ø šjt§v™ ̄ʤ›˜šù³çœé£ÈÂÒ€%ÖKjBÊ6{Žî[a“Ã%•æ¼¢ó«-EYaRÉÐyGÒš¯ú“ø6º„²ÍßÙgS¡¼ÁKio…©bßtd¢|£ýøÑžo¤IRn‹¦ðÐ5ÅIÄbHØm‚Uj/vÐóûˆuÁOfýMéÙÂáÕ2þªaæ,VÝÞªÑ5wj;\#ÃE;ÓHòD _tÀýœl⯺)Ìã-Kõ» ŠÏ…0?o“ÔŠ!ÆHu¸ éµëŽÌ[͉êB‹D‚Ï/nóx$Oê«y–U›¹¯øÇ™1<µ,ž ÌÅIÖ1¶úkyýaæ¿ÆPa©Ò¿‘’4˜*BzŒnx$je¿»hCÜóZ?ïñRí;‘»}KBÂÊý ? ¹Úž…ÕPR¨já‡hñÀ÷ôò·W0Ä•Ê c–6ß7‘…»¡èiü«£_%¼CÌ6§’«C\ÕqÜ×MÍ^9ÛeSŽVEì~½¨n§äêM½¶9pûJþz Ρ3Ÿ-D@‚ ùítÙ&~=ߥ<Ž/ޱÏù¦ÃYMè©›‰j>½!oE%_DJ8*Äñ>WoŒ\[›:Å΢Úþv!™øaŠ Ã¸c®²gúöÆÌ”9ŽémÄh†¢­\Ìǵäxù–C•b;Eµõ)’ ¢C[ýˤ_Ð*¡¿‡ªzÔ´Uú¿)Õ ’oj#;$‡c¹i7—HôÈgO’X),»…“ê74'‘᩵ö‹uùDò‘¥îœW¼àji3}"ÅØfäu¡›í¸…‰˜ò×ôö¸øXÙ¼¤…0°‘Æû©s†ZôîŒåÛ»í%¢ Ø´_ÓY­]EZí „löïÙs´´îS¹ð‘)k·Èñ1D³ŽŽÌ.T‡“B…_‡­â=ï—¾ÿôÂìbÇïO©Cïæúm“|"3©k9bwƒÏiI.úÑû‘`~mÔN¶±ù)ÞÏ*#³F1e1 KƒFÒO\£ESô2Æø…¢ž&ƒ]²²çóƒÂAØ/•ê·×0˜’Õ§¯Èžøq¿©Mé¶8ÙˆZ6ç­ ˆ<îˆR@qç«öFj6ñ¯ÒÛ‹T.|î­hµÞ}„L©2¯(96Ûc,?Ò8ßtãœÇÂ3¼œZ¡þtäWéÒ4‘#þzH=…Vù•߉¡¹0¥ÒŠšlL©(Êå.Üœ¯Ð÷2æ)o?:yÉaOÒ ¼õ&¬ËþE—qš(¬P§Öaí=-ÿA'ïÓ'ÉT+…u?™x@sïZü%‚%éZªéà:êíÁý+ËîP%Ô¤çH¨±RïGQ©æ„uød橉³ö¦EÃyOœW]òlC ó¿Ð+s‰\xö%Gh~Í7Œª=Ì}¡ ¥½Ø†ÿ¬2RÓŒVÄ¥MÙ°{¡8dãÞ~­ôKù꺻!›¨†‹å»Ä· þ2š»/…±­sçæW²j0åVÇ!^Xéò’ùú’•jƒ*…Tkl,¿­[€ãSl´îµý2$‡çêz@›RÉß{â—äÐç}!}ä:5¡O$QúéO3wïäcYò¤õV¾atYÖV¡Ì”}ý‰Äú¾lé­kήOê™ßp¢Ì=˜ÈØ}» ßšYË„(?Q*·åG}m눪²`I^»R ¹Ì#Úœó¼2»Y8˜àó ¿Š@ž†‚#M«¦ªé·ü?|L1q e°òã/s?/m*Èd†‹Up‚¼<¤E}Q¹ó%Ã~Ž:̃ú|ê„)Ñ"ËüƒÿÑÂ<;E×Ïfêÿxqfƒ!ÄÉâ¶;¢¬¡½ä°55>îódƒŠ¡‘«JNSUbÚøè¸y—Áž –Óz2•‰Ö=p[PÕs´Ý»™ò Q-¤}ßâtÁ½ÏE£-X™¡ù:)p]@;-¦&üËJ‚ÿ¬-vdù9bó)Ÿ¼éàVf@XŸ¼/_”Zm#Ø ¯™ÆX€(Yç)Ê÷N{é“Õ°õI£žÚ$ö&¤†íF•’ø#¡4 Ø‰tÆ{‰d=Ï<éNçL—õ­"‹Ù8‹VSµ=ìcêgÅo*¤K[ÝŒëó|3 S%­·{J½ ÛáJvñ…†Œ)¿ñmÚë†¾âÆ®&˜í«¶%¦êíÒχ•A²xZ*µRØ×ñÉN†øV4Œ°Ÿ–Ò[c³4ÃA%=•a5‚Ø´?q Ùé×üŠRå'á÷[ø €ùƒê†Ç+Aô­—Ž¡‚ß×¥Šïq ö ÐyãÏþq‚4®Ã$è4K+ei§3¶Žíë´ô™Æ»u}/æe«™åÌ™åUZßBÙ@î&ªôÍÅz-ºiØÑ|÷ÏŠÈØÖÓ£‰ýÁ_ix«“pÛAs´Á?‹YÂAzاGbé?#vx]\EDßXïÁg+±\½*’·wÕþzê~@ª}“]‰»“÷£Í5x®Ý¼¹ãå{IßqÙÛ:,wVwç N›úííÆÏŠY­µêPQ©3½+X˜¶¸ú*äiœ¨} Ä·ÕhÔùß“ŽÎú†Kq7Éyq´)·:ÙT–ùvp¿s_èVÑZ¼{° Iê§…tçz?NÚÂ0àh+tk«ûk©ºšª÷€mû¤kÂ’†ÐÏçF3‡%ö+3Nps“er±Èýð¾ì 8n ^ÄfêÀ²f8Ü1NßÊ]ÞùGdI…Cù_úšgùÚ·GY›…]üsq\ñ+HÄc ?–f…Ç),%=lcŸMì´eÒîË’øçBÃmBi™Z*ÕÐÛ—2k2še…lk®ÞÞîR '[N£¹Û…1nb¢‚°ÐädÖÄ•á†l~QÊ©PÚÐÂ$yÚTØrM]„\Mìxp:kB]HÞ}ƒ&£7,.RMò¢mo‰C%¿gU ÿé~R&tÕ›»:S> stream xÚµTÜ6, Ý-= =Cw7Ò!9Ì 0Ä ÂС’Ò*!¡tHKwJƒ„4RÒé‡oÝ÷Þÿ_ëûÖ¬5sž½Ÿ½ÏÞç<û ³Ž>¯<iSA"P¼ü| €¢–¢¾"? ò@xllp”ì›ÌÕ ŽDHü‹¢è £îlJ`ÔS ‰h¸;øü"ü¢ @ÿ›ˆt•(=àP€@‰€¹á±)"]¼]ávö¨»þ^8 œ~qqQž?ÂòÎ0W8ŒhQö0ç»!`'€>‡¡¼ÿ+‡”= å"zzzòÝø®v2œ<O8Ê sƒ¹zÀ €ßM´Áΰ¿{ãÃcØÃÝþôè#mQž`WàÎà‡Ànw1î(Ìp·=@_]ðĆø“¬ù'ð×éøùøÿI÷WôïDpÄÁ`éìFxÃv[¸ ðDE“å…â€ÐßD°“ò.ì†;mîÔ¨ÈëÀw-þÕ Äî‚rãsƒ;ýnø;ÍÝ9+# ŠHggå†÷»>%¸+ rwðÞÀ¿ï×ôDøþmá¨íïF î.@Cü™;L]é/Ò ï?6;  `Ï0/ˆ=ð÷Þ.°?œü¿Íw]øûº ]¶wÀüá¶°»<_7° €ru‡ùûþÛñߟ…CP˜÷Ÿìwf˜íŸøN®p/€èNüÐïÏ?+‹;‘A‘'ïÿÐÿ¸e ‰¦¾ºŠ1÷ß=ÿãUP@z|ù…¼ ?HT z·ðÿï<:`ø_uü+Ta‹üÎõ»Þ»ƒú»f¿dÀñ×pþ;™6òN½0ÇÄnAî¾øÿŸ%ÿGÈÿŸÒgù¿‹ýKRqwrúƒÀñãÿC;üÿ¢ÜÉ×u7 ZÈ»@ü/ÕöçkÁ pwçÿõª£Àw#!°súç,án*p/TŽ‚Øÿ©™?톿çÍ Ž€é Ý࿟/?ô?¾»!ƒ8Þ=#nwÂüÓv»›8Ô·øÃîfê¿KPF@ÐßÃ' ,»º‚½ñînþ ß ánJ¡0¯?¤ ò!¨»À]»þ[¤+Þï[þ]úÛöáÿ‚b Óà>€ˆA~ù/(ºþ Þ¥rûÝÿ€ÿÕÄÝÕõ®Ã?dw×Ýßø§ó‚Aðf¿ !’Á•ÁMçòtž¼ëÃR˜ûiç&¼Ãy–8¨nåq«•ýŒô¹ÇE*³]ü*–­Ú ÏÎ3§|¿U1U{ ò2©lÙ1ÙÄ}ùuŠ6™è{FÏò…¸þ^¶qŠ£D¾k÷=†H’6\Y¨]·>±ß£ÊΙDOvŠQ&í–¶Š‚tM*zq£ÝU=Ô'›>ƒuáã²VcƒÖ¢ÌÃSµß°<–j¹ÀKð,'Yîè›'íbh|©á¸~ÀŠ"U–ì£WÂ.7šÏ!ºÎÊ÷ØyCæk£J.·í.â!_÷ƒq¸Œ–Œú®$Ì»d9C”_ïåÖÒªïǃÇùî…úPß·Ñ­OXäbK!SÆÐ8Ø´QyúbsÓû O=ùIÖlI$ÔS¬`ÝSBU}™ ›:ØGÂDˆm€ªnö~$¢V~?‡FCR d/_‰|¹CTçÓqžuŠ}×÷1,m ÑwÉñ¾_úpt´ÀÙN…ãö¸I­Ê+ ýê Ò²R§âyJe!ñKSÙŠ$©C²7{c¨0®&"ÅA™eä3/Ü,;pùZÊWߺ?tþp:ú)§d´Ð±ò4*³c¥ä:BQ¾û4ˆ|_£dR*Ê-²º¿óè§ËSh°ï“)àéá v„s G¤d>T>-ÍžTÙ*öÆ™ìel‰×½rv6ÛÜ7A´Ñ|J®èŽQ$ÛNgNÕ±h‰}÷TLpt†4çŒ[…·Ùøßhøa ·÷°Äs6°‹3«áðŒm½{mœAÛ?ª’æS©[¬ü\öýºÑa6Ïgb+ÙdAßó:©û¯ÌÂT7¤¯ùŽå¸{!‚tiôÓ=?:¶™—×––ª¥ ‘${†¯;ÛZ~X‘Œðœ€‹#©ì cç—_¬— qÝVîO4pØ •Ÿ‰½Éô¡™wñÖJÚÉH:vw¯Hñ & µ55ïûfp‘ü`Íød]×NŸEÕAu¿§˜ã`žäà‡ß{—M;‘Ïþ…yä«´•,ŠP„’ÖF!¬.$þP4Ô4þØa½ŠAìâ$RUì0àö­êa}cGƒŒÃÿ§ÚR¡U} Äõvž?+šsfÃÂu8jËŸÜŸKÛ˜ ]Tôîç c›1É5Ö®ÀöÔýªwë­øD9ØFËÃ*b}í…Ê)Ý'xŠ#™ÞJÑ„Z,F<@"7™—6ݧ (ºYó!a1¨¶pA™Xq¯w:~{œð2>µu‹;/Ü-ëk‚qoÊÈ‚z¹Öa¥±É'½O[ùM™\’z(p fÁ硉mck!›åËoKÆ®­n'[)tÏÑ€Ö5}~»[äÇŒge©×÷~ ÕãÀ„ éí³Åôù}é‚]„±*ÓFIÙ¾[½‰ê¼¦§ñJy)K–íâ©E3-^ýµ|êÕ÷@x¨òˆBoª»13“ÄæF,fWrÚÂ`«TaÜKÖÐí3ZŠUi 2|^C»B¡ Mš·ÙÀkŸ˜ïØöÏÆr´„Ê'ã=”ÅÆtz6 4 ò5¤ÑʼéÕ̪[´†l4#Î^º^á-Ɇ1¥²…uÓ°å^YÇGJ®TºÎ7  ogâ '#U-N ­\£k­ÖöãöªÍN<ñcü*„{¯ú1b˜†É$Ô±ã¢<~øæ)?G~=ˆîÁÎúLÊÝÇApÈÐøy°O— òbBÓ9b04ûl´7´1-×äO1qÕ=è¥P]Â4sÕm_VÍw”ã\RVk‘6׉÷ÁŒ€]éXðÛ_šh}$ëøiiKsß÷Tª"®þ6FÃõì—†«9Ý®,e_¢É0ó´fN­Ãè¬:“¥pÐÇß›¬ì퉾fÄjÓ+nõjŒ e»,…õi¥¨@<¢4äW:È~œÌÊRÅjõLå'Eo~QÞ,ãƒN’Ú1¸ä\¥f¸)À¾éÅÅÌ%ˆ˜:Z•D²$Ø:î¯;†X—…—‡¼}S542Úß(kí7‘8 |)±\䇴¿-™ÆJ«F(zaØJyT¯c‡Ä®Mgkˆ Fú¬œõM#n"Õ]º’âŽ4§hÛMË#̧y‰‚YƒsV{ø¼ƒ8[ýuço¦Éõ´‰‹_ºì†r‰x|™ÌºyÜù<Ññ´áÁœ¥ú>,~ð=Þõcù¢'Ü¥Öy ¼â×}ûdøÄð:=Ì.ž‘“xji¦j4”íP&6kSQž£}ÜŠ5Uþ9àðÀØO»ØuߣÇÿW#5ÓêËw¶ík ”†ª\6}{;•œÇ•xîÔu«ô CY¬x%±úÍtö¹c2eä컜XLl„j£Ç—Ú[.ª_Ž*êœý÷vœöÏø¾Be³ÆÔýò™É‘~m†áw¼*Ù:‡Æ<\¦ØäUZMœ%4ò¹ZlZ£ßš{¦)„C6ÓÀ¸xþ|#5ã­æ«)‰ò_ø2õŒÅyoâV†#oæD§‡3óV’ž‡[e¤ÉÂ,7†ÓÐÌàÅǯ"Ö">ji§ImÝÒñY…µêÀÊõb[§´O>ôÔ"+Ä—žÎñ (>ᦑlÞÜl+Žß–Ÿ›±M~m%GeìoÐgƒCñåQþÍÈu˜v˜Ì.îñVÅ ž§ÕÀØç^A§•B}N ™1òlÆ¢âÙÆqGàÀÖ+IÒˆÙj÷$³I`î©Jdñ{4â¬>¡E×AîŽëStGÜ5ß4¶E‚R«ïŠ7Ïg˜=g3ÄÏCY,o¹E?:Ó{© è"ð$˜#ÊõmO4lËM=š×^¿s¼b ɳ6ïØ¯ ­Rç‰ žÖŸ9š6ŒÍëèô3XÆi}ž3ลßnºã`ó’<(SUæ^k?ز˅x‚š˦z»PLš’àJmÞÊ^ÿ´X©pþ=ö#¾7]|è SW*ö"Á2©Ú³y2dþåܘYد-:óÝ&†b(ìâ·…>ujaä)gß ×¿¬t|[’7±PúxûMÀãyñDáåö…|ÓÚ5kS‰¦YûãS`#äÝ»rî6FÒ´1O¼ç>S#ÓÑÝèùÌŸ©'ÉÊ 1gàL—™$Ã,ä÷,£N™9gÓˆf*JJ•݉aªÕ{”C®Ù#"K2¬VCÕwG+GùÞ¢ìÀž<÷ëfÊK'»W÷ASÄ6Hý›ÝÉUµJ™T55õ! Î<:gMDÜb¥̮ɿ‘pBBòD&ÆÊÍÙÙmÕdœåC>–ØhtÍ3ìCê‡ô2¥j ê=͉Ó÷’z3Œ¦û°©ÏÍ·ùlù+MrÅ)ÏL´ ztâ1Øí gF¸uk¡ð­/Œ Ú}£“y)D´é¿ñ¬)°Ò^Ã*“\œ¨dzPYvßÅcÔç%·ƒö¼¿ŒÏŠ—çð¾HÎÝ7癓SûÉ7«ÍÎcgS%Ñ©}?Ržç8/Ž\A׫#••Þ“#ÓÊRôt‚€tðˆë*jüíC÷Ø8»ÛT© u.iÃîaMÚ Ž|emb·5¯¤µû• Gs†ÅíÞ"± “§KíBœÁÝ/‘í¤Xet ø·ŠÚ˜µÍr;2XMW?s‰ã͸SX‡ª.Ÿo£¥JÕL¬ÁR)ªxÒ® ~/÷Œe]E{~҂О¨r+”úm¶§¢'2èײ=Ÿƒ2]"Û¶ñ…w™¸X²Ý¦=>•8ïiÃ…éŸá9#¾.Žd8x¤TG_.þbñÃêÒÜÃb‡ñ.esY”¬ø©zúFxm§žABì¶Ñž!Kl¬$Û™ì³Hjº“‰u¼mLJhÒzõʲìd³îÛ3uŠ˜ íAåNÉ÷£¤RDÐuPÿe(i?¾F,i{wW ÿ‹’uùg£]³ƒ7ò?§0Ë«t¿¡ ‡«Š@,ÈgÎâ^û|èT¨Í´¯`>Lv=«1¯Ì–^5h é\½Å©¼P¸a«×/2¼µÏð‹Û¶ä_†jä%0¾2È]À‡.´'ÍDT’mkÓSƒFjB;v3 ÷Y=VXYbXÑ7‰7-/®NJƒâ^ÖÒzø“§_qFO]›FÉÇò\Ë"›I¥"ßu…|îÛ`qÔ,étû¼jvÆ0ŨžKLQûU.´Ü¶~]'™ð©´ …_‘ÀG9H6à«é%l ªÑ& gv’¨c*lÞ®[(óiåƒ÷rðŠWÄs׋ßö¥?J¿8Hè™™sw‘»¶Xøºc½g'7›>.l”Â?1›”Djc†`' H›®QÚ-¼5ßY Þ Жï¸4¤zŠéw¢äõ¬óŽ ðLuŸ^æWi”ÕÌÉU‹¡)°¾ ±þ(ï×'¥g‘ÂŽ!XÐ:s8ÎÒ°ªòÊ FÜTßG1]Wdvk0­ï€7ˆËéMc» ]þeÊ$Ñ<™áxFÉ;¼‰û¤È375pÓ¤bÇ×nÏ#;åÃM´B×~q.³ÕlÊ«­$ÕÍÞYߣøÓç“ÅÍÉÌA”×±ÈÈ ½uL:Þß*•C¾&É™OЫ*a0h¡ï¢rþï‹ÖGÆï"rù¡Þß1z²i¡¾5ËXvêJ¸®‰Á9{¾ígMÅo ºØM·êø» åyô²B/n¨¾?20¼|Jᑎ» ˜—2îDÏïþU&¯ù±½ÂãÓE*öü¦Sëâɘ¾lÐ:UþÏ*»î¦»ÎèðÖ­ÎëÙ¤4ݸr<þ¤GŽrf•°©¨ó2îkL8™–¥Êxå\a ãùæÜ?L£Wˆy¢yþFFDÔÅ0¶]ࡤ¤yøwéÕz’xœQôãz Í‡Mì RþÅ/Ðñò->RJÑ¥²yœY®·ìq‚Hg+Õ)—œVç> ¢­tFe)°¬R4xmMµ’ÑÕ†ÛôÓ>ÕþxodÁ4FÔüÓÕë¥!Ú*WÙÅ­oRtúv|ÝÃZB}íâ‰= 2øú)Ö¡¶—.o_¬Ë {%Îf`å$³:œN1§~Ò°a•1í·‡ÐðX/JW}6Fœ{“AÓ×+ÕÊArÑÃÏ sFç´ô.Ó<:¢ |ËÁRm-vlbOˆ±y>ìä᯸R=è[ßtNØ4œ©¾zºQÄé'5’ÒìT¿­ð¥Ý“OtÜqv™VÔÕ“`6=ÀÍÉ–ùÝò 1Ô˜Œµ-ožY·O †oŒ_MáyY_± M `¾YHcÌ£©‹?F|¦Ììþ™Ô'4‡ ‹$jú.s“ªû±^áiMÝ;gŸ‡†Ð.“=r0ƒ5Ðìá‹ø]ž§jöO“G3µbÌžx™Æø*Øžo×=HOTô œ¯2€š:ãæNuŽ F>êÍãÞ·³S$‡™9y|)¼]””¼üÉïTäã&ufÊ[hûý&F@9~:º/·Ýä-2ööð➉l²­4´Iõ~ß Ö‘LÎOaô€ á³RŸÄ γÉgQ:ÅXáíOêL4·œ$q¥ÑCižêãÐÔÓÀô«‚Õ’°Ü¹Î¤Ëù1ÝÓ*í<ÕwýæI~vTæùÖéöØÑ%jXÔb[ì>?UÍ8ùPódí’O:ëd3~-’m¬liüšÈðtººKï âú«é"9Ž3SA{ VGóDøî÷°BOâÑ| †)=µÓ‰Ð‡GNÏUPáRÝ9TËgÝ“igþÝcžžŸ¬JáÉ\öÁç=9IÎÃBs®Þöת¯o¯A‡rVèL±cæqUü#’Ž /’¶P®wɸo]3J<ˆòÁ”Ψ#(¡¾À‡ê÷ˆÖ¤–zÞ7± C9VM8/îñàë¬|Úù”/“—òó Ù ¤íüVس^µÎå˜%Ÿ?ÔÇr”;æF°ÇO¹~W{áÂËR_4CÑNƒn#àû Û¨ƒ(@ Sù˜Ÿ|ª÷äÅ+¹'M)Þ«¼EÊÔ5¬­ãXä9ñ¦ÓÈ ÀÏ›²ZcÜH¥®R|y}ïŒ"§ùx|X¸°—åñº¡Ò|_þ9Ýîdnj´’G™¦±^]QG*nM‡Gfã ¹÷ÄEˆø%)}@ÔÉÌ'=D¨ü¸Ì/¯AËøžF‰0Bgc¹·g,£ièqSûŸfúù+8íê>Æu´¿dólvø ~Òæª4¶»ú'ýHö×N¥G3Š›‡ë€åƒŽ_GGÆ Jñ{[z!YÌT) ‰#±öÁýÐlã.gݾÓ™âY…jJÜ:çu,û¿°P·f¤+‹L3| xðö͵Ó‰åBçwÌ8ç[Õʹ…£©œ¨wN‘~\0¼¾:`®Ñ_w¢¶ËJ dÔ©ýyÌZE(”ipÚ6¼Ÿ˜”3Y{Þëýú^ªs촄 Ý- |C–=C?îøîo·Ù~Ár³/P¿„a•’2Ÿ‘¥Ö¬Aþ k‹J>ˆ—ib.ŸÓß3 ‚äký»…®±sÒœÌH^ÎC``Zº¶°šÌtvåPs £‰‘ŽúÍ¡9õЇ¨Øb˜òí ÀÇë0aèÂO/ùrþí*™Ÿbåö\ò©h»pVúdˆÔ´máþ¤ú7 ô 4Z/5˹—Ô1k‡îIZû!\M•„ýMŸz­ðžó ”Ï’é©™NTGN[.· ¾&ê~7¯6z?·×w+( «¦ÍÖ¢ó†‚?9œ¾izÝå–C¹!ÍWYp;€¡ih}E4°³Qe®Ê£»8Aa½vé¹hµzäøI9)_Uýà bÌô`û9MœMïtœUP¹)8E¬P¦§á&·Ôý§s:ŧÔ#~‰ú÷A{VçæYt†¤ÏQ¥¥B³ÁÅK'Âu§k6)ž†7OÔ¤E¿VóàM$‡\±p ¥×*¸lÈÊD Z¶»ëuT$‡Ƚ‡|j"1,íšÁß&ŠÅ,ʳº–% ¡MXë?¥“’1ŸÊ ×Zij"!Í\c¡*„¦Lt`9>óÄøèH^U.¹_gY‘ÎI„±­´B~0Up#Üú†ä±wwÈÇz"ÜÚòbÖ$_Þ¯a};7s„މÌMå¼ó¹?¤wáT…DŽáª*„LÖ+‡ls‚ÏzDNÑ}Ø)Ðù©`°{ž­¸š6û´)hãFwýšý±½ÚÜΜ—×õãÓãÜlÚ¼bó^ô=ž qdRùÂnñäž‘ª4Ùü\]ø8OyɲY'øUNèÅyÏ”dY«ÿ€ñ|è¸Ãj4ù¨¦È¥³Ð¼NBJ½ùùü¡#‘Ø8näW¢{UÚš–ßZ´Ÿ+³S=‘5SxuQ°NŸO2i†û¬ù«éczÙøü+W‘3ÏùT™† ÃÍ¡¯³Ÿáh7ÄÓÑP¹M«õîñ-“è¶d¯ÎPö 1ÊJ>½M%Á$¹s=S4 Tá Øl’òùÎOa›Ú â9ï –˜º Ûô;>ªLR(õÉÄ4?†^v¤eÔäð}Õò…Ú°çT°p[DŸÄmu§U­•äc;1’½Qîg³Z2Í9 cEl ¥íTÊ3îëkÊ<|!é÷â‹-*:0cÂ’§OÛê9RO¤yª,õLÙwt`U3ïð ÆèAØõ[Ž—}”;Zx?È9ÄçGÖv“<£Ûž3ªlÞɘ4YWiâÐ'AûÆ}¾Üdª -Šƒ~£n­ðŠÀÉkÇïÍÉøAœe ÏäöãUŠ ô­tU=Òw÷é‰.úÓܶh>‹ý|H1•r÷iÄK9o‚îG¹/Lj!Ðc§?ÿ¹¶ÿ¶ç-‹c´¾ÍnJ§^Œr×s\—Å–—/Ðì±­Ø“¹ŸõŒMùÒÛg•q¼Ý ãêD@þcMŸ?º‘CW”´Lt_ø¼\ÄNvjC–>ôÃèÏÁ›šT“gÕòÔk\Î<,‘-È»pƒŠ2»DãÜ.²>¯ãT´MnFçY_Õ”TØ®k2œ8ASu“ú^ w«Š6†…gîZ[¾Ž ÆŽ2·n•uP“\WÃ*F8²),~송L¤*l½ávH ÊWŒ¢òíO­–NŠƒ Õ¾¨–G+sM¶×L²ÙÊÀ¬9D!Yì1ƒÓÿ"ÐÌÌÛU¬wìì ɉJcR) •Iî}Õ2HGk~ñØóŠÙnPâØ/ÌC¥éÖ¬;/t‚ó„qD¿í[fŒÖǧ„6ÏuJÍõ]ÞÁ,\ûkÒÜ'èûbäIô,¢:ÝŽÚ=k;,ÖÌ¼ÍÆ»•GÞíÉi5š-![‡+g# ý‰m…N^jŠ ¶+ÙyœåW Ý->:¼·TØp0_°œ#ña¥‰’Éå©ÙoÆŽÙtR”ít”ÆÂ쪵¬ÃÿAC¤´Mc¥³#Å~[5eÙè©Þt–ª%øCD;#;4µÉ¯Š©„uŸè,¥ŽyT¹ìÓó‹>ßG²›á§‹^xÚ7tg‡"#ž©¬¤¯~Ü/$Æ¿pÛKÝ=•"A<Í5^_Äyx¾Ïa„×ú„_ûýÂÙÓ ˆ’{fã…§J.Œú‹Adp_{åÇëÀ™äMüÎv;(×9ÂUJÑÖíõÆÇ{†SM|LY—¢ D»ÈŒ‘n<#f;b›Æôk.»)qæ%î¯nh.㙸rü¦à®¨é.h†Õ»al.ó’½ÂçöêS%K¼é¬¡±9î?ÿiš endstream endobj 296 0 obj << /Length1 1957 /Length2 7340 /Length3 0 /Length 8518 /Filter /FlateDecode >> stream xÚµTì6LIª Òåèf£K¤[BR‘16±)Ý]RÒ!‚Hƒ" ’‚”4HJƒÀ;}BŸÿ÷ó¾‡sÆ®_ÿîûºî±3ëêóË[!-¡*HŠ_P$PÔR70@ aHˆ˜Ý޲‡þë f7‚:»À‘©?B¡`ƦFa"µ€Ú ( “—B ä?Hg)€ØnÐh PbvE¤£‡3ÜÚ…iôÏW„ ())Î÷+ ïu†CÀ€euÀt„€íúHŠòøO ®»6(”£èææ&vp@:[ßãæ¸ÁQ6=¨ ÔÙjø¹4@ìýg7bv€ Üå/>†r;Cƒ=E¸`rÐ+¨3Ó ¯~ ãEü|ÿ¯>Àß§ü·ÜßÙ? Á¿’ÁÒÁŒð€#¬0¸= £r_åŽâ€V?Áö.HL>Ø ·[b~ͨÈ?€1+þ½  ÄîˆrpÛÿ\ø³ 朕VŠH(åBüs>%¸3‚9xà?÷k‡@º!¼þ…08 ös+´#ÐwBCÕ•þ˜ˆÛ¬¡(€(—@Pwˆ ðg Gè/§àO3f o/G¤#†Yê ‡A1ÿˆ½\À®PÊ õöúÓñ_D,(°‚CPK¨5Aü»:Æ …ý…1p†»LA @?ÿþýöC2+$ÂÞãwø¯[*jß×Ò7âýgç½ Hw€¦+¿°0@LL &)ðþo]0üï1þÈTGÀÉ¿¦ÅÓ?»þM®¿% øo-m$†»P×oª›DȦàÿ3á¥üÿñüg•ÿ;Õÿw$´½ý¯®¿#þ?`¸½Çß!ò¢Q!h!1r@üo¨1ô/ùjA­àh‡ÿõª£ÀAÈ#¬1¤æ‰üe‡»¨ÀÝ¡VºpÄæGþ2þTœ=ÕEºÀ>2˜$è|™Aì0‰ †š¿\PŒŠþÛVAZý”›¨ìì ö a%$*йzŒ.­ î¿È (L ³¢7†t&þy³â På§é/$jýF ö¿HãÿFŸåo$ BþE¢iYéËÏÍ€V@Aú/û‰œÐüa@aÐú(Úü ED1ÈÃÑúg?Œ þÄÌn÷Ä øg3Ìô¿!FBÀߥ„1•hËŸÔ·þ£FV@ä3°ãï‘0%1o, Cý¶ þmýKÿšÅ0fŒ"æ7èôÄ,ìüÄÌäòÄø]£5 ÊÆúû|1Ü¢Üþsè? æ8\ÿ€˜ãpû …0Ùî@Ly? foÏ_ð?´„ 1{¢~= Îþƒý$@¡îPñä8"d[ÔxR)OïÆ¿< Ü!fxt…¾#Bm½(€Ó®McWB/’s(‘”©¤Ûks¯ÜW ;$Ž^9ZÜÍNR¡I€€üv09ŽZ8ݦ@õ]m©ë»„\C{ ºø(š”ëŠj;Ì¥GØï)ö“ë‡ )}OLVלtðé™JóʈtÖÆ¹%©Î¶uÔì}Háv7+lBSH4ZÞ~:åÔ0!y»y|»¬‰Üblü½Â QßÑUbTÕ®%ý£q©æþ¡3›&M¹fìV¾‚ˆlÎÕ}¾‚îãÉû¸ >¬¬D ´Öaß´b¨sáZ+«²ó7nŸÁ%vMC/x‡Æ|zI÷MÍ„KÖ´4­ç2„Î2OÊŒÜïÂ3£…¬tÎJ¬:tß~¾^æxÝMr!‡ wð'™öá3¼hÍ.b¤Ç'oœ‘ôý˜Þp“<š¹IB$[Üøzkß@uÂËÐm!†ÐòG¸*s Ó=*Ýï X;¾o;Îewݱ.Æ Ów6ëí, »™YÓͳŸÇÉÂö¶“@nVºûJhFzÉ}¬%ïGŽ”³÷`ÿ=C)ÌÓŸ"‰—<’Nº`ÅoÛäwnïUêEÜÊHÞUe]ŽÈóºþG1|Q‚p¶vã¸çïŒÚÓ›DO^ëóXˆ]¿Ñ nËV¬9ôjb–äD€Ø…õÞÌèfz»Ž·;áS¸¨x¿Õ1‰âÅkÌÐáiËjªKPÏ_ç1ãïÓ›~Y9¥M>™!emÕ"í4’›\¶Š­•äMKùç%º$»=À¦EûòjuàÏ/«øud$å î¹*ÊÒŸu/ó¼hSÓýw÷ ÀÉ1s‹®*@¿¾Ý@ikŽú±``Í©4_çÀµûþKtz] “ \RÆå»Ýèw±@F³Ù`0™v˧oõ€U;-Ü”Cù |0yF€¿-ê‡ò …†ÔÄ=óíú@òª» ^E¾ö V&ª¼|V»ÇïTÆ‚Òhwez­H–· 9u£îÙß„‘8ûv–'3y¼n¿àS¶âæëf%ùø–¼eÏ nC32ÒÒ#×NøºJßg1]…—í³áÁEu4ðÜz2<"iç#½‰=âxoòǸkî‚—'þØë}á½e .!œû⡃«ºvÖÇ…ç'cÜ;‹ƒì ×µW¯—>}\ÔÝ8}n½÷‘|ãZ÷}¬Üµê{JxôϱޮÚz¹§£ŠÅÙziZ‚~Q›5)ƒ‡‡Ä,«<® : V}Ú#YcÓ€™‡Oüù´[†ˆ`ÀTAÚ0ùâýLéÕ äâ6jzæíM×õ„´‹àö«ûÊʯF3ñ®ëà½in”¸§­rà€ÿTŽG¼ëå·d§”dåut”éaOD¶šƒo}†žI}s¢@éÇj>’éúå»±évÕÌî­ãÅÐKE‹¤Çì" ejpÕ¹kGE*ˆÐÒª`8í`]ÊšÈg2ôµ[‡D¨5ÍÇÛ*Z¢’ê?ex€¯R!Æ·Më6LjŒKJé“úmȰúÛ-E©'xÎß¿ž÷ˆNFw°f©kn;i]xi=þG.?/{¿´DÛ”=\äŽEŸLN…hñ¾D俉»ôY‹±ö¦ ¥Á`õ™žZc½Fó>ÖaBö‘’v¹Xä¹~”,ÂAx8Ë_ЯïÞȪ´”k²_*sÒÞpv†µîrˆÎ~’5º1ìë—bnà±—Øsw¨îžuïhÐ|˜Òdâ;(.zöÎØÀt‰õ0¾i+±·ŽKÜš÷lSý<ñœ¢bKø8HƼÂutϾ]»ç>ˆ!0î²Ã±û Žk)þªÃ$—@:mÓ73ö>rñ\ºE¦ƒª0iýéÉOçS_!æŠòLj] –áwš€áAÅx9w'0« ñs˨aý ûa×s·Þªê Ÿ­à~O›–Rs±awqšI¾œ…Qt2ƒ¶œöÊg ß—á~|þS‡se·ï&;|f[[¹š~†­Øó~ÊâŽZðq.Ñõ½ß†´(Tª¯àòuÕÔ›?8»bT~ŸJ^p¸ø¾ÏÐ^>±àSrŒ“ÑT½ž©µÑ=Y¹ô4âÃáEÕzõ€˜,bÍ[j} –KA¡Кƒ:ØÉƒ–¶®€º¦‡ƒû>eºn.”ˆh WYΚ"¸,89ŒwâHj°ÄbmaL|DÛ,µ0•ëÖw4Î(VGkU+@Ý>Ü©ûJ ¢ýÀlâ±ý«7ú“êì+ŸuŸ`¦µµvþöC‰ÃÂ}àÈ5sÕ±|ý‘çŒ9±39(âåͤ² Þš›1%#‘ê;Ü’O¯(lZW®çاΌ2õõM³{]™fxcÐ;Ô  þøÉ]pY¶`ü캖y²¬Í7 º4ψwl©By¿¬jzUšà …ˆ<%Qß.—ÓïûèãþsÜB!q…!(1ƒ¢Ô™ybáù ¹-Š£›Zú% ôúÊw™À»DŒž•³|&ãQ¼õ7ÅËH+I3J楶 æW°ª\Ó'_§œ ”yhöá¯Äg4æöº±<€·Ê†Z”,gCëZdz ÚÂÍ:¨£÷8߃²î·<ÑÒT¤rzI@Rñ-õ•&™~"¥¤Í]ìÈVvé&)!P•¼Òå]å?ÓèøÚ›‰0¹ò$ÿ˜ñ½’N–ï¦%@Ã÷}žNîÉQ}(dê‡N9ê¾Nsf2i¾Nf¶¼W•ômŸoK…[¡ék¬²dXÙ×FRÅâõñO…®É(ðStÐf_PdPN纅®û¹`ÓŽª•PvâSð…GéÌFËæ±zºÎ¦¹†Ýœ,%‚cíL·^àÎ~ÍÞà½S¨,G¨DW ÓLž1ƒµL[YæÒVØÕw3êë,Ñú.®è‰ªJ0»´¬–Ï}³/i'³O÷SÕ @4 ²œ¥W™å£ÝKä"y‘<-YdwMYÚŠÿü asÇÛ@¢ë1Ú9‘Æú®'}­]PûNG¬t'iûj‡z# H‚p¨z=C\·¨¨%ñ– ùÕFú³T*ö+ýIEq1Ý^ãˆ9Tj²=í:½xÀЈÝÁö¢j_Ã׃ý )¬ÕÆújE×Ê çy·9ù±t1ÁªéÕì…±àEž]Óè§/%—ÅsO³×[úDJMÙܨFÚO.$Ž{Æë­þÔ7Êê‘?&Õݸ óB‡8E »˜€룶µyë Š½EÛ]K)ø3âü#‡¯ŸÏ­Gá Ý­r¨V²r3ô-ÜTl?®‡Ý£ `Ë_ÆH6Fƒ/¨Þå%¶iK­ &rÏMΉö­L>˜ÇÕ‹}­8c±CxNÁ¯ÖÂ~6 ›‰^ãëKrµ¿@Õ¯;ÅoZrW´ƒŽ†@¥®¢žx¼8E¤¶Øã =j%»§<=Cïq¹pݾF”ñ'¨‹¸»fóœþí £´„ŸÒÛyJ¸•ã…£¥5lÂ'öíwÒ&!UÁÎgäÁwÆ)Í}fhÚG•žP¬ÍVeÞ;{péí\TEÍLx§ w¨*Ï øß–ûšÍk–WOáZ}t/!3áR%õÅV)óæ|t³ëɦçD–8íÉI×UM‡ç)ˆ¥@Ó‰úðâkkÙ„ -TqñŸj*$… _œ–yÛïÚÍ‘nþ®Èx+î˜è)€xoÒj\èYËe#Ý3ÓêDïþu­e¾hÙ'Œ›£DŠæ¢‘îä¡AíKˆýPVɵVêªóA É ÉlÃ%BG„™ Ò7Ë*·cè’µgÄFÞ ž†O«…±^W§ó)<µ«§¦ð€ïÒZÏ#5¾: Cc»f½,Ór,4ÊäL³¿ˆ FlõöéÊU6ªŒ:Ù˳-Ë5ÌgƒäO—?P †p®FÆ›& ^êê YŽ—œ£ëòu$\ÉÛ¥êjËÍ©|pb_ÐË2Jñ}g1¼«°.3YÙÀ›PL:52RßâÎ4WHc=OÃåR&<«ÂùvÊ„ó´¢d—#cJÜŸÉm别a¶”é|¢\;Íþúnå3ƒj’Á ÿUÒñ’#¬ŠÜó¬Ån9¦ô*EYuÎL=ó%.,ÂÊÖrÖ°„â‰Ô’˜ýÉ&4«ðâ©Þ$s¾õØ|™µqE[ƶs#<ñté½´!~ ¢÷ÈgjŠ6YöúB§ŽqøcX®`¾«ïÛC1YÄ«/n'Co{˜Z§ —Â%çC ^=¥Ž4.­‰/ÖíØKæ&+wÚ·ŒÞÌæÒ"_ûÆi ‰V&zRHHÜ«E S ÆDédþÇÊwþä2^È̸‰~ÚÝ!zOÄ÷w$]™˜ç¶¼~úòÓ]ÁÉû–²).µ™`ZhBð+FËäȮΫ[ìÙ)‘ë÷5’Ìz+ä¢%¼Š^„ÜxuYÞý””É߯æ|ª}nµ6CŸ/ ôy—Í•ðfÍ—eaW?+îíûø÷‚+®ÌlLº;e¡è›q_õ¦FÁ¶L<FP=óö/—ÁÛÈôu›†½Ùá\˜É£›,4Û³ en¤Ux’ï±ï¶Sû„¡‡Õ­UzÜè‡ËÐÄVx·… CDÓk#k:-g*Xñ°/Cvß“ß]­`œE\Ñ©ß1È_gz÷yÒ¼xêð9çiω³árU^G4(Š_ZºænÄIi´Äáv¤šŽm‚%[jkÖîXñ‹É$§²ìM‘¥ã¨–u<í—‚{ª§¶ÆKñ³·ñïïs~¥¢Ù¼[•s2[};gEA‚l_빯҆§Ù«$ü™KÇÞ—Š˜µÍû9OyuY­[èã“Ì­ï PWq`”,GĺͰOUCnHˆRû®4jÛ`M–¹5’ù¢¿¼, º£«P;¤YOêÊkúa!Öq Emãš–ˆ±Ãí‰{"¬ê`ü¤&ͬw!x¾Ž&ˆåB( zÇÙ1~µA:Uì~ú¹Þ™¦À¡+¶Ž®íüw/‘/æ ºÛð?ñúEtmªnrË ¾ áðâ0ôѼVv¤móˆ·.m^ aUÖp¼ÏЮOWàÞø›+^ùF§»DÙhM®I(_‰†¬Û»e”ò3³˜V1šŒÝ5Í£”¼~Ãe6¢»„¼Ì¨°BäF|9½3Š”iŠÄúazl¶ÃÒ)5Î0û¦ÌCÕ-ù‰w«âÎ-o‡yk¹V¼¹oáWS²^ü õVÜ ‚¤2@3%býî]+Ç£i†W%‘~æÖü•©·Sn~^—‰²$ÿ€ê…ÆZ'Ñj(Øõ•˜…S‹B*ÖlY,ß¡ƒçºXGÌ a黚ÄÓ¶Ew'ƒAƒkùÃúr„åèéøË[Á˜K¡*˜„˜\GÌâ×/sc— º#ªR6Ž,£ù†³òíºTцÃc4EB?\e„Ú.ÉœC_Y:„ø]…õ¹‹Ð½ƒ îÝ48ÀÞ»—hå`‚ò‚K®”ÏûÓé5¼šÂ¯w–)ÌÉÜjƹš[™ØnÙø’.†AÊ8™˜-«úßlýȆ۵Q¾¨ÏïN*‰NöóÔØò{Ô.V'Èò€f¿mb”Æ…ô¾–!õéÒõðŒºìU®^ï d-ç£ð•‘vcsü4χ+ìzN¤È^è"ÍÆÁ‘®ùäjÛyê{ž—Ù½=²ïòt¯KÓ<ñÙkû—øÒÀïʳB!Hƒæë;Šp÷ÒŽ‡×”e!ÖmÎm·>:ÐÚ¿f¾@ë ¥ÈYû¯vPu劺,+5¶~ú¾¬”› I¦ÐW«Ó_o£lV$hÌI³R¹èyý¥ø¼¢,~â1ŸÀ€QoîG?ƒç¹ù\¦Â+ ó®‹ Rö7©Rj­¹¨¾%ݳh‹F ¯ŽmÆî€äD¿Ñçù¯Kzz$Ù&Ý;'Q¥So³ü{rÒ,¨•ÇšijÔL¥k\˜ v š©<4áü‚ïrñf—2´–ôÌ®Á¯-+`òƒW\™ahÊÓ笱ØÁûƆfg+AbiK²F"[qåD¼eÌëR×aûª“Qácé>D9ÏzzWyàl Ù¾§ó¯±9È$Î$Ó¿¶&#η0ïTÝ×êÝó+&ò4o1}ÓA¿ÜV×DœEéö)z ‚ס›c3_#"ÛÞ´×i ½4œŸþîpè’ØÍ CH¿ô#ˆ’f4úÍk›æ0Ÿ‹Û«„ÛðªÉ{®ž)öD+”ÑÒMÃÂÞñ¦,˜ëÚ°€ªgzЗKîm@Nk¯œžTßâlüá^A-õ8©(åCàÊÎåpžÅt†´È©¬D[ª"\鸧óµú•Qæ-£©)`óa[ç?ƒÉË ±Oi6&;×&¨ŽÒË3ŠðXÊ©æðvÌäQ¸U×ôF. kï^$}“hUq‚Õ¹Œ«@2ª^ѵˆpL¤® -žJ™Š©Áÿ2›M\lúdPŠ™Œ9'">’‡CýÎpèç ¦®\i³eõboCK¨cŠL;µwFFNtî;TÌ1¾¿98IaÖë33Û-/:q*×(ë} 1AM³ ÜÜG†9õ‹íɨ§z}w¯Ì1ÐØ$q@X(6¹N<ÎgßJ”ó8Ò$.Y¶~ î«OȤ©•ÛÝ!Ê‹ûµ •±¨÷©ÔH(¿ˆêŠg@¤¯¸’sÄš¡Þ˜{eþt¸Û>ÈâÙØ•ûžpý¢%ž™ ?™/’Àì%¶Pe‹{lgßH׫=ܶæâOmÊŒi‰î½ºèåÍ>,åò’Ù‰õÙ‡fãýõ£ùå‡Jâ!*÷ÊÝ×hQr¢À§yº‚ ø|½$xz´¶—C&™¬2Öd?2L9£U gu×ã2Fó³T°¾˜(™uÚ-Eï9k–ÌI”ÓA ú½AN[œí)r-¼kÒï´ž¤)|QÉó­—¿¹ÙSr\¸uÊí' Õˆ’+-ª¦zÝq:KÏao6ì•KDäÔ]ìîù}Á¦¼é-„µÔJ–‰À:}Kïši)+ÑzëÜÏáã¢ßµv‚îÊ«Ï9cèÍCÜ÷I˜Sk]™ê~¾—z vr8úRº ŸæYÈë(C_ÙýaŸÞæ3ìpöní”MtƒfÚ”2Òâx¿ÿ< RÞê-NŸ2£(€\náY`·6 tMFÔ•ñ£§ÂLL‚ψ{ÐÉuͧåÊ¥Œšq+€šhp.‰?iQ¥£ò*EôUÍøðØ[Eròמû°/+oizïšÌ"ͷ쓇ßy·¹ïÜ00ì\úc#ÊökÈFÕ÷gÊ qÏ[FWÔ´5)bI3iÜ–`0P\KAã×c^¾ÚH6ž&â®ZuÔl¦Î£ø…“Ç£N81œþü ¿Ë(åYñàXªN¦vØ×<œ£Õ‹Ü™‘î rtjQ} ˆ_ÊŠ‡^ñMËv|¸îêäZêîjf½­Ê)ÊPoŸZ)Š(LîUÒjK ÝçrGŠe}UšS%Ë”ªY#Õé{âjPg˜½±nAà}¥á0{9ä7ïÀ‡Œo~¡!Úø0úP œ®O©#¢…V(B@¡{$e5–F‡ÇY—0<µP[ÉŒŸd„ò*kºß—•GŒÌ¢ú¥LE]X¿d¥’¢jW%2s;ž¢û /Þ£ ±i±®§ýGè¼—¯yr2 ÌmfŠ—(g³²C!ÚPµu.u:,2ÉÌÎ_!­¬Fè¤w)ÎÔV¹ädÏ2©m3VúýèÈ4ºìfÉ‹¤œaœôNVñ…aý—Œ­Ëï:œžîí5â»ÁN1÷ÊÄÇ´öÚô¿óÝîn•"Ã!ÛC=ª¤’òŠ¿c¿ëKTm•·Rœÿ*Ø‹j$áã|PD뇽M¡`î,|Úº”êÁœýÙ°^+¶óššý<¨F,T`­K#i¢ ‘¦Q¸P#ôè6Ž¡‰]X~™-F"®ômr©«çl7n]䦿AÕJcTü„­´Ã!Òª'7 ‰ŒÑM¸ŸåduñøEŠ\+ä>ûÞ½¯IÌ'Q­‘SÒ+·§Å]?Ý¡*¦lÚn¦õÊ®´…Xz8§Ön¤GQ¬Só~žìSŒÔ÷µ­« 'úsÆNÑ‹*:º;8¯`aÿXl’ñ(c5DQ=°ÍNé•rðÿfÄs0“eÖêÃIÜsû¸KùdTç3ì–ÔÛáR5Ñm°€’Ðç £Ë#I?òÔ¿‡ø²TSj~ ÂǼ2­Ý9¾ÏùÎB–Ú®Wë„qñFªs¢[Jž›ä+ËÁíoZ;'¶~¨HN1³½C³¹Îˆ¯a»øÎ™˜žÜ˰Ã²Ê öC1£ú¦v'vÝ PŸÍq:»ô=²¦á3‹´§\\ —€ÃmܺcÑ"Wíw ¹ÚHGÞ¸Yï^J ¶˜€š ½[7/(ô ë'Eã©ÁçœÜ=ZÕbè¹t„RÆÌ À'­ä†”jœ+[ÑçzçÎ’”Åv ýc«Ë¼{uËÅ­/f'³.jSykâìç,—êüí˺½Ñ¢âù^“1îót‘õ#Sl"C`+ö¢Z$þ;©çX¦…&$-¯»fÒÆ.1I”.¬Ê=£þ¶1u9©rûiO‚±køgH§Å:-ÍKiÇg";œ=/!„Ï×2¿Qoed ×~òaÔrèƒÐh™~ÛhžÔƒ„úó°cKzI?¢IoƒÅñw}Tɧ_†9šÜ·b•U¿$÷©Ånë#}%þá|†7ÓáÆW•Rl{Ô}ý~þíà÷•Bnrß¶sI{iúy *¾I£Ép•‚0µ•³… ®'”«´L{3ïã£`îàèðNyI·Ôa¸"IÁ5Œui'M¦L§ÇJÚSM‹®à½;)ýØùv"ãÐ 3#б6ø3a¥B]Îæô‰ºýÍfرT]Ìlo>Ø¢. V/6îs°àÝôZüà¶Š?ɹäÄðö%-l¢¨ö`Ã#ŸÎ)™À f× aÕŹP9½“|_eÏ©zhúâ*°y–=ëy^£•¬f”ûi*É6\Qni?’aÃc‡íIïóhxqxÊàrä’ÍÈÄfª’’eÔqŸ‚¥Éì'³; Zwk»„lèªÃÿ:zºMÚÛwÇ ,h͹ÁTô´ÿ’E/ÇHºb?’Ù9‹o%ˆ®/«à4Yâzeÿ5°q—²Ð$#jL'$‰¶¹~³Ó)H‰@2ê%É1±º*Þ¦âo ;ß}:M;õmÐÁŠPAQÑœë\ëÿ'Ëw endstream endobj 298 0 obj << /Length1 1484 /Length2 7838 /Length3 0 /Length 8844 /Filter /FlateDecode >> stream xÚ·T”]6Œt)!Ò1RÒ ÝÝ- ’ 0ÄÌ0Œ4H7*Ý!­ %ÝÒ"]Ò(Ý|èóçºÎº‡éés]N˜XEròpEr*<@ÈÇòâ21éANàü¸L`„+ý„ BÞûäAÈ{  P}éàáðŠò‰^ Pä ! ¹Al\UìŠË$ƒ{" vöÈûuþy°X³xDD„8þ¤dœÁˆ5 Ð!íÁÎ÷+Zƒœº0kéù_%XÄí‘H¸(7·»»;ÈÙ• †°“då¸Cö°+á¶ü  rÿ=.@ÏâúW@f‹t!À€{‡Ä u½Oy µ#÷«tUÔZp0ô/°ú_Àß›àáâùW¹¿³‚@ÿ$ƒ¬­aÎpÔµØBœÀ-Eu.¤’‚Úü‚œ\a÷ù 7Ä duøÓ: (£ ÝOø÷|®ÖéÊå qú=#÷ï2÷Û¬µ‘ƒ9;ƒ¡HWÜßýÉC`ëû}÷äþûp¡0w¨÷?–-jcû{ ›—pn}(Äå%XEþo̽ ÷ß>;0 â€]`k{îß èyÂÁ‚<¿Ý÷3øzÃap€íý`_ˆ-øþ×Ûä /Á¾Þÿøo —‡`±F¬Àv(î¿«ß»Á¶Ù÷ç€xL€÷ôãþõdvÏ0ÔÉóßð?GÌ-o¨m$§Àþ÷Èÿ ÊÊÂ<Þœ|¼N^ €È/ ºðýï:ÏA¿ûø\¨- ð»Øï~ï7꟞Ýþ&Ëß aüw1MØ=uÁ–3Ý(´¾ÿâùæûŸ”ÿ?šÿ®òeúÿv¤øÒÉéOœå/Àÿ'r†8yþ¸§îKä½ 4`÷b€þ/Ôü—v5À6—ÎÿUA‚îå µ»§4'?ÿ/?ÄUâ¶yAZÛÿE›¿üú¿ç‚ŸÃ\!¿¯˜û, ðb÷*³v¼¿F\ï¹ùWäz/9䟃ümƒïEõß}(@­a6¿ÕÇ+ ! OÜûÿ·Þ<÷2µ{üa7€› CÞ§îgöØÂ¸¿ZˆÀ­üÛõÇpþÛpýËpß‹Ýô/ðîøoóž@ÜÐÿ0ïKÃÿ˜ÿÕ±õKâ~¤?T»çûÏå{€­q¿Mìłª‚›Ï+d¨Ü9ׇÅ1RÎx9‡óͱ‘= ãËqº™³j¿uó(š;´iʺœg-Ìy¯}¢«öä?å¤SÜ´£³z;}wú`2ÞûŒš~š åa’,­h¢å9Ma;Ž”].ϳª®¯ñîÌ$ÅŠBª!Íš­íÅê¤Ô"»+:È«ÏzëÇäϲWœß­F›F$k¦Ñ«‰·^àÆ¹—.õõž#ê¦éˆ Pu \ÿÉŠ$RûL-ÏUn0—ûè:»Èm'ØÛJé±ôŽMOÉ"kÒy•æ¡ýÚáŽÙS–„v!{ËÛhž]¯ "ø‰l "'o#Òæ{VZ]Ÿdü™«AW*D¹sáã £jXˆšçìdרÒõKµd“‘Þ`8‰ÛÒµ]ߦ–7ÛPÔÆgIDk 줬۾¶A¹½ŒN™s§,!“†¼&Â)öÍz’…s"ÁþFD||Ý )eú¸k~ôaŸz{ñßæµ¶Ê2Ϻ”GAcˆ£½–>Íù¤å¿»<àáþRmZ-çåî¼|êSî±l¦Þç +ðýèÕì,°·4Cô:&  Ëz¿ÝCÎÕAÿñûjwø m)ê[”bÍœ’ËãÒ¡^X3 ®[q@ôåŽ×Íj@^í…ñáù1ƒñ6;Á¾Ü–­ö1EV¯X;܃¬M˜ ?«ŒP„<Ïíp§ØSèÖ…ä2c¼ò%†ßrŽoÛN›@WÓ¸=TNü^[G›P£¥6‹°tù'6T/Ÿ¤ØDCWÈ ëë¾ÔtÙPÝ׋®|#oÞ8æp˜G[Å¥ýôhÀá „ð[Èb®n?Æ ž»ê¾ä9`›%šx@°kXSÅÛ‡eÈ_e”D µzHöÛÎ(º4¡3ÓS8ípHÓùéÇÍ~…·¶Fº HK!œw^ó2š‹ƒWg§g*?58› °©}Zë/fß›§W@ðM@”cõÒ„ÁZí ÛÜ´»×È,£èrb¯‡Ž²|í‰E÷IK¯•à:OŒÊeð!sˆxtê,V"|Û¶¡Vü§ƒÚõë FÇz§Ó&‹cgF3ÂT‘UÎî œu2GúÀ+ʹ‹½‘ç<Þ£)I 9¯§²g½­ôZ›m1CWör>zG¨ï0‡··ãöeЬö.]ží×,JJ<ž]«ÖËùú¶¯ãž6±,ŠF›n8Àå>ĉhܤ¡î 'õ¼Ú«äœ†Ü˜5Ê j¤ò?tA/Ù^ú¶oŒ%°V„ £ëêL%z’‹g¸Vó:$j™7/52µã¿ÑÏl Yò–œŒáÎ)-/ç [\3•ú¾ƒ'³ùámOÊ/I‰eî._øS¬}ló¨m±13_’n«‘†ãCøÄ¨«d{dhÀWW´}Ç'øhcôÕ¬·6,pq%¯¿\ëÁÆ$ò٨׸ôÌ÷ÿƌɘª?L *ô¯òÏÐæ}Á'JžYGõYÜXiÌ›çüÎÚ@…¢MÅ¡A ±ñ÷šÿ ¹Êkf -ŸòÝIÐ !R›Ü<¿—Û›³u(«}«ô1=þjáþ¸†Rc'ƒ­¦;ÒMÀ—ëCH!YE6½ ¨¹šèØx+Í÷-šà{^_µ ྅AépS4Ö÷Aî"Áv¿à¡£l\xï­Ó¾¤{܂ѶøŠ²qLE/º‡qËc_ÿ5ENÆtút+’§,5^ŽòÚ:VH±O}¶òë»3ñÖ4)Nù?N`ò_¤/~š»saK·´ÓþPY…ÃRøCl  Bû¡>]°ÜjsHZì¼KE¼Å¬hÂ…›{rñö¢Pj˜<¹—ÒÜhq\‚E4n«…m¸0ŠºZœ]üò8ãÈWÆ\.p‚ÿe¼ø¢fê+N@%確±Á‹V»üFY&ƒÀ—ƒ¤’ “ŽUþUOzÚÕß¶Öž¿ë‹ÕO®8M_h„9]ê)S†Žßz¦wƒõ{{ï®]CdÐç2"a!|tÃ>ft€r³Ôµ *¯†€yÍ2æDÊ¥)}éšP.nT±¾1•Û#Š^ Œ…­þú_¹ÕPÑœfl=\–rhpS9‚BrLH½æmS*ý‰“glUØæMl)$P5ˆIù&X™š½/#ŒwùPV«Å‚ÑfÊùâi4mÖŽj®2+5Bûôm ¶ÀiÞ+=r+u_nÉaGâ]ò3 m÷\­[!Rëp*ÑÄŽ\} RõçR±5}ýdšreº§Sƒ©‡³’‰ˆzGÎÂ×ñ×ñ±Í80veÊo oF1Nøf=­SŒ\쌬¿¥ÜšU³x…k£¤ªÂXÛ˜Ôeü™å+9©³ŽËæã³A¬à`€áÉqÄ3¤W™h ~3.ài¨æãå?~´šüÓg¶‰•ï k³b Qæõo¶]oZÕ¯y䪵ævŠÏòÆ-çEéãk~H?åúñؘ¹™š²Uñ±Š×+sêWlpJ®¸® ’§Æ©{Þ²É*m#%»Ee‡tŒÆ‚5óEêѤ˜Pá‘.òa¾µÀîܲtT ¬G€°ÏC]~¨M&%²öÕMf!ͨ6@=j/ö×cƒWž%)pšS5;ñ2óadì}´ëîoÍ1A+—\ˆì 4Ú#“÷œh¥7u»'6ƒŠ¼Z’Öß Ê0¶—Æ d?à©£rG¾ý!Z/Kz˜^˜aöW¢Êæy)4sµ À;NôIkŒg©$åÏ^,bÙú)[uÃIäØÜÔÕ›äX°||Õ¤F[æ5/½`‘/ólc¦ýEãD;16£ÇyRÞícL{ ÜoàgÙÏ.6÷Pˆ ðb¼ °Þ[8êFÂß´ÈüDµ/B¸â…´„[b¨Åß:F57 *)ØO2oJ= ä=^*£²LÌ\•‰zš3•Vé%›é ñv ¼ÚÊŸQ²uœé‹…r*ŒQ®‡ÄÚô¬VæÛÖÊëÚ®[xZ%KvÕ<\øº –¾X ‹h>¦o½õ3œa æ Jl(ÄJ—7&pðš/!>ˆf³Ð(K–‚7gŸÎš+?ûÚ7ó.Ø×Ù0c‹óWƲ̰—«¥«•ïÛ¬èo7]®õÒ$ñ®ÍܨÉY«ŠámÁZq %ÉNûQ ö¦J–VNA´ÂùiuŒ, ‡ŸÍõù—»¤UOž¬ÉaЗܹµEÕŸ8Ü¡ÄH¥d_Î ÈÐLÔmp»Š¶šõQ‰)ó–…´TI9µUWY“¯Ý¢œó8øÍP/Úên°Q|¸ùËNoÆ/щÄKèM'£µ®ÿ•ÀÓqYÀÄÈ•Yé§Iµ~kò8 Âbø¯ÞVß¹¢Ód›oWHØÉýÌ­˜—ºØÜ™ñ‹±0‹oFøÝÿ‹TŽ/àF^ãum ʽR²{Ýrñ…J”àBVB„ñëWß9c:[`ìÉåg{ÁÉÓ :p©ØæÀ#ÿqîb¿3¥[ BÊò0Jþ‚4ÏZmAŒ¤"Òàƒ ~ì`}yIÂGÂiø»|Íîžf‹Ó¦s®¼.Îû·RY\_ Ôj/OżONôø CÛ³;ßiæL.a¶:î,uÛ,yt¨Ø+Hô…˜Å™!zqí¾÷U¯öÒyç)Ê„¡§Þn÷˜àT$ãNÅY¿¼ñlÐ× p\B{{ÿFRÓAU2ÐìÓlô|2Ç ¥‡eËkalÛÙÛ­åu—&’-{ðWš5!Š|jå ež…Òqr3=s›Ÿ†©¨¨C±øâ •ÿ|~¯ŠòšŒV6KY¨ëÛJ&–¹+ø°üwez^fŒNx$žÚ_E„Õê1ßS‰— GÚ[ ÉØ,;òâbŸ*ºûë.¿©¬_ðº’ÐäÖ.^ÉTÛ…*ÅiêöEZ÷òN^7Î ˆ¹BçW…¦ä^›ËÉæ,GmVHÌ#ÞŽY&’d8¹|dá5›oKÕSeªm&?ÑìJÃy’Î~á™Ç¤>"yBdùÜO÷ŽNBmþNJábC*=ùûQD”‘‡Ñd&šÛcÎ׊²³b¬ÿ®Ô%£† Õ2x&ƒ÷1^_¸·¯ö– îŠO}ñP¡àÔɱÈJªÍ~4(¦ ÍŠ‹àõ -' þVëKÛ´©¶õUÍ@/ˆ¡D˜r9:+® ÚêÞŸ™5Fª`MŒŸÝUÚ%¡r²Q¤ÚgùóK‚«ŽÇÁBÜÖ[´n1®YûbìFyeŠíìoÀϨÖ5~ ¤ªø«¡õ¢.褽Ÿí=Õæ«oÅÄï²GC®ýº|Kêq&‰ëq#Ún éÊdº­¶›ûòª¯ÖœJ™œ¼Ži ?×ñòÏå4ùÕLkç7¤~é@ÇÏé·—æ³ã¤us.}TñXMÑ©0I|9ÆÝô¥äÅYý’ÌòÓoò÷›~Æ•®,l)öuÄc Ô¥é1nªhœ.{F¡¤ “òskÐøTÔµ1dKX Röb bÄ">vì§…änbŠ[]$fd7<À]Í&g§“x˜Ž®ôýÕ+/aB!]œ9´Š1ÂñdmHz»¦0% ¤áÞ™DFÂÐ_ö¹J9¶*_¡MÅÃGª‡ U“ûÃ}F&¶[µhY]F× ‘8IZÙ¨yU=Q³¿ZlôHÜÅÞ°'—k‰¬‡Êø’¿3Å[ö4'àð°ˆî(ÑÇhzÓ¾øNP ;ÌAvvUX*D*øÇº}ƒ£ÄóÀK<:a$eª=P±8×?&çqsÕòoÒ{ðé»ã”@²‘ëe’òëÊ GC¸Ðº‹§Î¸xí²žÄ1g†[8úµÒ‰o…qþ—uêäqù'+õ—³Áô"K©zZÒª¡]Ôû·ˆa îJ‚6fE=_³_Í|ï‹t™¨™5ê=còŒåòp¬.Vë cØqdÜŸ¨åážµ¨?Æfàä)®Ñ8"ÂÄ1ùoÏ5ú-(ÍôÂSýž¥¸•Ó\Ii{â:,…Œfå/'¼êÀKñᬰV'D>®ÖC'ÊÞ÷òûLD„šqG¥~I*4YðQ‰ýEû@¶ltåbdÛ¶D=6ó`€žP‰°ß«°· )ãK½mN‰ÂtOjéªzZêíU¯ê ;r¨sYbî¬ÖÙH%|ÑTÖãñ@â SÝAEõ«¸A£;JiÏxÂÙ;:6º7ŠA‡ÉœÅ]ß?]½ò‚ }.˜+ùdSŠF¨ð*þªŸ¹‹$ð+foQþù+õ.)`õ<çÔꬮ¥>J  X/-Ÿ´HܪGVÕ-ŒW õ µ,C©Çòsiy0zÄyü úõúܨž"§tÀNXM‰ÄbøéiÀ4ìØ«Ð0èçàD´Ó°™ý=YíSsÛõ´ºû÷®.az¥­ö‚ˆÙíCõxfQCãÈîæÔXÀªÝ‡üuÉèˆ0T5¬ô‡ÒW|S¦ûºš¢ÂïòHŸÙ¡o.bëK-°®MêX1]Í¢ëüS6%#®v÷ù±¦àhÅá–¼ï3râ¦XöqL-fS0r“/¨–´*áÕ/ÅÓötdQ5N` öð1½-¦îÃõœ:9,’l×8ãÅ»ŸyÂí›7}T¸^vXj?Ï;›dµüõ>Y[»¯v‹åëŒ?^€<ñ“yQÐBp ‰Æb9,œ[@‰ÍRjHGQ£øáR—ÿíÔ Ýêëmx»íì"*í¥U —‡À¦4¿!vO­{‡ØD׳Þ§Z¶½–±KúEx¿àÖSÃ%Üá·— Oj{UÏ9®Tô:Ãbn‡=Ó¿…íÇ?PN‚C6î ¬í³ÌȘ¿/¾Sìšmè$ÔÊßbdø‰ýT^´%Š%„‰‹D¾š®áó¹ÞB=ùRŠºÓ†˜íR4lxÀk&äÁ²ÛÈÇ+{.ÜÌFÍ…î&@“å:`%~òú“™ºv(ð€í¼Vm/q†½NZÌÅ9 û0ñfóVŽ¢Œ‚=é]¯¿S?áA…ûF·.X’|Aê¬]è"ö­gÀÅvÎ&ˆ.ÿ‡¼&±Év0xZæ•SfôíÜ$€¹°‡9¬ýncòÚ…«,ªÿœ¦m~´ Œ¬{¸`§Ï)ÁÀƒïD/óþ)“º•%¦•®×Dµ8Lôí”n Ô/˜ âîóœKcê*ê‰%èc:ó¤ff¼*Ì KÓÛ{‡i–Ó$z5‹3…=»˜ &M=iv{¡N®asÖ0©õ¢×VaáØðêŸÄm™Y)E‘:zþilëåÒK|Œ¯CKSl:Zö‘Ù…ÏYX‘á´`×/Œ—1€^_Ê}’ó°0óÓG)õ—|Ï;_£y œNÇ–ºK[4m¥i”¾’óz{4y^9Ë5¿ëÛðôÿT´†²aÐ[¶B¿ûˆéyÕÁ­ú(âú<1ªM<Õ,!š› ýÄTÓZþ–GÉo?6E/ª²â¬—=Ø!ó£êœòIKåÖ[ùq|…ª..qÎ9œ®ÌáÉ¥]œŸöQZ»F½®¯>Ðò]”G½&Á¡©¦R]_û¡WÎÉ?Ê=7¼[Ûôõ†êzÇ…ìv'öÅ !Þ-¥ÕÖyÍ¡™†çè\]¬†]²åré&ëÒ€Öq :³÷Ó"Ñ×d/HÎê”B 0_üÔ“Oå¬P%pM|\‰èª™-u—*1ÐfÜ+G}r‚›Ðï¢1qÚ Ë+´§Ë’ˆYñ¬CöÍ£„üê⌳Ú#ÿ“'Q¯G*WjêŸï‰p¯S˜š´I:qcñ_›ÎŒ9îÚ¸Ó+ÊÙxH€!ˈ(a¾eqµ'ËûLÅÇß-w¡„¹À©Pø)Ëv;^R¯KNáßXø*|˜ºØ¥Äbˆ÷fŸ ]VÂã…ŽnÆÍ«lŽ!ü¼ÍNÕ î}Ô,Â~ä|_Ýž‡^i´fE)–b;}jø|èÕTsµ,hÍèÛМj ¾Ê³G9—{E‹¥ƒþ˜FíÚu-¯b:§¶F"Š`*ߣø­4$ßÚðeTˆ2:YŽ£<ïz3/ÞÝRõØëË žgSëŠðô;Ù\ºK”Bõ„ø&¶—ù kjƒ§?ŸFF‡‰7Ìò–êPô³ùu4¿¼aËeŒì@øÄuòPzjÌ¿ñ©vòÓííýè>A—'èü²Ö"óK:Çi÷*K£À·ª!‚‡*†û=›b;r%ä²w¾«·ô óuÞT%ô: 0Šf-ÍlŸá§=é1Ô @ˆ)l¢à’Qß’›Œª¯';m$©cÜ×ô”ê”´¹ú²^Ídl‹½+Õ{UcëfRÃà ï«íf~ãùkãÈ6¯ÚsÅ‘ AàÑ%#$!Ÿ²²©¼d܇Ÿ\i¤æ‡r]sÔÑU•Ú‘NLqøîŽSÔÿ.·¢Ró>öcœ†î ]Áxäh#Ç,^²j°Qà-NXƒâ&§hõ²¼wM‡§øT‹árà–ªutÁÝëûK™µ …p؆ľ–¬½'~}}KOÛAQËr Û®0™Üз˜È ÈA,&¹ûäa”aˆd`ŽõEþ/Wèô ×3Yì!×Í*†Ì'úôya–%{_eD§ï¾íN …1°fö4¼¯h•¤Ò‹jÜ--•ÍÅÅ zæ.b²Ót´lˆ“¥“ù ÌUœET3 ƒQVĉ6+D7HÍ#D¢,te³ÐJÌô$|~èÄõ(è—y…ƒd¾©r¼ªÔê¡ÛþµûišP¶Û–}_0Õ„œ„8$'eKJÅK9õ¥šš8K6.½Œ<°0Éy¹à홞ÿâ…hâ/Æ;´’gWçŒ%³-³3–tèØêbçúÒØ|w› DÙ²ù~œ ïÞ„SHüm—&×Hè:壙ö6“K¶+ŸÏ£ëâÜpúÙ¯>ÓëÈÛ?A„ ±»\õ·MÊ(¾ ­¡Îö8ý´WgÔ8S‰âi[AÐg¦(Ï„"P~Ë5·$ò)~gl—Ÿ—£!Æ6nâ¨Tób±ŒëIA§O'J¬¨2óm¦›Cq†µæðWdÁ`Ckß‘A=öbû\µ…©-3±Eá[úøbë丬)(E1Kã¸hÄZC_]ꋤ<\CÐ~Í}2s`½öW/ÉFÛÖ«1Æ~îá—^´äŠyc’½{!Æ$ë— ›I/V,”Z9(4 þÔ§“Æ*KÄße¦M‡µž¸P÷©-3dzÛ:éíµQ[Ôç⑘ìÆM°}Žæ¡ÒžßºTUîúq¬Þ`—­÷ŒÔIb=,^ìW¶âšÍ!88Ã{uóëbÅ|ÿ–ü%ÌçÑQÉ+hVIÊ ±dò"ôë¼iÚ(Y²ZÚ9>–‡ÉžË¶O+Š›zç·gSØ3% 0âë^…Y>: ÑV¨±>½0zÙZ}ÉÔ/:M‘–•¤mQýtÁFÎÀNa0MQŸNˆÌŽæxŸ:Ü­*´ãì«CóN¥În}éÓ4YÜqñ­à ïÏn)-B´óœAµ×þõ%g´K¼j4™+/ÉѪûÐÒþ+Öª¾Ã— ¡½6`ƒrS3@,À°„O‚I-p>ŒÖZ•å]µ´}T‡ªH:¥â>× ©ÀÅ×ͦô ò¾”áã?†sß’|xXáIìø•o·åjÁN$oà<íÇâöÈ ž Àšï<ÙM¾åç'Óˆsè§Zß–€ê»CncÞ½›ºœG3®‹ÙH8:¹ï펛ì!²ôµäEcñ‘B„ΨGkØ%ÔTy1¶ú¤P©†*î!Ÿ^YLDñ9¶‰X†ú,ZçÐÏ ñÝÁPøLÞZfCø%Ôo2Øy:ÃÀÏ¢íu]O‘J‰+£'G÷Ì^ceˆëCöìÈ y±)¾‰ùìuYÏD¥Hl™0ìjÅN‹„¹[ŸoUÑ“^© ) Mì±ÄûÅÚR m™ÆÊM-ÙŽz³¡‹$7> stream xÚŒ·P\ ´-ŠkNpwwwww§±àîÁ=$îÁ‚; îîîîò:3s'™ûÕ{EôÚ²¶ŸÓ+©Ò ›Ù›%ìí\虘x¢ò*ÌL&&V&&rr5+à?br  “³•½Ï¢N@cLÌØd'ooqµ0³˜9x˜9y˜˜,LLÜÿchïÄ3v³2È3dìí€Îä¢öžNV–. 0ÿó@eJ `æææ¤ûË l t²25¶È»XmAMmªö¦V@ÏÿPPñYº¸8ð02º»»3Û:3Ø;YPÓÜ­\,*@g “Ð ð«`€‚±-ðïÊÈj–VÎËUíÍ]Ü€ÀÆÊhç òpµ3:@ÁªÒrE Ý߯rÐþé €™ù_º¼YÙýålljjoë`lçieg0·²%ä\<\èÆvf¿ mœíAþÆnÆV6Æ& ƒ¿27H+ŒAþSž³©“•ƒ‹3ƒ³•ͯÑ€º,ng&jok ´sqFø•Ÿ˜•ÐÔvOÆ¿'ûÞÎÞÝÎû`negfþ«3WFu;+GW ´Ø?& Âo™ÐÀÎÄÄÄÉÍ :€¦–Œ¿èÕ<€)™‰Aøz;Ø;ÌAE}­Ì ?ÞÎÆn@€‹“+Ð×ûOÅ33ÀÌÊÔ`´°²CøÍÍÿÆ á;Yyt™@»Ç `úõóï'}Ðz™ÙÛÙxþ6ÿk¾Œ’ò2"RZ´Wü¯NDÄÞàMÏÆ gag0ÿZ2NÐßÿÒ([ý“ƾÒvæöµé2vûg¨þ9jÀ¹ìA[ Pý^r=&v&SÐ/æÿçUÿËåÿoñüß–ü'$ájcó—šê/ýÿGmlkeãùhi]]@ o:»ÿmª üûhåfV®¶ÿ[+íb :a; ›Ûhå,aå4S²r1µü{[þ–«ÿº2+; ’½³Õ¯Ç €4šÿ¥–é{Уô’©€ ËùoHq;S{³_'ÆÂÎ0vr2öD „ØÞÌ [4züµÄF;{ Tž/ÀÜÞ á×D9،¿D#£ÈoÄ `ý¸Œb¿7€Qü_ÄÉ`”ø˜A»ø±¥#P<ÙßOî7Å“ÿ@ñ~#P<Å(žÒoÄ`Tù@ñT#6£ÚoŠ®þâiþ‹¸Aœ:¿Hgür1ù@õ™8›¾‚Þæ.¿å¬ÿÊÿÞú äMÿEì 2S{ÐÄÿGÂÆöKbkû;à¯U`4û‚B3€ÚüOfPlÐr;[þÑ/GWÐIý¦uÊü7˜ÿÙ~A«?8Aø7dgýÝ~gÁüKð›œý—¹½«ÓÑ@@ÿïìØ@£°ôt°Úýa’ýŸ T¦õ4’÷@Pÿ, ÔcÛ?Jõï73;ÈÕtOèAµÛÿNälÿ5¨‡ßj™è5i÷Ÿq³1ÿ#ýï°Ù@Y;€löŒïW«¯ˆÜÑÕÞhfbóFV¶ßŠÿ’²rÿ£ù¯˜ù×Ìþè83¨Î¿«99m­þ»lì¿l€nôDâ zÛü[¨[Î6®33¨¨ßaAqFK'à ê‹»ý ×? hXn@Pfî,ÈÛã¢÷ü‚Úåõ;9“ÐéïPÿyšº:†áò×Ë t ÿƒÿúêzMægìMyC¬«CZî¾ ã¹ÓoðO’ok~¦¦÷žwju}x û‘º2=hÕéFøã@ÊÒ¦8ÕµÐѳ÷ac-쇦$åæGŸ'Õñíf„¹1¬£y‡Â5½ðøôjB;>ÏŽ>ï!ÁÛeȳ]¹Þ*}E¿sï‘ô¨é-Y ›ÙVÞ©äE|*™ QÖ ,œ"Ï1ɘÆ&q¡'€£A;ó@žº¾™DË}%’I Eð=ŠaÍ÷ÖYc‰½ŸöZ.ScqîÀ!ÃÑÁ&€¼F§ðÙK‘y7ë]”¿ôcΣ‘/Ÿ( ‰îÓ= ÃKZ¥•J”]}w•ÛÐ|óVöG@%Þô­¤ªâz C'EÌÊfÃ(t—*Ö÷@‚½6s‘å–NsëOø Ü5¯€)$mËÀ†NïÇZÇåÁô·aŸšîê7;}5 {ñ-Ü™iÄ-u#—yÒ>A—¸ Cth¥1PèÜ>r=A‡òy‹<à2oä11épAwƒ៰gûœÇú–×)´­M¡ÎÚ¸£é¿s(¼š´:;Ëñd7J£ÊIïŒÈY‰£Tæ­ÖM—0ž­•c1ˆ{É%n°Ï÷‘å³IKvoÏV DêyZßsç2œh”«7dzç*oEÑïÕö‹‡öpߘímÜ”–Š`îÛkÜŸ•»‡‹ Ä®«q†äD´©du8+¦J GAÜnNwÛ«‰¸ÛÖÇ!kªñ?lw<¹Ó•H‹‘SæÏË÷Êîó}ð™×ŸËïÆù „q]ÀRݪxGö&e9–<}g’Ô°u ^ãüWOUíî+©×X÷ìÄð&ñÏñM2o›r½B¶ž/{t*¤MñìfÀ—ËU~ªèÈóȆuwáÚüª´©ÀÕ£þ!(RØVV& ‘#)@^1eúŠ\>-ÆëLR¦õ†W†ÐQ\…³^õ Æ5_h)¿^‡68Ùª˜`¸úüØÎÇǬ Ée»¾R¼/‘8[V•ä3əijãr,`ïªt3¿ ^mæûSG›‡jÁ™î¡FÁmòMSbôWÇ¥œ« +±Šç‡ÐóT¡R¢®½Œ ¿•A®d€žï©•“q)£èö愉ç¨B Ôëë8œž‘šÆKºŒb,|+1káN"Ážç~®NæSùh¯Ì7²;ò qÜÈï;_!3S±\ê+_ó¾íimýý\úÊ€åÙJvÈjù~\]Ý·oi‚8F‚—œ)‡Xˆ†CÙкÛ.¹<”øØ˜§ .ù]Fï¤À‘x9R|d]™÷Y¿¨‹‚A[}Áª•r)¯Ÿô½ñÄ&œyñ3%$×[u< ÐkjÚaSds#ÖM3¼•núúí´¦ò óÇŽi.Ó*A酼̽|–6SÙPœ›7Ç*vòŒÞ]7Â)Ëqà +ÿ-dr†Ú„¶,Ã’,öÁu'Ý;ÉAYoãpQÉÌVBÏEª·‘²”aÝ,ŠL“Ÿ*8¤•ÈÈl÷Êè“Þ­év`N‡¢îúpápd‡f)XÈ-’M*½>ÜÊ á¤Ò¹ÚûÉ—±ô`{­¸&¦f˜â ùÒLS€ÔÛ…T:þÊÝ>R´*Ø“+›ŒeJýsôv]ïÌ"Ë¥œB°x3v´çêÑFíн5i§…,ÛLAO´!-odAñffT(_“ŃhË‘XÎl¢bÏþÐo‹Yƒ1º_„_¨êêᘘ)±S;ÇÞëžìø~ì¶/€¼§¼}|Ó}}eEß¾¤{Paø,(mùÙu/GÄöDæOó[¸¹3¸â~OŽÛ Ž…RQ¶œ»ê…;E1ýáä·ÊLI¯»"îlþ~ÊÄ-ª¡çé'K…‡Úï-E4ÀÛÏÌrn¦Ó¶˜ÐVuý$òG¶=BõšÓaåØyå¶K&äLóŸ¡iŒ¾Âöä$­&1š_wgØ´’+‰³äðjS«ŠÈ1îð•`°£—ˆf ç®ÞfØðVxÿì@¤"mšÓ‚¶“€I$‹û Âå­2gŸˆÚÙ£öŽjËPó ÂDøÅ_ÖÇ^Ñ}fò“&êê ~B+’ç–üÞ+G@iv•Aë­±K&œ"óac˜Ä9QòwVOBÒÔMSdyùÙ1É^çe]HÛ²×&¯Ñh x4›’ûR’. Ôœ†Hœ¦¾ï®u<Ô’jÿ¢]ÎiàJá© VV~k³DLdI«RÃ^«Ôx€ÇT¶¡îˆ–F8껾Ë+åìJ$5¥×k·àì{à ]¢ÃËn°“¿eÒCC’+Öy|H´­7.Ü-Pùv&ÞPÈü+®Ôª’±Û¸Žú0¦á·¬aŒ:¥Ì„4%[}1h•qò´}&a¼ÞË%CðåʬX{¼s9-Ãá“o‘Ð*3׬èZ¸¸JgƒºÃB-²øõø×„H$Öd%îÔrL?'´iÆÚPÙXTtf,˜L”Ç,7ì•L§LÿÔ[¾7fSf~÷mÈPʽᨑßP8”Ht6xüÕÙ,6Íî­WB'lyînÏ ¾\¦Ž~,êY‰bdþ×’`7±¶(yINn2i9«Š$á9 ¼u;Oð2ðqŠu|²ðÛ‡JÃyбÂÂØƒnaIþ+6_)vëî´·gk)çGÀ4ƶƒ):¾2Ê^p0¿0ZÁ[ÍO¸Â›dâv‰"põõx KåOg±‚#x2\èf{4n,»0 »–—d¼qeÐeËUc1qO¦5¸ç(q±-ñņª—{IR‰ ý¶Jyi9ôòÜ=pд7$ –ÙÅ+†—ö’0Ñð³ —S$ën×Ïö¨…ßØÔ£Ÿ0-q¹2\ºÒžlΓ<\ ðžÑù{ ÔŽ“#Ø7W®f{@ö3}vBéÇAÓd–ð=™Úû´ °x±Mˆ©óÐð¼®[@Ï Ñ'õòÃþTèàvщ”A–z3×[Äà$ÂA†i× -Z.ÊüÐãRb&Dz[Ä6ö^áÃT”ì7ðìIÞÜŽƒ©$›@‰*Ĺh…ËÈpÞµõ|³—²®ÇcðÄr”§Uš–H¾97{ÑCÐK ; ¸ùê$ãDÅB5ö¿Z®µôc*'HäÛ+µölŒ£û“•Ä·’Œ³²¶Ü*qÏréÄ8s§4Ú,'D:rZмçQHÎ?êwž¼îK®'‚1~“n@ ¹JÁÂæŽVlã…¸C6Å¢yŠ^í¾úãH‘Ûä5w›D± }pX³›FM™±Àȳ$Z¹ >| YOùcžMÉ’•ÖyÌžàÆÌ0WÞ(8/L•\­F¡I–3®ŽV%uæH×)?í©_ûºýXÛèÛR5‡ÿ&?êvNûƒÒȸºø×£Ë—è³IÙàŽid©hÊê:pe¡déù5òÜ­×”ôÝ"jÎж§lË»Œ7U8ûÚ”S‹Æ]ßÕºÏ)µœü§VSí í>BÊÈå`!ÂQ¥!Tïfÿû‚P^§@à-+Q·ºxfð>Íd¥ËîÀëØH®2WnÑ8O=¼±×û)ÍmãTnu©iç+[Òóg2t'[á×ç]?./ìtV!iR›ù‹o¯ÏìÓ0L„¼/Ï"·`¢uÃj¯ŠÁYaW,‚nS-p0—-׳ºµÀs‰¹p¦ólR?`[¸ÏÃ"ÀÝqnKÀk yªêû‡fA¤–ßÛØ‹Ìì—%Á¥d¸3ÝïÕGJ$½Y^}8)_5Ö 2¿Sò` ÍÆô9€Õ|ªå]”$œÁ@ÑF'a¹bŸ¿|Ú¹[—Ò#™,Õ…¹cNI=6eW¸ã.q`á”iy¾¬sf„<‰ünAuUì©L÷ÖE@·bƒk8IÒ¹·!‡H…Œ[Ÿƒ"üÁÖ³‚Úª'Òm`ߺëF³(J®GEÄ€@EÄØ¦ýУÆ0{V;ƒ§š]¾°juçdã4=¶¹¹Ï¿è‘Ñ:/t­w>‡ØwÅ(ùäPŒB? ¿dkFY«‘ FjµpyÈE:¯¼Þ¿ša^ÿ\hγÔ)ÅðêÈn)° ©MñiÓEXš^É.%ê“ ´á –aè¢Fb_&Ö8Þ#ÂocÇE²"VÎ8€=ß;—ˆ*’÷lÚ•ÂpK¿úORw„}ϸ¯Ë¿`Œá…UÅ¡|cÐxͳå%Se-t€áQZ,NÅ$9È;Ò„¹¨ì[Ü—ü^²ñ,…7“/ÞÏnnË5ÐÅFN”9I«À>Œû Á1a¶Çq"?Pp+jÌ‹YT•¶?W‰¹Û8¡Ê2ŒÈZ*“"¿0òцê|²Ž ް 8 ¼Íhë À.Ë ®ù Œô¡î^œ[1Ž”J)_Óiœ¬dsQ÷mïíÙí¾*‚ÁPŒÿLÑþxtvO<. 7¥½]4™…#K¾gš/^ÙpDø˜Æ/2?$­  Ã| ½œlBµ|;¤«&gY¢M¿ä§êôâiÌWÒ–,žã%䆊Áׇ*§ †*ĸ¼:N…‹p—ž €˜Ñ\? &eýá+ʦ3¦fÇR ÂC—ÀÂØLeeÎèûO 6=¼)•¤|» _¾]ã©ÍÇ·$¼ÒŒêûê¿nJ›‚ ©JQ¤ð½B·$ž@ÝìÀ¸Ð3$‚ðõ65ªJX{/Ë…‰==[6yÎ'i12M‰s=ΠS‚LFå_f"ÖÍ}YWSÒôm’H§ –ïRšË;ÃNiiª?û>ÝÔÕ7h÷ÔÅ LÍ’[÷KµF)J½Â ÇÞâÝûP=r៰!Óà–ó¶:P‰l¶y‘RÔR0=•/Dû™ ùøç·Îs¡¤rì ø/Æeµô©Âþ¦‘aû6öšàµòTq0N`õ…¤‹F³cvÚÞÖ‹F¬>6nFM”Ò6ÙÏþkUÄÛµO9דJ]ƒGÞÉ_aÄ+?Ÿò8ï ÎY*¾‡4ʨ?IÛt¸{xSÎåê¹Dæt‘²|ùÑÁÜ×Ô±›–½ÓÓøyY:ãï®ãè­:]9x›K6õŽÔEv›bhÏ"U…!P1pŸ@B£íÅq K Ìuo­‡^’'|ý¼Ç+834MJGÚïÞ¬CÛú\¦Ã3rºÛ3š×›ÎÜ~Qgã?ìÀë7r½‚Àõ*;"œY ß«ýòÃ`ï„1ÓsüÑÈø,­ )R·r$Åh¢mH<3·Ë·úȘïMŽ×ŽÕ…œqÈ;4_ëÁo»B¹‘Û¾½þÈ;§šß¡aS·í>8Ç~f²£yëý¶ÒFP§Øë2êã Z”@Ã.×1‘½Ü8Eî#䩬‘À¨¶ˆ¼Ë(åëÉrû€s‰`“ÛÏæzO4‰˜3ÏʃëE &æ¡´‹-m+!™ö$ð1ó…êð-^ã—ÃÆ[±ñ®µÙã©|ÝèZžË %ec4-ý7¯l‚Z,ú]ñlER_†¿¦Í^|1ès”ÚW§V?¾ô{s›Ÿ˜8Æ)pDý#ï2UÊ.>¢©¨\˜“dß[,L…‘ÅåY¾·ïêÞy» àñ=·´ÖU¢ynqú8äÆëèó#-ú|–øQa J?ÃÁ:qÇX7 Ì¢*çÛŽmÂJ8ü=èSëE$Љyá=™7´¥;áíÍph hü×) 9ÛdnÕª¸jÚ¨¤‹ØrŸ^ÙF OvÓÀF)oŽn»ïý%Þ™iHÊÍÐÑîb9c–I¾ä­06;ÖvC Ü€[F÷"—Ýßë–y…ˆ»½a½¢}IËÚ“Ÿ°¦æÓ´4Ú’o xý:ðê·\;Ö“™öùÔÔ¤…ì;^(êÙÿî‡Z¿pÿ¢9ö3ÄçÜÄd%_^èH’ÉÙ›IÒ‘µìú··z»¸Ï·SI¸ˆ¼©ð>*1½ž $)×)ŽWåÞç±Ï”ʬý&¼¤ ±D¬—DªC<%Ö&¨Ç‹ä .2 °Œƒ9Н'éN+]8úßaZ¨7N³:ëôl2î!ÙíÛPtwsÆ$xQè(Š(Ñ­Š#õª”;¥/¤¦†¯Æˆ:ÕxŽ…æ$Nßí*¼"ªju.3Uñ•Q7[®iÎÀ¶²™7JˆÕ[Æ-2ÌÕ¨AP¨BÓ†Ú¹û>Ó!†ë(4ˆcމ‚_UÞ"j#ƨ@뼺¦nÎX[&ô¾Ï¹¿¼h¯³Ž“ð3LóèŒ †TÏô‰¢ÔJ¬ëû")„¬>ƒÂ!¨G”²»t#ðÄ3 aø1 0]ÀM#Íä‹5Y§Gâ=‡ wʪ¾àõã|ÀuK"Ýrh>/ôZiµhZ<>œ 9èI=?ýÁºâÌ=ò'¦ãÏš™5i~cåf¸%¬cb~z‹³=}£P"‚,¤$gÜ&I¹ò؈’‡m€Î…—³OhonÜt­*zd>O€yÉ´mKa—0ëiÜÌ™*"K?NÂŒnYý\Ò“LºÞR a9þ–éÑvÀÓ=²ÌO—6kæñi»N/‘˜ã/8C2n]t²D>à𵡣5VâãÓ>?¥)‡Ôê.­ð©wjñàC-, šÒÞ¯UÁ+4/‰¨²s‡Ýwրǔd’tÏô¤×Xì©í·,o˜köÂÁ,RUÓ¢ÝaÊîö¨1#£“6C 0ˆÊ»µ½òùòÃ(Þ9}â6“Å3b ôE ·€sxéý´¹@zŽL—eÃ¥”¥Ç™]ÖÌWÝVŠ®.‘¤ îÁêYzxW361$~Ê27&¥ÄÙù®’ðX{Ks€¾ZbM\>aVÿK¿HÄF˜þ9 9ŸrãΆß¤¥Á:áæþÐÑ7ÿÜ>Ò…>o³÷ñ0««"{8n§¤auo;¯Ÿ¾ªú—üJ†›ÇXuj€e5å|ÝÂÈ[Eû¼gME޳ëå¸BÄ»³Ÿö„ p+ÞíÊ"V,‰Öó’», Í„63Bï¨Ò6hv"é6 çß¼‘!5™dB ò“¼Gç-!ìO…Rø4!Ñ‚ÙqµefwoÙ+6ç .Z/Ūl·±0°E7ôÖRK” þ{o˜U–ÏËË%p¿Öe58‚”>Š´"|°2|£dF$Æð$]¦9)Pt %š _ÊúôëÙIÝôÐø òäB7L ^”Ú¦uC½‘r´—f;ŒpŸ[týgš¡ÖÖº–OßNÐ+~ìŠj¹¡Æð2tš_®Èæ5ë(ÜQ©‚ê…¢ZÁÞÊÔ_{¶ É~µc§kÏȦXòšÈ5e!ÝÞÜÇo-‹ˆ8œ9Ç6p“¾‰@ú¨6šÑ>”R‡©çúyfcÜx¥OU¢Ü·Ï=$e¼éK‚>MÜ [±éíMŸÙ9Ë¢DLé¡;ßœÑFÑ'õÛ²RÃîù7LÙÒc—§s:ÁÍ6æŸ+—ÙÛN×ôöŽ]Nü4ø‘[(–ðâr_06ªY5Ò^1g´!¢6ÝÄw¸M÷9=VAßlOw=QVßÔ øföÔ[£[{Êw)f–ìÎꀭlÞM»Ç÷¡¹¸Úã“Ù¨P‡·s…Q­V¹439¢í¯Ö\ÌÆÓÈ]’åºß°W•QÕÁZ³š”x~5œ‚œK²ŠÍ€l€{ðp%Gø¶«™³M»*Ö˜žHC½'k®z$d•Tš"-ËÂ¥>óÆ…ˆò´\ß¾2N48½¿6+Û¤>Ö)õ¡y4|5×åÕÜBйDÏõþ`@£fÃÊ£ê¹îî µÜ¾ýu­Ëå+s¨úcÌý¥¥èÖìËEé+šàc¿rÔr1\Ú¸Cf:f(-k¼;p˜øVéÓ·í¸Q¡aï®Gq8¡D…©cÿâ;"”K–¸õïêX ‘¥&ò«s0ÄL'\@¤œæ»ša"[C@rç 5Š«[J÷9+KõT{{Žö7¿éQÕm¸$Ññh}íÎÛmýN…¾Í莆pV‹ÏìirÒ…/ƒ8„'ªø:ÚCœ{ÌY©{²ãÂsï…sIôãÂ< lÓáÇ™î_y“°ž-^zÀ5E¥š £ðÎÉká¶Ùø¾ï6ò:Ëᚨʃw$CCMe"³¬:e¿å€N‡­¢* H|#ÑœSsÛž¢QÁV¼º+,LE$G©äFñ3{)¤‘Zr–Šâ‰°2ú…{^ýE¸(IÄ­T!VS׌¢ˆ…À_7Z›Sc™OKö-/+Ò¯E’@E Üy†®U,RïŸc±ùe8€«Í‡^VKëÖ·ž‹z‚ ¾Çd¨úXÕ[~üý*á¼ßÙ_¦ŽV_ô²&GLú²3ନMLÞÝ\½(®Êá#E6.â+¬úã©f5Ïém85©¾çºP+”}½y61Uœý,òž^ô|i£³zg¶ÿ>4W™Êmrˆzׄ~¢þ™â¾EÉÖkjŸ½NøzATÌÖ öùôê›LD†Òj¡2#'öWmÄñ±¹9¾í›H'fùÔRÙS:£e¢âÞìK.Ÿ½Òà}·¾cG¬NØnX¬VV⫼~G®Ï D_™k·+ÃSiCS¬¼ên˜• 7P±sç ±¯zº»Ì<¿ï”^!À³zÙo5¨ìq+…Ä}ÀÔ>*eÓM| ˜`‡?Â%ðÈHgÁFÔ¬lî&ëx?¤5Ëy;Á}¸y²žwXŸD«ÿN~ûÛÁ‘/Y {µlBj~zx]B³š ¯R !3ì¥[‚Ñu»ƒ‚k§"i)Þ;îT“µoøÚy±r/ùœCs5Ä,Kš°Ü8UBtƒuñã¬Lc¬<>\êHâAnhYÚOÊv³Ani½à<„T`'¨ÊÓ›µ3(ÁgK4ùÌ4ƒÖª³UY!:+ÅqË&˜-ÏCœò<ý¥ë9¿6áñ5îÇÍ«‡=é/TÉãt2Pð°0x”¬ŸÔ€É Ìs-·!ál%öÏfÑcŒWµµÚ!ë‹–†1@·…ÔÍhFÓ\›B|‰šI¼i“7X³!빆Ø:4"‡Eºè„- {OÜ8…µ ®ç `¯Í´e"R€Šª^„ÀvÏ· ¶*BŸz&Ÿ8”Û­;[ˆ4·c®ŒD(Ú ìs­væòoÏJ|¦¯áZv‚õ¥Su<HOñŒ«éÄ\µ‡éz¬ ÏyïTIP¾«h3—’aŸY«Pso›'Âb,å©$k°< .ºj‘òšüP»$$bÞGnJB¬Ç k˜ú]êkFÛ÷‹±¨dý§'ôE,߯»ö"ÜÄÜeASr'¥P/ DúqÛ6z !œ\ò“mÉk‰·»aõÏ—x=÷fE¤é‹``Ã… xOJ̨ÔÛì_EõøÀØå6Ûïìöl¶çMLBíhmÆ^KìÎa½ë$HWz’¤„ÔpЃwýRøõ€ñCÙÓá#üÅl.œ³nE>5…H„⮎Ñçt42K(8~>DYy˜íœ"0©AO1•ƒéƒÎ«CJÏÌqla4|kÞúcàâK#|žC”îc÷ò‰ªÃ‹ß3%åã„%àšüWcÛЉ"Ö(êóý2*úøÂ!Â9³}Ž‘TÊÁs( O“o¿,R½Õë¼9ç82Ê*\5^4Ä´IûaL†½w× "^o§õËF%Akt]q]-‰õ·¿ÐZ½8ÔîÕàÖ0›qg‹†§­uRý¢“VÊ@ÆvI¨:ý®’ˆ7ïë[—­ bà‹Z’ìAÌrcB­'ôÀWÑŸ•hd—´oøc<¢c’÷3W>¯@°Ž½ü¡¬ÑHBÆ£låÚÝ=šYÙÙ·ÔA†«Wy!f{-Éìž1&w?ÿPºFZP=Á'¡êsÓr<âÅsixõ±¤F‘®•ËŠJz*$)ñ¦ˆƒõ ¹›æ'w˜Ìžß©s:O‚L‚Ñ@e9B¼Uª&=g,'G‘O(«7Êq¸ øÀ¡ŠýhŒä˜xÞe[¼Œí‡ªazæe“Ý™3¾ Ê\ûYjŠ8ø±CíÈL=”K–¯:ÎæmÏ7ÞŸE®Gíà¾ËI‹y?ód;LŠŸ’è[»À…ÊÉ6Ï‹¤Žci¯ãô|=Ýví'dSù7k5]mn_ÉÐ{nkËÔ¸záNúw)emM£·qO–9ÃÌ7ºVð‹-lû{ÊgBG<öõò§x¥¦ø7¥±¾LíÁ"»k×¶sòât™ œf§´Ç5­44!©ºÊn‚*ZrimÆÿÆÂôqD"iߨw²ÖÚÌ7•7q¶ŸTÓ× éèó ›]J'%œz‹³ÓxGQPª‡w˜mE‰êø‚€ªÝ^‚ W *ø‰Öœ¨ü+ñú1+ÊÀii‚ö€ŽÍËüF–ÚÐ}C¸Ï“p–/]E}"YÖ&ŽCðBî-ô†HãœS´ÀÖ/Ó¦å}ë_»½7 ½éëÏcV¢Á˜½€Ó~!4¦_øýs­5úÖI1zZ&Ç’9¨úK±–F‹|-¾©ÓƒõL¢J÷xŒœá.ëå?; Bn‡t5¶Q&ZjFˆýÞŢƻµ‘Õ NIPéèFŒ8Ea¯ï›¥˜Çœ¡ü0»6 VjÌÕaOÄeàö ªÚ÷||Úe^XŸÇp‘Šf&éD%%9Õ8g+%_2ÍRTò鸧³2ó%Á0‘Ìb,EÓ?oJÖgPÝ\ŸLPâP¡íW®ðž%þp¦iŠw>‰tú±î]NÍWy‹­‘VH“QSÖan2 GðÂB]-…ljéà~ÐÛôV}…p«ùž¥,¹œš6J¿¹÷´R1ìÔlÍjuÝð1aht]HhÌž½7Ñ,£À„¨ó„‚í¨Cƒ°NæÀÅÈ HxÇÙqÙ¨‘«0iˆ/kš  àš•>'H]=_¦iÕET±¨›+Ëíö(2ÉaàMÊ«¢­õyìK6öQ¥Ð&×eRüð£õ{ *Ë‘ÙàO¬#î:›WÜÝ,9^ègªõrG`u†Ëÿü妑lÁq¦7ZªQiØÈJ|Í…eÍ M?‡FybËEúöMŽÛxF’ †CìëêBì´ÓøG+/9Q—ìïq*å)'5tÚ«Š×¶Ç碻Ç`¸clð=ùá=9«¹\ÔãÝJØåäW®,ׯîm¾•]Œ„­†û?Þ¬Üó—¡àŠïg¹6C·iW#³=µÔ¶ð84¶ \ÍÐtÖìúAz]˜É“e'O4Š>+Æ[.A2õ…-Üò_S”¹Ä‡õAl –DCb*ì.‰ujK¢³¯…¤ˆSó%åèRÔ±ŸyÞLââ•_Ÿø†ü±d‡¨žS]çæPJ߯­Ð9v C[Ìþ  zòÃ4I7“Ñ´ß¼œQµ8N`c"ßu¼çnvºâ½K’£ i,uÈ0Z€çê€v’úN ~\øÊ‰¤é6w pï $¼ü5ö!CwÈC”Û™BIyôu+¥ÏM„]/ß?¢ÄÙZ$éêÎóýs"ôÂI­¦[jͧí5²Õ`ÁGfFo‰µYKÕ¶q0â΋QÇ:j ?ó SΩHñc Åͺ#âŠé“ÃøçRRÏõm˜Œ/#yBbI„fýõ¾¢¥ýˆÕNMà9^”bIAÆŸœ¿Ô×½n]ú˜¢•L6 y¯`»§÷¨èD:kð| ˆ˜ã@Í‹ã2ìg:$í7ûŠå¦ÝZ 7¹î9œ -,­¿5m­³vQû=¥^D¶m«]J7ÙçÎâÛô.¿é=Žñ­zï)¿î1CÔžD:þŠÔ™ø¬ t–û%ß­m‚)¾rU{ciœRÞºÂ8LBU\‰uƒ&Ÿ¡ }Ü'ª†Á³ÎõlØl8ºëÐ,ɹ¤:[¹ÎA#´±Yݯ¼À}Øý½­1ÌY3eŽ o÷«Êþy>¯Ž]‰æ%!é\aðY¹d?pô›MÄtÏó]ÓuݯÂÒò-å‡'C¥X~’Äܽ]§¢ú°6“sFO€oˆ‚«3‰=¾m×Ãj½³ØïúøÊ¶¯Ü=ËfCzCÅ .zÇ*Nº(32J}–ž« Ìó¨\u\÷}V;ut3Bº¯üÖ8ìt­%!K!=_çh¹±ÆvÙ>ý“›òÅÄ%fR]Ol²ÀpUwã¡obÅä#VÓ¡Üà…wë Á‡±ÅTÜ몭3¼hhòZ_[ Í)ÏÛ³âëåHÕ7´dzÃl?iô(h ;ãM\ìE=*>e;å êvMÅw{ÑÝ#à?D|ξ†…5/˜)ÅG¡IYî ^%æ»n©«¦î“劺%&¦^‚·ãê{÷"’Ü1a(aÔdP£[ªà Ec„E4Xýz®;[ûþqgö'!üG4‹ÝT¢Ñ•‚,õ¨ž°``#Ø<ÞÇ6bM¿i‡S§ôoAýQX[Î<ÃÕ*¼9É=žÒ¹°òcõ0´—ÉB…mk 5Mö¨Lo:À`ò2îTãßr2`U*v÷#Üò;zûÜÎ%zஞʨèê9XÜh9¢W=€C$‡lɶ3ÛA6¯+ô°'W„=¿ì/ZiÍË£vÒÙ%C•>……RÛ_bP…i~zöVDFÑïŽ 4¬Í\™'©‡!ÅÝQƒ¥|ãsnqÐ2p'€‡M#}E¶ 9™¼àýa_‹ G}ü=žÇãä§‹X•^O^³|ÉN8Úy§Ý²¬ð»=¼DæQ\è¨xáâŠw"¾ÚLÅ3$¶kÚZ`àñê ?(“0MúO;kžÜäí˜,š(‰>S)ŸË¸*C%®zè©ÈØÀší|õìøùV\€ @ƒîe7Aùó†_«ãXXrU›Bœ |î´86%r4½­³©9Aæ:§o_…>pt$(… åt½÷E¨Í”1+‡{æÇD`gU%vøÙçÚ‹®Ò¦ ž*KmA9™õƒ·ùÇå1—ïM©)aH½¸×îü¼¦±ô4^äci,HÕgusz qð&Ï`Nî¾×§ÜBÜ”@u¸X|įG‚ñZÔ|;% Öœ!XðãE×-ñ“DïPì¼q}Æ*î2/¨ÞÊëÖÖ )?=ñ‚Àÿ«ÉËÔ‹hÊõôF°˜^¦X0ò›A¸‘v¼òUšÇ]3¶ŸµâÔ&JB#D}ÆvcŸ?ÕYã ‡ù»éfOì(oà>.ßàÈ’é2Âgâùðõ¾-cìf˜¤"M,$5Äæ1p÷½þX£wðî¼®VQ”²°¼9XDDÏ(½!y0ƒÉÚ¶4•—ð˜®Zç£*§úIyá9WÛGM„”¤»p¿Õâ@#©¹Ê9 Ò l= a^ìc ¶/œX—_¦¢Ü%k^¾C7%äNËÉm±PQ¡­jp¯RŸÐTÐYÔ‹"‡Ãÿ^m˜³Mg“J«.~lo¾3i2o8ª¢k3Ø@žƒ†ë`BpO7Ë} oȦi^å§À!QŽ!ÌPú¶S“f½½mæÊÖÖƒtÂgQñ7zZýKòúkÏqØ)5SúP©Øwê;p_4X¢sQkÌXj_Ÿu2üÂ9n#^¹Œ"näoJ¥êû·,VªöÕ©› ¼ø»8ûO¿YçÏûÒäu?¹Šë>˜©_;2Ð!¬ON¦™î*Ø%óS@,­¹ƒÃ%9¤ó2m5y…Õ‡-æ²ö¢äõøßJ£GáaÝû1“š–Wsý¶X3Ъï2Üþ[/÷{:x&üμrÖ0¨+Ù¯†Â®“®<%ôT Éfn_Ÿ";Λsõ7ÎŽ­ë×0oÑÇñí~¢Ú*°_…X]<†pÍ<TeÂ`0è½áyÁa1„Fªž`±¿>+ >ÿd‘¦!Q˜ÔrÅø©ò)ÎÆR¸Œ›~x Ãø)?é'‘¨õ@‡[(%Lâ–ÛF`Ùœ·×ã>î”8*vtôgr‚•„Y›Ù{'}·%dØP’‚—Ú:œk‘ª0¬l12¬ˆFšèÄס}ŸÄtΆ®£%|ï*¨§ÌXD*4 ôý`º3#€¡ÇÍ­Äý"¯h_Õ)T¹QÀºA`v>+u½¶Â‹š"“ˆ}ä{ä7BïÐÑÀ¿íÕ‘Wê³ ¿i5†ëÈßc£jŒIès›MO¬2i}Ýz“Í–s!?^üîD„ÿù@½ÑçÇ…©”G, £›Âý6³7ż+‰uƒ’1Y=µ±Èœ}ñMµþ•?Áæï»¾¯ŒÛá? «t }å4P‘@õÇ.éV €%Ô{]]¶•ž ê¿#Ž•wüN¾¯ÙÂp‰šÒƒ«n•(B%îÄ•×Ù"Ÿ€6¶ºš=Ûo'n”-s[á’ê"ð&LîJ–Å‘ÂíjtÏݬY`ifÔ ¶å³`aA~!DzälY”ã™KDÊGBä ]vôàÜvæyFNαkÞhž-á2/ÏÀ–ÏœÖõ|òÍÚÊLóÂÅ–˜ê‰Ü²* T›•Ä©h¬`CÖ’Yñ€Õ¬öL'£›ˆ£|» ‡ôÒR?x<•§4®dɦáÁ,C¬þB’‰Åƒâjv«ý ª„C¾c`kjf•z®Ü+(!3bU¾‚Á¹ƒ¹ö¾!¨Æ1µ€¿–p¼òjd{4ê‡0t’ù v¥‡h“èåu TÃrؘáäH‰I<ØYÙtŠ9%æÝ  ¾´r,´h[H…£Vš^×SµìŽ™|¥2¤9¥ÛuqÙ 7ðÊé¨8ˆs…g:п¢yÃmåÌzˆ] ËM;<ýà÷ð7s§n÷1=~œ–å?ªfr奿fÆM–åêÆ (ú#û5X³.ñ$ôRÅ»edqâI A7ÙPeøU}áX]¬æ}ãbÐã=™à¿ÒÎéjùžÔ6odÇ ‡¼)jë,Õx¡¥ç˜Àw†}'Ë/ª‘+CcµS×’À›œ!ω<÷.Ir±øÂÌ»S'ãpd>µ©³b’ª\&>ÎèæT(Y—&ÉåÞc¬»œ\’ÂáRàgò4DY3z†°Ï -õ|Ô*ïʧ˜*Âêiד!dëÁnÌÝ`˜è{„©ƒýCõ¼ \½·sL›}o²+Ûñ´ì´™ã?dɯ92·ªý‘K2TÃÔ¿m§!ÞlôÚå÷ß‘ôj¯SR{ÖHŸ_+QŒJ~I[ÕJ±Î‚‰VÕ ‚èŠõ´h§vxÎ_›ÊU´WíÀN¾“¬aÏ(#Ê› wXâVeb“çÆÈ›ëYæcÐùy= ¡¯¾»0áÝÕí.ôY_ܺƒ&ùÎêÇÂÃZAF *þÙsͺxµ9ÈWb•gã=yÂìšÄö5Ëuäç-"†’3FþÁOEW_8Ü}Ô#¨qaç­SøÒNnùT³+ÍsÍ1OXó5øüð2ýjÕÙ;Vì ª’ø?ˆÖ„="—Œà˜~5ÔpQ—¥o*ͯ«­©CÍ•yˆéâ€ÈðTíà’ÿ`¿Rv¹Y;ðŠÞú,¸{u›FWVØ êmDÙô1~U©Sr­Â;ùˆNÈUUó½*Ip)â/o‹t®ØKúÄ®»›Ñ3sá~Ó_Ý·¡°÷o“8øX’WΫçò?6íÊúÍõ~Ö"®þ€²)ŒÆW†$‘Œd¨0§¤°z7‹¤ÍÐø4¹…¼9_¿ê×ÙR’vUc£Fmà ÀdŪcÌ|¿?¶©€ZÄÚS/8猹*‹ìÃb„/.âÓüV»Ç¦}&ç ‚€ ½+[¯”™Ô“BÕƒ‹ÇþBgLTó²£iÖn;gœ`µìÜ`ÞÅIgØ¥Ú7NžÊ@ýçKŸ}ÕËáf\…Â¥ËU•[?§•°ÔšÜ1ý¯«ôDB—ÆäŽ2“,×ÝDLÅÇhtQgy‘¬„¹Éì‘•4¢”¤?üÅ”øiS$EÃ…‹jïUÞÉ(ôè®"?rú¬´¾ç=n%ŸÅd&'ÆßøÌmºu²Ø=8ºw|âal˸>ž8$X­ûb¼öÄ‹ÝB}†nûíÇÚ“•ré[–Ûýã¶Ÿ‰7¾Z)[õÒs¬d›"?a§#% ‚Ê ©œÇõo¥•†{Wí°·c{aòšÞÕc Ô¨]³ûö¤ïs€)TDAç3¤ª}4ä} a’ÖAWÚä–"BH?lFfÿróÜÛ côñUìÓ”'¡‡¾ëÛé‘õî΃£³áïiBvwáwšªÜ+׋ ë‘”Íz»$!‹#$0ïéR»øø>3ÆCw {èø†U¦Œæ˜»Qwtâ*j3}ˆ»>¶`Ý2%|¦~€F¦„¤q5œb%šêÁ¢W^„°Åd7Nâg* $Ë]ú,®ÞMPö&§gj”0M˜¸ÊsÆÿô,û<|åmZ13ŠŠÒD!À?Aïgð’̶þFÃsb8B»ªãB­_7Ú¡ÓëædÒ$ø•‘› ˜rÚ7·€Œ&:¬o7i½väF¤å0Iù× Þ„Ó˜TGßxaµÀ¦Mö`1²}—zsEȬ¤dQP|h!à~hDŠÉ ¶S+•˜lrØ$B×rET{·åVnóý·‚$ݽc³ª%·4ù¡ž ¶zùŸÞ# ®Ú¢5‚£km MJ¦;t¨å•a äË2öhKRû—*$c ^íîZ»› ?ž‘ ‹ñˆ½¤c5Ñ*1tÀ̾cp©c¼F  ŒKá'vz¾K×è}pW½V¦y =Œ_Á¹ñá÷."V“í¨9Ž7Îç3q-±ÝQÕ Erës‚¡Èþª.í„ iîG¦ a௦4ŸFøÒC §övp”+(ö'1zø¹Š;³T yÍÂü*¾ÏóÈÔø§”m\¯aµýù̘ÌyBŽ}?âé÷ÂÅ‚líÚ¾“ÕoÜéeouðµæ¤—“Gйv6èwóâ\—[wB„"ù¯(÷´Cõ¤Ìéçʡɨ¼€]meíEýß(ªyŒ.²„–vä…Âvòö®åÁRªFÔæW<[@c8]¦BžÎ“ï·ˆ[vìÍlˆç$|Þ–Y¦çè¦Êïá|DïÞ8ã3Üwèſл° Õ—r!½ôà?Rº<™„~¯5µæ×—ÌH™æ! ùYjBE÷#Ù ¾Ÿªj:!Q`¡Ùÿ”«íROw‡Ìuèǰp‚ìøÏ·À cäe0Û·ŒŽá#¶šêw‡¢Ê+º m°F÷FÛÚ^LÛœyèSÎéœruލ"€£Ñ]´`J¡°þ¹(.SvìEb0 rïØ„Ï&T4/Àt0ôú#l艬±_õŠèP;ι<Ó†YÞ{™„É‹ ‚õl½ü]†.pÔŸå…Èí ©†gæÖ®£’ÓX@ϱøÚG†Œ¡ð8z¼’F¨éÊ(I߳дPîá½}[ ³äsvªcì{­·ÙþP\.w´–`ØRìïó7(enÎÒq$WÑMAoO".þ8&p º&u“ˆURcÀ÷Ú1jÒ{س„ñé¡ 'ö5pŽe˜úÔ ‡þÃv$ˆ¢õÙÑ’5³äög‚¼÷?Ô$8êM¹Þ¶-þˆ† ¤çü¶/o›¨pÊ{sÒWN‚ïgó†¦Î6û¦²‡F±í¨»¼ÞMe|š;%B%U[fKÌ'[ùO ¾Æù;ÒkA[Ã4ÔÊånVÖµå•úžPÉøhÚ3ícŠÑ޳µT>;ªÌˆÝ]RãçÖ{Ì5w­±ÀLòªc d¡—Ò¾ÄGö×Vò—5¬‡§ æä÷__„äÔ¥eú„{]{çÙ ‚àÍØ>|ü½(´¨Ký—MæXvžãÔÂ¥¨S>Шr&Áßñ'=úz“}&_UËGÃ2ºVÇ+¯.Ðyž!ÎÏüm×"ÊfêÔž>ö=¹–ûG@kO.s5ïôh±Wä~Âz~?[hÇÒË cg¹í¼Ü _ßìeñ×)‘[SÓ²EFU6ŠOÞeò­ MÄœ—¢?©M~ÐsB·{´)ëü]q)ùCuòˆx͘˜±Á¬\Õ'ÿtÜÝÈ¡¥#BŽ5Â#1%AÍ©· Ûú%’‹›¤$â•2§(Upžå ÙNƒðcÆl þªuî `qû&]ÊY_ä“{m¥Ÿ2bõÉ2¦nnöÁÿ ­Rç¾A›þsøÑûBKG»ù Ã[¶aJ 67D{wæ”Q~ÑØŸÃuƒ7+ž?“wÅž„C‡Ád7I%Ýã¥øó‰ü 4½"‰|ׯ›W²àùPZFúÝ9ùÌ&¿…¢ZŽu͹„CÔà‘&Ì“C&럸žæ/9—i¨·üx8+~{O‡ù¢ Û7Í P ž-„JnÈ'r›ÐÞ³f +W“ÜwRÄ`Qp(ù\‘B ŒMWR?VcìXkr{Ý  \&s8åöiâ“Ù&òÖˆ=&ýVD"Œ.'ÎÔìÀ¯y¥ÌK,Ò÷jŠe†f•Ur¿$%é y¬L̬£¿Í §yC ~vTUèÖ'¯ÁÓ§|n§êy¾gD%ëbX8ìh­_¶8ñèY£kØZñQ;[ÃnÉó"6|ƒ ‰ÿ+ûF*çÒðj|ˆÜ™zäXŒs&“=À…õ(íþnׂ)U£4._Žj ¿mÈ8ÚÈÌÿ3íºP¬j7HÏ)š5˜f ó­¦Û§›Uÿ¥ ›O4ø5 ºí’š|”W$æXVU±*m[*§”bÜaI•E[G4¬~ÍVÙØ6µó;m‰3l‚„X‘šÏ¤¾Jè2TúwY`mÚÐÌbýNQɾÜŒ¼}Û¢6%µ\“Š$­‘ÑÐd…mô ¬a‰:¾gìšµ Çã%è÷£Õ³ÖG¨¿:ôë!“O$\³ØŽ,æמaùr·nñptŸ„»'檻™’LÏÄ1 ›åRkÆúkÙ.-½«‰¶bƒç m8…­–ð‹†¾å/yLwOOh8½IÚ„5Y6áé…í0?膹g$5ÕMQ3º\Ä^(>¥W³ñÎ E—ÅÒ¼v³p΋ÆXsL¸=î~ŠÍz߇sGt-Õ©JGÎ(öA¼mDÖþ¤Fõ™_žY7Âóµy"Aí,ãÙÑ”'Mа‘¹âBBDÝ„sÐà †‚Y)Rä¦À\Œ jiMò6ßž帙dI ·“z+šùºi×káJÜ­2 ,tÃö= ÈP8›²Ù0‹f]l8Ýz¦^¬³ŸJå~TÀv“ Ã8þA´Zõjj…±ús–Idð0 ®Q|ùå:ñi`wìõ~B Æ|•HjƒÙÚu °§èæH”¹¸táÕØˆÕ×1úæ·`dãcY†ùˆ‰é`ÿÁ¡Ük8Ͷ´œ¤ßÉŒß'Ý ñ8 Z»‡â÷Ä®tR‰§‘ÇóŒ¯í4ÁÑë.$$,nN£àtïïpâr™³?Ï2ÊPýj 2ȃ›m„î—™¼â¥áÈfËÊpØ4@œPüÍ*B–™¶ˆçÌžó+(óRS»ÿ.W©U)œrÒÓäQy9¦NWÍôøØŠ9 H¦©¥+éæQɦu—Î xQ-Êáè“ý)g«îÈ£°Í’øÓ¤Ò –óž–c\úŒ"ÔÓÂæ.¡ydYJöÒ¦ÀȬݧäÿVVqÏ®¬hÖxÈÝb–æo0ù¬º~TyýË—ÄŽ8Ç3§Ž IJöº½Ùl@Ðæ8áR+}¹[ì^fk»g3·*=êW†ƒâ÷MëÕT«fMV¯PECó­ÿzÂÐ1ƒÐƒ9‹ –KFi5Œûè§ãÚ¿:6ðkœýªSW¨‘=:áb߉_"ï#HþP½â61ÁT¾Ø¦²["4€yéêOæN¨Ö@Q©ãHòï铼Ü2ŒNDà[L¸•¨»:¬ öŽ%÷¹K-'—‚ÑÏÈEç—$À7d¤ðÉiúS©1åÎl);G—Ø\6’äÞL®l¾„ÏѳzdM6–‘‰óBØã¡0w\•(BÛz†Š¬ó":ó†‘JìG<%šˆ+º;R̬ßkc¶xØþ§@p®ü¸Íø6Òåf’ ³¹–¨7I\Ú+ë&ŒÞvh:ˆo#13ù”¶zy7·¨tàÙf¼ã#wíc+¶dxŽÈÿ=æås®LlAÕ0äØ ¥˜„ñÝ–ˆ3»¶Ÿ@S ÚâÒ&’Ó®R¤¹„æ. 'ѧhàÝõj9eƒ(7"Ä›ðŽö\¼p’@®w&僑F+ÐòW~Åi}1 Øz~.ìB¬6à—A(9ýûO!8JœîQ¬ÖùhãGÔ•¹X[!Ç’@¸ôÍêQE4š>‰ª}F!S¿ØnͶ« ?Ÿ©¶Áœs¢nK¶ÑݤƒnL 9Ñk¦?cK+ljæ úãÁo¾ 8úïŵKÍÜ3¯Ì¥*RX޾¹&g1Ðb†|HŠÙÛ)ále’®Õj!¯ì±†¨‡;dO/òkÄ‘ÁoÊpVñø™xà²,ƒ0¤?:Õ*?ŸtM«{IÄú¶ÍDq&L<þõ§•mœ§=YÖ‹ÅŒ”7N†rŽ=ÅÁýâð_ÏYö$REMßÙ>¶ÿlaôw-’ÏTžŸ@n-è>žôÈÔVy«à}è¦ äk"öËʺÂ)÷ŒVáuï 5¢øA‚Ö>O ƒ¨M2Ka'\¤ñ@àá_-/ÉùÉ93 ¥j¾À¸—bnúu* j¿§ú){½_ôÍŸþƒ5o‰%,Ø#B, ×n¶yK»ûó# ;´;ó5‹ïþÄ—˲âpßìá`iÁd_’â¤w e”¹[=ŽÜ a!ñP†…ÚÆæaùPoëaÎ_|+ðÐv=|ÉZ$òßüluPr ÅyMî°ÀÛNx0À¡«'‚µ¦vÈÜbÒç$ä“Y(Aìì‚·B¶'÷1ÐfŸôça¿´xßv¢ÈJ$Íp9¦ôèè°q}ÿj3íDÊß±(•–f%pYÆXM¢ÿPšqßy­0'hšºðì)³Ä-ÇÛ˜IYë5ôŒHd&¬O¡(2ï‡'‘ñùƒb =!aS:Åê#-Æ:Ê~avvóhû©üÐ?`§‡Ð &\ê‹FƒÁö¿bd¼p›$ñõN¶(Fü¦èÄbâ¦è˜•­ Ìa’í$€v…|öl@žc3Á÷}‡‹ÄBYFi‚{—¤$2iô?\ˆñVt’®®"‹@¯ÖEßù†Ã©\ñˆ«j5ð_þH½jLƒ#G0ÁiÜñø?9XÈVãט€·{ˆÖg¥Ã¯CÑ$ÓrÕG^*´u3ˆã¨ÆÔIL^W€µc|¼óL»UBêöÊ,®á·Ž6âäY\IOv^®.}Nÿ_ùÌ첞թ΂ð€æà‹XkŸyò`Rî|ðÙº·~}7Òþ>ç¨ý€ù£›¦x¤{\tžxÌ»¾á-#ƒ&ŸèVL©/b¹[L#~MÍu.ʶbêèryp}àÆŠkÀhŸ¶¹ªòmE(¬gò:0`]ëœEdÕ|XÂ*̂〉 1ªQRÒi‚‚á6%®ð¯žI©Îw8í÷±È.ánÿyÉ×5‚"EHDÆ5kC×IÅ“9- ¦ä8üE¶Œm—ëggÂkLdTbzÄ„‡îƼ€o :ŒÊ¾¿Ð¿ ‡¿[çØs…I_‰þŠú&㉹ ‰M½=EÃuÓç¾àŸ~2ÂekYªûtùD°»Ï'9yèåçdò‡‹àèoËDûQŠîºÐ>˜ yOW3)YªÞ–5ÓÍôÞˆ¾öE+%:_ÙBë(Àï„Ëѧçï3°ŒÉE$ïÕö€* ÉsâéÉÙð2í‡ Ÿ±œ”óÂÑöþ¯ƒþõÖIîtnñ~Xòd²yÎm+zfð²Çƒ¸ý¾¾“²=…{оݕÅ~•ûÎ$q" ViS’¿d³Ñ]ztmd]Q'„gz€jÄiF(šÂμݓ= ÜoøOú¤Æ–7®•þ„G9•ÙÅ«=ᔄêŒä¬ÄQœ2»`ˆ÷~šï~CÃrµÌž¨›m-cœ”EuxQß«`·3cDƒó@⢧ÑäÄŒÏYÕu&Z+ó¨:kȉgX,‰ÆOJu•–ò*%±‘Ó¹Ôv¸ý('ýµí®‰"ô;®‡r˲¸êÒ¶Ñ„;•+5útõ€Ëc_å2ºm$/ ÄÉ©0l^›Œ8/Iôd÷J‡¢d†ÙÎÈB~$~Î%Ö„4± ó|¢E8ÐtY/]õðØ@/•t¶gÉ1Aüx8ŠÒ%àÀSŸ‡È`C3= ª4;M.¿€M{2NÆ€Š1LZà?Ô⧉ßBÊûð›¦é¨}—¨ž}Sœ›×|/¹#.|ÌæÃ7¿JµQOÈ„^¸µŒËfôsXX£¦èV0®C ÚŽ:G1}t—½Ë2¨O÷04„¡ª„^žaØ©=N(!§¯ ù5 ’èbO˜å‘ÙÍ9 T¢ÑŽ›“f?[§È“H­DHJ8iü»×Øé™ç—ê»÷‚ÛVèáC áÚFå š:\X»¿›5Ú‰àb2AÙ¿·ÃvkuÒ?Eù¬Ï¬Zâß婵4›HuqÆ•ƒ œtð(¡Û«¹/và{c”h¡2"K#$´€d?O<6sovÒ¼R`µŠtÉ+¯) /¥Ç‚¥ÁÌPRoðҵщ› ‰F#‰X‡E(©¦…ãÙ#ç©ÉZ¬È{;8ê«zd"W7w32¬Ç•{G9D|(¯0’gSý›òÖï7ˆP¨‰ÒMMõMrñokëJ«ôÆ6>g"+:’ …86`²ß¼)ÿǰ Á: ðÏ´iOnM#tq1‰oAc¡iCœì!pi±ÇÙ ‡`›NT§­ìëF˜àËJn³2ž>¥øÁÂÙvt¶ÕqgV¸æ!¯MÚ)͜߄±ÀŒ4ô{8¹w»/VU&mY”º¥qz3jüœ:œ¯ƒ‚‡PéyÖî9HÁg‘§Æî íU –AÌõ>õθ–uGÄHR1®Rx§ªst.L¤Ý¡#ü-TwEÜóç žeéÿ%#ªm„þ±vî‰ëb¢Ïít9º‚¿#t5ÏùO$_¨ Ö°€+ywÿšt‰·U•=aÒ¼«± Äí¹=â.ŸŠQ[éϲi‚€wAÞWçÚ_cwî ?ÿFRÐØNŸZK«z-]Ųk+Lº:TrJÁÕè^ Î*Ã×à³ùŸŸÕÍ/ˆ†Æ½xïd4Øý þº—À2¼õ†2?Îcîõ'/Ç©÷z‡¬/€±Dñ  Ôo„ÑUánZ¹Aq׺ª|œÇFúfƒ2_ZŠù9Ïg3¾TO§Gy ñÿ$Á@y?6ÌË¿¤€‚½8úæe3™«É³¯\/± 0´ŸÝRä®=Þ£Ôù}Ë—1B@¦Â>y8¶ïùw°rE®Ðg£·Ž›œÁݦµ=ž+œ:vÖ’ê­Æ^Ë\»—öRÞ™HèL.[BàFèJìͤ¬¨[mHUª$øÖ4ÄZËðF‚¬ÛH®cô›±:|yù`OH«§†ó,.[¿A÷‰«¶‰LײyºI©~gÅ”Šìe\¶êÛ§¹î†)œvöó<êWdBXª9ñ–¦¢wf]ûÇ"›3aQÖï 55¦‘eš³0êÃÍ)Í“눷ãˆÈˆO ºˆÎ.B=İj~Ê-û°`ð$W½¦Ërs æ O±§cGßèReG¯—'ħ\p.Ð9“ ¾2–”Õë-õ÷æ)=ðÉVøOûd^‰šÝü€ðÙ#2©_„õúª$Œöɲ.Ÿ¡Òìãð.œìŸÐ$gæýÀùçÏ5[ÀòÚ;g€xWØši/Ô*Æ:7Ò˜D¶×º–s„˰ƒJ">À4P½Mj]ÅÄrç0Þ!m.ÐLÌæüÚ'E_âwBP†Hîçššà8^#˜‚«ï—M©Âk~ÒRÞ-IÂXâ9ÄÙÔªçøÛâ1·@ ¯¸Øß°{Çh4©æ€~îËðic†ù'܈*_¸¬ØH¯ží ¸æéœþ„s¢šZé¤Ì®€!#M;X oh«-Áó–™è\áÍ 6A]uN6`¬˜=,QR×:§:#Ä À,îÚDÑú<ô+]“)}ð3ß$0ÎKÂÖnÝ.衘ä§R5кګ›Õ÷`ü?€œeJr}äkíUÖ^˜†‹ó]lijO%¡ü‰c¥2S’¨ÈDgDŽÀüíµ\«ëõj·MŠ4E«É¼L„zÖLkŽ£êu8pçVž—yN•¦T¤LšhØZ^DS¤!Ð+aa80Àº«s«?éAœÇ¬Ì×Ð(ÁµçñÖ:º4(Ît;ø/‰7àH]Ñ¥–ÄhL€ÙÇÔ·Qb#òÿTý¥ÀûèoÚI+¬üä*Û‘$ØW†bŸP”çGš1'(Ï… ©Udfjáý‚34[ ­Õ©ÑpÒ ™Þ endstream endobj 302 0 obj << /Length1 1622 /Length2 9307 /Length3 0 /Length 10372 /Filter /FlateDecode >> stream xÚ·T›Û6 )îR(ÜÝÝ]‹ %@€ ·âZœân…âî-®…âî¥P´¸ÛGÏ9÷œsïÿ¯õ}+k%ï3óÌ왽ŸÙIè¨4µÙ¤, f y(Ä™‹S £¦ÅÅ àääaçääF££Ó;Ûþ2£Ñé`N`(Dø_èüd“:?ñÔ €²‹€‹ÀÅ/Ì% ÌÉ àæäú È]Á5v€2rB£“:xÀÀVÖÎOËüçÀhÎà`ý# e‚Í€ÐÙdÿ´¢9Р 5ƒœ=þ+£¨µ³³ƒ0‡››;ÐÞ‰ ³gb¸­Z 'ÌdøÝ0@hú³3v4:€Ž5ØéO»6ÔÒÙ ž v`sÄé)Âb‚žh+©4@?ɪXí €‹ëïtEÿN†ü 47‡Ú;!`ˆÀlhÈ«²;»;³€‹ßD ô)è ÛÍžTÈK½Ÿü«='sØÁÙ‰Ý l÷»EŽßižvYb!µ·AœÐ~×' †ÌŸ¶ÝƒãÏ“µ…@Ý ^K0ÄÂòw.º°£ HIö/Ê“ í›ÈÀÇÉÉ) Ä 9@îæÖ¿Óëx8€þprý6?uàãåuX>5ò[‚ž>мœ€® €3ÌäãõoÇ#4..€ØÜ`²CÐþÉþdYþ‰Ÿvq>i Àùûõ÷“ñ“¼, ;èœ/‡’®¦¢œËŸÿí“–†º¼ØxxlÜ|\!AA€'À翳hÁUÁùO¨Ä ú³Ø§]úOÁ®?ã_³Áøï\êÐ'Ñ‚Œÿhü '§ùÓ×ÿ³Òÿùÿøï,ÿ7ÿoAò.vv¸ÿðÿÜ@{°Ç_„'ͺ8?é_ ú4ÿ¥êƒþœY5ØÅþ½JÎÀ§9‚XÙý½`'y°;ÈBìlný§Xþ´ëþ2;0¤ uÿ¾Ul\œœÿã{š,sÛ§›ÃéI‘¸@OƒóßKÊAÌ¡¿'Œ›„Á€hœOBâæãxq=¢Èý 8Ø!Pç§ÀS{>K( í÷‰òó8¤~›þ@\…¿‘ 7€Cëo$$àþxyOãmÿåwõÿ‚O¹@C¾§\–PØ¿ü<«A~‡Í?ë)ä_ð)ô_ð©j§Á§Xç–z uvû7û©r— ÷“ßýŸFž ØŸôÿÚZsìérùCüOûþüÇM¹ƒÌÑæg æ"A65AmWURdnl›ßÄ&é6õS˜Ø¼æaŸ]n°P™*3VaR‰ƒ]8KrŒç’ ”÷^{Íu(¡- ¯Zo½ïÞÆio¶¢ÍõìIÕö’£¾dÓ‘Üò¾wôÖó·}Ö ß®L—ãè"ˆ¥™‡åÖ£à^Û[²82³ùj«’_ý®d‚-J7òÑ]®Yæ4 5²3ùsf¼#wì©ó‹I¼ìÑGJå84Ÿý(žB/Ã5îèëiÏå2n§Ž´/ IÈŸã Ó{Io')Ïz®Â†“§‰>¬Ûà²ÛfôÜT׺‚휘ÐÓ 3¾ áxF ô>rµE1Þ¾ˆ*™7óhIyÕ]éD Ù̉U#ü¨a'P˧….´Ùy“]ë¹ÂHXcÀªeM˜XK éæ %‡Ï®¥Ç Ëß´ê¿‹"^yÓo¾<´LPß$„e*GÞüÙï»UF›ÿβÕà’û€ÒÔ±²çD˜ëγÁÑ™y:´¯}kÄÉÂþ… |"]}}€ØvUKb¶,: Ù{¢ÚLr— ¡f2$Ò(šÄŒ´œfžzMôþ·Æ5›{èLé•Û­½nhWa½»%º%R•å9‚¸¨Š(1Ñסë#.D cë²+x¡ëÊaÑŒ!y§úå]§#_NóÙ8EÙK¬´¥±1Ôí>àfiĪNæFó‘™Õu<©´0#yÿ’G zôê,„ú•Ìȱ®¾ÈºulC ÿlÃi’ì¾—Tóª÷Á {çÀw'8¼ ücPä…‡á æ¹sâF‘øcõÜ’ÃO .m½*xŸ˜~á+%ÀS NëžY/__Q{äin·ƒá줛Â`+¾¾wÏ’áЮ_’ )XûE¾=8båÑ'Á ¶h/EP!V¥pd~ÞNG¼!êÆÀ•ãäj¢.ëšß™…“Á®ÐS§ is7<üUOä9™~Ëž©ý>A팒)dQt°1ò—ë½æ¤µ(—ÆÛM§å‚ÖžùK+—ªî"³5›Egä«Ç„øÜ£[Ìl{ÍR&w†›zn~/SËkìpâËÑ;”(0â½Õ1¹Zéè›Vu”²S¬cŠj ½´â b÷‰tÐ/s2ðÇ!ŒÎTìd¥.‰W)ôDé¼=†=SLÉ,¤áö¯zð…ø×ç”󀂛 ²ãÔ”œùÇCMi×,»£ËÆÒ;I˜ýñVE@†C©5ã&?KL‘cÎ…ˆÒøØwÀ‰,‘_”‘Ü+1„;ó·–F_ûhýµêßzW9¶ã¼c§{CèIUbÌ “¸•`¶¤\½ò޾gÌ“;Sèìk—DjÅÀ…ئ¿óÜ,Dôæk\ˆw¯l(gEÖJe3e}K) 5êAEn-#H#× ï»Gò8Œ"á;'tøpÔ¤•­{Ùt‚OßÏÙÖRŒÀĶ–þ©F?qÜYéQÊy8ŸvjÉŠR뉢Ÿ6ÜËR­N=¸Ý5¿} *»QjóeãÜVøÛ‹ìÁ:= $7 n£ ¾LÍÏ ež¯æ$陘|·MÏút®,Rfމ¦Þñùs>JáeÇÇ‚µyïôø©nŠ0Ý‚Gó‘ŠÕ¼m¬Áb»)ßõþ ë4~$#TîùÕú±ìX JÃ5Wݳ´ïvmšÞtLzýMXöG-³¥™äxxbôm@´ŸeDgÊÑÝN)AoÉó‡kâS‘<¢}çI½½´ò¢ø{겆’¥“cl”.IQü‰CýR¸“IïkáwEt)’¼è’p„»¼Œñ/ÛØÅàF(M³&¬Ê&6XÜ]G |Bj$Þã*ÌðàÊ’ '˜4ÄÔçNfÇ2Ó7ó;ÌÁ¾»GÝ­óžQäĘXc§ÛJk¿ŽÞ¤”±31AöYh`s’l_=® JV·>|DÉiôŽpS‹€%˜­j2þȵlE©I,èWäHÈoäMÖZP$iåûR>é‡<³©[O8Ë*ÿÒ{„y)02è~YrÓ!‹$P]cÌˆŠ¾ ?öåf/­¯÷ô¥=‚¸ÎçQÛªõç;0—àª×’jˆF—oú¦t¤Ø¯ÉÏÜx¬ÈýDÚÐ- ‘›–솠¨#¤ÍÜ÷ ºë§ç.üßSdfÞÓ‘ö¾Ö9gÐ:‹ì'µ™€Ë†Îp‘«•@|TbXàŽ„5ê9†M/%NfOFoÂò6Eו*£aIc¼ -} œ®R$D•Šóµâ$RzõáÅ©èŠrò­«·è?Ê”ÂüIç(GƒHñõÁ%ârº*F ƒ3×Ä¡-®:!x»R©J•… ?xJþBÜçIIÆ 8,i7kÕvqgoù O’^ìñ,™Ú2ë`40V|2ÎêÆæçÓšc3êd”+ß—R¦âqF1Kåí.åc >” È9Õ©GÚ×™•³³/^‹c„v…Mždˆ¿j¥o&Kêw¯ØÜnö„¤`µ‡…ØÊWY:ê³Í'Þò;†CQ˜SXØ/¬lì s`ÖÎd1ß$x„¹ çç=èÉäS©ÜD/)±ªZåÙÕ&±¼H>­‹¤IqBnÌâ+$\{ð_«cQNîÛ¨Äïå§Ï¡ÝO¿E÷ÀÛ¥qÀ¾­z! <³©b×ù‘ˆwJ²M_Š*¸9•íYÝ›© Ꞣ6!.¿öÓÂ)Àwõ6¤2éÅþâ&œµ¬žø5ض̈âå%ã0«PÜg M½x¦²ØÅ³ù÷ød§Ú¿TÃzTYª?5­¶MܤOÈ5{2Öƒ™ …AÉÞ¹i²BØBæ09 ÿƒê$ÙPË=§›*øÎ‚ê³:ü‡tß°´zæãdÿöB[9ÄÚ½²ø¶sݤñf´U7zÇý!%&ÎI¼>Ö| ¸Eõ0Xb¹R!«F# ?ÃZá‹õQ\»¼ZÊt´ Çu]’w ê†NÖs½M¶VÆF*åúFÃ/«¨Ÿ‹©Œ+=g—$gÙü>]bð„òÅ$ȪÖñ½…Í+nî”;ZUrPÀ~àl[TjÒ%¼w”Yì¶'u¸çLIÝ›ïõ¦ µŒææÝ½¶Xf bκ‚FY˜†ååI©ÝhšE†°A âBw*ãiê Ãûì¬è'AÅÉåØÛIf|øãÌr¨|±˜Õº:Ö7/–í\Û…ZÉÞ2Á_O½¦uIOëÛ#ÇaflR‹Fn[мÕ{¯á;Ôïl.cÚ2ó3=º§Æ¯B¯ìµc/ÃN|—r:i%þ‡I±!ˆ„œCtô:Ð7/âMåõ.Ó×·¼óä_|T^çV²Ô[̈›˜¯è½çïÃã”3ìsf¸'ÀÁT¾xòhPÖ–OfóAp?’¥ù˜·ú‚’Ý× Ÿ%);ånd5Å[r@´Jç‹û&Mù úëq«Ü<[šµ 7‰N‡îõºÇ‘„îûuçúL"òŪ·\€¶É XWáFük„ä‰1Ë\CÜç™ElÏæs®â§Ö¾nE»ÊqäKVúiÿ…2ʪ7¤}å±K?Æò¸T¥«JGñh”ÔÀ×uœ>t7‘;sŽà¾+ãáÆ©ªÊRóÏ,·”¸Š_JLÙ8w3 s0F*e)äf/  à ÕóGô#¾MÁ dÉ­ù»\e¸gÍÙø «ó­ljßôìVúB…ø±¯† RPo7Pw OâEÖu26±Šƒ§ˆbSþyÉAX¶P1쀜KzŽ-¼1Æå~Ýÿádà‡i²^Gâ1½œB¶¿Dƒ9 Ö̆Ìbrª€@ ›iÿ<-be¹šë*Ê.ù.‘wm0½SOä7Œ ~ª+ˆÅh¨Q‚î cÅ|t2t JyYô6xÿ”kCt¹µ!¬úe?f'6E¨»Z¬R» Úç³r#Z Y]ÜkŒ‰n›žÆµ€°·ûO9!73m„§^iÏØõ™´:ªú4n«#„‚™;þbœµÅ3sX eóÉbœ>)–¯õ*Ä oø˜«¾•7ç¯BÞ©!ÃF¤.õi]LˆØŠOì@ßÄ}d˜ÉÝ¿®çq!KΗ¢ªsÁYÇG=ûlF)Zv(èC|Jx{iZ!e;•,É Â ’µ±|ƒ÷€½XõcŒHÄÙ¿×KEaù=¾©5B;ƒ^ŸÐKl®yñí#f ÖZOQ=Grª¾9š?æ&WÂ_¶Gœ`-FË ²^ËFeÑÙ|Qs÷‰@&³‰¼)%†&ÙVt“òÝá»$Rûîw6G2âŸË»¾ÔëP†«ͱ㠼axwÑ}f‘E6ã½…'D’ñ¹kÅ&€½Þà÷ªí¤‘  Êþ oó€Ã(áóK£„? -Pñø¦BÏ(z¡'ÜM¥æ×JVýŸþˆ´*\ê1÷[¯lìíÐB"Òx²©–Ž^ÁâƒöH£À¨;8¦.=‚T5|´¤µæˆÅ׺º©wC"ï|‹±›p¯,ă"HŸa ']cRZµ|AA‚·Ó½ƒºÞGd³àÖR¿¢óë¡-Ö…ƒwm$Tæ×RH¾ª[uµ_ùQKLw~ÝÝš];A`\&¦)ãt·ô–{©ÊöþœŸ~¯}GT­ 0T¨”tù™ó•e'GKÜjÄ-å‹ÕÃô,•öwoîèù1‘¨™X¡ð¹‚Mlè%Ó;ÛÄ´áy5©÷E‹Zâ2/[VÕL|nŒC,T¥]šÝRzéÓ ÊÌØ‡S_´£8½ ¶eÜû í…`õH?IuÉ”È=‚”KËÊžË×Ü+U]àX®À8RÝË<|÷ˆñÞB÷‚_‚üªCòølßM ?|Δus .±9®’B¼)Gýfª­õ¦á5"V5û„›úñ½Luœí¦~é»EšFA¬QuZ€+ö*‡1º•Èv§š%©×\ü­<9jBT ¶›"ÄÁG¶šóåfïÌãüв Я8CŠGBî"š] '[ ~iÓ?É|T×[㤘¥Y—œ¶6.6[A‰½¯ûÉg:œ˜Ïº¶Î1udá“ š;•¡>«`F ,[½Ìˆ³Jqó ™|‹=Ê9¥8"ÎøµÎEÿód¡§wºÎp݆ž’ÚF¥%ój~!ʰùÏŠÑä -¾W6· æM5치°ëÓ$®½¼àP‰yÊÒ–Á9/2÷ȵ>" €½~(ÒÔñZ£3ÃçYõ¾kCüÂ6=»üy„@òŠÑg?ä.|‹H'Y]-9#H³¼:ÀôÐa*,×Ô3Òë!=#Ì#ü%-í+±è/QçÙx!õ´ùÎáU;%Eòœe§Ìn±C'vÕð÷aDâ ß.åo%Ÿ˜£f«Ú?©¥6öD91›[Kν³·µt-–\êÇ ÁÄÒq0”Œ1Á î{V”ph,ånH x¥ZZ+PSàÐÙHd!ù“I˸óÑZbÁÈ>ØA‚fß=?™“ÑmKêY{’Þ¸ô\黋º´"6Ã>|íQ4q¯ž~ a$•ÿ(Í õ”Ã×ÇéÊc$3í€qÑGˆ+üà3gǧù”°äK¤ð­3âŸUNýù ˜ao ˆeN”ár˜üéW;ìÕÂéÈ7r†ÛQÒÞ JµwŽ Ÿ8È”åä«á*K7sž_àž§k½»Î·ä Œ.GuÕü΄¯Py·±©IB‡]ciL£áìïÓ¼¹AbgÙ&e‹ò=O|p&;x½žÒ§A2ìíhcÍÆ#Ò§S}úŸÅLH4×ßfýªÒ"gnYr‰ic¹·ÀoS?Igzº"š¾4–Ùé76gÙöól ªCbº®¯ØT#ãln ¹Ì}32ð€ í£\<>µoÑCûÄZ¨cÔvŠœ?? :dè…E/|™oü&ƒþãü¶~‚•Áïc—&ÓÂéXQŒywW?Øa–6ý¥®9[dCñx€t8Ù) ;2„Ôq!'5 hª1ìí¸n‘‚”»²þg‡ôÙdw íú.Ç©÷„šÖM#›i$ÙZ%Æ'þ-µïÞìn«w'~—¯.%FÕv'ŒÐ¶ùGä)+ÒT;9ì}·„ƦΙ ¿H_‡3‹…Z;‚YJ‚¼,ôf 3n5P9æf83hvöj¬µhà.Ø,µ,ÑÆK|£E˜‹œã‘,7¹ŽíŸÞõ,µ+ÌfôNGˆ‹äP3¡VÙ0f¬ãÝ3î™깦¯¡ýS¬*6áÙ)„ ~™4pÂ6ý:ý¡'ê9h*Šu;ªgúŠR*F>sζŽÃìÍùÆv«ÒòåÖ B#ú³ÜWx+x§™ð²ÕS»§·¶WNIyÖâ i¦ÁqÙÀ¨OšUŒïlè4+BšűÑêôíUýÇ%R3CÔ]¼@\ŽûDßaírGÿ™B >„'2 jŠî&ZÈü&µ#õ Fï÷’ëûóúõ}¤ÁŽN‚Ä 8Ï`Ä—‘ÙÉ,Ô ?üÈššKô¾+F¤ÆŸ/¼¨âRXȾTtøþ»mG§fd¢tÞ)–­ÛA;¹´S¦¶&ÇQ-à™;ÈÙXkÒËS¦úYh‹„‡F‹ö ûËšé)õÀµÏ6.Ö[*]|“þe IÍòö -Ïq1KÜð$¦++©å÷P3iM ÑÊB“‰hÖI*ìî\×éMû9teª¸jfÑŠjí„.1µa!r£E-žõ)nõ@‹=êï®pòü¨rçñF‡ìعß& ÕÕdÉÈ7º~RZ“Fæ{Sâ©üç›xÏÎǨ²~C8)΂ÈÂÛê1-YL¸‚”=&=ýËè5eSÛ‡sÔ2r6Ó;ÜÈÄðqÇ#qT…ElޟεôÔ`ü¨´¸6Q—¥n Òì–ò¨F:vSö‹LçŽ4S’ãß°¬í‹ºצ5â9¾ÒÊ\ó£\Ûÿ XѨBx˜!qërÓpaVï¿Â²…s7ÈL}ÔËŸê*Sìr¬â,Åå9Îûvr2ë;~–ÈÌ2@,Iý9"îMϸqG¦™þj.UžúJ¡Ã5£o2þ²p)…µcHÀ§#ØzäCÌ>& Oœð6!¥O­ûûùÇèÌÛÆšº",z“Í¡ *û²QIv§Õgm«ÜÅìù÷‚2¹ˆFÕêÊßñ§alÞZÔæ¡ŸbÐMÅ$¾Zì<ˆ} /¤£€h±“iËzz’V8Œ‘öÙ)a]Í,Û$º³mÅeL`q[¤ºïÉ›æÛ:÷®Í$—.þÀM›'~i(h2ÍÍ`@xò•bæÑE¥üõªœIÛFoˆŸèÃÏfú9%:]Ëì½²ÕGÁ™ìvjøà_“Ö^,j©Ö>@£N 2#$&.ÁÑÔ²Ëß.ZR’­NoŠv©×6‰l¤îª.îð‰ljˆ¯¤hx„ÖÚ_ Q[¢]ÖQ8õs“ï Iœàï‚Ýd»‘*u™pð‰£\,‚Ñíð+ƒ,ÞÔÇ Ö{Z™‰’˜-+d™Ã.k=gSNA¯~ zÈ@Øï¨ØHÚ'Ï ŠÑßaöôz·;ƒ]Ë®öÕbèë§±3Þö{Œ.%&²¼¯Ϥã³vÄñ2ÇùéW<Öd[VvtNü õzVúeŸš@}Jtï»7[vö?i¾´ÂúäòÊó¶WCjj­ý/?I¹”6%„f툯jU/ÁP²xú>¢x¨y,ÁOVœqíeÖpY S$iÒ ´u‰8h›8÷¼äB7=b軬#ä¯.kŠ;¯<wFûík_Éí&“–;ßÅÞ$óëm%2$õúËâw䳪4#¨ãt‹gÊ1/ „w¶oŒÅ-€·0 ƒHu4Æ¡NŽl‚o 0 ¬z>”Ðh\Ý:Âä„»÷<åÜb×ðà¾bz4£ù¹=®½Þ§9Á«É ZƤ)Rg)“˜5[—9aœf~"Нéòé–BÇOú…ØçPch([³JùÛüþÂÕ——R‹„Œi£×ˆ“üž©ÏGëóíX,c¨éÛ·Kµyú óþ²ÕLg-M')õ¼åq™ˆ§Iágó&F¡'ò,ÑÅfþµ6K#é2i»¸¨,å’5 Óõ?<}YÔ“! MŠI™^l´4<K:”• ßÕà\#s®c½eQ^Ue9ªUŽÎ̯gGÉk}:»½*ôú;/|âÛQ@Øï`ÍéáÒ’ÓZt‚ôãµÛT-j:¦›­†f,[GË¶Š "¸mæjAm”Wº ÔªD«󔌹” édól _c¸7Bûî" IUv1]4¿8½x[=&B •wUõb ’D'L»$¶îM°©¨†Ôš3TM‰YO,×½Â?Ùž¨ØÙ?5‹ýì¢ÌFKÄ+b{gç³¾FÀ¸„t’„tƒóÑ'toò œŠñ‹*²ê/”¡²'XÆÕŽΛai:T^âu‡q|#EaIvv¾ÐšT<µú…[ ¿”7•%ßVãLÍœ—-vÅ¥úímzzÊëiqïw5Í27áÄ8ä('íçZáæà£r/jHQ."m9¹c©FøÛÅÝw)ñ@S› ‘dJ•ÄŠKŒÖ7wµea&d¶s#ÊE_7ܤ_¾è5 è ® ˆD2zïÊDÅÆ ãïì UYÜS¾göŽd&ˆW’V-ÜÛCÒ‚.Õïû5(6•XY§Õ§; ñm¾ÿHÔ BÝüü,Ý–ÞöKïEz>!2[µ|[ƒŠo­½P†o2x:,˜‡oêD4MöK»wÛb¸4ËP¢®GA¹Fðµ4¸™A3ô³ñt•zÅlþ×Ã#½<Å·éem«iÌÇTj=>ú.êºeœk ÃÃîR쎷)>|þ%ofC)fûvÆ#.ý½ïj¹ó¦À"‹Åžƒ«øw³%ѹ°W©Ø’äœçmé¶?ó>°¶îpÓ%ìë ¢H<Ïo!@Æaü2È`ó¾™­œiEûâ6ƒ›L¯*ÿí—Áûg¦¨’ò'«ˆ9ÂéßÖ»Ê(m³èʌᖶuülÕ$ ISÙ1ÄAk)£a¢ºpÓ¿pÛœgµt¨¢+“—ì—wÆNR"hÌ6V^c+ÛZÕõg¢r¡®%©_¾4yqjðphdÆpÈ ¯O¢9ûcË 5á»Å: kmð/|B ݾܙ¤ o{a¬\(¯o%úx¢†9Ûé]?KËVÙ­ ]Y>:¡ß#›‡X¥t'&Óí’}NH(þÄ+z"Ä•ApÉm¶ç/ê­Ù?·Ñ%¿%Låö“R~¹(¾ð-8óºJfjah_Ö‹÷º_Ý”Âz]f'°ªzذÍÑ#»‚ør²ÕZ,xŒD·e'ŽQ~ŽçôψŒki8ô#iqéëîCÜmÒ~‘Õ¶ûM_DËG­E‡ÓÆŽ®È¢UÑ•ŒiDA_"Õ9^ù:­¢ßpD·ˆ'Ý# AZ=Ã!¬ôªP8qîe0dpÖÑ«ýö9§n:¹ê{@;¬âXWÞÀ S˯ãÍPcݦa1ü𥣵QûDf&ªË´vT_e ö®Zoz8Gáê¢Ëú ÜD„>Á†=ªzߘ•ZˆGçµDÅÿúu•ùJ!Y\†Ö‰Û'ßÌ”Tç¬4ëÒšœŽÈà]üúfÈRêá€gËO0a@âøÕQ/SJÈþ¶öTƒjgÊPÙ‰ð9Õ¯ï[¸ÉbͽNîm©Š¿Î: ânïyÌ/?Î5¼1¢ aج˜hðDV·ôIµ¿b½})°5Ø¢«jGœ&üúí¤+ì^á£×1irP±.sо¬î÷ª!_Ú°œSCÎ-6QÊ_s8™¡Ýuýr´ 3(VÓ¦i8åóñzL/$ìs1Æ)ýfgÄóÙù‚-® •‘¶7®NÈh½Q8Ç-ú«s+îíÃÃY% $KÜ-IË{zä'Å4 „c6Λ°º ¹Ñ;Ø,C)ur‘^w: ¤ ƒ°S<4Ò³1Ú§ª’ ½ÀŽ¥ìY•«9þTÈD1œì mìe‡]l1²ŒDï#p¼¦˜Ø’Œäî•v˜^O_±œìYØîl^¶Òªô9C’ žÆ›7Œ_q†1j¾v9ÑŠ“ˆ`ÁŠ5òæ ›F=DL’PÈ*é.Àb\*ÑÏ"ö2}C(ˆ$,XÑ~±Æ¸]J‡àS„vì" àxª±û¹i¨æÐ|8¾4;­|>hå>~[7÷ðÒbX¿§bJkÃÒ’ÌEÿåùÐé}€µèébx—àhë~ú^MLåÞÅ—[7>ŽêÚ¹{‘Î2ï/‰g§=µ¥/#x𴬾rõ@§wnùv½Wã䜼 ›Ä±ã°ªI!ÙD')\'ÑÚŒ•¨E5.\¯£â4zI!ê™óì]·u?[ñ–¢NOWJµ‚„û*J ì"µK³¡xª›Ä%Ôf„¯‰M¸×í¡gãk+™¾ójÓ,ʵ6[Ú@ª¹ñ¼qn”m-ðX¯)¦sO×}Þ°¥¹h üO⟦Ÿì=?‘ße²è rG€,s‡wÙˆEâˆÿ=¼øÙ endstream endobj 304 0 obj << /Length1 1657 /Length2 9936 /Length3 0 /Length 11002 /Filter /FlateDecode >> stream xÚ·P›k×.Œ»»ÜÝÝÝÝJ‹’àxq/R(îPÜ­xq+R´ÅÖïÝûýþæœÉLò\Ë׺¯uÏ:*M6)+ˆPvcãbçȨis 89yØ99¹QèètAnÀ¿Å(tú@W,ü/ ¹Û«LÖÜíÕN (»;¸x\üÂ\œœnNN¡ÿ1„¸dÍ=@V5v€2 tE¡“8y»€llÝ^ÓüÏ#€Ñ’ À%$$Àú§;@Êè²4ÔÌÝlޝ-Í:KÐÍû¿B0ŠÚº¹9 spxzz²›;º²C\lÄ™Xž 7[€6Ðèâ´üÑ0@ÝÜøWgì(t][ë_rˆµ›§¹ ð*pYÁ®¯î`+  à59@GI áÿe¬ú—+àïٸعþîoï?À:›[ZBÌÁÞ ° ÀähÈ«²»y¹±ÌÁVš;¸B^ýÍ=ÌAæ¯Vn—Ò˜¿6øw{®–. '7WvWÃ-rüæuÊr`+ˆ£#ìæŠòG}²  åëØ½9þ:Y{0Äìû7°­¬ÿhÂÊ݉C rv*Éþmò*BùGftðqrr ñ€Î —¥-Çáu½€*¹þ¿vàïëqX¿6ôY_P|]Í=€7w ¿ï¿ÿP¸¸V K7€ÐFù'ú«hý~=|À„ó•{\Î?>ÿy2}¥—ìàýùŸçËa §¦c`ÄòWÇÿÑIKC¼¾l<<6n>N€/@€WàÿßQ4ÍAWÁù«Øú«Ø×)ýOÁŸ?ãß»ÁøïXêWÒŒÿpü '§åë×ÿ3Óÿtùÿ#øQþoÿßÉ»;8ü©füSÿÿQ›;‚¼ÿ6x嬻Û+ÿÕ ¯[þߦÀ¿vV hrwüßZ%7ó×=Û8ügŒ WyÐJäfiûYþ’ëý±d 0Pâ úãV°qqrþ/ÝëfYÚ¿Þ®¯ŒüS|]œÿN)¶„Xý±aÜ|üssoÎW"qóñ|¹^WÑ èõ'‡ì`ˆÛ« àµ=€5ÄåàpÈÿ!ú q8þAµ €Cý?HèUgþpXþq½ò”ø/È à°þäpØü ò8lÿù Á×ÈŽÿ@®×rÁÿ‚¯‰ ÿ‚¯‰œþ_#»ü ¾Fvýäp¸ý ¾¶çñä~Mäõ/øÙçOø_Ó·twqy½þÜ×£ùüçez-Q– –"avua·5R¤žl»“b³t»™Ø|—\:Ýï1S™ª³C6\®¥RGz±Vwä¯$—)Ÿ|Z#Û’µÚüß%jOï¶£|ÿF08U|$U?@ŽLƦ+¹ç÷äì§lÛ Ý¥L—ïì.ˆ¡Yˆ{ëÙ¯àU?P±2±°«µWͯ‚úX1ï÷&¸tŽ®À"gžˆÁ‰ç—æÜÕõ,NÞÔ ¥r" ŠÿqüŠf†ÀW̵¬ž½tq³ØwHçíÄ8ñ"Ž!¢·q òºjÛSú%ejŠ0[4?§½:S,ÇQéÖn¥ßøÛØ; å(â£$^ùV=qHùFÝŠßFh‡ŸÜá¥õÒïÌ^ñ\3{mÛÎtlðF6’+y¦9¡&‰æÊ .ü2âÑ'<ðÈšþò¤DÁþþù¶¥Wgª&ß×Äú¸q8Ôfð5.ô7«ný<¥Å’Ù:û¨®5)ÿ=6£Õ=™’¶”¤(SÅÂcÑ3kY·N\òMPKžùä²ö)u²è/G… ¦@²Ù­zL’ÊÞwRPˆ¸^Õr ò7ìr6Çç3 §ûY£Ñš®û"°Ž6µÕÙƒ§Ë^r: )—Ýþ…´6$­[ÕÁß1²¶Í?ZYz³¹!5ÁPto{&i•¶ýk‡óõ¾pàÂtÜîÙìStjÓC\§b[‚ÏcÄ|ÊM)«`׿.ß ¢>•$'úÆ( ߌÆÜaŠy,±‰  áá =âH¶ ÆZbe˜N˜*“l½ïlCæEÉÿýÝôk‘B½ô*“›@½'ÒüJÎÊú,26¦Ð•(g^v kŠÍ×ûmªV^ÊŽ#&eç ¹ÀM4á΃?áî·«øWò>ï”<óG¿[I>ìmV=Ò‰¦'TËwšF(ÕL]ÞñcOÇNºzRM¥(áh0 ©ÎPÃÔxHãÆ]}Øg².M›ú[M'DK/ד€ž;Áy<) ¸Šv")qnîdRêa:þø?ÂË ‰ÞC·ãø ¦›ÓMU¾S©y·Ä#…d_$+’mºó6¾?ŠPܾð½^½ŸØeqä]ÂК»Ïâ÷NbŒí\á¼ÀÎñãfdäØÜŸD4e›y²~Kú¹)†Ã“Ì}s3ųïÑ“ÌͰæqz£&{Š„1%Giòb‚YQËf<éx$£È%I*¯!ŽŠz¡Ë`ZÛ|:Ù6¶¼Ü(¤½€‹¶ýn±'6q^Aªóú3±¨d¤=µÌ³ÔÀH·w}0t'èÔêÜonÒv˜‘™uú黦¡­7ßç@KºlÛÌÒu;V ¯ÙÈæ«ÕºîQ-Ë_Uú´´Rý. •ôJ œËЃ’R{ÊŸgÚ í×N«S¤j‡Á)àŠÕÁùcƒÈH«g‚x¶¹¸ÊeÂmLwï°¡¬ÊÀ±äÑ VŠð¸2¥òÓê^y{´mr¾…eÅʃ7~N pwˆ7‡Ô}CA»Ì…ƒ¡Ùœ*c²ºŸQë—þ]¬ê·ž¥ÿ°¿EXì›c+øôÜ ûܨa%ÍT «7-c-'È^®dÀ黾=¤0÷é4<å¹Wºö&f"\W›Ø‰Æ¶} ã°k[åÝFäU—Úåõ’ŸžlÌzÆçùXæ‰æ¥_=3š^Ž_sk\(ñ·b§8 Gu‰ñ:µÃ¤9ÜñÐl-/©o`‹˜7¡ô‰ ´»¶yò¯Œ~ºÃÅkýÀ8ŒxQ!R«Ï¶B±Ïè쪅nqOŽvÕ5z´U*Ú ¤p 7µZëý‚Æ‹‡ƒ[õíªâ*!V침õ:×½ÕpRLr1gVЏ¿žóEÿnž¤ÄŒ—CܧÉB`)÷‰Án_‰5š´ 9à}˜Þéýʾ<;Î]Ì$iPUÄ ®÷y'œNd4æb9)œ…SLŽ©‚™I3}ɤÈFÌ¡yAg êânȳ#Û(‰ ÉAË`Λù ÈÈ‚â=pe©Â˜ýVU~xÓ ±S±=Y ÈhËžù°éHè4*?¯yi¦>øa©F ®2›å˜+Hªã -@jÐ#Šc`J-½Adú–Gm@YôË¢·ü]”rÞòÇqqã!y'‡èm§WÓ.¦á‹Lf^‹Úi¤¡êu·xùǵXyÐøp¢š'ß;£éçâ”NÊ;KázW¸E›ötû”Y~úgêIS¢”ØIa1^ÅÝ: KÜÞygx¿écûÁËÜ»nvðAçZ¥: '' ¿é&Ï”keæúÖΕüU»¢uL¾VÝÛªdn$—ñ2ªö“Ÿ¦VÅ¦ãæ±—VR pæ9¤ÛéOEµÍÔ•X½F{ÔûVô?zýÄ\kIù¾<첦ŽYk±‡“ŠjjkÌ œHŒL‰Þisú›¬ dÍVo½imð–ö§^xòLëæoémq+àÂÍŽ +íSj8_…¦.U­š…£ÞŠ`Lg:dg”ð¿ãV3 ¤W ¤õû¶ÈÀÖ>±Tq*•­] qÄFþ¢²s‚gùÑÜÅ×&Z›û•Dëå;gïe”¶XŸÒ7¾ “V=Çcîe7qw‰&†é1?3”<´’3pØ ß6î³w3u$‹½±ÑÌ.®LiþíÍt܈EˆÜÄŒ%aòÕ¦‹î[òJ,uô9`9-Æar¥ÊG÷ã¤ðƒk©eç™ÂnºØ€7Š”ñ‹1Ëæ—ñÌ2ÀÂÌw4¹âîþá„V…l·Ê…´>âä¾Þá?‘àjß’M 09!êön˜–Oøñ`ëy<Žb6ñKêè0'ÔôJc2¾…žo¹ :4v#ý“œåÉmçA$ë®p~¼MÌ–y¬èEjŠà„œ¬¦ß=£z³ïöÀ`ÍY“èÍ“ ´lr•¢À‡.ÑmQä$:Eáør:¡XÍÓJfR¿fÐHàü© \.KnéíQÏÑ"µßü|a˜‡äÐvmä-‘³Y6¶ôU­â؃mgùmµ°d†6¸9]B¢A-Þ᳂ u΄Œmw`AB…ü1c£ÖL JÒ _Sĺîç‹në©»–ËLËqÙH!¥v8i¤Ù™Ä; Zª,ncu7œ³/ëóZ®Cªw-ì7¨6A*ÚöîBkî™Ø]üec o*N(o¥!ƒULí–xÌÁ9>¬Ø›Ðw×ó _·¹SÅÇŸB-ãð×çdý¸*ƒÁöá ¿jÏ1¥¯'NKÑ ¨œœé6²Z%VWLiBö@ÿè!Î8U¥‡GW€ÃB–Ò³Ûk2Ð5&+ûm¬Ç¥Ð”§Šú;fj¸\~õI]âph„ÁR‚ül“ɼú¥§®È„Ý„aTȆY€ò4¿ùÛ†jëøõѾJ¯AÒ¸9˜n”‚ÕÆÝ–tò¾Ú©½¹Ù©qµ2cÎ,+‘b©êH nZeg«Eç"© Œ ¤Ö?»—yZb…¼ÐÏÿöØ‚`x`XSæ-tG“ =}à@ZW)§|WWš/S èËc«f„ d^] É1ŽOs§Yp}tSé+bN¿d’?a†§xHË•\ŠÁòª K¥û82ài?A¾_‡‰_¾“R™b ÷¥ª áIªA¼>E¿043`X¨3!BF§]­»¶íj_(lã^Y/oxZ”DAC×Ϊª£ÞJpD–l÷樧ù3϶pºfSú°z@ú ·ÍçŠ*í:¾Zç4’6Êþ«¸³0‰ù¹Å¹-_ÈÌÅö3’pëªc$=ò÷áßÜ¿ S9½“Èí±ô0 bEž°‹­çS– ‰~ŠZÀe%$3ý­ç—q).]Šu¢#ê¹"¶Ok÷²®wÊÀéýôC¾¯À!ÁάÀ”œÃÐK· e¼ýÆá±úÅXtM0ʨ.Æ8í™í Ç5{iþÉèS¨»&¨2€ï0Uõ­_ÏÏÃvš·ØÆåpgBÁü£‡q²œ,B[ôˆÍ´ÑOL븟†ÓÜÛ_8œ…šì6뎤ŒVžµÌZ–Ÿe[‚Ì.¶{ÐtУ9/ճ˦d$[7ÕЂåÈc­äEEÕ·®ü:PtÝG­- Êb¬,wJ_‚cJOVbŽÑ5[ØSFçnª×dòû ŠR´ZY8Õô#Q¢5Ç(±±Ÿ>Þ㹞R­q@£mw‡j©^ŒÃ[-ʶr%*ßh¯&y­Ààé!…Â7ò@Þ«A¡¥Cå1~ûéKQ7Â!)A_°Ò\ÎǨjor|*D±Kd_k< »_@uêËJðÚØöú¬ïè‰9iwR¶CÈ:eÛØIé÷nn05¾Áªb³nb5•£aN؇J©õ"×~€{Ô²ÇG RMyÜ“zŸ×,9v­ìqÅ x”í®Ÿ¡}7ïÕú^LJcð­ç@º\|E žÑ†ƒÔàÑmaFzÀ¶m k¡^\76À‘åoº“Ù hò¾ÑNQ£)¢ ئù9‹s¤ñë$¤Hº¼Ï˜¤í}æÛ¡ËnT³ …ôrâ5älG &”B—¢l0i#ÖyXmpá5—ÉBÄ|–ኘ(®Nð+xÌ1/¶­™yäåçÎ! Šã:1ÅÕªm"¼ÅcF—½Î{Ö%¨±´ö·æ.>MÅfiOüùŸùÉæÀ2gýÝïzSYÈêÅn´Ÿ ;ò6±ê.’¸bU•_BgýóRÀíò J®O{â'hUXð˜Á‚¦ ÁšºÇFN±ƒ›7´´0‘:t‚¤½C:¸tø ¶ŠÔyÁ÷ –0¯›ê0J›ÏÿÜ„B “ çò£ ó­L½¼M¢A ÄkŠ“jÄIz嬖Lœ?¢Xòdñ£7.‰ 2ð7«3ÎEƒA#»^²f ÎZžÖeNiò+-w4ŒÊñ’ °þßzÅN¥)¨Ì3}µ~ Öà€8~òˆ¾À´‹n¨ þÌ-™u\>­j‚yÇ6,“U=‰á½+A9¨Cƒ1ÝŒ¤c$W:*V´›Ò (`¬;¿/t¤déÕ·~œ`ÈlIéÉ1Ê‚á¾6©‹Êj¾5sÜ*ó#5wÊøq=T*‡ZªQ’|hË—¦5<‰ýpOƒ¢f«&uz+O$È~»GÏe)A“EH³*-†P{ù<¸½dJø´)< ¯ ¾ouNÙ>BxT+­˜Ó:V¶ÀšÌüòV7k¶­ÏÎúüp݈öª´“ëT•` UØœå"UQÇv==‘›33ºOâUð@¨ø•„¾ª—(†©¸‰ñ0ÏDË X©¬Kʱ£Þü{N6ÉÉì(Á|Öí‘¿Âd¦éö›OPï׺ôAD­—PfÞü½G ¦ŸŸãçõº»û)[«KÉõŠk¡›kc@Ȫ® 6}T~z¹p\D©PXâQ“oÆN¬T‚Ž£Aý^z)uì“‹œÇÒnÍ=#Ù²íï‚ì~Ýn],eæ6¡ŒNråè€ô{^é¨ßÎÃå,½í‹¬‰‡—™CNr«©´ðÏÜœC4ۻݣ^)¯yOV' X3ŽgBØËOAæ}³R1ÑbGsè,9!ó`A-è/‚Þšð=÷¿1i~À£Ú¶ º%Óœ‚®õæ2“B ±ÔæÖ#M—?ж: :ËÖ줠æÊ â³¶:øßòOÅËÝÉR6;©¦aF7èµA´j`äËÇ5Oξ™ÀÜÛÚ@o|üU§ƒîlÚž²5c&4Ü$uI©*Iú™†}2ìÉü°­0Û’ªº ®àgÅ"]º—`"AÎG §‹Ç$5ê“'Xe\g¢sǃšÙ’4ÓߟÃ}4ñ¤*à"òvM›B½â- g W ØCêߺ£S6ƒ|š9L„G“EŠø·(óQ3t¢Ú¦¥ÖTŠ’'®ÊS]2ý×]”_áxKVž“Ý îäæÜ¯”¦)¾/,ãSªD<£œEœL&}Fh' ë-ñ¡']ªŽ»­Ìph|k0ÂzÉÜãö.ÓãEZg9p ÿùZ™JWC`¼gÄ,6A‘sÙ—·–ô×T*ÒÊË~AÝL3«U§Ü†bOx‘éþ³zm,žúVùr³_'W%GˆX¹|Zþi[}‘¼W­_Ü VËÑ«£tÖàž&4¤P<‘…3f§íx6GfK?²§&ÿjðìvèœ>O¥bîw°‹Foÿ{¤©–«á5±·µš<ÎÕÁò¤cË 8êb·wöä~o(­…96¾4e¹ªœ^ðM—ú¬–ŠÉ:FHl2ÛMM¥1†tÍHš£‡Áï Uˆ™~'o#ðþ±9ÊY¢ŠØ´òˆUqn\o%îÞLQÃ`R{ä>T¬œ0üÞ”r é5_oÙhT ·ºou¾w%'šâi¿Î;<\ìX7(ò_d3FxðƒÞÅšG<'F⦷Ff$E_Ú]Ò%£m{Ô9+fþPðQ1x‰l"ˆ;'æ‡oL zÌguéuRÚÛåSf£ZoΨ=^n{Ú~ç*·v‰pV·Ú?:[U‘ô‹ ÞÍ#ä—_Èdþ²¤>[‹_™yCíÖ`ü6´­O±?®æ¤ÎϨªØ3Hè±SxÔõ'*—Š ÄÊÊÌ`‘]ç]×…Ê;¥a:¢Åº>SDZ‡1 ‹ÃÎÉè¤wå·½G£"És–ÞSô–MëMûÓñ{°EeCйÀ6{¯jÃD.tÞ‹;X˜åò F¨:Õðžs¸&Íí†ׇÝ&¤/3Gô}ÿê0–l÷=Žh7Ë„¶Äj K7Ó~uóöžS’Ðpqž|ì=Îâx±`Š›s•½îž9*Q£|kV$MŠJ:“¬8†Å­2)´°>09Mç-ã7RSJ“îLÜý­s6lWe°j-øÁÈÛ•¹3]–8U[ÜÄû/{hŠúŸ?¾Ç~Ysò¾=çOøn×¢™*¨‘ubˆ9 Uš6¢}²QX´Õè”ãåg{|W*Í¿¬ÕŒž÷^¶K»JMÖÿé “™(\˺êüÁFÝÖÐ~Sþ¦=>.€-¡ö7 /q¨.sºÜ³Ä˜¯|—ãn­ ɦ ÆÏžºáFÝîéëX[û†L¨³‹¼@Õh¸ãòʤæF@öö´*’J ÊMByÃ>öõŠŸóv|7ÈåUçæèˆÉAË‘‡\Vá¸%†ÝnëZM¥{¬‚eëõŸé7Hu£IÒÒÍL=N ¶r¤púN kŠJG fX(ÍÖüµ»Á¬ ýûÇ {ŸÊë´ò~üI#Þ:þÝG£ã!¯ÎZª‘^‚òàë² Y¥yAjg±PMA›©ê³jÁôµ`¡ñûÖ!ÚöKz:þ÷ßȺ¸ŽjeÖl뼬Àè¶1'³V+É7¿å;Œóñ¥è p3“‰ˆŽBpk³s\2—’²ø² ­¢¼öÔÚ¹Œ÷ ÛØPy¸é±¦Â)õÃê‰Ù m‚ø¿\ÅR*?L ,fß½s­Dž jÊÝ=Xܲg°°ïñZ:¬Ô'-5ÚÉ·Œ‘SéBgÿ¾A¹„Yk¨qQ”Áqï*ªvÐrPÚVúH,ÎS{ôNFô=Ew$öp- ¡ÎMÖþ9@Þê›>a…÷i€‹Â×/Õß*û‡ ? fôˆ<Ž‘ìß:h$oDÆR‹æ‘!g–¦k¾u´CÀÙ¬tûBm-%A¬Iä’BzóÔäRbˆ—¡÷‰¼mÔ¾¥‚ÿÊÁÀC«§„míJúKt6wòy£H`8;„ìáò.]orbèLÑ]ûøASå¡ÁéògË úÕµ ÛÈYb:-ò¶<ÓV ˆuP}ZÐý |F_mAhÕ}‚FðL¡­sƒVòn7“ï¥væÕÊ´0(Ž3Þ˜$s_­/ãma84æï3µÐ£Ö=7ž¯ ˜#ÝZÂ[Í Cìq‡Ç£³*•†>-rR¦rISG_Ä6¦-íc~~‘Uê1ÅõÈd8]F6<³ùjäFwKaß¶n&ÚpŸÛóÎé "w>ûÀs´´›Ö¥ïÖv´Ì&SêKvHe¸a·Ÿ¨·¯H™ôu7Ù3!U.Ý͸ä.,¾ú«‰.n'ðö“žZ•𢦶¿Mk“/A=c1ó`bU™,yÁiU¢ý§ìnVõ pQS«Ž'+…C‘¾?½nü* Ñ·²‘­o ÚðѺ G¡2|£—´hÊÎÍWGÒáæJç÷YìTñ)û;¶itèE; ÆÅ,Ðô ¶f”ÙÑÎ'¤€Å6³OR‘ƒÉΤ'ó¬5‚ò¨$}ë÷Î;¨ }ãZØ’n ‚Ä»ÚvÉ/AcªqˆÿviRïÜA¼zßµòÄÍÜÄ›|Z땘’תýaŸ/νÙùX^_n2 ½.ç))7ó!Í;vz»æé2˜e‰¿‡³ÎÇ=ž^RýFÉZ¾€æŽÝõKéM~©†jwL+&QN?´ O ×OZÓ^”|Ë”T†VR˜ ĸ͘~¿ÏŠln$6‘y¬²WÏ,¾¥ZÕaˆt}ãáqÕRyàZ8b!ŦBn-/:ÕŽX'², $(ïïûpø:ScO4-ŽÄ¢µ•ξ=P«÷×IwSÅq%±üXéÓ²‚DÉ+Áèú1•G»ž6ä ÂþŸ—âigÜ«KÛuL|lÜù³ ß®P’–txï´ÚîG3ú ÉÈ6iÎ!)¥ž°ì’óýõéÎ9!¹Æ|¿Üº÷Y=*Bñ ²%ïÈÑ·U¥·5vÚ8oRýï ¤U2rõ¶­:† Œ¼8 V˜çE­Žƒ¦’‹ÁÆ;0†B>œ‚Öâ[‡Ûyz5`›–Ë GgÅú+Ãn/b¸®ЩXlj‰¥½.Ÿ/ka+6™[‚Ó­mÃðTˆ·îœ(1Ô›‹3Š$Î4eåìW²<5Ç&šKDv•”Z-¼6\пv¿Ÿ˜™fëî0Õ3º÷¡¨ …ÉCë|ù*¼0x­­ex Ží‹¥•د, —éN/Ö†iÅ«;—ÕçìBXG¤TŽôÕ0F»Ïu£Z˜¼4îqâ‹\ˆØF—Á«¨V°õ^—•_(«×Q•#û•}@5ض`NØ»šº³‹6÷E«öÕì Mr[³‹ÇÚC—qҘà ‰& NÚ¦Ùä»7ÍR Ph´ÂŽ)T²–…º7J«~S/Wõ´œÛ$‹lË;·³Ú?$?µf`¡‰NÕÖ³Aê0‡0Ý­º¬]°Ê« czGgrœ\§§Q÷Œ¥û©Öah^j¿¬ªÉRörMåe>ņñ[iæÒOx{=ÖÿÐÚ¹’ŸQS5fîJ¡«Hž¯ÿÀ?ÉkÆK³¶CÕ,ôà!c‰ošÔÅÛ}ö|Kb¹á¹k‘¹. ®¢áOvØ»8I·ÏYjÎàù´W“HÌžl¯ò›ôê,#qÃŒ3žwžÝ ê2¼§W߆çÅiÔÁ źDæoPV%,Ì"&_oõ_)n v]!¹ï’÷XÜù°„M„‚á±H#Ï3'…Ñë*™V¼¦îÁƬqÇԫ䫵û¢cl)Ÿù½;E>=Kh­Íê$±ÚpÇæG­Cknó<ƒö„Dsýd?®…ð¯¦VoTØåq.ùÃx”eô´FOö?–rØk£Iõ gEÈܧ#vô8­K2ÀÿøIuåñÄ‹£|Ë­²#Y€†æ`üá_o•VU…Õù§3OÉ2›ªc‹[Øs„§É¬åRÆd$çÍ‹3í®’kÃØé—¸ùD—ó¡Z‡Mä$æ—Œ¥¦I.”I-Á­ñÝ-qåwÉ“H#ErÓ}¤BI9Ul3”ç; Ÿ´Ëçü®¢cÑŸ.Ç¿ñŽÇos)‹…æ>Y]/pP6Ȉ<†Ô’øÔJ‡õ#SE áÎT Ç åØ27ÍŸE“(† C“øoÖÊœUA›Y8 ¬BY´ù¯¯*5}ïÇ£z««î‹þ_4!@ø«ˆÖBÀ®Ý½y{kšcœH_=ðð"rúñ/x à@Ú=¾|GªY¹?òe7?7™‚[©»Á‡5>ÀÁ’ºb —;mB\§\àLHï«E÷TZà¼Æ½a\Ü {ò5LsxÒäio«¬Î‚ð'‹”f›¾zŽ?ÆõÌÈ—fÜ=É8Òˆš§÷QUƒ'|²\1"SƒÎÜ[Ã%‰)ã$ÂqÒ8ÃQèTÑç²FF·6¥ßíbÜ7®'Îåö7·œ·‰˜«l«*ùç»GãÎ$åQb@F+¶ôégÞ+Š£™ÓMþµžd¬Ãçö½šeï(;tŠp#â2Ã0ª.±‹Vt{U’MùißžÝÕÞlNoãLO8,a=êÙs9gRÃ=‰ µóTé™îÏ'IÓ“¹5ê £µ®]§û…m+äKj­ibOóQ~ ˜©[’;˾·äëÿL endstream endobj 306 0 obj << /Length1 1494 /Length2 7343 /Length3 0 /Length 8349 /Filter /FlateDecode >> stream xÚ·Tl7N§t£ÀˆÑ±Ñ­tI—cÀ6£»»ABBi ƒ”nIƒnù¦>ïó¼ÏûÿŸó}gçl÷õ»â¾âwÝç Ȫg( `‡°…ª"à(° H ¤m DA a" Іr†þA‰€&P¤; —þ/½jƒBcÊ6(´™6Ðôp€E`qi°„4¤þcˆ@J”m@× ÿc|ÿ?à¯ÖÀ‚à¿Ãýåý+ þÛÙA¸¸ÚÀ}`p€=Ì ÐU½/ˆòFñlàv¿ mœÝhO˜³-Úàwâ6U}€ º¾¿ªs‡ a®(wAw˜ó¯ …~…A7Yn§„pqÂQîD¿òS†!¡t×}„~Õ Žð‚ûý9ÛÃàvö¿J°óp2†ÃÜ< ÊY !¢0( $$¥P7Ôâ(ô+¸‘+ô·ü FçàçŠpØ£K€Àì¡è"?wO(…ô€øý·âß °ƒAP[¨ NôOt4 µÿ#£'„yÌAhâ _Ÿ¿O–hnÙ!àÎ>ÿ˜ÿ®ŠšŠ¾ªßï‚ÿV)*"¼~ €€°K‰$Ї€Gѳý•è_ ¸= õ'Yt—þ“°ç_Óçþk1xÿŽ¥ƒ@3 àþ‡à 1ýþ¦ùo—ÿ?vÿŠò!øÿæ£êáìü[ËýKýÿÑÚ¸Àœ}þÒ£ùêBs_ÞøÿššBÿ¬«6Ôæáò¿Z ” zàÎ7æ® ó†ÚéÁPÇ?TùƒÿZ0gª‡p‡ýzP`ètè­‚8¡ w4« è¥ù÷•*pÂî×v ‹‰lH"ôˆÑ’ÀŒ^C;¨÷o„áÚ€./`@ýš'ÚIèOIhø"²‡¡Iü7 ŒÈ €Ý߀¨@ñ_2ún!w¨'úÍøE#h6ÿ-ƒB(G$ô¿|@hÄ ñ[þW…$½ß¿ˆ.ÿ?òïÇ õ†Bˆæg™ðÇ áçu ·½ÖFä&k¦Ù<~óÈ×?Hñ3xjóBWß2Þ/~Qá>½÷‘åÚo§µ?ª-M¿ýÒÿÊ*Å`|­hnŒ¶w´dGáå{&Â;F÷Öý¯ÝüMBœ°[1»4…n’¤zÅTç^ïÔ¼_¾¯\ø9³¦¿^+®E|U9!`oR>,²ÍŸ¦gÃC 0ðRz“M~Ÿ¤,½aÑLá# ØM)õ3[N¼˜ö]ª2vïfà`0£gÂ>¥ü0Î駸™©I7ë÷¼tù!kšöõð'—t°ó&·ïšŽÁ9rëø'pTš›^›Z#.~¥M=Õ¥œ5O4ÿpQsÅ[ãX¢ÕÖ_7v£ë,Ñ€S5YƺnK}gŸöÑÎÊúxãˆÀ¶Š<©H9JF ?^vMÆùHú-áy©®ayñ'C^Ý»o¥: GWæ?­fÔQœÇ³Œßø…{Ywîðq —ĸïþ5Ó¢’Nì¦^ç *‘Š"í[#Úäw[Ý^ˆmM'sK®‹¤&¬r¡0S¶”lkÕuP³Z²øl8DU磖wzÿéÉuznd²£ä‡'»ÂúxÒ[oKÈ×ý( Ý4~`¼œHq¾5žö.AépIغ;8ñ¾‡ÈðÙj;­ò./Ù´R_…óëñœ5÷©ñûaÆ Nô.ê/n©º-ÙšqlžVOøç,®·ðvþX£å1ëݙ꠶)ä‰'½Ë©:äÐPÑ_?ð¹ÚX½ù6%_áêÃõ•Y$;ìæ1lIpáj’±¯ìÎT`ì—‘a[±Çz¾­Œj¥$·žêC,ÿYjeC`ªÜÏH8«~ˆYfÔXöÓºJ]ØóèÈïëÕÏ“Õù#7l$¬O3Ö­Ìd¨ò̺®w†‡)+³¡x+AAÓ¡nÑBx¹ÌUÀK„·¼øûµªƒÓOH.3òÚ’2uÈ @¬Òjl¦&æä( 'j‡9¡ðª“mƒ{,óþÎG¶J!B£¾¡uZEÌV8•5X0~®ð¨þQŽÄ£4‘6•ÖóÉʃݠ8&)ìn³cªi;Kgs"’¼B®€>7wP>žŠZ+øa†üÚbŸEö…VP…Ù7É”;š=T[çCJ“øÇ@ÞY™™®›1¥^†âZ›Gà3±ò¥..ÇV{¢zw ò‚’!£ub5Ý…‡Øè@ËÈù'¶ëÕì½yyK†ûÏóX¦á úIj&;é«UðòÀ¡9KÜ-³dëxŠâý´HÞu¬@ âM¶§d…Iã!ësg^L –"¬òØkc¿‡ùpÁA+o.½Âêò‡eú–ŒÖ¯R*pzµuXÇðÒhO{>=ðÚ’>\i ‰ªÎ£ÏKã³tH©Û¦2›¢ˆøIrp÷ªLÛÔ7áÉk–Œ«é·‰ý¬ðȦÏSÞ»7áÝzh‡|p>#$'.€á€åf1(Ε;¨–+QukB«ƒ^"Z¸Ó>¿Zéé ¤Fãö¸F7-Ùi¹³ñ1»ÖnøF5xÑÕe› ¿Å˜²–̱¥p²¡ ‡Ã«Ô¢VÓ_’¯Û°PE®¼ûAÌ ¼yÈ$8¹pw¢v¦@mÐ\4,þ­ò(ÏÂÞD^JÀv˜lÂ+ž] ëM²2Ð é4Ž8À͉—ÒÙ×Á‰¥I–}4Õ¦&£ª]RÔl ”³¡õCËþôqÇé~Ö¢ï~{sÑøó" og÷ÊñK¼;ß*oƒ±@^-Ë ™Å»kî;=rÊæv<÷®–8¨àÓLöçó©1ÚóY rb:ÏéÁúYNÕdŽ/ÖßQúß© zÍcÖ9X¤™íˆ“ HÎï~„õÁ«„ ê1e«^KâÊê-xÒÏæÎz1cøÜu®ÁSƒ ?ËG2#ð;0÷iTÄ-µÕžË”²d_K4r«nà¥cœ—©‡UÏ—iñ7æ´M©rMD‰&}–w¾h¾ ì ªn{¿Í+¤eÞä•Û_Æ­Ä.бŴ ¿in†fеÅFˆ€çº\¼×å3oMg7êæÿ  ©ëf~Àjþ%t~®'ÑúbÀÇþØ?à“ÁdBQ¶8Z¼@ <š=Ï[+*Æ/r:-â^™ÊìÄ?eœÐUßoç˜)-_K®Ösºû~اÝç&Z4¢J÷ûÒòáPª›œ’à.³åžÝ|O=nsà·°¾d¨‚€ÿJŒ-ØÚ·ºþ1 19s¡ìÊÌ‚¼X°yPq«0ðkŸ{WÛ+Ûm:KŸœœNd¿2ˆÜñ~®á4Ïv•¯¸öºÜç,ªŸl\­ºº›™?{Ñý'ôæËà Ÿ< ¨“]mO=4µþÞp1õ–pÜ Çu˜œÇ?³äXñö8Ì©7i~GÉ^%/D쇪eìXœO&ÜÑÿÎ;:|¼1!î®@ΟÝzu¥ŠR¯”n¼ƒã¥ˆ.–· “€ôŸÎø¥ ð1)Fu ´v'÷îÓg/âxÞ¡Vç§–ŸHŒ8‰¿Ã/Þ˜ŽÅƧÜÛò éx_Ö_O|]óæ+©µ…®ä}š á³Ç²¬BÎÂ/že½ùºÝ%ÆØ›Qßípc‚™ÚGH·ÆKH½œ'©ñTkbq’·«Ër•_9™`”¹}F³tI%•Gy‚{k‚5)uP”íeˆÈ÷Ú3ˆ’”Xbm©C¤¸§¶ÒÛ¢Òo*ë”豜÷ª?pèÆgW| ¡aN‘¼ˆ,É€}.HoMß=¹r(] QKOOO—øIÎ’5`›IಇW çAyšûÖŸ)˜öú‡ˆÈž=äšÑt¡l{íU4,º1Ù_œÖ›ÕäË11VýÔèè+rú¡tµw YzO^?€Ù6BµÈg›ê[…ï7.×BNÃ×¼ÆÌ/ç2™Ÿa$†ÚXŒkÈM?µÛóL·b™³`^0ͯ8S\m;­·¢z-ÖTþnžs´Âyl¼}ÝôV}ø9E§½â1Ò…<ô¤ÔȲ4Ñx¾Ria¸¿Ï¦‘Xƒ·îITàNˆ—êöÐ5oTÏòFÌÿÛ©û13ÙRÑ|KÐ2ñŸ-܉=[)Ù ©Ð»ÙžŸµAúexûÕMÑC,QÝÉûk·^×¾;Ä‚,í«šÔû{½±o«àZݪÎãµ»¯ûÖx÷Q_ºVWµÚà“»P¥‹æ³7@1†¥ÚÔу2;O*Y†Ç«5¡ ¸¦8O÷¤WÈøåhnWýt)ª\ÍÞ…²!ÅP¤Õd5ÅÁ{?Þ—7àÜÙ•ç_õš÷Ö°œB_ºÇ4S|ú0ïi€Â(n,Õ‡Ætà:ÊÜÌóÔì™Ò'Â1¹­‹x/Ž„¾th4øyŠÂ²umØ.oÞ%XP¬¶ýÎùŠ~X¿\útOæ­YQÐc?3ÖíåÛÞßL¹èW0SV9°=»ÝÆ€XTir´÷^ô|¨­¼ÊǶÊ;ƒýb«Z]{ÄóVÆw’ÞÇ*ÖμvIÖf¿&2 ŠØzø$¨±#ïÅ8ÇXánuðAä Îí^ÿ2ñÖ–µœäþ$µ$j¬fëwöNn·mî¡ZpÍ8ó¹RÞÈ}%) Ÿ²ÅÑ(w¸cüTŒ \Ýß{]¡ðºóka%ÿUù1Ï­4Œ rèh&íܵU;zKV5Wb GˆOò[m—EÑN‰à˼$„…Óƒ|(fGáÛ>Êg½ÃŒâ^¥ŠM0¥WÝ'Äõ”dªƒ=Y:ÞʖòÌtoøšæ¼Gr˜ú·q¢ÌÍgBÓË¿Ftæ¸Þ=ÿfÛ,.•¢x¦úœŸ^-QÂfŸ®ÇïáÌbêåêÉìèïÚAžyaZSöç"U ¤6Gµ á ‰­‹ç“±ãºÛlÏù‰¨Â¤¹ J;mËÚ°æ{çùæõx'D‹§ 1¨Œ‰U¹Ící#¸¹¢M¿p¦vé=¸GöÝûü4ʦÆÔ~ÆOy·`0Èyd°»4eˆ3Mz+0y?ÂÕ7»äR&íÄðúÑÆN7#ê„æ¼}²Ú@k°¾j-îõm=‰ŠŸ™ÎWOf§r£f ø€ï%0ö¯XYcê?ÒÛŸ7ª’Ô–W1òõºã„ï©ü›lu_~^gïêp¢z¥åéUtjjhâÞ”¤š%¦UnÝ(ª °bútL0¸Nˆ¨ÂüR½:Sk·GBá+´]òcE¤dõ1MJ o77“&¦Þ“÷\µ%Õ _ΛšoUz³5½?±Í µ|@:ݶžÚyÆ”-U#e$ûzª`ð‰Ö6ö³ˆþ)Zs ¿l½òaŒab¤NîýJÚï“ ÅJÏ|І£Â™C¿-‘koœ€v+ `'ŽmÔ´pŸ¢²Xj轫Œ*ÉüìÅmÄnÎæ'¿…öî­æÍ¼¼./8¿©Þa!uï¬Ìø<™>ƒhT„Éðƒ£/rÃÄemŠøï÷¾s+yöb{ÝUŸ%|Œº ÄP.(¡÷Fíý˜ kû«¢—jÞïM†ñbR(¡!¼H¸9”§fœoµ±9‡¬€t|°~À;âƒhróYi²¸†ºCBe†+ªxÞ`»~û…sõ‡û©Ž¬+[!ÒJ­§m“ÜŸËÊ„…¤âì| [ôR|ܪý7ð—´”Ü>bΆqGQ-—~}øÄf¯GXôcHâ›Aù¯ìN]ãLî'Û–¸ž]2øX,øâq;”‹¬BúFº«´^ýT£+““2^*_ÿFû²U©îºŒù[ò´:ñç„k"’ëâ#ŽªáΉñë¡EŽó¦¾‘6*âVG™yÂ1 Ì¢@ü‘Ì’Pif„òy¿ñëjz•ª->ÐÇŸÁL‡w—&\ôÆäÙ†Øû2zÔ‘P'‰i²ò2ž­Ñ]ÒÝ+×^—`—äœÙ(+¿(ô ÿx'õdùä"mB¬¹N-¼Þhyzj Ü$ÿ„’èìEÖŸ)F½¡9£î¶‹MŠž‹]Ì?Å ¾tÃà1úžëò#£Ý¢H§sŸSrYbšá¯KÁ„Ÿ„ol8'¾·Ð„ÌÉ•*M~?¨û¤3B"E+ÑÄ^Ùð9p°W;îô4oѨ¾ûn£¢/Íñ¬Áøpka±>uƒï‹ŠYKJ*÷¸J£Ã“I½{zá9¤„j}Ë)í®à5ßêµoÁk<"dɹûÚßñKÕ«Ÿâ{ß~scÂ…ŸZ*È=é^÷CfuÈÅ Oר`ú)þƒ )kf5Üð[Wz¦ó%ЇaG ãrö*À©]F†DW;åÒ%—ß~ÜŠ™w–ŸZi"^Í”âúvGi¥óáxkИ8yá×KŸœh·áºŒÏŠ]U>4éd/ºøÜÖ’Ûª}U|hYvÎÛW<ûLê E4ê‚^Œéòñ3—Ê,”Á1’[\ž±4Áç+ ’» <þ’þé8w5þì»!n~ÚÜ2Ýa/â-Yñ"U8¤̺¦Ðê{ÛdÌàöšw9íÛs |FNÝ:©šìi²•S‹‹hÏdAr,Ÿ`1šôõÞ7Çö–w‹óÜôz?©ôY`ÕI+ŽsàŸ”ÎËÞWMè nxL«Xï×ìaL*nzyp/ÕDær6’>Êý6šJ§Svj2ºY¿ð´dT¡_‘ĉëͽ®ÑñìH÷7a‘m‘V2mø9UÍÔ±n§ÜV×-ùÒ{‚óÒ<û¡´Ìæã„Œwql¢Þ ê–áùwOéÍ»ô¼éŠö¨]e—P`3~ñ–§)ÜÈbÖÌ{G‰@/<(7d#táyô:DYÄÉ8ãļ{b–‘çEÃÌ[fzzþ!l]â=QàJ.•:×Õûz%< !ÊÆŸMq)8·â¯Š{¦ýù‹=åZ¶"óX”¢+óò|¬Å’êñ¶¬Ÿ$a§!—»%ñÔ~QH:x½M×ðH±‰ÕNŸ@|§ÚÒèÐ Y3*<Î[.hª°Ã¹‘׎îi}¤ó8hŸ´Ç\gú^F!¯Ù«ïLë2쎎‹ZìÂ2µJKMÅ¡—õÂ$^J”Iµ‰)l“,½æ>Ê/4ûùÙ‡mƒÞĘ…G›ðJ¼)V²µ¾Ê;¤þ~Ûm1µLOJaòÇ”‹¥ßBïùßpBÂßw$€/5ú±îè´aŠ}Úç$ e•Ej[¥Õ9+Ï?Ù fÀ¥™Õ!c/ëKN|)Jš.ïÉϧ½|ÞÞèvu±úR›¸[ :„éÿÎÈ8ˆí¨:ŠJnq(í4G'IG®Ã¸Sãc¿È9¹ÕØÔV vƒÉ¾æÍ-sIËðÌ,[вòïˆÓyxC6îÏ+ÔÛ„Í?b­8¹OŠÑ“ÊVèAû”åÉg¢¼@¹ÒQ¥1‘póN€ Xòsñ±ÆÅ#Ý9}"ý°–§é>‹Ü¥*4¼Ý—ò]U\+Q+abÑ$ÌŽ$Aá&ÁYKÖü›§žH#¦D£I¿•›×"4º ×ùVM ‰²;#á“Ê»|„å7˜ËŽ4ËŒ1 "ÌTƒ¡T²ŸÖ`‚Û‡^êŒÒu“#ÂÊÜ!Í×er/ª÷_L2k!ªò8òû)Ë»xebtƆÓ즪ĜxÔŒgì—/7)è±EHŠ}‘fwèØ¿±CŽN )FŸ°ôÖpmÖÖSã]Ïã\rO|S^íjq7Ы@O€‘öó†k^vžþYšù!·* QiTWº¥7ÁWü }T2 ƒ#>`&”ÍŸÍáî"¡ú(Ùœ½J^–ÙÎu_Çõgd͹ÊšÑK4‚Éßà ŒÊ}fGŸ‰Â[oÌ`ä#Ûõg+iïs/ Íe™z¡ þ€ð F<#l!¸ Û¯ç>MyÕVýQÄ&{Ì–Ï2ò1;Kï¶çkßYµ‰&?Åc>÷Xû ëQ#Ãð±ðëÖÖՋ㟛’ãÛ÷¹/|_(ÞÿÙ‹óD¾ÄÕð:ˆÜ„=­ÇCZþµ½õ()›•b>žÎê¥Ó™E<ê#¤$öli{÷#F’ÄåȽgwù"LÄ⦙GwnÏÕT)ÆGˆ· ~ßC<|{äôîQµXº™+ É¿¨˜J÷è³4¶Î{MêîÆìÒÐ7 …ÑØ•rdÊty€ŠhုBõæ2©iòÃW õŒú¼«YÛ™«Ü€_"è­`·ß;WåéKmŠÍD£úÕã·ïqÌC¾iø½µ»¯ “ÚD`‹}º)¤z—D¡ÅÒÖ#Æs 'äE‰ÛRZ²¹ˆì¨¨¶¢Q «Mó*Rçµy5(båJ7˜JÔb¡k³6RÑÛòáK®jqÒs,Œüë…CùÔ!®÷øv5pï¬dvy¡“•Âò“¦é—auÅîì2½ú¿§`b —Nž®s^ƒ(Ô¹£ùS™[E¾¤-¦SÈd|M]·­S¾Jz¡ÂÉUmqªL¹ ¡…™š“,ÜŽÂÕöývŸ±9%›«&û:þNÁ¸l¢“aW‘5Ô^’ï&E›ãr^eï¿ Ïð_"‰]ÐZYA¬SlfPïëVOE¡Àú<´‘íÖ£jõ³ÅBªZ¼X;ÛbÃÝ4mEÞf{ˆÆ#=ëy™¨e.uC¥G ……Ô1~ztˆÝÉìµl›-š–sœ!q%{ðç zž&+™îæ°ñ0‹¹ßNÝGEŠ ÆI¿„å—XÃ]3PÑ-oùèßñÝìÑ‘Äfzå‹rÀ‘DM^ƒ´núm}ï-(?ŠŒFêyÀ7’žÄt#1$zƒÜ=² ñ5ÕVõ!a,A×d1ÏC·+¾@a *Lw[êóêÒíÇq#ÍÖìéuQ;/ ¸ŠÝöç^Žzó / v=³ùHöiÓ8í°þSy îœÂ êÈèo¸mŽ`äxgÊ’§ä†òÛ.é)!ƒÜDÞ mSoÙUr”™Ÿ}&¯…Hi ¿TÍÇ›lÐȼR©ÆH¸°ÙÐ~éÙ:ñàì-›2áJˆ´ÿÄj×{ä”·»Š²¢ŠvÈy—ïî¥õcLø©cÌ…­¤jT·6-Ÿ:?jwkw1&àߟSxê8Íb7”9<ðøëy;ç8S’~cgóV>˜%3à•­šù3C÷¯Õæx¹‰8ýÉb&¸é[x ·7ÜâÖ¬;Œå1€òŸn‘äÜõ¬0?r¾PÂä“(U¨víO‹qç&W([Í`U‰Z¸w+cüä`oáùÙ[qñ"`h°ƒŒ‹Ø(J¶ ó/Ôqi9åÖ‚%ug£”6b_„¦„\ðkF+‡DÄØ?y¸áS/¸7Âà˜7À¸ÝvÌPúªùÎ=ˆ¨‹‚àä4íˆÉ±+¯´³Ýú^Íjðâk©)Ö¹éïïe1Ã'˜ˆŒ¿—NmŨtŠš?%ö‹ç·ü\Z|òQÚ‹mqÁ€úDÁóÐ-)ÝHP"†ýÙËïºÀÜ%u‡\¹éDüUõ¥`  ½cáú5õçaFÑÐ-…—È;Ü þGçúÞýoŒ´¤„èŠ6m~¸ œlÀšÆ~ɵrsÒb¬A±.:FGEþpÑ+n‡“¡×÷iËŽKîÿ‘ÃÌÒÞƨˆ/œ*2†`/d*v€;|Gì:9+؆"Ã*ÉÿÛa)uS™¥ÎÖyýÜ/K°é8_²u$R¡hUi.!|CZǪܸ¤¶š5­N—ꢢ]*—?ŠÍcô•çÖ'è]¾â Ò°£¬ãßä†û¿.3·# ’¯œÈšÛw“Od%øÓ߃qŒ/NÊŒûæ6cñ7]khääU¢ÿ¬n 5Qö²ÿ)ÕÖú¯Î Am*JS·ÚД-ç¶¶}޼gʺ'޾ƒ(?5†$eàò–3L]Z1Ýw%ÈÀ™¶:¸ÑÚßV%p%õÜNßdBòƒ! úót"ec=­æÙ7¬K*‚Ø ü놟^Í}åc:£ðÎ6|}8Ï5=õJE|C¦kI1¥ðЭ·>¥er¯qó˜¼=b¦1-æ`sï®´"‡ú×Ñ=™lxBeºê#ïå¡§­ŸS]šX¡ XúV怀“sŽ2ø±Ïwé1¡óéãB }F;o@$K8QUóá;³!òdRï¾»bpžr¹‘Zb5Ò û¸&œO”Ó§qê À̱g,¹•+øìÞ–”ÖV ®\'){n—(±LœÐ]JÞFËK ¾ºér*Ñþ¶øØ¯.ŠW䢳q§!½5>úg4…€ÈGÓ>)Üjºj@›ô$Œ+¾ ³wu¾Û÷(B}sá°&å660¿ÍAEóú¸£,EÆë#lgo8ç&ÝŒåso‰àiËy¸[PJ,’Ñû®+1´TÔª½øº_ËárP#Æî øÓ》®!@Ïgñ1cUü˜1”Þ÷ úsíÞÒbn; ñ´ì|_bñOl‹ .vô#·íe,ë?L]„Qr…ç<‰~¶±hs²¾Ìl‚enì> stream xÚvTìû6%1:¤…ÑÍ6Rîn$¤Æ0bƒ1r4J‰R"H*©"H7"%!Ò!¡¤ HÊêû{ßÿûû¾s¾ïìœíy®;žûzîë~Îø¸LÌÅT]PÎp-#ËÕ Íd`°¤8,àã³@`¼àPßM8ÚBÊÿ/»:Åà0 (çfˆBõü½€I DF"+%À`¹ÿ8¢Ðò@ hÂh(ÔC!á~>u”O0áæŽÁòŸ%P&„ÈÉÉŠþªzÃÑ 4„bÜáÞ¸aP/ 9 †€c‚ÿ•BPÁƒñ‘Å¡Þ~â(´›’(0qšÁýàè¸ ð] Ôþ›˜8€háŽðû›£\1P4ˆ¼08Òàt£¸³æº@c8ò³ÁQà_W„ˆCþN÷Wô¯Däï`( †òö"ƒH7 + 4Ö2ÇaDP¤Ë/G¨—  €"¼ Î8‡ß…CZª¦@(Žß_ìü`h„ÆOÜáõ‹!èWÜ%k"]ÔQÞÞp$Æð«> ÃÝz0èw[=‘¨@$öÏÚtqýEÁÅßd‰DøúÃu5þòÀA€078( ƒeåÀ@¸/sýJnìÿm„ü‚qõ‡a}P>@WxÂŽû`ý p íÃþoÿwè‚€a€Îp7ðOv wý³ÇuÞã„‚}þ^Ùã´å‚Bzÿãþ»¹ c+[U‘ß„ÿ6©©¡‚€X1 Y ˜„4HHeq‹°g1"þªüO¬.Ò”ûS,î–þSpÀ_Ýük0„€ÿÎe„Â)üGàv`i0 ÷ùÿ–ùïÿ›ºeùü¿ëÑò÷òúmüeþ?¬Po„Wð_vœ^ý18í¢p€üoW+øŸq5„» ü½ÿÛª‹âf@éæõ÷%"ü´ApæþG*pË_æ…@ÂMP~ˆ_ P ÿ— 7U0OÜ£á‡Óão74ÿ>R C¹üš. i †p-Æí¤Xn ]àA¿ ‰#Q\G/ èŠB~õúC ÿA$ WNÄ8åþ‚¸êþ¤ ?xîø‘Â!8õþ½‡Aw4üOÌ¿ÀüÑhÜüþVŽÞö¿ 8<|œBÁnÜöxy»å¸Z•-PlmXqœoÍê¡ö#ºÕÿ”Š$CèEnô"úH5c ‹fnUSðPe†ó»ÕøŠ$®)Í´ù,ôÜ1Õll­0=ÊøfäÉ–jmï52v1 •õÐ ßЛQž„øíz|¾þשLŠè{´ƒj{+fßÅN­™®¿Ñ'?¯x/vÏ2É.ªt‚¯Ðùñ$371Fì©0Ý~õÄáÑ8]þÈ%§^ª lûžäS¬í’Äý“Éùg~,¼,¶Ì×éÞñcÕ63õ˜>`Ëž.OØù—$HÎuàÙk‡O­É*#R¯×(÷r­»-ÿØn'oDŠjÇWÍd>Y¿­Œ¨ò!^ß8æ÷GÐìb§®UÐÕ¿än?"«~ü*ûêŠLB¤«¢â¡@:ç>úîL§Ò §öKfW,ˆ’Ó”R‹ÊðUx¯+È›ƒM¸qW0› QÞ™Д¦W¢è->'sIÕs¨¬»ÃÆB$º?bíPÙ`bb}/ÌFö­N$ÞÓ½|œÀÃ8p³uÎw›€lß“_4mÝQ92ûÝÏxwRù¨dxÒ*>M(/-sò.'}ëð5²{žÝ™ë‰N;÷lŸ¿Nï$›ÓQ’g )gÔGÀBI>¥¯Yõº¡ÚRwS/&YßV½tîD\w‡û·U›R#No4I i¦žÐ4¼=ziBqsw­Œq:¥Ãá™Úàä±7¹ÿÉ©#§®S³ÒREºû¥ÎjŸÜCÍÈõnçlGCŒÉ€EÒ4qSÉ{¨#ïÞgšç”þ. ±Ó’÷MI²ÔXlÍ]ƒý¥(6óÊ‚º–Jš–ÇŒN~æ'A¦ÙÞ¯Z/{fÈ2ëæ4*ñ±o†G¦f×,²/…Êïòêò _ú.=0Ñå©3¤KÙ¼ä9LÕÔ»­²Ð21›Ko»¨'ã¹÷|eFÑ]u¦zqø±þò¾·ï“àâþŽ÷^‹k É:v³û`f§…„×Þ ü£O¦ô÷ ¼e¦ ÑŸ6¼æ]Ã9ô´æiîþù4™ˆÃ熩ÕÚJsð§vgEûöŽõkÝ U‚ïV¯òŸôŸN*ͨwU´oIŤìqŽ;|N£8a˜îy:.Hx0&%*V ïúÚ2Þ\Lª 2KXÝÎR¾¯Që ÷íÌì¢}|¯’´V¬° Œ4HsgÈ{8÷ðcJ‘°$ªe¹êa´Í„+b$~zQÙ«4/ XõºOWàjÿ.NÛÏ]]  !ÃJž*jžÏxTmHNؽ•à½8ÔŒjRþ‰Àøds—'óUA,‘\ëÀ+"Õ+BL‚©ÈeãÃæê¼ýÙ´vs§û$N ÓŸU…{Ët+ÜtÐ÷"ä¹™ü£ê ·æÓëÔÚ4Dž뽟z^÷´©Å{´Rm´$v›?tJ±s f½|t&òÔ>Úk-`¢î‘>£M¢ ÈÙð²8ŸUÔÍx¸GEÿa‹]gÝíƒë9u·ˆbmðÞefmð]®}šäçŸäÙ–a£¨³B•$²ï·¨´ç탊û¥å^>ªCø”BHÎ ŽÃ¹ß¶gè]zÉhíóÆàØ"‹ ÇøY×avVÇáýÔþk1Ö=ôjBÍpƱҧJjN)~Rí^eôS»P™œ2ªì~!x`W sê\÷C5ô„Z lc6¯@òNg 'k‰ëÕ3y0ÖŸÅÀÑ]4ªÊA2ë†õ•´rPÃ+x§ÑKlxBSAØž?»¾l§‰—ÈR‹\n¼Z$Í>ô¹ØÂìÏ“±.¢v¨•NøØÒŸPǬ¯Í::+·4²+Å3w1cº´™5Ç[wñÉì£î¹öžnÜüR5™V¹à!{êèø~È-†åÙßaZ/e‹:½ 8’ß`w6Κ½õUˆvWçy É„ª5ÁŒæVszÏeéK·|Ï:ßR<–îZµÊõ©·ÂÏÆ›hÝ©¦t“(x¯´©ÌÈ{‹‹Ç‚|³ø*|¼€j‘ 6J;×Ïkþz0ެV*ýüµýGîé÷‚ì½ Ò¥)v6„¹Ñ»Ç™¯Û“nØ]ß“öß]»%Ï)¢­)ðRK„Ûˆ0:αgûЛ%K£b>º}4’ï=+¢X]q³‡^‡ØªÀdtIò[èAw6˜»ùi›¥‹ìFý‡6–þ[7­óö2ÄK0­/´Þ¶…¡'ëƒm Š_1»ÎÔµŽNò]í9á<¼£m¸d>¡xßdpOcÄ ïÓ­…OŸÍ½Õ# –xGØ‚écùÝE<´Ï«e‹ò“§Àáʼ‚šÍA;iy9kË1 G"Y΢ý•o]îžmCYêjsä£ÎAäøx:áãͽ`î¼Ò­—<"}+}ývÙSØ´¡ôˆàŒŠ ûÑVjããÖÙ@MøÒ›gßÏB/BÏuím]žmä‚ëêPmë.7õxUªB÷îr´Æ2%‘ )cmË Üg¼ ¡¥ÐϧáúV4I®ÚÜ’<&ô Êתr¼f­šY¨vtWÚJ-Ø€&,ÉJib\"Ä8Ãw¨´4·:¦8‰;xç'Zw |`Ž“·TÉodaç°˜ø ¸ÚF¥ì¤©¿Lú´|“æ5V·õþ4ý»à+Ñ/Q£ê¯æ·c8U%;ÔN”w‹[:¹Íâi«nŽ¢áõg?|Å5CHÔ»‘, ™eëDçwR1óa˜𼎟„Ì3—¯ F á[üi.¶Ca±VßshÅ·¤JïLjï6;ð ?½VË8¨ñ1tÏV¹vç¶ìíûV}üç” &«Aû“„%ò½6ú㌂yâ/”®}eÐ`ÍW6q¼ÜÃŒ¢ ‡¾ë'f¤$ À*__Ã;\ ›c_Œ+¸ëÍÌ`N¬ÄÐ)ö8iš'4õ>ňá•[fµ™¢»N€:Tý0òØ}¿E|¢÷æÔ¼–È` $ý|~Ö'!3kjžk %'ErOýB¤¾Z'p¿äq^¡$4ÀæÁðbµ"žãá-{ ä¼I*0MœHÅ4±ŸH°}°˜A†ïŠïTÆo·²e„V8örÐï3/¦4üô|®ué @®^Î;g·Á“<áwà ÿ,i®6ýŒk(ëÛßÂõ2‘áÕùXÊÌ ÄÆŸ5d5ΛOª¾ó¬½8œí@ižš€ÇÁ>åÈŠww5í¢z>V‰L_“Í|ëHÞlúƒ4$Ƭ'r„¡R{«ZP€ä%”p¾z³;§ÍŠó`¯ŽÁlßÿ‘Ãv£ý+Y žØçíqûÏA² k¯Í5›¥«‹3Œó¦G÷,ßÊ+£žûRÔÒXÙQÿ|{õëg¾o"A “É"Þ[ŒÂáUwüÕº®¾¡e3Ñ€²w©5ñ¢{×›l¥Y•ºsN²H²÷{§rŽ‹y®6»›Ó™©Ön+Iô,ÇO*{Qsû.Ri|1Ž;ô÷<$”r ãœíËã)§À{êdÔ 6ª$‰¦ivT_{öQMaE±ÒmKߘ :…¶rípÅM¤ :é >ÿÀ"'×gV ›º-þŠt?!Ÿ÷#?‚ö.uŒ™4Ì>¸ß68#HHŠ›¥])/Wh‰~9R™}ò¨¯ÛKl…/ˆŠ¾ÎjÉãA‡EVAf¼,´`H°6ÆÒÿ3ÁYqu¶ìçÜ1•ºù~‘óÔàx{ÿ¥]ÿ6þ¤—YB²XlÁ¯g¶§îÏOvÒ¸ÇS oN < ãÐ;»ýye\ õ˜9'ÄxØÆ"SÝ~1Ñ:}óå ¨ÏâPWgJ íWç@b“ˆoà/?)§#¹íT·s Rk¥>?øÃ3AÂFg‰&=E›wKïcÏáDZ–q’¾H%»ˆÖìwqr>ý¹¢ËV3ÔT3Ÿ¬l¯PdøÃØMiŠÎ&Íî3”¤lX<äÕ=Î+í¡7cŽr2w“nhrhO•~¸h»&ÿ²·¼Øåê6£uÜ2T·åÐ~¨¬8È´Á !;oòC”ñ:ûdF¾÷y­`é|æH-×ÑÚÚ?©è›Ã·aJ~Ñ?*Z:XXÜÃø6ºË¢Dàzó€OÆ“ _F)/J®G‘Xõ‚HŽtB`JÝÙD"Wò3ÉÏëÙ[ ¡_ð»·‘»$4ÍAëÃPä²ÛéàuoÃo<Ê2G3Î_EQ’‘ùÛζ¨¿t,ú ²ˆE2ŠYIbo_f.—×+övN‰&ùõv™-‹e^‹†tŒV/Ì»* I”º”q¦,´wj'}ÌÚÞ¿µ³ßæô°$9Ðqœt#›¹ÍÆν…˜øñ¶°5Ĭãé¶üðë¬"hpYƒåŒÅãå÷sv¼²Y ºë>k7ϸÇËäÍoënErƒ¤¶žç•ª¶Œšr=goˆîîÀÅÀ_Bx~ ’àX¾=’EõQµ¿S§¤s×"‚ú¦G«Öé[tSF•pƇžŠãžÜkŒ(´6[L2ý sòYÑŒGà*àœCœöìãô:ù;Ìr‘÷Ð̶×à†¿e ÃØ-êT“ö#g—ͮцM¯O°¡Zº1Œ,±ÒªcxìÉ!Ì"Õ"ËPÍ«ýi~Â¥£=euÕ}纫dAÖø;™•§‘ãr¦…W¼ &ZN÷íãIÂò®®ØþH})ô,ùºOtÉ­8ªÀÏ C‚•ÜÍ·ø+ý‹ä„ £ùïŠ ‘%*>,«ãF««!ýÜ&ÙŽnïç¹ _–Wh†Ì(8¿®„’ù·Â&B÷÷ç2däñÄ,HK*-es7V±Q檦ìÓ·“'“TU×\'†ÓRl¶:ÁÖ:å|RÕ"†³:„˜ÀfàhRçÝIRÁ°¯Èï=3-Ðpµâ ‡ Xª$+R†}è<ò=Ü]ö¨ ›¬KùäQ²jÇHCGèÞHf9æAöT°§<9]× Útêü^¡»Ðf„ÑðpÙ,ãj…¾9¸Sâ¸J)ìd\J*/ÝBž`¸÷h5,5ôxÍÖ¨Ù²ïÇý-.žEJÓ÷­ÔêÕ™yºí€ÆðuÛr`hQâ ¯>„Ù$—Û¿3)÷d™äj’Rç|…IŸ äJë=FÌ, NV>w•ó)ó¾ž"&Bc9ÜÏìFð…æ¡ø†¶KÑ&ÕÝHNVU½«|Rd ³£áe^ãSôŽƒ;éVuÍ.†ÆÝ휟ð×Ìg½áål]ÜÝ­‹ä#ŠEÞøri‰°ï®Ρwâ”)Ö2ê6×L‰U:bìs_±˜H¸?}°Úвþ0Ûžf8'üöQ¤#íR?wQ®Á ª“>©J˜¡Ò©Iì„"R¤†°ó[VÎs•Gïè»Yoß­0vI?vߌ~ÓîЋqõbÙ^kÛRÍþæzકÖP§á-—i\ñrKi»È¨–Ú Ó?d_å5\b«,ùé½âÂKR›VÆKN"‚¯OyÉB¡sçUñ”‚l»’ñvŸ³í¬óVUûÛs"¤rœÞÙ¿ØÉ M ˆ]™‘€´ %“ç]ÜÉwi•!—ÕjòT_-áA¦õ¤]rÖ™á¹ÚÝ5 §¬1¾ÑU™‘œËxÑl‹‹yF}#›¡*v­|„oHbáêŽÛJÝô¼Ö‡×ajß\±Oó‘ù¦/mÞ ÉÌj“‘ù%af­)µÊõÏÙLŽ£¹ImtmˆQ“jzz¬lÍy#=¹°}.õ8I$…?[u¾›|¨YuGî{ˆÁäÝm»;¼x4ÕêmZÎ{ß½ MñCî‰s6 ®îëξÀ«¾Þà@Q)öqx‰€o&ï©qÔ¸šÅÍDL:å³6L">zaæ€Å—Þ>mz,’±e6w. E~óù]DuÂæ¦6Mj&Ž·¢u¬ˆÔèzLÝ\×Nûmìál´e÷·o½›%Lû¬R ä J9!,Aoé¦ûÖüG}zÚT²yüG¤ViD¯x ‡Uø<ïºc”Šmv=(ÐŒŒWq5*Xr£*¿æäÂÝ[CÇ\ö M¾²F;Íê‡n’’fI2ë¶d ar zD°téôN‹‡jq­=;Œ—¬`¹PfùÔ!Ì9ŠªÑï›-ôtªŽ<­yíNX-¼î½âµˆ½Ÿ¾<$)#GïU9¡Ìµÿ1ÆþÅ$~ï«ïü‰ñïCºâæ†ÙvÆ©ðš=&orTz-ë§MžoïgÍ Ò#NË}Äo}Úµ¬áñç¡VÙÊÚOM.JóžÎ%ð îvByeŽaÌÅ~bÇ¶ÎÆn7·²^4€ã‹F3ñÑ ¢®Ž#u|fˆ'ܹËP‹á±ËÕÄÚ˜‘ÉùDì1IÇÝ”K»¼uD–3AJ³õÄé™â ±#²· ú EvZ-‘èªÚ ‹¥$£K‚nÙj¬7v©°à‚þ¦¾BAòÂItÚÄÛÀ"+=?¥ô:Ý—^´’´b—âP_‰DK2¢+±¤Ò£_´‚…GɦÞyÛžù½vŽÑ¬¬<2ƒ–_!Ptd5ÍíÛP×…F÷Û Ä¶&>’…\Y¨»! =d·5¦ºº´¾ÏaY¢†]Zêý¿ÍÖo Wž 31×ÔßÀ˜[ÖÞô‹&¦0Êùsul‚^þ´8%L5¸1¡àJ?JFäŸ<¶jÓ6s«&µ^é?M³‚†Ý˜wÙ}õw}mfé{ϲ+åyÏL#â• ËÂsÞªN¥m¥”ãià’<~âüŸ’Tj>?—õ2nÐ2HG••]¬Âý’©ó>5'p/v">çhö2Sœ~ˆ­ç¿y4Éߺ›ïJ´y¨ËÛÿeÓ•ì¹é2¸²(e·³(IRgõøØ|ô-Ëb¸¸ÏÙ¶[•Ï$²ÙÆ!+ð6,›Wßi)H*; Œ‘êÜë|‚¼{Åu2(p¸Qs@ú6V0þÀÞ±ôeTE|U†âUñ^mk'…MÕ|q¥:Ó† cßÕ¦ó>Uó§ÜI[úIâ£ÛfWÞsä©'>þœûh±¬ÄÓBçYCYÜf i”Ô)xXélBXÂ?yXÝe¡@±tãM7æ†Û3A¡FõŸ•'t€­Á(Æ¡¸é´éËi5Á'»Q-2§ó&x‡@A©dJv)í£©ewÈT’zFÞf^EîF¹~›]üp}¿q¦ËË…Æ—F#(^—Ge[à6¸dg{“”a&Jk4Èt2WZNlÊ>ÂãFë7{Ÿ ÷ÓÑ·,óc¡«3Œ‘_9F—‚­[]h„¡¬M5ó©ÙÕ½·›´‡zy MA°M.¬Øv³«–=@°Uæß w“»À½VJ¤Šq|.ÒuÑ_™)r& òdZ:´‰êyÌ#yCÂטnsO^9Æ=¸Ù`qþ‰ù€WÄòÛ¼ª*o§ëü‚,™âÙ#·xißÎÒr]O¬%ý3™¼cÂcA:îØ­+è”"©ºëIŠ’Þ_)m-5r™Š*+û^?& y´É$Ú±3©ñšôš/-­›µ=›ú^˶´yÁbDE '}Líð¤4¦¦oÅÍ‘IÒæ(réÍYòà_Üóüáà“Ÿ_S?~ŒÿHïΕ@@è—Ï¥áª&¡·O«ç´Þíãß@>pÈâGëÕ¨³~b·{…ß>†Ûæ¿xmMXg ŠÓ{öâëCöZžË+•‚?Êa Lú¯¼àÉóMQÎ %×%Å}`œ;C½hsbÕ(k)‘I¿c´MäA¯[èà¬4a¢0kšlI¿ˆ±¼¢fÎU¹4A9>®A0>lk:v³}è~踉 ëw§D8ˆÑd<Íá9Çm>ºGŸ„ç,+Ž*OQ†ßÓº»#ÇüI1ïñù¾ÀŠ#tÀâqæ¢@Éh)Æ’~UߎâÞýö‡QÅÓšg§zÚUÚ$'þIïQúk1_ªì×eÈ2”×ߊÙåsðù+ÐeøU°û‘|¹ˆ#õ‘”dÅç´[à¬(¬ zM'ß6.%Þ_p2k½7H-Èå6%bþÉ>0h_Ÿk+íͦ‘"ûÚxºlçW°Áã—´ÿbcq? endstream endobj 310 0 obj << /Length1 2016 /Length2 13747 /Length3 0 /Length 14974 /Filter /FlateDecode >> stream xÚõp$Z» ǶfâN2±m۶ѱmL&¶mۙض3ñÄÆL웽÷w¾ÙçüÕ½ÕUÝëyµžW«I‰”iM쌀bv¶Î´Œt \aY%3)©Š…³5ð)©ÐÑÉÂΖë_zaG ¡ó‡LÄÐùÃLÖÎ åb `d0²q1²s10˜8ÿÇÐΑ bèja¥HÙÙàH…íì=-ÌÌ?nùŸ#€Â˜ÀÈÉÉNó·;@Ðèhalh 5t6Ú|Ühlh P¶3¶:{ü¯<æÎÎö\ôônnnt†6NtvŽf|”47 gs€Ð èè 4ü•.@ÎÐøwbtp¤s §ÄÊv¦În†Ž@À‡ÀÚÂhëôáàbkt|Ü P–”ÈÛmÿ1–ùÇ€ðŸÒéÿî?Þ²°ýÛÙÐØØÎÆÞÐÖÃÂÖ `ja È‹ÉÐ9»;Ó mMþ24´v²ûð7t5´°64ú0ø›¸!@LP`ø‘ß²s2v´°wv¢s²°þ+Cú¿Â|YÔÖDØÎÆhëì÷? G ñGÕ=èÿn«•­›­×?gS [Ó¿R0q±§WµµppJŠüÇâC÷Gft°200°s2€ »±9ý_ÁU<ì+ÿð÷ñ²·³˜~¤ô±0~üÀy9ºÎŽ.@¯+þ7‚cd˜X;Œ€f¶p¢ˆ¦ÿàÎ;Z¸´>Àð×ç¿'ÝÙ2±³µöøcþwsé…””5Ä$¨ÿNø¿*!!;w€-3€–‰•ÀÈÀÎ`ÿ8øüï( †ÿaÁðÇWÒÖÔÀùÙ*ýa×ÿtŸâ?‹A øß±äì>& ø3à: ¬ Æ_ŒÿŸÇüo—ÿÓýW”ÿ—ÿ¿|Ä\¬­ÿÖRü¥þÿÑÚXX{üGÿ1¯.γ/k÷±¶ÿ×TøÏºÊM,\lþ¯VÒÙðcmͬÿ[D '1 w ‰‚…³±ù?£ò\õ¯³¶°*Ø9Yüõ hþîc«Œ­> §yü[üXšÿ}¥¨­±É_ÛÅÄÊ0tt4ô€ûhñbx1~¬¡ Ðýï ÐÓÙÚ9¸>Òó˜Ú9ÂýÕO6¶¡ùKôbÐ ÿ}Œ ½ØÄ —øƒ˜ô’ЇŸìÄ —û/âøðSúƒ>ü”ÿ ½ÊçGÃ?è#ŠÑÄ  7þ/býÐÛYí$,,IllþøÿUMz“AF=ðdú òQMC'ó?Ùÿeáàò1œ>È›þËéYüKûÃì_ðƒÃŸh,¬ÈÃÞhû/‹Ù¿ý?Šoù/ø‘¿Õ¿àG’ÿ¦òQ›?ñ#»EþxPèíþ?˜Úÿ¡òqýǦÙý«Œdÿ?˜9ý©ï‡Òéãñùo€fNÖÿ®#ãGLçÁ —Áî®ÿ‚ÜÝþUÆîîÿ‚Ü=þÜõáê tü'™ÿ5ëÆ.ŽŽ/ýßoÑGëþÿý·ºáV–쌹¿YÖëx¨Äu£ÝŸâ'ÝWO¥¤õZqìtyB‚N¢¬Éüºåx'˜4Ú‡²¾+Jq+°JøêuÚÚÒ– Øþìý¢§4»ß÷ckhºðT°aVEàÀûÕÁ[-À ¼´[Š4×Á…I!ýÁm@ܽa°|m"xi_ñ †Mþ¥|Ž6J5R' d4Ï(kñ31”3-> Ú•;òÂíÝ-{•m9N¤,buNnÛ$2ZQxîË)=8ÿÖ##æ¢ÀþLŽ!¹Õ&oSBÅ’uµ.µå.ù›½ÕȉF>Þâ]Þš½IàÚl¶!µÓ‰û ©O!Å?+¥±¥ÊÇͽ‘¦GÒU*œy@$ûl¬Bê7Ü3ïú¹oy3aæa–ÄŽ£5·,×…{œ½Âèsâ»LîïáÉ(åIr'£MÜö‚e_¿\(o…npû$,9cyÌ–ê*ÁÉ’ÛÛ:¡Zµ¡Ý~bJó¸âi=aTdw°äÏJ»I4=N”Ô[Ü»6 }TŸøù$2;‰C&Hå¢Ú¹9È®WaġУ´ú“zŒ†M~"êYœ}©j¹j»‰µÀ1DÞ%:å~ØÜ£´æò!x¯aÞÓ€‹ƒDÄ—u}/%—»êZüD3WÜIïk0vOœq.‰+ÏÄ̱kˆ¤Õ•ÿj¼×iʾ·à_<ñ›iy'nµÀG€ôv8„XÖ/p K掉µÕ€Æa÷ sÅḚ̈‘oKÆxÑÜ‚W¾õFæ³±ÙƒÂN݉kgØx†ç&)Ê×òÔo@ï×Pùúy£‹Àì®Ï''j°Òˆ;ñz­-Á !í<”²U=A‘Á»<0`6[Q¥Ü‡ÉqxñÈU>ò&ŒºZÊS‡6 ¦“,µ m”ø©>²a Å£GfL3õÖŒfQ;b·SÇéH—›ùöˆ)j ß}~Gz5—ðh£bâ±ZHÉk–óM.²‚£i„£iuáù9»Ûdd¿dýéÛúúH+ ¯l5iú¼¹V5H¤wÖ†Œyªñ¬ì9ÌÙ#vhWAëN)ºÊ4µÒ ®Ÿø«}¶‡È'<‰iWw/{4c,ˆü{F·Ž£¾®94œÌ0رcY93 eÐð@ÿ%ÄY?w‡€,úDÁ¹ÜV¥x—ÆmŒˆò‰"¸-¢BõŠrGŸ²Æš¤¶Õé]dŒÙ°ö…sfoÿ5zª6ÜÕØè¬)SxKöø/öû»0÷sU£þN›¶èÎ[Ë"ãQ«Æ/.\-PJå+Aᢇªm(í‹yS(9] Q¾ œ·`$î#i!k$X8Ø´3•”vyí{wƒ_ÇN¸"8ز³ÀÍøðOkˆ°cãË矞{ "³A©èw@Ÿš®Ï0¢Ó ü¢þA]·fX¼¨×½«GøFw ÄA3µ*ò º2P:þ]p‚³•Ps²“ ·²ÑIAv„9î2m]as¾.£ºíú³³«‡ˆ œ3t£åóß Òq#†éí@‡²%¿àjç¯kÒH‡£u J®ò1¥¯ Pžæ¾´•Uê.jôõŒpdë.ö³I‚ָS O¼•w— ~‚³³)þfN‰­1Ú ž‡·8ÁÑ8Œ±zœìµëÝd\@µÏ]:ä_5Úß±V«|ó¾ŸB(˜¥EÍdz<4ÝálêR{1ºÉk€EãSy^3©·üÌBt¬ÖÑ–º¬¿u ×r]ТªÏCð3Àimœ«ŠB=º¾¯Y7¢û_ ­„Öj³:Ê„ø8À¨\¹ÚX /íWÉ q™eoŸ÷ö‡ÜÁ¨ÉŸbXL&¬–#T‘xÏzØÜÓ²LÒÒŒÿÊ„7 »sWBŠê¬èlвwjÑ Šbs ù&‹L~þš7³ºEÌ8Ú$©\‘1ù€¦öN¬wnɾϜ):檕–F‘¯¢w!}G›oÅùkô2}>žn›ÛÄ‹rqÛFÈü 5KåQŒ‹*,©Ó×:"Z¸¢QŒIj{2–;Ë4Ì=ìæ;y½ƺ"{×(‘ ½”XŒhÂÈô5Ä÷/©MçÔ¦Ö7{îñqØyì½5¼;ØŒÊl|¸WŽ˜O²¸!ž–Ÿ[ ºïˆ)“iAÂÅ›ãë„è'½°LØ~CmúNï¬."•zOäü»[°¯–@¬‡#èÞ§ÛH„Ú ôO0ó +Š¢.¦¤î}G6Ä0  BðFŽšØ. ºSøfÃ+ Ÿ íÙsò«¸êäV1M@;΃5“~\*ZQxcÎôéßû)ÐŒßs&¨=Ž’Û­º«2EUž•Xᛳ*òÇ\ç•S„'™‘Iå}¹ ,Á@õ_§ù9¼f©¬‹I6Æx&æ03A5rBµ6ª‘NcQnò[ÙT.=ÅËA ¶†\`ø§ ă­5~‹×+±ô€ÈM>èû`:ì‹óšŠf ò'Îôw s "‚u¯>»@"ªžê@Y}‘ qÕ :H™`¯ >·Ü¼W#!ËûyÞ ëmå^LMï /‘+|W–#¨ôö3>V‘Ã×=å4p*r¥'Þl$®®Qg1P}Ÿy5ÚÏØþ+(¯ébq¼¿v¢ñ¹©´rÚ£¾mö憣ˆÛEïáD£—Eh¿œ¦¯SOΑ?ZÓ?ˆ½ƒÜןŽ#éϹÎE˜[#6ö‡žÔ€Æ«¢Á"û å@ùçŽ#HŠ,ŸõõäÆAlÁ“ÖÎbÔ™¾³TV¦ÃpZ/´ÔMv^¢•ˈG= uym£Ä™Œá©Ñ˜L4 q?,-ýWàíþ¼ºa­.¥bê²¥©-t̸½yʾsU÷”Nìzä× Wh}=ï+¸²h “¶zµH›—È ûz;>gï.¹”ÿföýÌþ3 ãÍ4£e ׬-õ-¤x>Íòà4Mæ>ºŸµÓsÇÆW1Éw‰Ÿ1xAñ wé®™]I§eû¼¤ót† ÒÁ1aU²B¶DÊ.V®Ä¬uk"žpK%ë¸ä,8£÷[S ߽ɖJÛFzæ¿·)}6f¶"›ïX‘ÊÍE`±™B¼ÖþÑ£0bî=¥‹Ÿ‰Îº·5Ç)Õ<ÕJ0r»¸4ÇP…´¸›cö{»WÏÍv»Ûë¸CQð;¤-xIY«¸Y‚¤Dr¤.´(âc-Òuœß ZÖû÷}ÿ.Š˜q]•BMBh'žî†Ü–ŸÉýr­ü?ádsFÎÉkÇô›iÓUÈ l„u\í·ñÊY›kÒô—°%Qßé\åÆ?õŰTÏ: ¼¹¤çhn-`´ ¾oû_Û 8lWöÄT‹O\²OÓTÚԃ튖œ´°qò%Í¿”²Kã¦,~îÎÞTyíÎTçFñ«ÍËÐØ+Ü©$lZOåÀ›šesK¾unõ&ñç§­ Í/Í‹xÌÔ#ÈœÉòÁ‰nÐ ²/õzÃáøÄ!…"Aîó>Öb4OºcI_0½\€u„?ëí_è©ßC¨ ª±W»+ú1I.D¥&LéYA•˜J,36‡‘lÀÄÒ%É0M¼Û’¨?4#½àÑ6¹RŠ,eÀªêmúÁ žeìðoˆ•þmé€J‡YzH”ïXñ›ÌüË1Cé¾ÝÐKèè…¸N±µY1Ê~>j™ìÔñÏHO×®Ó0{!VÛëe¿ˆFº?çŒû¸xÙµ~û¢ g6gë'Ÿ-Yú–Gñûa i¦¶8,[ˆF0Gw³yŠy|Öb[,½aÏoÞ§æ’Ž[8 K¨Û~Üð33+g„Ÿj; ½™\(Ml:[›ÞÜ\ dôØiø´¹U:àÖ)l y~P^Y—=áÀ(Ö«hšËñs°="‰S'éòD ¯#ãluŸb0¯Y/2Ob¦á•´¥ŽÁTÊ3lbW>£‘<©¡ìê;¢ ‘i2&Øð[Öp`þ…&ÒR°VKÞÍ«^àü¬YI?¬*ç<ý®wÞͼÚt§Š>ÖÎýŒJ¬ ^Æ´gOô)ñeñm÷á#z°0âúæâ±û[;ÈÒª¸¨šO?îWH–5Ù-sm’ÅZ o|©,r9ÿ|+ÝiP^;îÒ ¹: §¿Ëtyr3uŽÊîXùû|½Ž­€ß~Ín| ²üœŠUBNT2ß§EŽ¢#0Ç(åŽ2‡’-²úQi\ƒ<}7èþDAxeÑó9Ü ¾óQn¢Åe'éâÊÅ-L,o)h›@--õ­ðK=Tä•6^¼iìÞÔùÒYò“€¶Ó’ˆß=‹•Tû•}µ²|ù´­¦”±ÍÎþ…§c^$nTbÓdæ>8d¨Ô‹ôÅJ¼7EW¾m—›0úR `„e” ÌR¿«S¼u“®F3ºêÅHûªUꀣ$éó;1ˆÿÔTV%ÚCÙ—_^âÅ1üÖ(9ý唑ÜdÞ®Á²HŸÛ zú³u”•aD d쮬Žè^Cfå²q£È @Qæ”Ó#9oã·É¿jƒGf§#°Rš“Œ33ü6,:³á‡mnÂA»@»:/ˆñ©nßJÁ=1(ä(²§úŸËÁÓ .Ò)P¡ÚËç,“ù„ÃS©„GÓK·$Ѳba0ŒœŸC,ÁŒSÔºîýùµ%-yL¶ç 4Ý.îPÒ×1‡©Ê÷ |Šçl©­ZaÏæ¥3g¨_œÚœ¨)žAE«’F©ƒeÎ}kI÷Éí*b&輆”â©æHEª°i¦ºTOöÐV†zCp‹-¡Ÿ&6bMq `µ­.½ ÕÇ_–Ûöq٠ɦ#>a›:¿¹‹a)p\zcÄSƒ{úÊt­Qó ù…Éb¡Þ»™Þ@ßó±>o¿…D²áoUø ®¦KJEÇxÑ Z×1ç¾´!©Rl!`%41aÀqa¦.'\6(¿ÕšGšXðfìÐå>@nÞÎET %¨m›õéŠØè8¹ö¢º‰Íi&‚–×e=Fä.îaÛZ‹L³¡r¸›_‹qšÓîf郔Ë^1JN¥.°8ðkÏȧ|¨XµEuñù™•Y}yaiÝ‘˜(ÒÄ;ªž ã¶ÒºNÅÎÌ¿ÃY6êÈ:wU“À£ìѤc¤:ª ~f¡Ð5¤Õ£Àæý]9wNâ0àÈ"b«³áƽÚ;Vån{ždjd-rEq ¯†_à"U¼+ü»¸…ÍæÊà7«ó,0æ ]'—¨¹»ö¾ãí¦V1ð[Þº24tÀ¨PR~¤}fƒò‡ÐÒŠAÇú…Ý‹~éü ^R´mæºÏR¯u~ÕM±òÑS”´[ˆë£ ·äæÜ oó·~0 x©ÏòÀlàÊ™áœLò4\à8­3‚ìÞk&TUj> ×ÚÔñ|'m[èK¥.d&ÄQw•vCUç/+ßžÎXQ]ð¨Pþ;^ØË(ñ¥Iá¦tf•Ì»(•бMÞº|þ†1Íh­9M‰i»;é5Á– +Kn’Çóq·LItʵ²SKtõ ôe9içÐÈöÒóòQ¿£Ã~ŽTmV@wlý×ZäÞ€=¤±{ì}è{‰³”êƒu(Teï¤[rCL"ví»%-2:!WiÎ@/ßÉrÑÄOÖ{wÅ[Bœlf}á¶ÊÈd>çb2¬ŽŒ>GYíüÜÓÃ5[ø òT¢,¤úó“Šaèt€jÆNÐÀ«1ŸÍ€[îÉ)åTkiQÊ1ÒOPƒ…ŠÄ Ð{›×ç¤j"×ea•Ñm˜Ás­çD¡Ü X%–te„ß“N(9ë×w^L`‰J¸cb’éµA"®ùHìvL¢u³äùz x=i)+Þ+šMðŠÍÔ­½mýadëaíŠÅˆJÌeèøZ“ã¾#Í}‹ÇhÝþu9µëò¼Ë¦Z,|ñ»¯ê²ýÓ'-;–õ"ÿ™¼yÙ€ÌöŸˆ;íWã7·SbõøÆ¿‘æš;Тõ&@ÞxAÝcã‘ʺ'@ÀeŸ=‡9xu ãЮjà1 Çô&ïÍ›L`²QΙ;02÷í|ªþ*fõÖî´·[“º\zh-# &\¬Ð9Ès€þ»§’•¿ß£®'M¶u?'sY#¼^4BFÔ»ÇóYK¥\^H£+u«Æ zÛ©‹0Ó¸du.Ò”oÎ ŽY`Z¼ï1…ý¾bGÉ].±’bÏq‰²£{ØD1Íá1£éh¨¶ø×.]w2ÂÉ$T?«œÔ6VÑ—Rr„Ïh1›”§4ݪ°«u•~¯é¯æiŒ~Záq©C5h¯®™Îò=8\yV3ùŸ±3Xüì°¯zÞ}ò*Žêr¬¹w"î76ÞÆG n<$Òã‰L¯¾Ëß”ˆ²,£òNQoìºeæ¦ÓëQkÈ]«MÉ÷¨HòkŽdb»X±9þ4+m3L Årvà}D9”å­yãr9dñ5g7´/s]J./XL«}5âøáÍ~Üïwt¢ž„6*ø{¸‰É‰OàÜñ‡U4ÙÛý…©\Ûª•nƒgŒˆéi9Ó \š=?6†!’v2¶„Ûέê‰ù·ÛÉŸh»âÕòªïÊ5jœeÙäédb‘$WªÓÛj‘7½Ž@9ÊMç’ô1òÉ ”›ìn/|£í¨ÛÛü¬ù¡Ÿ‰ß×½±·…Éå^õ¦¥®Ñí¿”Ýá eŠ@õ±sÂ*Àt<¾Âïc 0Ÿ„¶e‘(Ý×—7 dAocõ‹ "×»Êi‹[6Ïj«ghIxxbuÎ^h¡9¿—í"Å…q©;ùÔ¹ÁΣê„^/{KåŸy”#ûo!­qѸ›ŽÞ÷øjø1ÜÈà g‚¤¾6¸Ë›är*X’³–¦Þ¥3 "‚qXL0Q0k3Ö¨­Ñúµå“AÿÒxßÃm€\ÐðHRG|¸R%ÇyWÞºìP’±R0 7`ó´”…yxUÈ}H/æÆl¬êMjÖ‰ûrÎaŒH šŠ®@YôÚÖžkÿˆÒðåSCFzà>ª¹5²¼ ]Ài‘ÕÝí¬+¾,±5(V?‹ „0I›`ëà–w 8Bî7«éÍÅhíAg«]Åó[>Üå´ ;¸ÂޏÿWÂ< ÅÙs`å:i¬‡k¶A»øW’ïÅ{Ø/ªa nÊ÷Ñ}Sä1dM‹È™à ‹³"Áû9ð»³S ÉDÆùÝêƒaS¼õ;-meA9Dìwº:8pûßÙÑÐx”ªØþã%Ô,P˜Llm›g¹tH-Æ}jwZ”Ÿ/P-Êêr˜›ÞžeƒÞ…µé‰t)5ƒ niÁÔh.­ÕºL]fØhS¾õµæ®Ìš0uC,*5øÌÓÒ¼¼‘)Fp›™.ÝÒ¬"ªk ‘AE°1ÙSQqeö~Ô­&ºÌ‹RÄ`¶8b4sjƒÄEËá~O?R$ž†¸f–ÈTŸ{¦B$Ù(“—㉳jsè~©¢¥ìð8P *„íVࡸ~ZÖm7ÚÝœPÂªÏÆù¿„ð G² ƒÌÝ*îÃvK¿-¤$úFù´ÜMê}Î3Ý2¯}O„܆œÏý© › ûj1¶*QÿÂ…XѶw k{âE2 ™ú‹7÷£h—ŠMfX>äKûUÇõWdnV¼â«ó1¤P'µx3¸»ë´\ÖÝQs½áç@¦ i[p¬ìˆD÷ ŸšžRv{ö“A/È»B½to}ýA ïì{µð€¹ï ßb ]ZjÐå¸uõ#à–B«X"©³Î%yõ¢Ÿ&*#Ï4²²ZFæfÙgjÞO¾¢9×Ú–ÃAë¿àzÞ»to(&$„× »•Æüø1¶éŒëÿȉ c2D({exL±hL®Ût)sêð–ƒæ{qU²Ç|Λ·m­O9¾ÅW(˜M¾cÈÌNv'²!?·ÕSô¬§»[yyb¨ž9O}S¬‚çêb* mE’ã@V³x=àoc kN¬“´üÐRü2 h&6k[¶Là<ì¤Û,!O7P·lG ÎZº¥‚*žgº²K«ví÷\Õ´‚ØØ/1Hd:óF{z #Ür¢Fë¨l¬ážî¢ÆºkBö¸¢C¥8VÇ ÐÎáÉuÃ`ÂlaÛÏG{áò÷Ã’õžçT>ï¡Ý §J8êZ¢°½3IÐ\ A‹–Òçõõ$Ôp–—·—ãÓò|ñª^ÈÐK\,L˜­1N9Ï’£C¨*õ}A¬~õ ܆†·ou™¾~ã#ê÷iYëôVé»ù"«ŽñêͲ}É7ƒ†í@”Z#¿¡Â9è`¨yà‹ 5¨6®nºcÅSƒh¤¯COZ$¿BaTrsåìXMb –¿U‹ûûygO{ÔU|‚bB‘¼a˜ñ|›Ua+´e"bmÝiy/q‘ÁH¦cV.‰ºë0wÆP¡„9[È€ZæM:Õ~ž.KLDV—ô«DÉŸí‹ú­í/*jô’÷œÛÚ¦ïõ[†ëev]›ý‰ºöK ¿Þg[BÄÆ‡Y ΢˜Ë_À!—~”Dͪ·±P£$â"ºDSÂÖJ zóÖŸIÂäÞ_$‘Ÿ³û…U²á§œQ½âîõð"=¼‚k{7X-•Tš¶;}OUÀ0cãÍ6>´Cí¢ §Ú<.Åh~Ô¥lØ|œíE Ýà%ºZ,Ví­óÛL#›TA99œ ]:ÔZ­4$w=&¨5Ü à":Ê—²õ=Ÿ»V*!Í7­'_ ~TûŽÍzõëEq¿ŸW²+œÔd‚nwµ,—*¡+˜†»éUd™òû8ã-ƒQ¨3m¤?Zw’²Úöú«`çÖp’‡ÜRpØbp߇9áw8@D~ã1‡DG",á¥ÕÍñã®ôŸcð|éG1 ^¼Ö±mðí“÷ÄËbÖùÒnÛÒåwÄÍsëhÙz^æ‘„?{%¿7»5±Ëµ'ƒìeÝ ïln¶= ØAøÝu”Ì5ÔÓi2IEJ¡w›"·ê><`è%$ ¿úã"ÂÊrzÊñpÖèäÉÕ{ãx 7Ÿì"vAÁìD[¾Xæ³`+Lwˆ—Ã˪bÕEc VÏAÜ^n/{ÔÛt1¼¤RçƒëH€Ôt˜¿š(—&?á2 ‚èyÎ ]N§ù ùšáÍóÓ•SkHñ¾$’iÊL–ù7ËTÅ9Oȇà¤\º·¼Ð~î¹3÷—Yóøª)§CSnyç@ĵº”D+˜þ(Âü3U¼œV`|²3?Q~ŸK ›ÿê‡rà5P¹å¡c Ç0óŠÉXl£ÕRR?ê²÷Ňt ñ²÷vÖhÂ: ¿Òž_J‚7W›‹¡ƒO@l6½(m½B?Ñhê·=*©*ÇWíÚêJù¬ÏÌö“îü ›3”Ëù›ÚÚS´K3•{8[£­’«¶^IK 5.±~ «*kèz3‚¿©ßzööˆÒ;­r­AÇsÙg´…Ý£ý˜ˆùZš±U‘¢3.z»+ïç#’Õ$7Ÿé¢c1´O•Iú‹wë±ÏRµÇëtˆÔ]7Ȱ°êôÔYmëjET K»¹ÎïuQsjÈ ÔÆÀ ^¹‹[UŒ _F‹;ØHõ¥èi«ðI±ÿ^ÜU,}¡Ik‰*37Nn ¶·})9¬ªF$8ˆaÌ^¤XdÍö‹ô™„Ù;¶-ÝÕþ¬°y†Ë_`©æL‘x9×é+ã¦üÊϽõý‰Z(ö4ÑúÄßt¬@U»‚:% îD¦jo,éx¢„#Â}Âl›S¿å$=«áYÙ¹Ho‰@\çeì(>#!2«Ú¡V§¸•Χ=Ç> „¹:!É0ŒMA˜„õß»À|Ô)=L?Þ™ù¶Jð’0»TÅÖÒ]¥$>5lM°[°]#¶ãm’CÅ;zŒt¯–¾=©/A˜^~?ãâ-ûhŸ„òâ\Ç÷™iKÏ=Ü‚dÚŠëìf2rM<ÿá1¼äöŽô—š­À¯T…—88î Ð`!Jíó{¹ú¶DoXL̯Öd’ãÚD𫢬¼¥mé ¨Ä"j«Ý‘d ÔBiM¼RÙ*8õ¯#žóÕe 860|u#b(®b-8þÌû:JØ‚ßÖb{e‚ÐEzë„#¤N7ž‘{Á{?Ÿ~>ÃÚ(覾˜r’ íÕ©§ Ö½šH9“=ó¯üöû×»iŽ%ºÞ•ï*Í1‚O¦zõ¾ÍÁ-qEæ!ã/.ç¹[]3–\®l zâI½Èk¥»#Èášuœª±LÃ%saóƒ)Šà{œ‹¶:Æb0Ô¶h|7Ñ€×ÝnOtŠ"FÒŠJÛðå©.¯§1¥ó°»žú,x´zÙl~ÎUü¡Ð×b$¥·¤Ê–YO¿4Äy.¤M¦v±šÝ¸¸`#П!ðáèM5JzZö0qœ‘§c ØÐ¿'f ·µñz ðÝ]Ôx†·é˜1–ð=z°9¢œfn=Õ~›õ¶¨JÑ·Ÿ,Œå5w㨶‡Aí2mªñBp¨©\Èð$ÀqÚ¼µ¶ÅJÕħòf§Žù±NŒe2k+æÚ"‡Íðpk0VðÝÁ=׋~ŸŸU !C޶á?h+)æk•7»ž…Úªgéòæ žš S9¶sGÂRutÆ!cÛ~.AdÁ{ú2¯™¶%’ÎbÖÞ?…”âš¾ýë¼$ØÂU#Õâ¤Áv9MQŽKíÒ;Eäf4÷[,€”¥”7ñ.Šä’˜õ':Žˆ^:J¢úùã¥;†;„z:œYš'"¶Î¹¢hJoÂv/޹㮊òYú–”·É`ãdÉ….9ÐfEU5Ë‚‡í°(ÑÞ£wŒÂ˜£Ÿ,e/_Ê´yzf](7W9§ò•†ëÌ¢š:ÇoZva·W.°þÂZë#¥d±D5F Ëã¥ð‹µFßû&@³C¿ÔÚ#zºd¥ÉMˆª‡£ÛÒÍÅkÄj è;IOuèz–¤?Ø©­+LUtûë¿_æ¸F¤a‚ºÇkÜ ˜S-õÜÈ`ü1Ah¥–rÑ"„R©¼0hsGRsïË"È0­0ŠöO"«Oó­>ÆÉ$ë¾Ä&6ï½(ÒÚÀðºV'³øQom8ŒK·i9O¦¼…ßT.þkt—'æLð˜1z;DAm"¾Tè+^e7(‚R½ßßwŽB“=§|Ù/¥äâ—C@w-ò]Ô“ZGîÉc”(%/ŒÞ6Žg¿m¯úCC ¡rôܿñùac •?äÆ÷ê–!wõkPmX§ß7A¼Mï‚äN^Ž´±ö®aÔ}SXm¡q›gËlô«G­Hêm`%1êéuäÛ¦-ìÏ—F)Œ¿½©»*Þ ŸòYòyv¢y$/O?g‰ôS9EeŨ±QZuþ=p öƒW“ü‡ðyÏsJ й֬ŽëÉÇG¢èÓáVØÂ^Û¹MÍdfê¶]¤‘"7Ñ[NI_6Itö(z¥Q·<³TÜ7ÞyþO~«IÒÜrÛß­*:¢ vùš†QB˜OPë©ÐˆŸ©~LÑÇÕ™PWðN¾¢q½ gŸt5‘cå¹.å(ýsX\Q$øŒ›¦aºvDßÖåöE°ñ3#8u›ü4‹P}ËoՔ̴"Û‡ŒH¦>7˜*di—õ† K;âa"ógy y°Æ“S}œ_¤ê쇮 "ô»POq8snãáˆN=ÙÅŠöRSÓ KŤì¥O·f§w„@DÙÃÝÃM´®â^ 2©±ãÔ½ŸÏ@2Ý‚©Úý3ÆÌ‡(Š `RÐ]ƒG„"Òº_¦¤z´ ׇÝòî}—$iåZò­ì%«$¥Á„ÌTmùXç.LGüÚÜÁ½}öûž¦WZ8©\=tñF"¿êöá!”£ùjAñˆ5~ÿf‰Ò!¶…¿<‚\ØýL½ˆóº1b£Ç£Ý>ŒÃ•+¨‡±v^úwäh•@ Û[¹ÒÌDaúàSÊhÌ:îÒ b=ùzmM áz艱+, Õ8UýŒÏuäAÒ“ j2r¥7ÈêT.œQn2•žÑ¹„ÕÍ—Ýó÷Æ/Q »áLÔtõî&G[/ÅÞ°´Î{z0¬u/«˜92߮ݔàê§B}fU~âfxƒrHí:2X…x€?FzD7WNºõô÷à:´K‹bƒT^"S¬)ÑÔ)÷)ƒçžÝ¼ñJ‰s°'ŽÓ,T ˆ@9üH@µ´!RëqŽýôj¹w>™½ÿˆi«l”Ÿ—´ò€g™„d€An3gY+ô¾?;¬ö€¶,ßa$µvv°i¡¹Ó3ªT(âú«‚t÷Ì]`Q¢Oÿ8Ù±¢Ä¤©î¼ý¹'½vŠ{„ò+šêÍ ‹ÉE}§Þ¥ùü÷Ù ÏïAë[3áÏ!î%¢à°qu¿Y^¿Z'&§ÿž¸‡²„¯N!&ÞØ%#ˆe§û…í¬[8˜‹x ïöIЙÄå˪:,þ ôžT ÈßòÅ!s„ ¾‰8^·aÇ™ð8TÒ“{_%« ßý«“ôÅ!Ö7Öì®G3ÞLünœüüÌ… -´Wiíæ ÑÔ#OeEàÊ¢˜!2Ƨ-"N0ªQÝr‚ä-àZ3x}ûtæ×+.¶ŠÞh¨lµ®q7nM _¦šómSê¹\[I¿ÚZ#iÇ¢ñuJbŒî„Ýiwk TÍ`ß;")ê—@ž»jŒôO?ÅÛÁ²<Øù)ܾDF@}*šÖÝ4s-võ:,.ç¼88B„õ™²OÿÚNBÜZ"H­ö ,d.“Ž7V^Œ¢-8§f?À‰– mÆ&eNÚ<Õ¸ œ.Yìé%!>w€? 7$EË.öJÔ;]Å1âLpÌPâ(8 öÏ.KÓB~>í‹Ü yÜéZfLþ¤acÒ'M#e×Ôÿ>Ûk{ËX¥ñC@ê‘·‘qT(®ƒ^š{hŒUQ=‹é+*š‚à³uв«l^~#¹}P&Q]I­Ý×ײëŠ4¸à]§ÝbòÅ}_Ôæò •VfÂ…ÃCLÊ_…"ª†²DÕ—ê³Å y9a±õÅ¢·±˜ô®Ñ8ÃܫΜmYKœ’Ó)åŒkÈbYŒ9"ÜKvœ¡¶Ëå/>´Òó!’ÐE÷UVYüœ˰r‡ÔJñ³£ÊÀ¬vOÜ­VvBXÕŽÕ÷`0ȘD¡WÒ®L’/f@3_èY¡AÜ8¤Mð_~µÄ`¾hr’üØCa¤U»]ÿNÿ(ܬFRRŸS7q¨ïJ<@:*§“5<+f°®pàó>-{kt¯hàdÈ å7ãô¢¤JÖìÖÑáö ýQ!‡¯þ³ú9š05Íd‚l½£¬QÅÄ1!*ØC7 1FŽÍ’Ó/eÈ£ày ÏLóñ DA {ô¹èösz94ß« 㘰í07 Â’ðöu/`EŽE­›±rèÕ~[¨r)8C$‰›k׊rNÍžnhPÞ™"èõ|çJoóƒ}n:òå:rl]èßjîá1±¯I@ôûöã\‘L‚âZ‹”jé‹ËT€<*üÑKâ'žvj1w,ÚMÐøÓ±Ã]-†…+kMbÉn’'nió,žŸ]Ú{áx”Ñî'Rh0æùKùÛª¡ðY?9eMŠ˜|J˲Rð,<‘_JàLÄjÉ¿jî.±Qôxu´œ(ƒp„˜[× ‰ï¼’­×4 “ì7n ©&˜)]h€ò,¯»ó­÷4 (?“²xª<_UK¥l¾.(so‰Ô—¸º=Ói§Òû—L uSÍE±{r¸êé3VúZgÁ‘Ì<1/«¯ öDx’ÆN£ˆÖ>Å߯FúëU}pðˆ~>Èìd4NóS÷xÚÝöI<mL,§æÃü¦š®#UöÂE4÷º,:Év´øBö)<`ã:}Eâ$Á]Gz­°m9=T˜sjñˆÄƒYLÄûE^âÁÂßQ-Bøê`9Ò%Ÿ‰Â” -´ÕX£ç…JÒOâÚÏL¢™ÁF™ˆúa4!U-@^Á”†-6¡º!5g)—C¿Ó0Û_®öiz¬ž­ä»¾“DĨþÜ0Òïœ7 ¢\Õ#²úš:C«¢vfÒCc‹Ï–ŒƒO8]ÞƒkøäeÂq >¿È2{IõÕÒÂeõ–uòµÊq­Qú¤¿ßŒX%4µÞ¿âšMWä4¶¬XéLÊ Sœrœ7¸¯o–ÜØü€õñ‹ã¥¸¡îñîZ•©{ˆ/y®¯×|Ÿ0a‡”7üdÅ4„0itJ°Ò9R¥Ùpg,Õ¼£«•Ÿž¬`™kbIa=ŠxáHåáÝ÷k4eËð|.‰1ïçTã°äï|¨k¤{éDÝ|iRÄZ>¾¼°N˜yÞ%Ng¢Òzsâ˺§´X29{ Å„þ"#FQ× ¾c0A‡$È©6§—ý…ÉH§Â#ÚCwƒAë—þ¥qDF²3Et ýzÖ8¶¹eLÛl¯žVÕ¹. !%Í[jÄ…N2N˜ÉI"Ÿ;«\£²LžÅÔ|i€ ïÈèPÐÞ³¾dŠ,’ɹb|iß-š>Ë|^”ëynS8ÞÑþU÷ü–2¿Ö‘6TU )T3¬DÐȃS3]H\Åê@õ¦ ¸hÏia‡³K z0æ#ÄAËIº8Ø©<ÐþÚ’8«‹ º ZC%6~üš&#»’É…FÏØ5«æÞØŠ™‹YìÉO,åûýgµJ} d6Ò;>ë„“{Øv1¨ÉçažÞå¿´biŽ9r8²›AMƒ‘ '¼jiи|ý6a4)ùˉõÊðüšI÷·-™¿J¿“i„UÄÂŒ³3ö·éO&¹isš Æ× ìSä*í‹v‘¶8L8ĘŽðG‡éâö2‹¶DpV©èGæÍ ôkOn`\Ò6‚lA ƒ§(”£­œ5ZVx¤ÎBï¹*N½¡j+iH˜Ù óZHã ÎN±ÆŸ2¾­ ÇÆ6Z§­*óx=Æ…Ý®TlÛìXJ¢V+ù‰qÑÛp@cHzU¦™›±É-_àð©û²å–´ˆ7ÀeM¢>qð³13­±©V L{ÿtM^?Öt”™_ô-†ÒHóPâí_&¨‘VPÿQðC©Âe]/¥†M¤ƒ˜:õ ö°D¸¨Õ[4uvôõä¶¥uâ±M>yS™YÕÅ-ÐñÒ¢$fsrf z2ËDÊPOÓHÉÙºJXzôd9QÐË_àÍ?iÊ„‡ãñ|y„»Ó®aJe±Ó³+ÜtªGË ‰ÙAÌ{¿"î¬ýŒ§r…³_.VR›Æ}¹, ;Ùu8ªI$‹JžÊ-Ê©ìQÇ2}-«–ØùÜׄä-eÅPÂi}ð-i ÚÆWÞŠ¨Õz2€zïZ<Çû]‚y¥€_LÜ&—¶¬’ØÙiî –äox1GÚS†ªVt–ë(­³Sxøã—íüøZÚÐx’^¥aÂÑûãúéóIÇØ¡dBV‹X®€„–[–Xž«;èkõOËÈòó}RÓ¸¨j¿f?xÎ=cÎ_ç¬úþ$îx-·?Ó½5’$Ç‚Ýû>ç9Õ-Úù‹aBŒqM—IÐíHèù•Šâlˆ›ætÂ+š#²Á÷¢™ ýìn€ã/ò©Ë»+6Ü|‘šcŸ—ñAs¥AÖ Àd\ÏâªÉ}Þ¡k¾bŸëê‡A©SÒ:l‘Hó™Û6éß×ʸ5“h4Ý †™bY?qÄDà‚~7Ek¯U)ÏUÔ«ø‡!uÌæG”ë„NñœhØÁ i#ü|±®6ïÇ…}¥Ÿøm9¹ ¼‹UÐW7ú1Ñ€7ëÿI;R* endstream endobj 312 0 obj << /Length1 2146 /Length2 16612 /Length3 0 /Length 17902 /Filter /FlateDecode >> stream xÚŒµPœÛ¶-Œ»»Ó¸»Kpw×à4®[p·àÁ=¸»ÜàA‚óØûœ{²Ïýÿª÷ŠªfikŽ)ë£"SQg5w4J9:¸2±1³òÄÕø¬¬̬¬ìTTÖ®vÀI¨´€ kGþèÅA@×w™„‰ë»™¢£@ÎÍÀÆ`ãægãáge°³²òý¡#ˆ aânmPdÈ9:]¨Ä¼@Ö–V®ï·üÏ@kF`ãããaüÛ jY›™8M\­€öï7š™ØÔͬ®^ÿ‚VÐÊÕÕ‰Ÿ…ÅÃÃÙÄÞ…Ùd)DÇð°vµ¨]€ w 9à/º%{àßʨVÖ.ÿ«;Z¸z˜€€€wµÐÁåÝÁÍÁ¼ß P—U(;þe¬ð/FÀ¿K`cfûO¸{ÿÈÚáog33G{'/kK€…µ ,¥ÀìêéÊ0q0ÿËÐÄÎÅñÝßÄÝÄÚÎÄôÝàïÄMR¢ª“w~ÿfçb²vruav±¶û‹!Ë_aÞ‹,é`.îhotpuAø+? kÐì½ê^,·ÕÖÁÑÃÁç_g ks‹¿(˜»9±h:X;»e%þmñ.Bø#³º¸XYYyøØ@gÐÓÌŠå¯à^NÀ¿•l‰ßó÷óqrtX¼SúY[ßÿ!ø¸˜¸® 7 ŸÏ?ÿØØæÖf®S ¥µŸèïb Å¿ð{çAÖž}Ö÷Ác°þõ÷Ÿ“Áûl™;:Øyý1ÿ»¹,r* ŠZ þJLÌÑàÃÄÁ`bçb°±rpxÞ~ÿEÅÄúßY°þñ•u°pðý+Ù÷*ýOÂîÿî>í¿ƒðß±”ß' ý3àY¹XÍÞØþŸÇüo—ÿ¿éþ+ÊÿeÀÿw>RnvvkiÿRÿ´&öÖv^ÿÖ¿Ï«›ëûì+:¾o€Ãÿ6Õþk]æÖnöÿ[+ëjò¾¢–vÿ)¢µ‹”µ'Ð\ÅÚÕÌê_£ò/¹æ_ fgíTqt±þëA0±±²þ/ÝûV™Ù¾?.ïóø· ø¾4ÿ}¥¤ƒ™£ù_ÛÅÎÅ 0L¼Þ[üޏ>lïkhôü{‚,ÌŽ®ï.€wz~ GÂ_ýäæ°ˆÿ%úâ°Hüñ°X¤þ 6‹ôÄ`‘ùƒÞ£(þAïQ”þƒxߣ¨üAïQTÿ ‹úÄ `Ñøƒ¸,ZÿA|ï7˜üAï7˜þA|³ÿ Î÷(ïŽýë¿êÊbþøžð?ð½l,ÿjêƒwr໹Å?à_Jë?îAG7Ð?¼ßIYþ¾çcõ';®wäådõþžþ±x—Yÿ¾'dóøÎÜöðºÝ?à;wû¤úÎôOd®wW‡÷1ú‡þ‹ãŸdÞÿKýNÆéú=˜Óû‡ÁÁhñ§:œlÿ–‚þ«hœïY;½o³ã? ýþUdqþ|¯Ä?êÄöNÛåð=ÀŸpïï‹«ø>½gãêáø‡wvnÿ€ï…qÿ|çæñ¦½{{þ¾‡÷ú|çíý‡Ê{$o è_Wý×¶™¹Þ‰»þý¾¯âÿà¿?l@ 'Ð ayÁÑL Ħ>¤ó¾V”ЃioâÃ,Õžö:&ŸeP—Û# l ]MVÐ&èN4e¤mmG’öVd…ôÅ礭6¼=IµãÉ÷Ù(Amz¯ai çûdщhà 1<“†È¾ï‹³¯V -dx·Už³/ŠJæ½Ç€´gÃ`ùêxØÂžê~ ·<âsù S¬fÌÇÀ’9ª|ÓìyyËÆuŽ‚,º3,œ¶@¡dÿ–`š°›H¤^ã“ %ÄÒf»¹oÒõsä›J¹ÍU_`âžë–Ÿ>Æ vš¾Ó~žª"ìÙU¦È‘.ìÙ2ÖÙHÛ“Ëú©Û§µE(–^E ©8;ƒO‚'*%}ã©oñÓZ˜-]vK­ÄãéЇøLTr”fj&Œ„ÇØÃåQËçþ”é¨ÄÊBH·duö·÷Žõ‰ÀS¤Oû^®wcòæä£{dzÙ“¡ÂÌÇÍCCÅçã·öMb/vû27Yyc’šú!zRAõeƪ7^tÆÓ¸k÷–æ@|)Ù´b&Ów¹Oo„Ñž·–gœaò:çUÈñ>½Ëþ• ¿“2RCöyŽ(_÷®¾(‹(>• ̃¡%TÀŠ„úY—çM• 5O ¯$÷œdDb•þ*x©Ëæ?e¾Ú/)™Ï7HÅî¾×L䪩(ÿp^Ä?5ÏTF¸>çMBÊše¹†A­ºS«'«ß$¨b,ÜLÙ_àø ÓžlWe|âäLâCðõD,JšûëÚùþîíÏÞœ¶ºñÒ@Nl¥C7=½fálT5'Õ³_…V÷Õ„£6{'f7@Úµ¦¡ø{ÕðOh¦ëø¡&p ãåŠ/ˆÔ+n–Z[¥ë…÷\rékЏ?Öûƒ×äÁ\[ Ëü µBý/Å× ý?RSo[ù5ãÆî`éN¬~ –¬»®,}‚(¶aCRÍ©fâðKO)$]Ó@ÀRwc2Àƒ¢¿Ä0öalò§Õjžê8È#ÝüʸâÞØÝBJÆ0· gðõ†öŒ\Ç!ܺª&8¹DwèZ郄W‡±®LÁbÛØóJÇmÔAÙ?WЈ ðçü95mâ8­.3 î­^·–ot4ètg9lsÂÓæQÒV­Wgæê Ç5ÝÒ×¹²¦S†ïˆ}C¾\ý{ú'fªÉâ«æ‚|†“ðMØ/kŸa7p7xçýfÎß *~u9µº©FåÎÄ,ƒXl&¯:c˜Dk7ª„EB&2œ'nkﵺiLnÁ(*x½¶´9eè4‰ûey›mÇâ~¨=Ýú ÜLxÃ0ÈdŽûëêçȬ³‹óøæ1B¥!Ì­Ld}˜fbVŒqXvOP`„ËÆX NWWô3Åú=óUéA±üvvܤ²ëiQþà'*DàÔæ×kU‘mÈæ7á wÖ28ŸòÏYos?ÕsÒìϬ÷H·öX €ãq¾XóUTêX9VteLrªÌÖ{Ïé±M-ëœïL\BYêG•©¢®xòÜru °‡ˆNufòÚŽ9W ,ç¼Ø…ýêïv"ÕŠÚi,ÝFÆN:øqÁe…5; •G©‹¶rr¦¾(½ pQúD Y\ÍL!ײ£8è™Å0H½MTn®ÀœŸ`•ý=ζțiÝc !a"…Öƒ€+Ý©ã§o’zµVÙÛ‹`‰8ø)ó×Ò’ŒãÊÎŒ@ÿÓf­ø§õ¯Õö3%ÒÁ¬Ø½Ü8jºYHG2Ô|–‘!°BËlãÖ$#Ú5iý²ÂßÓB†¿²†õ¥\ê xÍY:â<,—´×=u@ØDbY´Wi?©V÷yusãËç±}7Á–ñ1ö <@‹÷¼®E0²¬·ü8(ÛâyNšYÁe?@• $úíËzÖCÅâÏ¡aííq ¼{íì7šZ¬t»ÿPòºÕð žC$+ ”þü&NGze‚·4æÄ1Æ@xþÙ¿<¸ç‘–NkO/¤?p/ÍwØX{ÞkÆlÊ# ½ áWõ­ Ký­dÑü¹OSþ(j¦¡žðƦþMô—µ) ð-Òè'ÄiŽbtõ¹X(<Ød‰êÁÇs_'^7‘„aùª#K¬|¤bmùÄÐتŸTy9ÒªâI'P²¦/ÖpTQC0*Ë}åõý´}Ns1yÞ6?Ô¯\ïhI;ÐáyøS|Óò,¹†ÓO…ˆˆJíh׉ǚ8ú›¦¹…Ê_WèqB«CÉñ4ph):äÆîû: œMÎÏ‹˜×ª›ÌÑ>Ô=:˜e2ék×úŽ% 9üPZ¸ÛQvŸ5:k[,/Kªy–îà°.›¨¥ æÃbò¸Õ‘æ«ßͨµÒIÑ–!jbÌt§Áé“Ýj‚3JwŸ šF\¼È]QE? FÙ74#s>øùz<äþ'$Žå¨í+¹Ò:|B@%/GAE PF}k7ÆM‹vD÷4¹D¾™ÉÈT¦•‹[o½©w•N ²213e²¾>÷hTç›l6È ¦hé‚>¡øQyyÆóc5 SbÞŠ‘‘"‹<µu»rdñTçÃê/<‘³¤ÒêÐ Ä$Nag¡Ýh²Ó=žLqµI¤zþ0'’´× i­:Y¨Ñ&+ŽÁ%5¨l)FÁËxù÷áóݳ!7ê‘.¦î®„Óý”B^çN˜~úDUJt“®ÉˆU¼¶“´Œ±°ôí®ïA[NÛ/<@ «àJ=(¢Iö:ðÌnœjnÆEi&[,¯,vJ¢ Ny¾TÙwô [™3Jƒ.‘(R39!Z¼ßtÀï Ÿÿpñ³Æ}3e“ý%ñtèpëöë¢ë1ñ ì~4\禎o¼›M`€kâ }‹ORÚ•«gË0ª)öBïŒDµÖB1€lPõëQÌ•wý5Ž]º§~VáÆ:õNÏ+ñG “ËÏÏ”\”V°Á“ ¤öšžet¾éƒ{j_,àéu¥ÆRd01{\P˜‚H郾 ~`L¦ä„ö>ÙC± 1µ½$rŽÓôfÝÔ1²T'ßÐXï–ü6—ôÃbä¹ñ‹n"‘:ι1_ZÚJC‘ l4²ÓÛ½™ààhé’°ÄtàÜAÍÃ]Æü^7Nƛش0N=/y#¹©ë Ÿä½:Ý0ÆÌ Ø®'¿£Éöq¨Å!\M´uš¡à+-2Ïí[¦RªM;Õ¬ÛS·äv57¤—“TT믡-´Ë›4➟”:èf/´ö¡ã7’o.H”Y×ÉŸjó3n"gñESË.Qý‡<2^yÝz+‘s$'ä3˜è^È’“ÃëG–i~óà”î[ O¥ØÞÎiXªÁ»å„0Ônt2„ãzZ9?¡xâ2µy UŽ×¬™Ü\ÞÁ€VÂÞ0ËWJIM2ÑG `©a1˜ö0z¤ä ýÔ*±ÏkŒÿÔy-:ý:Gwvï+»ë•Uìß’A(‚‹PðùM”*6ƒÕÁÞ,Ç!Ah€ZŽBýXþr®\ÏNÌzÂë·”õ‰í¶Û±‹ÿ«å’6ô:¤>©1®$†À]”îfàDp/«#"®B¬FÚÆXÜiÜoâ~2;n'ÈIÚûÏjrÔœ‘3%{áÞ´¿yÚ·ŸR$[•©0gm´¦2J|gÇE²`7±ìÎ#Šñ9är8N¿ 70:­Çãû=ùNØhmB|< UDàn/æftÖ-Õé‰ÎdtR›ö©£ÊÐ¡Š¯­ôŒ”K÷Š´T)rŽå*ñËGÀ9М¹—äuU-ÊFÇáŸÇÑJë¿<¡ª´šO Xí£É…uŬ÷Pqå†WDtåÃKø{Ë0¹Óý+Á¢^“nZÖ“×GD¼oœÔ5ü-æÊÔà=R‚ªlFNᶃ ßÅ¿So‰¯$(c¾V0³îíÕÄã[ ßÇÚ7!Ç?ûî‰1°Æ+¢E]}Œæ2•°ÓßÐnEëȲ9’Ûs»¢W[+ÝšJ ïW|:ÏÖ”ª:Ûl*[êà6s ½î#éi€Qµ?ò£³·‚ïÀl<Âlï²nfm­ƒ;$BÒe©æ\øG¢/5v÷4L|;ñ`Iö9î¸.JxުÎå˜äŒ³Ü¾qa¬›Úß‹ÄËîMï]=3WuAÚï´ > 5RgöŠO¬ýz%ä³DxI*QŒ%Ï9ÈDäI#úù,‚1Á”Œ¨ EÆBWAtúÓ‹sðÁ.ëÙ*³EF»Ã­™#ctµå:W h„"¬õÎ÷(ľ†•kvloÆQîÆi@&æJ¼±ÅÑÍñŒ£èU…ÍgÞZÙ¶·€ìÒVØ9>ê`ÅúpÍjbïì²d—ÑFʾÕxùš@4X¢›‰‘Ôáë—V+‹£ Q#=©NO'¢ÄÉE'þ}•1Ïãö¾i&ƒóC×7¹¢·k\ŽÁª¨BR È?†^Ö!µ&WÜð@•L¶ £GU+1«ö2=j/F¯þÃ,Š}eþ³&ZXѼÀœXLZ7Š”é•Ô|MJï?.”ƒNnSš,q"”¨À0æ6¾/(3Ä‘ù(õã£úùöÁÞ2T¼®¬Û©žŽK•0&"É8[qO÷õT<‘4tµyÍ3x饜e9ô£ƒ‚Ë®˜³î¨ ~J“Å«®Ø è$.ê,äö—õ7¼±k®z'õ˜Š^ñ†ú>O ŒÚ¬·xdx»°—r»úó>Ö…ñ³}c}iµ2èÇ"?"S}§´ ¹”Ži',û—Ae)AÀ±J¼Ö.­IÖ›< Xq]‡^âtþxì“HDÄú7eþìú]PaÜ>¿âW>—r¤×ÐÜig‘z‰ÄGÝ/Fhþ³‚`²¦BâW@ýó¸6‘©ª â¯Ã„ò<ѤÙsLJÃj6 Y¶ì¢™B{ÔDÁ†õë‡øjÞÓ,Ð#Réî-mDדh<ÃMÅTÌkvŠ gâgÉPûóÝç÷ì—åÈêè«ëXÔë!†û >(Žóùé믪ql?в3(›Ÿÿt“↗¼MÔ¿`FÍŸ˜ÕSR ’ $Þé; µÂÃŽ)ô%Ÿ”?⚉f梕ß~Äžb€ fàìðš)ÅހΎ››?××%míL¾…¯$f2~FI‰LN¸ú‘@V\Âä[v«¦¥â†7§D·‰ý]áQ $Èm¯Š=£¥b6f¾û…ìÚ“„`Œw5ì‘sx×ïÀ¶g@uðž^ªeoP8<Øïbm(×B¼.‡áyôy(»Ñ+ ݣ؂yšEe§¿iÎõòUÊô9óÖ²M¢s\Lüúµè?ŸyS̨žÃ0Œ+BÚ•ðq`Ú 'ÛT{3Ÿ¬@i£ØiÛ¤ÿœ5Ñ"¾Ó.~Ý¡cAR"©Ñ öPÄU{MŒ¾7wªŠõ¡p,áëçx¶v!$¯I‚½¸æR‹@‹ªë+áN¶~u”Þf9ºÍ÷ŒF_]HUNÒá}qAl=àäÒ9®ãîÞ£D PìiX̵–Tv/Šwøï¯ù°²ë ƒ6Ö1ÅŠ]X?c™ãüp7ÕÀ³YŸÈN8ÄX9•7‹¼êO°$öœvm!Q>´ b5Pìú~I%¼~˜ìßÎû$uθ82Ú:¼’E—†rxœ¾S͉¯¾„þvµ8=ì`(‹œä¿íöÀ éÍG4‡²JÓŒ\wÕ ã¶Š’$´|VÅjåÒסŠ4Ú·ð¿êܳÜ“xðÔºîxzÑNKìtÐbë’@'%푼3Ô%¶àĹë} ê2r•…“:Ö½Žn¨ÒwÉ{ÏU~¯j×£MZ4îL ÝË¿Ju`Ó@Ö4Õu“š^vo·pYŠYªV/ËH1Æ´Ö}œ_J—Ïœˆ©?¢CsÄúÝöâºà 3Ñ|?J|n@MéÚÍùÁÛTB}˜ÞËü¦ 3åTÆQ‹ÀÈÚÚ–Ó9æ»>þY÷ªæ“ Õz͇sD7šBVFX€m¥{g"ðþDC`zœ(l0ùÅ^¤¢Ë`òÔj­’‡CUûÜ’–þà©h!pÞæ dÇêËá¬)Šý™Ç—mE‹N.ÌžQ S>j‡Õ‚´-(èe‡!]½Ü‡‡„ïEš·>½™§ÈM9FE;ÆvÄ5Œ›:ÿN!RÎC5¿¶ÔXëÊÆ~imÛ¿nEá8{v!æUÕaÛ{H<_܇»¨ñVc¼¹HŸîÏ—5qmžõ‘ŽŽp‡ˆ“¦©G×ßÂZ¹‹~‰ð.þ׎gW°öBãŠ`M•ÃHZ ±ò¶‚lì  8˜mº Û…@¹V4tõØ)µú¹žñz–ÉþTÜׄ7· É1<©<Û!µ®·$™}‚d²†îZŽ-ï~år o…ãWZ™ôaÒÚN“!º\ðm}žDƒ£õ»C?óÂ>Fsøï Ý)£)^ß(¿ILýFGØëÚ ?ê¢`Í•ËÖyJ¡y™€#ÿUÞÅ•§œÍÀw®eÇ?kLR-Cã"é^]üÜäpÙ”èúl…l¸IÞË”Ù3Á)û3yxnkX¯/ÐÜå?Kqƨ‹6Û½0ú…äþ©/Ѥ’f^ãðJ‹ØFßr}OIw¦W0žÖÍð’Ôo žoÛm²­Š0(:ëLQ)ØëÕHfÞÞ[Ážu›Nal†ÍŸÔÒÆ¼@R–.oþÓ“£Fû v žH¸±2EÛ@vËm3ƒ/UnÈKI;0_;ˆ©HÍâOül©Ú–ýb]ø øí÷°;G\;ûâ`ÊÛ‚kCÜpðÔ¶ÍžO¿±Û$fØŸ 5ÿúžPöÕ6¯z’ù‹KHjm5´ÂêåÇp¤°èžï²­I³ë°¢ÈÕ%+Lg$¬‡ÄÓÖ±P„û&E%Ñ1š&3äÇ×£S^?ÌG¸Ü÷Ÿ!°jÿÂlû eøMŽkëÛzN¾Ư¬îŽEVXøìŸ°:‡ØfC]RQ?IUI ×`†3>]1¸²d~¡=|.ñ‡R3ÿY­j§y vû¥Ö†fF%DøºúÍŸ(ÞGŸb)TÌ-lÏPÒ?6uøÄÞšlº9ç#) oc#ñî`훩èð'£U{Xû¬Žb£+ Qúcó–à$8 Üé‹,wÆ©%ËŸ©§U¥_°RòZ6Îâ—Å>´¼9ßìe03âe¾Ýª"I«3â»#&ñÑúðß=Ò…fÔq*µ{ˆBߦ-ŸÝr‘QÇ÷‰—•^/Œ¿,dáE³:“=›Ù» (ëa¶}ea .œú²¤ec^àW[ úÛ0^˜¾~ð”uý^A:[®röþ®<wY¥³šÄ8Íø‡Ä"iH÷탫 Çd˜ e~?üÆÅŠ'¼Î\R´’„nË÷„n«‡B§6‚jÛßè…K8úõÉAYØ_„qd´¢òíK¡!߃Ã2$<_‡3ÙS±Í½úJoº¥j i§Š¤·Ú1™¤IîRSãlµ¦øÞ X›÷[`sšîÍàU,7ÉÑ9N¿{’v'ûÀ/¸€àÓÉž¾® #5¦ñ.âÚtÈ×¹‹Ö(\Ói²†Š qwí®ÃNê*?Öâ)‹p°Å¡þ(|픑•¡£xNzX°LWÁÛ¨´J«V×¼2³º“ï2w ¼?4tûýè{kñh;&5¬ª³Äÿ*~ÞôÍã»s÷²]‘tŤb€@&’Á±·¡gÝï·}Cß’ :C]Ù Bz)éZÒ>m"2´¶—×K–G3g¬ÃÃçFÕñ¦t¦ÉÎx—qi©{r©ŽœV)îu­=Õå…\Ïd ñ•?S‰n•ù‡3•ÇHi^¯Ì¦‹½¬Øö• CèBÌŽ’Ӧ졚´«ŽE‘?—Uå¶¹}Lš(šÄYñúÈ‹ÆwZMƒW`‡ÔLO!ýK|vä…¢÷Á€4„Sjút‚“?¶O\¢.“-Âí‰:-K%j"íx†g]p𜩃¶µVgfk½›7î¾WfÃÜÖTŒÒšj¨×=ЇÈê `t‘8ÊŒ–â4`y&ʤŠÌ[_?-ñhZɱÖÈ‹*’ªÞjãBaÝqTÛa1Û] Þ m`ÿ©1(óF\èšô5p3œY­RÌÎaC[Š çâVD´O+Ý»®]yâz§ËíP›?zYÅ-Ñ]m%:  N§|K_ãØ_²æQ$®£ÏÌ>7tñ¦!{ig$IbñC|÷ ýø±ŒJƒ íz˜[è[l'O æð5d¢6ëš22q;ߺáô¼ž9±½æ xh3ÖA÷CÊ`ËòÜvÀHök ×|øaÔ—Á8bÿíˆâ´Atˆ°téFÅÎdíâ5Cßç4´çÖ,>öñ‘yE;f¢ó‚‡ôOéös2”wâßô§,5óðꜜÃqGˆ>~ÿäìr#ï¤ä§§8hÛ÷ÔF?~bÉ×ãu%±;{¢Ü_»ΓãueÕ”H'šš™ßwües1ˆ÷,zë¦X&v0%äfÅôÇÆXúÝDæ @õ×Ïr¡äV6½:ÁÛ3‚˜yFgcúm¨4D>¡÷E“¨H¢ê.€‚ÜqÑ.ŸÅôð:r ³=œƒh 8"ÏÀñH[x'ð½äïÄ^¾ôCmA(âEȆ]yÐD”wplg–µ3ŠØ´'Y÷“wÖ39«@<¼%ù©Fû˹ürc¿¨©0±„šõ-îqFµWcÉðþ ÅË»ÿdL*”Õ&+ÐJm¾_µkÌhÈÖ/hõ*\¨ƒÂ*MÇ=2êú.—µ[OþD–‹¦êñ[»|sŲF÷-±›=jp+‹ÍÉt¸þ^½[§*Æ”ÌM±yúx¦b1ÃærXáïó´ƒkô+8Ó#꨾鞎ß^¹ØÑ1¿–aÎuÕŽ ‰ñ Ó¿æa(ê¨RÆ¢oï]Sh>ÆõuïPôº—œ°]¿”,ñ/­qíϵÁ2Å´$'ÜÁÇû.ÕTʉd BoO¢ÆQB5Ï6lº­Ä­"À+S !f]MX\ª$.øüŠg³Hiºÿ.¨ƒŠœKO-•Q½¤T&-—v:SÔät€$òVÆw1ǹD! ÅÙjg4J_¯àµ§¼ >wO_—í–:¶ÙU7ñ#šð(ÅnÔâÛˆÓ‚¶²¹û©w sŠnޯ̹cµ…¬_2$Óa1äøq|JO·ë´‰ÐÙsí!ŸiLü™%fÀ¦Á囿 Ù'0C×c_j¯_%CÞCä¾DˆšÒ[9k8±ë5tgït4¶”Œo[í‡`¦òVÔÕ5õD ŸÓÓ´.¥b—Šù–jO‚óX ˆd×5XÅÉÓé|$!¾Ú†P¦Q¸“‚¾VjþYrQ"‡Âí£¯Ëô¬‘•c†áTB·s’é×’Â}ëji¬úÎ-|3‚ŠÙ.ën³ Pm¡‹™VÓ¦>aÙe¤EÎ>fÇ]\)*uó%ÞWìC0hï%›þ_,ì?©’‚Œ #.ÙTxs‚ Æ&¢ÒGW ¸Á7vŽnÁšý„b£F ýÙ㥄vMäžÂ[0jzb’½eÏuꌙ,EıIƒŸky|?åõ9C(y`œÍo°pêEºg.{9hÝ÷O£ådF]ÎØ*Æ{mðŒã!†à…Ò‡¿§Ý¡š”ØÛ”NýɧvþÈÔ Õã#¯QÙDâ;z°{æj;é°„ª^C-ðD·/HIgW(û^r§«¦ÃÂæCEò2qcj±Ïìd¶moàfŠÈyAíHö‡ -k[ÀW{ª– ‰y¸°CT}$–ð4Á8:ÜÚ}÷Ða­Õp¾$±G2ÎxÀç3Sßùn2ÀGBCôÓt Û«û•™F?òôïkôô¨¤±äÚ×½Î"Œ??ýØÜ¡zš«ÏýYRëi¡‘" Ê>oÌfUgÕõœG"ãnc †àw›hÄØ¢pMÑO©ß*¿"¿LïݬûÊè"¹‡FÀ‚1ù1þ"((ߊp ³]5j ³Á¾ë±B1Ÿ[â…Ëq8u¿`5ŒôÄóÎ[l&ÂÁ’¤BPE֯Ŧ“}ºÖþz­„„ÓDð¡µìlYr¸$q}{BªÕå:Æ;×ye– A?¼[ áå3æa±N’•XMwÁgµ¯EkDM;ªO‹æCwédaS«ßât[äÙ¯>_ò®é=bxS™=øБxÎ¥çë©‘|}U%m7zÞ‚ †ÜqlT@‹p-ÕRѯۛ·±žéZëÈjt€mtÒÕê¸Î/½:^ŽÌ‚‹2aKœÍçãÓ«©"®~qÔ”¥ŠríÝêGñ—†õ²,óÓ,'¾§RvêUÔ臯-LäN1%z»^u¯ªk¼±x)?øv¿“V‰¯¦.»Iïð|ºßó5Iô(Êð—nõõSÀÜÖWuDÓ`Nèúé,A¶ òÁvàLR÷¸ÞwU𦙅vk)ßW^û9|ÕŠˆÐµ²z×XöÓ¨JXötçÅc”SI‡˜ê—?cå”`!eýAÿ–6G2¼¡¡ýäÒ'S+>¶(Cª¸ ~]oÓÀµso;µ;áÂC?LHÅ|¦5$Ö”ÂMч^Ä ç‚,IÕö#(5q'ÐÆ1IbówŸ‘ù~aª„d+`úg5ÙBd‘+ pQ‚ÅP!‹äª}’ïyC¸.m?­iEW9ið‘€ËDa`ž€§(w"7Ñvdiš¬’)6{“`L"ñœé}ª®”Õ ýãYäçJûH9ÜÉNzÈ ·M&±äW*$c ’4*Ø6~œ`LT² õípb‘e^)^ÅÐg ùü…f—U„ k”æÖ~è‚§!œä' †k¢àvµ2Í4¦ï§(Ë>vùt“e7¯.÷ mAܱ]ر ºÚù°Ùá5ãqÆŠ×ãͯä)ä²Ijx'ÐÎÅ H¦…´“8¤Áwxà~=å„kFò©‹¯õ¦ñ’Š4gA—ùý»Ø¤è ý%s §•«¥xëúcú…¢7I^U‡)Z‚×êÓ1ëÁ“rGŸ–ÏÚ~„ü–Wßñ=evÅY• OeÚ)‚ZM`³Ò¨ã‡àZ^¬¸Íô„{«õ)/õKUÌ´1w³n'¥Â-Wê¹iôìàľìy»9=e†¬÷ˆÉÂïÊÉÃ5èum2(0ôŸöâ+“e/³vSËl‹ãÁ½ƒ¶‰I ½ì7³ÜT¦”JÖ)÷ø"åïÊ„÷µ“E#ä¡×êÄ ~\“i´æàæ¬ñ[êçð‚UÙžT&(øÊºUJZðÏÕ§‚‹í…õøK ÔMŽÚQ”5%>…\’®ù^ùEâmµ²%„õ§d73ØÆÑê˜ñ8ˆQ$£c=$†pÓ¹õí%´¯j§/Ï+š[5ºr†V¯‚k¾k«Ïš‘}kÚÄÆóÑÐÆaým‘¸Ð‰äß›îà´»kh°µ¤Ï-"ÛYÅMàŽÇùŠO!.ÿû@`®´ã×0½Ó·®6ÝzJ*L\:Ô¥Ýc?ed›Ø|/Ô¦Œp¦$d–övn.Ížú XC‡%K)g;ÂÒï”PÉNð8ôí•ÍìèÑÞZ!@vû=Í8$ÈÀÊrñp›å5>z{¯OôlG1Å! Nø—Ê-±KޝɒX€ z*Ý Ú†£°¨œY%®!O¸Ñ7üì¦ÍÀ‹r¼ûK¶ž?fÁw³iÉJ#¶–õt¦¦NHŠ˜ žš“ vƒö½U5Ä: ,$0â©Á>%Nðþ…“~}Ô†Ór íqâk2î@€Ý ¢Ý²òø ÁUl®e¤x¦®Hlp6œ˜<°›9Ø~‚°Âæé{Ôäq1Úæ†Z¦}§‚ŸÂ«e(¼ua÷UðxcÕœK!§ÈÓPÊUŒ*û}Šì¸´øÑ$›À€iã½Õ :ÊëDµ3Œx­ Þü‘4ïC^dnÐø²¾—„T¾…¬.™¼œY¡ ‹-À®Böw ¨P¢=÷¦;ëös€_fweòK´^ <Î1¢Ó8³nŒ×à`nAWþÄ JvÉs.tÍý†éQdZ^DÀO"›8/ðl»,k˜Æ‘YxQÔpV¾PòœE͹]´žm³`ä…Âý“ 5ͧ †ûe¤Ç7(­PÕ€¾éÁýË’³ÆŸ0Å‹ä·ä PÀä—ϘÒ6ðáb»v´Ào‚JSAV—¬Ï£ÏªßxÓÈäkÊ/ëÙ¥mÇ3]$n©6NÖ*ežys–"ú{ &§ÀÒporÕ`Q2·”<?ÞO³¬RæÄ+»/™9'Y§Îû¤3"z!GtOLUϯÛéCÃy¤ÐM¹´Å„wF£Ù¡õ×r«ÖÕ¹T.oºi'Q2´Î´|RÑsš@Ö Í΋Šýxü“¶1܉ßîõ´¦ôpL[aØ Û‚T-ß#÷d}]ìÚ&Åž+Óë3Ñ*‘S/ñZްNàÎqÈ¢ì‚( +Š%U€®_TvIBûÌÌ  s/}íÕ”ÄS… (¼µF"ð£ék±*Þnè; Ã0ªÂ•ܸ.³¨Ü•»)Ä’õŸeÐoЮ­‰†àª#Z˜¸”zK9¿Ã–Ñ0p²AN ;öH^ž@fÿŠ~ÚQÇç´¾ÊË Ñ¢,ïL; êÊt.ÛÀØ´-/ö!¢ô¶xÝ»ÇJN =¯ 7Dˆ#†{cÄŠç —Å²ÜÉìꡤr]Ú—ö›™»1b¼’ ‹~>þò¢nZèI/X#p(['¡1Œ(—"Ow’ìšEßV¼€Y |â( Øèâ ˜Ÿçš-&d8«ÈYbã×Zçs¨ÂùŒe´Y‰Ù–&r—ò[­³¼´ï‰0)§¥N"[‡J¦JL‘ãÛ1õçÜBbÿÛh˜©H˜W‚!ŽŠP ¡ ¥ß8?6>ûBF±ø„ˆäi©Þ±£níó}í² ‹Œ]ð~#BÝýI¥DÐ,fpº)1(k$Ÿî¡ýJFMªNÞgÒ•¬<ª´ürMþÓm÷Få®f%ËíWWwÙÎL:#Ú~l‡“çãeõ;c¿ÓRdü;AY-vˆß=S.Š![„jðù´Žôp5D)‘Œ_¯†àØ3ê^ðGKw’U>rv Ã\:A½–v¸:åýØñ†ìR®«—èCˆ,.מ쫎ì3/)?ý½–Ë~W~×™E!ïå®ÔyÔ-” -$·€SüüP²2HÖñlïdE.׫Ö4ËËÍ,.@&Ä(&1“‰bFîÐB#Ψ[œjÞz˜LåÈŽa÷RW@ü7BPÙDØ1ÛÕ‰²§$ú­ Ž.ðå ØçK¶oüÊĤŸÇmIWá$¾e@}oÌW[— ¦?ÛDJLŽ»HéÅ{´ äÅ´°[Í󋨽Ëåd9KÔ£Z*†%«&òÑ$0K&¾ø¡Ly€‹uc!¾U‰‘N‡Bë¹É và€úgÚÝ>Š'F\ z` ´Ý§q>…åòçK*“ðn\KBñÐÇ^ƒ¸cv»šËx§@`%Ê-ØdK`¿c’Òø•o t:0 ïƾ¯ä—ç&@XçŠ ÈC"Ÿ7ñ¹~ÍfBBF±ùVZ2þæž>R„ænE|KE%`@ɨØáŒÕ=×ó9þçëJ]T­òåã‰ÝÕ¾¨»¶wRöãÚÕi`+±Ìœ‹óòÍ’íCŸftû®vð"IëѵxK0‡CG#hB œÅ(.ƒ C¨Á‚Ò}WêL k«†‹Ú&h¹$uûò‹”Ñ(¨´€t˜$Ьžé׊g6îTÏU߯´#Ëcl…]y¨â\¾öI‚ó•‡5íLC?À,8’‡TÌ~!§Á`6› =¦ð)¡·ò¢–¯+W/èZ¸¥îç‡ÉØ;ßÖ+?ÝÆ Ï|9ç|ì 4ï ¸€mV®ó ië>?h-Ggfš‘‹;‹<´üÕfÊ\WNâ lú¸ ÈJÃ/!æ5Ä3«ñx¶–jnTëÄró0]dÜ·{¯kòŠúDÏÂÍ!ÛF¿lÖ'O!õÓ< ±ïaЕ]Õ¤’b¢4m„ù‡¯&ó^?á¯ç'ÔLÚÔpy7lÙøéº" ¬“±“ú¼5qÆ<è·ó0ËÁßÀê{‡¤Á•?J<:W¬Ý…sÍC³ÝöØNäé(ak¨ŒGïfK¢z|Ø=ÔÐqíâ$vyµ@Œ6]õ-¸V0"pF©`} 'n¦*o÷ÔÆaÀ(&º§T2˜™úPRM*ŠMgjÑ&­~oÒ¨ù´ùFZ-¹<ƒ4Êwí¦Å!â)â×#Ÿ¼V¸ûÓ¼pX½;Ø@ò#}à‚ììr6ÁÆÞƒÙ=>4Ö{QÎ>VÆ ¥âÖïì¯ `}7ÿ¥K$€Ç¡DR¶äúØ*þ3î™ÎTó4Ìu@Ñt_ZoÍ@V"sâkvN!¼?°<áêí¾öó´Ì¢7ÃÙ÷’#ƒ"¬ÚOˆõqcÍ÷ÉmibP³vø´99 à 8ÌÜ@‘zšŽÓ¨ÔcœWR±ay NËðË`¾„.ÕBŸUÿz´ØÁqsBùÁçê÷tâ†$+õÄdGì3e†Ï‹¦ ƒ¦h'ñ¦Éá8ât[ÔøŠD*G”àg¨+˜Šêˆk8‚£Ü³òš¯ˆÄÃ0Ãîß–Ç[s>8¨öÒDÅ·ñÐ@?ú¦„–ñ*•°âí¢Í«„”sÒA§á;¯˜Pl(âÞÒRiÓH[ñ²¤/>‚µjº5¶SþˆB'ïY9î©+ÜfHçpyN såkþÛæÙÃV1GuKõ~ÿ›NîšOBs¢a.;C|“Â*W)*xð‹ˆ?#«ùúÙ B£\#öÝï„úîr½cC;÷¸ÑU°l(XïgÕ»k$Ô}ðEÀ‡y–àŒèà‰§‘{A)òÐIŤ{åÝ)VÏšU¬³(Þ²JQÅ ö·!áåri=IMƒ•ÉXyp®1'`J±'?þëòUå·£]tÔX!po.q#fbÀ’Âì(ÀNˆö¸ lâç]•bó µ´S©À'´^Í ø$hDË^Õ}ÔÏ•[{`¦˜ýš‹¶ß…¢Â …ØŽ ßô;«Nêdæ!äï­œÆî€=`æ_«‘ÿ}UžÀ”Tµ¹žºÇ Åd¤ì”Á)FšÏÞ䈖þ½á–9CÄ}C©’Á—†m iÆ3G3 —ÇÈjÝÉKÏ/Ý~^y¨ìDÓˆóæ´H—Îè³¥É4™“óþ… \“; cÆjk` ͵$8‘­c™?~!d5Ä·L5Òä$£®²„€ÐœR¯þ‘½KJãWü;ÂŽBsöâr®æ;dV‹Œ5eQm-À”étÉ3|=åc`U™Db<Ú†3¬I«×ô(l ‹Õ¹ç°ÈãÃtO!ŽY›|çâ·–á:kLEx&SD±}¢ðùTÚ³Æ&Œø¼ñÅ&  ŸúïeˆÌ­SËb#Õ_Žþ|¦¦„âö·×»ñÝ=ylGGAþ™­tfPÍ&"h4íKþ°f” •ÙÖ_œì{Ê…Ó ñ?µ#Ÿ´ù\›™ë³ƒr óÊmÀ{Ôlß´5¨”Ö;ƒz­æD ¥ÄHÕ¢3‰y”¤$âi\¨5#9zÊWÖŸUŒî9ºx±<ŠÜ£Ï ¿Ç재$’Å©³aÚ^ŸÈ?‡ŠÈÈp%/éÎ÷–íÀÛ0ƒ5k:,9δ·³Ý7öëû}]š¿{ÔL-_w‘œ [ûv¾Su>ÂUÞGs\³g2—Ί#ø8­y$S2õ›†ù{[d€´ù˜Æ@ëåRÞŠÊcq Ö“ë~…ªí jévAL†^˜¶º~ðØü+´‘ÛW;îµ n‘ìèmª Ô3w«…_îà6f©ã$E¶Fp ÉÏöåoq}9ÔYÁwËAÞ}ò9ý­ÀŽŸU·AHÏD6Ιᵿ̬΅ù鱇 #8–,¼ï%-à„‰;¿ ]Î{] üx`µEíHKj¦ CˆÐó\ˆxF•§n6H—ãÇ‚äå²ÛV(TºÜüø9yRg•2ë6…ëÈ¿‡®Ý½™$^Q;Îû­ à Êé©0£bÀ^ѵæ‹oîõsß6UòøWŸáÞDõ/!ç§Ô¢XèÑ6ÄOvà ì8”¶T9OØYÒ²q‰Yç§™«JÔÈI°{A&ÛŽ[Ä‹0•w¬ŸI“º /x%9‹Ö|e´{.Œ–/ŸÜöD‡u¢"Ðí=Vû·Ý`l¸Ðñ[¬Z×Ýìˆ.Y.6u¨RÌhöø;R8EóK<¬Û_r‚±û]÷Ë7ó2P.Þvëëæ×GY;ìi<©Cmwâ`Åö²…Û&ymöï{欥³<4g i]‰uµÝÐyÝË.¾%¾àë8䶺kÕ%¼õ&””KÉ]>ý»Ÿ+ÇÝ uò†|]‰å½H"~W~àGØÛ2ˆEÃkVèóðŒV¡É<)ó %د™;7ü¢LƒR1ù¶wbÚ/U;ƒÇ¼ay‘Ü6È`F 2Ƚ’ürÂÎKðõmF°swµ_µ’NEþKsI+J 4HÄN£ß”ÊòNÿ司fþ”[MÓd…ÃŒqMÜäIeB{$'Ì«¼Å…#d6«ícö…‚FñIË(wE5Ie5Md”_W*Æ·uÍÿ l“ûMíŽà\‘E4M^w @©×~’ÂìÈþíÓ½Y Ü¡ùPôÂÏú$52š× xC¥)CŠòï܉68zF{9àõ}$žéÀªÿ´Ñž1œ? ÓÙÒÒ$F0â˜3% ‘ê–  vµ9ÊÓ)SLÃU_SO²Ú¢´?I?d.@K~´…€c@mM¥®¢°Sx‹Ÿ9ÆÉ)’¤•m†ºb h·|P¤aK €Eoà.´’°ì?–‰¹Ÿòññ³ÎÒ ¾ˆ> >ÄUTff™‹ʺÈzÆðGcR üã…Í B¸`Ȧ?-©ŒÒÆEÍÊÛ$䪌æž‘Oß(,´pÍ ±VýZ®Z®=l‹ËNíCý…jÂü¹T^"»¯i!=ã„×/µßÇ“z[XÏ—j.âŸé¾jrùG äò+æh€ì%DUÐ"6·PІ2Üj‹£SÔRZ¯¥ú«3‰‹àäÜ ›b˜lÙú)ž.‡ˆ&)Y¤ôaa§;ú\ªµåù¹ÿ¯ùoÞáSõ¸Ù+ÇS@²÷ºfÜšO¹þ3+(ý¾;õÐJ–!,ˆ¼3é˜}[VÙŒXô*bÞžÂB b€ð59p›..kþ—Iº“âîò>o¾2¡Lj׃A‹Zy›ãôþ  f~9*¯RµåPG³ÈÙ»# 8ogý;†’ï/ñ'®K!™n’3æÛ1jÒÉGz“‹ñèßTe"ü†€¬A"ÊTR ‰ó ҟȵ÷$&» ¦Sw°hü‘FBçñ¶ºû;ß‚ÝÕ™#ùë»û^hö´ã:ý<º»› 0?»×–v‚›¢Ì‘mš…ZL#ûgüß8 ^œk¿Z}›A}²òaˆ±/’©/ÃMO¸§›Aä6aÀ[/ »g;Rã  (3ƒõé”6‚¥B._ß Üey ‹%±Ðv¸Dërí0 ;·ˆ×˜Kå÷øäù_ML­S{Ï ÊÀ¨\†00L'O›ð"×>Wa¤Þ a–Ì‹K%ts˜ÖM‘3W<ý@§Ù(åÚiÝQYܧðóèb¶Þ\’›³-»%ü¦°öó.üÛÐû÷x&ê‘ñå¿ÎkìÅzBµ‹¦WâXk9ò°ó°bPà¼)dû!î²²uü.–6ŒÅ´Ô9°2ÁÏRœ¥Jc/ã÷÷F?´‡ŒL$Cº n#Ϧ¶ù­\¼Ð93cÉŽÔâ?Ò«ÃÑâ/;dHQ^™KG e¼È×£wÌ®=_©W…YÝL"âšhÈÞ"Qã•]¤ÃXVGUü|±«íã¯;?<ʶû‘/ƒqT=Ü/~V T]úëh\Ï–,Œ µÅ_PfM™Wãí† P8âÇ‘× V]oŠêYZæKý£ÇæýkÂn”Æ"€ÀÒÓË£b ˜PqûÅÆáÍœ¨UóuC3›/&˜Œ‘7d<¿þüsà {¼©½ÐÐY”°ëK endstream endobj 314 0 obj << /Length1 1999 /Length2 10297 /Length3 0 /Length 11504 /Filter /FlateDecode >> stream xÚ·Tê6LKH H3tw§tJ·t 0Ä 0C—t‡4HHwHŠÒ!%€„”tK#à7žsîÑ{ÿ­ï[¬ó<;Þýìwïw 4š:Ò6+  ãàáäȪé踹ù8¹¹y1tA0'à?4&ƒ>Ð ‚€EÿpuZÂàœœ% î§TÜ<|AQ!Qnn/7·È!n¢9K @ ¡˜ ²o7= ~Ì>˜­Y<""Bì…¤n kK0@Íft†ŸhméÐXƒ€0ïÿJÁ,nƒ¹ˆrqyzzrZ:C9!nv’,ìOÌ  „Ý<€6€_‚ê–ÎÀ¿•qb2tíAпyˆ-ÌÓÒ €N k  pÛÝðÃ:ÊÏ.@ðßÎÏÿv`üÓ'Ï¿éþ‰þ•þ+ØÒÚâìb öí¶ ' @Cá9'Ì Æ°Ûür´t‚Bàñ–– 'K+¸Ã_•[¤µ–pÿȃZ»\`PN(Èé—D®_ià]–ÛÈBœ`óW}r 7 5¼íÞ\߬#â öýØ‚À6¶¿Dظ»péA®î@e¹\àæoÎpss só€® —µ=ׯôºÞ.À¿ŒÑpþ¾.€-\Ðd „ÿÁô…Zz07w ¿ïŸ†ÿF˜<<5 `´1g‡Ó@Û¿1üòÝ@^cnøìñ¸ýüûÉ>^6°“÷o÷¿î—KF^WNS—íoÅÿÚdd ^_A¯7€‡[ $Èðÿï4š– Êàþ« ¶…Dþ®Þ¦ÿTìñÏ0ÿ³,€ÿÎ¥O-Àü{ÈM¸¸­á¿xþŸGý¯ÿ¿ ÿ•åÿ6äÿ[‚»“Ó_fæ¿ìÿ³¥3ÈÉûøÐºÃà  ¯ø] €/­Ðäîü¿Ve˜%|¤ÁvNÿ¶Uym4A0kû¿§åo^ï×–9À@MôëYpðpsÿ ¾ZÖŽð§ É¿L@øæü÷‘ò`kˆÍ¯ãXº¹YzcÂ/޾<ð]´zý5Ä.N0Àåùl!n˜¿n>\Ò¿¨¿7€Ká7âp)ÿFB.µßHÀ¥þ/æpiÿFð8߈À¥û/g±üàY¬~#—õ¿ˆAœ{ÿê—ÍÀü‹°ý áFÛ?à/#è_(À÷ zü gìþ€ðÓí×ï’½·‹=ü)üíç@@¸0Ç? \™Ó.ÍùÚàBþHõ«VÈïÃà¾ðï‹?ÌðÚ]~›á±.ð7ì´…ýfyþaÿÞ·iA8 ß2ÈmãKsûÂu@ÿ€ðØ.Ëý—åñ„—êùGá¥yýá5yÿá2|~WÏätû[ö´µ»\ì¯G>ïÿÁ}…^@kÌ/³k±P‡úжë:irOŽÍQ´•µŽ¨D£þHãÜ_ûç²§\e,lªIFÒ5çËÃ'gýÈY®Ç¼Lº³ƒ¾¦)åÁäû7dN8ò‡nκí€T62»q¡ô¨ üãWZ”¸Æ(ÆLɳwaB=|Û5[E÷Ðí"ûg@É%M9,N:·c)ƈ†~ 6ld‚Oàfœá®«¬7~Š¿’i‹%½ñÞ0ŽÏ^^ÌþØŸÎ÷½@µ·V°:ü )¡ MîHÒ)Ñ«l•(£ŒÀ¥lybdE×\ JÕœ›©ö V=ÀŒx‡¹áƒÔÄ‹âP÷v?ªÎZÒ­”襀×]j§’¾ x»7òƒ]†´RX>{Žà¦\].hBSiî i-M¨=صº“MÙº:g25Q¬üª¡\U»> OÇE-G^ Or¾b„7‚ÝIÓàøZ™Ð‡—òã’¥ö»[ÛKŠ ½;dúxÐú$¾ª5Òù+púx'!Ug36»/ ”Ù_è°ëìÅýô-Gj˜<Ôvùj•ÿý°Oó$Åñ3a©Å Až ³”h z¿fA¨jн~ÒÒý&jšßJÖÓ©¢¹U[Ó¢´¦/ÓÅwŒF7Rˆ´y„·¥‚Ò$ß×k(”tir¾'ª¿Šss3§¸>´“ÚY7ЊDoö3ª”¥Ø©Vn8[±Ù†ôßaøöIçy¿ê1@åv ÌÍ>ä'@!«6ùX¹wWi„µñwÈ–¿¤¦ '‰ÌLT‘Ý{m-œúVs!·lzfgŸMœ“¢q¸ÁoMç«ÞNJ $P±G™˜Ï®@Úï$FS\ÚQ¬ONÀaä;ºvE¸Ü†*§QdB6Ue@;ìù–® š–€_жưS¸C¨?#·ÞþÑc8’-·aИ™¿! pøaJØòR¼€pvZ¤ìuxKÚÀK¦DQÞŸWÕ{2“ÒzzO'è|–:]OR³¾_V8œC”<ÂÒò}ê>›‚ìêϳ[ÊÔt¶ÇR™¯oh¼+XÚM6PÐ]³Ïßgƒ³){„i zŠöO2 xI¢XgÍœ¼TêrÝ1'9„Ììñãœ#ºúmßD.I=To}Ru«ˆOYTˆ'ä¥J‘pŽËïªÉ¦N#C1sVÊ?$&m’¯Ô”®|åËœÇQ(ͲaØÛn¼…}t¬«ªÄè.Q/Ç'É_iù1(ïØÊÞØ„Œ˜—7sÃ+–‰ë)x; ôœíãÕß*¨¾"pé w@ß-qtx+»ªûÒ#)ìU“Äô-RhM´4£µàŸ¿Ók•NFEÕb²|b<’õ–v ªP”Ú2›ÄùŠÉ5KüµGWâ³î«qµy®ŠÅyÛïwB™Nfy/#Fü·¡§ L 6 ‡/ {-/o˜«ÄÜ•·Q‡Ðeâ@§&ªP§³3íõRž~&47#Áî®J"Ë·÷û俉òÔ"ªµ½ÜA“2TËO]äGÆÐ€3Ê6 >ÙŒÐï„¶N±9aFÌ…Žñ) ¶ÚîA'¿ä‚£¿èé…ÍTVס—ØýˆvɃrð¼ æÃB¦˜Q—˜ÿñ±o1h¾è‡KU󙟓×éã•­öÔêKŠ,Ï–î9KºáÊ‹r ™jX¤vljÈ9XQ¬0Ö-€ï¥]e`yîím¬*C–Î33>i²\þm¯ºõ;I¬®ˆQßé— %]½Ï_ÞÅÎ11ß„lqŠ<œ Ü±a㥾q"k:ÞôÒ*bt ²Å»x¸œs=Ÿñ’)a=¢é&vר^‚m& m4dºè²£ñìzÊz%ž\²d,¸+¦íLÜ‚™å´G#ý¨„*épl_¦XË6`v=ùp­"´áã9ô4Û/Üæ¿³^ ,׳p¾É*ZŒÞñDöcFɸ%ng‰Ðg»·É”1§’üútVõ¼_p)º,`tɃu¢ª€”©cJ}B«È%´ç$`¶ûRb=çU <ÜÊgØùS[aȱQ&–Ìçó}³±þ[ç/-Íß;šÈ"ÈJ‘åòò}XŸ}ËÅ‘H-ÀäK_„fKWzôôŽ~#ûS—ÈÐSþ:è¹ÊÇ4m©™×¸ËCöp÷ÐCï÷g-d„„®JdµM ›3§–·øJKæÏ,ü:Ó0mU²†Œ¸ˆcæÂFê7¿Þ雨¤ÌPÝ”õoéËÛoMÞÙK*&È9ÎY$ˆ<³œ\Ó"¢y‡1ßÂXÞŒ<—Ìgù\IQuûŽ@àÊ\CI·xX'd9ó~%‰1׎™—(Ø<øšúpðTž iïHŠšÍP‹˜E¹&öÒÂé Øã½èzÇüÊ%×ÑœÃ:M‹Ü¸=¬ž$°XʺÅÑÏ“†­:P&>˜é~%Ûú|clB‡=ÐÛLmR›ÿÝfÇ#š¼,í;¯Ë×ÀÞk[#j¢¢æÝhËn܉¹ ¿–« <ÁÇý©¥¸ÇŒƒ€·=j± £k‰u@¶œ :z›c`84AìÛ’¤¦±„N~-Òë‹hÆt9qÎdLfšçÍý ȘéùØ’A9sCö{ÁæýY–Xje¥…7Ñ NNH 'ƒ¾zÕY k:[ \D&=4È,›‰™.‡áSï퟊‡9cN ýô)±=Æqôñ5ÔGNìq Þ.ê‹Æ2—'× >R.=ö•Qo¾¹Jû ÌÍþµo*ØTÌ‚ö³f„éjw§š Ÿ‚ú}ÖÍ€û6_b£s¾ù‚•¹[)B’c™Ì¯*ôu僭 ˆáCs9dW>®¯åÅ„T.N!ú %ƒòciVæáç,äºéL¯øõ¹@à½~¼ŸçÁN £¯¯c¿õáà‰·Ä¦Ï[eÚFæP’#¤9°§ïÔõYEÎô>° ÏbÈnºòùÆDMj„pµQ•‹ ¼hU¦å›õˆOOtZðı–ײ߯W>·œÂðW!&ÿеIÏ)ºÚŠÕþ‰ä-Ù‰±¥¹'uduô’—hdÇP¢Éî·Üož }ZI Z–O}¹6Ÿfl¶™ncا˜<“‡ý•=e|$`2M‡ÙC‚Ö[ÍäÓ°N"ŒÁöÔû̾Œ×àQ9 €Ã}lL ÁEý¼ÕgºZúàÝòê(FûØ'‡&Ã1¾Ô˜ ½¬Š=º¬v¿ŽT9fÉö1†[Œ¦^¢ZJMˆ£RªÍ{+©¹µ ‡Â Abßä¶J…b \Š›ç;ñ¶v+Ò[]=Ú„ÕþÂ"’’wCÀ´Þ»ÃàØu—¬ï»t€l½ j/\×¹ýè@€‹¢‡|·¢väð}È‚iÖ¥^í¶¹q×Ô’TØïþZzƒ²EÚp¬1¾ô:éw£ZHLOEòºG§¦0fZ¤o²æ(Ëê&…Ï=íBµ‹_*ÊöJ’šÂ"G!`¥Â{d­’7 Ê÷Im ©ùTYZbƒ£Èµvoêšz òø*òª¶¹‡ägzÅŸ'x¹³Î8—ïû;Ê4úöšõ¯K—FÈõÂé2 •0cÓ¬N¦BlEô ¯ž;OLL8U‹›~ÂŽ£m¥©÷ ª±3k°óæðãìtvs(Æû×·.Ďи&ï¦Ó·¶oD‰-ß }kßÔ®Û”¯*Ùwzt6­bê iÅô`L§­§ß®Â_ì㯠e4ó½—Ò‹äD!¶Â4'r4©˜„×½%éÐ7UoÉšNBI²}—^¦pm÷Èâr C“k`¼¬C±þ ß"€xd;ƒ(ºN-±MítÖûF OÚ´C’Jò•Ú.å[A¦*kKxP¯b¦à’—Ü µª¡Yò³çOÆd”[ÛDëlýˆ…¡ S&*zn\i]âä&~öãÕàŒ>ÛEV<Î$~Zú´ŒÕ<¿ËŠ(‹|òÁÄþ*M%>Ö«£ÌXoAr²6õOmOv±1uhºç.i¶îë^_t> @ Z>$xèQ¯ò„á ÚäÕ¦Wç†>aKéš &»½3®@ÂÅ[x±P‡TÝÉ[žtÂñâ\¨{hVPÁ¢Ø¨×N´„"¡K3ò`PÚéûJƒl‘¯‡Þ:þ»{å™×Šªdï¨[KäU0Úi¶í‰š®¬S}Ń@@ᆱ¡·@Cn?—D¹ÑÖju²¡Úå`÷±ÓÞ=?bõ‰E.4ÛQ$ú`}ƒ6ÏîS­Â²¼ ø¦WÕG) ïÐ ÿõEœæËà•GcŸ•ÊSþGòçb_¦‚êõön›¬ôFºdŒc¤Ü^ÊÖç–¡Æi¼ç{ åxg†±¯Œx&Ù¡¨š÷| Á^‡’>¬t?m2fE‡0c¢OEÒÌÌ [›E·j`÷V—ìñc*:óχ»z®Wmì”ßèåŒ<$ý.Ý5ƒŒy—"êy |UÈÕµ8±î÷ŽÐ×Û<ö[ÕÏZÜúZ¨®ÓµiÛƒ6ÄØ&M^ g%;~Ä­”ê}Ïïô|KvÕãó³´¦k‰~E>äË÷÷óºo"ˆ²%»×’¸-d/±r°¯Sße»6xœ¿.x"#ZÀñsUìÑ\ÿèÐs­÷¹ö˜»sä‹Û+)|³þ­ùï¢b@T(ì§/q—1q“ƒÉÁBÈËǦ¼„Í0&zIY¾«^ààÇÊü%o4fdüܹ*0ºROçdÒ•'iØœÊO¯žýDézÅö‰Ç„«¤•YiÒH› b?sº2‡¾µBÏx;5†›ot>J¢h¬Û–f°“§»aÛŽÚi[fWNH)|[À£vã„6þ•½Ì÷} ž!Çk‘`ŠbЇà6°éã ólÃBÝS´çÒ´×&°mü´“%ßiQ¬Ëîí½Wèãö/C\@  ¯øxNïXn~ÄÃÅëóp+'lõ/| 9kâ6k—»Ïí»ëôhl‰ê:‚¼Bµó˜ImÅ ®v¶'³Þe7Qóîúþ1m Ç{[¦Jço@;búþe/@§^ô@@N;^Qvz·G}’¦Û|ädk+¸2h¸³­Lùx‡yæmýïƒÝÆÛ•t¾mm(S 1Ö¾ANL×Z„²šRöwmy¾€Ê÷D1Âh´”ç q²=m7ºß¨ó!ÇÙ'ù•)0¼xgLÁcfüS±t&e]¢µ8_±–i“tÇ«}T|5Œ(“³£Aк—‘¼×{ee*§A;þUäµh²9*ðøEOÀѦÄfð6vL™8 SS1"ËtÚ¢QÑå,³û¶¯ÆL=ÿŒñÛT â!Øí1?o*òGý•bÚ‘³Äˆ^à%?÷mg±ƒ‹º¨‘†Çû}ø¥½,Œ:.@wëMVøà˜ŒB ™t_™{[Æ\+é¼ö§°±7CÚën¬êŸKìgÜ<óTù°&H{ Î}79bW$m}£…t| ˜£b3;ÁjiŒ7Yl³xcöi8ïÃÌZIˬ¹áÒy®ƒ`³ŸÇ{Õt™’¦ã¥øá¸óS1y£8NÛ½éD*@ñ†Éù‘W}ùÇoÌi ܉Ÿôß…Š(8ŽZ¤ä&- jwL´yi‘Ah Òû\’Fü†ú¸*||±òµßœúiߦbI7o6I¦ÇLŒœ£f~¬ì&[T¸J@¤£RæAÍå¿B”fäq¾Ü«ÁÓ™@fÓX¶‘•gP•ð1,8(ö­M^I .Z¾âx\ø¨ýR(ï¶)ìc‹ÙϲEŒªœW__zèÕ ï:è´´Il6öíä%»Î ¥ø ¾òÔvý²—PSÁø13+þi)t¾j÷JöÂC˪ŶC)ÆØNÍùbîœËVvYé²7¾²ÈF¾l»ŸœOÁ˱ԺŽxC6ѾÚ'à‚U–Rµ4'ó²¾3µåÓ‡w&A¯Èü¯ÄRBÞ‡s,þ$ŒýôM1k'!üyÐ;¦¼E›Ü¢T®ûæùÁ:ö³/Œ*dçƒq¼m;O ËPr;ùQ’ºFi%c¬;Æ|9?d{{šUz>o´S¥¢ºo8¹OK- ÖxF"Ð N“ø”̘máÅÆ/s™„ à”ròÉ*Šdép(}ž5y²ÂUR…bÑ’EÔTõØm®”{.š}gû9ú„ ú¥Üà»x©Ó¶¯Ó½däy<4Ö½ >"<ÒYQ&eúu꡾§¦ÎôZ¯¿Ì$’J:"‹7úÈX³‰•Üç T©O¡G>½ää§¶ªR,¥ÇSÓ%wÊfÓðÞ&W¨ãÃ8Ô„`½xðŽL)o+°×è—ŸËÇÔLstpŠ ÝC‰{œEa÷)R—eÊNx}cv "@þƒTÅŠ4 XÙaíà˜ÐDžM.ݰ=yÝò-o éMpôsƒ$°ïìúã!X…wã¥{´K eã<â·W£w¯Eµ õ¥ñgjÄOõªüxs8CÑìe{rÂIø84´­ª* ’¨ ‚2–[:[?“Ï =‘Þ%½ò«oš¤®-Ȉô¯Œ cRPR•£å¼èz*ÌU/Òô³E¥e¼þÏ%ÙWð¾žûã´;…¬+W™˜xo~P'••@ý,!Îw¡^~:ˆWɾ±Þ©¬íKÓÚs•½dÌp¢ÃÕÖ=H¾÷’ξ‚&¬IvöÕâá’¸ÇùÛÕ¶&´/¸. Æ#¬.Ð;û…ç4)zU8@Æq”U¬¬q1:»ÄÄiƒî­à Î}V ‘” ‘Ém¤¥„MI»#{»éõªáYåkRï9—4bU$’RhÉÀÄŠEV¯þ…!íÑ26:Ò«íªÃþ‰•¨'QÕÌØYÞÔðRH"Wæ¾u%«- ¼#- ½êŽÜ+1Z¿Ý³5ÏHƬ€yÖλ¾"R'z½A»KXî/Î'±oÉ é]º z[?»«¸ÿ¶eMaa×å£Ü„ ŠGõ!ºJM±P¡½Gg—–YX‘Å"¥«ÅŒÖˆ¼¿SA+/‚Ûßþ)CáÕ:aZÀ çg_![S²6ÏuÃ?ÃÄ3M¿¼ycà§s$å¶ös·æƒÀê×*°LZÒÂOü£ltTJ58½1ªoGê4Ÿ®ÛŠ¢D‡\¾´{é5¦s½QSBä±%g¤äVĦÿxUðÞ|æ2V’™X/×^•~?lÀÔêæ^úݸxŸ ¯јf‹¤7|wâÅ>ù@’Ñ£f÷%0éˆâœ-+kÛ7¦ûJ>kR]¿¸$i™žœ¸¼ôÍú?,¡º9¤õKM-^Ûó_ù¾Æ—4Ô8²WxG³Í“ r¢Òw¹Ëð¿–oa¦zkËecLŸ)FäD0&•3kCÜ•ž=@ÌÊ"\¦ÄÏa­Ëi+Ï«×Ù”t·&Êʧ¤ "Ö"u¢!³%eÉ£*ù9ý“,˜2ëTørÞË8!§g¸8›ˆáˆÕUK¤§3kNüúƒêŒýdÙ ÿ‰ÆÔég‹Wvíá³×LÄҊ܉Þi‰[Úwû‰¦Õ!ósõ¥o ŠêÒoNÓd‚­!~‘?¼ôówB¬xÊßqpÄÐÇÖKï|Çüœ=à/ñuCØl‡F,u@áYŽî~jæ½ã™2y·+3ÞóIãÍ|£ëñüSé’œ6¯—Wê†ú9»ÀAµèn­ä^”±ˆ}º“ظäþmxÍ".y¶BŸªÞ0õã¹—>XêÇÂÛv#;. Û9_­†\•h­‰ôþ9Åæà¤ÁÃ;öûºÄ5ÜxèŽ$ŠŽcY-¤$¦.D‹†}Ë=‡NFEk¯qf\²w§šãþj蓇NèQô[æšÐy…¤Ô‡ÙíØ­K.Á•÷ù,`˜êG­ÍúîªØÖ" ySçx\”‚ÞY1öi%¥C[ô¾û…À“uj"ú– ,¯Dñt¬ì­´Jþ÷܈ù QæÂTx3 ¤"UZ~_Ô[„?-ÌÞ*œUS|çùÁ7ؘŽ&Þ›úŠå¡s´k¯HÜ-†6)M”…úÇÃM«q›;LGå Â3EIó󘞎øI]R…Z—ƒèº‘,Ú` ’K h:ö‹É)]Œ6 ÓòO|Êt ŽØôªýIØôš¤$”¶Nn†(ˆ@¥¹¥ß&·ýs0“w\û?NÛŸDf¢'Eá ~¤ýß'*>ùú1…Z¶×^ž ëTs''‡¤N©€¯Á©ûäâ5$ØîÊ6˜tio~µ&YGõÀm…R@w“v„@~°Ãì»儉uaÉþÖê4NK»\¨œþOkL’ë%ÊÏ(Z½.‘´ìX1À†Róôûío—õN4°èèŽÅG$ÒÀÄÉç±ÁÏÓÒ"(•ØYl¬w.´´–È^Zæ™ØŠ))·Òß9oWÆÎkÞ*+V¶E½Tˆó¬JdÊӱˆ.#Ì'ú²’! ´X¯­Ÿ%/ØT:t ll¾+Î@© ˆržÛIžm…&pÖ],€IøzÐŽXn½'6Þeæ_(ŸÈ˜ç^XÏ Ì~èµàɘ[çóè]ŶgêûΠp”ÌMØ}ø"˜(Üz³XS-²bØ>éQØD+½rtÄròúÈ åÔÕÈ´IGÔèà]áŒ#:Ïwo¥)dX¿9oVщM’ÓXÖA MÜíaj 4qGJ'<3¨ý~aop {xÙ³lJþâ.o5D‰]ÿºœ~³@4m¬÷Ãs:¨ªWŠ¡„3:ãï+Üv§öé®H•Cže^³5Pÿô}nd#ƒÿ¼ÂHä½:µÊ1º÷ sS‘ç Ù4^„ZßñgGxÕúѥ΋ÒV—ªPd÷JÌeþvžTê{ºß,TaëÃ7$árW“|K7nᜌ,rE1áh]§›¨ý_‚H^ àæp_«hLÉÙë_M$øŒ±~ ·cL’ÎÒÕªŽ¯z¢lbxÌ5€ÍÉ·¸Ðí5§.lÊ¥vºÞË̯_bÞõÉ,p$"¸/çúÑ9­é“Ȥã^é–Ël;×Ó=G§ˆ¬gO¯§Î¾½ùJÔ)KB˜kh-Ê•±)ÅSð…âa|2¾ôSÅŽÜulÒrŽ)ºé¼oñÆ–Wà¡ï1~S‘`óÀ¨í>ÙUרº@_IJ[ü¾é±´uqñòl¯ŽdW¾ÂéÑ· ˆ÷O.×ÚÈ¢ú…ºU‡c´ø|ÏÄ;sײ©™Â¿h—>Xoyg÷æøpð“i@IÏÀu ‰¾ö¼¶‚¸éƒq‘bG,þÁ±êãCA¾hÙÁ›6ìª22ûÉ}¬Tëé±Ô,^:)X°¨ “Éäöçª*³GR'É6eÝ;»ŸÆ 9Qžl[\»Sf)ǵçð+}/"þLމœ‘“Ó!hjR?³ñ†äÚØÝ¼”`LÎ 5Ÿ.Y`<–S‰µ>î|êÿnq†ñ=šõyÝ‚è°#?†Ê—ú¦îQKäÜ¥x÷ekÙ¼FW&jHI¬WÊ”œ¤•«Êôi*FÞ=‰(”bViÛ_,WË<¿hœ;à ð±g²£Á9Ä`wŽf1”>t ëÜŒ £E\\à+q̱*ëàZ_ô1lQ+n Õ^SûJó²PöØø-ZraÈþpo¸dX›žŒb[#ñ¾^Ç èÈayª“µ,ЊNcˆØRDþl Ÿ…Yÿ#¬-|=ý¾¯zdM'-Fߥ&†¢(ÆÁ‹+e["Í4fF$ËmLäYe±KÌ·<´kÿ'Ú›Q÷ƒœ¦VøüÃŽJ%yÊÈ£$µÂóQúQr;ú#+d8D@V® ’ÃÙ£$ÙúåöÊŒ]ÆB˼€5ÅÅB}±Ôî›[šzòÔ‰¬¥¼c ÃÛqÿ¶©)ü}û£E~ÏŸ ƒÑC³TFP!¶ìÓÇ$ÀNýu±4µ«&#…W±ŒAý#¶JËoxUû?´ŠhöŠ<“ð²ð>-Mø–ƒ†ÛºÍ`€r?UùÅ'ÿÅlÅEa0-9R¦¼3y¦™n½)Fqö‘@Æ™û#ÚGhK/m0Ž—¤v|ͤ”ž±¼’¦¤Å¼+¤#| si穵åð:ט>Ë<Êšw]9¦#ò—êU¡C`Ññö#lBksú΀0g§åáy¸)sípjÈxW2êÁbˆ”ñö&[ôíR¬—¾#<FÓ­ïûÒÉå¤ñoˆ%\Í¥Óeõˆ&d° ’%éðR$¡„G1jÌŒ”ÞS*š-ðé§Y»ó?Ì…Q¶Î1^éqp,q—¡ð4…=xzíßJ™d·Ýq ë¨DsѸ!´ÝÒÅ5x1‡ÉÔªül1ñU‚ØoÖ8,t…&ª7*Q¾õšQö«¿¢þúìXñ££Œ ’+­˜#L—ꉧ´Öœ]yQ>£x²¹ß§Ê•IÁûáݰWO>ª‰RÃTö ¤gШ³!¯‡¢]rtËÇtÕDU7í±Gå“ÍÞŽÚÁ|\‚×Ë?®µÐ=85t³O>ŒRï“-æ+\ŠòJ²p2î7ïy HERÈî‰﵃²k«aíŸçPC?;œz†t ˆúJ0ÇxÂÈG¥è[øqn)ñÀ¢RKÕsví¡"s”•ïé»íâA¦|ôÕ“»ÖÚÞ%þ‰%3õÊc }7Oüw 4j/öãh#G¤“¨ßÒ=|/åû,Qn·Þ¶K5†Lnpü ).n¨l™x @Çž%‘pÈOƒË²’º–æ»…xLVl±©§Aöµ~…kÜ.´c2Ý’?Ý^Þj|˜'\Æ•ˆ$¼ÍMhÚd3ôûùJѧtIÅV‘§jØ;Ïjvd7%Îr»×7$>H‡õ\laÒ9ÎD½O&'å ¥E†0Òa=ª >¿®<£éÊ“ ´¶ÑwÕ­$%|$žo'§Ã ÏÞÅxƒ`¾?EƛߊÛ|·–MïJâ8»½.WáÃ1JI?Zbˆ[,ŸetCÐàxÙ²…›aÍ‚ ÙJ¾&|o•;u’±!ÅÞ¤ö„‰ŒG~˜ŒºPéÒà¾`)jVÖ܉h£‚Oœ`ÔTÜòLù\eô ¿êWÔðØhÍÒÌuÖZ÷›qF GãñÙë$‚©Þñé骦?ƒ”¯ ‰ÜL™¯820Eó•[æ¿ø„89"®í·vÿIÞÖO÷õZ;0CDÑó—•7:AZ@¨ïæs’4f%nõ§[s®rî¸ÓšDc%¦fß Gý†0 ’E—6(†ï³ɾÓz»šà!šR~#~%G˜öN¤ò™•²vÚ|¯kíxæì<õ$² õFi¢7nA£[# ÐöøêìÓKBŠÌjï ’mü#j—ª¹š—ïÕ‰?Îy>©ä1¥Î] †à+£ºD`ì.Ä ¼Ï¹­ÿ"œx…¥yë¦ç–rÙ_`qK­rââíqí3îîu•õ¶š‹Ó÷8L´¹|¼ó謭ÜôCš NÀ¢«Œ]ìø]æ [#(»L“¦JéÛlΩò§ "ÔLðÛdÿ%Kz¥çâŸIß~¨R …Dó\Ä/åÛ,{‚“@âP†¯Ÿ‡)w€eÎy\ñ¤™“Ø$Y'?ÞôëJ*§ãø=!ò¯?˜VM°Ö®Í{µúm€¾X0±œ5ûe[çË´®œÄêæ›ù2œj𮑴xª¹R8]5ýÃ:ð>ÆW1f#^@à‹N$Ù’&0&Q šŒô=F‡1R"ù^å@tÄûh_|½•rµ®Á[äž÷üL"»¶Ê¥êàªuœíŠ;ŸéŒo‰4ï¬(.Åú¨\xÏvµ Ü䪒(4_K±íxÒ-}œãœZ²…Z£z§Ê–*{u±üZɯf1P•å·,1´BƒSÿë…X H(ÂÐp„6?œIPÚÒ)Ñúqät?Q¢¾àQ" ¾Úr»ÏÑÎåaƒjÿÕœñêOÉ|ßús 0ƒ°.ñî†ËPš@V íS£óS)Â]±¯ ˜zÛK¹@ºúLç3{lð.MÁ~äö™À—~Ïõâû¥§TAak–×Gµ[TZvAl5Š¡Ï´ÈŠ9±&ÙÀòÚË ×ÜÝŠk¥©ï/"ê ?¶?Û¢õæ£QgOÅFýñ¥Ä¸´ljm¦Š8‰mÞPz3ÿTÕW°L¥·ònÃÞ:š´dûëÑ8¬¬Å¯uÃéRèM,»ôœEÔ—?j§ZÉk ”Ó‘<ïX¿¸{éOŠlÜøôh-û8óæëäRÒuZ˜¢”"á*9 ªÔ>+ŽÁô,õuAæ‡cÿô;í·ToN.“ùƒkR_ÑûÌÖÉvNÿÔNsW endstream endobj 316 0 obj << /Length1 1417 /Length2 6418 /Length3 0 /Length 7370 /Filter /FlateDecode >> stream xÚTuX“íÛ%tÒ!Ò“ÚèFîîpŒ#6£œ€´HwwIJ‰(H#ÝÒ- %Ò!úÖïý}ßß±ãxö\×u^ußçù°<ÐÔá’¶BZÂä‘4˜$ |¢¦£#cA >nˆÀ¢ G;Àþ‰Xôa(8!ú˜'(}í“… ¯¡jHPÙÕæ‚EÁB¢ ù ˆD‰e!np+ 7P‰€¹Xž kæÇHÿå0ÓDõFñÆS@ŒûâÅΞ®Y’vº–P_e7¿Õ]æ 4‰œX­,?ÞýÙ‹ÌB·­RŒ¥Ùã-«Ž’)Ïib9©ÚÕ-ºû·£¹0mò­“çª9È„âd[>|†Ö3MLßHËbˆC>ßö¥ª”Ë­1ù~ð†.ô•» äÓlŽ˜×=¶`/ Ãu»&6ºXSµ:,¸Ç*s¶–°ý¥ìÛ*ú~^òˆ ‹’•c3³LS}н4ýDtù7ú¤‡³ŽV7­¤?…™É‡× çfÇŸ~ ®,ï‰3»5sSÁÞ×6¡¹Ix©LÔæ…Ò\„ºÏãs®Ï´›±ö8ÛvH¥{^ZŠÞFæ÷ÁÁãl“%{"«ÐåO¾2ÀÑR„¾;Ín@ˆDWæ@ !Éa¿ï†.ç*öQÌè=ÞÏ€Cù;ÌY5xhG» ºß°·Eûù󢈲U_k¥É¯“GÏ3ìàLíðãã­{ ±´+hûo¥ òn`ø½¬ÛØ"E í»Aߨ[yãSº_Ÿ+p©Ÿ=µynåêMvúê-B .F÷TÛüBËû”vyáÇo†nIð„JÈ]–%[ú‡Õõ;_VHíâÏO†œ”".ñf?uJ2—¥ËÑ: ”I~uUÈY¿j”WË¥ kÁ5颎ª~“)ey¢jÑ -Ô Lž «xØo}Vtó¼ j¡åkLɂߛ¯iwê´+2vÛ‡€/RV¤8ÐðLªPÜ))åÿÐ'ñóúÖ ä"…ß`Z9ènIÎJU+~œh¹G ƈÕ“rz‚÷â}ÆÞNéN"ÞIr™Ÿ"‹w²üx«ÑÒï\)†E(óû«CŸºÛJß7=šÏ!ñ>‡ÐvY©ŒÌùß2Îvù"1Tž¼ÑËþUnÐÿ)ƒ£—d‘Í×ëûB‚Æþ“.}ú­#CsY_ñ>ª|®³Ÿî?w9"öcªºR%Ð<–„u#FRÒåÎaé¸?‹7ÊÕóÝLÙ ä|Hšø;À#ûd᜙®œ·J8ºœ}¼|k^½6ÂM’€‚f1I|¸º`%F*¿\MN„{+Ñuq\™nÕÌ1}ãŽ?j’’'¬®SK¬k½µÖf[g¯ÇtìÕÌþ½qèûèÛ¦WoGŽc¨èÉH252 äç·ˆžy¼é„žo"ô·ŽZߊ=c5rï#½AKmõ>¬ít‰*ú:6"‰äw$Ã$—.^´ÉA:QNNk«bxoð?ÂÖ¨žM—~ôÑçï7YfTÛ<Ö)5kFlúyt^2z]uˆÑÎL»™ÆïZÁf-ò5R²UþLL‹Œ´ÀJÐfZWzÝa‚wZ–ú¢‡8¢]XÂ|-ãï­ kPw¥'ZøX”aœ*\3„ÑÈÉ4ÓH#Á‹%ÈÿŽ‚ßÒeá8¨Œ…ÿ4Ü ófÌ…æ †Læ\Õ7X`˜j]'ì>$b¿§Æ¸Ü mÎû›£‹Zì®9BfdÊöï=›ñ›ˆ}C»!ã»J^gî©k–¿ uZ7ß óà=ï)£¯ðÙîG:l?›5&µwkS0NÏæ:‘«Œ»ýòdvþüß“^ùE¾BDZÍ+<ˆëš ó aJ'.î¸!Æç¹^濃“ï{Z÷¸î+Ÿ@¦fÖÚÆU }[IßCÉx¥æ­¿h™7dÅK¡ `2oλ§OÍÜQE_ôŽë¥VG‡Î©ã+ƒÓKã«‘{zž÷Ä|—€Ä¶`TÎà”ØžœÛ7­0CX­åbX*“÷¡ÕñíA}”¿Ä”¶fåñÊD",é—¬YI)üVðtXŸÕ³nå™­Ý~'ß<­¦6ÞZ éP2+vlì&ù"Gçj#l¸îb·=nß^2k´^Vy’µ/l‰ÂY<ƒ UøcJóýCvtÊ—ætÃ[&Wü ÑÕ1I<@÷`™‡ãpnp}‚áìåmqgPoìBŸºÒyˆ)a—ÿòþþ¶Ät5 Fm¢¾CSb^‰-9>E5q_P>™M‚çÏíÞ‚GcR'5\vÊòæi=íþü=yűRîÇ_Ëk¿¯˜‚h-­‹OJþ¹˜~wš-p9 ‹2†.ú¶éÐXG•{AC£ùœØoï‡ôÍùmGlhµ:ž™«Üÿi/Ì$01.°ì+Úz±e|°­“:e€Ó‚Ù¬Ü!Ä1qÐúÑþ>|L=-1—Þóõᥴ› ——­Ç1µÓŠ“cÒ8n®‹Ã¦j¦Ž®°c¹œÁNYÖÝ6kßp+œó㣇g|vc©ÕêSÆ…ÈsÕüËrr‡¹ŠäñÏ2Å Ò ×èZqö±‡Ëºƒƒ †ÏfÕ¹w–§%"Ô¢FJ$uá¨Ù)z•'ê€9ç§=‡ŒVUzh±éÜE/º=Ó£¶nšçMr5<¡›Z>qŽ Z'òÄ'…8ð}(D¢«•8Ègà üªÊ*Mɺˆþ>î0IºµÁ¡$‰^Ý[êùfA¤ñ”¤D±W²Ç5“q{1é¢õ^ oDY}=dƒ¬TïþmVE v’‡ååh%©¬ÖØãm›ï–1pj-¾ÀóÒâáýœ7¾*ãÚ§!?aÊ—¸—˜í,Ù‹ƒ/*‡µäduQì£CøÔXµó”ñ]M›÷ɤ»eÛ~¢¥Ùœ "\6ü¢2W‚3Ick%ßðzF¬³«µo¯÷Ëî+§‡P呸¢bLRfw{`4ïðPJO”º wwê›ãžÄš?4øÀ!ñK¯RÞ0XŠzJ¯ Å”=JOßÖÎ-%S›E9‹ˆ;0Æ5kˆµžÊUD.p<ꪤÞ'l]ør|“ ë-ã(Òû6LW‰1eé&æP.ˆÄ“у‡ÙO¢J"ò[òcµŸÛ¸ÏÂò>·Šð»pé'cɬáÂ<›;‡iÞ¨öiV<æÞ¼âÅ“®ØZ\rŠü¬ôúa̹µõ¶…A {<¹>Ý'AŠç ÷¬z¬o›Œ>ú¬ý8É'ÏUíÉŠÒîw^·ù [›š. ÷^Ç{=JzQjž¢Å^Pz®6Ê/0- MÀù²q³`ß)e]½öØ oiúx¯á xIÆçTƒMÞxºTÉ*¬ý6ö\žîNl¸¿Ž[ª¯ ÿTÜã1ßNK‹äj<ὂ€ÚJÀ†ªòÙfä+ ‚j:Ý•\²€9óKåÏiÏ4ÔoÐ $TµXߨ6·'$f]¡JB-”§;͉Aïö(Ú›ŠsZð…•‰Ù˜.>ïê?[¹¬ã=œ\d+0Œ7þ`h)ëæiÚ¦f[¿JØÈq#¯h>øpC!$ß’÷!µÈ=Zhé\µFw¬Ïõ!FpQÇ\3y¿ëÙ¬-(°tmÑ×=ž—‘ Ã6º³õ}érM´qò86£rZØJ¦Å8âþ â-¶7íº±'xX©ËÈ`3}k-3-"¢¿ÝmŸg!s$Yf°rqrڦʓB¤>;Ÿ…´ÚŽÙPã ]t‚âž:?ÇÍ’®¬ïXsõÁ×½1»>³ì£çs :(áâ.—è`»LžKñ“=ŠÍä%ÍÎÉ5Sþü`‚.¢6-}Šzµ¿xá~iÞuÏ£_Eꉚ´{@›¶üØTY?ÿTCÐ ©Oø+ǧøF[½gWð9fRÙ,! Ætý°ÀV%ÛÜY0ÉmÖÃ’´Ài= [ƒ‘‚ßž¦Ä'²‹¯´Ž2˜à¨S»˜pxuð§2M£UòG?´ù õI´¾±ôÞÇ”ƒ‘ŽKª7ÃúßÒr&þèȦ.ÈKÀ_¹4 9ÔÏêØt;8Õ8I•lЯ”Š‚…zhµ`Ì0¡ž~ãaZÓHãûãÂÎÉí‹Ìú¯úq³u–ŽIÓˆ¤šjÄgóDY@nÃ=OÍXÞ ](ytЭ4š‰L¦3zT`ŽIm+4“†»Ü኶dUo¡=œ÷7oP\öoâ¾›’Y7µ³ zTkëW£ðɺ·ÜÚÝ1È [É«!g‰hÀÜ9éƒ)ª$¢Uï‹N|ýfÍÖ¨cÒLÑЇX>T3<%p¼ÈX8´•¬¾:I žç®Š{ÐCØ9õ¥öÉÓñ‚íÌœ#½[8‘†c{‘cF]î—u›’bÑL£=©«p㘸—Ý÷p¶^‰üã§F8²[Œ»bøœ_› /%®ù/‚¶„|àVÎ0kØ–ÝãËçj@ºÕTM“G_œ®ûP!VOr:Zr¿¹šR–Ð`Il)½‘zKä§'>ñLJ PØÖ õ”ל ·.)·1îìsþ®¯7ãrñyÉxk,ëñš¾4Æv8.={sÅiÝÆvh-aã2¼üií©ÏêBF:ç¹íSë^u ×ÑúgƒÁ…{Ÿcò¼©#H(^5FdÔ±Jë»É,1¶BÎCdöёՕ‡“†ŸÂ§}!hsa­"Vƒ'DË]Jô”¦Ñ²MD©±½ó¾¥ž9ñldÞü&å¨4§î*3£›Ú/NkÈïÉ^—cCéð7!D5^˜áƒ‡â}¨Pê9ü¥‡Þ&µ=Ö}¡Á_>Üù‘ÕîÃC~' 5ÛRä#Ó "¬Éò¼úƒè.µC‰öÜkóQZüsÖÉž†¥˜—# Ã?z¸©Ÿ-éí†ÍrËnù}îΑꨓÄ*ìÞ¢H¢sŸ¥޵à ±ôœ9æÕ8 Åç(Zöê&:r}—Ùúæj[r¶½«V¥4pï&¿j]^¹ß¥Ëô½îÚRJS“¯ˆCîÿAÓ4œ®TÊ«cóÛ„¢/qfº-œ*lœF¨¸w~²ÌRü¡nHÅ^ù,oÏb!à«UiÓÐíûì?5öM;7ÛZÆEåÎv^*"ƒø Å6ϹºêýVÃ7ðÌ­w¿YÇõ%*%Â%wíóÙ4)+v¾X9Ȫ‹zƒ"ÐnZà&•èeÃdõ9qõË pòH±(½p}TgÔLl_ݸªgàRK¹"|ôxùŒÖ¥ÈM&êäü\Þ8ýø)#;Ÿ÷ú÷ T÷»x©þäÄÙSþ²EQ7ªÎeè‚Äc¹“™„yG‰pÁ4½ì¼Áï¹ßŒó'âìyœE$„÷…RʵÜln¼)Ç v iXobÌP§1ÉtÏ ]L;šlsâÇf$l“k¿ 4‘£ÝºGùú™ €˜î'IÐgz‚W‚n4I$IÕO_Ë6¢k­’ǔ݋״UlGA“Âs2¼º¯FÔ„¦ïÝ)бʯì±é“1¤íúìÓ¤>{æÆ6>[1ª±Gv÷×a¥N¢” V£š/tÝó úå|U7˜(½-†Ì*„†Kw‡äÍr-dl°Áa4¸/mQd¹Ûüdõ°y¸gïŸ(pt¦>y?³¡¸ÙÏLK;¡áù ËÒƒ>Ž ÎÁ¢Ô^g*ÍaÛáL[áãf—ÇŸFaÁó$úG¢”ܧ‚ÍÔ®ã ̪D~]Í@I\Ú4}­Â~t€ …Λ©¥ÈÖúꇳÄxö8ý~w¼tÔë,t_—u³3½ŒÀÂö>3xÅý÷·ÝeÔ§ãä"?Å…jˆÂ¡o7íºø„(×ÄÍš m[‡ é:õ7¡°Î†îrQfrÜ@Sãgø©ÌÍü+B?¬Ù?8¬b~˜éQˆ<Ê3JY߉^mjýrhéJ¡QxFPæt¨úÛƒxŸ#5ï4즂ƒNó=U©±Êá³°µó¶Eãõ4åÞèñ0¥]kç¶."Oñ¯Žq±Ýúõ÷(?‰H¬¯&ºûºç#“ï¦*Âåb³uÒ ¶Ís¤Uønu®lÍ^ù Lܹ›ÝAYË;µ xö^˜§÷ÕÝS¯…ªfÑ•I‚§YMš­–;½)áÒFªWÊàdÖ”Üà×µÉÓË›Ç L¸2Œ5n_ŒP:ßšÌ`»…ÓI¾/¿¢Z={Õ9×רÌ,%à‘T D^±*¤w‘µ›ùÔ&Už.ß"§¦{–¬×,é¿o!ö5vêü;çtkçëÑ1G~JÂàDúé«h²꒥\ù@¥†ûƒÒãÔŸ—Ñq¹¶bA¦O«¤³Ñ_ PWªhèOÓŨà ×ç[¹ÎÚݽ¡B\tãÓ/ÜFaïVŸÜäE˜|Žš.}U5^Ëë2·Õ’z•&ÿe›Yú|Õ[Ñû‘¥^s§J¨%ok‡†-ó²òæÖ¾^ÅÂÊ*ÄåÊMéŠü|çÃ[O,NiÖUÇ%w­Á Olîdº:œ}ª}·;}ªFäƒ÷uà«·–ö„g·i‰>n év Ï sw5¬8HS1ì Ï*û%%¸›às†ÍEO¹§mðºæ¶ÔÇ'ŒçÌ?¾Êè¼»ÓÚÖõîV OÉŽ³›ö©­|ó¡ÌÞäsê¯\Áïj0dKòkòžRÙ-))h77–¿;ÖÐÞÒhÑÖt^‹déÚa/­Ià“­Í|Ö‚ËáÑž>Â@Æð$»mm¥/à{ކ{=ßœQ)3ñâS?Ó`›4‘À)=Ÿ2V?MúÉ‹îv*úŒâä‹ÝÈ™£‹X¯U™œ?ÔZ¤XØ«à7¯í5R×îï­hŠ›A©EÔ)ÝOÿ<[¤~A«YG²¹yßÌ^ùEKÓkÖ•=sKÑ„3UyO"^nWבteS$Z®#KÏŒO¤Šöàåªö¿FqWì ‹Ì}Ô9A%C}]òtÅ I6níéhT»=uñXncòÈ臭ÿÃ(ý¨Ðê鹞~RnlQ¸d? Ž@›‡L{ÌüÚÆtp§¥ûnLS}R– ïìk‚…ªH€ÞaÜ£újQ)]Æ¡^Ã:ï^…qNAr†[ÓãáÑ’/€¢–eù»Ì 5œŠÄ#?1ûU3)—Æ/'_Í+f9¢Kã²ÒŸ.EÙ§„ÎÝ'1XÔ̧kx‡z\ÞܸK«d%N×-ýlpØ7còª†HPi¡Ò.H~¾d˜U«ô]›Þé+ ºŸ+šùöÞÃõ°M%6{[Ù Ý„û8ƒO”_ùß§õžv¥ º™„EŒœnÓØT@¨½£Zù9Sxb¿UXÔW\ÙÕÞ-Áç¦Æ>‘í Ž&– ÊcR:®\kÜ*™c¹@M¿ÿÎdO*q¯A€ƒ°ÏÿÝgÂüþ­²¦N­ÅÍð!¨Â!iš\Yådm}ê]ÔÈéaµ„!é+Õ w†WRé4“ëcé #ílÉÃ’û+’ØÌ'á-áÜÅfôXÚ¢-Ì㜄+À%çwÖ,(&'åÖ½tA^6¤^H*8"pÇ:C´Áƒ³ØÃ«(ó­Th §´Øÿ6ïýñü§aUÐï,øå­ûý¨¯ÇUÔ~41ÄH[ˆ“JÈÕQíøœ“ wRý@ÌUMn+ïçTÐ÷;kGÖa¦â´óܲÑûòÇAN9Z}ChÏÍÄ,zµ76êÙ2¯r—–$k§iWM¦ï{(º”"Æ¢ eü¤ð8¶±}UÌvoá7O6¿`Ó=@KÖû òå \'P¡ÖP¼2–&‹Xú–¹áQ\¾ìúX¥„;O˜èݯS¦¢™VŽ.ñǯ:<ä˜`âÂUYQê¾§bäs+¿‰ÿòǬ€Á endstream endobj 318 0 obj << /Length1 1745 /Length2 12191 /Length3 0 /Length 13295 /Filter /FlateDecode >> stream xÚôPœÛÒ€ Cà4nƒ»;ÁÝ‚ 0À‡Á5¸;!wwî!¸»C°àî—-çì}¾ÿ¯º·¨Þ§uu¯îEE®¬Æ$jjk –²µ2±2³ðÄÔeYY,,ìÌ,,l(TTê¨ø?r*M°ƒ#ÄÖ†ï_â`ôE&‚¾*ØÚ>8YXÙ¬\|¬Ü|,,6ÞÿÚ:ð$@ÎS€3àƒ­ Ø…JÜÖÎÍbn}ÉóŸO­ €•——›ñOw€¨5Øb²(€ `ë—Œ& +€š­  uûŸ´P¨èââ ²vd¶u0¢c¸@ U°#ØÁl ø£d€"ÈüwiÌ(Tu ˆã_ 5[3¨ È xXALÀ6Ž/.N6¦`ÀKv€š¬<@Éló—±ü_Œ€¿›`efýo¸¿½ÿ±ùÓdbbkm²qƒØ˜Ì V`€’”<3ÔÊÙ˜þa²r´}ñ9ƒ V ãƒ?H‰ª@/þ]Ÿ£‰ÄêÈì±ú£Fàa^Ú,ic*nkm ¶:¢üq> ˆØä¥ïnÀ¿/×ÒÆÖÅÆã?d±15û£ S'; † ÄÞ ,+ñ·Í‹å™9 àdaaáaã€í`W à ÔÝìÀ*Yÿ¿Ôàåagk0{)ì1¿üCñp9ƒP'°—Ç¿ÿK(¬¬Sˆ ` 6‡Ø üýE 6û‹_îßâ Ðcy?VËÿýÒ™0S[+·Ìÿ¼b †²’´ºÃß%ÿW)&fë ð`bç0±q²XYÙ8Ü/^ÿGùûÿò•µ1³ðþuÜ—>ýçÈÎÏíß BøßXж/“ Ðþ3èY8YL^~Xÿ?ûŸ.ÿÿ¦ü(ÿ¯ƒþO$ådeõ§žö/ƒÿ=Èbåö·ÅËä:A_¶@Áöelþ¯©ø¯ÕU›Bœ¬ÿ¯V zÙQó—‰fbå`fáøKq”‚¸‚M•!P‹¿¦æ/¹Æûf±+Û:Bþxa^¼XXþîeÉL,_^Ç—ÑüS~Ù¡ÿÍ+icbkúDz±qr@ 7”—»~!N€ëËVš‚]ÿfÙÆúâx©Ñ `fë€òÇÅrq€bˆþ"nPü¿ÄÍJýC/:…ˆTü/ñ¼X*ÿCl ê‰÷Åô½øÿC¼ É‰óEgbkõÒŠÿHX_Fþ¾D6ûr€ÿBNò/| gõ/|Éeý¾l ð_‰^vhû/|Id÷/|Iäð/|Iäø/|é!ô_øR°Ó¿ð%¯Ë?Èö’ÈíOüŸ{4qrpxyÔþ\¸—Kþÿù‚‚Á®`”ù[þ€OÕ-7•¢Ä.LÛ#lè}gaHZ[’DÎ;*~â·çì9ás¢S¿Âo×pØ Ÿ,µñY, V=“Ãùðçk[ÌŒ7=ÇpïåØ~ɵ·ë±Û˜šã7ªþp¹™¤#`´?ÝžNÝ“ n,¿.³8~MSÿ›íÕHdøkBv´W­¢©­åbU¢“Sm²”Žg"#‡ñï¤ön“{Ù87úŠa!ëÉÄûûèvr©ûB_w»¸ÞÊ&©¶º$ ïchý.Z>Ó;© ¿çO“Ý;“9ÛŠ”U5o”é_ƒëM‚_‹¡8YCÍp5¦Ù0à§o—(ü6Ÿ¨žçÎÎISÜUR"ýFP µgYjüw@5s¶œ§|ÕÀxœºcbÚdrã`Ê›zeµsYÖqäÁp‡(£Xë»MU˜ôÈןf­ —ýF¡U¹-ݘ2¨Tä˜a§÷¤ïý4sI<¹F†¤y!YxIC÷À`Óœ8àLÕQ·é]¦í ëy_Ö`¸¡tHÏ JWhzÍYžÂ§v÷…©°€0Û|§>Ø zÖ¼.âADX4¦3y™f*‹â﹘íˆ=1›|lÚ$ Ö¨xBèþPõòœòÅ*íD+é9ðFÕYlj‰×h–}¤ c Hi¢GHÍ W—÷ñªpصöêâžçKÊ„š H åiµRJö7² Íy•Xá˜å]$6˜³’Rv®b§\ØÂÁ#/œj'ïœê˜ Ҳ͜/¼—íÛÝUï‡ _›1ãœMþ(Ù|ëÓŒ.M:‰ÖpPô{ësÖ…Y1ÎÂ]Fq2$›üQ±†¾m÷D%sñ—¿Gšã-".‹.-åÈÞ´¶ó[z­ÇÈeø§y›rd í' þ·y̽ 2níþ ÎWÞ¯’ÝwdúPÛÕ×1/?å' ûôÜ¿[ÿ†h€2-oQVž/ Å÷Âz½‰KݶÃ(ª\ƒ©zyò[ÑMàË«°¾9¶³+n†¦âJa"¿°ê­hQFÅrl´,Q¶½Æetº`ƒÆ <½Ò®Ë,LU€ùƒæ¢kZ a?îÒ OþEÁ@IË9áÉœ z}e4'­W‚ç::G¢ÀëH]ßÏMhO…D/8[Aÿ˜‰ä—ó]J”ê@$Æ23j‚lí|ÂèûªD?Ýü¼ç³ÛàU¾ÀÇûPªÕx›Q-Z\N'YüUê‰ÓYä\3­Êh‰~Ò­>BÛ>;Ùå+ã³½¢tMŒWuãjÞ¾J—Eåuè»Ô F{kÚŽÒ¢5›T;˜±}ÃIãGÍÏuQšÜÜ8åï3ß'¿V Ë‚¢ÁˋÒš§M}WU}dÏ^ôR0ñ2ê:û›ûø9Yº¨â#ÐbÜÆAƵ†÷=l„à“WìX/åmÆV*zû•iјæº~y}QŽN¡Ð }ADÇHÊ«A #>sbóo¹; ×Pŵ/?x)šÞçÁJПRö·¤âl¸¹}Ìò*ÁäJby¸QĤ©ˆº\OÇó!™og’¾Ë©çââä‹VóÅrxÏÖp ˆŒÅp®ØÖûÓ¿4¨:bõ`®§óISPMƒ€Ç{hdk=°xvÃLà˹Ãÿ‰ÿÓÜæÿ'†›¹&Û4òðâ:·8f7HãûÏSæŠVš|§û2¨Kw´¹¸wdãŸ(™cnc߈/ Mܘ:lawèd¹w±' K¼5  £½_.v‹+.®X¼s, r” „–sr’¼–#¹¹™z°7ÉË.ÐÌûÚpàµÒߣ¼8(Kó¤*i±ô½îž”¤ÙÖ†Üî(Ç ÒÜae/C“'öŠíîãK;Rõ‚¨Ò¨U|[  "÷}ü"š^3ñà7Ç2Ûl4d˜ï÷гû=ЖÜ;ߟ$>¯y¬V^ Â¼¾Ùa3¢ö¼•ÙYÓÔˆç [€*ÊzF¤Ò—ˆY d{â¨áí}Ûn.Ú$MšjŠ¡!é°s?¸×4Ê$°D;¥máùV©5,ÚFuŒ^Ó˜Óqâþ,ÞãûXég™¡“à ÝJžØäà­švè¶€5IÛ­Õ™»—¯Ú~¥ ÑçAÍ.ÍPÝ©—¼P¾¨=Õ²¨í™nuח“Ëjw_¬Ùý%?âI!.Yéâ%ö+µ·5o¯œ¥œÚîÜ9C…Ï©_î«Këƒø”·sûÕ Ô&½Æ/ TÈîæGöñ5‘!ÏQ«<Àq»ºódt´ß›Àt°ãKl—]¾ ÍOaD ÚS´Ø-A¡Ÿ½qëP_Øy÷,E·dœ·¹h猃”l@ŠCLÜs3Ÿ‚ ®,2*:UªŸÆË<óŸŠ2ý¹^Ç‘Yã¥ÔÙ# Jª0‰“¡;~‘k˜z–ø\vV÷±ÔOP•`ïÎTˆ\gq$ꀷY!D¥q$¨9mZ³^‹´ÜÅð$¶³ô ¯âV‹ˆÚ_öôØo‰DöÒ.Mô²à}S ›Q ¡²{›øìÊ3·[òP‹mFšz;j™Ï`¡)@Yd¨n^ 0WïôaâÎ+|lP;éöPEË_šÅVµt¸1Ä4wãÍ]FЫuùyxß¡¬€Z%q–E¯-e\TA?ÝlZû—p½«>i8¤é&ù׉†ÐÝñçì%ªŸ´ãê±DþÉÃ̸è VyxæZ—ú!((pE¦¬äiïú½x$“‘¹à[‚×åfËt(êñÕ’ÒA>÷ÁàY'I\[a)bsÔIÎäNGÞâØèZ rß‹1i‡n?Ê™¬_€ãŒsù­ŽÞÜVžx ¾ƒOï È©Û&$Á<–$Ì7GV‡]˜žVžØØ±hE5À’›¥oü4É´lÊúÈë6דUS7(V{Äæ|×ør×#Ri<™&ýÜñf8aÁ›ƒ d`ì{ÉÐÑájö…$Œ¼ül’Ä›–lÎD²ïE¾ÎeBÑôä¦tDØ»z¶WCÞkÇ£ítüø›¾‡¬}`«ÛŸpÓgf½EÚ„¡gGаììÀ|,ÜÇQh…ò‘D6ïXíëÛ•b°öÛwH`ŸÁ¯.¢Ç…BµåˆTáäÉ2f°ü ózŦ8`·á£†”­±Òz,BÁV[OízeƼ?WnU‹š‘¨XäÞ®÷3o¶Dý6æéQÏN÷cTÆs:äE…§¢@iëKaÅî™ûŽ}aà'§-»èÞT˜1¿ev»^í¸ƒÓNS”,q‘¦fûiœG$! y9&3rÝç<5éw†*¤ÄtFHÜ;E½NÕwnÓ`?°ÏjêŠ[®éÆ“²Ýúœ4YË| eõ²l.1TfÃ÷\ñüÎð²¬V^¿â°½Í7<Ø ÆúM²!(¸‰|žœçœ2|‰u^2°º8Ìs£Á©×d8‰±Ú9N·wF´þ¹~÷Óïù±‘u*˸áºD>ï#× ”Q0ÜL{˵ÉNÖM¶ê’‡ìUˆ]­DMxÈÓ_£fjö ¾€„=£«¤}ÐäŠZÏM²…>pR³ždã·4èjR>µ+¨ð)¶ u|<êqÉ¿jž;‹|jy^3”O Ê».véVœhD ð’Z2ÕæGjŠýväÞÿëx„ê;H¡Ð¤;Óç˜}DrjlLê#Ç€—’Âf¿Rbf†­â€Õi„Ob³‹+9k ¢q‰ÜAE*5 ×z“ª.ÌK µ­?½[‡‘˜€iuÄFDWK ~s‡çÏ0WxÝfþ”“‚úø°ßF^m^‹îKcÖ-l_ãÒ M•ËÖ¾‡^_R#Œ¿ÊdxóH·¡ó•Ñýëm¯{øX{$Âë_ùT¬ä‰¹0ý™õ•5AZvN£€ë ªkáê¦ÃÃCåñ`ZTƒ´thýú³ªK~Pø°çØcºÓ\¬æžbzµàúXÂì†|mUÐ3<®Hen“ïá4ž¶Y/¬Û»P;ÒÑ™ô“OòÏxËeTs’Mà a â æùUŒ¡¾ if}g¢û>Y<šú1#¥fÑ8/ö§á£EÝÕº‹èg¬wÏ>o87ÚV  Óƒ*öCå‡óÉÒ–&#WëG¹iÈžªßo_=ÊÃb¡îôéã:‹‹ZìRöaÒrf¹ñ ñˆòðØîc²ÞäbTÿ ÍRû©ôMÔYX8<)!sµyúÕfS¬¦¥£ •³ñÊhì+žÏêÝ[ ©ì¦Íä=1û ‡tk¶Xái’FW Å {K²Îq8[ÄGÜǾfØr-5 ŽÍYî™lާ½…Oõû {>mm¡Û|B¢6>vwêÀ™ùFjí稩¼å¬Eõ(Fuÿ@~—Ô§ë¢)¢Œ£Êb÷-“kø£ûîàék$¸eË8A÷þ“KÐÖ­ŒÑ´%Á—+Žì;L”Ñð5™yiƒT IëYëqüçÃΈ '½q/ÜkBÞŸÈZê© ¯…†÷iôHK(3ÜwA‚;Á@Ï»:ñ::?5î™®GÝÐ,› ÎzOcj§Ï¶$:gý¾´ Km®‘§Ìq£¨>åÁx¯Ý=½>j¹«¨Ès¿™o>Ø-ÂdéåaÆÆÍ´ÝÈtÿ¾÷¥ÚûÝÈà0ÁîÖ–ô[¯t¶ýÜmE?™9Òy j»JÊsYñ ‹¹e«íZ8]­œ åò–Å©ïg#ŠvÚ€¯XØb´¹&ŽjÉÉ:$*öÜÙêÛÀ»Ôê–ÅׯšäÕðn-»4ìDP=¦ùatöjI²ÔI¦/[æX¾oÔôa Þg î¶ý~tæpîó݈aÏV×¶‹Fڋݲ{t!6¼ê›¤úÝŠ¢û3a²ÁðasJ¡%‡×X~¢7bîj °ý¥¤@·K %dÝžLiá4k¸ñRùþ£çÙSD+eëŠÏØõˆÇ‹Åv"6Œn>]$3øÃް?ùz]SêÒöüå´AlïïP¢àœ .´õs€dîàÞ7Õµ›Cy»³BÍ} Aon¥VlÎÝôÍd  ø1Üd4â€Ëï)èH§Ÿ¡ˆÇÌEƒ¾Eä£)—P×ô¢w>ûhnâËhâÆžácm„e¨X ÍÉüU›‰Üo,;ãr·ÒžåÔXÏZ¿n}ñÖ¹/ku8æ &ŒšJT" iËÜá¤~4]L‹ûÔæCÇîºDeóHc€iÃó‘S*¸«°VÅý¸,ËiÁSòæ3ÑYäÜJdx;ÞÅû¸Ñ8ÛÏ2P[oÉ#‚ñZ1€xUɈaÿEt +~é•ÄAhÓ‡¢X±ÒYǦsÌ]ß®´éGAE^Ôfᮡ¸ñŠ)à’Õ’žÕ2uêî[œPUïh-1òœ‹¸ë{ý>YN}ç7KÕ­üý_É.ü×"‰;—pšN8ÎR‚F—é—{.=tÓ~kpEÛ2ÈS / >VÞÒ©›kœü±¼Jì+ý: U6*¥*„UÛ¤­A©í7Kµ·ÛéÂnhnÆþ®cfò1ÑZØ*×¹"˜AKL\åàŽù¦ï ²ø5}‰Ðr-3"—¾£kQÅ¡_ùõ‹Í&¸GÝiqùE¥ÓüÜk·¥*ñt$ʰpl0”Úý-4âÈJ¤•ðcD©GdÏ5ø¢6zˆãA|±ÑÜ€ã\ËDó76¿lìI’BJP,ĸŽk >5í-¸FL  ûUË–Æ)rØ¢­\l(}(<¹Î½ªyÚ‰tHšš”€ å êç!µlzb&TO†?b¼SÉ×ÙA–mºß ¨“ÜCøÐFíТkŒŒÿ³RI­ÊÛ^Š×äÇû›ü“$¢ï3Ém¦òý¹Æ,}_۱ÿ­XôêΞT«úã~(èÑOI£JEÏmzð‹Ó€­dM´­ØŒ©sÁ\Ù3ÉÔÙ’ÖIç6Dð‘̪қÏâAàêâ˜þÞÜ=¶d­wž(rüIU¯‹ÆåèBp®1µ÷ä·xÙQýhè¨ Ã¢—ÉSü×sýa^ÆÏ›ìèmÙ@¶ÅèG::ƒ7…KðW«¢/+ᩬxª½s—ÚQÂÞ/}åý$ѱ»dædãÕVÀÎ^mU8†1OY3ã,‹4ɬ?}N=ÆO}Ò ñLF‚±iXÍ zE¿<Ý©†þ$ó„Šz£Zá‡Å˜×iyÊAaâ¨âÍégçtòÓ’ X]KÇoÕÔF`lßB•ŒC‘‹?~{­.œ¿¿¸÷uü1Þ{ÙÛA~U-ϯQ6“"(¸ú6ˆ¼Ä :üB+N>· +aÜy‰D2”‚(YäúvþÕaã¸Îao×±œÖcëYJäÊ—, Ž%T¤-“™×‡óìÖE [ƒÊd¢çãù”ìçņSá¤a=dRØÓ]FôžŠîµLç9)ßþ±¸µL2Q}»Dsi6q—uü3Æ(í=”„GÏBÑgBƒq˜­tl! ™É}©6“žE <ñ“•™W²=Çøñ“Í€úDÂêW£º8<¢\ rº Ä_¬%¯¥í´Ó§2¯63 ù›ßn9½#B ©ÛQ[ªË?nú%e¦ ¥>·¦Ä?™»ë y=?|rÜ‘¾®—X˜JóØrËÄo°‹ž&æ;ñá$·51xkÑJ¶~µQ‡÷IíÒÈxÃîÝ3|ß§0ÿSv­_ªð÷BO’™Æfé<ŒšëÔÍð`{—}®>ÓZÁ§¿L …ú‹á 5Þ'›7ÆûÊ$>,yÓ">öTÅ‚Y³¶ ¬Çqt¿£Jäo”e\S68}x_µ Õh£Â¹o*è¥(é¦!ä Yc9/ÿ:-ùº“³H"êKá`t4ðô¬-DÍ,65Æ΃Z«KÈÝÞŸgñ-q1_ÉG9 Z/jF쮢H¸ã²R!WÏFV²ð¥ú®dSR‹6wÎHAÿj•k_N¢s3?½¾Mš¥©DÚwY^ÑQe¸.Ë´Õ|ìáp—ÔøÉ†‰+;¹ÖëKººõ£yC†28-Oµ´ïA?¼‚ue£ö$8fܼLþUgëÇ ^ mÙ¬çÖ4{¸8wKyvR_ÆÎòŠ¢‹ÅL8ÍÍ‘Ÿ ¡­)'ó‰4Ô—ÛMÔõÁÖ½0kÜi3}±1)ˆÉË}_­èpÝ‚¡?ˆDã&ÕFc]|ZÎå(Ù=4â=Tì­%,9îÕЄÄÏEÏ©cˆ4š¼ ÓÆ—»ex:ò~†¨›bÝœC­6ÜÁsøüg6V(-ƒdËšì£q¸¯uèŽc¼ý£šž¸7Íö'â¿ø %Æ«e¹±¾NözI¹&£BfL“cÍÑãØ‘èMGwW÷I3V¿|Ôg¿o)È~)&!EñŸÿ¢ôú­ 8ë4“Ï•ÄëOç^ÈZsü>°à"…”{¿O j®Ô/¯©íàÉKåx)–´o-‘áâV3*ùFwsú=}më¨cøDV­+»ž}CfF‡\hWQë£söËÖÛï((þ´¶ø3¢Ò¥1GÅ߇G-ËiÙ7Â@ŽHÓχqöò‰½íÑm³79=±Hu™Æþû*Ö£GŠmÃO$Õ•FÃä žñ拓£ßä§hGYn^YV‰cøn Œ¬ÉZÀ$à{sòUT ?c1qAâ`Oq\¿KxÑ{â!5·«qÇòFªÞFý8³ÈÇHö«û½n1Ú_ qŸî¡PÌàwЩ2$=#•ØñMt>=:ŸG%K¶ñþpP휜 îs£šÀAרrHÓðɃƒ]„1ÒÙ‘>5%7ÑîÍŒtæ»±¦ºr&ÛÛT]p…~Æ;] '”³Ü¾¾Æ‚ýr N%ľ}žXg^0™—§R‰7ÓQRíšîxPgJNvÝ‹‡D?)=ýë@A\ÿŠÊt’gNe±¾½ÑÕ'º>½JÒ4ÔY8)=EÊH÷&`ëSYyIãH¤†ñ ÅÀìv>ß9ãU•tñ¡ÔLï[f’&¶[WÇ Ì[àoÌÛŸYþûªT}«[q‰ÒpA­õÃÔ)í&F¨¿gDê€W}D7+Óâo 5¼5¶Tœ¾ qî)Ü:Oõïó;£çLÇ8=-tÔ›dtHüÚc¡í«*hšŠ"û;Ï_ ×q½gÕ‚8ñ+û2ãšûιhGüÊy «c l-‡L6z¸s£Ã¨Ú=! á¿¿ˆJj}!²|Ï}ƒ]Ô@ƒÒ“=ÌJ¢.~¥ ÇSÂûrãI8¨t5¾I YoÃÑÅâ $ðœûÜÞÎ¥ÐVÊûòTC ±xr˜ƒ{Sº1 þÃOâÑŸžÖ1ík™QJã)TÅ)ÖFkŽxÅÂÚxë†kÝzà Û)Å-ýn6%/-íx ápUŽÛÀq!mÌh¶îNg¸…’gø—3[pîº gbu'˜M²Øh ¾†Ð ó<ª©K–qÒ¿ßYAmºðF¾^wp¯³Pâ|*÷âÅ ö·h 0SqÌ(âlÓ¨•æF‡“Z»æÏ9/x›ÚuTQ)5“€ìÌ\ü(”œØÆ1C.÷ýÛýPåõXéúw’£·O~p´æy_;RóVò>†~ÊŸtéXyYmÕž†ÿË1ã5•Žq¤ùdkîdí¼æÀ!üÜ|ŸX¶ŠÏXWSt•gSÌ@…u~3Ý”³úJ&¸'8,ZºU™—¨Ìæ$ãc æÓ‘|?nrM"NðrƒÉ‡Â|bé/ôݳ •Õ»G¤x[™ç–?~# ÷.PJz]ŸUx9q¤ŸÌ™X2Q<~ûô­Uúy§œ\U›<—Áìã¸}SéüzœÞž€d,¹¤5v„Dú}£€ÚV\ñ÷!†zã:Ûû•–¡ÆÇ9šð_«G‰K??q¥-Kc¢‰wõðš|ˆÈòSYHÐê-œ{—œšGÐêùM™×WE0êÐoÊ(…ÕG;µ4ÈÇo¢²kõ}W‚ ^?’?[ïL²É4#ém/}elí9\ê\®›¸K–EzÞÚ(¡Ôä'C;p³ ƒåÁJol[1°¬­ôEk7Õ*F‹b1ê?­dŒé: )¢#ç^.iœ³RÇ3ÀJÔŸUË5“‡ª ˆ3Å l§f­fÞô¾{Å”lt!Áéìófn¬#Qƒ­äÊ NBéÐev¹ê ö¢»*czg Þ²j-`söyRöÄð¨>.²9±S`E“«±€8ßž×Í®ˆq{ÀXûº4!Ì-£ê€]ûZëW&|tÍüÄW©âåÇ?${œ¹¿°®¹¸€„í\Š~\#îîõ­lì¬ç+s• 3à1†æ=JJÞM‚Âv"ΰ7é`MémmÒŽKûîõEK~H* ãª+¼g·Tþ(Y±†¢X~Ds„îÄfG»?˾N¸ž¿U—/Yµ_+ØÄ&y7’è11R)÷X‹p¡ã7~Í,‡n÷»X®"7ö޳ñÎòv÷¢DPo/ÊþÇ<ÅI2† ]6a°sŸC“äã¹}0èÝ:·rÖ7°ú‘|½¸”{Ð]ñpÍ“DUÝü]“ËÜî¨OT~صåR\B ²{ãçßÞ<Ø6ôf›Ú§íÉáŠòn|çÛ1™Š‘×w á·÷îhßõ"7äFXë?W;”Sÿz,uZÿIsjLÃWüëFmA¤Ì¶¡¡òÓÜÀȪêq¶+*kä¯3ïU}ÇŠ‘µ8_„R¢qs¿¼® FÂ6 ÝÅŤ@™t²"â%¢1†ù‡&z•–ó|ؼÏ5iŸ×C2É×Q°Û¡¿“ôdÄÛŸŸûušþmû±„R4àÒSܯ™Š±G›ãWÔÐ)㥶 6¶™s—Ù̪i×ê M¦I¡UgÕ7§ë<úŽãÏâ³è+¸¹Ò8l¬¯ÎÂ}!©á¥áa²à¹U:¤ë, _(JŸXcøƒ'ˆ÷c¤é#™þí!ÏUr_ðV¹áØÛè¯MÝÍfÓzINµÂ9_ì®ãFÚ†W#…³…L©ã·­}ß,wÎï#†Ð|¸JàËx/80È"A˜™…¾7ˆâ3†ð˜pÝoK =r$òva#I·£5@\ø0zœ!¼ÒŠVÔrü‘X‡KP®ÙÀ‹gß?[¨ŒvÃ1`_…¯IT#ïÀ^IA. Æîƒ·-æÚPH}Ì( ™åVñˆPq»´cYr&]™â{oj,ÆÍ €¹¿¢òaÜN(ßÍ þ&aPÚÆB…ôMç¡+lýâ¨6¬amCßÿ2õì-“ÛºœÌCñóšf„EṽǼ}¢Ö‡ß¿qŠ‹SÉ#dàY¾Â Ñv‘s&Ë¢þ8"ìgdÁ6\J×tÿ„ÈÚ€òAlx­Žš‡ò0½›ÎGg¸‹í*¢dz€¹p›È¥ëæà3”+Ǥ1ÙM…@XWž=óèþ» sʘz§·6B²qèïJ (òÄ”Ëð=ª§jÊò‡j®Q- ç-' yu~ÿùÊ3ºÆ <‚昽Ÿ^¼f@¸E hå)øºDDôÃwÓîgÁ¢Ù.kµ×àj]f>.vÂpÉõwÅUú×?IÐ¥=Å+„»ÄsçuDbÝÄøRÔgš,û òˆÜñŒª~uæ8#‰ÇޕĨ vñ÷Ìö!æ9*ñ¦rVó´³ù¹ºöËî>”‡Oˆ,‚‘áhKpx›0U7Þ8jC¾¯ Î¸9ÿÜfÄ¥um3dD;•ç»àÁàœ¶#”ÞÄøoÙXÊ©CÌ`sÞô˜kŠÜZ¸8åÀpw©%Pjr¥ÐlÈmÇ—Œ3áo¹Ù£Ö›p¸vø†$$`º¢ýcg$k~ßUUŠßŽTÃv)¯A=Ìûö›« oìðzàn—`žë#š?O—ý4÷±Â™P×XNc!pÜëÛ¼ýqY§­Ú§½^ÀÓ.Kze…7cWšŒ*AtäzSEå°¥—Í:HÂíÄšAJÉDd¾#Qgô¡uÛZÔ›î`½ãüJe,"7ï³z &©š‡uÉ3A÷o¨øR¢¢«öÅ)®Y~èµLÈhw]×È ž`rUE¿2aO)x€õY£C¡‡=­fÁåãþïÙv·*A­>š8-ŠÂ1ôsÓ:E?[WÈ Ž6Ö"oˆrœD¢%³øÔ;¿^á+ìjt`Uö¼˜B)}H¹âO„V׿¹l%fên? Ã`1’µ…=c­Ùº!É#6Ï·êåútênàk·**?A¾ô˜ÚXÀ$b¦»¿Ÿ,?á¸ä|¨’L¹3…ÿéû$ѶXÚ/Uj«Ul-Ä‹Bž· ˆ³–¼Ñƒåðø<éO£lÜk›X“ ðR$>F›ùóè¼s ÈeZü85N„è‘Qò°Þ6íf]ô~S)…ýJÁWŠ)üfNá'sÐï¯à·¡=xÅSsæM}\šÉ9OoÅâûÝt›…P¡si"™ó C×ÓùÁP÷Væ&½±Ü´)‘}«¹þhÏßÛ4ÚÆ[4/ ää %H_EÆÙDîܼž…ˆe7S„õ‘æÑS{-u«Jß9k»Š@/ün†„àM¸@:à»»2óº^GO?ÇŠ×ãÚ帱ӧþ5—"¹˜}ÞKgé-3«{ xJ½ZÙ(c¾òT©‚ô„ÍHB““<ƃÅ\°‡J»ïOm<á{ ÌL®É®T ƒèîÆ[:bKÊ&s<1]v»ù…A·ÃttÑžöûã ¨°f 0ʼ'¼Ù²ß$oÔ¾–n¦ä§Æy•uì DÏ+­. …m8Øi¢ùÐ'‹úŽØc2ø=aûLá,ÕÏ­HÙ;yˆïÊ{Ü kçY-Ë"¶8ŽÑI9ÃwJÊÝ{ \a)tÌÈžLî{性ÓÐ]{°i®zE$GaúÝë«CÑ¥1£l›Ýßn•³ªYþ¶ès¤ `•p޳~{RŒËCñÉå,)Ê•ë« †ƒ¥òîäl:½ÉÌŒïm¤¿Ö.`ú¼Ê?0±¡rT¹Vö QÇ8!æ3±Ð–MI¬r7…[¸#µ+F?Ü>(,KC<˜pÝÙJtù'u|ç'=»ü ¸›FÁí˜[Åj»LœÀ"§yìTéeG §‡–ozÕuÓ‰QùSnùÊ[:çØï…Ö‡ÀVa¾vø}m› úÞz!‘±!c!ÅÁ}@øÅ¨?r…•gÎÉÔIN@Ê¿6Q¿4±VÿÞ¹©ú;îuÿP1*Zzè»ÃÝ[A¢:B’yl±SoßE„MtwÔ{;|V¨N#çûøpLòð>a=Æyü牔ñµ®m‰³°¥‹L šÛÀ5Z‰ïï¾în9Bˆ R³Ú'àNçŒíQ5¿¨óTc땚¾åæk,4Š˜ K÷WUwd~•X¹²QŽêÈHâ`eiþ´²²M#wþx‰ùÞæÇ"u ‹µw±,“° žn7ú0Ç‚žªRœôû’†ø“ F¡^µ¸Ýæ1½‡iØ÷JöÆ“eФ8rBÜ+«­OiGÛX‘›yrV'çN>$¶¼æ—ÓåâC‡Î_­l”»øÃÉb‹Úí¶rDîvõÆØ¢î>3 Ëåb5žå1[0ÌÑ?@Fl€„DÉv€ÌQ´÷p4À€‘ô5nÄd¬Ó¤¾´Èo6œ`öŒ8(|¦Õ¸µtn>ßvi·hN;E~Óнe<)ý¶‹aðåÓ5F“pËfûP¢÷Z?»Xsßu&õ7¼÷£—öV‘—IB6nÅ+ò2*:y•ï(Î8mË„ÐßûÚ¡ZìcLµN!r¤bÍ]w¨(Vh AïäóB>Vû¯‘{‚ýÆ÷€L·™§XQßp‚ø| } ›£HGtBˆî×ûÀÙú%&ÙúÅ÷>ו©m— ÚŠTü5ôŽ›_³)¡öÉ­1Êd}‰—ÞÐ? Z¥2+­6ò Ž¿zôÿböeÍ<ø’Cf¬.C&/rðX“‘ŽÑÜjµ [ rg ¦}ƺÜ*uH_y»Ó§°Ï/ÄYU€ù»ý ‡ëJ¢ÕDU¿õ#Õ‚©Îœ˜XÝ),ƒI^—žI¬â¦¥‚,ñˆÑ&A*^dÑ~)ÅõŸ|·=ÖFO49ø}‚?ž§Bš)èÙª'âÕ”È^%¤vŽš”ëM"© •Ø9u²Ö?Hû_¯ÖÇ¢c¨_0½Aöèg¯ @„œ!×wuRÛ2 Ð1ÍwiÄRÐ=ÇlG%}qú;=ÂÊתËÎT¯Å–ÙÏžiÃí„jWËOûÜ+8¶Æ$§°ýUnvÓTîP…†í$äT È ï@ê5Ç­Oé\í±¨"Ë‘‰Â~||x“´ÂCÛíÜWËeü™~y3Ú•1ívòM³·æ¢€ WóŒ´'Jú+=Å2žWÑ–Ÿ‡­<A妸g‰ékžÒߟ‹´X›ëÉDy6)Ñ1Ã&Â=(ñ —'Û\uᎠ¿½uû9š÷m‘ ø©ÆÐÛ¿ó¾–ÙåáÿÎëøZ endstream endobj 320 0 obj << /Length1 1458 /Length2 7112 /Length3 0 /Length 8099 /Filter /FlateDecode >> stream xÚtTÔ[÷¶4"ÝÍÐ 3¤”J3„tJ ÃCÌÀÌPRJHƒtJ#Jw£”„4ˆ"¢ ÒÝ(Ôûþï½ï÷­õ}kÖúÍyö~ö>{ŸóìÃÍ®g(¬h´ƒ©!aP ¬c¾ ÅE€@1"nn#8Æö—™ˆÛ†BÑÙ”Q0æÚ¦Á\ót€¦§+$IÉ‚¤e@€(ó"% PxÁí:"M$†&âVFºû¢àŽN˜ëmþ³ðAù i¡ßáE7 … :ŒÌízG(Ä`ˆ„Âaߥà“wÂ`ÜeEE½½½E nh$Êñ¿ÀŽqÀÐ0”Ìð«aÀ}ˆìOg"DÜ#'8úÝé€ñ† `€kƒ+ C ¯#<ö0àzs€!X ëCü!kÿ!þ:Hô¿éþŠþ•Žø B‘nî„/áp€»ÂºjÚ"Œ‚°ÿE„¸¢‘×ñ/ÜbwMø]9 ¦¨€\7øW{h( îŽA‹ á®¿Zý•æú”UöÊH77ƒ&úUŸ ƒ^»¯èŸ›uA ½~8ÂÞáWöžî¢Æ¸‡' ¬òåÚDô·Í†HÀÛbR˜æuý•ÞÈ×öÛ úe¾î ÀÏép¸nw€]ÿù¡!^0å ðû§ã߈ØÃ¡€ÌŽ ú;ûµæð__> îx¼Öüõûߕյ¼ì‘Wß¿é¿ïWÔÌXYKS_ðOÇÿëSRBúü„Å%Âb’@$H_/þFÿ« àß±`„ ó§ÚëcúOÅ^ €ï¯áàü;×}äµja¾¿En ”B¯? ÿo©ÿù¿)üW–ÿ—Èÿ» 5OW×ßn¾ßþÿà qƒ»úþE¸­'æzt×c€øoª)ìÏÐêÀìážnÿíc ׃ ˆp¼³0HB(ñÇG«Á}`özp ÔédþØš+ÓC¢á¿Þ–ë( ð¿|×óu¹~?Ð׺üí‚]Ï¿÷UE@‘ö¿æLLR A¡ ¾D×7}$~ ë´‡ùüV2@TÄ\‡®{ 8 QD¿®UZ ªûËô€’Qøßˆ"þAQä? @Ôýð:ý(Åü†ÿ*ê‰B]îo]]wóüû•€Á|`P¢÷3H¨\˜sMXÛi•"“·ðʨ˜Iß~Ô!¡é²*ƒ×ª~ˆ²üÙxÁÓ9Å®©oOÏ>Snˆ•^5º˜Ñ]¬ýÓŸÊÒ¾¯kÃs°û*ä?F©p¾Ööû¦ÕÙia+ްw¤Ýi2ð>¼7ÉO'ä±·2µ¦.ÏÓôêä¥Óoæ1öhÌSú۷ʼn±ÃÚ³Ú_)U+NNu€¹Ðû÷F·’XÔÖÎÒ{‡Ä$¿ôÍ— aÁ—Ò™Ö×Iܵ³Öï¤}ï‘bÔ²Lr/÷¨Ò_Äó…¶…óÙ¡‡ å› âD´“‚ì[×½WèÞÇuoÝÓfÒ™Þ7 ›J­,ïcmêm1©šÀ³}Î}z í—5Ï£LfŸé=b¿¥Ê:èÞ°S¼om°ˆmÉÅtafhEŒÔÊ|œg6ŒtµŒ–¨°7P¸¼_óÁ퀞0è6Фî!šuöÖg'q-ÇCÂŒh­»‰/K(æagçç#/­³·}I€­].Ç3Z~gì•Q¾ȯ"NT›1âc®j‚OEµñr«öxÃ'?ŠL˜Mø^lj™<#{/3¥«V•£év!EÖ4o¸¯#V†o0ñ$ ‘s±›¨PÇ×§ð›° ×¹ÕXuºûá›üÄ‘8>5íJyï6«Í'*<óÖÄ}É>‰4Á<­cÀBTôI­ú êÀ¶Ëö!c@ö©šÌÝöšRÖÜþ!óë=|¯,ÃÈBÞjÊBç1žùÙÓêHÜò­{Iœ²ôAåÜZw‡¥mÈQ,_“?†ÈWspˆ9‡?T/SfK[i½‚=ú’qv—•0ž=Í*Ê‘tÙö¾bÓ…pE€´»9–»U)ˆ+G¢#…C—RZcÇ;ôQÛ²#{ˆiØeýàX4ç4½úB¸I 7K¢…*¤¯>ë늹ŒÈÄfuœ<`Í]ÙáìçS’ç£IŽtw®êž•»'tºæòËòFÿÈ2¯w§©lÈ‘nh²¨,@VæTëyVÊ<ø©Ì;‡óXRÎ7îEu,ˆ¿¾>w‹R‡‚~¿Ù˜ÐèV¾ÄªÎ!ŸÑ `:;NÈ-49T#gk€š!NŒ( êxÔ—Þmx?8¾ÂÏäv¸\ØsçÞ,¯7 çîø›Jã€×¹ÕuJ/¨Æ­¿½[œÒU½¶ñ#yaå%Ë|øoÃÖ•±KªQ3È6Í1Γ›ÐØSÞn¬ØÞªé y¡û<ÀO!xƃî=ÝlØ»âWo”ó³>5ºÍΤ¥Ö<žÃÄá¨ÆgdoÙ(_ñç½’ë¨ÖÁŽ’œ•ÚÒy9ÔZ1Âàe}¥ƒ¦}‚‡]@\DZQi•™âoãz©~^AJ¬Ée`ý4ü€!Èg¬AÁÿ˜e¯6¥_˜ö#Gœ)¯—ŽlÒ’rØD]G¶[17u¾òóJmé*Œ•Q $¯ó˜¹ù>´åžà½'çZšÓRù$+lÔڻʣÐÙAVªÚÉœ[<± ¯º>{(7 ?Æ…RIDäÑ åéL˜kåQå[çmä2U<.­²ÈÙ7ÐîtUʆxåMØEÎdœ&«¿|§¤`ýV~Á0*êŽòº¦O²UfÝäaÔð€=ãpvWÝ׃ü{ÅìM±›ˆäúÜ¡áœøî:ÅÆ’zÆ]fsþqfçÉE9Ý}?¿Þ…°Ñ0І…Ý)XÀ<·.ykÖ_þõL»]¤¦w`nñ€ ø€•÷ÛB:М’L¯°º}ñFò΃bˆáÜ^IVy±i>h‰kÖ¡»h¾TèøÉÖJÛqâLý££õ=¼4¨mlíí‚ËÝÓG—´•§äé—åg·¹'9ÝÄŠdÍÔìpÞªÍÏS*½ºM§ëžƒªXÒjÍ)鬓+ð;È5F'X01BZ‰÷¨1X¬_*ð5~ÃKš~ù˜&`?î4…Á‡ú[óž*˜ŸH¦<ð®K µ¥C|eãm&Ñ Ø×JdW0ZT©'k¾¸´¯O ùÜ*ŽBEØ,suèÎI(RM_÷4=bqˆ*aêà»ýÛBâž>O7;‹Î'}C¼©äH¿Ìµ¸ŠU‹;äñÀ6âe"ã”0]±VÇ»öÎZ{Òµòç‹î•UÎÌÀ¬ÉVÞµ»ÅÉDª›újzgcO²àéº,¶=Ω¼‰‚Ú ŒÞ¯îúßÛ]t{>¦½ŸG$K4èö†/íѰÝÄwŽY³­SÔ2ù"® ]š³]Dø?†#6öDo:®ÿÁ-î<Ñ Ãø>¦8Ç㌢z›à’·Wq«â0”VéeÕhû›·–¶2 .5ÜE'Éûá ¢Äý·¦“)ëžšÆ÷¯ÈÙ?|˜ÙsôÀeØüØa@kk%>OШáÜrçÍÁ£˜íŒ>ØsMæ»î]Ü6[Wñí„\ïßQ“ªPɬø|óµLÛ |a^µc7ÞUPVfµ<վ踿õšÀïJMVìéÑåù–ÔOdo¡;˜ƒ`í͢оÛ±•V‹íZëÛ¶ rn-}œ¡=˜G@«0v7SQÿFöô4”ÕÀ‰ã½ô2[Sb?¼ÿ™yú\ß!‘Å:k+7ܰ­€°>:8JÚÐþ=_w¸QT\Bè§=#æ‹PžçÇŸ™w÷.Y†ìÌåöêÅDÝ¿ðñ-_’¢ZRƒòwxFx¥~8(±Ø(1nËVžˆ*ºëÄÍ„åx0À³£™aàŒ,U &rË™ úA7¹Tcß=¶{x£Óùý«pA#T-Ø´zËYxãÝiz=? ø\nš(Üs)¾àC¨vÞ,å̧#Báo‘—q=Wx2 5³!iÞŽ©Ÿ“’$Q·kÞ¿н¯P¨.Î8Ù¢g—æÒÄÉöS‘È®Mk,JïcÙÁûU½,;›ö^:+Š‚³5_œÿ]Yˆ´YðURî`ùee×Ic9¡°2¬@ÌìGPLߣ9Ógöë4d“~"ž}§Â¤rÉÐú2»³ò ¢fÒ;»€Æédñ5ò¦Ÿ‰}Ý¡¾é7%ö*MR½½„í»RXj±/W—ˆiípîÎó‰lÆ=é壷!YˆˆÓèØÎèšyÖ0P¤PÄ÷¢5-[¾³ÔF ¤2­8=ò½¼ÃÝ>ÌÌu Av4#@[•õa¥dä8Õn‰å'3nËgÊ ðO“; Và™LÕúg¾$)âÚmÞ`ßÚã冨#ã|G–Ž ‡áM­û9GInº¤ç ŸÏŒÊlõ?áŽ`*}œKj 8ZÄM\:ãঢBQÆͪP,Ï{4`–ÖЬæ»Î|Ù/¨ xE×Þò-4ò€LQ|Á^?íè9Kåà{: #°ù³¶ùL$_^µÆ=%D´QìŠÐO”ï×&6(ÇRéúº/­æQza)ÍðP›Â áê®®&©Ñ‰ñ|…]5/t+M«pŒ‡¾8ºæ§!ü(w,Eâ®Ò´Þg3FÛ¥¶þÌôñƒ*Q pKr` IŽˆ !ñ)‡SÊ»ÞÞ.›IᳩôçÄgÙÁÚÎÄ~DÔé%9þé'¡Ø(ðÛY«²fãq>{×Öø‰XH&ë;¾îüE¬9ÓÛÙ`’G:ø›@£ y sQͳ»/›M•¢j‰Cô™ˆ„‰ÒhHú\éQsó‹uœM™¤ÃI!ËLŸ\uœ–hµÊú†ÄQ!ž^hP_´‚`Ìæo¸¿i­Ú*Urœx iJlEº„¢âT¼x¿¼²]o¢³ü,å+‡æ‘‡Œ“XàØÊ@s¶ð{32?Õ!1³ yT¢†kdϪf¦Ê’³‡ŸŸ£Ðv»B­âªm,ãÁɳ~COÝý•<û1Q£yiÂ!ÅhJã×h&°n¦ZüÉUW‚Ì÷í¯¤‚ïÆ†×9§tÃë®Ä¡_¨ ,Sß< Y©3ž;á•í¾Y‡I©¯¯ÖBËÌKð$/¥·Ýª¼Š'9׫Ušvœ!ÝêÔz%¢G’¡ÓÝ¡âÞ½8­Tì‰7øþö»Å{uOœêÆ~æûC¿½-I¾ÿ®å‚q…8X›FuáÎYªÍwx_jN…BåßF%I´Ôûþ¤ÈøØ¾ªÐœR?UínâÚ•Yº7ˆ¥íÒQ­ê‹¡1óÀo”ç3À…—¤.•³ê(»Up-iؤ)¥5­~Zr‹ÎJ²·›HF¯®X’õ´â ʲèQºìÖaÌ9¦ÕQÞ0¿fbÚ¿ÂÊ^¯.“UcßüÞ@’ªÖÏMRì„%º˜Y)ÿkÁ[)ŽÃ?¿CŽR Y3.ð\Ô«Éh¨ R öy¿#ààî{ßð!­yýe ähø&# ²+—Ö̵Ê@÷j¡­@ˆÐD£˜„€‘Ò8¶ñ»dnYï§ÁfáäH¶Ì[u•6¥¹H©ÇäþÎQØ7ãµ *¯¯é;¿9éÀãåY·²xzÿòåyñÚ kÞ>#öeÀi Nór3ñ7ôȧ¯ïµ2ÐYvŽ}Š,ºµÜŸ–Ö¶»'“mÑeä+ka‰«7µòƒóùZÅÉ€…ë,ó™aoZ6›–%…+ki9ënvuoÙ½íBÜXääû%=E ½›Îš"nU•ãuòaa£ ]sÚ™DBºr¶>X-ÇÖñªTÞ|å¿ýõËbUu®¢ËGö\Y¬šíÒñ^ITs4ù9Š4 C!ÑÐßÔ(Óhß2CŽÃqõ \† ©n<–¶'Í}§*[9ºGêÇ/¶‰ N²ƒ)ef×[-ÅŠ…éÛ>Ëc¦]6`Fí"Vʼž¸ÜÿÏ„ùõJŸ9éý] óZT%˜Øi%Ój:ܳ±+ÐÃf83½ôÆ$ö"fةƷÇIó:òíK‰xåBçCvÍÛv_ll-‰‰ùݰYÉö¨N€kç<ð£IñÑ»¦¢/aQ-=/5ï9‰Øòô ¹6´‡2“Šg³só!Õ¬ç8¥A¡ç:ÃÒË5§*†ÑÁ~i¹C ”\ê„zë¸lvfo{aS>4‹Ž¸¹ŒôZ#O{}¿|Æ”cd›Ä §´mKôÝU´y|¦ë8¶ÊÍOí£9)ã"l¢Œ”©Í±4ÆÐpžl™ËÜlÅm;šóôû67T–Éš‡RJc8(ï^º˜"Ímyâ=fÁù’s–qøÐ·D¨ˆ¼'”Zލäk¶@륨Lwz¢,Ë”˜ kïsÚßÜQïCZÁ¶fÏy¤è1DÅÁ+Óè/~Ð@ññÕÇÈŒ¼¢ûJ9À(WÑÜɨ}bvÐØðB¬ÍÒ¸\T»D¬c1¯'Ïž"¨éPë ÃasÉù°W©FÜ 5PJ§9ÚÄùîÇŽ\Ë­s–uU2î ^'þã±Ö«+‚Rîé6+˜•>o»Yg‰¸ÕIöf¤Y°F¡Û¤ [ɽ\ ÁؼèæA1ÿfáÁ‰\ F›¯›.Ïöe‚ŸÒ¥ð¾ØbÿÌ9×é\t\R¾x8*™ú³`Õåª%gç–œÙqUz!Cþœ¬FàðÚ4ŸÊç3§Õ¾‚}È׸tÄŸp8oÁð§j4Úi›q„¤•é©Ó¹zC¨£‹-Š33À椾¤)ϼÇߺ@|¦éö’É  ñ\-¦Z¤o‚§Ó=¥mè!vÏ&ˆÌÝ¥ëwöŽ#¿Ðø§OQ冮–^šü0 ¡éë=¯‰utµVÉšƒpäG Б1Ÿƒµ°–~æ;Ѝs …OOP첩Í:pXóùK^…:)áEÑç–H$ŒÐÿœCêG×>jÃÎÅný‘ ¨ãþC¬¨P1’â†ç1® 8ÎÎWRÜq4%³ðKêêŽÎŠØ![(+rVe2É¢^q5?`ÝÕ-SKÐSe—nçBNÒ%ª—>6p¯nÓýµý™T’ÑÌ;y\»m«(Q…Îf×N×â°SR¯ì%¬Í—Ì  m­¹QD™n­¿ìæ&;ý,æ±eÛ†k¿Í©½JÂHÐòÅðÆÇÖÖÜ3–ï'¬ëÁÄÙý¶ˆ³î7ᘪ2J!ˆª±#ÁjÐv„€¿9ËEÏŽÒ99ŠK![ç»z›ŠÞ±:áéyKÓÉ`CÚ¬Þ¥ƒ>… †Õ¥ËAD'¦Õ²W<£úºV¯T4E`·ô.¸Œ8~ÇíW¤¦1yVâ&5ž—ÌhåÄ0ßøó©aMоÊÕë`0’cWD(†ÜÎ^ýœu1;Þ„å€ ö0'£'Š­èéÏŒî£O‘»BëI6·4è‘L$ÄS?æ”?u!ÙyMLrÊ}Ùµi§Á6ùÙË)LjçSTÔ:X½{‡r»¶æü=¢ö]iü…}Þ4ýrÙó†!2N±rñª×÷Á¯—wÓ‚¿9å>|ð!Ž7W÷ÁÈ^„:5ò§)8E¦È£ýlöIxgF℃°}“;½ƒƒ¿ÿ±ÒÊ~¡®²ò ·/c[Û,m¨ >3¦‘6Î/ÒŸLÌ5Ðb›r>ž/¼Ý3 fˆzhì³pöÆJŠcÛÅúÙ—w…ÂMLTå¾À¨5ÖÐ^CT\´ÏÈvw~þr–¡ìø¹jÈQB'ñ©£Ïé´­öÏêgO3-Æà* :Á.ά©ûùùy_2m^¼22x¦.QÀ˧Ú2ê™ü Ö!ˆ{Á/éQúJÒ4ùëºb޾bÙ±Gÿ§ÏÍŸö‚oÙøðµµ- ¼+½ X? 3ë˜[+»ìe<Ø•‹ã¡î àØZ²­÷V™B“xù¥/uçƒG.æ¨î?Œã8Hf¿ù>þ9A„»áîtQßœßî ±:ç #è5šÊ¥ö‘%‚AX½ˆ®58sÙË;9K1=· ñóê Óƒ‹§¥0?ˆ“”ª+L”4ñÍ ïL' k_òͽÛA¹/×Õâb¤>-Ïnª1iØœ<$q*ï5aËdX[>„yÊ9‹Ìç„ÉYeÑ;R¯§,ª¹8±E¾.z›³X½×Itù$O+íÊ.%Ùa>@ÓÄl—Mœµš-ºBº1^á-Y]Òe‰4¦ª—á~SÌ6 {?ÃSvo¸`t’Ñí‹âái ¾kÒÛÚãà‚|;iX ͉_ ÓÝo{¦Y•> / Ÿ <šÓ G¡#f±cáÃOåK¿:â°À¦z³û­ÐµöVPtZÄ(Á¯˜éÕE3ŒÌ;nîû1ÐøÀEÛv ?jJ¢}ì"ðçBYø™Žï·ÜФö÷Bô¤½ÄŒ{U}Â’b2ZšÆä®œü/Ï*¼ØodXÝHúJêË.öëL›Âµ~}!‡¿Üª[UÁ{ÑêIö)JC¢Iö^Õ)ö%4þhüÛ’¾™êS¶ã,šf9‰äœÔÞ„dç3wõOç2бfâ*÷*í Ÿ*•¬ ¦á¥Y­Vì={ºÙb€½êí mÍéov²–àQÈ«Žè§tèÙÑ>æ» Y,H»›+7<\__ær:Ê‹úð@ÖËê=‡ÞA׊ÚW<ݰ­¾(oÀójGõ–e¢%ÃuC¿ †œ‹ ÷1°Ñ…™x^ÃYŒ×¥Þ¾z»™šÏ]]„3’§©àv3Aý³Ÿ£!<.â»c°7EqÀÏýyÏmãÍxË&¯Ÿö ¶8Òk_ƒp¿_Î<ÑW>ŸvÍ~ör{C3íí„Ø}ò2á×–³`Ó«æå² §žè‡µá‘ŒôiLvøÖNvcÍšç™A÷¶©GžjŸÞø‘/¡÷¬ÿ(e‰WbÊi[¿Âô“+%Ü­c螦Kg<¯Å!džQÔs§ úáMQ'ºÇ•¦ñ«>ƒêƒ’G¶BÛ‡À‰\_árÁ¹¯fX5ô¨7n½»c·šqPÜc¹Ú•¸Üí:^O@Ap<^}r¥Î†tM¢ª3Ö €Cߢò\ü|~7,A¦øoGцoé’”Èsˆ|Ÿ8ðn« vÝñ¢)×¶{©IuyåµB³]€ã\cro¥Ÿõ™ÑØl[4}¹óy—Y¢@(Wk†^ieútŒöÙ"ÏÆN+¼Ç ïzi·EWJÃa±¢Áåmå3r“ù'&!Uyô QÕc!+ ºÁ ‘É(8d“SŸ ¾Iá‹«ÿ‚fýK|¿bÛ¦aOKAü§ŸüÕuµj„ýgLà î!ÔýPŽ6I2ó`Å+”Yò _gPJ3¹\æ’ýhF8þǬK 6v¡ Ãpµw³íb{μg;K™h 9"œÔ‹uºù[”‘Å´[pâ}éúÁrWøÃÓ³ÎÉé™z” pR‘K€ÉIƒ”À¼”à$]'µpå`+ª¡§à±ë Ï¹Tä\È ½Ž-^f/91u©Ñç§O’ôÓBE} G»^^¼>ÊzïQ²ì~ì"Óp–Õ.ÔL,¯Œ}{Mzuœn¤»½ÚªÒåëÅù&q«ÁÇâÔ/$A3aQyÜf¥À­¦îJgÂ.ãø´EóMÝeýV}“>ÝÖN¬ ZQhª¿ÂHö32ìkð3W‡á'ò¥¶5DËpa܃£·~Á¤{̓Ô;–§{+ªUtOä©<ËÉë˜[–B4³cN¨øÉ£ZÓÏH%æ_rE©}#Úó;B{éêO~±H>¨¥•›€ªLŠÆMc°kë2µ'r¹™ñÞlË8³(%6›ÕüÐŽø¡¥¸¬êñ$½èÝ·Ï€ ‹r6j‡;Ýg¾}½Â§—% ù*w$÷Ìt¾?0<:“úöÈÇþ«æ@§‘Î[O*ŽÀfÓ" ðÃç-Çaƒp„|÷®Üÿº‰) endstream endobj 322 0 obj << /Length1 1485 /Length2 8123 /Length3 0 /Length 9125 /Filter /FlateDecode >> stream xÚ´T”Ý6,)!¢„4 (3ÄÐ]C7H0ÀPC Ý!ŠtHJKƒ )Ý % ‚tJI|èûžóžsþ­ï[³Ö3ûºkß÷Þ×µéiÕ4Ù%,f0Y„’ÈÁ%RÖ‚¸¸¸9¸¸@8ôôZp¤ìo3½ÌÙŽpü)gyo“†"ïã”W;䂹¸ .."œÒP7¸@™ €p€¹àÐK!=áVÖÈûmþµ0™3€`¶?é {˜3ÜêP†"­aö÷;šCíšs8 éù_%˜„­‘HGANNwww¨½ ÂÙJ”™ àGZ4`.0g7˜à÷À¨=ì¯É8pèZÖp—¿ìšK¤;Ô¸7ØÁÍa.÷®0gÀýæMˆ@ÕæðW°Ò_l€¿Ïäþ»ÜßÙ¿ Áþ$CÍÍöŽPO¸ƒÀn¨Ê*q =l¨ƒÅï@¨ â>ê…ÛAÍîþtÈJ¨ ÷þ=ž‹¹3ÜéÂá·û="çï2÷§,ã`!…°·‡9 ]p~÷' w†™ß»'ç_7kë€pwðþXÂ,,aáêÈ©íwr…A¤ÿ¹7áüc³‚!¼\\\ü 0æ€y˜[sþ.¯åéûãþ6ßOàëíˆpXÞó…[Âîÿp¼] n0ÒÙæëýŸŽÿF8@ ÀnŽ˜Á¬à8ÿT¿7Ã,ÿÂ÷—ï ÷pÝsàúýû÷Êèž^;ÏÂÿÜ/§¢¤DA…õ¯‰ÿí“”Dx¼Ù¹yì ^.ÈÃß/|ÿ»Œþw\ÿäB,¿º½?¦uìö7˜þ3à¿k© îY 0ýCrC.^.óûðÿ™êRþÿþ»ÊÿäÿÛ¬«Ý7ÓÿÿÇ µ‡ÛyþpOZWä½”÷2pøßP]Ø_¢U†YÀ]íÿ× ABï… á`uOfv Ï_v¸‹,Üf¡Gš[ÿE™¿ìÚ¿¥fw€©!\à¿ß–û,.®ÿñÝëËÜöþýp¹çåì^>ÿ½¯Œƒ9Ââ·Î@¼|¨³3Ôçþ¦ï/Àx/H ˜Ç&89ÈûÀýŒ¾K„3Îïks8e›þB`§ò?ˆÀ©òo$pïƒþïÉ ûÈà´þ(à´ÿANÇÿ€|Näø_³˜»:;ßkúåîýþó€À`0sœÙi„¹PˆMuHóE¥…;û÷^Ïqä)–îº ™Û¦z”ðå w^ÔŒDûäFÔå2Á¨èÞ3.[ã%ŸÔ(Ág³µÍ–fkl>c"W;.J®  Ŷ6}Sn «g }î§âÌ$lNGß§2¶ä„ÊÏ?XEü¹Y#ññò‰ wŽÛ q¶[ÈÜL&ÿÐTª±Ïlá N¸<©þ2z,úÁ¸Ë¸Ê(ÈuäÑTAé,Û[2Ýä‰ò£é­XÔšˆZ‰ ìFîŸÜ£#Ÿê ç¶Â®m6vJ©ø'¹×yãU”‡ÚßÅY)¯éúöZ¢S»-\œ!Ç”Ý^gÏgÖ/ÞËhb7_˜§ðž£ñˆÃßi‡Þuî_G—Q¡=Åíõû8»MZ:Ü*)ÅãÙ¦/ŽlÍ&ô´^'É_äÃPX¼íO4âs"h¯°)ä$¸xX QfùL“J(OŽjDÅáËPsMAsˆ=÷S©v¾š·‹·Ò»‹jÈY7Åäø ã†Ìû1­õ¶ÁÂåÀ—}±ÓÁ54·Dy >dêÈeì }¨nþNt0uª4Ë®4‰*-ÉKóÁ°UC9Má)õúê, 9B¢&yëλtáô…øöÑ\Ë7LT)º"“ÚF þœÒ°AÀ¥^^ƒl^4¥óÄÓê›%Õ€¾ kÉÀ²ØîðÉë“Gz}åÂ.’ à˜!šŠTÃkµ¨MÙµXÃ1úàuÎÙ…'uoêOî-r¼Qa0šÏ«ä_nkÎÄ×¶ZOÚŠ¹Ù}Α©ý‰RGÚ¼q…d\í»Äéë}óùüýñŒ ^uÎø'mï1 ¥qŸŸ²âήE?˳!Âs÷`ŸÖÓ2|¨2.FÈèé9@Ïlvf¾O³Î=&k=[}Èó$k(¡É¼v¤hU[,¦¯­ªÃ@»éîX S+±f|h.)ñ^„Eq*­ØT¨uOÆë.ºË¹3. ®„ÄÆ+a‚(¥,UVt4£Ê¡äÆOŠ«a«x¼wФŠì­l ¤‚vpŸ|°°½‹‹oeLUüãš¶ãp¡ér¬€†e[z¢^ó§dë·!Q‘Þ©+k'‹ã7‰ŒŠ/ås¶GBçD|d…ñâRû0é è߇ ;>*­¯ |{hiKø#âYýÊž½twÅÌñ±'“V[É=à / jüäÃåcsˇy2S•lsGJ€ÙXÔ!û1ׇOR‹f:ʵ7ú¸KñÑc21·{ø7ê€Î²½”óïh¯~ó£“ Qs,ô ¡¨2éÓ zþ s–ÌríTÅ?R€ñW•N¶å‡$Z¼’v7´9HZ¶«‘_ç'Ì0Ô«?¬[•,|,À† ¨¾‚,EY甇™,ØŽ¬=|Ôö°ë§ª ްV¦î€Ýö–¨ŒMGÅØëÞÅ59þ_-Âõe`ÊpÜÒåbWß[O{E5Aó©ÐS‡.¿çœx[C]‘ËŠ=·u1_Å#Le)Ò£ØÔêdû,8 ?³Øòàɸ‹~ð»êƒ0Émtч6º‹æ¥YÓ@J·ÆÀ]½2b)OU½Ô,}±J¦>*_šVØÜ6êžï¶‡mb‚–ý{xØÞZ§Oé4ŠX´Éhçñ®€9/6eôÍp²gk@á!;˜ý´.:"ð–µÀ8lo®?¨²§èë•÷¦Ú û´-Þ£c¤¯X?.ªïÛ¾‡Ç‰ýëÚâ[¨ø!ÄqxèËTàëàe Ü×× Ë˽ŒüPÖSnË+©ÕÑU \[&óý@Qó4õ§Ã»yˆ!ÉéEn®JƒÇ§]m¶á[oX)™f´Ü-ŸäÕZ{í›Ý_ÇŽ?Þ–h5cÛÓ¡C¶ÌKuýT›;Ž“Í䣚v´Ê”¯ßˆ:쎄W´˜„‹tx5W|×é­GJwMF4z?ËMÆóÄŠ´æNT­fõ–ë´ë¾$3qðf-òX¶Ô˜írZ²g JgëF“•Ëz@Ó“p^ ÌÈ}/M4žv‘4&‚»KÎbñyØkº‹ÞCóÛŠÞšÊy6"¾ÍÛFɘ…ðÔ+ˆ À︳eBì˜úE¡h&‘‹wˆ íÖÝs¾#w„Ýr‰‚ÓØ£µ# Nû1£Áóå;a­½†¡zç†`Œ0¢ø¨SY–,ˆèQu% U¯ Á·ªG~eÎ ´¾ç’R<å½Ôº}µìê9Æ ¡šN"†¤øúú±“›ñÔ‰ž“> ñ›ÊIÎ ãV‚L W2yÑÜçÉá)O™€r¶È;šhÛ ´¡A?µÀÀŒNˆÕÀ†Â‘k$OŸmU™µ ê†Sç âþ3û ݇MQ’¾!ôt+: ëŠÅü–-zØ{ØÝÕmáÉÜtrmš…Ü áÖB&çT¯¹¿ xÆp½µxõbš˜'XSÓ :EÉ-‰‚Fоe,'{Îú§ºa¾Ã¶5]ŸÄ»õi¡yU.© ÈE‰Éo3qlzòz‡ýÍ2ÎÏ ý§2uü#EŽeüYru`®öX7MÕnCN`6>”D½o ¶S}Æs•öò×aiŽ ŽFðTT{y¢ñÑÿK¡$”‹·5›ýÒç"—VÅôà’Wô$^MAÞ¦à›yÿ~sÊeªb{ ù ¢ó¥½L&CGM]Åõ g•H¬#¡'c,Ó§lºà ŠNâ~6yÊ4§Òl™+ÆèP"¸UŠ1³†ßM eµåR@æ(œþ˜ Q­æAþÒ¾U·ˆþ¾=SA^~@S$ŒBÇä…‡ñÃVqL\Âèæ`Ž,ìS}(—pÀ_ßOŒ¶ôÝ ùÖnuª—Ô~z1(æóèhá,Z©õì´ƒÞy–ZŒ Ñ”wgó.¸)™õ=â¡*鮟qS´%×´ºÄÔv .‡$ ÿÈ7ÌÙ[ý¶(KȉV“ ¯: °° BôØ{âÁÓuBó_XEƒû)ÝÍ <øzD s¡š°ÁƒºXó×W£Ï ê_I r®l’a‰q ˜=^(%æ„SóO%®·”h™~Ö±NßhuJªén…õ‘¨Åå}Œ©¾¦*#ö8uøqB\ÑZƒ5™g/8FÐ6/w¶Å¿uG©2 ;ñ©EUr8¾_HXnA\Ò0o·Ò_íâótpÙÔÚs×0Z7¡EãײJXžÚÍË·n’"†ÞÈ&™&?ey^œ(b&tþ87X©‡)?ò…íØ·tO`‘”¹BλÓé»+ʲ † F³H”“Ø[Q¯Ç•=çó4îÚ $™pφ"Ë฾:Ÿl±ËÑàE⛣Ç|£Ò[#Ã$lÆ @¾%οú&viq)®‡¥û"rƒ0Ÿ¤Íåc+CŒHçËCÑjmäÅ´¼M§|X— .ЧV}öΞ_ÓáÕŒºKá,wQs²â˜VÅ›3fp9­÷Ù/ Ýèâ™±î¥áÍõœ/èDxú(3¯T‰Ì±]4….]ñ0¶Z{|Ì売³«(1¦ñŒL¯¾ýPÎð(vƒá&ëH²ú’Óœ@K¶ÓÇŠÙà™§î&²®"ý,ßþ™ÀL‡\ØòS[á2KȾÞc,WOÌj¢hò[®Tõ#ÏGM楻çCø‰tÔW<«h>çoô%‡4Šì”bš¿tJHWyâªÖ»]å?bº—Q¥ô6o‚dVé3¢ t¦¬´ÄW~8õ¿ÛN9ÒÙ±<ΩRbT—¯)´ª+wI×óþ)œD?ºR æ5M~gŒï9“(â… Û*ì"bX< ªùˆ3¼]ŒâÂ(ÕÚC‡Ê²Â{20>س”Çg`gÃJ!2ÛPy…¡fée‰wœ‹áš5kàŽ!¨Jß:Ž‘e§¯ÊÜÈËž¶1^¡:ß1æmMDp˜äø {â§œÒC’#{Äð~Â´Ž¸3‹‹â/ÁC].DtîÞ›]9§Ñ½Ý©g‚âñÙmy4¤™9*“T]Çæ}_Ÿ§aYL¿ö©\„xEyOžY™“:c\38Ù®¤ÈCNX¥ ñk—ÂÙþ½ îæc}9„ß´H­uù¼!…®«ú%Žç•ØRö‰ì¹XÍdÙ)Þ·ï¶þ,¹*ßhç«`!„6TŠì(ð´—uÆÕñ¤0†–ËuÍ™a±}§iãƒËöšˆ×Ùõ{<¡úÓnhÆÞ;¼®³*&ªˆ(NaPHЛÅ6üì8‚Cž¶_ŒáYûÚ’½‹“ì#Ñ¡Ïr¦Ýb×%!jŠÂænÊh#Zä3»M/ôB ªçËwÓ¸;ÓJè/Q8E(e_¹€mAŸ¡¯|4PÛLºŒûÌnô˜£M;£­ŠY€~ÊŒw‡¥)JxÑÔ¹³–<Ñ Nªc·SÎjTëõJ}Ñ?$ç( ~ÜîbÞXš"ž×`ƒô2¬Óû>Û ÎvU6Ÿ3æ8Áó2)‹2 „ú»š¥µYÕ¾l¨jnŒ«øüÙ\YŸPV•/`R¨M Â-”Òˆß `RáØÎ~h+2.M\éòkv€%ôŽï´$ °9å^ið½ÏRÒ&Ý5PþÕ;“ölßãFû*úÙõ Ãl màÕËnLÉì!’TÈU`CFQ‰£Šeò9(Êu¸ù­ó J¿‹Â×BŽAºÄQ†lô®™xøð_9«ZÊËMÄ,Ø(ç­jåÞé67ÊMI5$±rÝ!¼TœiÓ˜>¦_†¼ÄvɺKg„öh|77ZáØŸHH3/ã˜D *çKûôõ^ê¡)geJ./ÔAœÚË•ÞRL‡ÓPW´˜B}ò©‡ÄÖD¢ßŽK”_G¾Zn~‚!r;jÍ@Õõ ÂÛ— d¯°*J šœQ2¾Â¢Ÿåþñ3Ä)!SþõíÜÆ.,²\èC ±/¿øñSd¯V|óÏ„Øä,"« HÝw±^í¤s;«hä~qk—àÔ”:Âç4w§ê*Öß]Mh¢ôÇáûz+ÉX?­~%LÝV®é£‡^ÍX0Ì0õè:·°Tì¨íKlÙ““0’Uä^w9hš[ýq¢–ĺÁRH†¹ÇƱ5üt [ºü¡h8ãŽg¨Îˆš)^D7™ÊãŒÕMnô†7â5Fk«¦É’a‚gÎmsP˜60kƒ¤™_:z<ËdÇ÷üÑá z¯€Íªì5É2Àº¼Öž¿¢~߉P¯<k †§ézPÿ)޻ĥDƒ #œ¶2]W8£íÓ[ÌÂr•*ãÝ—*9sëZl-‡7Y¿ššãæ˜ Ê7H™î6Q+°S q¥‹ˆ»ÒM|V¥„ï‡ñK”k„Zµÿußü»àöJÛÇIn–ÁJŠgawÙ±ˆ–®Dó²ÀõoÂÆ“F²Ú¨§LÕ1¼£h9úÐ×cÒþ7bÄ~H"%y˜œjïXÅ)“çÒ,—"<ç­œæŒ_^TºæOÓ÷°Ø&êœê;f1ýöðC®ÒÕþ‡â§U\B“Hg›7,˜5wÆY´þ%oŧ¨N7b‰Ñ›#sSéýÊŽœÛ’ý2D4pɽá‚u)ü"Æ“˜‹§GA (Õ”Å÷+ç®NÖoíÉñ¿÷,+[/»ÂjÒIó"ÒŽ½ÓU˜*-s'yJ sè0lVsL¿ªóx^^ ©€Ëpm·á¿¬i'>1}oúÙáé½¼ß#÷šùp“l±Ö *m© îU/'¼j¾¾%9*s¬Ã€÷Ü^ž è\쌾?+YGkøºÊ='œ³>¦þà*ñÊÒ–B¢ìU¿ÖWVâd3ÒÆoq2¡È?£r_Tëa¯þ[ýfb¼ZKÍ<û®Š"ÇE*~ëÙ-¨¶®ürèvƒ•/Hèð= X'ç»/AfÿÏêD®ˆ$«¥ öÁ2Å ßÀ·œê’/Š£ýž·\Ì?®‹‰¶ú]l@d¥\3ïÀn­2J#¦c¸™;PC_.N¼®`ovJElapx5DL9S}áÖZÄ!ÎÎóåc(*ìLÇÌwióâMŠe_Jú”ìRx`Õþå]×9š-kÖ‹ÝölýÛJKñ¨ã%)I½žhNaCËœrJÜPT¿¾™†êû=ˆÃf!£t,JÚªì2D§¢f™y=yÏTE™å§\þÄ#’!uµÌ(si­ß(KX*ýZ—Q‡éœ6N©WéT‹|[¾°(±Îcü«,—m$eZäÇ/šÚ9Éž›VæMql$®6ÕmžÔžêÄ6a]ðCud/v]äwš4 œ“´éb®¶dI‘mîYo†0Àä µ/î$kòv9áY“ï?9ëùø; §¸«‰²éŠËÒ¹­¾xDlQÜb‡ˆ"-!l^Ùs{ö'ÌàüÍžÓÜrÉEûñ`N’T¾šêÃb§ G‘0{‰Žã}Ý 0¨¥щíû›;ê•ïãøX¾„ÖpÒ‹p‡µÅ}â³Z£h MS/“f˜l…™²u»vþzÚsK˜×»Ášc–˜¸.õi´Çt&¼ŽÄõzBŒ’œc4â[ ðT5.GG˜“zÆýAWñ Z  Kß´`žù—½™íÏ&ø†1 ÌÓ"t1²{éoóBFi^¾¥ ÷Áb—ò+W‚z’lŽAi«ß4­¸¢$jg„ð d¢Æ®TFb– b?´=¶Bâj£¢å;Íe¹q„bÎX‘‡€­Ÿ-åʶŒÚÝÔBê™îÆ’žØ_XÔœEØÊ&p2KühÌQ™Çtü5èE;ÇÒ §‰^UÆ××®Û¿­…PÅ hÛܦ­‘Ìw#aʼڼk6ÓꈶS<;WDc¢ŸO;šX"»×wÝ<ñc“4Ï×ùâ™Öee5UÓ“ø]×»©º¶òÙƒÀÆ[ »Æú}T2y“k<0Ó ~åi Õ¹ÔøÙóЊ ›JUS[}váÅ+Ÿê •èŠÇ¾ êOÀxÖ-0æsC¢|¼UÙ”_øêÜÃpOõ]åÊŽ½ò×R‰¹ÎÓžë=ò»6KÛÍI4h?“yð 0rü/s†Óؘ¹s&e'OÉ>ÏöÉd‡Cµ‚müO× Î¢R=´¸Ûôr,ĵI7í¢«U±w±Úêüû4 šíðŽV¶/ß8¦~JGfcŽÆ6$`ûY±Ž‘ËŽºVJ`³E[ÈΚ?Wï—¯!šÀÆÚüÃ!’wNüÙË`9{J7‹3JV¾ö^mÞ« ¢+“¯[±ARCÍÂŒµDŸUZ!°4·w°sxÕ:WfᣭۿxbÒV6ìöa\¾íëu8ü¹ÆÓnßæö8OÎõ<$[z†ýrIÖÄ'çÝ “dWçU•‘¹‹ïFM[µ–ÝÁÁΓËÄÖq0#—Ÿ-ø©ÈQŒ`%;$’°ùH\e6‰¶õBÛÃâãYƒ¥!dqî{çàQ7¬c÷ô彩Ρß<‡Ú­=0z ­íKß/„Í+Å›f½ˆÀëÜÛõüÙžÓ³YÑgŸ—vw¹VXÅ+°…B»ø.ìZº§E—4;O•wÚ¯” $»e·7HX±“ô)×ãe§í'ùÚüq‘ô±ÏÈcû.tuˬ½±Ëâ\ÜŠGücõIÓN¸Ö99ìn`ˆ×N¨–½$§šªˆ(v%;`SÈRmehl(2(ÂQµ:t¤½`w,ý%>T’šNü:”s\x)ú¬û´4Á›gš$„ß‚‘Ó­dÜîû»Ïî U‰ÍýÛ´ØÈzÏvä/´U6PÆéNhÓ®*œÛ³TÀ;áã¦JJêAp}Z(Õ‡÷‰ÒŸÌ2´‡!{vÿ‹~ÒY endstream endobj 324 0 obj << /Length1 2615 /Length2 18537 /Length3 0 /Length 20044 /Filter /FlateDecode >> stream xÚŒ÷PÚÒ cÁ]C°Á‚»»»÷`ƒ»»»wîî®Á%Xpw'Á ¼É¹çÎýþ¿ê½¢ fµ­îÞÝ{äÄŠÊtBƶ†@q[':&zFn€ˆœŠ #€‘‘…ž‘‘žœ\ÅÜÉ ø_9<¹ÐÁÑÜÖ†û_"@'LÔÀ d(gkv¶0±˜Ø¹™8¸ÌŒŒ\ÿ5´uàˆ¸˜äèÒ¶6@Gxr[;wsS3'Ï?(¨L\\´¹„¬æF69'3 5ˆÑÈÀ  lkdtrÿŸ”¼fNNvÜ ®®®ôÖŽô¶¦üT´Ws'3€Ðèà4ü) o` ü»4zxr€Š™¹ãʶ&N®@H`en´q¹8Û v€²”,@ÁhócÙÿÐþn€‰žéŸp{ÿ dn󗳑‘­µ»¹)ÀÄÜ P—¥wrs¢Øÿ14°r´ù¸˜[‚ þJÝ .ô `ªðïúÌíœéÍ­þÔÈð' ¨Íb6Æ"¶ÖÖ@'Gø?ù‰š;@}wgøûp-ml]m<ÿ‹LÌmŒMþ”aìlÇ jcnï ”ýÛ$‚“™lŒŒŒœ,Ì =èfdÆð‡@ÅÝø—’éTƒ·§­ÀTÐÛÜúïéhà898½=ÿ­ø_ÏÄ067rMÍmàߢƒÄ@“ÿ`Ðù;˜»´AãÇ`üóóÏ']ЄÛÚX¹¿™ÿuÄ âbRBâj4—üRXØÖ àIÇ  cfa°±pعØÞÿEÑÀüï,þå)ecb àúO² .ý7a—¿'€òïõ üo,y[ÐÜ”oc®ÃÈÆhúÅôÿyØÿrùÿ7ã¢ü¿ŽùÿÍHÜÙÊê/=å þôÖæVî[€æÖÙ ´r¶ M°ù¿¦êÀÿ,®ÐØÜÙúÿj¥œ @» dcjõO#ÍÅÍ݀ƊæNFfÍÆĪöÌÊܨhëhþçfÐ112þh¹Œ,A·‡#h$ÿRA»ó¿Œb6F¶Æ–Œ™`àà`àÏš$f66€'hn 1€ÞÆÖ äUç 0±u€ÿs¤ìl¡?¢ÿ vƒðâ0ˆ¼!Nƒèâ0ˆýƒ8AÓ÷†˜ oˆÀ ù†X RoÄ.ó†@ì²oÄ.÷†@ìòoÄ®ðâ±+¾!ŸÒñ)¿!VƒÊ±«¾!»Úñi¼!Ÿæ?ˆ ħõ†@y¼!ŸáuÂÐÁÀÈz_LœÞä,ÿÈÿ³ ÿ(@DFÿ 6P0#[+ÐlüWÂÊúGbmýFøghŒÿ, *Œm­¬ þeÊødüRö?z{gÐò½¹€šhòæJ×ÄÜå_1þ¨mÿÍ21}‹Ò›þyÿ6ånöV ¨ùfîvf@›Y€dæÿ‚ L-þA¶ü5ç-cvP¬þ,Ê›ÔJë7ºÞ¨Ø@±l@ öÖ7µ³µáŸ«Íô_)îjÛ·¤A1mÿåÅÄ*ÔîM â°=¨6ÿsجLKÿ÷¨YAÕÙn@Û·Ãc5ÑÎÊù­vô,9þu?ü“*ë¡­ÐØð­~®¿…ÿKÂÄò·ØÑü¯;é-qP ¨ü7Z¶?èò¯£a™;‚¤2õÏÑÊÀÑì_!@õ¼ƒ®z'3à¿fÔ'WÛ9€b8¿M>ˆó¯ïŽF¶ÿNtÌ.ÿ‚ :]ß 3(¨Û¿ ˆÕý-I«Ðá?”ÿsk9;€ÎÃ鯇 t¥þÿõ=tÁ/-ØñYÔuÜ×á¹ÒíMòÍ’ï©§RÑy.9t:?"Ã$QUgl8Ü %ô¡®îˆQÞ.ýöŠà¾×o{/5KÈVðniò\{gNdů÷®nõƒe+ã! {Ÿö«ÙežË¾ÓE«FéøÏ‘çfÍ¿'v¢#€¥F¿tC™»¹EÏ™z%’Ž£÷>f)ôÔÚdþò0ï±V¡ÂìØƒK†«õžò}|棧ða²4΢gIQÔßb6#=ØÆø ‘×X7ñ·¶¬:£•×Ä8™w{=ƒ¿F?"\æž²¾uÝ òâ{WWq‰¯ -Ezûápwa4Ær.10òîžû[KP7š'72'guSÚ£Ú&ÛpðÛX«ÍÂk¢¿Cí½1å ñísöxXd”’Õzö[LÚͺí»)w•‹;#ÃÃ$¥¡ b¤7qÄÝÔb°êÀUsµ‚ÁéôRià.‹«®ÐÛ_í¿°žåk¥rÊä?‰€šÓÊ 5ðmiNQÇ¿ÁŒdÓdXÞáÕª*8,È LÇÆ›(Ô›ü˜-…ÐÇz8w‹µ ŒòÞÌÎÒ¤9L^»2“[øydôºZ¼OÀT)M¦´^7|"–WyV1 ¥ç%¦¢ï¦l[{¿?aI·†Ô'u\k¶Wë‡û¨ÛpuT]hí7õ¢Úq³G`Ñ÷ÚæyH¸ðÛƒ½¼»â6ºûg n,è?ÿžŒÎ]“$j\³ÙÖ;¾r™•kž¥v³n™ÇÞ׬JÁç?]E¢wØÃ¨ˆµ3ñdíñb,?È9ÊâÑ=f¨î2󚚦¿/V‚Z©‘™ƒ´Î´ºÕ[ý¨¾ê‡¹öÍ“°ùëåokñkåY )ÝxËói#,±â2>RØ!…‚Ø*B«rO ŠÈô<_Öb£$GiÌC4j³y¼ëâï³1÷-55nÄˉ:òÙ¾µÛ­Ä KumåE(°ŸKs9ì>uF³2K¦Íͳ^:kŸ"¹jvö'§gïe1wh;MM^ÎjÈ0û•Ñb˜¹õB½DAæoìƒêê´øQí]l+S¢“ØTÀ÷浯‚H3_ýp˜pûóëÄõ”’é²’²®ûŠì±ƒ`ô2‰Ÿ¢ ¨™L]ï˜{òXŠrsZXºË·uj8¢úN–‹‘d8_µ/in>–ê_ð£Íèé‚5P&UÎR@[§= ÈP ÈlÏ"Qðç eŠm*ÊÓrËzF(³H0+! ²ëäl Ð]ÎëakDSø­ÞøŠcÓÛ›¥ö¿»ÓÄ˹~² 0(+q_’¯Rµ›(Ö¯¬üµ.ÇU ½ûSÚô»¡+ñv âx‡ã€ÿ¨Ê÷D°JÑHÀnu{b]_ó¡<×öý×ÂR(˜(н>ýM3=è>D•©rÉp ÕnÓW´Î‰øë/wý¹úèk· ;þ©~·‹kŠB»° dJ>¨rM¦ÖýÛòð\Õ†S…Çw*ðäúOñ=ƒ(ßË rÓ‹œšOÈp}ív“¤ÃpÙ{žcuûÌF¶“»Ôö‘>@û+»ØxÛŠÂpÌpÍž6Yò– PsÈ9¸'/os§5 qýÆÞy‚°ù[í‚\"Dׯ^Ó§£9cHzÛ3êÎdô­¶.”Ñn ¦ÝýX#<Óy·-ŠŸ Ø)eò…§Ð‡iG¹}bvã˜7.ªúu&:z‰Þ÷åbʧe¦n—9pçB±ÄjP?-ÙøŽ‡>fhæš.¹þ óÂ)yŸâ"R©ô؇ª]>ÒÜ–†Q î)ñÊûÖŸ/FOÅ™/”é¤O“2i{¼tœ[U‰äè©¿Oìõâ[i@]5a| Š CEï$…of·øFHÍ™kî×VëWÍ$õMneˆh8f“eÀKÁ©I›Å+ú’Íòg«ÝЗ§œ0Iê©øö¢²ƒ_c%ÎŒžq×Ó§küM ‰P [}6*‡Q®(D:dç§Bb‚E%¼KyÑ(þ¯Ô5 öíA·„YÖï8dŒ ñJÀŒŠóã8ƒ°ªIàmr1NcXã¥j³ï`$¤#¸G'Ó;V³÷“¿:ï“Åžù6ûÁo².ÖZ xMC=à TvÖe2OÅùÓ¡m+÷Ú5ß•7A£XÃX åŽòèØ#}Bwõ¦u*ã'ìÈ@ÒŸ£RÐ<í~Šº8è#W­ØJàÝ/IχImR´‰$ÃY þ·;†Â9S“ÃÏ‹œ^«+SÙëk:²Ôé14z nÌrëg~4X$&åceãw¿ÀÞïi’ëSôUÞÌ ¼_ä~}Þ„¦‹p¯„®;-.U¥bév™aaj˜-™` KOÉ ß»}Qž‰O5 ‘B^`gß]ö‹Û·‚_ïÈÃvÙS/~ÂH×!c›Ý¶ª9¤±õ&ox½ÂI2AeUä÷Ô" IgÚ~Û_—ó Ó½¥Y8ÌVÖÉϓϤ§©‚Œ ~?èM}Hþ@‰ŒþXöèdìø;C\Þè©=½ø)€MÂgÂ÷G_K6pÌI0g\ޱ£kèèAÑ=̽7e .ÔP–ÆÏúžþ7D›óŸ4¡Êõce‚d8g‰æV3¶M Æô”çs-?JÇý#l¶ÓëwoÅçÓD§¬¯ÅÒnõIœ‹Ã³Jø+[ô8:ž£úÎk¯ÚXaxDÅ¿ÈZYzÃbžƒ9útælB䥉_"§®Ó~çŠWZVÔ!Ô¿»îR°èNéüPµ±¼OÓ£ü0?íX*7¯–IUvŸšü³w¦LúJSíj,ƒ³á´‡©÷7´1©´,¶†\ðÉ`†añø§^dü‹®V£æéÙ‡†Îj^S+Ÿè‹”86Íj™)>å½+ÝcxÁ°¿Ï0ló’Ž›O7«XCÇ ×Ûm‘ã–jøkÎû¦»¾‰¿ó"ÎQ½)X­’¦÷ª»?+Hm´ràfL1xÆêAy¸Ó;L¼wC2ÁËë'zDçÞ˜Y¸ºZœí¹kPÎ*Ý¡Èù€çá‰ÛzbØX8kd©hë3äöž1¯¶¯ÿ¾hÂoGj¶’8I%°%R©Œl–¶0 ä”!÷P¬àtÛÿ£X*4go}Ú·g98WÕ»ÌS֔˴™›æE¡šú­ÔÀºš4Ñö¿äâ ¨›³|Úðz³D¨}m8ÇÍ…nÀcU:"‰!À.¨›n<¾ÜBFF*µ ‘Nù¢Þû±«ÕK]‹ò!èxZRnDp?t’ÃX¡?4È^=2Ä î·zµ'›Û‡Æ…šDŽwš0ÕýhqÛ‚K^Jç]ê[´Ùü NBÄî,¡áV/mµ©‚ 'ÖÈópYe1α¹ ‚—`&l@èNHæ¨/îO­!€Õ~ÉlÅ-ÇIÞ¤¡ŸÊwÁd’Ox‰®v“X ófLwõ<7%ÓïôŠìQx§(/~ú>ö²Iô 9Q?ÇLê!à}†3N¡±*W!ñ$4g¯ùìâ ¦°‚ý5<Ö:ù ' Ì,pÔ!Í­=¯F~ælhV•YàÚTäó“9&©¼·¦ŒŒvÀÃ`m×ìPê…’â8Œ¢¥9ïº ø^BA,Òæ‰~˜Ó¤BX¼âPºÕxÌ­Š'µ£ Â!ù°ðò^®|.bÀ;ÆÄ;Ü׳ÙˆD†Z¤åõÑDyè=~t‡ÖÅ„yAÜ㮲”ÞÄ—j6Ìzˆã¶L6 Ö€¨‰M³Ÿ¢9Ä«cùŠF'ÁKúÜ´µu¤_ú Xeµìñ€n¦¤W¥rB_Mmh3€ôf¸¦»øò~Œ ¡xï ¦§}¥Ìêù¦ï!m0|Wr¤ÌŽŒý± ,8ïí&f÷ƒÖT1EM…‚^†®õÆVÉS1H Ë)Ÿ‚0Áʘ3Í)jŸ{¹Ô(úLã”È”ÇL%´€ì¹Qr±c¸X“W^â¡Hýi¬4EyQiϘšèÀJþ çGŒ!†ÅHh)&„k§óçÁbÈ÷øŒïY ?w[÷óA2nø~ºúUïlòkû+ü…œ<Ô×öm {‹²«4*øÑ/'é³u4ÙMyBèßf¦¾n·—²”œNáZ°vxçÕÏáP‡þSâœ;ôZÚ᥉w²ÜTB¯o ¡Þ§ÚMñZÏOf{}§wSóQ3Xt,ä¾%‘ SÀ¤™ƒ0e9}í5^cl×ö0ì€å9“b›F%èÅqã“ãvÏ%Þ¿=šHÂt†¿HM4ß5ƒç’wBÃ%ˆæ hw67ÚwœØ•ös…7ÒòjêÅ|G&2¬=Ch±¼ DøNröT·Ù5ÄóÅK(ÎC|K“õVæ‡2¾ähªôVqö•Ï+&yf±¡v7š‚@ÿÕ VŽ’kèFë7±J¶|’lõ=/?žù*)öóhˆD  ãˆC™‡_ŽÞÌQ¸žŸ„¨\?H;Áhl~Á2gqŽRBgPɰg‹3ô"ô9yŒç=b~êáÀ5òöÏIûP(«1§À~ðÄ€J¡ÏM45wÕ ÑÐÝWBØŽuÅi%Nv#A›ô:.§ïî-q\”‰3*@e¿únýgrú+Ç– 1§ðhç+ðúUDÛÂ)ìÆyç0x™æ e F-Þ2‚Žk9½l[1ˆ­…‹D$^0c  ’žÏ·Íf?8bä®M^k‰V—hwSF.þâB¦£¢3Jàd…T¢²#Úˆ°”JsÔüœË5úð°1N©ÝÒÅŠÌ«Òüî”ÑÞî²þ“ØŒƒíŽäã§°ú4«ƒŒÁÀK`ØÒkŒ~É·q`©á]j›@¹EµÛ%!bõÖ6Ü·<ðvŸH¹=‘__ëo¿“8¤ã9fL*‹TíCðõ}wE|Òž{šÓã%¦+b"«a“M\—CC“¢ãÁžO”:c 5&ÍD—æ:ÿ˜&LZ ˜4ý²ÑdDÝ.ŒNSR‰µ*®nc"ç=¥¤éœf¨ÙPé’~`$ðÙTÎ’MËvÀv s¿$§>ð»In¤ÎÆ™DÿÜ󯓉0ÚÔÜŠÔSË]1NŒfÈÔœúaò úvÐÅ(“ÛGÌÌæ%Ncp” Ú‚;^<"E`ºì;ó7HAê-´"‘`` Ø·áŸNÃ5õKô¥? WošÏÙ_ap"óŒÐ_O}Ãë¦è–•»«øvqaØX$'ƒ›bàih+“!µo3£dÛ‚ç:oJpÍß;í§ÔeO €vYNñXв®ü¸`+µ ¦3³¢k¾ b:­ýyC«ñó©E~UþK"[Au …<§+Š\9 ·K|Ä(IdËlÙE©ïV‚A‘6Ï”&âýzkÄ»ÚÉ!`ôõÅE)‰¡ã¦¹=?íÀ-›Q‚þ’ –ý¾(àô8ea­éÐÛ§"¬Ù©ÒCókNãËjÅã»ê Èmin#‹2–¢fxùøFn‘XÔQ^_ìáz!.¾î¹PƒøÙ÷Þ˜rcíM·½e÷mœ³Š|ß²®ä¨ioÒÐýlx\Bæt[ËtLßä=²ðm¶×hæ¹Ús·œ—7Ãåônµe{ÜcáW(ï#ÂØUòðtþ׸ôúûF’L禴ÑT2÷£é²…<µS€®zòû¾…ïsüùk;ŒÙh7¾DŠÂñÍêÔZ"#C ÙÇÊþ~p'ŒõG~ó18m“ =mÐ{ÊAµl“IwtÞá°sCØKt½Ô8-R"U1žLí!B©Zƒõ»0U¸ q”°lRÑÙwˆ0;b¾r™ï°m¢‰þ–¿«#"¤p•íCBߣE¯³ I:Sw©w—›44qÉh-xÀÿH;" Sˆ:ÓÔ!¡`|6€õ1¡T±Ç­¥á£úûô´×“‚s>J”±”ÜCîmo@:Ùñ#ÿÔŒnCÞ”•K•»â¯¥gã¨YmBÈ'´6×]ž30£B®äê# DeÎStϬ8äù,Í iVK,ÇÖK 2š §ôß¡ûTATÖ#eÕÇ?Í!íÈr$PUÖ›Þú5û‡,þŒ›ˆk"¡ëéx5„¡Šeü¦Þ†G©Á‘½ àæÀ¯¾±ø`‘ ‰XFÜHQÕÉÒê†9€Ç«í8ß-‡:ÏÅ=±‰]ÓKsláÎÑK‘óìçKlÆœÁ‡çœYÞqâ]V'=©Ww\c‰÷îCõß÷Ñ’ú=ãsñeøI¼½ÇòuffœÅ~0Œ|–Ѹî(ðxÖ¸ç#úI·9·5Û8A­£Fô’îĨë} ju!]¢ÍdÏïZi £Òv hôgj‰GyYyjmÿ@JÄŸäx‡Òð…Ó½4ª§Ä­Kb)õ ´—9qª01ü`!_f ¤ÝiÀ6ŽéæõzZ}qÙi/›±t¬§µìw¨Lyœ À—©÷ÜîGx¯)vhûØæó~^4— ßÿô.çéÅ“epÒCžýЧ½&YLàLF§6#pšûð»üqNnø3^Æ×œô2f÷’ãç¹6ãLò*•ß<šsì»tOÕµ[ᶃ`¦ø¹¹aIÔÅj?YÃSºâ v·CfšÚèO·O&]6â¯kŸ›Ñ?,Yî„öŠ›uî¾Sv¬S/æ\F§ä¨}\BY¸ƒCÄ)£¯#í »¾1èS"JolÌz^€™rd6Ïtz|W°¾„Ù-ó‘ÏÈi2yD­ýn’€¢nÇýºÖ>§Í>>ÅT’_ÜÕEÆÿ- ­#3W§{(TҼĆ[Meœ=Q m‘¨f€è8™|)÷¸¯F:¡Ü{4–ítçÌCºY¥GUhYÑíÁçÅ2<Ç0;åÍÙa«yXçlcÉé"”ä$v›ÐbÏ^íyùf(fª°šP´™> [ß¾m…O§®m°†®F&•‡è‘Xf—6ˆïnI´§ªº¬ðø5—í–꽄 Ü¡%ŽI"Ò§›c»%çöÔŒÚnûŸÊ¡9F`»»ÀÈähÖ»ù]ÅœéRtŒ.…äÇPvôùîl¨´Œ-»¯M¶bc/nd×ûØ !LŸtÙ¾H¢qd)‘äe=§êB|7Œô#Sžæ ó…`8™ŒZêÚ>ä Ü£ÑwrÞ9q´Ä³ÁÙ2Î/jȈ7#ίþÊûÑNÇEå?-ÛÝÌ–™›/¥>ØxhýÂç:ÅR·SHjø5Šêþ=ŽåF›Ðaþì^ñO«Vyö™sy<ŠzÙ%™'òÞ{dTçl»=å^ˆ:Î3¥“tÅ1<«a~\’Ò4Å2ü¬ÝðÙfBñàüg‘l$£›}Ë!ÃæÊWk7‘žºuQHY tRâ‹àOWWr‡C› ¡¹)„û¤E÷]p+ yOOø8g+¦[Î?¬L;aT„wâÅ8‹rBå%­"«VçùcÓ&¢ëY‰% ?-X?ÀG§^O󧫇ç%`Ur9øôX޼$¶¤H´|&@õñíÚ£^¾É&ж9.*ÏkŒæú€’•¨‚O»1 Üö(8™¤íM”ñ‚ÈÏöîâG?ÛeðW&g…Ç¯â¶ŒÚ ù°P+º¹ý3^ˆO¿Öƒu÷L»©[€Ú­« ›;†ÍáBM¸²âN¥Q4LèóKqÉÞû‹˜)CÏ]±,ðAlª°ïOQnÃ]]ŠFKFôIúö5‰Àr yŒæö˜æõœZÂ;CßÛ祦ò¼fÐP?êÛèQº‚}jÆLD|'Ké§Ð12è?ˆ¶)°_oQùk&–¬ ­ÉÞÚß4©V3«=˜ÞmT£ŽäÌ~0g0Ù²,Qv}%ªF’Oú°4}8S7Y9’CuÏÇd›¯ˆ(;ºÙˆ?\·+µÆ®T®mþ1¢^jH€&»”¾j›Þ“^q1ïKŸÎèÁÌ;©+Úýï„Û\íxéA¡Â­SïV8£àMaÒÞ±~bÏ!N2Ïc:¤ëq¢ë4ÜÑ,[ƒV]º„q1>MùME…š¼s0òa‰Î%8YN|šÓO™“ºV'¿Ùm°nŸnÊf¼»çÕÅCκÞþ¾ŠôöÞ˼‰3®,U+׫ “®~•™ü@®µ\!umžIÞ®oM)7cp!ó:ÊãâÛÊ‚Xžè³/clÌKPÎ夋1µ<æÅN< DgƒÛwHeeÛÍz<éM”%sQ&'™{? ÀÙ /2±âšd™ŠÝŠºÐ–g¶Ú¯Ìgð¤ÁÑF!æua"±Â(aVä;ŸÎ0 awБŠk œ{)L¿D(øQ(w¿ìk#>]Ê*–ù‘w_‹cÔ=æÖ•tgSþ8mBUVîïx÷8HÊñ©*¬föö'LRNÐÊ“ÍãÃÁò)¶}‘éÖß>_ã`øSâLOBÇÊ—¸Ž;o·1%3LJœ Wàçw+4>,š©=*'‹QTnÖþ3Ø­6X€þyŠæâáE°zá‡hÍõ¨ïgƒ£]JGþˆÔ°q‘G‘| "3À®d„íë>Ø^}»vƒ8Ñ™®Õ§–zKÔ%ˆó¡ŸBÑ$‹§Ï¯Æ¦"û0K×2ù©—¡ö¥ÂèþìÐÝü²¾œV†iúJüAQKKŸ&, ÖÚ¨ÌW¼ÝG‹f¼ÉÂçE¹KÛÈ©åälª¡ÚçÃ>rEžÍ¹´ï¦¯|ß”¶2¨7£smo 7’ù‡õCÁoØCž^?SÉè"¹'ÜqtÆ.H GÑÅ/‡,„šNŒ´ÿt¢’QQ< ±Dqp¬XÖûˆÁ3%¡ tßòƒÿêÅPl±¸ýÜ¢Þ”Ž˜C»sJÂ6Û<†zSAâ¦Õ¯“tv|–^ÆÀn] 8?Õ4ð(õwÛQÐdm© ‡IZ÷ï…!à ·c®,£;À¬Ö/D¨)Q$ëbR ÚÙÍž'B,sày^)ì´–O¬g¶’Í¡…½ÒÝóøº!¾îàŽÁdfØaˆ‰-º)cÊêwª_¤~ájKºËwÛrφòF—ÑÓ÷ÁP캥øŽµYGîN@NYÑóÆVö"c Å”¹S¯·:^VÆ–}±)–0Úvv Ÿ.¦-kÕÄi{h¤hÙ›£¾§òuFû@ ¬^ÒAy—ÎDª{¡ûšŽÂÜÇ`76v&ލGíËJ®ëÁÊâí|lˆ+EÊfÃWG(„ìÁÎúrßeAF¿˜A¬×ü³l~ˆÿhûž¼Ò‹²‘Ä*IÈxËeÉÎT#Y9@†­/ÙÏ"B®íEƒšB£špV5F",ò”>iÛØtüÊn§„À ái‘–¶$ï&¨Ñ; ñÓ—àã[”¶£¯)fîUh|é“Û÷„gêctÞæS´å§lcgÛ 3Èb˹r$հ%Ì&µç½ˆ$»«s«¨Õî =¬›³¦Þ‘”±3¨W›˜„$x1KßS¥W¶f”3 I) Pƒ^#m¡+ædüpG%zºNîÀ¥’=fÜsçwrÚ¯7v‰üYÔ¯Á¶| JS’`¯GÅ3­{‡¦èY¹l~.å±ûªH¬à‹€ñSLƯ¥Zft`¾{s'ǸQ¬0ÈãFåÓœ;4xL7ìnjmN¤™õeoµ»…n_ö+_30¦ Hv,ÁŠ]§§¸_K ©·I—.vªc\'¹aÔ(iú½]º/ûdi&× Ú®¤”scd•!—ÀÈJ…]µÎΘ!Í…N/ó,!Iƒ¿÷Úψ€ !ð-°éi»­ älõŽ·]u6}8ôÅ…f\Æ•ÀOE¶aƒöB£ù1_*lA,ºcc½Çº_ÜOoíaF =´˜bJYiPûí›öêH;éFÓ v²¥~tÌÄFnÓÛ€‚à" ‰Дƒ@gÿ»úGµr{²Í“!ƒv)™§Ü—Ï+=ñƒUøæÄ]ÉSûËHDêaïœu]›Oš¼¿dëˆeþÚ£ŒøªÅm‘•”—Þ›ßð@³¶(ÂÑÅÙ߯,Èçà ÃGÝ®ùbý 4¿*Šá»0¯õëD3 b±w$Ó9"| ’94AØk¦5€ÓËQ@“ªª°¼Qþ1ò*Š·Mç‡èô}”r +£ç%ãNcð!2¤Upê¤äJø%‰ÁãF€øÕ éÁZrÂÃT‹žtï±ð wÝyáv°Ò ‹ ;ïŒÏêÖŒ ©Ï}«j\߀˜k¡¢ÎNxåJz~2nIØÉ½âj=Ä–o þ&¹½ ,<_ûú†~ºgVL£:[…†É8 \—8ŽR_ßWˆTWïß蹄y4Õ–FæÉû¤’Pî#¯þÚ>P&´ø¤â•ùÛ€vhCý'å§6]ïìhÖßK}ªbXDPqœæŠÿâßh}hâÞQÖõÛe5]ï—Óû„×ò¾èt¼~}wp[z$‹gbG@î·™!íû,¦ck|­Ø‡Üt÷ÝsKŸ™S´ùF3Ý^׏ކßç×Ý4q\3ÙG²òc…R’gµšÖp웡M¹žßJ õîGj=’=fÞÛ:†y‡ýÏDxqßS4œÄ>'æ^…GZFuùy>ëædÅVÿQù`w¾¨OëWe|ÁX†ôõ‡x=õ^îþiD¨Í…Ã@a*Q¬GÓìš›Ý*¿ZRÒÜÑncdùö;Rågïﯡ³H'»Št—EÓ1,\zÍŽklíµn#gþlŸNc”cÙc$YQ×Êü¿:ac Ó¤â¸Ä؉:ü.HÅxoßqá¾#‹~ûž¬îÚ¯VCC1»X¡&—=ËÔ~XGç ‹ʸìú“3Ò":…õèhG=eŒ„™º¹&ý/»ŽÖ’ú̕ňHlϤïÈ)> ˜DS¦¨íw; `ÌÓ&²)ˆüBÊ:û´§Ü©>Ôü"I˜p£Ð·Cî† ®¬ 캌„’2¿Ûèw(Õ¦°–4â›8ñ%î²øÉ˜žYçÀ?ª¸Æ%Ú³7ŒÝå53é@û”MH'r¦þÃ{›øI"_N‡Ú¡·8=,®ìÅn%¿ON&–\3ÛÏ@f…xì*\Ú)cßò«<ç¾áJcT±Ù¶ Œ5îÓRÑq©?iâ'òÈuG}è`ÎÆõ“ G-g³û ïG¨1ßæ-ü7Y§S¶7 —攬‚Ù 9‹™ïRüÒûÓy,=5q)S¿n$ßÙJiˆ"ad˜ZŠ Ûšà±±Õ¬œ(zÔ7ärPùIáÂ×ñîߘšÒûðòˆâÿ´|‰Ä8·S@¨þ…Yƒ0q×2"ìèªá“èygF¸Æ¦RsÚ6¯^”LJ÷-ŒFS+Õ°köå­ä¤4¯,Ÿ•sU)Çé&BÿŒöVÐÌòo¹ÙqHœmMB¤à´QÛ¨æƒÑ„àÌ®ÚۿЩQpEfWI©r¾œAcÎüèÅÈö.W¶âÙû)qUyåù2QÀá™É^ºìôô<%C‚½²Î•ºIOý+P¦4>   'î¹-hʲ˜u?¢.t#{úù Åa /9]›èù-e£¢"ÖlfBþ˜¶nÓeÃègѹ”_Åg±»“<3)0Ö¡ù†ŒE‡¶OãJìOƒAößI.¦jê4$r‹ˆ0Ÿ4‘D ‘X¼ »Dyôœ`,!¿›nw,¸<^j¼[®~@’üS_P±dqçˆk„òõ5¬j%Saúw ›g#i|I„’ö ¬ô¡ƒ&¹xÿGö_Ëð¾áøŽ?Z:ƒÙûÕp­ÖoÜf¯³ïOËWG«ZxÁi6{ '—áWkãÁ¿ˆ³ˆO!óÛÈa ?Z;ã¡–¼ë¹~O„Ü~®J ¤þa©¡Ì’oŠÀt>³N™«.Ì¼ï“ ÒÿŠÛ·mþm5Ó]ZM©h¦ê›À`RüWH{2ªÿˆÙ-ƒj †ø.ÔÕÛ •iÿßY4û!_VwŽ"g‡.IvMÄéz[`¸tx,‰›|lÒ°>–‘èÒú;7$I¯ÐD©d¥§7”2™¾œèîËâÙvå\Í»>98v.LK›†Šp­9„EÑ?LJ[*^¬Ìï-©à“µ=+«C5#ô?2wþCØ.Tq(EFèkó9.÷“2©šN©‚æo—AxÔ‚³qˆ{WK“y&ù¾­¢¯â$ò,Ö!©·vôbNAhä8ZÕXÃÓÊR µû T›Æ»°‚Ò YGpCoƒ;Û—†ãë™ø˜rôª-“4¾·±õà¼ïX3×åeôÒÐ* /Í…êƒ2AöK4QgiÔÙI;6Ë1šIo[–dAµoŽè뇙ïb¦‹%þ¬-š6ÅÝõÙ#½\üÍH5vG>ïã¸H)ΈrrŠ]åJSÅw” XÛdò ±F’qý›wÛðÉ) >œ~¶ §a2W¡°–1yB®¾Äð|6áKP¯É«×wl(À;TJÞⲎHN&õ¦=‡ùÜt7Ü¥™tó¢e©Xšý!\è NÎT¹? œU©,.)Öað’Ñ9³f1¶Ç²äRÒöC©TÌÎ @=ºÅ@ÆxÄ ¤ÃÖ`uùÌó\õeuì!–%Þ*ŽSŸZB Òv?d)ï.™DÿÞýå'ÌøÐw2Üw„k'só‘ø“[8þ…¬‡â½º0{H(b»¹×ïKe2+åtÅ#Ã+®Žý.1!±'Qž®Ó¹5HB¡.dhž¶‘ÉÚµãÕB_óN 6Ï,sä2÷Æø´aztÿŽ—…ÚÎ蛨g+µˆßa è¹Dòv…㜅œ%åXZ«v˜¶Ó8ØM¼^mâ¢+EùR‹V.“=jx3¢(5ñàêuáz)Äf€½ ¿É®˜³’~†Ý7/ð9^ÀSEÎùŒÍ@_·èÍô¹d{œkƒ-¼­‡>øO,ÿ åx¢bÈõœoÛ`yäu ¥büs­ulûsâ%Ò-hø—«ñÔS–*rüéa´- ¼L÷%n¹ï©Ç9²Ó¡.b­ŒþKùÎKÐh(·Ü-…\ôÏ„dßÇÛP÷½v¤²ÐŸú÷2{–ú‰oĪâwÄy ̸1c¤»\Ô*hxRУCÁhñ<}%šñƒÃÆNe¢ ÎÇr¥u¶½û¢óÔ>Ë “ÛãðÂ" ebe©úÕæ‚áhL©\©˜#}êÐþˆýn! òãö½O]Æç®³ýˆ J{9ñNIä¼Ê¢®Bòž óÈW)ó6þ-M$;ÚÂ'LM8y™­Ôrgr‰aý›ö2!&£Ãá>ôƒ¯J˜{B¢>í,˜’ÙX¶*ð±«mÑs'qO ÁÐ*_r&²ýÔ\d&†Oöˆ%%ÂC\n‘Ë焟a¾žÿ²·°_’$+½¼:@Ç6WàTL¬óG:Ó¶šXÁãhêe†gßy¸±Ê‡°(ëç#bÌ…úкÐ{Ín¹^gé¼Y§x »ŸU›q•ÒìqÈWÞ Ëäcœí%x{TüÊNÝù « ÎQŠ÷û™·(Ÿ¨æ’ ¡ýÍoÎÞò$ ©ãénßð—*_¬šˆ/¼‘­`—&Š"†¹&xÚ[“/OE/ý9ÌØsœ³ßë xi ^ &ÝíÚÒ|£*p´~õ¹ÞÏ»7Ey|Ïk>GrþõžV/6æ=×1bˆ;3î“’“PœjØÞî¸ëyÇŸÆ òºúï>¿GPÙ½ýÐñ|Ô¯!6óíÐÆœ¯bú½cÌøz~4Q(òSÖeÅÕ£@//_xÊR¡ŒWbå—Þ{·™\=mã½ ¥Ü_~p—Äõ7ú*êaìßa1‚¯¿D¨Wã<xϪR0S‡Ôz¾SckÃì–1uu„ÚCÏ•uûV`Kˆ;–xOÀIÒOS£ôÍEŒ£Z”[O_ ÆEàvs`“%)ÀÈ]îj®zB\4*>uÓ2Ø„Hâ'Ø“QÇö邿³Ô\ìöøM-g°°‰_xð³{wO/¤9ÃÁkzç:R·á(Ç[ò—jËl¹ì8¿ÝáðÈMŸwH%e¡jS~oÜ|e«ù¥§jSŽþ†Réù oæ)C2ê2kbTÓOsªÇÏY=ÃÞ]÷ª3¼Qx‚ÀßÕõ—c”A‡S¸&&h®UŠ® ¡c”à¦?Ê–õ¥Þ î¿O¹œS}<ünMýŤ׌ƒšomÔ„ h³‰¿DfpLkÜ lY‘Î){¶òÈXlø!Ïm»qšxÏ%y ÌÆÇM¸©HM¼™Õ E 7WXߥ~‘\Oö”oÛÇâ}^§v·IÅÑLy³ƒë$ØÈè9‘xõéð½íZ¶IDOžPM©Æÿ«<æWby‘å5ô>ÏÄP)ͽ¤OC¸[©0^3›rI‡/YÁùÜPÞoËÂnt»‚à3• Fî磣&úÃzaôë/ìr{£Ý™ "½šM÷Pö¥.—Õä~œL‚ ¯‰xsoç3µ">†&#ç#AIÁ íªK7`m`5óšx…ô¬èg"˜mÐ÷‰Ø{áôDÈxøs^Ÿ6ÏÕVóM¸ñ× ^ÍãWîO‘ã“ëÕÕyj¦z¸2_a92¥WK´âh½*ò*~ðaÔ$ ˜V©è;¬àÁ-­ðã§ÂöYñ–æT_€,ÿœÆ×ç?ˆ`×öíCÙ"ݤõžûð#¾2i—Xlõ¬h;ɉ¸©Y{Ù&Zo;Ïûߟ!­P ˜Wfëܺ*CÌ0kǽ¾\ç‘*[¢Zlb0ã1RuÆBÂ"ãè4š` ´Æ> ê\¨Hòó†êM}ƒjù†iBU“£ã-‡k$nÿ<«5Âê‘‹Vu“Ú­N‡ ¶ÈÛ€£}ÁˆÐ°…ª÷z›Ä&,¤ÎJ´r¬Á‹O™—µÑž¢-0îܬ›8ôŽ*ÄéÂõƒëðJiDã3¸ Ò‡ÚâFx}¡KGÉ?’#b/êð1kJUÏ¿iA»E*ŒÔòB5j d·`=®‡!ø é0~ý}ÛÓÿyþ¹î¥ÿØCìzÜ_Hêï´P$"诅Z±/WÅÒQéˆAÆËô¾ö»/ŸAŸa;ãϽŸ [¦×ðÅß6oC—ÜžW ¿…Ƙ8 ˜–Î?j¢3: Nä ç‰G¼dÎBœY®¨F®”˜ÚߊD—ØS©ä™o‡ÈØœwÏÖÈßÌìæDIMíù\­lÎævìs #®.=s+æyÖÖÚ1(QÀ./}³¹±mFKöR*5bï_ÙÚðx6~ÁVÍ;Ð ìhÖ56b8­q‘åE!aóç=îb¥7#µW„“5%àéÿ„­¦QEd•šA”„þäÂ*ú™«"Ú†Ôà»í<Ô3„A7Ø;ü&p 3fª™q„Ðp›=ÎŽ×b~XŒˆÅWŽ˜Žk©ß—Ú|ç×Ö2Éê!ƒ`$ûF±î}ì@þÝŸ¤‚tرÊÜTñ˜raÏ‹úÙ´¡¾ú¼Tó®=}A¾W–ø›^—7å¢Y•§™EEÑ­¡Yºv]Ñc¯k_ê,ND6j©°‹»¥húTvÐh«ëîÏÆ’ੳÒ4>*P<íîWD±dyI¯N!Ì8õ´ô ëC‘ûU¤ÂIä6£5‹.ó÷ˆxïÕF"(Ù ¬ù!–#ë‰c]&bƒ%ÚjºWp7°røªu®{”ÌŒ4–=pX{ù×¼Ëô:ÄMõÊ?q“ï‘iªFòmN?ÕóhµÏƯX Í9î½Æ[Ó_Ìb¥@m´Ò>ª ‡y¨Ã}¿Æój|› ‹úÁ^w.>^õ˜Jq`ìöò½ÚIœ¿9¢’óSÕIð®È¢áÝ—FE,ŸŒÍn ç7GeZ!ˆíˆ‹l°ôÐæäµ™Jʼòð ÈÄÒöÆû}‚öö¾†¾Søß§¬»ïJ+Ò“"ðˆ1 40PI|1M²îŒJqçÖ´AèuαÖw£‘„Ûy—ŽžÏ—ÙúFe.ãìn8ÚÐ¥“^-³ÓŸE[ì½kÎ=v¤ÂV)359¼,›S·*œ‰~ c0ÎRuèc¸Ë"cN-7Öœà6rÜ'»£û:Í·ˆAT„§„Ä=¼>ÇË9&Î÷w@4y’!²™É/;#:%÷¿3 bÿq/]4$²rÊ9zRöE9±ÚéOí¥<äF?ÛÖHl“ûË8qœ>nOPÂS¾¨Î‹ìªFb-)ÎÙ'mr¢Ÿ "K¿»cMzG‡_Åh¿“­¯P^w×X•`V&<7³'á Eù(“$na˜0VÒÈT¶ëøÇ3íÊÓŸlR'ô]u™±JÐÏûÛ·3}|7q}k„·Jw¥$öq§Úb6+7^¸§Ú³í'u &ô\ŠÒƒ½g úÝ‹ ƒR, õu¬p(>/²t‚°q£ÿÕ-¬5t Èü£ÿQ™o~§<É/[>.1º1þ™â5òËiü~""¨åÄUôT¿WbF ¸¶ˆ1H&)³RÒ’]Ùõ–Ψ¿=Z"˜žaN!è6ÃøÀÿŸ| ƒóVÀRcX铸’Ä…6c*?jË´ÕsÖà St4»AÄW™ì*/ILr¤±û]L. c†KÜÐG.ë¢V•£¯ Fh{£›3r)B¹ÃUºQw”ò¡UþËÐU'2ñrç­wJot$žŸ^·ŸÄåp Í>iú¹oèy@Ò·WéX–ÀH±Y-/¾íé™DkæÅY‚ è®”÷·#À‹âƒý†0G¸¾Fäò:}¬ÚÉ–û·n•{–»‡NôÞ÷·>ŽýÑ’®È;b”¢áZ¨·â™Ζïmqu5©dK®t;7Z{”“ZSc)ëÉ<¥–’Ž>8B'ŸÐ[B¡n[ORÅ)0܃9þpÈ0ôàLèJNYùêq$äëè»ö³×¹ý°¦áFX<-<æ'ûõdæfTCýÌNÆà=#»ÒÞ>6Oi!$š}\bhba_!LÑ[®õƒF‡EןF.(â Î0`Ðóšp)Ç’ð¢Kõ75P°ÿeá¶¶Q[ ðŠ+æ–Orû?›Ý ÕÎO¹é<à¿`½r? êK—{9Š‘ÜBÎ<i\µ÷'³‡L–ÇÉbç<OMËÙR$DÙ“Û¦‡è»0cCΕ %V{V81lÎÑᕼißpÁ$ƒØt…ú\Ý«Žõ´&UN^g³¹ƒ-hŠÁN18 ÕQÕxb°†RéKí:)%gŸ{í?çG õVP8®Lû¼3”M‘hÕôË€>VVd ‡‰Ì•é± 2Z|&î áV±¤Fgú`vk&Ч#Ö·ïÖQ2‹<À7¸ÐäTKÐRx_±… x1ämˆÖÄð)`­SÄ#L¾ðʯâŠÅ ‚¼¡ë©–]ðÈ•€§ÐKFi¢®†Â»~@Áúnð´•P1%P fÉÁXy‚>ÑX÷–0®tí…Iv ÿjdÌPXùá¦÷`-âRÛêwtR–Vuòç…¼øh¼IvD‚¯Î_™ÁZr"ç0¨2tJ5*Ð}¤‚øÃéHàõ¢¦¶AñŸ˜F»…×ÉlÏ¥ë¡n­ °|HÊ"\Ï…wpæŽö£™Fa÷8 ÿ´˜Šš¬Ú>ظyo6Ñå% áJ'›ö–±Y¯µ}GSŠÖc átÄ£p‹ð~õâ >Ã]¯Åàì^‹]• 7”4ký«»"M˜g-¨Þ¯w~Ǧ#²ûr‹÷|嬕.S„c,‰Ê*rËèË g-)ÛþM$9â´Ønsz£>s¥ô–½ÛM‚è±ïÕ;Ÿ¼h5 dŽ–N2¨‚e­ÿ=%ðø&ëëÖŽˆ@ëßý¹ùî(5þ;¡¼ÈîPÌ{d¤¶ïGàºe:µNÐmŠÃ­½]º~î öl“;¿že¯È€V1rèM“/94´)0P"Q 6ó6všÉ|Í2x맇q¡îkðÑGC’êk´gæpäT=?O®hÜìŽW':|ù±ÆO_…MŽÚÕ–=¯òòÒ8OMÁÂbr:®¯"ª¢3œvz÷ }\\: «(-0!bÛ7§§´Yœ”Dš'ûÔ¬Kváýhßõá±¥Üq…üËCU1Ò¥ŽèöÿÂ`…J•äkÖ{s…€ñoôói«,ö¥Oy½¹Íq).ö€+ÇL¸|aT#uMß-U×Þéþ!Œ|h)0ZGdág…¥jŒ;ì:Q;.÷‘€0úöADjø €¨ý•å”À/]›Íß³'9$.ŸB¤pëá&žnšÂÜE<]=²=-<딡O‚Lëã •œý×lY;r¬Qa´ýpjä`˜-ô?=l[Yè–+÷Ýgå9âééhæ¿ÓXaBH"ò›ÂÀ·Û¨[Ûøû¤ìH“€AÝï.jòž„;ÐøG"Ì€ö7oA„1SaBªùY+¨¬JíL*1yyWê–é´eZŠÖs! !µ~ÝDgÀõ˜k&Xp•vôNU›¤¢Î®l0«z\¢ã¯?Û¬§‡ÂãÀÿ¼"Á¬?¶å»9G¢ Ž?i›«hB2K2SП†áŽÍ¢‚¼5~÷°¶´æ“¡ÑXíW ^&ëôlFm~¶ÞÙY×<}»¦R\ÎË3 `' ‡Ô¨ÑÂ8©Ý¼.±æ¥ê·¸SïVä§išñ5Ìd§ˆ9†Wq©o,Y7ì9w‰HÅŸùáõpÈ€I~E6ºzî¼uýˆ.IOhýʇھ!-î­zxênîfU¾ïE6ƯWý§ë3„AxЮi|¼ KRa/Y¦¾fBŽ…~É$Òr¡ï ¼ûÿA³ ÷×#®Ó“"V1˜f\dø (Z´6MóŒÜ1‘Ô1]O¡yÃDù=µøÁ¼šuÒ)|!Y-ZŸCÉÔ9±¿Øë¡©M O1¯p³¥·7m²8þÞÂ?íó¯©$1**¶H²çÙš¶f|¬O/<Áþu¼³ÚõmnµK8å¸h%OÁùZ3ê Æ]°ÜãôÀz†fmѲœöÀ iV›¥Z…âªYQûÝkè4úx¾Ÿ2ƒHH†#a¹|û((Ǹêïï†âÅð-FêÒ1UË[Ø0½ly;œ© ¯P±>sOÝð„Õ¤ "T›!öN¥sSÁ%SwG;Ãß.êwÓ(íü…œ2Ñ ª1îˆRL«è÷Šw:0QJqV‰o>R¬¢±—ÿ=÷X)Ç\A@HÚ‡-_Y0Àѧ[l'V¹õ3´Ÿ¦O?é¹ðö]‚̇ª¯W5zõv4¸¸Ì~!ç;éJr«jWZ¹(ÒñÖ‹÷Äl@ˆØVñ æ‘¢â꿱K°e¡ Ív‘¤„:øñÊø26+§¬æo °AF›×æ°x$$±*.½AùŒ"È>ìÆ¿Ïã†[—m\ºÒ ¥¨a&æ³|ßc¯?e¯Ñó*#Sp†”’q=¬A¨rîúYS†–ªÕ ey•%ËÜä%d@˜®ä°lIÇ/DdÀÀŽ{)Gë·¾p¤¬©tî*]ÞêBfüØ•“×ÌT –F9~à V„‘°DÖ}Ýì·>u§sÚr@à±bA‘#ê ëâî¨`‘Á0v›æéà?žè½W9ØIcÄ4¢Û¹+™X'«’÷Â7îkN' ù|Ûk©¹¥Œ ÔÈå²ÞBI9Ì$’C,ðè|9xN»¿ž: Hd5ŸAÑ,1Â]kÑ ‘[‰}Míœ'º Æx¸.H´\çíT·6{ÿêÿB@+¶Æâfb_U2°àáMn9Ýï“ì_x@¾ãѵëܰ|œƒ8d6V W q:ƒ&Àó8I £º)  .b»´c?p£ ð›_Ý?¦­ÝïynK3WZ æ¬>’þÿ‡T{‹u »ñÀ"¼…±tâæly±d†¯ãNÕùŒ`ÂÞ5Ç£ ÿf;NP®¶UiŠuIK{œGĬƒ°| Žg/òmÛꉗ"ç›n½ANl\m¸/qÙ¿Š‡ë&íGc# IF¢®—βÉn†À+<–`Þ\-YÙ•³Lô¸hû³Û/êPÔÑvF—‹Ô&ïvî¥mhÈRÍbnÐ5^Äp/Ö/g#êúU×Y'¸‘æ§iÙKƒLñm@eý1(™꺩e¹ûÆq7> stream xÚT 8Ôm÷ÎR1´X á' ³²dɾe/"³ðcÌ0‹µ‘ÙÞ)BBÅ›ì²Qò Y ‘ÊÙ5âý†ê­Þÿÿº¾ïšëš™ûœûœçœóÜçJXÚÈë`ˆ®X""„!Ô]s[[¤€@(Âj RðØvô–D‰µ_º$,ŠÂ´é¡(L¢9‘˜PñR@*«!UÔ@PýA$’Ô=”/ˆÌa€ ‘€%C ºDïèæNažóã/ ƒ> UUUä¶Â/, D£€9ŠâŽõbžˆFá"ÄR~K!£áN¡x«Áá~~~0”F$¹i–ü@Š;`%cI¾X °Ù2på…ýÞ lÝAò7‡ GñC‘°Ó€ÑX™B%`°$€y:`clXxc ßÈfßrÀ÷áHòŸtߣ7„­`MôòF@‚€ñXÀÂÀ Fñ§È(f“ˆÂ“‰Ìx”/ Ä£\™„­ÒQ€Ž€bvø½?2šzSÈ02ˆßì¾™†9f}F—èå…%PÈÍúô@Íœ{üûåzˆ~„ 0¸Í60To¸ô¡bõ¾s˜&ÈO›–(!ˆcŠŠÖÀú£Ýá›Øxc·œÈM3³Z7ÑÀ1ÛÀÒ@–ù "£|±…DÅÒ‚~uüŽ H$€ÑÀë ?³3ÍXÜ7̼è8"˜òCˆÍÏ?ÿÎ2†!ð?é[W ·Ð5°Ò7<ò½åœ'Ný y$ ¯ xPR8 («*´ß³X¢ÀïU ~FpD@õ[±Ì)ý(Ø÷»d¾¯Çaà÷\'‰LÝb™Ÿ2wB(!ÐÌ/äÿ,ö­ÿOã›Yþ«Ìÿ]‘ßòË|#ü?Ê Ä|g0uK¥0wÀœÈÜ¿©§±ß׋©^ÿöSPÌ]Ð!¸áÿ$H6ý±K‚vßÒÆ7³ÝæžáAÖ’H7_@‰@üËÇ\.´'óõ 3%¹åÂ2wç÷õ h"fsÉ””‰„ € ˜JRPR‚ÌmÄ`ý·D Àa"…0»£8" ²y¥ª*µiú†ŽpןH€£ÿAH¦üàØ_ Çýp÷_ ÌT^?!À ¿@ffâ/™ÙûÈLEþ*pÊ/Ùu þ64•Db>[ÒeíÞz‰°X,òº‡ˆVó( «ýR¤#â'?Ö®ptWÓb4ƒãô¨¾ï«P]•OŠÙ1}:õ/ÇcVÞóN)äþ]ái/ˆðt~w>%FMðuYívœëˆÜùÞã«Sd3ªÂ¸i]ÝEÆMp®ÒºÙ¡Ý}xŸœÏÂØ«´IC ©Ê‚Ïùîs;¥Ë§aܬí—cvî?vL‘›5ì¡NÚÂÅ:Ý/"/j·Ï$ŠL®¤<}® 4ÜÔOŽJùøq—·)#í£fòDƒ²°©KÐ mÐß¿/ʨ £Ë¸’[-ãïÆÙ.VLÝ¡Z £“*gJF^äÝWéÒbØZO«„ɺ9^ƒíé7;ÁQP=LR(爷”©Õp×ì>áVж|GKÒ¬}Ë8ȾnAZ¬½§×®Cæ°" IçSòœ±~…³³YEÛ#ÿZ\í;¿šé­nbXZ>Ò²çs9—%ë[†n­½•éòÞîêŒÀ͉ÇÙÎÊz“ ?#[4}׾̩{%\ƒ'Ú¿Aûi)LRzO¨é l²…ßñ?ÎiDZó#ŸpÍû5¼?‘”lu¨òÓ ìñS÷.Ã{|Qõ7ÒýŽ^XxEËcžŸ¬¼ä|¿Z™¿«*ðMƒ­”Rß3ÁIˆ]¶ –;^ÿô”£ÆÝ/\\eò‘±÷Q䛄OùjúpQª}¡HÄ‹ýœ>×Ü}ÎxÜáËp*Õ¥°ZtfÄNºó79½ç!"àÍ+ uÜ.Y§¢ƒ®ÚÉÒã³×{6:5‹$u™"-Y(wIŸÂÃp7Â|¸BzÑ‘Y6oU'ö¨Y–N­ÊéÞ݉~ÇÏùá‘ùâøƒuFÎ)ÒÒ›1*G°Y†ª#J¹/Ã)Kª1‹£3Ê|ÕׇnWÒPGè?º­ d[VçìaøÍ£¯R½úeB“W¾ ¹ä¬BuŸ¦ëK«&Ù<'!ÄÏsºæêyÃуå+‘×á+MÞO‡oÑÄŸé.û“6„î Õ®Koº7×7>£Q¬ÿ¼0Û›ÞkqÕø‘ohÜÄCœü‹%ÒmK-§¯š,!¿-|ƒ*ÊÐVn”$ë%íú$ ƒ©º×ÝM×´ǰè7:SN·YåOd¯ø½­äÎã{æl<êð¾)>ëeLIÝ(’T1Oˆeyëþüñ!ö›™lmq¯³¥câš&Ng4Ö8ö+ M²Ÿf½T¨}õ\ŸGËùä£c'ŸÆVTÜVÂ!…EÓìJò„Bðvʪç×X¬»R\ä룠«M3’‚.ÉOÈUuIÞ°K‡¹xAÓkgRÖàÏ–ÿ# ûü)°†Scß&ª{‡=¾'8Ø¢&ÓW¨é\U4ç\q[»‰Üì¥?ù0ãéEgm ¢T°–Q¢‡åŠôØ’vÂOëìô3i«ÙöWHŽ}¸I ë4a0¬¦Ÿÿ[yb¤!úU®ï—¤þf!™†›zûöåDÑ&DjŒYe?]LhÛ¸W6)SÒÎô½Vòѳ¡à˜-îþõ¥/Œ Çu1TEúm%+éü>Iˆ•¹êºùÅGȧÉSÔP^“¹ƒ¬Ù‡‘³7!¾¸«ÆÐ±ø½—•0÷3²3Ò.Ž]jªÆSZ¢ª¯…Äy±‡Ë«%¯8šL­¬õ·²™òz+ê¦Ò™`¡´ºôsÝîúRýe‰µf./gv³Á|†ßͳ>‡ ó_Ì«‰7·E”4¯–~þûB~ÜŽw–S÷OJ¥““Ö^ú׸çÍ=mC´$7»™Êùš4”ÚY[§þªçº =¹:C- ClU†Éw%›{¥ê+Ü‘ßòÄŠH¤;¼+‹®ù|TuÞòfåÊ'ñÅ’º§àИq7 b:~µ©Í<8s”ÓòòÒ¡kôjM•¥ˆ@ÒŽ×lŽbö쵯Zg ÔŽïxØ~+±êxIFºƒhÛ¥¦”†Å ²ß«©võ½‘/ç®äÒç'"&àu¢Ès­]½pµ&уÄè"gOQ§Zî ±¨…¶í g.ÄsË>{8·Ó4ø$?ßî÷*…‘õIºø~;ÞÛÞT®…ÒrhEºô…J_¢€Nu´5Ñ0cÍUËåHOí«ž%çŠ^qTÞÈšrH ð3ð3g‹ðÐ×5žG¦hZ‘;¸S×Á8¥/:®D3îBÜó.¬’=NÒ«bšáÊ%‚Z3Á†;ëwGCˆ‰6¬'\>Ë5«|°<1Z’¿´v]=»ÏÒä>Ÿ·Ã9‚îçp¼²Ê6çk§Ø¢ ¢Y2Y×ׇÄ:L´Zöl¿&Y •|‘½3ÿ)¤•TYøRKj­!¼mïŠ9²ûà4Î *}åâø¼ù‹×y,šŠµÙŒnÇþ% {Ó\¸ô²¦bTÁyÒ|äʘ—Àûu‡ÈØd|åÂ:Û5ý¼/ŠÛ "Åå°åf —볃€ÃDœ^*{…“ûhÝ*žü|’*pÏÀÊ lÚL$¤¶»ˆóì½Ìý‘‘bÈŸKe¾ùá“<’bÔוn«YÅùNÉý”³iôhåA–«/CjñB…Ùþ7e†Êu瞘÷¼‘á/UwæÛS”ûW¬g‚Ó/°ÿ׳0-ý| ɽOyÒ¶×äh=ø“-w¥q(1iÈÒèg›"qk±çuƆuÂgç²ß?ª‹MÂ*±lG"¿iBòÝüºøå ßêÁtUvZ}íÙR Œõ¦R³wPúbÒÞ.žAïÌŸ…?Ô!_‚¢Þ ïP»­uW½mÌäbä †w|ß3Ž!aãt2QåìÞÏïŒíq*±ÊõáIY0× ­F­±©™ §î ™~þú°m¹¼ª¹Çiäm»kó6añúr×1CÀUëÉÇ/“åk,)¦œ1‰áywr¹Â"êš­CQzÜ [˜pœ–nÀ(Θw½E爮qŒ Rû´Ozêõ.Ù¼Ñ:HÍ 1ÕÁ"³qšŠõ„x³v/á\„Ñ{éýŸ’)Óañï´ÙD·¡¼"ðázV#o¹-Ë*Žîá¦AHNñï¼B¡ÞJ¬§^×v½¸Ç½qä½)aœÑ²gæÊëÌÛš?]ööP^ÞyÑûðþKö¢Šâ¯Þ>„ÕÛLUÇòhˆÜš;¸Ý¾Õø N£óÈ × ïA'zKPÏ„Q%{u‚¡Ý%,ѧFÔ’äH‚ü¿ä4f‰¢üE²s¤ös,,ª/CÎU²˜|±Ï¸eˆ§iû]»1‰ÐËñ,Ì@„HN‚—J>…öØÅò`äöjU$+k@9•Ž”¹¦~(® 髨^ v9¾»d¢tœ¥®ªGTE(‡ìK¹ët¤ÕLଚÃxÇã ±èbqA!òUeè‚Ýs½!KwòÏL_#]–õz¼(Ÿ QOgZx2oœlª+Ì]Í<¼Ã·ÒV –óêm5o”ÖîpPxèæ dÊƒŽµSMñ¦ðT%¹ Ç€ã×!6ï\ì®Êr•Ô™®+¹µ}ôþìWq¯|œZ§æûÿíªõ˽ Èóì,`çe¢iLç]Ž›ôHמƞâÈÅq¢“ÿÈTùŸ—á×*9÷ô’¡!rÝVùÜ´•©1ô[5í¯üêä€ÄÐTVŽËˆ®[ì‚ ïòH¦El+ÍÐÎÚáº/Ó¤co ¼ÌAvÙøFƒe)¢eÖÖ¯Œ ùÚýÁóٱ䛉'ÛO¾O郜lšÈBy‡g2¼îŽgE_’zѼóÊŒ‘Nk”âã¹ÖAؘÒhWJÛ‚'»¢Q¢<ï”ã[#ã¶úrHé[¶{·ôàÈܬ‡Š ë³Zší`7söýôŽZÿ®ÂëbÙ‚Ó˜|áGdz âën¡vbšËóâYΡÁ‘qÆÕÑΤ¤©“²O<^Ìúw—ïå”knà·+–ëÚÏYôr2z"¤™f‚”ƒAòJ{e. 7Ìþâ*cCês Ÿ87Éik|èÂGÿAâ endstream endobj 328 0 obj << /Length1 1860 /Length2 5603 /Length3 0 /Length 6739 /Filter /FlateDecode >> stream xÚwTÓïÛ>! #DT@B> )±nD¥»sÀ€Û`%!)’ ‚¤ ÒH ’’Ò¨HKJ— ¼3~_ýþþÿsÞ÷ì¶ëºã¹ïç¹îû8Ù´õìÐ6pe4 '„HŠúú",89õ8øoÄiÇ`h”Ô_Š8 ‡ç”`8¼Ÿ¨º»Pa*&—‚@!Dò?ŽhŒ ó@Ø‚€*Ç‚8Ѯބƒ#Ì~<¶¼TRRœÿg8 €„c¶0 Ã9‘øma.€ÚÇyÿ+Œ#ç*{zz ÂXA4ÆAŽ—ðDà]8Žñ€Û?4aHø¯ÎAœ€¾#û‹×CÛãá˜AðÚƒŸ~Yàåe‡F¹xÿqÿù¾`UU#u=¾_ÿc»qíøˆBÂB€¨ˆ( &) øý;‰6 ñ»ÈŸH”=üU+þ’þS¯Çïççù=¼À¿si¢ñš…<$n…Øâÿ@ÿÏBÿòÿÓ÷,ÿ›Äÿ» ew—ŸfžŸöÿÇ C"\¼;à%ëŽÃË_Ô»Á¬ÜáŽüo« †”ƒË?׈À*#¼àvÚœ­ãOaü¢ ~Œ˜ ×Fc?v …@þˆŸ+[güÞÀâõøÓÇÍ¿O¼‰²EÛý˜/!Q1†ÁÀ¼A¼Œ„DE(~íà^? €Qh>ÀwçØ£1 *& €oþ ~" !¬û‰`ý?Hüƒ$Å0ì’À6>§í?HŸ¿¼¡xƒáÿ@±ÈÍÿòðuØÿñ)ÿ‚øJA|)ÎA|-§Âƒü¡Œú âÏFÿ)ï‹_Ó™ñu¸þ1ãc]ñ«å·Çýa¡¿Ù_Bÿ‡ÃÓxy£íþ4* €ñûóµÿC Kþ ÑxÁý+ Å÷Œù â{ÆþñÙÿ8ãÅÆy¢ÿ2ã¯Äý/ˆ?ÃóÂWìýþKJ¶î|¸Ÿ³Ž×ÙðϽ ‡{ÁmA£h[é§²ú× Lž }B"TíÛ»gæo^öø¬¤(s´#œ9®Ð<¼y4M»*”ZílLq¶üä›)E7QQObo3Çï;@+ûu«î.´¨ÖÔdj-Œ²s Û¨Ñíôܽ>ÄKÏï¶µ0’¶|K†«æÅA±ãwÕš %Q߃H2 aJ¢…´†7J††U8°Û×ûÖX”—’ÛÞ ‰Î¶Oò"f’™VV¨\ÕvÓVä/µˆ1ªYCœó-7¾ÅòíÖ‡òØ`{´ã‰Ž˜ùÏ„…–ÏEªÕÓ°ê³CÔ”:JÎ-–¼KŒH}Iæ¬bø!ßÌg¤ ÀÄ—NŠä7œuÛ1b¸ÞüÊ®¼¸çVftÛLî-ß0Gï%QR!¾3&z„èS›Ü]«aeü»*mìádå›ß ‰Ji34çÂ_LCÆâ=ÌãS?NÏߊ7/á$05ç‹a’^Ç¥FvÃ>!£T±ÆQÚ¶DßdLJˆ¿EæfGB[ƒÌåï*¡bÈK´=êNCëTÐÚ×/ÏÞzn{F‡zÎÈß&ÊÍ”ô&Ô%dúåCš½±óoyëØûá/=šb¶ÚÎçåy\™èAÑn^G­Y ,Ó>mªvé/gyçï»1"Ý€*DmŒHè $ƒÙH…>W–í2ž¸L`ñ­Mzyuè¶b(…UŒîÑ+ã¦$6bs´îuo±}!q¶´zos•#n‘§;3#A·Ií sep¯S£™Ú—ûU4I÷Úׂ±~¾ ÑUÜÞËkÐH©¼“š† ªNûÕû¯Öµ¿Ïµ~aR ŸwG=³ÑðË3_».¼:ºŽ+Ë“¡Üg´^÷ M“ƒ¼×t{«^Ôsn‚ðÍç‹ ÜœQnáM ÿjÚXÇE$¯ô¬MçjÝÞ—zÍ?Í´Ñ2†í[ïŸÊ¤Ì*dø°æ±bn¤{·}u{I9|¦”ó¦ÿõ‘ΣW6»HG ûNBÌ&jínfÑac€¶Ça¶ æÜ»aÿÞŽ¹äöièèz± M¹Ë¼çêBÍ¿• «¼Ð67g. Ì‰ÙjÌ6x¤ëÙ!5…Râž¡”ÞnhdŽR8‡m­[š®1†2…ðôµmÕeÖfa‚DdVCp\š—E?a@îöƽ٠å{¡uë"Vþ¨J?JbÝÌ1<ÝèN“:y;ìEû‹ëß­ø?_ª†©~x5·VXI¨r.>Æ+ÌmÉ|~~–If§ì…n¹lóò´¬æùRØÅ| è!Woÿ±ö!¦QNß3sw¸jæu¤ß¶5"ë“>ò+iÁ*+KŨçß¹ú5ÞÖªÌ %ÙWÔ® ¿}Å”‰ qNÕnzÃ_zñ’¸ˆÏô,Ö´¹9|˜­ŒŽ{0¤Àñ=Ë€õç½7'½/‚H¥ºùs{oäZÅö·v* é »7Ç—çlÉ?Zºo± @.kË@h(ï%”ĸYÙ”–º`’¶nÄ2ÜaH>– ¸ŸSÚF¾kÌó)d¿ðÙ¶»%²+3±€9Ã_J.Ü?ýš [UYIÆ)ÓPeî-J›gÕXGêoÅìI-ù¨SÕKÏ{<¿$¤ ræ´_*hƬõ9°‹Ì¡@ͪQ‚Ìì=¦ßœˆX›¶µSæÏIvxIª¼§Õ1!c‘1¡àTfÉBxF³W"ó¶ÂUÏð=¹WB "T“R-ùö—µ[;ê:•9 ¸°æ0°“Ä96QÙU§ÃbŽdÁ4ÄgÅVÉ¡›$Ìn ,w8ƒ¥í#áÕ=Ö˜ÉïQß+nÄ!ŸÞU?çén‰¾\CHfÏ¡µØ‹x˜0r3Z™}Šä°ÿr :qu'„lúÒ*‚…\Z~F»C ‰”_çµÔ_ð—uºY謻JL´ÇÆj#ßàz´4jd‘ƺ­høÜ ,1väµxĨ‰ MP>篌á!p›¡÷úŒbÊ«OÙRkâ…íÚ+j'w"ï©×_,7PcDWmØ:¨‰•-2¹—ÐÉA åpÍ-ï+v,éóØkmÌÚû"(V_)ÈK+ia:ÖÀJéÏ7D/ ÉΩŸ3ù~ÌŽØ^ñÖéÈo‹µ¸{*ÎÄ÷ ‰.Rp.’ÏS³†±D1ÏÌ€ôð깇é¼5c“[¥S§•İ)KÏ}’Ò[Ú$$QZ$‹”Nàí,ƒ¢{_˜½@œd®eÑœ&· ºt**%I|?Ê ®\ªi[Z¹¿ôiH_FƒßÁêõÒ4Ñk_Áì’ÅS’àµAËý€/&¡òÊ…µê~טÌöJÏmW#‘ iKÊIÛŒ*Ù,ÄÆÞê€]°Ïä íÉ$vC‘†ù$ò‹ïDÚ¸·†KU·}÷b;‚^ËéE“™²ºJJ¨LÁÎÇ÷*vȨhXC'#Þ{ò\‰Î~Hå”X¤2ÊÔ6E8÷M0Ÿå}ÚÒL­c>ù `> @Rw¯ç½Lz42¢F/Íݽ§L*]“ˆ1,µ\mü0"³¥EŒ¸#éØJ§»d¶ì–A•Š`7N‰5{:ñî¸ôT¾µJ—:¡ÌÒ¶8øÙl©£I5’yEë’áÚEOÈ z²%DZ¸8¿„rÍ­zîü!îÌšS£ô‰~c‚§âyá+ñ¤( ƒ{Ê•Ë ™ôÈ•_9I”OrjX¿¼×`~ëx»ÛRÛÚMøð8­p5¬\_ò}´_™HÃÛÄ5•-w¡~_¥£îâ ì—œêGécß4kçí Ã¥畦}©¢Ï§š(4U“õ*VR„F ê:‡åŠÕËKéÃ:ˆ”DX®þîÓO!ÅÎ C÷|=*˜:ëºîqš8E»V¥xטqßå’ÅÖ¶âÿ—лÞ?wÍ÷… !‹Ë£µÉÙW­ÑÛëb5ìëÍÚ¼ÚÈxÏ„ÉíÆØ!&æ7_3è¢ÄKÃ"ZŠhµn–Šòè:+°Ñm«øT|É«êÑ$ëÊÈLˆžóñU ä׳¼ „µtÏAL1{Ž{ïJ™¼ò#‘úF"­Rú²m]5"kýìËã¬ûÈ^œTk_Íb½oOìTWlIÞ“ñ†÷6Ý=—·"µqŽÎÉbÞ')þ"‚.dÅÜ)«z Ó3ßd7®Zyåûh$êʃ>íy ~é!Û§M³j&Ü’X`]Ŭë¾Òé!ü,¦ý±+n†ê;y ·â3è(‡:Rîiû»msÊ¡!B‹´×w§Ž¸åÂTC›ÏìOC+ëMòÞ(Þ¢¯“Tía°Èº…Ùö¨9þ²ðÝ™h²¤>Ø7ªeŒóöªË­-ÜaJ÷+%]|H%È3ñ]~…ǫϪ79¡ßa‡½VdZøý@[Wí 7Ö„0ï|í'ý}ÂýP´7°*Þg¬"”¤ØÛå7Ñ‹4&à»DzzÃ’Ÿ•>)~oÈ`ݬ4S]Y•[àmš ¡qvPÄÝÕ1rgù¦j¹{øšLÿˆ;›©~6<ëQÿˆaÞÌ,gB,︳9黸ráFSä£r7«ufcšŽ\²W¼z<éôòçs\“ IÙÏ›’3žªºé„ÏÀ4¨TyýN4«Ã?¿õ–%%`_½TÊ–Ymlݙʒj5ì[5˜_Xæ_¼£ñ4¯óÑK¯,AàüûÄκo‡o tó…7Í‹bî_Ûùn4qóø}SJ@m¢;Hê{s¹ÑH‡×å…ÁYD&CãË¡é ßäâ‡^2‡|iÙhÑÌÐìgg÷(2ß2ʰ_„„™*7'œ—¦`n.É,¥ì8“mâÍŒ0 òÅY=.è³ÏF+¤¦'X¤5JLx1i§ l~¸i:ª­¸êŒ 27 ‹'Û%akzt"÷‰·mXRØfâ¾ø#ÝwP–Ínë9‹ôÛIÊSƒ¸Òr<Ž‚âÚ|"¿å¨x2yf­3ºº8ÍäákcÄU Óß<Ý0±ï_ƒ’6|ÅàVûÙI¶]†ÃnœZx$ï1}»úL,cI~ÎIìdòØä¹¼ã‡ÆÕò[w{ëk…‚rrŒâ¯ò¦o¨÷)‘DðH‘ËÅŸ/Ô]wÿì©æMYÅ.Hs^Nî¼sÚÎU·_5âÛfByJOѧ ™Å) ÐWáeۃ˜QÍ.⎌ÌþBªù"=S×=οÊW$vQeed½;› oKïñ Þ,±–åºÎ¼è‚ •[¦ëݧJþ|Rr»ÎŽ•n½…¤µûdÇò²¸‡0f<~Y^Ó³Çë$?┢Áúbž¨K3í¶Èƒ>ý§}†µF ú_ÖÈm*ÛdŠ–õôžš¨G©æmQZx[f¬‹½ÓDfŸf`¦_Þ?g$9cI]mNЫÅ)ÁtµÚ€Y9Í×»Vª¥-`Vä?ü|Èmjb2þXe½ä¸åêâ뮂Kà“¥•ÙõÎ3cY¥âìÕ~6²¡-L®û;þ´l•Z-%:‡àoa„¸ÝÁ&êÛæ‘‹Ìš¾ÅQDm"d Äî=Q”·­¢1§ø…6þìݵ@—#;]Çw 7/e%>Š´¿{žšËTDÒAA©’Ô8åK³«ÐUb;ç†ÞG­èÝ(—K-*O‹?~Ò†ͦ“M<·Ãdٞ΃´ i#è‚5%\Þ>™]xs-h®Šã«§ÛøÎ”Ø™W¦ùeÆ ²U†oAm»"Y„ƒ5­§å°µ¬ZÔ¦DsVV'ÔCŽrWD"®éS@D#½@Á#öטÉXY¬í×dŽHxº¾vÔ¿Ë9jM”¼ØÝe™"hoYÝ ØÏ2þ2ê@kbÝ€’\]Ìû˜ˆ8⋉4˜]TÁj6~ˆVש`ùà'cÒý8œVj½¤}ŸÍ©–¨µºA-~6"ƒ\Ø;nšÚ_*C¥Ï©ò(x!Ñi xšó²!±üʳڞXÂ×›B²Â/)zD¿¸;Ž–‘‡yu]÷MKPŠj/»ƒéxq ƒc§ì#Ót™×“fOf/é5M÷å‰z©»%BÇd\Q\PEcÍ¥[?-Ãæè¶0:b2*àùGO„¾²²˜)oêkN5U ”“Uij)lóÎ>*­î7b”Í·ŒíW|gß$éâP„Öï‘ѹA^-ýáúÃ4ÄC'%}¸*1EG‚“q6Ëã-ïâ;Åã±W—š7“Ûb4‚xjAmLNÖ‹¶Þ !OˇžBçÃl錀/3v$åOÝÅ'¡gǾ݈ m9ÁÊ÷šÉ@j¦v…Þ_«Æö¾’é‡éúA­5ÄÀYnùá¤rq¯9÷I¬r¨õ#Ž ¡Š_JÀuãö¤&¨%nD³ª§ÈØ_m¯à3[;ÄÀ™¡íƒUkÊOÈSBïTðfÅø¤ÞšáKé¯\K¿Ú@ ¢Qíýž6Zòùóäå­„•+KÜkׯå†yô<ðñ ¹f–¢Ú,Þ¿Ïxžš“T^Œ³|Ò­»C¼•ãÃn½0t@çaÜž(હà“Yæé4¼âi:É’êwâĵ;Ÿ4´À9½+¶.Fø‹•sP5G ³ß"XQµá‹h?c8.à7Ð?ÙºŽ$l«4•OaÃ’wHö~v]]éu  ó®ü˜î¤Ç¾IS­õbª}©¬÷EÃ+1ÿ7Œÿír0Ø endstream endobj 330 0 obj << /Length1 1553 /Length2 7986 /Length3 0 /Length 9008 /Filter /FlateDecode >> stream xÚµT”Ý6L J‰ (=t‹4HƒÒ5 Ã03Ä Ý!!ˆ€twƒ””tHwI#%’Òú¡ï{ÎyÏùÿµ¾o=kÍó\w\{ß÷¾î=¬LZºÜ2VHK¨"âæã‰åÔŸ?‚@< ?€•õ9eýÛ `Õƒ:9ÑñÈ9AÁ¨[›<u§ŽDŸ¡í€|@>aq>qȉý+é$”»À­€ê<ÀgHÔÀ*‡tpw‚ÃlP·ËüëøÂäáú“”±‡:Á!`PŒ²Úß®Ûu‘8åþ_%mP(q^^WWW°½3Ò ö„ è GÙu ÎP'¨ðwÁ@ °=ô¯Êx¬Àç6pç¿ìºHk”+Ø ¼5ØÁ!P„ómauÞ.ÔUQj:@«ýÀü»7@>¾Óýý›Žø“ †@ö`„;ZÃí @ME5”Š FXýÛ9#oóÁ.`¸Øò6àÏÎÁ@Em ø¶À¿Ës†8ÁPÎ<Îp»ß%òþ¦¹í²ÂJioE œ¿÷'w‚BnÛîÎû×ÉÚ"®Ï¿5aeý»+´ï Ü U‘ÿ;äÖø E…@ ¨ê„ºAlxÓ?ww€þqþ1ßVàíé€tZßõ†[Co_Og° ˆrBC½=ÿéøoàãZÁ!( %GþÃ~k†Zÿ…oß î4ÝjúýüûËôV^VH„ûÂÿœ/¯Œ¦¶¾® ç_ÿÛ'+‹tzr ¹ù€B‚ü@a1Q ÷“háoôŸL„5(ö×^o›ô¯ýºü}üÿ vàsi o5 >þÄM@B Èíßÿ³Ðÿ¤üÿéû7ËÿMâÿ»!E´Ý÷ã?þÿl·sÿ;àV²hÔ­üÕ‘·C€øßP}è_#«µ‚£íÿ׫‚ߎ f÷ï6ÂánP+-8 bóG™_ü1;8ª…t†ÿ¾S€Ü| Ðÿønç b{{o8ßêñ z;6ÿ½¢‚´ú=_üBÂ@°“غ•¿Гïv­ n äåA Q·)ÀÛê¼ÖH'Àïò‚›þB¢@^Ëÿ 1 /ä߈ïV{¼Ð@~ ¯õ?  ׿PÈ ÿ¼¥²ÿäyÿ€·ÌÈÀ[f‡À[*ç@a /êð¶ôø_} œnï…?½mÚ¿ðŸK uƒBŸ§‘‰ —UA/ÞËлro KM°nè'²s{~vjF_’àűW¤,;ÉÄõu-¬)<>}:Çxã¹ÓPƒÒ«Ýtåum­3¶Ñ˜½×3’»#SÝÍ@pŸûùÓM¯G/=[ìÌÖg¬™ŽhQ­lÊ ×.%·êîâùÁWÓÚ›ª„×ÅãÜ‘/"Lü &Y³,Ó¦h˜ï ¸ð9(ÝH'OÏ&(2F~1>‹æxïF äy­ð¿ù1å±Xúœß¹–…Öˆ†û”bpŒÍSökü3êÏÂüˆe©™t;Æ,¢=ûPÖÊìŒ7‰Ÿ[i†Óç(ßr C¤¨qÁføÓ Ãë4q•)Tw( Q54Š£U ÛÁõÎp§2tW­ªõl«²ŸSS¦ÝJ²A+ æ¸÷-€ n’n³ì–+!Ëy]kÐÀ¶ÁJ¢\•µ€U¾[`æåËð P¶#Í»ã%ViI¦Ÿw‹ž:'`;0uÎÏ$H´þhå¼^ÙB ÕS|Ù_9ìóÒÛÇ£³9i‘,ÙXŒ/j ï8ʮͱ•ѧwûñ¬xJ›^äLˆ\œÍå=L4Ýe"NÐõæ'4åÞ+Ùfî=cUГ$~’¤!‘J÷a/}aã¬ÙXl€>–)9×ÖüõÄ+ ± Kê©Ä1X÷1>Qú[ᄞºÍ€VâüÕøg÷&¡ÔR*®V$ó¨È£Ð­FŽ;{ ¹A’8•F˜¿&¶ Mß‹‡,E#X,ÛÖñ— x+Ó.ÎNö>/^t˜úÅŠËžco¨˜°ø$HMFg×|ó ¬Ë~“xïóÕEojo+Óú·øªöJí¶]sµa÷uƒ~G3ÓCY E+*÷K1bEžF·6ý?ê‘­qH˜ªñøvKÙåË“2@àÂwâªåç©Ü6/ë'qÚbðŧ«¾ ZBº'²ÝèøŒÂØÒà€|“ÍrŒâM‡ kØ"`ß6¿¹ÚóŸã´½qHUôÃ% ÷‰r,U$YÙCK.šÑ`ª(HpŒ=å)3r}5ÙÇð'Ÿ¥ß5¬œæá#{©*ã)ÑwØÕôæÜbXÇlÒQN[ß½)ôÍR/ÉчOlž´è¨Cm˜"`”6ÏÅ®J+ë ¾è}ö`{ ºÕ%¥änç p3uÉm$¿“ÃvÙJ޳®›ƒkt¨éè^sdzמt‚ãß{ùv@{Þd¨í…,º˜@Üy{‹!¤,)è“»ÈÎz6ÞǨ4GÏ›ñš‚G±F=!þN©¼‡–»áÖèA÷Óú¥<nsÕ›9Ÿt ó½³èœÒú‰²'àÇ qñ¯­=˜Þä»,¡?.cm2ëu¾Pè˸t-»¸á>Á¼ñ´É÷ÎpëÞ‡ÏpàúX…3‘PçÙ`k¥Vü¯ü ƒr@ahóCJçþË0èL¿qm›Èwê3n³—1˜Ù_Œ¨æht°°7ïÅ^“… ”Ív÷P˵ÓÅü #€°UÖÏ&Í»W<““*òÀýönš|ÜtIJz×_ô$@o³[ Ð>éW¹u{Àaš”¾C~(çšÝtT;b&„Q–YøP¤G¼_ÛŸ¦ýi­–Ï8÷.úéD¥üž ½³nQŒÄO7 @à³òÒâòGQ ˜G€FwéÁŸQfr}§G?Tˆ?°¼UV2ÌDMXÐá“n›ÌS«¥¾d½±.MÆvû´½«{'o.Âiwq¡¥ ôSB*ÝNâýz§_¦ú˜Ê$Pn»–@`ß³TÕtR¬g&ÞWÓ«ÍcöeLƒ| }L—êji±;&Ö(ô¤*÷b ßêÙ³`¢÷]‡ ½“cƒ·ù‡} g8ÆÃ¨ãÅʸ}诌f¬³ùG N ç¾YD8*žŒÁÂ/¥²h/±]Ãg úšóZçÂð›ºE^Ñ^ô&޴ܙߥìþ1'îy™OUDzšÑ"m§\ó1‰ý(aK4J³Ü:7ÛÞÁ^ý q`9X+«ÿ9ÛgjÀF·'{åæI—(Äð©Ôú¾BKèRy‹<=jeËcZ 1àž%ü » ˜²†â$XŒÅùÙ—”+Óa†%û©Û׃ƒ®BAeAŠýˆg"…²+É’Ù)£%Tr•}Z›£˜©þíÞh¯^iç°NrL'î{Éäât™_Ñë˜ÇY´'+Æò_M$€’§ ®t ¨a}*6¦Xï5LÝ×X€^üó«u׿ÑÈ2Z˜}ÃóN)=ƒ|à PL;{`˜ŽŒôÆo•I̦¼šX-À`߉º)ô^P@t¬`[Ç?2¸ÌÉRr^”èuãÒ/Tg“Ú*Ü»,Îñ+8:‘WEd±C<Û.;G ¦’iÉg*#¾ºE¤z܉Ürá6Ï?¹)’âî£Xvrs)G¾îljêì«§ÓÍàø6Sü—ì"ߛ娖«]Š—”‘ª1>ž›dVëœ$úõ @*ü<]×éåYÜwÂOlqû_ž˜Ÿ—©‘Z†«/SI€ð¨»wÍ„^ú•Ž6Å$=¼QªÕª[œ44V7Ù«÷&/À<- Þr·Èíxûim4Ï ×f*‘pøR샬—'©·ãˆ·ñ‹ "5ãzrnxvnÞü2É;‘«»8ºÞoÓÌlyuÔ»6“³¹½`>­v±¯­Áô·Äkˆ©KÄdWQ× @+nֺ߇ò1LÈŒTOx½s¬ŸdÀI¥¹büÞݬˆYë|yA©jvøÕ·÷d)i^)˜i@6)œÄÁ,–“Rò:±GG>Ó+û>›CÕÖbP_‚”Í¡é×f©ÅpO/å7~¹l÷Æ—/ðzvÀwt¤½òG ô~¢t|#í¿Ú¦ù%á϶dQ¦> ¶”Š èêfÌ®¬W”6ϔј>Ù]½8…{±ùï"×dzµ3Ó÷VñÞ?"ñKUÊäÃ-aÃ15sBw=Å•¹õýý¶ø*O¯©¡KJu«¯±'q‹>{u„°+ˆ‰±îå\jHƒŒÚT¾å亜A'æ¤Q½_æ[}3ùýÎÔê¨Väg’-1ë\B‹õ»™&±uÓ0ÏËîdÔ ‰Oü–¿ñ ´‡fW_ðM}(.k÷ˆ½®*„'­Þ䬿¬Æ£ê½°Zwª{qmúݰ((`V/Ò»‰®Ãµ ðÅ›W/ Öym*LIyFñI`¥ \NE†1‹Çáö-—”é, @Ç‘†.[.íªh›úwŽ…‚¢ Ò˜dMÍ*cÓ>ÙH}» U¾Ó©(EÜ×Öã¤z3eÙÏRŽ'ú°<[,Ö‚oìE)éOeÒèƒÔ7]OÈô–rÐRÖà’ëÕôb4|ÜRfÑÍ“~¸¿YÔ=±©èi$,uš­ÑI¢øB©/÷h?F"«õñý4Nt×øŽÂ@øÖ(îîÒüÔÍ¡Ý-a8+tÂ,ïN)—I?è×ÒuÖC—Òß—gdˆu#¶Ÿúzª¶iý ”á %;ò«äÖ_N‹KÛKß§0KX¤2ZWáË™îŽÌÔªð¡¤}ŠQ94\ûâÄXB¢©^)4Dæô«„)Ä ;6´:êçÆåÄu>o/;YQ¡Ðü .Ùà<ó ÓÌ`Ì;6bŠ•—fÃ'Þþ™•–/®Tht=“úøE椾cïâ)ʦØ-=äoùC°y|˜»z}OÖQ{š4Ü:W¤á›ŸëŒ†Œ¢cÙÆ×úläž{½—Ñ^V’SŠ›< ¯·GŽ®ñ7œyJ!3Ÿà¢qFÙÞ€n–›ÞI@_•ƒøLõ†ñ»ù!…¹©oª-’3_ÅÊu=ãó§àÍS«ÐÿIœh±í«ÊÍ ÅÇe 8íô†ˆÎaªÉyVvÃY?–0ŠñDDÕJ§Ó$c6AêF9ý¦H:µÆýÏT¹¼fºc(̆$™²>|2xx8GáÍÕ®KËäËáÛÎsœKD›è’ˆÚyu~Ì@mL«Y—ÓÁX©ƒsQbø!„òUßÝÓxÝTÝÉb¡©t;Î'$Co>bTÖÛ‘ Wl¼(7l<(zTVøÃ<Ûï@êýµ©™¸-?°›Æ²W`¼Êeò30**Á–)ùUù"íò”ðuàSmÿh jJ—1ïI!û•Ùä#ÞžÓŠêÒ ÚsÒ°cŸÖíQ%ëC j¥ÝâèXÁw\ye¯¿Iå ]]°fÍ5˜®+¤)‡[#úæýÜ^÷èܯ9ºÌPãe|ÔÁçI­[ûÅ=i.z[BWòÞ¦ùÚAêT•ð9g'*1•d‰Ã=¬àG׿ÒKÞ¸HÍhhQzeËô^+ÑÙæòài–õŒM<Д(lj–ÕI½Ï^V„,ÝÖûö¾óP÷ç¦dW@¢¸[û_ÚªÚÅÊ Ó炉€ID{–»œÚ–tÓï®û̆!Ì‚ñÂÚDŸ.5žÕMÕ?ž¥+w;ü÷õ‰‘ÍÀðˆ»©L„£„þtàË>¨°’ku•€™ù„ºL­«íxV¾EnæªX¾Ý{;åìºò<’­¤(ßh°þ†]>X¹ŒöªJôaP8»žØ§Cè|æƒt*ÝlyfÍÈ'Ü«Õö¼eÛÐu†àûN<ìâìjβâzÝÌ«¨H‡j—é ðã%?¶+\Û!fßóòל±äVŒß3剿_®“¦%÷ädåšü•æŠÙ§Ó²÷¹Ó+}Š0mó~À—»¸ˆ+G­Š¦Æºólj°Y%zU6û®FT½GÇöu™9f1’pÆB°ÀC0—;RŸÏöÀŠÔ9î­k¡‰±QFŒ(v ñ¶»IR²Î,úìåñÝÃ;ŒÁ§“üæS‚6;jkXp +‡¾î£ï?ªóœ x ¯¦ôQµ{9¶¡'»ÿ}?ÖãE/¯‘nÖº£TýO6ôq ŽÒ‰^áW|óÉv.õë_V}:Ì‚SP›X *,,%6ÉO½W“3qÞã4‡6Kµ¯×/AA}¹Ïãïw¢âža|8‰F ‡6³/{j˾+50~¸$×¥"ð2ð'ô8&”WÃ;£ñ…9gî-Æ´EÈ×hæp\2-c“«ŒÀÆuƒF0<'þ‘2¢ŒÑ¶‹®ŽpBš0úY¤¹»€y.dèÂÛëEMÒLpyOû‹ŸKÌÓ¬%Or…ñÒ’ÞRb¢dªìvÞd…]Niz‹ÚIN‘Žç “¸‰}¡¼Ù>9ü1يЈð:•”c!vÝrrƒÏŒ.á5ÐÀÔØà^ÙñòV{÷ް.s¾iAÔu÷÷½ÌóI»kü/€€ª#àù— #‘eƒ&¥˜=ÞÄØÝ/1eµÌÃq¸¥-0Š(áÓ³7£¾¼7^Ñ ÓÈj™ýéóIÓ,?$q+b’˜ËÅ"¼äÚÅb,ÄžÐjiS_x“ðÄé^e«x ”žO÷DCnw…²9{ÁJF:HuÊÂØ‘ÏõÏÀ3þlõ*l&Éw÷çó¡8Ieøõá«ucµ~Y$³UÛª0¾6ž ¸ù|<íI·Ϫd‹n<õG{åT;ågm:á ëh7Ž¡…ATBx¹Sˆ*RM·)AcêAÌ™–ͺüáÜè$î– ò:Ý£íÍ×A[MÒþGùS¹º¢W8ŒáLÅ \ý#÷ƒJ\F4¨ïWcZô1Ëâ7c:„¦;¾¡µrmÄÛÖg5´ kñ¹G-Î[ð¤Ü¨P:©Øî©ñ0Ós|Ï»_ZÄý L´¡Õ­ Î&Z±@å3qÐÞûª-Ǧê|m×?ù¬.Ù‹Lx ¾Äâª0­hƒ ·,³¹ô÷*›«”ä³WZTÓ¡YåxSI_‡«Ýë3¨À@'ëqÆ0³š¿-bx«6”Ë,è²Ð×ñ¹Èů³ÉèÓ).`cjpÿjÙðé…Zx•§ï Ërc4§?Þëa Ã{±œŽpÓ ü}^35öµá5á 1ôöîË|tRÇ¡!ªßj)ß'UøxÂkQžãˆ9éG¯Bø«¬è¸j×›S†ÉGB÷QÑËÕ}çïθ?*.—åS„çÞ U´£%T#pöîÙT”Vÿêgž°Èn'x@ß0‹ÕÕN'4Õ¸>Ñ×ÁÔT–cU@ÌOòzm8…~YèÊË<"áh­Äü&Á ¿| ÄBCT€õ³\¾Ùó\eËηñBž¦{Š·Z1ûÉ\ÖѸŒ\˜jyËár°áÙºõKœdÙú /¼'që Äbmœ"63àS‹€™fÅ\ÐêÙWÔ•aæ«Û¸¯gh±<õÌ ß< €]ešMçP÷ÞtåNÆ xíU6>Þµ²íÝ kÝåÍ^hŒTö›|‡í8òì‘k©ì~ª¼™¾À/Áß7¦¹h¡Y™™· ™ušÀÙÚc0ÐŽ‹c:©=ž¨?t¤&wªØÕ–@Ã/&nü\{šïaK•kØȽð}Us9K|='aç×Á‘0“*(>ÿȋѯàÿpg%Ø‘E×aŠž€þyÞ!5ˆ—ÇQUFaˆðÁ¦p|é÷²üoCÚòÔ2#Å£ ¦ùÂ8xš…7Jãk,«øòC1'ŒÆÚM[¢Î’ò‰0ñ ¸Bï(Ѩ¡ft¬wݰÞ`ò“)+žˆñ%ö£•|ÝÌʬÕÙˆ„:àŠÊ®Ó<{OñâôÍF‰}r®@êB&iŠm› i0+¾;â ±ì„~9k¡¥ø ?wf³œSr¢o­&›KÞ6š!Ü{dt¸?/®“ âU™Å_T.BóºB”+11XgI¼’Æ£?tt•ãˆÛ cóÕ‹iµìeOs–·n6ù’šwÇœH/ZKCµóíp@E=˃ÐÙ¨Ì~&Óû9kÕ&„Ÿð’¹ÄÒI©ë#>c#‹ÉÒtNßPvñ.Ô¯'|XÕÛÕš1—i5¯ªV'ŸðË÷;š~OY˜é UP9yÄäi£ wŒß½]ääJß8ŽÓ­)·†é’5~ˆõÊç¡úÖo&Ù«©¤Üb&/#IŽßCIÿ¢´òÐwŽº[ôÕŽ»Ó ;Sæìd¿¨sw(^¡äb^£¼o_H£F= 1袥ìKÀ÷‚‰˜²[ìîXýŠD‡— â=â‚ SŸ°\0~(“çŒ'›uô’ «dHQnßAPtê¯ suˆÖ-ð~‘,ß铳ðÙt|–ß³½':ëØèâ—Û‘þZÕ<˜€;¶«˜HCPtL“ßxt,:Ö¾*ªUýí´á¿b]MoÇS¶uÍí#:­nÙ½eõÚæÿjÆIfŸþ«ýÄ8=bÌÿØü‰ÛãMeEqéuNÐ$=ÿ÷ºï±\Ì­w²&`%Jf®_©Xæ1æ÷®ŸÉ‘qß®gmVÞë‡t=Ó~i$:þÐw°«­Oeçâ H­Ynƒ–¶å>NuçÚO. ÷Ýâ4)ÆpЍÁrŠHù)d,©Ž Â'·Ñ8˜0IFLT&*›Z¬Â“ªÂVò†ò¸­ï…­XS `®m¢ Šìçé!}#5åžá{ ÔÍíÏ8K+§ð4?TQ¹ÃUÂrÊ ŠS#U¨hÄ,03[k5ÈWä֮ݔº2ÕuŠøè¶­÷Í»<ó²• ›BF[¿=å=ü†G‰²/+e‡8¹Üß¹ˆä‘,y.CŸ-À}d|ÖT] 2óÝ}U]l¿.Æ‚.vi¼’¸_"Õõ –wsAn+5O?ôraÏÔ|•ym<Å}V$Dò ÉÙŠÓÂYù‹Gwg~öa¯R€{ßGÿÖÃnáÎ…Àb‡%ŠEZÜ]‘\< ™1¦áB*ÙLYi65/ÒZÞ±wëµµÅ\q›Ávpóóè›C©”¦¢)ÄÞŽqQj ÌZ²Ër$ŽRËS´ 9¨žDÝ•›çßÛQãTß'ÅL—x^£}šÀðôOÛp³\P¦Ñg®ä”“/-ÐÙn!ǃ!d*îÔJ=Éš8_d“¹ “šƛlx*kÕ›N1£¥µçr‡¡ƒMQ2_éhV‹VP|¾Vâ•SrW¬ˆJÙPS°Þ¾£)»ó˜!ssñtßõ~Š[É#Hw*<­Ûgqåìæ§šií¹#FO‚^óX&*¹¹_q}LqÇe‹ºŸ ¯KW^pdCcÐË©†h½)Z†à䯔f£ÀL¢ÍhÏV©mË}‡×6|—‘ w|?Qæ$¾“·[b¾ýo]7ù抛»8ÍOXÎ’ôŒ•ß¶k¤ÿS5Då¶2‡hä-ñâ·šÇxº6S•„}ó>êçÄÚÒ‚Þû¦7º.sh÷å™T'g~Œ<ÁqæRÿªôÕ•Ô»;|5®Ï¯|l€'B«¬h«\–ˆ$ò„jªzlNÉ OÀXî•‘E2³1jŸõ?xëCîiÌHζ}ó92ì* ãÌ2í3´ófe;dìs"]¦YÊcÕA“å‡t?ô^óyÔ?沨ÅngŸé¡!$ZkÀæ“X-0.ÈiŸN¾‘Ö¤‰V™…~Q<"æ8~‚.2¦<îøîk+¼ Z-Ÿ»«tè/êŠÄG ¹jE«ŠkN91N¦>ú,5çk~ÃÑs$q{sÑKT?ðæ­Zh!®ìG ùoñËN+»×”žÈšy"H}&A°BwLµ„–#øÝZ9Sþ'Û’:*GÆU®µ0½”מ±Ö¹ ³Ìù¦&ê yÕ3Ç-BÿbA­ÃÒ|Š•ÂÄœ/jF–±‹éE%c<¸™»Ù¡€<:]ÏoT=¦©î/M;ÈNk7æ=e  QƬkÒu]{˜IUË™UOê_Úo—zöyù^;žÂt‚±Ïa¤]£o×Î2ý{‚ºv¦#•ƒ¤O!<ª’qf¾?YÃÞ?J¡’n¯1&Î ›:Bó¿c×;\­„w'ÒÝÆ¾Oõ>æoô™­ïä“?dù6Mt?DK¢gÄTt)ÉM#¡(ºIÄÒ¸¯)“™Ät¹InÈD“S­Š×ù’åœÛB]$²7QmI=ý^VFçZîê,"Onbå?—ÇÛi?“=<i J›Ár,­\ݧ¥Ð{ä;÷Ý«×láëU:Ã¥fè;íଽ°Î"‘;¾‚çyÊ{REO6Vci:†©E9;ÞI}©8æe/ .ùu2ÖÆÀ6í K®p±tSP¯v†í‚öø.$¥ØäBåµPXwÈ•ïºK˜}Ô‰T¢,¹:dî!êÑ5;ÃôXc(ˆ”ýóôÚ]#-×ù¬˜ÇÑýO4ZZ9:Þ®´ÃÕ4æúÛ…Ò.—ýîýªSbú?2ŽÍ endstream endobj 332 0 obj << /Length1 807 /Length2 1509 /Length3 0 /Length 2099 /Filter /FlateDecode >> stream xÚeR{ ”yNŠˆl»¢äò;…034ƒB¹%ä®È%ÆÌ;æµsaæF®™‰ ‘U#ÝSÊ=ÙD²¹äÖE“„¨O.}…‰µ/i·Ýþû=ç9Ïù眃Ötõз$3ƒÀ]L¬3Àn(Î켡Ê+‚?“lתòÑAÝàHx&$*˧âCJÇR'¨2Ê2^G´Žšf ªkŸTÈt•ëbíºóYÃ%¶:z§5/9¦ñÿ;Þ»}.7Hf Æ»–Åˉ¦.ŠÄæ~m}‡ç¢<#sk:ˆï¦/Ž…6SýÛýî9%IÈ3×–µÆøÏïò}×ulQ‘t–ŠØíìj_'ó¢×Ù.ØdðÉ–8£’yÙ’ÕŠÅÔêçŠsW™½ÞžÈí —:Û´¬õp@vHžçÇ6ì*\°t˜V¦ûÚÙm\1M#Înµî¡=¹W­†×_]m’/z½nÏ|_|¼LÛ®±Z¾4lÛZK¨KÄçõØ4ÝG—¤j:•GûAª£Ù†-¸Sí}±#V!I·Øª¬™ðŠgk­òÐ#Øæî]]m u·†Ë‹Ù“/öV;ªi—OõÖ9:ž_èqÐ<Ó²åãú·©uA¾…Q’ÔÑí!íÝüaëÁö 0}RJ«ýÁù™kÜsU…fŸ:~Í“JÀÕ°ùVú xóßœDz‰ 螎/Ä­ ÂyÈê Ÿ—pÉB˜Ð'g½Êþt`05 óæ%ãCÜ\×¶c‚È(iawã½Û«ÃNúuÅÆ*¥™3;dDêôvfVFÎOŒ9xùý¸_•žænUÈO–Ð=z&7OÜ lO2Þ¯™pß,SC`¥yÃ9w¤¹oP(`~J¾p—–¯ƒ78½ù×Ï«$+â’‹Óï†e4ÔPœyLûj¬µÎz‚™ã=÷¦«—î¡Æ3\|ŒËâ}eèØ= !óú1ÔJÇT±¡ýŽ©oë>¡T±bèU£Ñ¯ß¦ƒy–ۜ>umé§ŸÝ*jÖmäŽô:`0·‹n´‹µ\(—r~ª?lüÚîÖÚ/ŸéŒmXn,¾‚1Ò¿€}—qõšóg]au@„ƒ¹‘Œd„ú¥ÿí (3¼’ãÇßÝlYeÃ]cÜ6ÂÃ`‰K˜øÖh²Ò‘Æá§á­Ï†'“¤íܼ…Ý<™ën&NWêozÛœ~ËÿOJ–'G­ß·¬dýiŒúïkJž½¸Ÿ-RÕ8{cz4Ú+&µë :•~Q~‡Æ¿ ðC›½“¡5;æÜõX%”¶“ðDw%?Cmw û>½mÛl¢YÚûйΘû9O¦ºËU JÞâNûWêÚ@+ ­\Gó½ÿ÷Æ…†£é¸¤ôE/'ðê~xôjîi¿SšÎLEKÊHAÕÄáU‡œdçÖî^®)@›ê5$kª£³l.{(ÍâX{Rª±õ'8ÑxŒ˜ùÚOƒŠ’=QÊ/”ù®ÔšÉ°Bi} ªÕÒåG壓ÜÇè‹“"/‹­õT㌗ý¨dÛÂË’ìOåû«žB‡'§UÒD5®zvz¥ðÍÞñ([ã²%p¯ nkŽ÷äP뙳ӡ ‘ÁU'§–½”fšh›͸Æm*{óyûAFO0ãÆö¤:¬‘/íÁü±_ºdÓf⣳lããu§É£Å¸–°#ƒò^²þ¤ endstream endobj 334 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GðÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/@̪X endstream endobj 335 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GÈÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/znªb endstream endobj 336 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷g1Ù]êC_7î[Ý,ç«ifkì¦ÆÜ’Ÿ¦;×móÄÄ#çÜò¦JÛ#<œƒé ƒMGeûº©ºA ÛAZ $«ê²Fî»<ÚÃÀâÍǹ7Çu³oƒå’M_íä¹ï>œÂ‡`úÜU¦«›wv£ÌÎl.§ÓÁ@ãÁjÅ*³· ­÷Û£aÓ¯ ^)o'ä RU¶•9Ÿ¶¥é¶Í» –œ¯Ø²(ViªÿæZ±ÛÔÄRù_¡ŠVÁR†Ën±-`2ÔT˜ÛBXXQÁâ` ‹å Ë“IŠF\ ‡Bµ¸îbu ’ù¨¨ü½íí<\`Gc)y ,©<$¬g„sàˆvàÀ1a×gØÙ­…N)¤ëI&âŒS?^`œùqŠqþä·5ð„ó Bœ…€{’ °$.ô çë°ó SÇqd­‚®AáEBu<§µŽã¼ñÌqèrxΛˆà_¯ÂñÉSê89q$0ùpûJA· ýRÒ5fÀ aø©§'¤ž!8!‘†žhˆÎ$"NN”“_hˆ ò…ž1'>4$ÕÁOˆŸ¡OB:Ý]*N:qžJøÜ(és£BŸ5ó¹Q‘ÏŠ}nTâs£”Ï¢¬(èQƒwÇÏ|žT~›'UÜæIóÛO:öy҉ϓžû<é…Ï“V>OZû<éÔçIg>O:÷yÒ…ÏSÊ}žRáó”JŸ§tv½3÷Ëw¿t¼MxG¯¯^yé:û ºÇÖ=txâêÆ\ßãS{Â*÷qùø·Ñsü$î© endstream endobj 337 0 obj << /Length 711 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH $úï×3C õz¿¿Ì¼Ìï÷íÌÔÝÞÍÂg)>ÜÐ]úÊͲ߻sððwÕåäÚñÕ¹ÚÕÓéð"Þû®ÚºQé;4mÝ_%‰= ”uS×'ü¯N¾%¼ýFwÚ´‡.HS1ÿð‡Ãأʧ`þÖ×®oÚ/ñx§ÍŸm/çóÑ!ƒõZÔîàKú¼îNNÌ~Íéóûì„ÆgEʪ®vÃyW¹~×~¹ •r-Ò²\®­ïÎbÊØ&jâ©r ¡‰ÖAªCu é±Àad)°ôXyœ x¤ &äI)RÌêVÔ˘.L¢I@õo×_¥Êpi k-cÀšâp¡ [À Âàˆn€cÂXçz3æ‚N­4Ö´ˆW Yf„‘ŸÓË%€ Ä9%bë™*Ô©Bˆ+Ðé›|¥© A…Ä_F:CêÔ9èQÔYƒ5ŠÀKÊEê—9r¨ÏèW8f•a¼D>éÏSG&ýx¯VôŽ _kU8!¼ò8ºŽ0L5#àD½ ÔJÒ üXê'9ÅŸ?‡: iÀYI WFñÜæ¹›çn endstream endobj 338 0 obj << /Length 683 /Filter /FlateDecode >> stream xÚm”Ooâ0ÅïùÞC¥ö@±@…ìü‘8l[•jµWHL7$Qýöë™!LUõz™¼±ŸýSæî×ënfªöàfá£onh/}éféï}ÜÝemy9»f|v®rÕôvx¯}[îÜ(îÓm¶mêñÁ›·MyºTnrýl²î£nØûˆûw÷wVžëqTrv¸Ô§±nfÜïõxò®Ÿ ÂWÅ·ªÀ¶?®ê¶yêQJé yS¥íN2ók1Ÿòë¦ê¯‘ÄJ‹ª.Çëþ—g%мûFwÞ6Ç6X¯ÅüÍ¿ÆþS>ó—¾r}Ý|ˆûoÙü»Ý¥ëNrl6¢rG¿¤¿ƒçýÙ‰ùÏǼ™Þ?;'4>+JV¶•º}éú}óႵ”±.ŠMàšêÛ»˜:ÇÉšx«\Â_h›`­•×:„‚ôÚPˆ©€p/ *,}!†–$ÇB -fu[Ôǘ6LÔ ü·ï¯Qe¸ }›Ä­µŒAkªÃú2$mAG¤sÐ ÚA‚ŽIã:×±×ÀšJãšõ "Ê”4ú3:KšŽaÐCg´þ"× sªê rJ‚_i:6dPtk69uŠÌ©3È£è" ®™PÝ€^R/z0¿ÌÐcPç_Y̰€Ì*Åz~ÊŸ¢''Mùq_ ùu¤¡WG”5dÐÒoé9JÒàO¨ïpù¥×Hº+8¯QÌÎhfgBfg"fgÌÎÄÌÎ$ÌÎfg,eÈ@ÓyÉŸ1S“3SS0S+™©UÌÔjfjCfj#fjÌÔÆÌÔ&ÌÔ.™©]1Sk˜©µÌÔ¦ÌÔfÌÔæÌÔÌ4•Ì4UÌ4ÕÌ4 ™KÝxá׆_|þ0®n£¥¼ô½Ÿ:8Óp–À©w{]ÛAþp^N3ž^Šà?ô'Œy endstream endobj 339 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 340 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 343 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúx²=7û¡i'Ô·fØ[Ê7³Ì–Øçs ~›þÔtíœs[(Ú:ë0p ¦l:ÊÚ5mÝ_”°-tB²º©†ËÈ}W{X¼þ8 æ°jw]¦lúj'OCÿáô=Óç¾6}Ó¾³ûÏÂìÄú|<î D0,—¬6;ÛÏúþµ96ýÆÝ•ñöq4Lº± MUW›ÓqS™~Ó¾› å|ÉÒ²\¦­ÿ›KhÅv7RKås|…*Z© -–1 Üb[Àd¨©0·…°´8¢‚ÅA ‹å i‚É$C#.ÐC¡‡Z\w±ºFÉ|TTýÝôí<\`Gc)y ,©<$¬g„ àˆvàÀ1a×ç²³[ RHדLÄ1>g~¼À8÷ã ãâä”·5ð„ó Bœ…€{’ °$.ô çë°ó 3Çqd­‚®AáEBu<§µŽã¼ñÜqè xΛˆà_¯ÒñÉSæ8q$0ùpûJA· ýRÒ5æÀ aø©§'¤ž!8!‘†žèœIDœœ¨ ¿Ð•ä =cN|hHrªƒŸ?GŸ„tº»Tœtâ<•ð¹QÒçF…>7jæs£"ŸûܨÄçF)ŸEYQУ.Þ?÷yRÅmžTy›'Íoó¤Å×Ozîó¤>OZùO÷yÊ„ÏS&}ž²ÙõÎÜ/ßýÒñ6á½>zÕ¹ïí{èžZ÷Ðá‰kZs}Ý«ÜÇ=ãã?FÏeð‡†§y endstream endobj 344 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°ÛªT«½Bbº‘ ‰B8ô߯ß{ .Û@ãçñóŒ=˜»/Û™®Ú½…œ½Ús{éK;Kîºàî.kËËÉ6Ã/k+[M³ç'öÒ·åÖì>Ýd›¦yÓ”ÇKe'Ö÷$cßëÆS`vÿfÿÌÊS¯fûK}êfÆúVGGùf–¹û\b¸à·íÏuÛ<1ñÈ9w…¼©ÒöÎÁ|Á擬CÝTý¨„íAW $«êrGø]žÜIÀâíÇy°§Mshƒ$aóW7yúÔ÷ÌŸûÊöuóÎî? sÛK×-ˆ`ãθtJ!±'™ˆcøÀ8õãŒ3?NaœâOœâ¶<Dg!Àƒ;IXô ôÀÍ0z)rЃÌ@« kÐpÈBQ]^ÒZä 7ž!‡î /½‰ü òU Ÿ<¥Èɉ#“ÜW ºmÐ/%]cXß!õÔÀ ©gœÎÈ€žhŒœIDœ8QN~ACT/ès⃕QøŠøôQ¤ïRsÒ ç©…Ï–>7:ô¹Ñ ŸùÜèØçF+Ÿ­}n4eEƒ=zG~æó¤óÛ<éâ6O†ßæÉˆ¯y2òkžLèód>O&òy2±Ï“Q>OféódV>OFû<ãódRŸ'“ù<™ÜçÉ>O)÷yJ…ÏS*}žÒÅõÎð—¿tx›à½>zå¥ïÝ{ˆO->tðÄÕ½¾Æ]ÛÁ*üà3>ýcÀè¹þ¤C§~ endstream endobj 345 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúùd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúÅd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qض*Õj¯˜n$HPý÷ëñ#xÙö?ŸgìÁÜýxÝLTÕîÌ$|äìÍôí¹+Í$ý¹=wwY[ž¦ž©L5ÎöOìµkËØ}ºÎÖM=—ÝZè”Bºžd"ŽñÁ8õãÆ™§çÿðGNq[O8"ÄYx°'™KâBŸp¸ž;2uçAfÐ*èY$TWÀsZë8ÎÏ‡î ‡Ἁþù*Ÿ<¥Ž“G“·¯tÛÐ/%]cœ†ïz*pBê‚Òiè‰.À™DĉÀ‰rò QA¾Ð3æÄ‡†$£:ø ñ3ôIH§»KÅI'ÎS Ÿ%}nTès£f>7*ò¹Q±ÏJ|n”ò¹Q”=êâÝñ3Ÿ'•ßæI·yÒü6OZ|Í“–_ó¤CŸ'=óyÒ‘Ï“Ž}žtâó¤ç>Ozáó¤•Ï“Ö>O:õyҙϓÎ}žtáó”rŸ§Tø<¥Òç)]ïÌýòÝ/oÞÑë«Wž»Î>ˆî±už¸º1×÷øÔž°Ê}ÜC>þm`ôRb©Ç endstream endobj 348 0 obj << /Length 744 /Filter /FlateDecode >> stream xÚuUMoâ0¼çWx•ÚÅvHB²ó!õ°ÛªT«½Bbº‘ AI¶ÿ~=~/íö?ŸgìÁÜ|{^OTÕnÍ$¼çìÅôí©+Í$ý¾977Y[ž¦~S™jœíØs×–k3°Ûô1{lêáÎ’›rªÌÈú?I›·ºñìÃn_ͯIyèûíÁ'ÛS½êfÂA­‡½¥}Á`¶Ì>–™[øÓt}Ý6LÜsÎm!oª´=ÀLLÏ‚Øt”¸«›ª;«b[h „dU]ç‘û.öT°xýÞæðØìÚ`¹dÓ;ÙÝ»ÓyLŸºÊtuóÆn?г“ëÓñ¸7Âx°Z±ÊìlO{?6æ_8½°^߆I7¤­l+Ó7¥é6Í› –œ¯Ø²(Viªs ­ØîFjb©|ޝPE«`)C‹eŒ·Ø0j*Ìm!,,ލ`q°Œ…ʼnr‹ƒe‚É$E#.ÐC¡‡Z\v±ºFÉ|TTþÞtgí<\`Gc)y ,©<$¬g„sàˆvàÀ1a×ç¼³[ RHדLÄ1>§~¼À8óããüþÈ)®kà çA„8 ö$`I\èÎ×3`çA¦Žã<È Z]ƒÂ!‹„ê xNkÇyã™ãÐäð"œ7Á¿ _…ã“§ÔqrâH`òáö•‚nú¥¤kÌ€ÂðRONH=CpB:# =Ñ98“ˆ88QN~¡!*ÈzÆœøÐdT?!~†> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G½;~æó¤òë<©â:Oš_çI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³Ë¹_¾û¥ãmÂkzyøÊS×Ù7Ñ=¹î¡ÃW7æò*Û#V¹{ÎÇŒžŠà/zÞ®Ö endstream endobj 349 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö‚Ïöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õRé̯ endstream endobj 350 0 obj << /Length 749 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4ÖËÙþ\Ǻ™qÀ¾×ãÑa¾Ûf.Çnr K~Ù~¨Û扉GιKäM•¶'Ð0ó 6Ÿ˜ê¦ê/dبB²ª.ÇË ¿åÉ]o?‡Ñž6Í¡ ’„ÍßÜæ0öŸÈð!˜¿ô•íëæƒÝß0s;Ûs×-°`1*ÿìú w®VPÆ¡±”<‚XRpE±xAqqH'pˆ#бÏåd¬žRHìI"¢~°Nýzë̯SXçÿà'Lq›œ@ BÁ]ÐÀ¥Š!–„~5p³€5È1¨AfÀUÐ3h¸dS^C¼¤ZÄ 6ž!†Þ -µ‰ô ÒU ž4¥ˆÉ #!&x®ôÚÀ_JzÆ bâ,¡§\7ŒcÂÀ}(:KC­¢³Ô*º;<Ë5à®B„€ sºà¤zFœðÀ-Î(ø˜ðô‰‰?¾±æÄîY ï'-½Ÿ´ò~Ò ï'z?éÈûIÇÞOZ{?iò>ú¢ñ™÷™Îo}¦‹[Ÿ~ë3#¾úÌȯ>3ÊûÌ,¼ÏLè}f"ï3{Ÿ™¥÷™YyŸí}fŒ÷™I½ÏLæ}frï3SxŸ¥Üû,Þg©ô>K×7É€fÌ×ë4,Ï}ï%a€0úêÆ^çt×vP…?ðÓß ¬^Šà/®7 endstream endobj 351 0 obj << /Length 749 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4Ö«Ùþ\Ǻ™qÀ¾×ãÑa¾Ûf.Çnr K~Ù~¨Û扉GιKäM•¶'Ð0ó 6Ÿ˜ê¦ê/dبB²ª.ÇË ¿åÉ]o?‡Ñž6Í¡ ’„ÍßÜæ0öŸÈð!˜¿ô•íëæƒÝß0s;Ûs×-°`1*ÿìú w®VPÆ¡±”<‚XRpE±xAqqH'pˆ#бÏåd¬žRHìI"¢~°Nýzë̯SXçÿà'Lq›œ@ BÁ]ÐÀ¥Š!–„~5p³€5È1¨AfÀUÐ3h¸dS^C¼¤ZÄ 6ž!†Þ -µ‰ô ÒU ž4¥ˆÉ #!&x®ôÚÀ_JzÆ bâ,¡§\7ŒcÂÀ}(:KC­¢³Ô*º;<Ë5à®B„€ sºà¤zFœðÀ-Î(ø˜ðô‰‰?¾±æÄîY ï'-½Ÿ´ò~Ò ï'z?éÈûIÇÞOZ{?iò>ú¢ñ™÷™Îo}¦‹[Ÿ~ë3#¾úÌȯ>3ÊûÌ,¼ÏLè}f"ï3{Ÿ™¥÷™YyŸí}fŒ÷™I½ÏLæ}frï3SxŸ¥Üû,Þg©ô>K×7É€fÌ×ë4,Ï}ï%a€0úêÆ^çt×vP…?ðÓß ¬^Šà/»®< endstream endobj 352 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 353 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQÈÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú á«„Ñ endstream endobj 354 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq9;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF ׃ú endstream endobj 355 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq5;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF#üƒÿ endstream endobj 356 0 obj << /Length 851 /Filter /FlateDecode >> stream xÚm•Ao›@…ïüŠí!Rzp½ –ʲ´€‘rh%QÕ« ›) ãCþ}÷ÍŒ“6ÊÁÖcx³ûæÃ^®¾Ü=,\7îý"ù¦Õ½?ç©õ‹êÇî]]Õc{>øaþé}ç»ËÝÓwu7탟ÕuuSß ýü5˜o†öåÜù‹ësSéŸûáÝ‚}Ôõ£ÿ½8ìæ?;£ûsÿ2÷ÃBÃýØÏ/Áõ¹A…ªúPUÔöËO§~¾+óMk Û¡«Æ&9EKI£–—|OýÐMIí02±êúv–+ún š^O³?Ü Oc´^«å}¸yš§WJù5ZÞNŸúáY]Èî=œÇJG›êüSX20ø¹;xµü|Ì7ÓãëÑ«˜® 'kÇÎŸŽ»ÖO»áÙGk­7jÝ4›È݇{FZöOï6xu¾b›hmÐlb*˜ ……Œ I(Ä­ƒtÚpÁ†BGN+ë ŽŽ¢@ÁäpTØ¥æ5‚ŽÖ55·ÔplivláhàhØ4†»LQ¤—©Ú?»I„­Ñ¦ ér±t\eÐ é#êyöÕ)×k茵ƒÎ¹7‡¶\'Á½ ´ã:8ê’÷%OÅõºf’XÓ$Ü‹ºá %éœ<šð[~6˜Å0ÁH ï• á½² \Wï×ôLë÷kZsûÿâiþ¯Áƒc¼Šé©s&o¦Yc¶œûxYânæ  kp·1kd³ k¬oW¬·ÐÄÝ›±Æú6gMËó#ƒ´/±0+p±%kd¶k0²5kZŸæ7)˜Ú†5rœ?žçOá/8?ýž Ο"OÁù3êåüf/8N~Ο‘ŸsæÈ\pÎÏ»àœ õrNzÞç4ôΘŠgÌè„s -œÉ#œ±—Îø:áŒ}pO'œÉ#œ1»ÎÈï„3r:áŒÙp7'œi}áŒüN8#g)œ±o)œá/…3ü¥pFžR8S¯pÆì¥p&¿p&¿åS‚´œ:˜¥þ˜¥þø–ŸÖäÿŠ£5ùRÒ:žš÷JÁ¡æzšàƒcJî‘æ{u#§N8”ñy;ðÛó4…w½iè„ÇÙÞþíet袽Å.oN\Ý6Ñ_¯[Ý3 endstream endobj 372 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240822094821+02'00') /ModDate (D:20240822094821+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 273 0 obj << /Type /ObjStm /N 94 /First 872 /Length 4910 /Filter /FlateDecode >> stream xÚí\[sÛ¸’~÷¯àãdOÅ$îÀÖ©Sk;vâ\}Kœ™T›¶uF–<’œÉœ_¿})KöyBÜÿ°ß2[ÈÃS,f$¡˜Â-z¨Š-£ U ¾E,[DU“fô$eôCFw VBÅ ë#CY“ð2‹^J•‚²0i|—ˆ·L°¾ìHÁ\ùâ–GÈa :X- ™ìñh! 9qç¼ÐÓÂ!È|ćÇhnäYDÀ#ÃpbáW-KQ}¡h»—@@Ì¢5’~b=mØT.xDS˜&5S¨€' ”ÏÈ ’¼e¸ÏmíàaÁ¡ÜvÕ*!±…}çè 3½-î>Ãò8Ì)<Íô®zÞ…[J­âxÅ›Ò.¨yE¦æþ‚JÓ³N(uoµ„i#ÇD2ÒbŒ->³®⾯ô„ÙŠ¢$€e+cŸw´ë¡âD ½ÇÊ:CÑ’+  ¾G´ž€Ä¾W˜’¡9„ ظ°€9v¹µ~a+\'E#ÕÈhKÙÛ‰¾9 Jì‹£ «ly„­BójZ~E?ÚGãù«TôŽ¢>zí“5Û¯K \ƒÇíÍ­’X aˆÀ„žÊ‰žÖ, €¢)¨p2hžq\G¨¨ðZ§ Üh¼â±Ý <=y]¦’$”š(¹4)ÞãÔ_-íCÚÈ3‘0êbðdç–GXw¯ñ¬ŽZ–Â%fJŽ|&Ḧ‚äLÀÒi[ª„¨/„·ª|᫞§ôÞp±Š‡~(ðpåÅ…¤©Qj±üŒmŠLªÝ'#ëhAîÓ]ÏÂö<šú„•xbó[+ÎLè™sDÌðÑ3Ø~é[Fú”a5G岓U–ðˆ¹TGrk+©’À–GœÒTW±Êi:ö,æ%Vq RD¥ eI…¢™’v#)Ð,Uñ㙑7å2F×¼‘ o‹ÂÖ†R…ÂÍÞâ Ùh…[ôd «~O3hÌÐVÄg/âÜšŠß) ÀÊSFýÅ;—ú¦(tAS ‹7Ò† n*#}ˆÉhµ)Âyp‚€ÎŽ=§i㸃4x]XHª⣕(¢‚\·:“«¾¦¸«[#i”Ž0M:žÎåqI§-&ŠÆ” Î ÷Þ`Fcoà‚>ÞXòbl¥7tºè˜TõµàÄSŽ#šNÌ@U;Ò^”¨ã03ç–IxÑ´ŸR*è»ØÆEÒ·tœ§ÜÓ¦²qËka©®bË#¬ºã2†•öp<Ò;ô2ØNiBtxŒ…„ Ùèe’ŠYñáyÌ™[ÆæEîLG­( íÌdÈó†n¿0Žv£žc_KÞ&> e ·¯ÅZPò{]€—XcGSÕoXîGZ·cA×x’Î’@9‹¤Þ ªÉ‹œ ˜‰Ó{GŒÚʪï Ò O.k]¼¬øª!ÓcñL‘šb«Áã§ÛOG˜³.è:2éKG·° MœËãTœðˆs’Êš›ò$¼HÅëTÔ•ûé[Öˆû±ÅÕÓß&ãù‹rv1ÞÍ'Ó-z~?¸…7Ÿ?œ|õ½w»ŸE/FƒëY¦™bwwò#ûòÜØì¹Ä²GXô9(òÙE9žZ@¹7¸{U¯oàÑÛ­—ÁwϾ<œFËñõ¨Ì€ýé¼¼ý„•ÀVþ9N‚:xÜ ¦§å<û%ÿ㾜͇“ñ3á`¥÷ÕRéãî§ÓßX%Ù£’B•þŒžF¥"ôª´›ïå/òƒüeþ*?Ìßåïó£ü8?ÉOóA~‘_LF“q~™—ùU~u5Ìé¿ïð4¹Ÿæ×ùM>ÌÏGùm>Î'ùd\æwù]9N.ói>ËgÃù<ŸßLË2Ÿÿ9Éïóïùv¡X»ÃÇç'„]èÎWÞ€¿²>‰7¸^èv¼—ÛQ„ì[ Ú²&^M´¦ò{9^V *¹–›½==<8¨öN÷z¶Fƪp®‰•-¬Ô«¢('œ”Hqº$­QgÔö¾©•^G«½÷oß~­ÏÎú´ •‚Xi¦=‰ÑP kR6õzްf6ôjv@&µ:n•òûÁ¬ö¾ùëØ&ãûÛoåt6¼F<`· ¦åxT^͹7ÅUª-ôáÕÞ@æ?ò¿òÿ4Q´ë øâüøóÞ> øî°/ª*Yù†ö?ÙGjÕ>J`\á ¯òóü3x{;œÆù]S¹µâëËw¯w_}åNútÓE¥[£[ñÙ‰ñuŸ"ìaþ&K.ó!Œ³ü#èþ¹Ð·éàâ÷rNÎûì•o1@äa4^Ž/³›ÚÝ®Z!z´ˆ:µþ{á‡Cˆ?uÌ^é…ÜOæåå·TLCOÜåHv;dY1m6B!{¼8ÿO9¤ÖVÅz'ÂÇ£Wû‡dížÃTi>Lƒ÷Ocl³ÂØ/Á¨ƒÄNÑÿ¦àG[™ûµ×ŠîçûïNÏ%µ]ÚŠäîbûŽ:7^+ðï¿Ü?>xƒ ÛåúÊ¢>øÕ“ØÙ«^;óî[œë¼•à“䕳7u^+L8ÿmçÕêÜccé*¥|]XOç–¾M]׊ڻ'§Ÿ0Ñ?ñ=þlëd¥x]m¯®²êt˜ÃtzÆ'q¸‡}ÑvÒMŒ«¸˜DÃvPkÅÂ×/ŽÞ¾Ãäè¤'9†j"b¨ìÓ`¨{1\UI(~ªqlžd|x ŸêÀZ‘6-y­È»»öâè @>=íñTk*”-Ý=ö£Œ‰D«*ƒ¥^ZŸ?®¸o—¦£”á\ âZÑüàìøÍî!Ø_Ø;Qáˆÿ{¬/£Pé–7¾¹åßóænjµV¼þxôáåÙ)huÖŸV›:bë'J«­ÿIãýwÒ©MÓZô®¶ñŸù_Mּܨ{óú˜ ð?C OUXôŸÔ@GÖ´kè%× ­ov?¾~Oz…ŸéõtSñÓº³+Þ‚v-ÝÖŠhû‡;xlô–ÔÏ5—ÔF¹Ç”Ôë×K¯z*¦OP-þºnÕt9ÓEñTŸÙ‹ë™ëi9€r¦{þŒÊÙlq5JøŸ‡Ï»Ñý¬¾9¬ë§´t¢îlˆ(µ.„–O÷ãKXýb2-û3¹V<þ°wp¼ÿ’] §Œ¢[üe/ùÍã] ¿Šâ8UE¨ÛÅþmÞ)¹Vpþõõëó·œÏz"n`…?èÑ ÖpE~¹ŽŒnœžÖ‹[£›5Oç¦g-jñªØlGt¹VDßùp|~ºC¸õD>ƒƒ–€›Žqá™EyϬr{æèê‰C(7³Êw²J‡Z§˜IMËïYË hjU`ÀTµjjô¿÷åZ–&Yñ‰1}9ŸXáE>Kä‰gò1-> ›VrÆ3u=SôÏŒ… Ð:£™M¥rKÙðÌ%¨Jµ JÕ€2Ý×µpdñ(\´øsÕZ¬Æ[®Â»Š¬´˜Z‚·¬ñ–fŸ±„M ¾l‚ï&b‰ßÈnáú'¦ÐË%Ћz¡ú¹¤À/“EÔ˜†eLxÞ .»A;=ãjYÈÒUŠ-­+îxïAã—“‹ç§óÁtþ,ãº)ûåÕÕd2Oæå¶x†ÿ4®=*qTµGÕ3ü .íQý ÿÄJ{ÔÀ¨á3;¼Î[¢4h¿¶e^¼´ÈH¶Ù»g`úΨÇQÝ 0*¢€C(þçänpñ;ÄØÿ~ÿîU5ËßžìMF“éî´ü³œ¢–¾­OCÌÕÓ;*Þ ÂÏÕHŸ –7U5$Rét¬#LFÈ\!@K‰Ž´ÕŠÍr‘ОJ%ÌД&MbS ‡6*’2D:@6°KÒÏjšŽ@³òï¼ÿ ¥ÑHõj-‹Ö j®BkU²º5hPFÑ´hË™Š‘ÒöË ˆßàsmsíØñUS%^5eGÑ«´a‰îYJÙ'#ªj*¾÷ßj)9",G¸—Ñ#â~ɸF(;ãù+ß# <942C096108AD638FA312C8DAB4CC4F31>] /Length 945 /Filter /FlateDecode >> stream xÚ%ÕKlTeÆñï=3ç0mi ½—^¸µÐb§ -¥7Z •Ú"´ÓJ/Ü ‘h¼Dc¢Ä`b¢;1ÑDW^vj^FãJܸ%btÅB‰WÆèÊDCýþ›_žï=sΜË3gBa3 Á`ÎDÒ`áÁ½@H‚mŸ#$p„Ù,)ydvš”BcÌN‘¶@Æ™=A*ƒrX`v’T[9<³–•PŬ†Ù4ËjØÆ¬ƒÙã,·C ³C̦XÖB3]Ç –õÐÀl‚Ùc,¡‰Ù1f“,›a³YfÇY¶@+´A;섇aì†=ðì…è„}°º ÀCÐEè…ƒpF,„j=>èç„t•JCpÀQÐ &uC/Aå[µ›Ž7LçRõ¤…Q Ïè+u¼a¶^!uA…öumÕó˜°Ðð––Üv?OÒC9ºuº§ºÙ',|ÖªÏY¸µ¡T‚³0cá«O4›ç‹ôÜt£0º±”5UYÕUJ]S g-|ÿ‘Žr–a V`ÕÂosÚz–,ÜíÒR'~K(™µ~ÎÌÕçKîÿ«%¿Wï/Ã:\a¦­fÉÂp0++i©*S`WYÕbºë”Ð3³ÚŸõ9ºë”Õë¸@€ó›q~3Î/Åù¥x…Ùò«Úƒz›Ù³w´¤‰Nþ9Mtjæ fWS}„N:uôN¾cDò»ÊOå]•o1ûpJ»õš}±©Äm÷.³OÒ’v:5sZì´Øi±Ób/šmþ,iüX¦pÞgI¹*åýpÆ€‚ø %5£ÚªËW‡@ÕQ8jÉøwúmrŽ:o § Nœ2øˆ¬ü¹\Š\}1ríËÈÓDž+F^h¼Ty9D®ÿ©ïÕë_ïûèu£¿¢E8ga ÎÁ2¬À*¬ÁyËn¼úîð‹;Î endstream endobj startxref 430717 %%EOF NMF/inst/scripts/0000755000176200001440000000000014333156273013345 5ustar liggesusersNMF/inst/scripts/report.Rmd0000644000176200001440000000334614333176413015330 0ustar liggesusers ```{r setup, echo = FALSE} library(knitr) library(NMF) options(width = 300) opts_knit$set(root.dir = opts_knit$get('output.dir')) ``` # Input ## Method definition ```{r load_custom} if( file.exists(f <- file.path(opts_knit$get('output.dir'), 'functions.R')) ){ cat("Sourcing custom definition in '", f,"' ... ", sep ='') source(f) cat('OK\n') } ``` ## Data ```{r data} # Target matrix class(x) dim(x) head(x[, 1:5]) ``` ## Parameters ```{r args} # Factorisation ranks rank # Methods unlist(method) # Reference class summary(colClass) ``` # Run ```{r run} # run NMF for all ranks res <- nmfRun(x, rank, method) ``` # Results ## Plots ```{r resplots, echo = FALSE, fig.width = 10, fig.height = 7} dummy <- lapply(names(res), function(x){ cat("##", x, "\n") fit <- res[[x]] # consensus map consensusmap(fit, main = x, annCol = colClass) # measures if( length(rank) > 1){ p <- plot(fit) print(p) } }) ``` ## Accuracy ```{r summary, echo = FALSE, fig.width = 15, fig.height = 8} # compute summary measures for all survey fits s <- lapply(names(res), function(x){ NMF::summary(res[[x]], class = colClass) }) # complete missing measures snames <- unique(unlist(lapply(s, names))) s <- lapply(s, function(x){ if( any(i <- !snames %in% names(x)) ){ nas <- rep(NA, nrow(x)) x <- cbind(x, sapply(snames[i], function(x) nas)) } x[, snames] }) print(s_all <- do.call(rbind, s)) library(reshape2) accuracy <- melt(s_all, id.vars = c('method', 'seed', 'rank', 'metric')) accuracy <- accuracy[!accuracy$variable %in% c('rng', 'nrun'),] ggplot(accuracy) + geom_bar(aes(x = rank, y = value, fill = method), position='dodge', stat='identity') + facet_wrap(~variable, scales = 'free') + scale_x_discrete(breaks = unique(accuracy$rank)) ``` NMF/inst/scripts/grid.R0000644000176200001440000000375614333176413014426 0ustar liggesusers# NMF package # # Helper code to allow mixing grid/base graphics. # This code is only loaded with the explicit request of the user, # either via option 'grid.patch' or environment variable R_PACKAGE_NMF_GRID_PATCH. # # The functions in this file were adapted from the grid package, which is # under the following GPL license: # # R : A Computer Language for Statistical Data Analysis # Copyright (C) 2001-3 Paul Murrell # 2003 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, a copy is available at # http://www.r-project.org/Licenses/ # # Author: Renaud Gaujoux # Created: Sep 16, 2013 ############################################################################### # This is essentially where the patch lies: not calling L_gridDirty grid.Call <- function (fnname, ...) { #.Call(L_gridDirty) .Call(fnname, ..., PACKAGE = "grid") } # One has to test for nullity since not using L_gridDirty means potentially # returning a NULL viewport current.viewport <- function() { cv <- grid.Call(grid:::L_currentViewport) if( !is.null(cv) ) grid:::vpFromPushedvp(cv) } # same thing here: call patched current.viewport and # check for nullity current.vpPath <- function(){ names <- NULL pvp <- current.viewport() if( is.null(pvp) ) return(NULL) while ( !is.null(pvp) && !grid:::rootVP(pvp)) { names <- c(names, pvp$name) pvp <- pvp$parent } if (!is.null(names)) grid:::vpPathFromVector(rev(names)) else names } NMF/README.md0000644000176200001440000000331014556664206012164 0ustar liggesusers## Background Nonnegative Matrix Factorization (NMF) is an unsupervised learning technique that has been applied successfully in several fields, including signal processing, face recognition and text mining. Recent applications of NMF in bioinformatics have demonstrated its ability to extract meaningful information from high-dimensional data such as gene expression microarrays. Developments in NMF theory and applications have resulted in a variety of algorithms and methods. However, most NMF implementations have been on commercial platforms, while those that are freely available typically require programming skills. This limits their use by the wider research community. ## Results Our objective is to provide the bioinformatics community with an open-source, easy-to-use and unified interface to standard NMF algorithms, as well as with a simple framework to help implement and test new NMF methods. For that purpose, we have developed a package for the R/BioConductor platform. The package ports public code to R, and is structured to enable users to easily modify and/or add algorithms. It includes a number of published NMF algorithms and initialization methods and facilitates the combination of these to produce new NMF strategies. Commonly used benchmark data and visualization methods are provided to help in the comparison and interpretation of the results. ## Conclusions The NMF package helps realize the potential of Nonnegative Matrix Factorization, especially in bioinformatics, providing easy access to methods that have already yielded new insights in many applications. ----- __Travis check:__ [![Build Status](https://app.travis-ci.com/renozao/NMF.png?branch=devel)](https://app.travis-ci.com/renozao/NMF) NMF/build/0000755000176200001440000000000014661566507012011 5ustar liggesusersNMF/build/vignette.rds0000644000176200001440000000047414661566507014355 0ustar liggesusers‹…MOÂ@†K[ZiИpñ¸ñn€7‘p1C. } \seealso{ Other NMF-model: \code{\link{NMFns-class}}, \code{\link{NMFstd-class}} } \keyword{methods} NMF/man/dot-fcnnls.Rd0000644000176200001440000000407314333176413014014 0ustar liggesusers\name{.fcnnls} \alias{.fcnnls} \title{Internal Routine for Fast Combinatorial Nonnegative Least-Squares} \usage{ .fcnnls(x, y, verbose = FALSE, pseudo = FALSE, eps = 0) } \arguments{ \item{x}{the coefficient matrix} \item{y}{the target matrix to be approximated by \eqn{X K}.} \item{verbose}{logical that indicates if log messages should be shown.} \item{pseudo}{By default (\code{pseudo=FALSE}) the algorithm uses Gaussian elimination to solve the successive internal linear problems, using the \code{\link{solve}} function. If \code{pseudo=TRUE} the algorithm uses Moore-Penrose generalized \code{\link[corpcor]{pseudoinverse}} from the \code{corpcor} package instead of \link{solve}.} \item{eps}{threshold for considering entries as nonnegative. This is an experimental parameter, and it is recommended to leave it at 0.} } \value{ A list with the following elements: \item{coef}{the fitted coefficient matrix.} \item{Pset}{the set of passive constraints, as a logical matrix of the same size as \code{K} that indicates which element is positive.} } \description{ This is the workhorse function for the higher-level function \code{\link{fcnnls}}, which implements the fast nonnegative least-square algorithm for multiple right-hand-sides from \cite{Van Benthem et al. (2004)} to solve the following problem: \deqn{ \begin{array}{l} \min \|Y - X K\|_F\\ \mbox{s.t. } K>=0 \end{array} }{min ||Y - X K||_F, s.t. K>=0} where \eqn{Y} and \eqn{X} are two real matrices of dimension \eqn{n \times p}{n x p} and \eqn{n \times r}{n x r} respectively, and \eqn{\|.\|_F}{|.|_F} is the Frobenius norm. The algorithm is very fast compared to other approaches, as it is optimised for handling multiple right-hand sides. } \references{ Van Benthem M and Keenan MR (2004). "Fast algorithm for the solution of large-scale non-negativity-constrained least squares problems." _Journal of Chemometrics_, *18*(10), pp. 441-450. ISSN 0886-9383, , . } NMF/man/grid.Rd0000644000176200001440000000230114333176413012662 0ustar liggesusers\name{tryViewport} \alias{current.vpPath_patched} \alias{tryViewport} \alias{.use.grid.patch} \title{Internal Grid Extension} \usage{ tryViewport(name, verbose = FALSE) current.vpPath_patched() .use.grid.patch() } \arguments{ \item{name}{viewport name} \item{verbose}{toggle verbosity} } \description{ These functions enable mixing base and grid graphics in \code{\link{aheatmap}}, by avoiding calls to the grid internal function \code{'L_gridDirty'}. They are not exported (i.e. not tampering core functions) and are only meant for internal use within the \pkg{NMF} package. \code{tryViewport} tries to go down to a viewport in the current tree, given its name. \code{current.vpPath_patched} aims at substituting \code{\link[grid]{current.vpPath}}, so that the graphic engine is not reset. This is essentially to prevent outputting a blank page at the beginning of PDF graphic engines. \code{.use.grid.patch} tells if the user enabled patching grid. } \details{ \code{tryViewport} uses \code{\link[grid]{grid.ls}} and not \code{\link{seekViewport}} as the latter would reset the graphic device and break the mix grid/base graphic capability. } \keyword{internal} NMF/man/nmfEstimateRank.Rd0000644000176200001440000001647214333176413015043 0ustar liggesusers\name{nmfEstimateRank} \alias{nmfEstimateRank} \alias{plot.NMF.rank} \title{Estimate Rank for NMF Models} \usage{ nmfEstimateRank(x, range, method = nmf.getOption("default.algorithm"), nrun = 30, model = NULL, ..., verbose = FALSE, stop = FALSE) \method{plot}{NMF.rank} (x, y = NULL, what = c("all", "cophenetic", "rss", "residuals", "dispersion", "evar", "sparseness", "sparseness.basis", "sparseness.coef", "silhouette", "silhouette.coef", "silhouette.basis", "silhouette.consensus"), na.rm = FALSE, xname = "x", yname = "y", xlab = "Factorization rank", ylab = "", main = "NMF rank survey", ...) } \arguments{ \item{x}{For \code{nmfEstimateRank} a target object to be estimated, in one of the format accepted by interface \code{\link{nmf}}. For \code{plot.NMF.rank} an object of class \code{NMF.rank} as returned by function \code{nmfEstimateRank}.} \item{range}{a \code{numeric} vector containing the ranks of factorization to try. Note that duplicates are removed and values are sorted in increasing order. The results are notably returned in this order.} \item{method}{A single NMF algorithm, in one of the format accepted by the function \code{\link{nmf}}.} \item{nrun}{a \code{numeric} giving the number of run to perform for each value in \code{range}.} \item{model}{model specification passed to each \code{nmf} call. In particular, when \code{x} is a formula, it is passed to argument \code{data} of \code{\link{nmfModel}} to determine the target matrix -- and fixed terms.} \item{verbose}{toggle verbosity. This parameter only affects the verbosity of the outer loop over the values in \code{range}. To print verbose (resp. debug) messages from each NMF run, one can use \code{.options='v'} (resp. \code{.options='d'}) that will be passed to the function \code{\link{nmf}}.} \item{stop}{logical flag for running the estimation process with fault tolerance. When \code{TRUE}, the whole execution will stop if any error is raised. When \code{FALSE} (default), the runs that raise an error will be skipped, and the execution will carry on. The summary measures for the runs with errors are set to NA values, and a warning is thrown.} \item{...}{For \code{nmfEstimateRank}, these are extra parameters passed to interface \code{nmf}. Note that the same parameters are used for each value of the rank. See \code{\link{nmf}}. For \code{plot.NMF.rank}, these are extra graphical parameter passed to the standard function \code{plot}. See \code{\link{plot}}.} \item{y}{reference object of class \code{NMF.rank}, as returned by function \code{nmfEstimateRank}. The measures contained in \code{y} are used and plotted as a reference. It is typically used to plot results obtained from randomized data. The associated curves are drawn in \emph{red} (and \emph{pink}), while those from \code{x} are drawn in \emph{blue} (and \emph{green}).} \item{what}{a \code{character} vector whose elements partially match one of the following item, which correspond to the measures computed by \code{\link{summary}} on each -- multi-run -- NMF result: \sQuote{all}, \sQuote{cophenetic}, \sQuote{rss}, \sQuote{residuals}, \sQuote{dispersion}, \sQuote{evar}, \sQuote{silhouette} (and more specific *.coef, *.basis, *.consensus), \sQuote{sparseness} (and more specific *.coef, *.basis). It specifies which measure must be plotted (\code{what='all'} plots all the measures).} \item{na.rm}{single logical that specifies if the rank for which the measures are NA values should be removed from the graph or not (default to \code{FALSE}). This is useful when plotting results which include NAs due to error during the estimation process. See argument \code{stop} for \code{nmfEstimateRank}.} \item{xname,yname}{legend labels for the curves corresponding to measures from \code{x} and \code{y} respectively} \item{xlab}{x-axis label} \item{ylab}{y-axis label} \item{main}{main title} } \value{ \code{nmfEstimateRank} returns a S3 object (i.e. a list) of class \code{NMF.rank} with the following elements: \item{measures }{a \code{data.frame} containing the quality measures for each rank of factorizations in \code{range}. Each row corresponds to a measure, each column to a rank. } \item{consensus }{ a \code{list} of consensus matrices, indexed by the rank of factorization (as a character string).} \item{fit }{ a \code{list} of the fits, indexed by the rank of factorization (as a character string).} } \description{ A critical parameter in NMF algorithms is the factorization rank \eqn{r}. It defines the number of basis effects used to approximate the target matrix. Function \code{nmfEstimateRank} helps in choosing an optimal rank by implementing simple approaches proposed in the literature. Note that from version \emph{0.7}, one can equivalently call the function \code{\link{nmf}} with a range of ranks. In the plot generated by \code{plot.NMF.rank}, each curve represents a summary measure over the range of ranks in the survey. The colours correspond to the type of data to which the measure is related: coefficient matrix, basis component matrix, best fit, or consensus matrix. } \details{ Given a NMF algorithm and the target matrix, a common way of estimating \eqn{r} is to try different values, compute some quality measures of the results, and choose the best value according to this quality criteria. See \cite{Brunet et al. (2004)} and \cite{Hutchins et al. (2008)}. The function \code{nmfEstimateRank} allows to perform this estimation procedure. It performs multiple NMF runs for a range of rank of factorization and, for each, returns a set of quality measures together with the associated consensus matrix. In order to avoid overfitting, it is recommended to run the same procedure on randomized data. The results on the original and the randomised data may be plotted on the same plots, using argument \code{y}. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } if( !isCHECK() ){ set.seed(123456) n <- 50; r <- 3; m <- 20 V <- syntheticNMF(n, r, m) # Use a seed that will be set before each first run res <- nmfEstimateRank(V, seq(2,5), method='brunet', nrun=10, seed=123456) # or equivalently res <- nmf(V, seq(2,5), method='brunet', nrun=10, seed=123456) # plot all the measures plot(res) # or only one: e.g. the cophenetic correlation coefficient plot(res, 'cophenetic') # run same estimation on randomized data rV <- randomize(V) rand <- nmfEstimateRank(rV, seq(2,5), method='brunet', nrun=10, seed=123456) plot(res, rand) } } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . Hutchins LN, Murphy SM, Singh P and Graber JH (2008). "Position-dependent motif characterization using non-negative matrix factorization." _Bioinformatics (Oxford, England)_, *24*(23), pp. 2684-90. ISSN 1367-4811, , . } NMF/man/NMF-deprecated.Rd0000644000176200001440000000034214333176413014456 0ustar liggesusers\name{NMF-deprecated} \alias{NMF-deprecated} \title{Deprecated Functions in the Package NMF} \arguments{ \item{object}{an R object} \item{...}{extra arguments} } \description{ Deprecated Functions in the Package NMF } NMF/man/setup.Rd0000644000176200001440000000476514333176413013115 0ustar liggesusers\name{setupBackend} \alias{setupBackend} \alias{setupLibPaths} \alias{setupRNG} \alias{setupSharedMemory} \alias{setupTempDirectory} \title{Computational Setup Functions} \usage{ setupBackend(spec, backend, optional = FALSE, verbose = FALSE) setupSharedMemory(verbose) setupTempDirectory(verbose) setupLibPaths(pkg = "NMF", verbose = FALSE) setupRNG(seed, n, verbose = FALSE) } \arguments{ \item{spec}{target parallel specification: either \code{TRUE} or \code{FALSE}, or a single numeric value that specifies the number of cores to setup.} \item{backend}{value from argument \code{.pbackend} of \code{nmf}.} \item{optional}{a logical that indicates if the specification must be fully satisfied, throwing an error if it is not, or if one can switch back to sequential, only outputting a verbose message.} \item{verbose}{logical or integer level of verbosity for message outputs.} \item{pkg}{package name whose path should be exported the workers.} \item{seed}{initial RNG seed specification} \item{n}{number of RNG seeds to generate} } \value{ Returns \code{FALSE} if no foreach backend is to be used, \code{NA} if the currently registered backend is to be used, or, if this function call registered a new backend, the previously registered backend as a \code{foreach} object, so that it can be restored after the computation is over. } \description{ Functions used internally to setup the computational environment. \code{setupBackend} sets up a foreach backend given some specifications. \code{setupSharedMemory} checks if one can use the packages \emph{bigmemory} and \emph{sychronicity} to speed-up parallel computations when not keeping all the fits. When both these packages are available, only one result per host is written on disk, with its achieved deviance stored in shared memory, that is accessible to all cores on a same host. It returns \code{TRUE} if both packages are available and NMF option \code{'shared'} is toggled on. \code{setupTempDirectory} creates a temporary directory to store the best fits computed on each host. It ensures each worker process has access to it. \code{setupLibPaths} add the path to the NMF package to each workers' libPaths. \code{setupRNG} sets the RNG for use by the function nmf. It returns the old RNG as an rstream object or the result of set.seed if the RNG is not changed due to one of the following reason: - the settings are not compatible with rstream } \keyword{internals} NMF/man/algorithmic.Rd0000644000176200001440000003217514333176413014253 0ustar liggesusers\docType{methods} \name{algorithmic-NMF} \alias{algorithm} \alias{algorithm<-} \alias{algorithmic-NMF} \alias{algorithm<--methods} \alias{algorithm-methods} \alias{algorithm<-,NMFfit,ANY-method} \alias{algorithm,NMFfit-method} \alias{algorithm,NMFfitXn-method} \alias{algorithm<-,NMFSeed,function-method} \alias{algorithm,NMFSeed-method} \alias{algorithm<-,NMFStrategyFunction,function-method} \alias{algorithm,NMFStrategyFunction-method} \alias{compare} \alias{compare-methods} \alias{compare,NMFfitXn-method} \alias{logs} \alias{logs,ANY-method} \alias{logs-methods} \alias{modelname} \alias{modelname,ANY-method} \alias{modelname-methods} \alias{modelname,NMFfit-method} \alias{modelname,NMFfitXn-method} \alias{modelname,NMFStrategy-method} \alias{niter} \alias{niter<-} \alias{niter<--methods} \alias{niter-methods} \alias{niter,NMFfit-method} \alias{niter<-,NMFfit,numeric-method} \alias{nrun} \alias{nrun,ANY-method} \alias{nrun-methods} \alias{nrun,NMFfit-method} \alias{nrun,NMFfitX1-method} \alias{nrun,NMFfitX-method} \alias{nrun,NMFfitXn-method} \alias{objective} \alias{objective<-} \alias{objective<--methods} \alias{objective-methods} \alias{objective<-,NMFfit,ANY-method} \alias{run} \alias{run-methods} \alias{runtime} \alias{runtime.all} \alias{runtime.all-methods} \alias{runtime.all,NMFfit-method} \alias{runtime.all,NMFfitX-method} \alias{runtime-methods} \alias{runtime,NMFfit-method} \alias{seeding} \alias{seeding<-} \alias{seeding<--methods} \alias{seeding-methods} \alias{seeding<-,NMFfit-method} \alias{seeding,NMFfit-method} \alias{seeding,NMFfitXn-method} \alias{seqtime} \alias{seqtime-methods} \alias{seqtime,NMFfitXn-method} \alias{seqtime,NMFList-method} \title{Generic Interface for Algorithms} \usage{ algorithm(object, ...) algorithm(object, ...)<-value seeding(object, ...) seeding(object, ...)<-value niter(object, ...) niter(object, ...)<-value nrun(object, ...) objective(object, ...) objective(object, ...)<-value runtime(object, ...) runtime.all(object, ...) seqtime(object, ...) modelname(object, ...) run(object, y, x, ...) logs(object, ...) compare(object, ...) } \arguments{ \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} \item{value}{replacement value} \item{...}{extra arguments to allow extension} \item{y}{data object, e.g. a target matrix} \item{x}{a model object used as a starting point by the algorithm, e.g. a non-empty NMF model.} } \description{ The functions documented here are S4 generics that define an general interface for -- optimisation -- algorithms. This interface builds upon the broad definition of an algorithm as a workhorse function to which is associated auxiliary objects such as an underlying model or an objective function that measures the adequation of the model with observed data. It aims at complementing the interface provided by the \code{\link{stats}} package. } \details{ \code{algorithm} and \code{algorithm<-} get/set an object that describes the algorithm used to compute another object, or with which it is associated. It may be a simple character string that gives the algorithm's names, or an object that includes the algorithm's definition itself (e.g. an \code{\link{NMFStrategy}} object). \code{seeding} get/set the seeding method used to initialise the computation of an object, i.e. usually the function that sets the starting point of an algorithm. \code{niter} and \code{niter<-} get/set the number of iterations performed to compute an object. The function \code{niter<-} would usually be called just before returning the result of an algorithm, when putting together data about the fit. \code{nrun} returns the number of times the algorithm has been run to compute an object. Usually this will be 1, but may be be more if the algorithm involves multiple starting points. \code{objective} and \code{objective<-} get/set the objective function associated with an object. Some methods for \code{objective} may also compute the objective value with respect to some target/observed data. \code{runtime} returns the CPU time required to compute an object. This would generally be an object of class \code{\link[=proc.time]{proc_time}}. \code{runtime.all} returns the CPU time required to compute a collection of objects, e.g. a sequence of independent fits. \code{seqtime} returns the sequential CPU time -- that would be -- required to compute a collection of objects. It would differ from \code{runtime.all} if the computations were performed in parallel. \code{modelname} returns a the type of model associated with an object. \code{run} calls the workhorse function that actually implements a strategy/algorithm, and run it on some data object. \code{logs} returns the log messages output during the computation of an object. \code{compare} compares objects obtained from running separate algorithms. } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFfit")}: Returns the name of the algorithm that fitted the NMF model \code{object}. } \item{algorithm}{\code{signature(object = "NMFList")}: Returns the method names used to compute the NMF fits in the list. It returns \code{NULL} if the list is empty. See \code{\link{algorithm,NMFList-method}} for more details. } \item{algorithm}{\code{signature(object = "NMFfitXn")}: Returns the name of the common NMF algorithm used to compute all fits stored in \code{object} Since all fits are computed with the same algorithm, this method returns the name of algorithm that computed the first fit. It returns \code{NULL} if the object is empty. } \item{algorithm}{\code{signature(object = "NMFSeed")}: Returns the workhorse function of the seeding method described by \code{object}. } \item{algorithm}{\code{signature(object = "NMFStrategyFunction")}: Returns the single R function that implements the NMF algorithm -- as stored in slot \code{algorithm}. } \item{algorithm<-}{\code{signature(object = "NMFSeed", value = "function")}: Sets the workhorse function of the seeding method described by \code{object}. } \item{algorithm<-}{\code{signature(object = "NMFStrategyFunction", value = "function")}: Sets the function that implements the NMF algorithm, stored in slot \code{algorithm}. } \item{compare}{\code{signature(object = "NMFfitXn")}: Compares the fits obtained by separate runs of NMF, in a single call to \code{\link{nmf}}. } \item{logs}{\code{signature(object = "ANY")}: Default method that returns the value of attribute/slot \code{'logs'} or, if this latter does not exists, the value of element \code{'logs'} if \code{object} is a \code{list}. It returns \code{NULL} if no logging data was found. } \item{modelname}{\code{signature(object = "ANY")}: Default method which returns the class name(s) of \code{object}. This should work for objects representing models on their own. For NMF objects, this is the type of NMF model, that corresponds to the name of the S4 sub-class of \code{\linkS4class{NMF}}, inherited by \code{object}. } \item{modelname}{\code{signature(object = "NMFfit")}: Returns the type of a fitted NMF model. It is a shortcut for \code{modelname(fit(object)}. } \item{modelname}{\code{signature(object = "NMFfitXn")}: Returns the common type NMF model of all fits stored in \code{object} Since all fits are from the same NMF model, this method returns the model type of the first fit. It returns \code{NULL} if the object is empty. } \item{modelname}{\code{signature(object = "NMFStrategy")}: Returns the model(s) that an NMF algorithm can fit. } \item{niter}{\code{signature(object = "NMFfit")}: Returns the number of iteration performed to fit an NMF model, typically with function \code{\link{nmf}}. Currently this data is stored in slot \code{'extra'}, but this might change in the future. } \item{niter<-}{\code{signature(object = "NMFfit", value = "numeric")}: Sets the number of iteration performed to fit an NMF model. This function is used internally by the function \code{\link{nmf}}. It is not meant to be called by the user, except when developing new NMF algorithms implemented as single function, to set the number of iterations performed by the algorithm on the seed, before returning it (see \code{\linkS4class{NMFStrategyFunction}}). } \item{nrun}{\code{signature(object = "ANY")}: Default method that returns the value of attribute \sQuote{nrun}. Such an attribute my be attached to objects to keep track of data about the parent fit object (e.g. by method \code{\link{consensus}}), which can be used by subsequent function calls such as plot functions (e.g. see \code{\link{consensusmap}}). This method returns \code{NULL} if no suitable data was found. } \item{nrun}{\code{signature(object = "NMFfitX")}: Returns the number of NMF runs performed to create \code{object}. It is a pure virtual method defined to ensure \code{nrun} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. Note that because the \code{\link{nmf}} function allows to run the NMF computation keeping only the best fit, \code{nrun} may return a value greater than one, while only the result of the best run is stored in the object (cf. option \code{'k'} in method \code{\link{nmf}}). } \item{nrun}{\code{signature(object = "NMFfit")}: This method always returns 1, since an \code{NMFfit} object is obtained from a single NMF run. } \item{nrun}{\code{signature(object = "NMFfitX1")}: Returns the number of NMF runs performed, amongst which \code{object} was selected as the best fit. } \item{nrun}{\code{signature(object = "NMFfitXn")}: Returns the number of runs performed to compute the fits stored in the list (i.e. the length of the list itself). } \item{objective}{\code{signature(object = "NMFfit")}: Returns the objective function associated with the algorithm that computed the fitted NMF model \code{object}, or the objective value with respect to a given target matrix \code{y} if it is supplied. See \code{\link{objective,NMFfit-method}} for more details. } \item{runtime}{\code{signature(object = "NMFfit")}: Returns the CPU time required to compute a single NMF fit. } \item{runtime}{\code{signature(object = "NMFList")}: Returns the CPU time required to compute all NMF fits in the list. It returns \code{NULL} if the list is empty. If no timing data are available, the sequential time is returned. See \code{\link{runtime,NMFList-method}} for more details. } \item{runtime.all}{\code{signature(object = "NMFfit")}: Identical to \code{runtime}, since their is a single fit. } \item{runtime.all}{\code{signature(object = "NMFfitX")}: Returns the CPU time required to compute all the NMF runs. It returns \code{NULL} if no CPU data is available. } \item{runtime.all}{\code{signature(object = "NMFfitXn")}: If no time data is available from in slot \sQuote{runtime.all} and argument \code{null=TRUE}, then the sequential time as computed by \code{\link{seqtime}} is returned, and a warning is thrown unless \code{warning=FALSE}. See \code{\link{runtime.all,NMFfitXn-method}} for more details. } \item{seeding}{\code{signature(object = "NMFfit")}: Returns the name of the seeding method that generated the starting point for the NMF algorithm that fitted the NMF model \code{object}. } \item{seeding}{\code{signature(object = "NMFfitXn")}: Returns the name of the common seeding method used the computation of all fits stored in \code{object} Since all fits are seeded using the same method, this method returns the name of the seeding method used for the first fit. It returns \code{NULL} if the object is empty. } \item{seqtime}{\code{signature(object = "NMFList")}: Returns the CPU time that would be required to sequentially compute all NMF fits stored in \code{object}. This method calls the function \code{runtime} on each fit and sum up the results. It returns \code{NULL} on an empty object. } \item{seqtime}{\code{signature(object = "NMFfitXn")}: Returns the CPU time that would be required to sequentially compute all NMF fits stored in \code{object}. This method calls the function \code{runtime} on each fit and sum up the results. It returns \code{NULL} on an empty object. } } } \section{Interface fo NMF algorithms}{ This interface is implemented for NMF algorithms by the classes \code{\link{NMFfit}}, \code{\link{NMFfitX}} and \code{\link{NMFStrategy}}, and their respective sub-classes. The examples given in this documentation page are mainly based on this implementation. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # modelname,ANY-method #---------- # get the type of an NMF model modelname(nmfModel(3)) modelname(nmfModel(3, model='NMFns')) modelname(nmfModel(3, model='NMFOffset')) #---------- # modelname,NMFStrategy-method #---------- # get the type of model(s) associated with an NMF algorithm modelname( nmfAlgorithm('brunet') ) modelname( nmfAlgorithm('nsNMF') ) modelname( nmfAlgorithm('offset') ) } \keyword{methods} NMF/man/cutdendro.Rd0000644000176200001440000000042214333176413013726 0ustar liggesusers\name{cutdendro} \alias{cutdendro} \title{Fade Out the Upper Branches from a Dendrogram} \usage{ cutdendro(x, n) } \arguments{ \item{x}{a dendrogram} \item{n}{the number of groups} } \description{ Fade Out the Upper Branches from a Dendrogram } \keyword{internal} NMF/man/lsNMF-nmf.Rd0000644000176200001440000000566614333176413013513 0ustar liggesusers\name{nmf_update.lsnmf} \alias{lsNMF-nmf} \alias{nmfAlgorithm.lsNMF} \alias{nmf_update.lsnmf} \alias{wrss} \title{Multiplicative Updates for LS-NMF} \usage{ nmf_update.lsnmf(i, X, object, weight, eps = 10^-9, ...) wrss(object, X, weight) nmfAlgorithm.lsNMF(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, weight, eps = 10^-9, stationary.th = .Machine$double.eps, check.interval = 5 * check.niter, check.niter = 10L) } \arguments{ \item{i}{current iteration} \item{X}{target matrix} \item{object}{current NMF model} \item{weight}{value for \eqn{\Sigma}{S}, i.e. the weights that are applied to each entry in \code{X} by \code{X * weight} (= entry wise product). Weights are usually specified as a matrix of the same dimension as \code{X} (e.g. uncertainty estimates for each measurement), but may also be passed as a vector, in which case the standard rules for entry wise product between matrices and vectors apply (e.g. recylcing elements).} \item{eps}{small number passed to the standard euclidean-based NMF updates (see \code{\link{nmf_update.euclidean}}).} \item{...}{extra arguments (not used)} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{stationary.th}{maximum absolute value of the gradient, for the objective function to be considered stationary.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} \item{check.niter}{number of successive iteration used to compute the stationnary criterion.} } \value{ updated object \code{object} } \description{ Implementation of the updates for the LS-NMF algorithm from \cite{Wang et al. (2006)}. \code{wrss} implements the objective function used by the LS-NMF algorithm. } \references{ Wang G, Kossenkov AV and Ochs MF (2006). "LS-NMF: a modified non-negative matrix factorization algorithm utilizing uncertainty estimates." _BMC bioinformatics_, *7*, pp. 175. ISSN 1471-2105, , . } NMF/man/t.NMF.Rd0000644000176200001440000000164014333176413012624 0ustar liggesusers\name{t.NMF} \alias{t.NMF} \title{Transformation NMF Model Objects} \usage{ \method{t}{NMF} (x) } \arguments{ \item{x}{NMF model object.} } \description{ \code{t} transpose an NMF model, by transposing and swapping its basis and coefficient matrices: \eqn{t([W,H]) = [t(H), t(W)]}. } \details{ The function \code{t} is a generic defined in the \pkg{base} package. The method \code{t.NMF} defines the trasnformation for the general NMF interface. This method may need to be overloaded for NMF models, whose structure requires specific handling. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } x <- rnmf(3, 100, 20) x # transpose y <- t(x) y # factors are swapped-transposed stopifnot( identical(basis(y), t(coef(x))) ) stopifnot( identical(coef(y), t(basis(x))) ) } \seealso{ Other transforms: \code{\link{nneg}}, \code{\link{posneg}}, \code{\link{rposneg}} } NMF/man/options.Rd0000644000176200001440000001074114333201464013432 0ustar liggesusers\name{options-NMF} \alias{nmf.getOption} \alias{nmf.options} \alias{nmf.printOptions} \alias{nmf.resetOptions} \alias{options-NMF} \title{NMF Package Specific Options} \usage{ nmf.options(...) nmf.getOption(x, default = NULL) nmf.resetOptions(..., ALL = FALSE) nmf.printOptions() } \arguments{ \item{...}{option specifications. For \code{nmf.options} this can be named arguments or a single unnamed argument that is a named list (see \code{\link{options}}. For \code{nmf.resetOptions}, this must be the names of the options to reset.} \item{ALL}{logical that indicates if options that are not part of the default set of options should be removed.} \item{x}{a character string holding an option name.} \item{default}{if the specified option is not set in the options list, this value is returned. This facilitates retrieving an option and checking whether it is set and setting it separately if not.} } \description{ NMF Package Specific Options \code{nmf.options} sets/get single or multiple options, that are specific to the NMF package. It behaves in the same way as \code{\link[base]{options}}. \code{nmf.getOption} returns the value of a single option, that is specific to the NMF package. It behaves in the same way as \code{\link[base]{getOption}}. \code{nmf.resetOptions} reset all NMF specific options to their default values. \code{nmf.printOptions} prints all NMF specific options along with their default values, in a relatively compact way. } \section{Available options}{ \describe{ \item{cores}{Default number of cores to use to perform parallel NMF computations. Note that this option is effectively used only if the global option \code{'cores'} is not set. Moreover, the number of cores can also be set at runtime, in the call to \code{\link{nmf}}, via arguments \code{.pbackend} or \code{.options} (see \code{\link{nmf}} for more details).} \item{default.algorithm}{Default NMF algorithm used by the \code{nmf} function when argument \code{method} is missing. The value should the key of one of the registered NMF algorithms or a valid specification of an NMF algorithm. See \code{?nmfAlgorithm}.} \item{default.seed}{Default seeding method used by the \code{nmf} function when argument \code{seed} is missing. The value should the key of one of the registered seeding methods or a vallid specification of a seeding method. See \code{?nmfSeed}.} \item{track}{Toggle default residual tracking. When \code{TRUE}, the \code{nmf} function compute and store the residual track in the result -- if not otherwise specified in argument \code{.options}. Note that tracking may significantly slow down the computations.} \item{track.interval}{Number of iterations between two points in the residual track. This option is relevant only when residual tracking is enabled. See \code{?nmf}.} \item{error.track}{this is a symbolic link to option \code{track} for backward compatibility.} \item{pbackend}{Default loop/parallel foreach backend used by the \code{nmf} function when argument \code{.pbackend} is missing. Currently the following values are supported: \code{'par'} for multicore, \code{'seq'} for sequential, \code{NA} for standard \code{sapply} (i.e. do not use a foreach loop), \code{NULL} for using the currently registered foreach backend.} \item{parallel.backend}{this is a symbolic link to option \code{pbackend} for backward compatibility.} \item{gc}{Interval/frequency (in number of runs) at which garbage collection is performed.} \item{verbose}{Default level of verbosity.} \item{debug}{Toogles debug mode. In this mode the console output may be very -- very -- messy, and is aimed at debugging only.} \item{maxIter}{ Default maximum number of iteration to use (default NULL). This option is for internal/technical usage only, to globally speed up examples or tests of NMF algorithms. To be used with care at one's own risk... It is documented here so that advanced users are aware of its existence, and can avoid possible conflict with their own custom options. } } % end description } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # show all NMF specific options nmf.printOptions() # get some options nmf.getOption('verbose') nmf.getOption('pbackend') # set new values nmf.options(verbose=TRUE) nmf.options(pbackend='mc', default.algorithm='lee') nmf.printOptions() # reset to default nmf.resetOptions() nmf.printOptions() } NMF/man/match_atrack.Rd0000644000176200001440000000056514333176413014370 0ustar liggesusers\name{match_atrack} \alias{match_atrack} \title{Extending Annotation Vectors} \usage{ match_atrack(x, data = NULL) } \arguments{ \item{x}{annotation vector} \item{data}{reference data} } \value{ a vector of the same type as \code{x} } \description{ Extends a vector used as an annotation track to match the number of rows and the row names of a given data. } NMF/man/registry-algorithm.Rd0000644000176200001440000000322114333201525015564 0ustar liggesusers\name{methods-NMF} \alias{existsNMFMethod} \alias{getNMFMethod} \alias{methods-NMF} \alias{removeNMFMethod} \alias{selectNMFMethod} \title{Registry for NMF Algorithms} \usage{ selectNMFMethod(name, model, load = FALSE, exact = FALSE, all = FALSE, quiet = FALSE) getNMFMethod(...) existsNMFMethod(name, exact = TRUE) removeNMFMethod(name, ...) } \arguments{ \item{name}{name of a registered NMF algorithm} \item{model}{class name of an NMF model, i.e. a class that inherits from class \code{\linkS4class{NMF}}.} \item{load}{a logical that indicates if the selected algorithms should be loaded into \code{NMFStrategy} objects} \item{all}{a logical that indicates if all algorithms that can fit \code{model} should be returned or only the default or first found.} \item{quiet}{a logical that indicates if the operation should be performed quietly, without throwing errors or warnings.} \item{...}{extra arguments passed to \code{pkgreg_fetch} or \code{pkgreg_remove}.} \item{exact}{a logical that indicates if the access key should be matched exactly (\code{TRUE}) or partially (\code{FALSE}).} } \value{ \code{selectNMFMethod} returns a character vector or \code{NMFStrategy} objects, or NULL if no suitable algorithm was found. } \description{ Registry for NMF Algorithms \code{selectNMFMethod} tries to select an appropriate NMF algorithm that is able to fit a given the NMF model. \code{getNMFMethod} retrieves NMF algorithm objects from the registry. \code{existsNMFMethod} tells if an NMF algorithm is registered under the \code{removeNMFMethod} removes an NMF algorithm from the registry. } NMF/man/show-commaNMFList-method.Rd0000644000176200001440000000045714333176413016474 0ustar liggesusers\docType{methods} \name{show,NMFList-method} \alias{show,NMFList-method} \title{Show method for objects of class \code{NMFList}} \usage{ \S4method{show}{NMFList}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFList} } \keyword{methods} NMF/man/bioc.Rd0000644000176200001440000000247114333176413012661 0ustar liggesusers\name{bioc-NMF} \alias{.atrack,ExpressionSet-method} \alias{bioc-NMF} \alias{featureNames,NMFfitX-method} \alias{featureNames<-,NMF-method} \alias{featureNames,NMF-method} \alias{metagenes} \alias{metagenes<-} \alias{metaprofiles} \alias{metaprofiles<-} \alias{nmeta} \alias{nmf,ExpressionSet,ANY,ANY-method} \alias{nmf,matrix,ExpressionSet,ANY-method} \alias{nmfModel,ANY,ExpressionSet-method} \alias{nmfModel,ExpressionSet,ANY-method} \alias{nneg,ExpressionSet-method} \alias{rnmf,ANY,ExpressionSet-method} \alias{rposneg,ExpressionSet-method} \alias{run,NMFStrategy,ExpressionSet,ANY-method} \alias{sampleNames<-,NMF,ANY-method} \alias{sampleNames,NMFfitX-method} \alias{sampleNames,NMF-method} \alias{seed,ExpressionSet,ANY,ANY-method} \title{Specific NMF Layer for Bioconductor} \description{ The package NMF provides an optional layer for working with common objects and functions defined in the Bioconductor platform. } \details{ It provides: \itemize{ \item computation functions that support \code{ExpressionSet} objects as inputs. \item aliases and methods for generic functions defined and widely used by Bioconductor base packages. \item specialised visualisation methods that adapt the titles and legend using bioinformatics terminology. \item functions to link the results with annotations, etc... } } NMF/man/KL-nmf.Rd0000644000176200001440000001327214406046517013034 0ustar liggesusers\name{nmf_update.brunet_R} \alias{brunet-nmf} \alias{brunet_R-nmf} \alias{KL-nmf} \alias{nmfAlgorithm.brunet} \alias{nmfAlgorithm.brunet_R} \alias{nmfAlgorithm.KL} \alias{nmf_update.brunet} \alias{nmf_update.brunet_R} \title{NMF Algorithm/Updates for Kullback-Leibler Divergence} \source{ Original license terms: This software and its documentation are copyright 2004 by the Broad Institute/Massachusetts Institute of Technology. All rights are reserved. This software is supplied without any warranty or guaranteed support whatsoever. Neither the Broad Institute nor MIT can not be responsible for its use, misuse, or functionality. } \usage{ nmf_update.brunet_R(i, v, x, eps = .Machine$double.eps, ...) nmf_update.brunet(i, v, x, copy = FALSE, eps = .Machine$double.eps, ...) nmfAlgorithm.brunet_R(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, eps = .Machine$double.eps, stopconv = 40, check.interval = 10) nmfAlgorithm.brunet(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, copy = FALSE, eps = .Machine$double.eps, stopconv = 40, check.interval = 10) nmfAlgorithm.KL(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, copy = FALSE, eps = .Machine$double.eps, stationary.th = .Machine$double.eps, check.interval = 5 * check.niter, check.niter = 10L) } \arguments{ \item{i}{current iteration number.} \item{v}{target matrix.} \item{x}{current NMF model, as an \code{\linkS4class{NMF}} object.} \item{eps}{small numeric value used to ensure numeric stability, by shifting up entries from zero to this fixed value.} \item{...}{extra arguments. These are generally not used and present only to allow other arguments from the main call to be passed to the initialisation and stopping criterion functions (slots \code{onInit} and \code{Stop} respectively).} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{stopconv}{number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} \item{stationary.th}{maximum absolute value of the gradient, for the objective function to be considered stationary.} \item{check.niter}{number of successive iteration used to compute the stationnary criterion.} } \description{ The built-in NMF algorithms described here minimise the Kullback-Leibler divergence (KL) between an NMF model and a target matrix. They use the updates for the basis and coefficient matrices (\eqn{W} and \eqn{H}) defined by \cite{Brunet et al. (2004)}, which are essentially those from \cite{Lee et al. (2001)}, with an stabilisation step that shift up all entries from zero every 10 iterations, to a very small positive value. \code{nmf_update.brunet} implements in C++ an optimised version of the single update step. Algorithms \sQuote{brunet} and \sQuote{.R#brunet} provide the complete NMF algorithm from \cite{Brunet et al. (2004)}, using the C++-optimised and pure R updates \code{\link{nmf_update.brunet}} and \code{\link{nmf_update.brunet_R}} respectively. Algorithm \sQuote{KL} provides an NMF algorithm based on the C++-optimised version of the updates from \cite{Brunet et al. (2004)}, which uses the stationarity of the objective value as a stopping criterion \code{\link{nmf.stop.stationary}}, instead of the stationarity of the connectivity matrix \code{\link{nmf.stop.connectivity}} as used by \sQuote{brunet}. } \details{ \code{nmf_update.brunet_R} implements in pure R a single update step, i.e. it updates both matrices. } \author{ Original implementation in MATLAB: Jean-Philippe Brunet \email{brunet@broad.mit.edu} Port to R and optimisation in C++: Renaud Gaujoux } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/profplot.Rd0000644000176200001440000001001614406060005013572 0ustar liggesusers\name{profplot} \alias{profplot} \alias{profplot.default} \title{Plotting Expression Profiles} \usage{ profplot(x, ...) \method{profplot}{default} (x, y, scale = c("none", "max", "c1"), match.names = TRUE, legend = TRUE, confint = TRUE, Colv, labels, annotation, ..., add = FALSE) } \arguments{ \item{x}{a matrix or an NMF object from which is extracted the mixture coefficient matrix. It is extracted from the best fit if \code{x} is the results from multiple NMF runs.} \item{y}{a matrix or an NMF object from which is extracted the mixture coefficient matrix. It is extracted from the best fit if \code{y} is the results from multiple NMF runs.} \item{scale}{specifies how the data should be scaled before plotting. If \code{'none'} or \code{NA}, then no scaling is applied and the "raw" data is plotted. If \code{TRUE} or \code{'max'} then each row of both matrices are normalised with their respective maximum values. If \code{'c1'}, then each column of both matrix is scaled into proportions (i.e. to sum up to one). Default is \code{'none'}.} \item{match.names}{a logical that indicates if the profiles in \code{y} should be subset and/or re-ordered to match the profile names in \code{x} (i.e. the rownames). This is attempted only when both \code{x} and \code{y} have names.} \item{legend}{a logical that specifies whether drawing the legend or not, or coordinates specifications passed to argument \code{x} of \code{\link{legend}}, that specifies the position of the legend.} \item{confint}{logical that indicates if confidence intervals for the R-squared should be shown in legend.} \item{Colv}{specifies the way the columns of \code{x} are ordered before plotting. It is used only when \code{y} is missing. It can be: \itemize{ \item a single numeric value, specifying the index of a row of \code{x}, that is used to order the columns by \code{x[, order(x[abs(Colv),])]}. Decreasing order is specified with a negative index. \item an integer vector directly specifying the order itself, in which case the columns are ordered by \code{x[, Colv]} \item a factor used to order the columns by \code{x[, order(Colv)]} and as argument \code{annotation} if this latter is missing or not \code{NA}. \item any other object with a suitable \code{order} method. The columns are by \code{x[, order(Colv)]} }} \item{labels}{a character vector containing labels for each sample (i.e. each column of \code{x}). These are used for labelling the x-axis.} \item{annotation}{a factor annotating each sample (i.e. each column of \code{x}). If not missing, a coloured raw is plotted under the x-axis and annotates each sample accordingly. If argument \code{Colv} is a factor, then it is used to annotate the plot, unless \code{annotation=NA}.} \item{...}{graphical parameters passed to \code{\link{matplot}} or \code{\link{matpoints}}.} \item{add}{logical that indicates if the plot should be added as points to a previous plot} } \description{ Plotting Expression Profiles When using NMF for clustering in particular, one looks for strong associations between the basis and a priori known groups of samples. Plotting the profiles may highlight such patterns. } \details{ The function can also be used to compare the profiles from two NMF models or mixture coefficient matrices. In this case, it draws a scatter plot of the paired profiles. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # create a random target matrix v <- rmatrix(30, 10) # fit a single NMF model res <- nmf(v, 3) profplot(res) # fit a multi-run NMF model res2 <- nmf(v, 3, nrun=2) # ordering according to first profile profplot(res2, Colv=1) # increasing # draw a profile correlation plot: this show how the basis components are # returned in an unpredictable order profplot(res, res2) # looking at all the correlations allow to order the components in a "common" order profcor(res, res2) } \seealso{ \code{\link{profcor}} } \keyword{aplot} NMF/man/subset-NMF.Rd0000644000176200001440000001155514333176413013673 0ustar liggesusers\docType{methods} \name{[,NMF-method} \alias{[,NMF-method} \title{Sub-setting NMF Objects} \usage{ \S4method{[}{NMF}(x, i, j, ..., drop = FALSE) } \arguments{ \item{i}{index used to subset on the \strong{rows} of the basis matrix (i.e. the features). It can be a \code{numeric}, \code{logical}, or \code{character} vector (whose elements must match the row names of \code{x}). In the case of a \code{logical} vector the entries are recycled if necessary.} \item{j}{index used to subset on the \strong{columns} of the mixture coefficient matrix (i.e. the samples). It can be a \code{numeric}, \code{logical}, or \code{character} vector (whose elements must match the column names of \code{x}). In the case of a \code{logical} vector the entries are recycled if necessary.} \item{...}{used to specify a third index to subset on the basis components, i.e. on both the columns and rows of the basis matrix and mixture coefficient respectively. It can be a \code{numeric}, \code{logical}, or \code{character} vector (whose elements must match the basis names of \code{x}). In the case of a \code{logical} vector the entries are recycled if necessary. Note that only the first extra subset index is used. A warning is thrown if more than one extra argument is passed in \code{...}.} \item{drop}{single \code{logical} value used to drop the \code{NMF-class} wrapping and only return subsets of one of the factor matrices (see \emph{Details})} \item{x}{ object from which to extract element(s) or in which to replace element(s). } } \description{ This method provides a convenient way of sub-setting objects of class \code{NMF}, using a matrix-like syntax. It allows to consistently subset one or both matrix factors in the NMF model, as well as retrieving part of the basis components or part of the mixture coefficients with a reduced amount of code. } \details{ The returned value depends on the number of subset index passed and the value of argument \code{drop}: \itemize{ \item No index as in \code{x[]} or \code{x[,]}: the value is the object \code{x} unchanged. \item One single index as in \code{x[i]}: the value is the complete NMF model composed of the selected basis components, subset by \code{i}, except if argument \code{drop=TRUE}, or if it is missing and \code{i} is of length 1. Then only the basis matrix is returned with dropped dimensions: \code{x[i, drop=TRUE]} <=> \code{drop(basis(x)[, i])}. This means for example that \code{x[1L]} is the first basis vector, and \code{x[1:3, drop = TRUE]} is the matrix composed of the 3 first basis vectors -- in columns. Note that in version <= 0.18.3, the call \code{x[i, drop = TRUE.or.FALSE]} was equivalent to \code{basis(x)[, i, drop=TRUE.or.FALSE]}. \item More than one index with \code{drop=FALSE} (default) as in \code{x[i,j]}, \code{x[i,]}, \code{x[,j]}, \code{x[i,j,k]}, \code{x[i,,k]}, etc...: the value is a \code{NMF} object whose basis and/or mixture coefficient matrices have been subset accordingly. The third index \code{k} affects simultaneously the columns of the basis matrix AND the rows of the mixture coefficient matrix. In this case argument \code{drop} is not used. \item More than one index with \code{drop=TRUE} and \code{i} xor \code{j} missing: the value returned is the matrix that is the more affected by the subset index. That is that \code{x[i, , drop=TRUE]} and \code{x[i, , k, drop=TRUE]} return the basis matrix subset by \code{[i,]} and \code{[i,k]} respectively, while \code{x[, j, drop=TRUE]} and \code{x[, j, k, drop=TRUE]} return the mixture coefficient matrix subset by \code{[,j]} and \code{[k,j]} respectively. } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # create a dummy NMF object that highlight the different way of subsetting a <- nmfModel(W=outer(seq(1,5),10^(0:2)), H=outer(10^(0:2),seq(-1,-10))) basisnames(a) <- paste('b', 1:nbasis(a), sep='') rownames(a) <- paste('f', 1:nrow(a), sep='') colnames(a) <- paste('s', 1:ncol(a), sep='') # or alternatively: # dimnames(a) <- list( features=paste('f', 1:nrow(a), sep='') # , samples=paste('s', 1:ncol(a), sep='') # , basis=paste('b', 1:nbasis(a)) ) # look at the resulting NMF object a basis(a) coef(a) # extract basis components a[1] a[1, drop=FALSE] # not dropping matrix dimension a[2:3] # subset on the features a[1,] a[2:4,] # dropping the NMF-class wrapping => return subset basis matrix a[2:4,, drop=TRUE] # subset on the samples a[,1] a[,2:4] # dropping the NMF-class wrapping => return subset coef matrix a[,2:4, drop=TRUE] # subset on the basis => subsets simultaneously basis and coef matrix a[,,1] a[,,2:3] a[4:5,,2:3] a[4:5,,2:3, drop=TRUE] # return subset basis matrix a[,4:5,2:3, drop=TRUE] # return subset coef matrix # 'drop' has no effect here a[,,2:3, drop=TRUE] } \keyword{methods} NMF/man/lverbose.Rd0000644000176200001440000000040214333176413013556 0ustar liggesusers\name{lverbose} \alias{lverbose} \title{Internal verbosity option} \usage{ lverbose(val) } \arguments{ \item{val}{logical that sets the verbosity level.} } \value{ the old verbose level } \description{ Internal verbosity option } \keyword{internal} NMF/man/atrack.Rd0000644000176200001440000001013414333176413013205 0ustar liggesusers\docType{methods} \name{.atrack} \alias{adata} \alias{alength} \alias{amargin} \alias{anames} \alias{annotationTrack} \alias{atrack} \alias{.atrack} \alias{.atrack,ANY-method} \alias{.atrack,character-method} \alias{.atrack,data.frame-method} \alias{.atrack,matrix-method} \alias{.atrack-methods} \alias{is.atrack} \title{Annotation Tracks} \usage{ .atrack(object, ...) is.atrack(x) adata(x, value, ...) amargin(x, value) anames(x, default.margin) alength(x, default.margin) \S4method{.atrack}{ANY}(object, data = NULL, ...) atrack(..., order = NULL, enforceNames = FALSE, .SPECIAL = NA, .DATA = NULL, .CACHE = NULL) annotationTrack(x = list()) } \arguments{ \item{object}{an object from which is extracted annotation tracks} \item{...}{extra arguments to allow extensions and passed to the next method call. For \code{atrack}, arguments in \code{...} are concatenated into a single \code{annotationTrack} object.} \item{x}{an R object} \item{value}{replacement value for the complete annotation data list} \item{default.margin}{margin to use if no margin data is stored in the \code{x}.} \item{data}{object used to extend the annotation track within a given data context. It is typically a matrix-like object, against which annotation specifications are matched using \code{\link{match_atrack}}.} \item{order}{an integer vector that indicates the order of the annotation tracks in the result list} \item{enforceNames}{logical that indicates if missing track names should be generated as \code{X}} \item{.SPECIAL}{an optional list of functions (with no arguments) that are called to generate special annotation tracks defined by codes of the form \code{':NAME'}. e.g., the function \code{link{consensusmap}} defines special tracks \code{':basis'} and \code{':consensus'}. If \code{.SPECIAL=FALSE}, then any special tracks is discarded and a warning is thrown.} \item{.DATA}{data used to match and extend annotation specifications. It is passed to argument \code{data} of the \code{.atrack} methods, which in turn use pass it to \code{\link{match_atrack}}.} \item{.CACHE}{an \code{annotationTrack} object with which the generated annotation track should be consistent. This argument is more for internal/advanced usage and should not be used by the end-user.} } \value{ \code{atrack} returns a list, decorated with class \code{'annotationTrack'}, where each element contains the description of an annotation track. } \description{ \code{.atrack} is an S4 generic method that converts an object into an annotation track object. It provides a general and flexible annotation framework that is used by \code{\link{aheatmap}} to annotates heatmap rows and columns. \code{is.atrack} tests if an object is an \code{annotationTrack} object. \code{adata} get/sets the annotation parameters on an object \code{amargin} get/sets the annotation margin, i.e. along which dimension of the data the annotations are to be considered. \code{anames} returns the reference margin names for annotation tracks, from their embedded annotation data object. \code{alength} returns the reference length for annotation tracks, from their embedded annotation data object \code{atrack} creates/concatenates \code{annotationTrack} objects \code{annotationTrack} is constructor function for \code{annotationTrack} object } \details{ Methods for \code{.atrack} exist for common type of objects, which should provide enough options for new methods to define how annotation track are extracted from more complex objects, by coercing/filtering them into a supported type. } \section{Methods}{ \describe{ \item{.atrack}{\code{signature(object = "ANY")}: The default method converts character or integer vectors into factors. Numeric vectors, factors, a single NA or \code{annotationTrack} objects are returned unchanged (except from reordering by argument \code{order}). Data frames are not changed either, but class 'annotationTrack' is appended to their original class set. } } } \keyword{internal} \keyword{methods} NMF/man/basis-coef-methods.Rd0000644000176200001440000002513114333176413015417 0ustar liggesusers\docType{methods} \name{basis} \alias{basis} \alias{.basis} \alias{.basis<-} \alias{basis<-} \alias{basis,ANY-method} \alias{.basis<--methods} \alias{.basis-methods} \alias{basis<--methods} \alias{basis-methods} \alias{.basis<-,NMFfit,matrix-method} \alias{.basis,NMFfit-method} \alias{basis,NMFfitXn-method} \alias{.basis<-,NMF,matrix-method} \alias{.basis,NMF-method} \alias{basis<-,NMF-method} \alias{basis,NMF-method} \alias{.basis<-,NMFstd,matrix-method} \alias{.basis,NMFstd-method} \alias{coef} \alias{.coef} \alias{.coef<-} \alias{coef<-} \alias{coefficients} \alias{coefficients-methods} \alias{coefficients,NMF-method} \alias{.coef<--methods} \alias{.coef-methods} \alias{coef<--methods} \alias{coef-methods} \alias{.coef<-,NMFfit,matrix-method} \alias{.coef,NMFfit-method} \alias{coef,NMFfitXn-method} \alias{.coef<-,NMF,matrix-method} \alias{.coef,NMF-method} \alias{coef<-,NMF-method} \alias{coef,NMF-method} \alias{.coef<-,NMFstd,matrix-method} \alias{.coef,NMFstd-method} \alias{loadings,NMF-method} \alias{scoef} \alias{scoef,matrix-method} \alias{scoef-methods} \alias{scoef,NMF-method} \title{Accessing NMF Factors} \usage{ basis(object, ...) \S4method{basis}{NMF}(object, all = TRUE, ...) .basis(object, ...) basis(object, ...)<-value \S4method{basis}{NMF}(object, use.dimnames = TRUE, ...)<-value .basis(object)<-value \S4method{loadings}{NMF}(x) coef(object, ...) \S4method{coef}{NMF}(object, all = TRUE, ...) .coef(object, ...) coef(object, ...)<-value \S4method{coef}{NMF}(object, use.dimnames = TRUE, ...)<-value .coef(object)<-value coefficients(object, ...) \S4method{coefficients}{NMF}(object, all = TRUE, ...) scoef(object, ...) \S4method{scoef}{NMF}(object, scale = 1) \S4method{scoef}{matrix}(object, scale = 1) } \arguments{ \item{object}{an object from which to extract the factor matrices, typically an object of class \code{\linkS4class{NMF}}.} \item{...}{extra arguments to allow extension and passed to the low-level access functions \code{.coef} and \code{.basis}. Note that these throw an error if used in replacement functions \code{}.} \item{all}{a logical that indicates whether the complete matrix factor should be returned (\code{TRUE}) or only the non-fixed part. This is relevant only for formula-based NMF models that include fixed basis or coefficient terms.} \item{use.dimnames}{logical that indicates if the object's dim names should be set using those from the new value, or left unchanged -- after truncating them to fit new dimensions if necessary. This is useful to only set the entries of a factor.} \item{value}{replacement value} \item{scale}{scaling factor, which indicates to the value the columns of the coefficient matrix should sum up to.} \item{x}{an object of class \code{"\link{factanal}"} or \code{"\link{princomp}"} or the \code{loadings} component of such an object.} } \description{ \code{basis} and \code{basis<-} are S4 generic functions which respectively extract and set the matrix of basis components of an NMF model (i.e. the first matrix factor). The methods \code{.basis}, \code{.coef} and their replacement versions are implemented as pure virtual methods for the interface class \code{NMF}, meaning that concrete NMF models must provide a definition for their corresponding class (i.e. sub-classes of class \code{NMF}). See \code{\linkS4class{NMF}} for more details. \code{coef} and \code{coef<-} respectively extract and set the coefficient matrix of an NMF model (i.e. the second matrix factor). For example, in the case of the standard NMF model \eqn{V \equiv WH}{V ~ W H}, the method \code{coef} will return the matrix \eqn{H}. \code{.coef} and \code{.coef<-} are low-level S4 generics that simply return/set coefficient data in an object, leaving some common processing to be performed in \code{coef} and \code{coef<-}. Methods \code{coefficients} and \code{coefficients<-} are simple aliases for methods \code{coef} and \code{coef<-} respectively. \code{scoef} is similar to \code{coef}, but returns the mixture coefficient matrix of an NMF model, with the columns scaled so that they sum up to a given value (1 by default). } \details{ For example, in the case of the standard NMF model \eqn{V \equiv W H}{V ~ W H}, the method \code{basis} will return the matrix \eqn{W}. \code{basis} and \code{basis<-} are defined for the top virtual class \code{\linkS4class{NMF}} only, and rely internally on the low-level S4 generics \code{.basis} and \code{.basis<-} respectively that effectively extract/set the coefficient data. These data are post/pre-processed, e.g., to extract/set only their non-fixed terms or check dimension compatibility. \code{coef} and \code{coef<-} are S4 methods defined for the corresponding generic functions from package \code{stats} (See \link[stats]{coef}). Similarly to \code{basis} and \code{basis<-}, they are defined for the top virtual class \code{\linkS4class{NMF}} only, and rely internally on the S4 generics \code{.coef} and \code{.coef<-} respectively that effectively extract/set the coefficient data. These data are post/pre-processed, e.g., to extract/set only their non-fixed terms or check dimension compatibility. } \section{Methods}{ \describe{ \item{basis}{\code{signature(object = "ANY")}: Default method returns the value of S3 slot or attribute \code{'basis'}. It returns \code{NULL} if none of these are set. Arguments \code{...} are not used by this method. } \item{basis}{\code{signature(object = "NMFfitXn")}: Returns the basis matrix of the best fit amongst all the fits stored in \code{object}. It is a shortcut for \code{basis(fit(object))}. } \item{.basis}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.basis}{\code{signature(object = "NMFstd")}: Get the basis matrix in standard NMF models This function returns slot \code{W} of \code{object}. } \item{.basis}{\code{signature(object = "NMFfit")}: Returns the basis matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.basis(fit(object), ...)}, dispatching the call to the \code{.basis} method of the actual NMF model. } \item{.basis<-}{\code{signature(object = "NMF", value = "matrix")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.basis<-}{\code{signature(object = "NMFstd", value = "matrix")}: Set the basis matrix in standard NMF models This function sets slot \code{W} of \code{object}. } \item{.basis<-}{\code{signature(object = "NMFfit", value = "matrix")}: Sets the the basis matrix of an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.basis(fit(object)) <- value}, dispatching the call to the \code{.basis<-} method of the actual NMF model. It is not meant to be used by the user, except when developing NMF algorithms, to update the basis matrix of the seed object before returning it. } \item{basis<-}{\code{signature(object = "NMF")}: Default methods that calls \code{.basis<-} and check the validity of the updated object. } \item{coef}{\code{signature(object = "NMFfitXn")}: Returns the coefficient matrix of the best fit amongst all the fits stored in \code{object}. It is a shortcut for \code{coef(fit(object))}. } \item{.coef}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.coef}{\code{signature(object = "NMFstd")}: Get the mixture coefficient matrix in standard NMF models This function returns slot \code{H} of \code{object}. } \item{.coef}{\code{signature(object = "NMFfit")}: Returns the the coefficient matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.coef(fit(object), ...)}, dispatching the call to the \code{.coef} method of the actual NMF model. } \item{.coef<-}{\code{signature(object = "NMF", value = "matrix")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.coef<-}{\code{signature(object = "NMFstd", value = "matrix")}: Set the mixture coefficient matrix in standard NMF models This function sets slot \code{H} of \code{object}. } \item{.coef<-}{\code{signature(object = "NMFfit", value = "matrix")}: Sets the the coefficient matrix of an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.coef(fit(object)) <- value}, dispatching the call to the \code{.coef<-} method of the actual NMF model. It is not meant to be used by the user, except when developing NMF algorithms, to update the coefficient matrix in the seed object before returning it. } \item{coef<-}{\code{signature(object = "NMF")}: Default methods that calls \code{.coef<-} and check the validity of the updated object. } \item{coefficients}{\code{signature(object = "NMF")}: Alias to \code{coef,NMF}, therefore also pure virtual. } \item{loadings}{\code{signature(x = "NMF")}: Method loadings for NMF Models The method \code{loadings} is identical to \code{basis}, but do not accept any extra argument. The method \code{loadings} is provided to standardise the NMF interface against the one defined in the \code{\link{stats}} package, and emphasises the similarities between NMF and PCA or factorial analysis (see \code{\link{loadings}}). } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # scoef #---------- # Scaled coefficient matrix x <- rnmf(3, 10, 5) scoef(x) scoef(x, 100) #---------- # .basis,NMFstd-method #---------- # random standard NMF model x <- rnmf(3, 10, 5) basis(x) coef(x) # set matrix factors basis(x) <- matrix(1, nrow(x), nbasis(x)) coef(x) <- matrix(1, nbasis(x), ncol(x)) # set random factors basis(x) <- rmatrix(basis(x)) coef(x) <- rmatrix(coef(x)) # incompatible matrices generate an error: try( coef(x) <- matrix(1, nbasis(x)-1, nrow(x)) ) # but the low-level method allow it .coef(x) <- matrix(1, nbasis(x)-1, nrow(x)) try( validObject(x) ) } \seealso{ Other NMF-interface: \code{\link{.DollarNames,NMF-method}}, \code{\link{misc}}, \code{\link{NMF-class}}, \code{\link{$<-,NMF-method}}, \code{\link{$,NMF-method}}, \code{\link{nmfModel}}, \code{\link{nmfModels}}, \code{\link{rnmf}} } \keyword{methods} NMF/man/esGolub.Rd0000644000176200001440000000514514406045475013352 0ustar liggesusers\docType{data} \name{esGolub} \alias{esGolub} \title{Golub ExpressionSet} \format{There are 3 covariates listed. \itemize{ \item Samples: The original sample labels. \item ALL.AML: Whether the patient had AML or ALL. It is a \code{\link{factor}} with levels \code{c('ALL', 'AML')}. \item Cell: ALL arises from two different types of lymphocytes (T-cell and B-cell). This specifies which for the ALL patients; There is no such information for the AML samples. It is a \code{\link{factor}} with levels \code{c('T-cell', 'B-cell', NA)}. }} \source{ Original data from Golub et al.:\cr \code{http://www-genome.wi.mit.edu/mpr/data_set_ALL_AML.html} } \description{ This data comes originally from the gene expression data from \cite{Golub et al. (1999)}. The version included in the package is the one used and referenced in \cite{Brunet et al. (2004)}. The samples are from 27 patients with acute lymphoblastic leukemia (ALL) and 11 patients with acute myeloid leukemia (AML). } \details{ The samples were assayed using Affymetrix Hgu6800 chips and the original data on the expression of 7129 genes (Affymetrix probes) are available on the Broad Institute web site (see references below). The data in \code{esGolub} were obtained from the web page related to the paper from \cite{Brunet et al. (2004)}, which describes an application of Nonnegative Matrix Factorization to gene expression clustering. (see link in section \emph{Source}). They contain the 5,000 most highly varying genes according to their coefficient of variation, and were installed in an object of class \emph{ExpressionSet}. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # requires package Biobase to be installed if(requireNamespace("Biobase", quietly=TRUE)){ data(esGolub) esGolub \dontrun{pData(esGolub)} } } \references{ Golub TR, Slonim DK, Tamayo P, Huard C, Gaasenbeek M, Mesirov JP, Coller H, Loh ML, Downing JR, Caligiuri Ma, Bloomfield CD and Lander ES (1999). "Molecular classification of cancer: class discovery and class prediction by gene expression monitoring." _Science (New York, N.Y.)_, *286*(5439), pp. 531-7. ISSN 0036-8075, . Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . } \keyword{datasets} NMF/man/nmf_update_euclidean.Rd0000644000176200001440000000647114335211166016101 0ustar liggesusers\name{nmf_update.euclidean.h} \alias{nmf_update.euclidean} \alias{nmf_update.euclidean.h} \alias{nmf_update.euclidean.h_R} \alias{nmf_update.euclidean.w} \alias{nmf_update.euclidean.w_R} \title{NMF Multiplicative Updates for Euclidean Distance} \usage{ nmf_update.euclidean.h(v, w, h, eps = 10^-9, nbterms = 0L, ncterms = 0L, copy = TRUE) nmf_update.euclidean.h_R(v, w, h, wh = NULL, eps = 10^-9) nmf_update.euclidean.w(v, w, h, eps = 10^-9, nbterms = 0L, ncterms = 0L, weight = NULL, copy = TRUE) nmf_update.euclidean.w_R(v, w, h, wh = NULL, eps = 10^-9) } \arguments{ \item{eps}{small numeric value used to ensure numeric stability, by shifting up entries from zero to this fixed value.} \item{wh}{already computed NMF estimate used to compute the denominator term.} \item{weight}{numeric vector of sample weights, e.g., used to normalise samples coming from multiple datasets. It must be of the same length as the number of samples/columns in \code{v} -- and \code{h}.} \item{v}{target matrix} \item{w}{current basis matrix} \item{h}{current coefficient matrix} \item{nbterms}{number of fixed basis terms} \item{ncterms}{number of fixed coefficient terms} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} } \value{ a matrix of the same dimension as the input matrix to update (i.e. \code{w} or \code{h}). If \code{copy=FALSE}, the returned matrix uses the same memory as the input object. } \description{ Multiplicative updates from \cite{Lee et al. (2001)} for standard Nonnegative Matrix Factorization models \eqn{V \approx W H}, where the distance between the target matrix and its NMF estimate is measured by the -- euclidean -- Frobenius norm. \code{nmf_update.euclidean.w} and \code{nmf_update.euclidean.h} compute the updated basis and coefficient matrices respectively. They use a \emph{C++} implementation which is optimised for speed and memory usage. \code{nmf_update.euclidean.w_R} and \code{nmf_update.euclidean.h_R} implement the same updates in \emph{plain R}. } \details{ The coefficient matrix (\code{H}) is updated as follows: \deqn{ H_{kj} \leftarrow \frac{\max(H_{kj} W^T V)_{kj}, \varepsilon) }{(W^T W H)_{kj} + \varepsilon} }{ H_kj <- max(H_kj (W^T V)_kj, eps) / ( (W^T W H)_kj + eps ) } These updates are used by the built-in NMF algorithms \code{\link[=Frobenius-nmf]{Frobenius}} and \code{\link[=lee-nmf]{lee}}. The basis matrix (\code{W}) is updated as follows: \deqn{ W_ik \leftarrow \frac{\max(W_ik (V H^T)_ik, \varepsilon) }{ (W H H^T)_ik + \varepsilon} }{ W_ik <- max(W_ik (V H^T)_ik, eps) / ( (W H H^T)_ik + eps ) } } \author{ Update definitions by \cite{Lee2001}. C++ optimised implementation by Renaud Gaujoux. } \references{ Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/stop-NMF.Rd0000644000176200001440000001124414333176413013346 0ustar liggesusers\name{NMFStop} \alias{NMFStop} \alias{nmf.stop.connectivity} \alias{nmf.stop.iteration} \alias{nmf.stop.stationary} \alias{nmf.stop.threshold} \alias{stop-NMF} \title{Stopping Criteria for NMF Iterative Strategies} \usage{ NMFStop(s, check = TRUE) nmf.stop.iteration(n) nmf.stop.threshold(threshold) nmf.stop.stationary(object, i, y, x, stationary.th = .Machine$double.eps, check.interval = 5 * check.niter, check.niter = 10L, ...) nmf.stop.connectivity(object, i, y, x, stopconv = 40, check.interval = 10, ...) } \arguments{ \item{s}{specification of the stopping criterion. See section \emph{Details} for the supported formats and how they are processed.} \item{check}{logical that indicates if the validity of the stopping criterion function should be checked before returning it.} \item{n}{maximum number of iteration to perform.} \item{threshold}{default stationarity threshold} \item{object}{an NMF strategy object} \item{i}{the current iteration} \item{y}{the target matrix} \item{x}{the current NMF model} \item{stationary.th}{maximum absolute value of the gradient, for the objective function to be considered stationary.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} \item{check.niter}{number of successive iteration used to compute the stationnary criterion.} \item{...}{extra arguments passed to the function \code{\link{objective}}, which computes the objective value between \code{x} and \code{y}.} \item{stopconv}{number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.} } \value{ a function that can be passed to argument \code{.stop} of function \code{\link{nmf}}, which is typically used when the algorith is implemented as an iterative strategy. a function that can be used as a stopping criterion for NMF algorithms defined as \code{\linkS4class{NMFStrategyIterative}} objects. That is a function with arguments \code{(strategy, i, target, data, ...)} that returns \code{TRUE} if the stopping criterion is satisfied -- which in turn stops the iterative process, and \code{FALSE} otherwise. } \description{ The function documented here implement stopping/convergence criteria commonly used in NMF algorithms. \code{NMFStop} acts as a factory method that creates stopping criterion functions from different types of values, which are subsequently used by \code{\linkS4class{NMFStrategyIterative}} objects to determine when to stop their iterative process. \code{nmf.stop.iteration} generates a function that implements the stopping criterion that limits the number of iterations to a maximum of \code{n}), i.e. that returns \code{TRUE} if \code{i>=n}, \code{FALSE} otherwise. \code{nmf.stop.threshold} generates a function that implements the stopping criterion that stops when a given stationarity threshold is achieved by successive iterations. The returned function is identical to \code{nmf.stop.stationary}, but with the default threshold set to \code{threshold}. More precisely, the objective function is computed over \eqn{n} successive iterations (specified in argument \code{check.niter}), every \code{check.interval} iterations. The criterion stops when the absolute difference between the maximum and the minimum objective values over these iterations is lower than a given threshold \eqn{\alpha} (specified in \code{stationary.th}): \code{nmf.stop.connectivity} implements the stopping criterion that is based on the stationarity of the connectivity matrix. } \details{ \code{NMFStop} can take the following values: \describe{ \item{function}{ is returned unchanged, except when it has no arguments, in which case it assumed to be a generator, which is immediately called and should return a function that implements the actual stopping criterion;} \item{integer}{ the value is used to create a stopping criterion that stops at that exact number of iterations via \code{nmf.stop.iteration};} \item{numeric}{ the value is used to create a stopping criterion that stops when at that stationary threshold via \code{nmf.stop.threshold};} \item{character}{ must be a single string which must be an access key for registered criteria (currently available: \dQuote{connectivity} and \dQuote{stationary}), or the name of a function in the global environment or the namespace of the loading package.} } \deqn{ \left| \frac{\max_{i- N_s + 1 \leq k \leq i} D_k - \min_{i - N_s +1 \leq k \leq i} D_k}{n} \right| \leq \alpha, }{ | [max( D(i- N_s + 1), ..., D(i) ) - min( D(i- N_s + 1), ..., D(i) )] / n | <= alpha } } NMF/man/show-commaNMFfitX-method.Rd0000644000176200001440000000045714333176413016473 0ustar liggesusers\docType{methods} \name{show,NMFfitX-method} \alias{show,NMFfitX-method} \title{Show method for objects of class \code{NMFfitX}} \usage{ \S4method{show}{NMFfitX}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFfitX} } \keyword{methods} NMF/man/RNG.Rd0000644000176200001440000000407714333176413012377 0ustar liggesusers\docType{methods} \name{getRNG1} \alias{.getRNG} \alias{getRNG1} \alias{getRNG1-methods} \alias{getRNG1,NMFfitX1-method} \alias{getRNG1,NMFfitX-method} \alias{getRNG1,NMFfitXn-method} \alias{.getRNG-methods} \alias{.getRNG,NMFfitXn-method} \title{Extracting RNG Data from NMF Objects} \usage{ getRNG1(object, ...) .getRNG(object, ...) } \arguments{ \item{object}{an R object from which RNG settings can be extracted, e.g. an integer vector containing a suitable value for \code{.Random.seed} or embedded RNG data, e.g., in S3/S4 slot \code{rng} or \code{rng$noise}.} \item{...}{extra arguments to allow extension and passed to a suitable S4 method \code{.getRNG} or \code{.setRNG}.} } \description{ The \code{\link{nmf}} function returns objects that contain embedded RNG data, that can be used to exactly reproduce any computation. These data can be extracted using dedicated methods for the S4 generics \code{\link[rngtools]{getRNG}} and \code{\link[rngtools]{getRNG1}}. } \section{Methods}{ \describe{ \item{.getRNG}{\code{signature(object = "NMFfitXn")}: Returns the RNG settings used for the best fit. This method throws an error if the object is empty. } \item{getRNG1}{\code{signature(object = "NMFfitX")}: Returns the RNG settings used for the first NMF run of multiple NMF runs. } \item{getRNG1}{\code{signature(object = "NMFfitX1")}: Returns the RNG settings used to compute the first of all NMF runs, amongst which \code{object} was selected as the best fit. } \item{getRNG1}{\code{signature(object = "NMFfitXn")}: Returns the RNG settings used for the first run. This method throws an error if the object is empty. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # For multiple NMF runs, the RNG settings used for the first run is also stored V <- rmatrix(20,10) res <- nmf(V, 3, nrun=3) # RNG used for the best fit getRNG(res) # RNG used for the first of all fits getRNG1(res) # they may differ if the best fit is not the first one rng.equal(res, getRNG1(res)) } \keyword{methods} NMF/man/terms.Rd0000644000176200001440000000665414333176413013106 0ustar liggesusers\docType{methods} \name{ibterms} \alias{bterms} \alias{cterms} \alias{ibasis} \alias{ibterms} \alias{ibterms-methods} \alias{ibterms,NMFfit-method} \alias{ibterms,NMFfitX-method} \alias{ibterms,NMF-method} \alias{ibterms,NMFstd-method} \alias{icoef} \alias{icterms} \alias{icterms-methods} \alias{icterms,NMFfit-method} \alias{icterms,NMF-method} \alias{icterms,NMFstd-method} \alias{iterms} \alias{nbterms} \alias{ncterms} \alias{nterms} \title{Fixed Terms in NMF Models} \usage{ ibterms(object, ...) icterms(object, ...) iterms(object, ...) nterms(object) nbterms(object) ncterms(object) bterms(object) cterms(object) ibasis(object, ...) icoef(object, ...) } \arguments{ \item{object}{NMF object} \item{...}{extra parameters to allow extension (currently not used)} } \description{ Formula-based NMF models may contain fixed basis and/or coefficient terms. The functions documented here provide access to these data, which are read-only and defined when the model object is instantiated (e.g., see \code{\link[=nmfModel,formula,ANY-method]{nmfModel,formula-method}}). \code{ibterms}, \code{icterms} and \code{iterms} respectively return the indexes of the fixed basis terms, the fixed coefficient terms and all fixed terms, within the basis and/or coefficient matrix of an NMF model. \code{nterms}, \code{nbterms}, and \code{ncterms} return, respectively, the number of all fixed terms, fixed basis terms and fixed coefficient terms in an NMF model. In particular: i.e. \code{nterms(object) = nbterms(object) + ncterms(object)}. \code{bterms} and \code{cterms} return, respectively, the primary data for fixed basis and coefficient terms in an NMF model -- as stored in slots \code{bterms} and \code{cterms} . These are factors or numeric vectors which define fixed basis components, e.g., used for defining separate offsets for different \emph{a priori} groups of samples, or to incorporate/correct for some known covariate. \code{ibasis} and \code{icoef} return, respectively, the indexes of all latent basis vectors and estimated coefficients within the basis or coefficient matrix of an NMF model. } \section{Methods}{ \describe{ \item{ibterms}{\code{signature(object = "NMF")}: Default pure virtual method that ensure a method is defined for concrete NMF model classes. } \item{ibterms}{\code{signature(object = "NMFstd")}: Method for standard NMF models, which returns the integer vector that is stored in slot \code{ibterms} when a formula-based NMF model is instantiated. } \item{ibterms}{\code{signature(object = "NMFfit")}: Method for single NMF fit objects, which returns the indexes of fixed basis terms from the fitted model. } \item{ibterms}{\code{signature(object = "NMFfitX")}: Method for multiple NMF fit objects, which returns the indexes of fixed basis terms from the best fitted model. } \item{icterms}{\code{signature(object = "NMF")}: Default pure virtual method that ensure a method is defined for concrete NMF model classes. } \item{icterms}{\code{signature(object = "NMFstd")}: Method for standard NMF models, which returns the integer vector that is stored in slot \code{icterms} when a formula-based NMF model is instantiated. } \item{icterms}{\code{signature(object = "NMFfit")}: Method for single NMF fit objects, which returns the indexes of fixed coefficient terms from the fitted model. } } } \keyword{methods} NMF/man/nmfReport.Rd0000644000176200001440000000270514333176413013721 0ustar liggesusers\name{nmfReport} \alias{nmfReport} \title{Run NMF Methods and Generate a Report} \usage{ nmfReport(x, rank, method, colClass = NULL, ..., output = NULL, template = NULL) } \arguments{ \item{x}{target matrix} \item{rank}{factorization rank} \item{method}{list of methods to apply} \item{colClass}{reference class to assess accuracy} \item{...}{extra paramters passed to \code{\link{nmf}}} \item{output}{output HTML file} \item{template}{template Rmd file} } \value{ a list with the following elements: \item{fits}{the fit(s) for each method and each value of the rank.} \item{accuracy}{a data.frame that contains the summary assessment measures, for each fit.} } \description{ Generates an HTML report from running a set of method on a given target matrix, for a set of factorization ranks. } \details{ The report is based on an .Rmd document \code{'report.Rmd'} stored in the package installation sub-directory \code{scripts/}, and is compiled using \pkg{knitr}. At the beginning of the document, a file named \code{'functions.R'} is looked for in the current directory, and sourced if present. This enables the definition of custom NMF methods (see \code{\link{setNMFMethod}}) or setting global options. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } \dontrun{ x <- rmatrix(20, 10) gr <- gl(2, 5) nmfReport(x, 2:4, method = list('br', 'lee'), colClass = gr, nrun = 5) } } NMF/man/NMFList-class.Rd0000644000176200001440000000244114333176413014321 0ustar liggesusers\docType{class} \name{NMFList-class} \alias{NMFList-class} \title{Class for Storing Heterogeneous NMF fits} \description{ This class wraps a list of NMF fit objects, which may come from different runs of the function \code{\link{nmf}}, using different parameters, methods, etc.. These can be either from a single run (NMFfit) or multiple runs (NMFfitX). Note that its definition/interface is very likely to change in the future. } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFList")}: Returns the method names used to compute the NMF fits in the list. It returns \code{NULL} if the list is empty. } \item{runtime}{\code{signature(object = "NMFList")}: Returns the CPU time required to compute all NMF fits in the list. It returns \code{NULL} if the list is empty. If no timing data are available, the sequential time is returned. } \item{seqtime}{\code{signature(object = "NMFList")}: Returns the CPU time that would be required to sequentially compute all NMF fits stored in \code{object}. This method calls the function \code{runtime} on each fit and sum up the results. It returns \code{NULL} on an empty object. } \item{show}{\code{signature(object = "NMFList")}: Show method for objects of class \code{NMFList} } } } NMF/man/NMFfitX.Rd0000644000176200001440000000241714333176413013220 0ustar liggesusers\docType{methods} \name{NMFfitX} \alias{NMFfitX} \alias{NMFfitX,list-method} \alias{NMFfitX-methods} \alias{NMFfitX,NMFfit-method} \alias{NMFfitX,NMFfitX-method} \title{Factory Method for Multiple NMF Run Objects} \usage{ NMFfitX(object, ...) \S4method{NMFfitX}{list}(object, ..., .merge = FALSE) } \arguments{ \item{object}{an object from which is created an \code{NMFfitX} object} \item{...}{extra arguments used to pass values for slots} \item{.merge}{a logical that indicates if the fits should be aggregated, only keeping the best fit, and return an \code{NMFfitX1} object. If \code{FALSE}, an \code{NMFfitXn} object containing the data of all the fits is returned.} } \description{ Factory Method for Multiple NMF Run Objects } \section{Methods}{ \describe{ \item{NMFfitX}{\code{signature(object = "list")}: Create an \code{NMFfitX} object from a list of fits. } \item{NMFfitX}{\code{signature(object = "NMFfit")}: Creates an \code{NMFfitX1} object from a single fit. This is used in \code{\link{nmf}} when only the best fit is kept in memory or on disk. } \item{NMFfitX}{\code{signature(object = "NMFfitX")}: Provides a way to aggregate \code{NMFfitXn} objects into an \code{NMFfitX1} object. } } } \keyword{internal} \keyword{methods} NMF/man/isCRANcheck.Rd0000644000176200001440000000512614334426712014023 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/packages.R \name{isCRANcheck} \alias{isCRANcheck} \alias{isCHECK} \title{Package Check Utils} \usage{ isCRANcheck(...) isCHECK() } \arguments{ \item{...}{each argument specifies a set of tests to do using an AND operator. The final result tests if any of the test set is true. Possible values are: \describe{ \item{\code{'timing'}}{Check if the environment variable \code{_R_CHECK_TIMINGS_} is set, as with the flag \code{'--timing'} was set.} \item{\code{'cran'}}{Check if the environment variable \code{_R_CHECK_CRAN_INCOMING_} is set, as with the flag \code{'--as-cran'} was set.} }} } \description{ \code{isCRANcheck} \strong{tries} to identify if one is running CRAN-like checks. } \details{ Currently \code{isCRANcheck} returns \code{TRUE} if the check is run with either environment variable \code{_R_CHECK_TIMINGS_} (as set by flag \code{'--timings'}) or \code{_R_CHECK_CRAN_INCOMINGS_} (as set by flag \code{'--as-cran'}). \strong{Warning:} the checks performed on CRAN check machines are on purpose not always run with such flags, so that users cannot effectively "trick" the checks. As a result, there is no guarantee this function effectively identifies such checks. If really needed for honest reasons, CRAN recommends users rely on custom dedicated environment variables to enable specific tests or examples. } \section{Functions}{ \itemize{ \item \code{isCHECK}: tries harder to test if running under \code{R CMD check}. It will definitely identifies check runs for: \itemize{ \item unit tests that use the unified unit test framework defined by \pkg{pkgmaker} (see \code{utest}); \item examples that are run with option \code{R_CHECK_RUNNING_EXAMPLES_ = TRUE}, which is automatically set for man pages generated with a fork of \pkg{roxygen2} (see \emph{References}). } Currently, \code{isCHECK} checks both CRAN expected flags, the value of environment variable \code{_R_CHECK_RUNNING_UTESTS_}, and the value of option \code{R_CHECK_RUNNING_EXAMPLES_}. It will return \code{TRUE} if any of these environment variables is set to anything not equivalent to \code{FALSE}, or if the option is \code{TRUE}. For example, the function \code{utest} sets it to the name of the package being checked (\code{_R_CHECK_RUNNING_UTESTS_=}), but unit tests run as part of unit tests vignettes are run with \code{_R_CHECK_RUNNING_UTESTS_=FALSE}, so that all tests are run and reported when generating them. }} \examples{ isCHECK() } \references{ Adapted from the function \code{CRAN} in the \pkg{fda} package. \url{https://github.com/renozao/roxygen} } NMF/man/nneg.Rd0000644000176200001440000001230714333176413012673 0ustar liggesusers\docType{methods} \name{nneg} \alias{nneg} \alias{nneg,matrix-method} \alias{nneg-methods} \alias{nneg,NMF-method} \alias{posneg} \alias{rposneg} \alias{rposneg,matrix-method} \alias{rposneg-methods} \alias{rposneg,NMF-method} \title{Transforming from Mixed-sign to Nonnegative Data} \usage{ nneg(object, ...) \S4method{nneg}{matrix}(object, method = c("pmax", "posneg", "absolute", "min"), threshold = 0, shift = TRUE) posneg(...) rposneg(object, ...) \S4method{rposneg}{matrix}(object, unstack = TRUE) } \arguments{ \item{object}{The data object to transform} \item{...}{extra arguments to allow extension or passed down to \code{nneg,matrix} or \code{rposneg,matrix} in subsequent calls.} \item{method}{Name of the transformation method to use, that is partially matched against the following possible methods: \describe{ \item{pmax}{Each entry is constrained to be above threshold \code{threshold}.} \item{posneg}{The matrix is split into its "positive" and "negative" parts, with the entries of each part constrained to be above threshold \code{threshold}. The result consists in these two parts stacked in rows (i.e. \code{\link{rbind}}-ed) into a single matrix, which has double the number of rows of the input matrix \code{object}.} \item{absolute}{The absolute value of each entry is constrained to be above threshold \code{threshold}.} \item{min}{Global shift by adding the minimum entry to each entry, only if it is negative, and then apply threshold. } }} \item{threshold}{Nonnegative lower threshold value (single numeric). See argument \code{shit} for details on how the threshold is used and affects the result.} \item{shift}{a logical indicating whether the entries below the threshold value \code{threshold} should be forced (shifted) to 0 (default) or to the threshold value itself. In other words, if \code{shift=TRUE} (default) all entries in the result matrix are either 0 or strictly greater than \code{threshold}. They are all greater or equal than \code{threshold} otherwise.} \item{unstack}{Logical indicating whether the positive and negative parts should be unstacked and combined into a matrix as \code{pos - neg}, which contains half the number of rows of \code{object} (default), or left stacked as \code{[pos; -neg]}.} } \value{ an object of the same class as argument \code{object}. an object of the same type of \code{object} } \description{ \code{nneg} is a generic function to transform a data objects that contains negative values into a similar object that only contains values that are nonnegative or greater than a given threshold. \code{posneg} is a shortcut for \code{nneg(..., method='posneg')}, to split mixed-sign data into its positive and negative part. See description for method \code{"posneg"}, in \code{\link{nneg}}. \code{rposneg} performs the "reverse" transformation of the \code{\link{posneg}} function. } \section{Methods}{ \describe{ \item{nneg}{\code{signature(object = "matrix")}: Transforms a mixed-sign matrix into a nonnegative matrix, optionally apply a lower threshold. This is the workhorse method, that is eventually called by all other methods defined in the \code{\link{NMF}} package. } \item{nneg}{\code{signature(object = "NMF")}: Apply \code{nneg} to the basis matrix of an \code{\link{NMF}} object (i.e. \code{basis(object)}). All extra arguments in \code{...} are passed to the method \code{nneg,matrix}. } \item{rposneg}{\code{signature(object = "NMF")}: Apply \code{rposneg} to the basis matrix of an \code{\link{NMF}} object. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # nneg,matrix-method #---------- # random mixed sign data (normal distribution) set.seed(1) x <- rmatrix(5,5, rnorm, mean=0, sd=5) x # pmax (default) nneg(x) # using a threshold nneg(x, threshold=2) # without shifting the entries lower than threshold nneg(x, threshold=2, shift=FALSE) # posneg: split positive and negative part nneg(x, method='posneg') nneg(x, method='pos', threshold=2) # absolute nneg(x, method='absolute') nneg(x, method='abs', threshold=2) # min nneg(x, method='min') nneg(x, method='min', threshold=2) #---------- # nneg,NMF-method #---------- # random M <- nmfModel(x, rmatrix(ncol(x), 3)) nnM <- nneg(M) basis(nnM) # mixture coefficients are not affected identical( coef(M), coef(nnM) ) #---------- # posneg #---------- # shortcut for the "posneg" transformation posneg(x) posneg(x, 2) #---------- # rposneg,matrix-method #---------- # random mixed sign data (normal distribution) set.seed(1) x <- rmatrix(5,5, rnorm, mean=0, sd=5) x # posneg-transform: split positive and negative part y <- posneg(x) dim(y) # posneg-reverse z <- rposneg(y) identical(x, z) rposneg(y, unstack=FALSE) # But posneg-transformation with a non zero threshold is not reversible y1 <- posneg(x, 1) identical(rposneg(y1), x) #---------- # rposneg,NMF-method #---------- # random mixed signed NMF model M <- nmfModel(rmatrix(10, 3, rnorm), rmatrix(3, 4)) # split positive and negative part nnM <- posneg(M) M2 <- rposneg(nnM) identical(M, M2) } \seealso{ \code{\link{pmax}} Other transforms: \code{\link{t.NMF}} } \keyword{methods} NMF/man/NMFStrategyIterative-class.Rd0000644000176200001440000000472714335211124017065 0ustar liggesusers\docType{class} \name{NMFStrategyIterative-class} \alias{NMFStrategyIterative-class} \title{Interface for Algorithms: Implementation for Iterative NMF Algorithms} \description{ This class provides a specific implementation for the generic function \code{run} -- concretising the virtual interface class \code{\linkS4class{NMFStrategy}}, for NMF algorithms that conform to the following iterative schema (starred numbers indicate mandatory steps): \itemize{ \item 1. Initialisation \item 2*. Update the model at each iteration \item 3. Stop if some criterion is satisfied \item 4. Wrap up } This schema could possibly apply to all NMF algorithms, since these are essentially optimisation algorithms, almost all of which use iterative methods to approximate a solution of the optimisation problem. The main advantage is that it allows to implement updates and stopping criterion separately, and combine them in different ways. In particular, many NMF algorithms are based on multiplicative updates, following the approach from \cite{Lee et al. (2001)}, which are specially suitable to be cast into this simple schema. } \section{Slots}{ \describe{ \item{onInit}{optional function that performs some initialisation or pre-processing on the model, before starting the iteration loop.} \item{Update}{mandatory function that implement the update step, which computes new values for the model, based on its previous value. It is called at each iteration, until the stopping criterion is met or the maximum number of iteration is achieved.} \item{Stop}{optional function that implements the stopping criterion. It is called \strong{before} each Update step. If not provided, the iterations are stopped after a fixed number of updates.} \item{onReturn}{optional function that wraps up the result into an NMF object. It is called just before returning the} } } \section{Methods}{ \describe{ \item{run}{\code{signature(object = "NMFStrategyIterative", y = "matrix", x = "NMFfit")}: Runs an NMF iterative algorithm on a target matrix \code{y}. } \item{show}{\code{signature(object = "NMFStrategyIterative")}: Show method for objects of class \code{NMFStrategyIterative} } } } \references{ Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/runtime-commaNMFList-method.Rd0000644000176200001440000000150514333176413017172 0ustar liggesusers\docType{methods} \name{runtime,NMFList-method} \alias{runtime,NMFList-method} \title{Returns the CPU time required to compute all NMF fits in the list. It returns \code{NULL} if the list is empty. If no timing data are available, the sequential time is returned.} \usage{ \S4method{runtime}{NMFList}(object, all = FALSE) } \arguments{ \item{all}{logical that indicates if the CPU time of each fit should be returned (\code{TRUE}) or only the total CPU time used to compute all the fits in \code{object}.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} } \description{ Returns the CPU time required to compute all NMF fits in the list. It returns \code{NULL} if the list is empty. If no timing data are available, the sequential time is returned. } \keyword{methods} NMF/man/show-commaNMFfitX1-method.Rd0000644000176200001440000000046414333176413016552 0ustar liggesusers\docType{methods} \name{show,NMFfitX1-method} \alias{show,NMFfitX1-method} \title{Show method for objects of class \code{NMFfitX1}} \usage{ \S4method{show}{NMFfitX1}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFfitX1} } \keyword{methods} NMF/man/NMFfit-class.Rd0000644000176200001440000002652514660664023014203 0ustar liggesusers\docType{class} \name{NMFfit-class} \alias{NMFfit} \alias{NMFfit-class} \title{Base Class for to store Nonnegative Matrix Factorisation results} \usage{ NMFfit(fit = nmfModel(), ..., rng = NULL) } \arguments{ \item{fit}{an NMF model} \item{...}{extra argument used to initialise slots in the instantiating \code{NMFfit} object.} \item{rng}{RNG settings specification (typically a suitable value for \code{\link{.Random.seed}}).} } \description{ Base class to handle the results of general \strong{Nonnegative Matrix Factorisation} algorithms (NMF). The function \code{NMFfit} is a factory method for NMFfit objects, that should not need to be called by the user. It is used internally by the functions \code{\link{nmf}} and \code{seed} to instantiate the starting point of NMF algorithms. } \details{ It provides a general structure and generic functions to manage the results of NMF algorithms. It contains a slot with the fitted NMF model (see slot \code{fit}) as well as data about the methods and parameters used to compute the factorization. The purpose of this class is to handle in a generic way the results of NMF algorithms. Its slot \code{fit} contains the fitted NMF model as an object of class \code{\linkS4class{NMF}}. Other slots contains data about how the factorization has been computed, such as the algorithm and seeding method, the computation time, the final residuals, etc\dots{} Class \code{NMFfit} acts as a wrapper class for its slot \code{fit}. It inherits from interface class \code{\linkS4class{NMF}} defined for generic NMF models. Therefore, all the methods defined by this interface can be called directly on objects of class \code{NMFfit}. The calls are simply dispatched on slot \code{fit}, i.e. the results are the same as if calling the methods directly on slot \code{fit}. } \section{Slots}{ \describe{ \item{fit}{An object that inherits from class \code{\linkS4class{NMF}}, and contains the fitted NMF model. NB: class \code{NMF} is a virtual class. The default class for this slot is \code{NMFstd}, that implements the standard NMF model.} \item{residuals}{A \code{numeric} vector that contains the final residuals or the residuals track between the target matrix and its NMF estimate(s). Default value is \code{numeric()}. See method \code{\link{residuals}} for details on accessor methods and main interface \code{\link{nmf}} for details on how to compute NMF with residuals tracking.} \item{method}{a single \code{character} string that contains the name of the algorithm used to fit the model. Default value is \code{''}.} \item{seed}{a single \code{character} string that contains the name of the seeding method used to seed the algorithm that fitted the NMF model. Default value is \code{''}. See \code{\link{nmf}} for more details.} \item{rng}{an object that contains the RNG settings used for the fit. Currently the settings are stored as an integer vector, the value of \code{\link{.Random.seed}} at the time the object is created. It is initialized by the \code{initialized} method. See \code{\link[rngtools]{getRNG}} for more details.} \item{distance}{either a single \code{"character"} string that contains the name of the built-in objective function, or a \code{function} that measures the residuals between the target matrix and its NMF estimate. See \code{\link{objective}} and \code{\link{deviance,NMF-method}}.} \item{parameters}{a \code{list} that contains the extra parameters -- usually specific to the algorithm -- that were used to fit the model.} \item{runtime}{object of class \code{"proc_time"} that contains various measures of the time spent to fit the model. See \code{\link[base]{system.time}}} \item{options}{a \code{list} that contains the options used to compute the object.} \item{extra}{a \code{list} that contains extra miscellaneous data for internal usage only. For example it can be used to store extra parameters or temporary data, without the need to explicitly extend the \code{NMFfit} class. Currently built-in algorithms only use this slot to store the number of iterations performed to fit the object. Data that need to be easily accessible by the end-user should rather be set using the methods \code{$<-} that sets elements in the \code{list} slot \code{misc} -- that is inherited from class \code{\linkS4class{NMF}}.} \item{call}{stored call to the last \code{nmf} method that generated the object.} } } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFfit")}: Returns the name of the algorithm that fitted the NMF model \code{object}. } \item{.basis}{\code{signature(object = "NMFfit")}: Returns the basis matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.basis(fit(object), ...)}, dispatching the call to the \code{.basis} method of the actual NMF model. } \item{.basis<-}{\code{signature(object = "NMFfit", value = "matrix")}: Sets the the basis matrix of an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.basis(fit(object)) <- value}, dispatching the call to the \code{.basis<-} method of the actual NMF model. It is not meant to be used by the user, except when developing NMF algorithms, to update the basis matrix of the seed object before returning it. } \item{.coef}{\code{signature(object = "NMFfit")}: Returns the the coefficient matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.coef(fit(object), ...)}, dispatching the call to the \code{.coef} method of the actual NMF model. } \item{.coef<-}{\code{signature(object = "NMFfit", value = "matrix")}: Sets the the coefficient matrix of an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{.coef(fit(object)) <- value}, dispatching the call to the \code{.coef<-} method of the actual NMF model. It is not meant to be used by the user, except when developing NMF algorithms, to update the coefficient matrix in the seed object before returning it. } \item{compare}{\code{signature(object = "NMFfit")}: Compare multiple NMF fits passed as arguments. } \item{deviance}{\code{signature(object = "NMFfit")}: Returns the deviance of a fitted NMF model. This method returns the final residual value if the target matrix \code{y} is not supplied, or the approximation error between the fitted NMF model stored in \code{object} and \code{y}. In this case, the computation is performed using the objective function \code{method} if not missing, or the objective of the algorithm that fitted the model (stored in slot \code{'distance'}). See \code{\link{deviance,NMFfit-method}} for more details. } \item{fit}{\code{signature(object = "NMFfit")}: Returns the NMF model object stored in slot \code{'fit'}. } \item{fit<-}{\code{signature(object = "NMFfit", value = "NMF")}: Updates the NMF model object stored in slot \code{'fit'} with a new value. } \item{fitted}{\code{signature(object = "NMFfit")}: Computes and return the estimated target matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{fitted(fit(object), ...)}, dispatching the call to the \code{fitted} method of the actual NMF model. } \item{ibterms}{\code{signature(object = "NMFfit")}: Method for single NMF fit objects, which returns the indexes of fixed basis terms from the fitted model. } \item{icterms}{\code{signature(object = "NMFfit")}: Method for single NMF fit objects, which returns the indexes of fixed coefficient terms from the fitted model. } \item{icterms}{\code{signature(object = "NMFfit")}: Method for multiple NMF fit objects, which returns the indexes of fixed coefficient terms from the best fitted model. } \item{minfit}{\code{signature(object = "NMFfit")}: Returns the object its self, since there it is the result of a single NMF run. } \item{modelname}{\code{signature(object = "NMFfit")}: Returns the type of a fitted NMF model. It is a shortcut for \code{modelname(fit(object)}. } \item{niter}{\code{signature(object = "NMFfit")}: Returns the number of iteration performed to fit an NMF model, typically with function \code{\link{nmf}}. Currently this data is stored in slot \code{'extra'}, but this might change in the future. } \item{niter<-}{\code{signature(object = "NMFfit", value = "numeric")}: Sets the number of iteration performed to fit an NMF model. This function is used internally by the function \code{\link{nmf}}. It is not meant to be called by the user, except when developing new NMF algorithms implemented as single function, to set the number of iterations performed by the algorithm on the seed, before returning it (see \code{\linkS4class{NMFStrategyFunction}}). } \item{nmf.equal}{\code{signature(x = "NMFfit", y = "NMF")}: Compares two NMF models when at least one comes from a NMFfit object, i.e. an object returned by a single run of \code{\link{nmf}}. } \item{nmf.equal}{\code{signature(x = "NMFfit", y = "NMFfit")}: Compares two fitted NMF models, i.e. objects returned by single runs of \code{\link{nmf}}. } \item{NMFfitX}{\code{signature(object = "NMFfit")}: Creates an \code{NMFfitX1} object from a single fit. This is used in \code{\link{nmf}} when only the best fit is kept in memory or on disk. } \item{nrun}{\code{signature(object = "NMFfit")}: This method always returns 1, since an \code{NMFfit} object is obtained from a single NMF run. } \item{objective}{\code{signature(object = "NMFfit")}: Returns the objective function associated with the algorithm that computed the fitted NMF model \code{object}, or the objective value with respect to a given target matrix \code{y} if it is supplied. } \item{offset}{\code{signature(object = "NMFfit")}: Returns the offset from the fitted model. } \item{plot}{\code{signature(x = "NMFfit", y = "missing")}: Plots the residual track computed at regular interval during the fit of the NMF model \code{x}. } \item{residuals}{\code{signature(object = "NMFfit")}: Returns the residuals -- track -- between the target matrix and the NMF fit \code{object}. } \item{runtime}{\code{signature(object = "NMFfit")}: Returns the CPU time required to compute a single NMF fit. } \item{runtime.all}{\code{signature(object = "NMFfit")}: Identical to \code{runtime}, since their is a single fit. } \item{seeding}{\code{signature(object = "NMFfit")}: Returns the name of the seeding method that generated the starting point for the NMF algorithm that fitted the NMF model \code{object}. } \item{show}{\code{signature(object = "NMFfit")}: Show method for objects of class \code{NMFfit} } \item{summary}{\code{signature(object = "NMFfit")}: Computes summary measures for a single fit from \code{\link{nmf}}. This method adds the following measures to the measures computed by the method \code{summary,NMF}: See \code{\link{summary,NMFfit-method}} for more details. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # run default NMF algorithm on a random matrix n <- 50; r <- 3; p <- 20 V <- rmatrix(n, p) res <- nmf(V, r) # result class is NMFfit class(res) isNMFfit(res) # show result res # compute summary measures summary(res, target=V) } NMF/man/purity.Rd0000644000176200001440000001274214333176413013303 0ustar liggesusers\docType{methods} \name{purity} \alias{entropy} \alias{entropy,ANY,ANY-method} \alias{entropy,factor,ANY-method} \alias{entropy-methods} \alias{entropy,NMFfitXn,ANY-method} \alias{entropy,table,missing-method} \alias{purity} \alias{purity,ANY,ANY-method} \alias{purity,factor,ANY-method} \alias{purity-methods} \alias{purity,NMFfitXn,ANY-method} \alias{purity,table,missing-method} \title{Purity and Entropy of a Clustering} \usage{ purity(x, y, ...) entropy(x, y, ...) \S4method{purity}{NMFfitXn,ANY}(x, y, method = "best", ...) \S4method{entropy}{NMFfitXn,ANY}(x, y, method = "best", ...) } \arguments{ \item{x}{an object that can be interpreted as a factor or can generate such an object, e.g. via a suitable method \code{\link{predict}}, which gives the cluster membership for each sample.} \item{y}{a factor or an object coerced into a factor that gives the true class labels for each sample. It may be missing if \code{x} is a contingency table.} \item{...}{extra arguments to allow extension, and usually passed to the next method.} \item{method}{a character string that specifies how the value is computed. It may be either \code{'best'} or \code{'mean'} to compute the best or mean purity respectively.} } \value{ a single numeric value the entropy (i.e. a single numeric value) } \description{ The functions \code{purity} and \code{entropy} respectively compute the purity and the entropy of a clustering given \emph{a priori} known classes. The purity and entropy measure the ability of a clustering method, to recover known classes (e.g. one knows the true class labels of each sample), that are applicable even when the number of cluster is different from the number of known classes. \cite{Kim et al. (2007)} used these measures to evaluate the performance of their alternate least-squares NMF algorithm. } \details{ Suppose we are given \eqn{l} categories, while the clustering method generates \eqn{k} clusters. The purity of the clustering with respect to the known categories is given by: \deqn{Purity = \frac{1}{n} \sum_{q=1}^k \max_{1 \leq j \leq l} n_q^j} , where: \itemize{ \item \eqn{n} is the total number of samples; \item \eqn{n_q^j} is the number of samples in cluster \eqn{q} that belongs to original class \eqn{j} (\eqn{1 \leq j \leq l}). } The purity is therefore a real number in \eqn{[0,1]}. The larger the purity, the better the clustering performance. The entropy of the clustering with respect to the known categories is given by: \deqn{Entropy = - \frac{1}{n \log_2 l} \sum_{q=1}^k \sum_{j=1}^l n_q^j \log_2 \frac{n_q^j}{n_q}}{ - 1/(n log2(l) ) sum_q sum_j n(q,j) log2( n(q,j) / n_q )}, where: \itemize{ \item \eqn{n} is the total number of samples; \item \eqn{n}{n_q} is the total number of samples in cluster \eqn{q} (\eqn{1 \leq q \leq k}); \item \eqn{n_q^j}{n(q,j)} is the number of samples in cluster \eqn{q} that belongs to original class \eqn{j} (\eqn{1 \leq j \leq l}). } The smaller the entropy, the better the clustering performance. } \section{Methods}{ \describe{ \item{entropy}{\code{signature(x = "table", y = "missing")}: Computes the purity directly from the contingency table \code{x}. This is the workhorse method that is eventually called by all other methods. } \item{entropy}{\code{signature(x = "factor", y = "ANY")}: Computes the purity on the contingency table of \code{x} and \code{y}, that is coerced into a factor if necessary. } \item{entropy}{\code{signature(x = "ANY", y = "ANY")}: Default method that should work for results of clustering algorithms, that have a suitable \code{predict} method that returns the cluster membership vector: the purity is computed between \code{x} and \code{predict{y}} } \item{entropy}{\code{signature(x = "NMFfitXn", y = "ANY")}: Computes the best or mean entropy across all NMF fits stored in \code{x}. } \item{purity}{\code{signature(x = "table", y = "missing")}: Computes the purity directly from the contingency table \code{x} } \item{purity}{\code{signature(x = "factor", y = "ANY")}: Computes the purity on the contingency table of \code{x} and \code{y}, that is coerced into a factor if necessary. } \item{purity}{\code{signature(x = "ANY", y = "ANY")}: Default method that should work for results of clustering algorithms, that have a suitable \code{predict} method that returns the cluster membership vector: the purity is computed between \code{x} and \code{predict{y}} } \item{purity}{\code{signature(x = "NMFfitXn", y = "ANY")}: Computes the best or mean purity across all NMF fits stored in \code{x}. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) n <- 50; counts <- c(5, 5, 8); V <- syntheticNMF(n, counts) cl <- unlist(mapply(rep, 1:3, counts)) # perform default NMF with rank=2 x2 <- nmf(V, 2) purity(x2, cl) entropy(x2, cl) # perform default NMF with rank=2 x3 <- nmf(V, 3) purity(x3, cl) entropy(x3, cl) } \references{ Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . } \seealso{ Other assess: \code{\link{sparseness}} } \keyword{methods} NMF/man/runtime.all-commaNMFfitXn-method.Rd0000644000176200001440000000164414333176413020122 0ustar liggesusers\docType{methods} \name{runtime.all,NMFfitXn-method} \alias{runtime.all,NMFfitXn-method} \title{Returns the CPU time used to perform all the NMF fits stored in \code{object}.} \usage{ \S4method{runtime.all}{NMFfitXn}(object, null = FALSE, warning = TRUE) } \arguments{ \item{null}{a logical that indicates if the sequential time should be returned if no time data is available in slot \sQuote{runtime.all}.} \item{warning}{a logical that indicates if a warning should be thrown if the sequential time is returned instead of the real CPU time.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} } \description{ If no time data is available from in slot \sQuote{runtime.all} and argument \code{null=TRUE}, then the sequential time as computed by \code{\link{seqtime}} is returned, and a warning is thrown unless \code{warning=FALSE}. } \keyword{methods} NMF/man/NMFStrategyFunction-class.Rd0000644000176200001440000000334014333176413016715 0ustar liggesusers\docType{class} \name{NMFStrategyFunction-class} \alias{NMFStrategyFunction-class} \title{Interface for Single Function NMF Strategies} \description{ This class implements the virtual interface \code{\link{NMFStrategy}} for NMF algorithms that are implemented by a single workhorse R function. } \section{Slots}{ \describe{ \item{algorithm}{a function that implements an NMF algorithm. It must have signature \code{(y='matrix', x='NMFfit')}, where \code{y} is the target matrix to approximate and \code{x} is the NMF model assumed to be seeded with an appropriate initial value -- as it is done internally by function \code{\link{nmf}}. Note that argument names currently do not matter, but it is recommended to name them as specified above.} } } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFStrategyFunction")}: Returns the single R function that implements the NMF algorithm -- as stored in slot \code{algorithm}. } \item{algorithm<-}{\code{signature(object = "NMFStrategyFunction", value = "function")}: Sets the function that implements the NMF algorithm, stored in slot \code{algorithm}. } \item{run}{\code{signature(object = "NMFStrategyFunction", y = "matrix", x = "NMFfit")}: Runs the NMF algorithms implemented by the single R function -- and stored in slot \code{'algorithm'} of \code{object}, on the data object \code{y}, using \code{x} as starting point. It is equivalent to calling \code{object@algorithm(y, x, ...)}. This method is usually not called directly, but only via the function \code{\link{nmf}}, which takes care of many other details such as seeding the computation, handling RNG settings, or setting up parallelisation. } } } NMF/man/smoothing.Rd0000644000176200001440000000172114333176413013751 0ustar liggesusers\name{smoothing} \alias{smoothing} \title{Smoothing Matrix in Nonsmooth NMF Models} \usage{ smoothing(x, theta = x@theta, ...) } \arguments{ \item{x}{a object of class \code{NMFns}.} \item{theta}{the smoothing parameter (numeric) between 0 and 1.} \item{...}{extra arguments to allow extension (not used)} } \value{ if \code{x} estimates a \eqn{r}-rank NMF, then the result is a \eqn{r \times r} square matrix. } \description{ The function \code{smoothing} builds a smoothing matrix for using in Nonsmooth NMF models. } \details{ For a \eqn{r}-rank NMF, the smoothing matrix of parameter \eqn{\theta} is built as follows: \deqn{S = (1-\theta)I + \frac{\theta}{r} 11^T ,} where \eqn{I} is the identity matrix and \eqn{1} is a vector of ones (cf. \code{\link{NMFns-class}} for more details). } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } x <- nmfModel(3, model='NMFns') smoothing(x) smoothing(x, 0.1) } NMF/man/Frobenius-nmf.Rd0000644000176200001440000001214014335211051014437 0ustar liggesusers\name{nmf_update.lee_R} \alias{Frobenius-nmf} \alias{lee-nmf} \alias{lee_R-nmf} \alias{nmfAlgorithm.Frobenius} \alias{nmfAlgorithm.lee} \alias{nmfAlgorithm.lee_R} \alias{nmf_update.lee} \alias{nmf_update.lee_R} \title{NMF Algorithm/Updates for Frobenius Norm} \usage{ nmf_update.lee_R(i, v, x, rescale = TRUE, eps = 10^-9, ...) nmf_update.lee(i, v, x, rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL, ...) nmfAlgorithm.lee_R(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, rescale = TRUE, eps = 10^-9, stopconv = 40, check.interval = 10) nmfAlgorithm.lee(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL, stopconv = 40, check.interval = 10) nmfAlgorithm.Frobenius(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL, stationary.th = .Machine$double.eps, check.interval = 5 * check.niter, check.niter = 10L) } \arguments{ \item{rescale}{logical that indicates if the basis matrix \eqn{W} should be rescaled so that its columns sum up to one.} \item{i}{current iteration number.} \item{v}{target matrix.} \item{x}{current NMF model, as an \code{\linkS4class{NMF}} object.} \item{eps}{small numeric value used to ensure numeric stability, by shifting up entries from zero to this fixed value.} \item{...}{extra arguments. These are generally not used and present only to allow other arguments from the main call to be passed to the initialisation and stopping criterion functions (slots \code{onInit} and \code{Stop} respectively).} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{stopconv}{number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} \item{stationary.th}{maximum absolute value of the gradient, for the objective function to be considered stationary.} \item{check.niter}{number of successive iteration used to compute the stationnary criterion.} \item{weight}{numeric vector of sample weights, e.g., used to normalise samples coming from multiple datasets. It must be of the same length as the number of samples/columns in \code{v} -- and \code{h}.} } \description{ The built-in NMF algorithms described here minimise the Frobenius norm (Euclidean distance) between an NMF model and a target matrix. They use the updates for the basis and coefficient matrices (\eqn{W} and \eqn{H}) defined by \cite{Lee et al. (2001)}. \code{nmf_update.lee} implements in C++ an optimised version of the single update step. Algorithms \sQuote{lee} and \sQuote{.R#lee} provide the complete NMF algorithm from \cite{Lee et al. (2001)}, using the C++-optimised and pure R updates \code{\link{nmf_update.lee}} and \code{\link{nmf_update.lee_R}} respectively. Algorithm \sQuote{Frobenius} provides an NMF algorithm based on the C++-optimised version of the updates from \cite{Lee et al. (2001)}, which uses the stationarity of the objective value as a stopping criterion \code{\link{nmf.stop.stationary}}, instead of the stationarity of the connectivity matrix \code{\link{nmf.stop.connectivity}} as used by \sQuote{lee}. } \details{ \code{nmf_update.lee_R} implements in pure R a single update step, i.e. it updates both matrices. } \author{ Original update definition: D D Lee and HS Seung Port to R and optimisation in C++: Renaud Gaujoux } \references{ Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/terms-internal.Rd0000644000176200001440000000226714333176413014714 0ustar liggesusers\docType{methods} \name{bterms<-} \alias{bterms<-} \alias{bterms<--methods} \alias{bterms<-,NMFstd-method} \alias{cterms<-} \alias{cterms<--methods} \alias{cterms<-,NMFstd-method} \title{Fixed Terms in NMF Models} \usage{ bterms(object)<-value cterms(object)<-value } \arguments{ \item{object}{NMF object to be updated.} \item{value}{specification of the replacement value for fixed-terms.} } \description{ These functions are for internal use and should not be called by the end-user. \code{cterms<-} sets fixed coefficient terms or indexes and should only be called on a newly created NMF object, i.e. in the constructor/factory generic \code{\link{nmfModel}}. } \details{ They use \code{\link{model.matrix}(~ -1 + ., data=value)} to generate suitable term matrices. } \section{Methods}{ \describe{ \item{bterms<-}{\code{signature(object = "NMFstd")}: Default method tries to coerce \code{value} into a \code{data.frame} with \code{\link{as.data.frame}}. } \item{cterms<-}{\code{signature(object = "NMFstd")}: Default method tries to coerce \code{value} into a \code{data.frame} with \code{\link{as.data.frame}}. } } } \keyword{internal} \keyword{methods} NMF/man/offset-nmf.Rd0000644000176200001440000001220714335211177014006 0ustar liggesusers\name{nmf_update.euclidean_offset.h} \alias{nmfAlgorithm.offset} \alias{nmfAlgorithm.offset_R} \alias{nmf_update.euclidean_offset.h} \alias{nmf_update.euclidean_offset.w} \alias{nmf_update.offset} \alias{nmf_update.offset_R} \alias{offset_R-nmf} \title{NMF Multiplicative Update for NMF with Offset Models} \usage{ nmf_update.euclidean_offset.h(v, w, h, offset, eps = 10^-9, copy = TRUE) nmf_update.euclidean_offset.w(v, w, h, offset, eps = 10^-9, copy = TRUE) nmf_update.offset_R(i, v, x, eps = 10^-9, ...) nmf_update.offset(i, v, x, copy = FALSE, eps = 10^-9, ...) nmfAlgorithm.offset_R(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, eps = 10^-9, stopconv = 40, check.interval = 10) nmfAlgorithm.offset(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, copy = FALSE, eps = 10^-9, stopconv = 40, check.interval = 10) } \arguments{ \item{offset}{current value of the offset/intercept vector. It must be of length equal to the number of rows in the target matrix.} \item{v}{target matrix.} \item{eps}{small numeric value used to ensure numeric stability, by shifting up entries from zero to this fixed value.} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} \item{i}{current iteration number.} \item{x}{current NMF model, as an \code{\linkS4class{NMF}} object.} \item{...}{extra arguments. These are generally not used and present only to allow other arguments from the main call to be passed to the initialisation and stopping criterion functions (slots \code{onInit} and \code{Stop} respectively).} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{stopconv}{number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} \item{w}{current basis matrix} \item{h}{current coefficient matrix} } \value{ an \code{\linkS4class{NMFOffset}} model object. } \description{ These update rules proposed by \cite{Badea (2008)} are modified version of the updates from \cite{Lee et al. (2001)}, that include an offset/intercept vector, which models a common baseline for each feature accross all samples: \deqn{V \approx W H + I} \code{nmf_update.euclidean_offset.h} and \code{nmf_update.euclidean_offset.w} compute the updated NMFOffset model, using the optimized \emph{C++} implementations. \code{nmf_update.offset_R} implements a complete single update step, using plain R updates. \code{nmf_update.offset} implements a complete single update step, using C++-optimised updates. Algorithms \sQuote{offset} and \sQuote{.R#offset} provide the complete NMF-with-offset algorithm from \cite{Badea (2008)}, using the C++-optimised and pure R updates \code{\link{nmf_update.offset}} and \code{\link{nmf_update.offset_R}} respectively. } \details{ The associated model is defined as an \code{\linkS4class{NMFOffset}} object. The details of the multiplicative updates can be found in \cite{Badea (2008)}. Note that the updates are the ones defined for a single datasets, not the simultaneous NMF model, which is fit by algorithm \sQuote{siNMF} from formula-based NMF models. } \author{ Original update definition: Liviu Badea Port to R and optimisation in C++: Renaud Gaujoux } \references{ Badea L (2008). "Extracting gene expression profiles common to colon and pancreatic adenocarcinoma using simultaneous nonnegative matrix factorization." _Pacific Symposium on Biocomputing. Pacific Symposium on Biocomputing_, *290*, pp. 267-78. ISSN 1793-5091, . Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/heatmaps.Rd0000644000176200001440000003661014333176413013551 0ustar liggesusers\docType{methods} \name{heatmap-NMF} \alias{basismap} \alias{basismap-methods} \alias{basismap,NMFfitX-method} \alias{basismap,NMF-method} \alias{coefmap} \alias{coefmap-methods} \alias{coefmap,NMFfitX-method} \alias{coefmap,NMF-method} \alias{consensusmap} \alias{consensusmap,matrix-method} \alias{consensusmap-methods} \alias{consensusmap,NMFfitX-method} \alias{consensusmap,NMF-method} \alias{heatmap-NMF} \title{Heatmaps of NMF Factors} \usage{ basismap(object, ...) \S4method{basismap}{NMF}(object, color = "YlOrRd:50", scale = "r1", Rowv = TRUE, Colv = NA, subsetRow = FALSE, annRow = NA, annCol = NA, tracks = "basis", main = "Basis components", info = FALSE, ...) coefmap(object, ...) \S4method{coefmap}{NMF}(object, color = "YlOrRd:50", scale = "c1", Rowv = NA, Colv = TRUE, annRow = NA, annCol = NA, tracks = "basis", main = "Mixture coefficients", info = FALSE, ...) consensusmap(object, ...) \S4method{consensusmap}{NMFfitX}(object, annRow = NA, annCol = NA, tracks = c("basis:", "consensus:", "silhouette:"), main = "Consensus matrix", info = FALSE, ...) \S4method{consensusmap}{matrix}(object, color = "-RdYlBu", distfun = function(x) as.dist(1 - x), hclustfun = "average", Rowv = TRUE, Colv = "Rowv", main = if (is.null(nr) || nr > 1) "Consensus matrix" else "Connectiviy matrix", info = FALSE, ...) \S4method{coefmap}{NMFfitX}(object, Colv = TRUE, annRow = NA, annCol = NA, tracks = c("basis", "consensus:"), ...) } \arguments{ \item{object}{an object from which is extracted NMF factors or a consensus matrix} \item{...}{extra arguments passed to \code{\link{aheatmap}}.} \item{subsetRow}{Argument that specifies how to filter the rows that will appear in the heatmap. When \code{FALSE} (default), all rows are used. Besides the values supported by argument \code{subsetRow} of \code{\link{aheatmap}}, other possible values are: \itemize{ \item \code{TRUE}: only the rows that are basis-specific are used. The default selection method is from \cite{KimH2007}. This is equivalent to \code{subsetRow='kim'}. \item a single \code{character} string or numeric value that specifies the method to use to select the basis-specific rows, that should appear in the heatmap (cf. argument \code{method} for function \code{\link{extractFeatures}}). Note \code{\link{extractFeatures}} is called with argument \code{nodups=TRUE}, so that features that are selected for multiple components only appear once. }} \item{tracks}{Special additional annotation tracks to highlight associations between basis components and sample clusters: \describe{ \item{basis}{matches each row (resp. column) to the most contributing basis component in \code{basismap} (resp. \code{coefmap}). In \code{basismap} (resp. \code{coefmap}), adding a track \code{':basis'} to \code{annCol} (resp. \code{annRow}) makes the column (resp. row) corresponding to the component being also highlited using the mathcing colours.} }} \item{info}{if \code{TRUE} then the name of the algorithm that fitted the NMF model is displayed at the bottom of the plot, if available. Other wise it is passed as is to \code{aheatmap}.} \item{color}{colour specification for the heatmap. Default to palette '-RdYlBu2:100', i.e. reversed palette 'RdYlBu2' (a slight modification of RColorBrewer's palette 'RdYlBu') with 100 colors. Possible values are: \itemize{ \item a character/integer vector of length greater than 1 that is directly used and assumed to contain valid R color specifications. \item a single color/integer (between 0 and 8)/other numeric value that gives the dominant colors. Numeric values are converted into a pallete by \code{rev(sequential_hcl(2, h = x, l = c(50, 95)))}. Other values are concatenated with the grey colour '#F1F1F1'. \item one of RColorBrewer's palette name (see \code{\link[RColorBrewer]{display.brewer.all}}) , or one of 'RdYlBu2', 'rainbow', 'heat', 'topo', 'terrain', 'cm'. } When the coluor palette is specified with a single value, and is negative or preceded a minus ('-'), the reversed palette is used. The number of breaks can also be specified after a colon (':'). For example, the default colour palette is specified as '-RdYlBu2:100'.} \item{scale}{character indicating how the values should scaled in either the row direction or the column direction. Note that the scaling is performed after row/column clustering, so that it has no effect on the row/column ordering. Possible values are: \itemize{ \item \code{"row"}: center and standardize each row separately to row Z-scores \item \code{"column"}: center and standardize each column separately to column Z-scores \item \code{"r1"}: scale each row to sum up to one \item \code{"c1"}: scale each column to sum up to one \item \code{"none"}: no scaling }} \item{Rowv}{clustering specification(s) for the rows. It allows to specify the distance/clustering/ordering/display parameters to be used for the \emph{rows only}. Possible values are: \itemize{ \item \code{TRUE} or \code{NULL} (to be consistent with \code{\link{heatmap}}): compute a dendrogram from hierarchical clustering using the distance and clustering methods \code{distfun} and \code{hclustfun}. \item \code{NA}: disable any ordering. In this case, and if not otherwise specified with argument \code{revC=FALSE}, the heatmap shows the input matrix with the rows in their original order, with the first row on top to the last row at the bottom. Note that this differ from the behaviour or \code{\link{heatmap}}, but seemed to be a more sensible choice when vizualizing a matrix without reordering. \item an integer vector of length the number of rows of the input matrix (\code{nrow(x)}), that specifies the row order. As in the case \code{Rowv=NA}, the ordered matrix is shown first row on top, last row at the bottom. \item a character vector or a list specifying values to use instead of arguments \code{distfun}, \code{hclustfun} and \code{reorderfun} when clustering the rows (see the respective argument descriptions for a list of accepted values). If \code{Rowv} has no names, then the first element is used for \code{distfun}, the second (if present) is used for \code{hclustfun}, and the third (if present) is used for \code{reorderfun}. \item a numeric vector of weights, of length the number of rows of the input matrix, used to reorder the internally computed dendrogram \code{d} by \code{reorderfun(d, Rowv)}. \item \code{FALSE}: the dendrogram \emph{is} computed using methods \code{distfun}, \code{hclustfun}, and \code{reorderfun} but is not shown. \item a single integer that specifies how many subtrees (i.e. clusters) from the computed dendrogram should have their root faded out. This can be used to better highlight the different clusters. \item a single double that specifies how much space is used by the computed dendrogram. That is that this value is used in place of \code{treeheight}. }} \item{Colv}{clustering specification(s) for the columns. It accepts the same values as argument \code{Rowv} (modulo the expected length for vector specifications), and allow specifying the distance/clustering/ordering/display parameters to be used for the \emph{columns only}. \code{Colv} may also be set to \code{"Rowv"}, in which case the dendrogram or ordering specifications applied to the rows are also applied to the columns. Note that this is allowed only for square input matrices, and that the row ordering is in this case by default reversed (\code{revC=TRUE}) to obtain the diagonal in the standard way (from top-left to bottom-right). See argument \code{Rowv} for other possible values.} \item{annRow}{specifications of row annotation tracks displayed as coloured columns on the left of the heatmaps. The annotation tracks are drawn from left to right. The same conversion, renaming and colouring rules as for argument \code{annCol} apply.} \item{annCol}{specifications of column annotation tracks displayed as coloured rows on top of the heatmaps. The annotation tracks are drawn from bottom to top. A single annotation track can be specified as a single vector; multiple tracks are specified as a list, a data frame, or an \emph{ExpressionSet} object, in which case the phenotypic data is used (\code{pData(eset)}). Character or integer vectors are converted and displayed as factors. Unnamed tracks are internally renamed into \code{Xi}, with i being incremented for each unamed track, across both column and row annotation tracks. For each track, if no corresponding colour is specified in argument \code{annColors}, a palette or a ramp is automatically computed and named after the track's name.} \item{main}{Main title as a character string or a grob.} \item{distfun}{default distance measure used in clustering rows and columns. Possible values are: \itemize{ \item all the distance methods supported by \code{\link{dist}} (e.g. "euclidean" or "maximum"). \item all correlation methods supported by \code{\link{cor}}, such as \code{"pearson"} or \code{"spearman"}. The pairwise distances between rows/columns are then computed as \code{d <- dist(1 - cor(..., method = distfun))}. One may as well use the string "correlation" which is an alias for "pearson". \item an object of class \code{dist} such as returned by \code{\link{dist}} or \code{\link{as.dist}}. }} \item{hclustfun}{default clustering method used to cluster rows and columns. Possible values are: \itemize{ \item a method name (a character string) supported by \code{\link{hclust}} (e.g. \code{'average'}). \item an object of class \code{hclust} such as returned by \code{\link{hclust}} \item a dendrogram }} } \description{ The NMF package ships an advanced heatmap engine implemented by the function \code{\link{aheatmap}}. Some convenience heatmap functions have been implemented for NMF models, which redefine default values for some of the arguments of \code{\link{aheatmap}}, hence tuning the output specifically for NMF models. } \details{ \strong{IMPORTANT:} although they essentially have the same set of arguments, their order sometimes differ between them, as well as from \code{\link{aheatmap}}. We therefore strongly recommend to use fully named arguments when calling these functions. \code{basimap} default values for the following arguments of \code{\link{aheatmap}}: \itemize{ \item the color palette; \item the scaling specification, which by default scales each row separately so that they sum up to one (\code{scale='r1'}); \item the column ordering which is disabled; \item allowing for passing feature extraction methods in argument \code{subsetRow}, that are passed to \code{\link{extractFeatures}}. See argument description here and therein. \item the addition of a default named annotation track, that shows the dominant basis component for each row (i.e. each feature). This track is specified in argument \code{tracks} (see its argument description). By default, a matching column annotation track is also displayed, but may be disabled using \code{tracks=':basis'}. \item a suitable title and extra information like the fitting algorithm, when \code{object} is a fitted NMF model. } \code{coefmap} redefines default values for the following arguments of \code{\link{aheatmap}}: \itemize{ \item the color palette; \item the scaling specification, which by default scales each column separately so that they sum up to one (\code{scale='c1'}); \item the row ordering which is disabled; \item the addition of a default annotation track, that shows the most contributing basis component for each column (i.e. each sample). This track is specified in argument \code{tracks} (see its argument description). By default, a matching row annotation track is also displayed, but can be disabled using \code{tracks='basis:'}. \item a suitable title and extra information like the fitting algorithm, when \code{object} is a fitted NMF model. } \code{consensusmap} redefines default values for the following arguments of \code{\link{aheatmap}}: \itemize{ \item the colour palette; \item the column ordering which is set equal to the row ordering, since a consensus matrix is symmetric; \item the distance and linkage methods used to order the rows (and columns). The default is to use 1 minus the consensus matrix itself as distance, and average linkage. \item the addition of two special named annotation tracks, \code{'basis:'} and \code{'consensus:'}, that show, for each column (i.e. each sample), the dominant basis component in the best fit and the hierarchical clustering of the consensus matrix respectively (using 1-consensus as distance and average linkage). These tracks are specified in argument \code{tracks}, which behaves as in \code{\link{basismap}}. \item a suitable title and extra information like the type of NMF model or the fitting algorithm, when \code{object} is a fitted NMF model. } } \section{Methods}{ \describe{ \item{basismap}{\code{signature(object = "NMF")}: Plots a heatmap of the basis matrix of the NMF model \code{object}. This method also works for fitted NMF models (i.e. \code{NMFfit} objects). } \item{basismap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the basis matrix of the best fit in \code{object}. } \item{coefmap}{\code{signature(object = "NMF")}: The default method for NMF objects has special default values for some arguments of \code{\link{aheatmap}} (see argument description). } \item{coefmap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the coefficient matrix of the best fit in \code{object}. This method adds: \itemize{ \item an extra special column annotation track for multi-run NMF fits, \code{'consensus:'}, that shows the consensus cluster associated to each sample. \item a column sorting schema \code{'consensus'} that can be passed to argument \code{Colv} and orders the columns using the hierarchical clustering of the consensus matrix with average linkage, as returned by \code{\link{consensushc}(object)}. This is also the ordering that is used by default for the heatmap of the consensus matrix as ploted by \code{\link{consensusmap}}. } } \item{consensusmap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the consensus matrix obtained when fitting an NMF model with multiple runs. } \item{consensusmap}{\code{signature(object = "NMF")}: Plots a heatmap of the connectivity matrix of an NMF model. } \item{consensusmap}{\code{signature(object = "matrix")}: Main method that redefines default values for arguments of \code{\link{aheatmap}}. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # heatmap-NMF #---------- ## More examples are provided in demo `heatmaps` \dontrun{ demo(heatmaps) } ## # random data with underlying NMF model v <- syntheticNMF(20, 3, 10) # estimate a model x <- nmf(v, 3) #---------- # basismap #---------- # show basis matrix basismap(x) \dontrun{ # without the default annotation tracks basismap(x, tracks=NA) } #---------- # coefmap #---------- # coefficient matrix coefmap(x) \dontrun{ # without the default annotation tracks coefmap(x, tracks=NA) } #---------- # consensusmap #---------- \dontrun{ res <- nmf(x, 3, nrun=3) consensusmap(res) } } \keyword{methods} NMF/man/nmfWrapper.Rd0000644000176200001440000000371614333176413014071 0ustar liggesusers\name{nmfWrapper} \alias{nmfWrapper} \title{Wrapping NMF Algorithms} \usage{ nmfWrapper(method, ..., .FIXED = FALSE) } \arguments{ \item{method}{Name of the NMF algorithm to be wrapped. It should be the name of a registered algorithm as returned by \code{\link{nmfAlgorithm}}, or an NMF algorithm object (i.e. an instance of \code{\linkS4class{NMFStrategy}}).} \item{...}{extra named arguments that define default values for any arguments of \code{\link{nmf}} or the algorithm itself.} \item{.FIXED}{a logical that indicates if the default arguments defined in \code{...} must be considered as fixed, i.e. that they are forced to have the defined values and cannot be used in a call to the wrapper function, in which case, a warning about discarding them is thrown if they are used. Non fixed arguments may have their value changed at call time, in which case it is honoured and passed to the \code{nmf} call. \code{.FIXED} may also be a character vector that specifies which argument amongst \code{...} should be considered as fixed.} } \value{ a function with argument \code{...} and a set of default arguments defined in \code{...} in the call to \code{nmfWrapper}. } \description{ This function creates a wrapper function for calling the function \code{\link{nmf}} with a given NMF algorithm. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # wrap Lee & Seung algorithm into a function lee <- nmfWrapper('lee', seed=12345) args(lee) # test on random data x <- rmatrix(100,20) res <- nmf(x, 3, 'lee', seed=12345) res2 <- lee(x, 3) nmf.equal(res, res2) res3 <- lee(x, 3, seed=123) nmf.equal(res, res3) \dontshow{ stopifnot(nmf.equal(res, res2)) stopifnot( !nmf.equal(res, res3)) } # argument 'method' has no effect res4 <- lee(x, 3, method='brunet') nmf.equal(res, res4) \dontshow{ stopifnot(nmf.equal(res, res4)) } } \seealso{ \code{\link{nmfAlgorithm}}, \code{\link{nmf}} } \keyword{internal} NMF/man/residuals.Rd0000644000176200001440000000633314333176413013741 0ustar liggesusers\docType{methods} \name{residuals} \alias{hasTrack} \alias{residuals} \alias{residuals<-} \alias{residuals<--methods} \alias{residuals-methods} \alias{residuals<-,NMFfit-method} \alias{residuals,NMFfit-method} \alias{residuals,NMFfitX-method} \alias{trackError} \title{Residuals in NMF Models} \usage{ residuals(object, ...) \S4method{residuals}{NMFfit}(object, track = FALSE, niter = NULL, ...) residuals(object, ...)<-value \S4method{residuals}{NMFfit}(object, ..., niter = NULL, track = FALSE)<-value hasTrack(object, niter = NULL) trackError(object, value, niter, force = FALSE) } \arguments{ \item{object}{an \code{NMFfit} object as fitted by function \code{\link{nmf}}, in single run mode.} \item{...}{extra parameters (not used)} \item{track}{a logical that indicates if the complete track of residuals should be returned (if it has been computed during the fit), or only the last value.} \item{niter}{specifies the iteration number for which one wants to get/set/test a residual value. This argument is used only if not \code{NULL}} \item{value}{residual value} \item{force}{logical that indicates if the value should be added to the track even if there already is a value for this iteration number or if the iteration does not conform to the tracking interval \code{nmf.getOption('track.interval')}.} } \value{ \code{residuals} returns a single numeric value if \code{track=FALSE} or a numeric vector containing the residual values at some iterations. The names correspond to the iterations at which the residuals were computed. } \description{ The package NMF defines methods for the function \code{\link[stats]{residuals}} that returns the final residuals of an NMF fit or the track of the residuals along the fit process, computed according to the objective function associated with the algorithm that fitted the model. \code{residuals<-} sets the value of the last residuals, or, optionally, of the complete residual track. Tells if an \code{NMFfit} object contains a recorded residual track. \code{trackError} adds a residual value to the track of residuals. } \details{ When called with \code{track=TRUE}, the whole residuals track is returned, if available. Note that method \code{\link{nmf}} does not compute the residuals track, unless explicitly required. It is a S4 methods defined for the associated generic functions from package \code{stats} (See \link[stats]{residuals}). } \note{ Stricly speaking, the method \code{residuals,NMFfit} does not fulfill its contract as defined by the package \code{stats}, but rather acts as function \code{deviance}. The might be changed in a later release to make it behave as it should. } \section{Methods}{ \describe{ \item{residuals}{\code{signature(object = "NMFfit")}: Returns the residuals -- track -- between the target matrix and the NMF fit \code{object}. } \item{residuals}{\code{signature(object = "NMFfitX")}: Returns the residuals achieved by the best fit object, i.e. the lowest residual approximation error achieved across all NMF runs. } } } \seealso{ Other stats: \code{\link{deviance}}, \code{\link{deviance,NMF-method}}, \code{\link{nmfDistance}} } \keyword{methods} NMF/man/staticVar.Rd0000644000176200001440000000155214333176413013704 0ustar liggesusers\name{staticVar} \alias{staticVar} \title{Get/Set a Static Variable in NMF Algorithms} \usage{ staticVar(name, value, init = FALSE) } \arguments{ \item{name}{Name of the static variable (as a single character string)} \item{value}{New value of the static variable} \item{init}{a logical used when a \code{value} is provided, that specifies if the variable should be set to the new value only if it does not exist yet (\code{init=TRUE}).} } \value{ The value of the static variable } \description{ This function is used in iterative NMF algorithms to manage variables stored in a local workspace, that are accessible to all functions that define the iterative schema described in \code{\linkS4class{NMFStrategyIterative}}. It is specially useful for computing stopping criteria, which often require model data from different iterations. } NMF/man/nmfCheck.Rd0000644000176200001440000000154014333176413013457 0ustar liggesusers\name{nmfCheck} \alias{nmfCheck} \title{Checking NMF Algorithm} \usage{ nmfCheck(method = NULL, rank = max(ncol(x)/5, 3), x = NULL, seed = 1234, ...) } \arguments{ \item{method}{name of the NMF algorithm to be tested.} \item{rank}{rank of the factorization} \item{x}{target data. If \code{NULL}, a random 20 x 10 matrix is generated} \item{seed}{specifies a seed or seeding method for the computation.} \item{...}{other arguments passed to the call to \code{\link{nmf}}.} } \value{ the result of the NMF fit invisibly. } \description{ \code{nmfCheck} enables to quickly check that a given NMF algorithm runs properly, by applying it to some small random data. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # test default algorithm nmfCheck() # test 'lee' algorithm nmfCheck('lee') } NMF/man/utils.Rd0000644000176200001440000000105414333176413013101 0ustar liggesusers\name{utils-NMF} \alias{str_args} \alias{utils-NMF} \title{Utility Function in the NMF Package} \usage{ str_args(x, exdent = 10L) } \arguments{ \item{x}{a function} \item{exdent}{indentation for extra lines if the output takes more than one line.} } \description{ Utility Function in the NMF Package \code{str_args} formats the arguments of a function using \code{\link{args}}, but returns the output as a string. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } args(library) str_args(library) } NMF/man/cophcor.Rd0000644000176200001440000000404314333176413013377 0ustar liggesusers\docType{methods} \name{cophcor} \alias{cophcor} \alias{cophcor,matrix-method} \alias{cophcor-methods} \alias{cophcor,NMFfitX-method} \title{Cophenetic Correlation Coefficient} \usage{ cophcor(object, ...) \S4method{cophcor}{matrix}(object, linkage = "average") } \arguments{ \item{object}{an object from which is extracted a consensus matrix.} \item{...}{extra arguments to allow extension and passed to subsequent calls.} \item{linkage}{linkage method used in the hierarchical clustering. It is passed to \code{\link{hclust}}.} } \description{ The function \code{cophcor} computes the cophenetic correlation coefficient from consensus matrix \code{object}, e.g. as obtained from multiple NMF runs. } \details{ The cophenetic correlation coeffificient is based on the consensus matrix (i.e. the average of connectivity matrices) and was proposed by \cite{Brunet et al. (2004)} to measure the stability of the clusters obtained from NMF. It is defined as the Pearson correlation between the samples' distances induced by the consensus matrix (seen as a similarity matrix) and their cophenetic distances from a hierachical clustering based on these very distances (by default an average linkage is used). See \cite{Brunet et al. (2004)}. } \section{Methods}{ \describe{ \item{cophcor}{\code{signature(object = "matrix")}: Workhorse method for matrices. } \item{cophcor}{\code{signature(object = "NMFfitX")}: Computes the cophenetic correlation coefficient on the consensus matrix of \code{object}. All arguments in \code{...} are passed to the method \code{cophcor,matrix}. } } } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . } \seealso{ \code{\link{cophenetic}} } \keyword{methods} NMF/man/consensus-commaNMFfitX1-method.Rd0000644000176200001440000000132514333176413017607 0ustar liggesusers\docType{methods} \name{consensus,NMFfitX1-method} \alias{consensus,NMFfitX1-method} \title{Returns the consensus matrix computed while performing all NMF runs, amongst which \code{object} was selected as the best fit.} \usage{ \S4method{consensus}{NMFfitX1}(object, no.attrib = FALSE) } \arguments{ \item{object}{an object with a suitable \code{\link{predict}} method.} \item{no.attrib}{a logical that indicates if attributes containing information about the NMF model should be attached to the result (\code{TRUE}) or not (\code{FALSE}).} } \description{ The result is the matrix stored in slot \sQuote{consensus}. This method returns \code{NULL} if the consensus matrix is empty. } \keyword{methods} NMF/man/plot-commaNMFfit-commamissing-method.Rd0000644000176200001440000000443614333176413021026 0ustar liggesusers\docType{methods} \name{plot,NMFfit,missing-method} \alias{plot,NMFfit,missing-method} \title{Plots the residual track computed at regular interval during the fit of the NMF model \code{x}.} \usage{ \S4method{plot}{NMFfit,missing}(x, y, skip = -1, ...) } \arguments{ \item{skip}{an integer that indicates the number of points to skip/remove from the beginning of the curve. If \code{skip=1L} (default) only the initial residual -- that is computed before any iteration, is skipped, if present in the track (it associated with iteration 0).} \item{x}{the coordinates of points in the plot. Alternatively, a single plotting structure, function or \emph{any \R object with a \code{plot} method} can be provided.} \item{y}{the y coordinates of points in the plot, \emph{optional} if \code{x} is an appropriate structure.} \item{...}{Arguments to be passed to methods, such as \link{graphical parameters} (see \code{\link{par}}). Many methods will accept the following arguments: \describe{ \item{\code{type}}{what type of plot should be drawn. Possible types are \itemize{ \item \code{"p"} for \bold{p}oints, \item \code{"l"} for \bold{l}ines, \item \code{"b"} for \bold{b}oth, \item \code{"c"} for the lines part alone of \code{"b"}, \item \code{"o"} for both \sQuote{\bold{o}verplotted}, \item \code{"h"} for \sQuote{\bold{h}istogram} like (or \sQuote{high-density}) vertical lines, \item \code{"s"} for stair \bold{s}teps, \item \code{"S"} for other \bold{s}teps, see \sQuote{Details} below, \item \code{"n"} for no plotting. } All other \code{type}s give a warning or an error; using, e.g., \code{type = "punkte"} being equivalent to \code{type = "p"} for S compatibility. Note that some methods, e.g. \code{\link{plot.factor}}, do not accept this. } \item{\code{main}}{an overall title for the plot: see \code{\link{title}}.} \item{\code{sub}}{a sub title for the plot: see \code{\link{title}}.} \item{\code{xlab}}{a title for the x axis: see \code{\link{title}}.} \item{\code{ylab}}{a title for the y axis: see \code{\link{title}}.} \item{\code{asp}}{the \eqn{y/x} aspect ratio, see \code{\link{plot.window}}.} } } } \description{ Plots the residual track computed at regular interval during the fit of the NMF model \code{x}. } \keyword{methods} NMF/man/show-commaNMFns-method.Rd0000644000176200001440000000044514333176413016176 0ustar liggesusers\docType{methods} \name{show,NMFns-method} \alias{show,NMFns-method} \title{Show method for objects of class \code{NMFns}} \usage{ \S4method{show}{NMFns}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFns} } \keyword{methods} NMF/man/predict.Rd0000644000176200001440000001161214333176413013374 0ustar liggesusers\docType{methods} \name{predict} \alias{predict} \alias{predict-methods} \alias{predict,NMFfitX-method} \alias{predict,NMF-method} \title{Clustering and Prediction} \usage{ predict(object, ...) \S4method{predict}{NMF}(object, what = c("columns", "rows", "samples", "features"), prob = FALSE, dmatrix = FALSE) \S4method{predict}{NMFfitX}(object, what = c("columns", "rows", "samples", "features", "consensus", "chc"), dmatrix = FALSE, ...) } \arguments{ \item{object}{an NMF model} \item{what}{a character string that indicates the type of cluster membership should be returned: \sQuote{columns} or \sQuote{rows} for clustering the colmuns or the rows of the target matrix respectively. The values \sQuote{samples} and \sQuote{features} are aliases for \sQuote{colmuns} and \sQuote{rows} respectively.} \item{prob}{logical that indicates if the relative contributions of/to the dominant basis component should be computed and returned. See \emph{Details}.} \item{dmatrix}{logical that indicates if a dissimiliarity matrix should be attached to the result. This is notably used internally when computing NMF clustering silhouettes.} \item{...}{additional arguments affecting the predictions produced.} } \description{ The methods \code{predict} for NMF models return the cluster membership of each sample or each feature. Currently the classification/prediction of new data is not implemented. } \details{ The cluster membership is computed as the index of the dominant basis component for each sample (\code{what='samples' or 'columns'}) or each feature (\code{what='features' or 'rows'}), based on their corresponding entries in the coefficient matrix or basis matrix respectively. For example, if \code{what='samples'}, then the dominant basis component is computed for each column of the coefficient matrix as the row index of the maximum within the column. If argument \code{prob=FALSE} (default), the result is a \code{factor}. Otherwise a list with two elements is returned: element \code{predict} contains the cluster membership index (as a \code{factor}) and element \code{prob} contains the relative contribution of the dominant component to each sample (resp. the relative contribution of each feature to the dominant basis component): \itemize{ \item Samples: \deqn{p_j = x_{k_0} / \sum_k x_k}{p(j) = x(k0) / sum_k x(k)}, for each sample \eqn{1\leq j \leq p}, where \eqn{x_k}{x(k)} is the contribution of the \eqn{k}-th basis component to \eqn{j}-th sample (i.e. \code{H[k ,j]}), and \eqn{x_{k_0}}{x(k0)} is the maximum of these contributions. \item Features: \deqn{p_i = y_{k_0} / \sum_k y_k}{p(i) = y(k0) / sum_k y(k)}, for each feature \eqn{1\leq i \leq p}, where \eqn{y_k}{y(k)} is the contribution of the \eqn{k}-th basis component to \eqn{i}-th feature (i.e. \code{W[i, k]}), and \eqn{y_{k_0}}{y(k0)} is the maximum of these contributions. } } \section{Methods}{ \describe{ \item{predict}{\code{signature(object = "NMF")}: Default method for NMF models } \item{predict}{\code{signature(object = "NMFfitX")}: Returns the cluster membership index from an NMF model fitted with multiple runs. Besides the type of clustering available for any NMF models (\code{'columns', 'rows', 'samples', 'features'}), this method can return the cluster membership index based on the consensus matrix, computed from the multiple NMF runs. Argument \code{what} accepts the following extra types: \describe{ \item{\code{'chc'}}{ returns the cluster membership based on the hierarchical clustering of the consensus matrix, as performed by \code{\link{consensushc}}.} \item{\code{'consensus'}}{ same as \code{'chc'} but the levels of the membership index are re-labeled to match the order of the clusters as they would be displayed on the associated dendrogram, as re-ordered on the default annotation track in consensus heatmap produced by \code{\link{consensusmap}}.} } } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # random target matrix v <- rmatrix(20, 10) # fit an NMF model x <- nmf(v, 5) # predicted column and row clusters predict(x) predict(x, 'rows') # with relative contributions of each basis component predict(x, prob=TRUE) predict(x, 'rows', prob=TRUE) } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . Pascual-Montano A, Carazo JM, Kochi K, Lehmann D and Pascual-marqui RD (2006). "Nonsmooth nonnegative matrix factorization (nsNMF)." _IEEE Trans. Pattern Anal. Mach. Intell_, *28*, pp. 403-415. } \keyword{methods} NMF/man/NMFSeed-class.Rd0000644000176200001440000000247414333176413014274 0ustar liggesusers\docType{class} \name{NMFSeed-class} \alias{NMFSeed-class} \title{Base class that defines the interface for NMF seeding methods.} \description{ This class implements a simple wrapper strategy object that defines a unified interface to seeding methods, that are used to initialise NMF models before fitting them with any NMF algorithm. } \section{Slots}{ \describe{ \item{name}{character string giving the name of the seeding strategy} \item{method}{workhorse function that implements the seeding strategy. It must have signature \code{(object="NMF", x="matrix", ...)} and initialise the NMF model \code{object} with suitable values for fitting the target matrix \code{x}.} } } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFSeed")}: Returns the workhorse function of the seeding method described by \code{object}. } \item{algorithm<-}{\code{signature(object = "NMFSeed", value = "function")}: Sets the workhorse function of the seeding method described by \code{object}. } \item{NMFSeed}{\code{signature(key = "NMFSeed")}: Creates an \code{NMFSeed} based on a template object (Constructor-Copy), in particular it uses the \strong{same} name. } \item{show}{\code{signature(object = "NMFSeed")}: Show method for objects of class \code{NMFSeed} } } } NMF/man/dims.Rd0000644000176200001440000000577614333176413012714 0ustar liggesusers\docType{methods} \name{nbasis} \alias{dim-NMF} \alias{dim,NMFfitXn-method} \alias{dim,NMF-method} \alias{nbasis} \alias{nbasis,ANY-method} \alias{nbasis-methods} \alias{nbasis,NMFfitXn-method} \title{Dimension of NMF Objects} \usage{ nbasis(x, ...) \S4method{dim}{NMF}(x) \S4method{dim}{NMFfitXn}(x) } \arguments{ \item{x}{an object with suitable \code{basis} and \code{coef} methods, such as an object that inherit from \code{\linkS4class{NMF}}.} \item{...}{extra arguments to allow extension.} } \value{ a single integer value or, for \code{dim}, a length-3 integer vector, e.g. \code{c(2000, 30, 3)} for an \code{NMF} model that fits a 2000 x 30 matrix using 3 basis components. } \description{ The methods \code{dim}, \code{nrow}, \code{ncol} and \code{nbasis} return the different dimensions associated with an NMF model. \code{dim} returns all dimensions in a length-3 integer vector: the number of row and columns of the estimated target matrix, as well as the factorization rank (i.e. the number of basis components). \code{nrow}, \code{ncol} and \code{nbasis} provide separate access to each of these dimensions respectively. } \details{ The NMF package does not implement specific functions \code{nrow} and \code{ncol}, but rather the S4 method \code{dim} for objects of class \code{\linkS4class{NMF}}. This allows the base methods \code{\link{nrow}} and \code{\link{ncol}} to directly work with such objects, to get the number of rows and columns of the target matrix estimated by an NMF model. The function \code{nbasis} is a new S4 generic defined in the package NMF, that returns the number of basis components of an object. Its default method should work for any object, that has a suitable \code{basis} method defined for its class. } \section{Methods}{ \describe{ \item{dim}{\code{signature(x = "NMF")}: method for NMF objects for the base generic \code{\link{dim}}. It returns all dimensions in a length-3 integer vector: the number of row and columns of the estimated target matrix, as well as the factorization rank (i.e. the number of basis components). } \item{dim}{\code{signature(x = "NMFfitXn")}: Returns the dimension common to all fits. Since all fits have the same dimensions, it returns the dimension of the first fit. This method returns \code{NULL} if the object is empty. } \item{nbasis}{\code{signature(x = "ANY")}: Default method which returns the number of columns of the basis matrix extracted from \code{x} using a suitable method \code{basis}, or, if the latter is \code{NULL}, the value of attributes \code{'nbasis'}. For NMF models, this also corresponds to the number of rows in the coefficient matrix. } \item{nbasis}{\code{signature(x = "NMFfitXn")}: Returns the number of basis components common to all fits. Since all fits have been computed using the same rank, it returns the factorization rank of the first fit. This method returns \code{NULL} if the object is empty. } } } \keyword{methods} NMF/man/parse_formula.Rd0000644000176200001440000000075614333176413014610 0ustar liggesusers\name{parse_formula} \alias{parse_formula} \title{Simple Parsing of Formula} \usage{ parse_formula(x) } \arguments{ \item{x}{formula to parse} } \value{ a list with the following elements: \item{response}{ logical that indicates if the formula has a response term.} \item{y}{ name of the response variable.} \item{x}{ list of regressor variable names.} \item{n}{ number of regressor variables.} } \description{ Formula parser for formula-based NMF models. } \keyword{internal} NMF/man/ccBreaks.Rd0000644000176200001440000000036014333176413013455 0ustar liggesusers\name{ccBreaks} \alias{ccBreaks} \title{Generate Break Intervals from Numeric Variables} \usage{ ccBreaks(x, breaks) } \description{ Implementation is borrowed from the R core function \code{\link{cut.default}}. } \keyword{internal} NMF/man/nmfObject.Rd0000644000176200001440000000136714333176413013657 0ustar liggesusers\name{nmfObject} \alias{nmfObject} \title{Updating NMF Objects} \usage{ nmfObject(object, verbose = FALSE) } \arguments{ \item{object}{an R object created by the NMF package, e.g., an object of class \code{\linkS4class{NMF}} or \code{\linkS4class{NMFfit}}.} \item{verbose}{logical to toggle verbose messages.} } \description{ This function serves to update an objects created with previous versions of the NMF package, which would otherwise be incompatible with the current version, due to changes in their S4 class definition. } \details{ This function makes use of heuristics to automatically update object slots, which have been borrowed from the BiocGenerics package, the function \code{updateObjectFromSlots} in particular. } NMF/man/revPalette.Rd0000644000176200001440000000032114333176413014050 0ustar liggesusers\name{revPalette} \alias{revPalette} \title{Flags a Color Palette Specification for Reversion} \usage{ revPalette(x) } \description{ Flags a Color Palette Specification for Reversion } \keyword{internal} NMF/man/scores.Rd0000644000176200001440000001752014333176413013244 0ustar liggesusers\docType{methods} \name{featureScore} \alias{extractFeatures} \alias{extractFeatures,matrix-method} \alias{extractFeatures-methods} \alias{extractFeatures,NMF-method} \alias{featureScore} \alias{featureScore,matrix-method} \alias{featureScore-methods} \alias{featureScore,NMF-method} \title{Feature Selection in NMF Models} \usage{ featureScore(object, ...) \S4method{featureScore}{matrix}(object, method = c("kim", "max")) extractFeatures(object, ...) \S4method{extractFeatures}{matrix}(object, method = c("kim", "max"), format = c("list", "combine", "subset"), nodups = TRUE) } \arguments{ \item{object}{an object from which scores/features are computed/extracted} \item{...}{extra arguments to allow extension} \item{method}{scoring or selection method. It specifies the name of one of the method described in sections \emph{Feature scores} and \emph{Feature selection}. Additionally for \code{extractFeatures}, it may be an integer vector that indicates the number of top most contributing features to extract from each column of \code{object}, when ordered in decreasing order, or a numeric value between 0 and 1 that indicates the minimum relative basis contribution above which a feature is selected (i.e. basis contribution threshold). In the case of a single numeric value (integer or percentage), it is used for all columns. Note that \code{extractFeatures(x, 1)} means relative contribution threshold of 100\%, to select the top contributing features one must explicitly specify an integer value as in \code{extractFeatures(x, 1L)}. However, if all elements in methods are > 1, they are automatically treated as if they were integers: \code{extractFeatures(x, 2)} means the top-2 most contributing features in each component.} \item{format}{output format. The following values are accepted: \describe{ \item{\sQuote{list}}{(default) returns a list with one element per column in \code{object}, each containing the indexes of the selected features, as an integer vector. If \code{object} has row names, these are used to name each index vector. Components for which no feature were selected are assigned a \code{NA} value.} \item{\sQuote{combine}}{ returns all indexes in a single vector. Duplicated indexes are made unique if \code{nodups=TRUE} (default).} \item{\sQuote{subset}}{ returns an object of the same class as \code{object}, but subset with the selected indexes, so that it contains data only from basis-specific features.} }} \item{nodups}{logical that indicates if duplicated indexes, i.e. features selected on multiple basis components (which should in theory not happen), should be only appear once in the result. Only used when \code{format='combine'}.} } \value{ \code{featureScore} returns a numeric vector of the length the number of rows in \code{object} (i.e. one score per feature). \code{extractFeatures} returns the selected features as a list of indexes, a single integer vector or an object of the same class as \code{object} that only contains the selected features. } \description{ The function \code{featureScore} implements different methods to computes basis-specificity scores for each feature in the data. The function \code{extractFeatures} implements different methods to select the most basis-specific features of each basis component. } \details{ One of the properties of Nonnegative Matrix Factorization is that is tend to produce sparse representation of the observed data, leading to a natural application to bi-clustering, that characterises groups of samples by a small number of features. In NMF models, samples are grouped according to the basis components that contributes the most to each sample, i.e. the basis components that have the greatest coefficient in each column of the coefficient matrix (see \code{\link{predict,NMF-method}}). Each group of samples is then characterised by a set of features selected based on basis-specifity scores that are computed on the basis matrix. } \section{Methods}{ \describe{ \item{extractFeatures}{\code{signature(object = "matrix")}: Select features on a given matrix, that contains the basis component in columns. } \item{extractFeatures}{\code{signature(object = "NMF")}: Select basis-specific features from an NMF model, by applying the method \code{extractFeatures,matrix} to its basis matrix. } \item{featureScore}{\code{signature(object = "matrix")}: Computes feature scores on a given matrix, that contains the basis component in columns. } \item{featureScore}{\code{signature(object = "NMF")}: Computes feature scores on the basis matrix of an NMF model. } } } \section{Feature scores}{ The function \code{featureScore} can compute basis-specificity scores using the following methods: \describe{ \item{\sQuote{kim}}{ Method defined by \cite{Kim et al. (2007)}. The score for feature \eqn{i} is defined as: \deqn{S_i = 1 + \frac{1}{\log_2 k} \sum_{q=1}^k p(i,q) \log_2 p(i,q)}{ S_i = 1 + 1/log2(k) sum_q [ p(i,q) log2( p(i,q) ) ] }, where \eqn{p(i,q)} is the probability that the \eqn{i}-th feature contributes to basis \eqn{q}: \deqn{p(i,q) = \frac{W(i,q)}{\sum_{r=1}^k W(i,r)} }{ p(i,q) = W(i,q) / (sum_r W(i,r)) } The feature scores are real values within the range [0,1]. The higher the feature score the more basis-specific the corresponding feature. } \item{\sQuote{max}}{Method defined by \cite{Carmona-Saez et al. (2006)}. The feature scores are defined as the row maximums. } } } \section{Feature selection}{ The function \code{extractFeatures} can select features using the following methods: \describe{ \item{\sQuote{kim}}{ uses \cite{Kim et al. (2007)} scoring schema and feature selection method. The features are first scored using the function \code{featureScore} with method \sQuote{kim}. Then only the features that fulfil both following criteria are retained: \itemize{ \item score greater than \eqn{\hat{\mu} + 3 \hat{\sigma}}, where \eqn{\hat{\mu}} and \eqn{\hat{\sigma}} are the median and the median absolute deviation (MAD) of the scores respectively; \item the maximum contribution to a basis component is greater than the median of all contributions (i.e. of all elements of W). } } \item{\sQuote{max}}{ uses the selection method used in the \code{bioNMF} software package and described in \cite{Carmona-Saez et al. (2006)}. For each basis component, the features are first sorted by decreasing contribution. Then, one selects only the first consecutive features whose highest contribution in the basis matrix is effectively on the considered basis. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # random NMF model x <- rnmf(3, 50,20) # probably no feature is selected extractFeatures(x) # extract top 5 for each basis extractFeatures(x, 5L) # extract features that have a relative basis contribution above a threshold extractFeatures(x, 0.5) # ambiguity? extractFeatures(x, 1) # means relative contribution above 100\% extractFeatures(x, 1L) # means top contributing feature in each component } \references{ Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . Carmona-Saez P, Pascual-Marqui RD, Tirado F, Carazo JM and Pascual-Montano A (2006). "Biclustering of gene expression data by Non-smooth Non-negative Matrix Factorization." _BMC bioinformatics_, *7*, pp. 78. ISSN 1471-2105, , . } \keyword{methods} NMF/man/NMFfitXn-class.Rd0000644000176200001440000001401214334424372014474 0ustar liggesusers\docType{class} \name{NMFfitXn-class} \alias{NMFfitXn-class} \title{Structure for Storing All Fits from Multiple NMF Runs} \description{ This class is used to return the result from a multiple run of a single NMF algorithm performed with function \code{nmf} with option \code{keep.all=TRUE} (cf. \code{\link{nmf}}). } \details{ It extends both classes \code{\linkS4class{NMFfitX}} and \code{list}, and stores the result of each run (i.e. a \code{NMFfit} object) in its \code{list} structure. IMPORTANT NOTE: This class is designed to be \strong{read-only}, even though all the \code{list}-methods can be used on its instances. Adding or removing elements would most probably lead to incorrect results in subsequent calls. Capability for concatenating and merging NMF results is for the moment only used internally, and should be included and supported in the next release of the package. } \section{Slots}{ \describe{ \item{.Data}{standard slot that contains the S3 \code{list} object data. See R documentation on S3/S4 classes for more details (e.g., \code{\link{setOldClass}}).} } } \section{Methods}{ \describe{ \item{algorithm}{\code{signature(object = "NMFfitXn")}: Returns the name of the common NMF algorithm used to compute all fits stored in \code{object} Since all fits are computed with the same algorithm, this method returns the name of algorithm that computed the first fit. It returns \code{NULL} if the object is empty. } \item{basis}{\code{signature(object = "NMFfitXn")}: Returns the basis matrix of the best fit amongst all the fits stored in \code{object}. It is a shortcut for \code{basis(fit(object))}. } \item{coef}{\code{signature(object = "NMFfitXn")}: Returns the coefficient matrix of the best fit amongst all the fits stored in \code{object}. It is a shortcut for \code{coef(fit(object))}. } \item{compare}{\code{signature(object = "NMFfitXn")}: Compares the fits obtained by separate runs of NMF, in a single call to \code{\link{nmf}}. } \item{consensus}{\code{signature(object = "NMFfitXn")}: This method returns \code{NULL} on an empty object. The result is a matrix with several attributes attached, that are used by plotting functions such as \code{\link{consensusmap}} to annotate the plots. } \item{dim}{\code{signature(x = "NMFfitXn")}: Returns the dimension common to all fits. Since all fits have the same dimensions, it returns the dimension of the first fit. This method returns \code{NULL} if the object is empty. } \item{entropy}{\code{signature(x = "NMFfitXn", y = "ANY")}: Computes the best or mean entropy across all NMF fits stored in \code{x}. } \item{fit}{\code{signature(object = "NMFfitXn")}: Returns the best NMF fit object amongst all the fits stored in \code{object}, i.e. the fit that achieves the lowest estimation residuals. } \item{.getRNG}{\code{signature(object = "NMFfitXn")}: Returns the RNG settings used for the best fit. This method throws an error if the object is empty. } \item{getRNG1}{\code{signature(object = "NMFfitXn")}: Returns the RNG settings used for the first run. This method throws an error if the object is empty. } \item{minfit}{\code{signature(object = "NMFfitXn")}: Returns the best NMF model in the list, i.e. the run that achieved the lower estimation residuals. The model is selected based on its \code{deviance} value. } \item{modelname}{\code{signature(object = "NMFfitXn")}: Returns the common type NMF model of all fits stored in \code{object} Since all fits are from the same NMF model, this method returns the model type of the first fit. It returns \code{NULL} if the object is empty. } \item{nbasis}{\code{signature(x = "NMFfitXn")}: Returns the number of basis components common to all fits. Since all fits have been computed using the same rank, it returns the factorization rank of the first fit. This method returns \code{NULL} if the object is empty. } \item{nrun}{\code{signature(object = "NMFfitXn")}: Returns the number of runs performed to compute the fits stored in the list (i.e. the length of the list itself). } \item{purity}{\code{signature(x = "NMFfitXn", y = "ANY")}: Computes the best or mean purity across all NMF fits stored in \code{x}. } \item{runtime.all}{\code{signature(object = "NMFfitXn")}: If no time data is available from in slot \sQuote{runtime.all} and argument \code{null=TRUE}, then the sequential time as computed by \code{\link{seqtime}} is returned, and a warning is thrown unless \code{warning=FALSE}. } \item{seeding}{\code{signature(object = "NMFfitXn")}: Returns the name of the common seeding method used the computation of all fits stored in \code{object} Since all fits are seeded using the same method, this method returns the name of the seeding method used for the first fit. It returns \code{NULL} if the object is empty. } \item{seqtime}{\code{signature(object = "NMFfitXn")}: Returns the CPU time that would be required to sequentially compute all NMF fits stored in \code{object}. This method calls the function \code{runtime} on each fit and sum up the results. It returns \code{NULL} on an empty object. } \item{show}{\code{signature(object = "NMFfitXn")}: Show method for objects of class \code{NMFfitXn} } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes n <- 15; counts <- c(5, 2, 3); V <- syntheticNMF(n, counts, factors = TRUE) # get the class factor groups <- V$pData$Group # perform multiple runs of one algorithm, keeping all the fits res <- nmf(V[[1]], 3, nrun=2, .options='k') # .options=list(keep.all=TRUE) also works res summary(res) # get more info summary(res, target=V[[1]], class=groups) # compute/show computational times runtime.all(res) seqtime(res) # plot the consensus matrix, computed on the fly \dontrun{ consensusmap(res, annCol=groups) } } \seealso{ Other multipleNMF: \code{\link{NMFfitX1-class}}, \code{\link{NMFfitX-class}} } NMF/man/NMF-defunct.Rd0000644000176200001440000000157614333176413014020 0ustar liggesusers\docType{methods} \name{NMF-defunct} \alias{metaHeatmap} \alias{metaHeatmap,matrix-method} \alias{metaHeatmap-methods} \alias{metaHeatmap,NMFfitX-method} \alias{metaHeatmap,NMF-method} \alias{NMF-defunct} \title{Defunct Functions and Classes in the NMF Package} \usage{ metaHeatmap(object, ...) } \arguments{ \item{object}{an R object} \item{...}{other arguments} } \description{ Defunct Functions and Classes in the NMF Package } \section{Methods}{ \describe{ \item{metaHeatmap}{\code{signature(object = "matrix")}: Defunct method substituted by \code{\link{aheatmap}}. } \item{metaHeatmap}{\code{signature(object = "NMF")}: Deprecated method that is substituted by \code{\link{coefmap}} and \code{\link{basismap}}. } \item{metaHeatmap}{\code{signature(object = "NMFfitX")}: Deprecated method subsituted by \code{\link{consensusmap}}. } } } \keyword{methods} NMF/man/scale.NMF.Rd0000644000176200001440000000373514333176413013457 0ustar liggesusers\name{scale.NMF} \alias{scale.NMF} \title{Rescaling NMF Models} \usage{ \method{scale}{NMF} (x, center = c("basis", "coef"), scale = 1) } \arguments{ \item{x}{an NMF object} \item{center}{either a numeric normalising vector \eqn{\delta}{delta}, or either \code{'basis'} or \code{'coef'}, which respectively correspond to using the column sums of the basis matrix or the inverse of the row sums of the coefficient matrix as a normalising vector. If numeric, \code{center} should be a single value or a vector of length the rank of the NMF model, i.e. the number of columns in the basis matrix.} \item{scale}{scaling coefficient applied to \eqn{D}, i.e. the value of \eqn{\alpha}{alpha}, or, if \code{center='coef'}, the value of \eqn{1/\alpha}{1/alpha} (see section \emph{Details}).} } \value{ an NMF object } \description{ Rescales an NMF model keeping the fitted target matrix identical. } \details{ Standard NMF models are identifiable modulo a scaling factor, meaning that the basis components and basis profiles can be rescaled without changing the fitted values: \deqn{X = W_1 H_1 = (W_1 D) (D^{-1} H_1) = W_2 H_2}{X = W H = (W D) (D^-1 H)} with \eqn{D= \alpha diag(1/\delta_1, \ldots, 1\delta_r)}{D= alpha * diag(1/delta_1, ..., 1/delta_r)} The default call \code{scale(object)} rescales the basis NMF object so that each column of the basis matrix sums up to one. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # random 3-rank 10x5 NMF model x <- rnmf(3, 10, 5) # rescale based on basis colSums(basis(x)) colSums(basis(scale(x))) rx <- scale(x, 'basis', 10) colSums(basis(rx)) rowSums(coef(rx)) # rescale based on coef rowSums(coef(x)) rowSums(coef(scale(x, 'coef'))) rx <- scale(x, 'coef', 10) rowSums(coef(rx)) colSums(basis(rx)) # fitted target matrix is identical but the factors have been rescaled rx <- scale(x, 'basis') all.equal(fitted(x), fitted(rx)) all.equal(basis(x), basis(rx)) } NMF/man/show-commaNMFStrategyIterative-method.Rd0000644000176200001440000000056214333176413021235 0ustar liggesusers\docType{methods} \name{show,NMFStrategyIterative-method} \alias{show,NMFStrategyIterative-method} \title{Show method for objects of class \code{NMFStrategyIterative}} \usage{ \S4method{show}{NMFStrategyIterative}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFStrategyIterative} } \keyword{methods} NMF/man/show-commaNMF-method.Rd0000644000176200001440000000043314333176413015632 0ustar liggesusers\docType{methods} \name{show,NMF-method} \alias{show,NMF-method} \title{Show method for objects of class \code{NMF}} \usage{ \S4method{show}{NMF}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMF} } \keyword{methods} NMF/man/inplace.Rd0000644000176200001440000000176714333176413013367 0ustar liggesusers\name{pmax.inplace} \alias{neq.constraints.inplace} \alias{pmax.inplace} \title{Updating Objects In Place} \usage{ pmax.inplace(x, lim, skip = NULL) neq.constraints.inplace(x, constraints, ratio = NULL, value = NULL, copy = FALSE) } \arguments{ \item{x}{an object to update in place.} \item{lim}{lower threshold value} \item{skip}{indexes to skip} \item{constraints}{constraint specification.} \item{ratio}{fixed ratio on which the constraint applies.} \item{value}{fixed value to enforce.} \item{copy}{a logical that indicates if \code{x} should be updated in place or not.} } \description{ These functions modify objects (mainly matrix objects) in place, i.e. they act directly on the C pointer. Due to their side-effect, they are not meant to be called by the end-user. \code{neq.constraints.inplace} apply unequality constraints in place. } \details{ \code{pmax.inplace} is a version of \code{\link{pmax}} that updates its first argument. } \keyword{internal} NMF/man/latex.Rd0000644000176200001440000000401714333202631013050 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/vignette.R \name{latex_preamble} \alias{latex_preamble} \alias{latex_bibliography} \title{LaTeX Utilities for Vignettes} \usage{ latex_preamble( PACKAGE, R = TRUE, CRAN = TRUE, Bioconductor = TRUE, GEO = TRUE, ArrayExpress = TRUE, biblatex = FALSE, only = FALSE, file = "" ) latex_bibliography(PACKAGE, file = "") } \arguments{ \item{PACKAGE}{package name} \item{R}{logical that indicate if general R commands should be added (e.g. package names, inline R code format commands)} \item{CRAN}{logical that indicate if general CRAN commands should be added (e.g. CRAN package citations)} \item{Bioconductor}{logical that indicate if general Bioconductor commands should be added (e.g. Bioc package citations)} \item{GEO}{logical that indicate if general GEOmnibus commands should be added (e.g. urls to GEO datasets)} \item{ArrayExpress}{logical that indicate if general ArrayExpress commands should be added (e.g. urls to ArrayExpress datasets)} \item{biblatex}{logical that indicates if a \code{\\bibliography} command should be added to include references from the package's REFERENCES.bib file.} \item{only}{a logical that indicates if the only the commands whose dedicated argument is not missing should be considered.} \item{file}{connection where to print. If \code{NULL} the result is returned silently.} } \description{ \code{latex_preamble} outputs/returns command definition LaTeX commands to be put in the preamble of vignettes. } \details{ Argument \code{PACKAGE} is not required for \code{latex_preamble}, but must be correctly specified to ensure \code{biblatex=TRUE} generates the correct bibliography command. } \section{Functions}{ \itemize{ \item \code{latex_bibliography}: \code{latex_bibliography} prints or return a LaTeX command that includes a package bibliography file if it exists. }} \examples{ latex_preamble() latex_preamble(R=TRUE, only=TRUE) latex_preamble(R=FALSE, CRAN=FALSE, GEO=FALSE) latex_preamble(GEO=TRUE, only=TRUE) } NMF/man/assess.Rd0000644000176200001440000001062014333176413013241 0ustar liggesusers\docType{methods} \name{summary} \alias{summary} \alias{summary-methods} \alias{summary-NMF} \alias{summary,NMFfit-method} \alias{summary,NMFfitX-method} \alias{summary,NMF-method} \title{Assessing and Comparing NMF Models} \usage{ summary(object, ...) \S4method{summary}{NMF}(object, class, target) } \arguments{ \item{object}{an NMF object. See available methods in section \emph{Methods}.} \item{...}{extra arguments passed to the next \code{summary} method.} \item{class}{known classes/cluster of samples specified in one of the formats that is supported by the functions \code{\link{entropy}} and \code{\link{purity}}.} \item{target}{target matrix specified in one of the formats supported by the functions \code{\link{rss}} and \code{\link{evar}}} } \description{ The NMF package defines \code{summary} methods for different classes of objects, which helps assessing and comparing the quality of NMF models by computing a set of quantitative measures, e.g. with respect to their ability to recover known classes and/or the original target matrix. The most useful methods are for classes \code{\linkS4class{NMF}}, \code{\linkS4class{NMFfit}}, \code{\linkS4class{NMFfitX}} and \code{\linkS4class{NMFList}}, which compute summary measures for, respectively, a single NMF model, a single fit, a multiple-run fit and a list of heterogenous fits performed with the function \code{\link{nmf}}. } \details{ Due to the somehow hierarchical structure of the classes mentionned in \emph{Description}, their respective \code{summary} methods call each other in chain, each super-class adding some extra measures, only relevant for objects of a specific class. } \section{Methods}{ \describe{ \item{summary}{\code{signature(object = "NMF")}: Computes summary measures for a single NMF model. The following measures are computed: \describe{ \item{sparseness}{Sparseness of the factorization computed by the function \code{\link{sparseness}}.} \item{entropy}{Purity of the clustering, with respect to known classes, computed by the function \code{\link{purity}}.} \item{entropy}{Entropy of the clustering, with respect to known classes, computed by the function \code{\link{entropy}}.} \item{RSS}{Residual Sum of Squares computed by the function \code{\link{rss}}.} \item{evar}{Explained variance computed by the function \code{\link{evar}}.} } } \item{summary}{\code{signature(object = "NMFfit")}: Computes summary measures for a single fit from \code{\link{nmf}}. This method adds the following measures to the measures computed by the method \code{summary,NMF}: \describe{ \item{residuals}{Residual error as measured by the objective function associated to the algorithm used to fit the model.} \item{niter}{Number of iterations performed to achieve convergence of the algorithm.} \item{cpu}{Total CPU time required for the fit.} \item{cpu.all}{Total CPU time required for the fit. For \code{NMFfit} objects, this element is always equal to the value in \dQuote{cpu}, but will be different for multiple-run fits.} \item{nrun}{Number of runs performed to fit the model. This is always equal to 1 for \code{NMFfit} objects, but will vary for multiple-run fits.} } } \item{summary}{\code{signature(object = "NMFfitX")}: Computes a set of measures to help evaluate the quality of the \emph{best fit} of the set. The result is similar to the result from the \code{summary} method of \code{NMFfit} objects. See \code{\linkS4class{NMF}} for details on the computed measures. In addition, the cophenetic correlation (\code{\link{cophcor}}) and \code{\link{dispersion}} coefficients of the consensus matrix are returned, as well as the total CPU time (\code{\link{runtime.all}}). } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # summary,NMF-method #---------- # random NMF model x <- rnmf(3, 20, 12) summary(x) summary(x, gl(3, 4)) summary(x, target=rmatrix(x)) summary(x, gl(3,4), target=rmatrix(x)) #---------- # summary,NMFfit-method #---------- # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) n <- 50; counts <- c(5, 5, 8); V <- syntheticNMF(n, counts) cl <- unlist(mapply(rep, 1:3, counts)) # perform default NMF with rank=2 x2 <- nmf(V, 2) summary(x2, cl, V) # perform default NMF with rank=2 x3 <- nmf(V, 3) summary(x2, cl, V) } \keyword{methods} NMF/man/canFit.Rd0000644000176200001440000000255014333176413013147 0ustar liggesusers\docType{methods} \name{canFit} \alias{canFit} \alias{canFit,character,ANY-method} \alias{canFit-methods} \alias{canFit,NMFStrategy,character-method} \alias{canFit,NMFStrategy,NMF-method} \title{Testing Compatibility of Algorithm and Models} \usage{ canFit(x, y, ...) \S4method{canFit}{NMFStrategy,character}(x, y, exact = FALSE) } \arguments{ \item{x}{an object that describes an algorithm} \item{y}{an object that describes a model} \item{...}{extra arguments to allow extension} \item{exact}{for logical that indicates if an algorithm is considered able to fit only the models that it explicitly declares (\code{TRUE}), or if it should be considered able to also fit models that extend models that it explicitly fits.} } \description{ \code{canFit} is an S4 generic that tests if an algorithm can fit a particular model. } \section{Methods}{ \describe{ \item{canFit}{\code{signature(x = "NMFStrategy", y = "character")}: Tells if an NMF algorithm can fit a given class of NMF models } \item{canFit}{\code{signature(x = "NMFStrategy", y = "NMF")}: Tells if an NMF algorithm can fit the same class of models as \code{y} } \item{canFit}{\code{signature(x = "character", y = "ANY")}: Tells if a registered NMF algorithm can fit a given NMF model } } } \seealso{ Other regalgo: \code{\link{nmfAlgorithm}} } \keyword{methods} NMF/man/aggregate.measure.Rd0000644000176200001440000000146314561103444015330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aggregate.R \name{aggregate.measure} \alias{aggregate.measure} \title{Utility function to aggregate numerical quality measures from \code{NMFfitXn} objects.} \usage{ \method{aggregate}{measure}(x, method = c("best", "mean"), decreasing = FALSE, ...) } \arguments{ \item{x}{a numerical vector} \item{method}{the method to aggregate values. This argument can take two values : - mean: the mean of the measures - best: the best measure according to the specified sorting order (decreasing or not)} \item{decreasing}{logical that specified the sorting order} \item{...}{extra arguments to allow extension} } \description{ Given a numerical vector, this function computes an aggregated value using one of the following methods: best or mean } NMF/man/foreach.Rd0000644000176200001440000001155614333176413013360 0ustar liggesusers\docType{methods} \name{registerDoBackend} \alias{ForeachBackend} \alias{ForeachBackend,ANY-method} \alias{ForeachBackend,character-method} \alias{ForeachBackend,cluster-method} \alias{ForeachBackend,doMPI_backend-method} \alias{ForeachBackend,doParallel_backend-method} \alias{ForeachBackend,doParallelMC_backend-method} \alias{ForeachBackend,doParallelSNOW_backend-method} \alias{ForeachBackend,doPSOCK_backend-method} \alias{ForeachBackend-methods} \alias{ForeachBackend,missing-method} \alias{ForeachBackend,mpicluster-method} \alias{ForeachBackend,NULL-method} \alias{ForeachBackend,numeric-method} \alias{getDoBackend} \alias{getDoParHosts} \alias{getDoParHosts,ANY-method} \alias{getDoParHosts-methods} \alias{getDoParNHosts} \alias{register} \alias{registerDoBackend} \alias{setDoBackend} \title{Utilities and Extensions for Foreach Loops} \usage{ registerDoBackend(object, ...) getDoBackend() setDoBackend(data, cleanup = FALSE) register(x, ...) ForeachBackend(object, ...) \S4method{ForeachBackend}{doParallel_backend}(object, cl, type = NULL) \S4method{ForeachBackend}{doPSOCK_backend}(object, cl) \S4method{ForeachBackend}{doMPI_backend}(object, cl) getDoParHosts(object, ...) getDoParNHosts(object) } \arguments{ \item{object}{specification of a foreach backend, e.g. \sQuote{SEQ}, \sQuote{PAR} (for doParallel), \sQuote{MPI}, etc\ldots} \item{...}{extra arguments passed to the backend own registration function.} \item{data}{internal data of a foreach \%dopar\% backend.} \item{cleanup}{logical that indicates if the previous backend's cleanup procedure should be run, \strong{before} setting the new backend.} \item{x}{specification of a foreach backend} \item{cl}{cluster specification: a cluster object or a numeric that indicates the number of nodes to use.} \item{type}{type of cluster, See \code{\link[parallel]{makeCluster}}.} } \description{ \code{registerDoBackend} is a unified register function for foreach backends. \code{getDoBackend} returns the internal data of the currently registered foreach \%dopar\% backend. \code{setDoBackend} is identical to \code{\link[foreach]{setDoPar}}, but returns the internal of the previously registered backend. \code{register} is a generic function that register objects. It is used to as a unified interface to register foreach backends. \code{ForeachBackend} is a factory method for foreach backend objects. \code{getDoParHosts} is a generic function that returns the hostname of the worker nodes used by a backend. \code{getDoParNHosts} returns the number of hosts used by a backend. } \section{Methods}{ \describe{ \item{ForeachBackend}{\code{signature(object = "ANY")}: Default method defined to throw an informative error message, when no other method was found. } \item{ForeachBackend}{\code{signature(object = "character")}: Creates a foreach backend object based on its name. } \item{ForeachBackend}{\code{signature(object = "missing")}: Creates a foreach backend object for the currently registered backend. } \item{ForeachBackend}{\code{signature(object = "NULL")}: Dummy method that returns \code{NULL}, defined for correct dispatch. } \item{ForeachBackend}{\code{signature(object = "cluster")}: Creates a doParallel foreach backend that uses the cluster described in \code{object}. } \item{ForeachBackend}{\code{signature(object = "numeric")}: Creates a doParallel foreach backend with \code{object} processes. } \item{ForeachBackend}{\code{signature(object = "doParallel_backend")}: doParallel-specific backend factory } \item{ForeachBackend}{\code{signature(object = "doParallelMC_backend")}: doParallel-specific backend factory for multicore (fork) clusters This method is needed since version 1.0.7 of \pkg{doParallel}, which removed internal function \code{info} and defined separate backend names for mc and snow clusters. } \item{ForeachBackend}{\code{signature(object = "doParallelSNOW_backend")}: doParallel-specific backend factory for SNOW clusters. This method is needed since version 1.0.7 of \pkg{doParallel}, which removed internal function \code{info} and defined separate backend names for mc and snow clusters. } \item{ForeachBackend}{\code{signature(object = "doPSOCK_backend")}: doSNOW-specific backend factory } \item{ForeachBackend}{\code{signature(object = "mpicluster")}: Creates a doMPI foreach backend that uses the MPI cluster described in \code{object}. } \item{ForeachBackend}{\code{signature(object = "doMPI_backend")}: doMPI-specific backend factory } \item{getDoParHosts}{\code{signature(object = "ANY")}: Default method that tries to heuristaically infer the number of hosts and in last resort temporarly register the backend and performs a foreach loop, to retrieve the nodename from each worker. } } } \keyword{internal} \keyword{methods} NMF/man/dispersion.Rd0000644000176200001440000000353114333176413014122 0ustar liggesusers\docType{methods} \name{dispersion} \alias{dispersion} \alias{dispersion,matrix-method} \alias{dispersion-methods} \alias{dispersion,NMFfitX-method} \title{Dispersion of a Matrix} \usage{ dispersion(object, ...) } \arguments{ \item{object}{an object from which the dispersion is computed} \item{...}{extra arguments to allow extension} } \description{ Computes the dispersion coefficient of a -- consensus -- matrix \code{object}, generally obtained from multiple NMF runs. } \details{ The dispersion coefficient is based on the consensus matrix (i.e. the average of connectivity matrices) and was proposed by \cite{Kim et al. (2007)} to measure the reproducibility of the clusters obtained from NMF. It is defined as: \deqn{\rho = \sum_{i,j=1}^n 4 (C_{ij} - \frac{1}{2})^2 , } where \eqn{n} is the total number of samples. By construction, \eqn{0 \leq \rho \leq 1} and \eqn{\rho = 1} only for a perfect consensus matrix, where all entries 0 or 1. A perfect consensus matrix is obtained only when all the connectivity matrices are the same, meaning that the algorithm gave the same clusters at each run. See \cite{Kim et al. (2007)}. } \section{Methods}{ \describe{ \item{dispersion}{\code{signature(object = "matrix")}: Workhorse method that computes the dispersion on a given matrix. } \item{dispersion}{\code{signature(object = "NMFfitX")}: Computes the dispersion on the consensus matrix obtained from multiple NMF runs. } } } \references{ Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . } \keyword{methods} NMF/man/NMFStrategy.Rd0000644000176200001440000001504114333176413014105 0ustar liggesusers\docType{methods} \name{NMFStrategy} \alias{NMFStrategy} \alias{NMFStrategy,character,character-method} \alias{NMFStrategy,character,function-method} \alias{NMFStrategy,character,missing-method} \alias{NMFStrategy,character,NMFStrategy-method} \alias{NMFStrategy-methods} \alias{NMFStrategy,missing,character-method} \alias{NMFStrategy,NMFStrategy,missing-method} \alias{NMFStrategy,NULL,character-method} \alias{NMFStrategy,NULL,NMFStrategy-method} \alias{run,NMFStrategyFunction,matrix,NMFfit-method} \alias{run,NMFStrategyIterative,matrix,NMFfit-method} \alias{run,NMFStrategyIterativeX,matrix,NMFfit-method} \alias{run,NMFStrategy,matrix,NMFfit-method} \alias{run,NMFStrategy,matrix,NMF-method} \alias{run,NMFStrategyOctave,matrix,NMFfit-method} \title{Factory Method for NMFStrategy Objects} \usage{ NMFStrategy(name, method, ...) \S4method{run}{NMFStrategy,matrix,NMFfit}(object, y, x, ...) \S4method{run}{NMFStrategy,matrix,NMF}(object, y, x, ...) \S4method{run}{NMFStrategyFunction,matrix,NMFfit}(object, y, x, ...) \S4method{run}{NMFStrategyIterative,matrix,NMFfit}(object, y, x, .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, ...) \S4method{run}{NMFStrategyIterativeX,matrix,NMFfit}(object, y, x, maxIter, ...) \S4method{run}{NMFStrategyOctave,matrix,NMFfit}(object, y, x, ...) } \arguments{ \item{name}{name/key of an NMF algorithm.} \item{method}{definition of the algorithm} \item{...}{extra arguments passed to \code{\link{new}}.} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} \item{y}{data object, e.g. a target matrix} \item{x}{a model object used as a starting point by the algorithm, e.g. a non-empty NMF model.} } \description{ Creates NMFStrategy objects that wraps implementation of NMF algorithms into a unified interface. } \section{Methods}{ \describe{ \item{NMFStrategy}{\code{signature(name = "character", method = "function")}: Creates an \code{NMFStrategyFunction} object that wraps the function \code{method} into a unified interface. \code{method} must be a function with signature \code{(y="matrix", x="NMFfit", ...)}, and return an object of class \code{\linkS4class{NMFfit}}. } \item{NMFStrategy}{\code{signature(name = "character", method = "NMFStrategy")}: Creates an \code{NMFStrategy} object based on a template object (Constructor-Copy). } \item{NMFStrategy}{\code{signature(name = "NMFStrategy", method = "missing")}: Creates an \code{NMFStrategy} based on a template object (Constructor-Copy), in particular it uses the \strong{same} name. } \item{NMFStrategy}{\code{signature(name = "missing", method = "character")}: Creates an \code{NMFStrategy} based on a registered NMF algorithm that is used as a template (Constructor-Copy), in particular it uses the \strong{same} name. It is a shortcut for \code{NMFStrategy(nmfAlgorithm(method, exact=TRUE), ...)}. } \item{NMFStrategy}{\code{signature(name = "NULL", method = "NMFStrategy")}: Creates an \code{NMFStrategy} based on a template object (Constructor-Copy) but using a randomly generated name. } \item{NMFStrategy}{\code{signature(name = "character", method = "character")}: Creates an \code{NMFStrategy} based on a registered NMF algorithm that is used as a template. } \item{NMFStrategy}{\code{signature(name = "NULL", method = "character")}: Creates an \code{NMFStrategy} based on a registered NMF algorithm (Constructor-Copy) using a randomly generated name. It is a shortcut for \code{NMFStrategy(NULL, nmfAlgorithm(method), ...)}. } \item{NMFStrategy}{\code{signature(name = "character", method = "missing")}: Creates an NMFStrategy, determining its type from the extra arguments passed in \code{...}: if there is an argument named \code{Update} then an \code{NMFStrategyIterative} is created, or if there is an argument named \code{algorithm} then an \code{NMFStrategyFunction} is created. Calls other than these generates an error. } \item{run}{\code{signature(object = "NMFStrategy", y = "matrix", x = "NMFfit")}: Pure virtual method defined for all NMF algorithms to ensure that a method \code{run} is defined by sub-classes of \code{NMFStrategy}. It throws an error if called directly. } \item{run}{\code{signature(object = "NMFStrategy", y = "matrix", x = "NMF")}: Method to run an NMF algorithm directly starting from a given NMF model. } \item{run}{\code{signature(object = "NMFStrategyFunction", y = "matrix", x = "NMFfit")}: Runs the NMF algorithms implemented by the single R function -- and stored in slot \code{'algorithm'} of \code{object}, on the data object \code{y}, using \code{x} as starting point. It is equivalent to calling \code{object@algorithm(y, x, ...)}. This method is usually not called directly, but only via the function \code{\link{nmf}}, which takes care of many other details such as seeding the computation, handling RNG settings, or setting up parallelisation. } \item{run}{\code{signature(object = "NMFStrategyIterative", y = "matrix", x = "NMFfit")}: Runs an NMF iterative algorithm on a target matrix \code{y}. } \item{run}{\code{signature(object = "NMFStrategyOctave", y = "matrix", x = "NMFfit")}: Runs the NMF algorithms implemented by the Octave/Matlab function associated with the strategy -- and stored in slot \code{'algorithm'} of \code{object}. This method is usually not called directly, but only via the function \code{\link{nmf}}, which takes care of many other details such as seeding the computation, handling RNG settings, or setting up parallel computations. } } } \keyword{methods} NMF/man/nmfAlgorithm.Rd0000644000176200001440000000430514333176413014372 0ustar liggesusers\name{nmfAlgorithm} \alias{nmfAlgorithm} \title{Listing and Retrieving NMF Algorithms} \usage{ nmfAlgorithm(name = NULL, version = NULL, all = FALSE, ...) } \arguments{ \item{name}{Access key. If not missing, it must be a single character string that is partially matched against the available algorithms in the registry. In this case, if \code{all=FALSE} (default), then the algorithm is returned as an \code{NMFStrategy} object that can be directly passed to \code{\link{nmf}}. An error is thrown if no matching algorithm is found. If missing or \code{NULL}, then access keys of algorithms -- that match the criteria \code{version}, are returned. This argument is assumed to be regular expression if \code{all=TRUE} or \code{version} is not \code{NULL}.} \item{version}{version of the algorithm(s) to retrieve. Currently only value \code{'R'} is supported, which searched for plain R implementations.} \item{all}{a logical that indicates if all algorithm keys should be returned, including the ones from alternative algorithm versions (e.g. plain R implementations of algorithms, for which a version based on optimised C updates is used by default).} \item{...}{extra arguments passed to \code{\link{getNMFMethod}} when \code{name} is not \code{NULL} and \code{all=FALSE}. It is not used otherwise.} } \value{ an \code{\linkS4class{NMFStrategy}} object if \code{name} is not \code{NULL} and \code{all=FALSE}, or a named character vector that contains the access keys of the matching algorithms. The names correspond to the access key of the primary algorithm: e.g. algorithm \sQuote{lee} has two registered versions, one plain R (\sQuote{.R#lee}) and the other uses optimised C updates (\sQuote{lee}), which will all get named \sQuote{lee}. } \description{ \code{nmfAlgorithm} lists access keys or retrieves NMF algorithms that are stored in registry. It allows to list } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # list all main algorithms nmfAlgorithm() # list all versions of algorithms nmfAlgorithm(all=TRUE) # list all plain R versions nmfAlgorithm(version='R') } \seealso{ Other regalgo: \code{\link{canFit}} } NMF/man/consensushc.Rd0000644000176200001440000000335414333176413014301 0ustar liggesusers\docType{methods} \name{consensushc} \alias{consensushc} \alias{consensushc,matrix-method} \alias{consensushc-methods} \alias{consensushc,NMFfitX-method} \alias{consensushc,NMF-method} \title{Hierarchical Clustering of a Consensus Matrix} \usage{ consensushc(object, ...) \S4method{consensushc}{matrix}(object, method = "average", dendrogram = TRUE) \S4method{consensushc}{NMFfitX}(object, what = c("consensus", "fit"), ...) } \arguments{ \item{object}{a matrix or an \code{NMFfitX} object, as returned by multiple NMF runs.} \item{...}{extra arguments passed to next method calls} \item{method}{linkage method passed to \code{\link{hclust}}.} \item{dendrogram}{a logical that specifies if the result of the hierarchical clustering (en \code{hclust} object) should be converted into a dendrogram. Default value is \code{TRUE}.} \item{what}{character string that indicates which matrix to use in the computation.} } \value{ an object of class \code{dendrogram} or \code{hclust} depending on the value of argument \code{dendrogram}. } \description{ The function \code{consensushc} computes the hierarchical clustering of a consensus matrix, using the matrix itself as a similarity matrix and average linkage. It is } \section{Methods}{ \describe{ \item{consensushc}{\code{signature(object = "matrix")}: Workhorse method for matrices. } \item{consensushc}{\code{signature(object = "NMF")}: Compute the hierarchical clustering on the connectivity matrix of \code{object}. } \item{consensushc}{\code{signature(object = "NMFfitX")}: Compute the hierarchical clustering on the consensus matrix of \code{object}, or on the connectivity matrix of the best fit in \code{object}. } } } \keyword{methods} NMF/man/rmatrix.Rd0000644000176200001440000001075614333176413013440 0ustar liggesusers\docType{methods} \name{rmatrix} \alias{rmatrix} \alias{rmatrix,ANY-method} \alias{rmatrix-methods} \alias{rmatrix,NMF-method} \alias{rmatrix,numeric-method} \title{Generating Random Matrices} \usage{ rmatrix(x, ...) \S4method{rmatrix}{numeric}(x, y = NULL, dist = runif, byrow = FALSE, dimnames = NULL, ...) } \arguments{ \item{x}{object from which to generate a random matrix} \item{y}{optional specification of number of columns} \item{dist}{a random distribution function or a numeric seed (see details of method \code{rmatrix,numeric})} \item{byrow}{a logical passed in the internal call to the function \code{\link{matrix}}} \item{dimnames}{\code{NULL} or a \code{list} passed in the internal call to the function \code{\link{matrix}}} \item{...}{extra arguments passed to the distribution function \code{dist}.} } \description{ The S4 generic \code{rmatrix} generates a random matrix from a given object. Methods are provided to generate matrices with entries drawn from any given random distribution function, e.g. \code{\link{runif}} or \code{\link{rnorm}}. } \section{Methods}{ \describe{ \item{rmatrix}{\code{signature(x = "numeric")}: Generates a random matrix of given dimensions, whose entries are drawn using the distribution function \code{dist}. This is the workhorse method that is eventually called by all other methods. It returns a matrix with: \itemize{ \item \code{x} rows and \code{y} columns if \code{y} is not missing and not \code{NULL}; \item dimension \code{x[1]} x \code{x[2]} if \code{x} has at least two elements; \item dimension \code{x} (i.e. a square matrix) otherwise. } The default is to draw its entries from the standard uniform distribution using the base function \code{\link{runif}}, but any other function that generates random numeric vectors of a given length may be specified in argument \code{dist}. All arguments in \code{...} are passed to the function specified in \code{dist}. The only requirement is that the function in \code{dist} is of the following form: \samp{ function(n, ...){ # return vector of length n ... }} This is the case of all base random draw function such as \code{\link{rnorm}}, \code{\link{rgamma}}, etc\ldots } \item{rmatrix}{\code{signature(x = "ANY")}: Default method which calls \code{rmatrix,vector} on the dimensions of \code{x} that is assumed to be returned by a suitable \code{dim} method: it is equivalent to \code{rmatrix(dim(x), y=NULL, ...)}. } \item{rmatrix}{\code{signature(x = "NMF")}: Returns the target matrix estimate of the NMF model \code{x}, perturbated by adding a random matrix generated using the default method of \code{rmatrix}: it is a equivalent to \code{fitted(x) + rmatrix(fitted(x), ...)}. This method can be used to generate random target matrices that depart from a known NMF model to a controlled extend. This is useful to test the robustness of NMF algorithms to the presence of certain types of noise in the data. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # rmatrix,numeric-method #---------- ## Generate a random matrix of a given size rmatrix(5, 3) \dontshow{ stopifnot( identical(dim(rmatrix(5, 3)), c(5L,3L)) ) } ## Generate a random matrix of the same dimension of a template matrix a <- matrix(1, 3, 4) rmatrix(a) \dontshow{ stopifnot( identical(dim(rmatrix(a)), c(3L,4L)) ) } ## Specificy the distribution to use # the default is uniform a <- rmatrix(1000, 50) \dontrun{ hist(a) } # use normal ditribution a <- rmatrix(1000, 50, rnorm) \dontrun{ hist(a) } # extra arguments can be passed to the random variate generation function a <- rmatrix(1000, 50, rnorm, mean=2, sd=0.5) \dontrun{ hist(a) } #---------- # rmatrix,ANY-method #---------- # random matrix of the same dimension as another matrix x <- matrix(3,4) dim(rmatrix(x)) #---------- # rmatrix,NMF-method #---------- # generate noisy fitted target from an NMF model (the true model) gr <- as.numeric(mapply(rep, 1:3, 3)) h <- outer(1:3, gr, '==') + 0 x <- rnmf(10, H=h) y <- rmatrix(x) \dontrun{ # show heatmap of the noisy target matrix: block patterns should be clear aheatmap(y) } \dontshow{ stopifnot( identical(dim(y), dim(x)[1:2]) ) } # test NMF algorithm on noisy data # add some noise to the true model (drawn from uniform [0,1]) res <- nmf(rmatrix(x), 3) summary(res) # add more noise to the true model (drawn from uniform [0,10]) res <- nmf(rmatrix(x, max=10), 3) summary(res) } \keyword{methods} NMF/man/parallel.Rd0000644000176200001440000000436114333176413013541 0ustar liggesusers\name{parallel-NMF} \alias{gVariable} \alias{hostfile} \alias{parallel-NMF} \alias{ts_eval} \alias{ts_tempfile} \title{Utilities for Parallel Computations} \usage{ ts_eval(mutex = synchronicity::boost.mutex(), verbose = FALSE) ts_tempfile(pattern = "file", ..., host = TRUE, pid = TRUE) hostfile(pattern = "file", tmpdir = tempdir(), fileext = "", host = TRUE, pid = TRUE) gVariable(init, shared = FALSE) } \arguments{ \item{mutex}{a mutex or a mutex descriptor. If missing, a new mutex is created via the function \emph{boost.mutex} from the \emph{synchronicity} package.} \item{verbose}{a logical that indicates if messages should be printed when locking and unlocking the mutex.} \item{...}{extra arguments passed to \code{\link[base]{tempfile}}.} \item{host}{logical that indicates if the host machine name should be appear in the filename.} \item{pid}{logical that indicates if the current process id be appear in the filename.} \item{init}{initial value} \item{shared}{a logical that indicates if the variable should be stored in shared memory or in a local environment.} \item{pattern}{a non-empty character vector giving the initial part of the name.} \item{tmpdir}{a non-empty character vector giving the directory name} \item{fileext}{a non-empty character vector giving the file extension} } \description{ Utilities for Parallel Computations \code{ts_eval} generates a thread safe version of \code{\link{eval}}. It uses boost mutexes provided by the \emph{synchronicity} package. The generated function has arguments \code{expr} and \code{envir}, which are passed to \code{\link{eval}}. \code{ts_tempfile} generates a \emph{unique} temporary filename that includes the name of the host machine and/or the caller's process id, so that it is thread safe. \code{hostfile} generates a temporary filename composed with the name of the host machine and/or the current process id. \code{gVariable} generates a function that access a global static variable, possibly in shared memory (only for numeric matrix-coercible data in this case). It is used primarily in parallel computations, to preserve data accross computations that are performed by the same process. } NMF/man/algorithm-commaNMFList-method.Rd0000644000176200001440000000154014333176413017474 0ustar liggesusers\docType{methods} \name{algorithm,NMFList-method} \alias{algorithm,NMFList-method} \title{Returns the method names used to compute the NMF fits in the list. It returns \code{NULL} if the list is empty.} \usage{ \S4method{algorithm}{NMFList}(object, string = FALSE, unique = TRUE) } \arguments{ \item{string}{a logical that indicate whether the names should be collapsed into a comma-separated string.} \item{unique}{a logical that indicates whether the result should contain the set of method names, removing duplicated names. This argument is forced to \code{TRUE} when \code{string=TRUE}.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} } \description{ Returns the method names used to compute the NMF fits in the list. It returns \code{NULL} if the list is empty. } \keyword{methods} NMF/man/types.Rd0000644000176200001440000000777614333176413013126 0ustar liggesusers\name{is.nmf} \alias{hasBasis} \alias{hasCoef} \alias{is.empty.nmf} \alias{is.nmf} \alias{isNMFfit} \alias{is.partial.nmf} \title{Testing NMF Objects} \usage{ is.nmf(x) is.empty.nmf(x, ...) hasBasis(x) hasCoef(x) is.partial.nmf(x) isNMFfit(object, recursive = TRUE) } \arguments{ \item{x}{an R object. See section \emph{Details}, for how each function uses this argument.} \item{...}{extra parameters to allow extension or passed to subsequent calls} \item{object}{any R object.} \item{recursive}{if \code{TRUE} and \code{object} is a plain list then \code{isNMFfit} tests each element of the list. Note that the recursive test only applies in the case of lists that are not themselves NMFfit objects, like \code{NMFfitXn} objects for which the result of \code{isNMFfit} will always be \code{TRUE}, although they are list objects (a single logical value).} } \value{ \code{isNMFfit} returns a \code{logical} vector (or a list if \code{object} is a list of list) of the same length as \code{object}. } \description{ The functions documented here tests different characteristics of NMF objects. \code{is.nmf} tests if an object is an NMF model or a class that extends the class NMF. \code{hasBasis} tests whether an objects contains a basis matrix -- returned by a suitable method \code{basis} -- with at least one row. \code{hasBasis} tests whether an objects contains a coefficient matrix -- returned by a suitable method \code{coef} -- with at least one column. \code{is.partial.nmf} tests whether an NMF model object contains either an empty basis or coefficient matrix. It is a shorcut for \code{!hasCoef(x) || !hasBasis(x)}. } \details{ \code{is.nmf} tests if \code{object} is the name of a class (if a \code{character} string), or inherits from a class, that extends \code{\linkS4class{NMF}}. \code{is.empty.nmf} returns \code{TRUE} if the basis and coefficient matrices of \code{x} have respectively zero rows and zero columns. It returns \code{FALSE} otherwise. In particular, this means that an empty model can still have a non-zero number of basis components, i.e. a factorization rank that is not null. This happens, for example, in the case of NMF models created calling the factory method \code{\link{nmfModel}} with a value only for the factorization rank. \emph{isNMFfit} checks if \code{object} inherits from class \code{\linkS4class{NMFfit}} or \code{\linkS4class{NMFfitX}}, which are the two types of objects returned by the function \code{\link{nmf}}. If \code{object} is a plain \code{list} and \code{recursive=TRUE}, then the test is performed on each element of the list, and the return value is a logical vector (or a list if \code{object} is a list of list) of the same length as \code{object}. } \note{ The function \code{is.nmf} does some extra work with the namespace as this function needs to return correct results even when called in \code{.onLoad}. See discussion on r-devel: \url{https://stat.ethz.ch/pipermail/r-devel/2011-June/061357.html} } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # is.nmf #---------- # test if an object is an NMF model, i.e. that it implements the NMF interface is.nmf(1:4) is.nmf( nmfModel(3) ) is.nmf( nmf(rmatrix(10, 5), 2) ) #---------- # is.empty.nmf #---------- # empty model is.empty.nmf( nmfModel(3) ) # non empty models is.empty.nmf( nmfModel(3, 10, 0) ) is.empty.nmf( rnmf(3, 10, 5) ) #---------- # isNMFfit #---------- ## Testing results of fits # generate a random V <- rmatrix(20, 10) # single run -- using very low value for maxIter to speed up the example res <- nmf(V, 3, maxIter=3L) isNMFfit(res) # multiple runs - keeping single fit resm <- nmf(V, 3, nrun=2, maxIter=3L) isNMFfit(resm) # with a list of results isNMFfit(list(res, resm, 'not a result')) isNMFfit(list(res, resm, 'not a result'), recursive=FALSE) } \seealso{ \code{\linkS4class{NMFfit}}, \code{\linkS4class{NMFfitX}}, \code{\linkS4class{NMFfitXn}} } NMF/man/NMFStrategy-class.Rd0000644000176200001440000001034514333176413015212 0ustar liggesusers\docType{class} \name{NMFStrategy-class} \alias{is.mixed} \alias{NMFStrategy-class} \alias{objective<-,NMFStrategy,character-method} \alias{objective<-,NMFStrategy,function-method} \alias{objective,NMFStrategy-method} \alias{show,NMFStrategy-method} \title{Virtual Interface for NMF Algorithms} \usage{ \S4method{show}{NMFStrategy}(object) \S4method{objective}{NMFStrategy}(object) \S4method{objective}{NMFStrategy,character}(object)<-value \S4method{objective}{NMFStrategy,function}(object)<-value is.mixed(object) } \arguments{ \item{object}{Any R object} \item{value}{replacement value} } \description{ This class partially implements the generic interface defined for general algorithms defined in the \pkg{NMF} package (see \code{\link{algorithmic-NMF}}). \code{is.mixed} tells if an NMF algorithm works on mixed-sign data. } \section{Slots}{ \describe{ \item{objective}{the objective function associated with the algorithm (Frobenius, Kullback-Leibler, etc...). It is either an access key of a registered objective function or a function definition. In the latter case, the given function must have the following signature \code{(x="NMF", y="matrix")} and return a nonnegative real value.} \item{model}{a character string giving either the (sub)class name of the NMF-class instance used and returned by the strategy, or a function name.} \item{mixed}{a logical that indicates if the algorithm works on mixed-sign data.} } } \section{Methods}{ \describe{ \item{canFit}{\code{signature(x = "NMFStrategy", y = "character")}: Tells if an NMF algorithm can fit a given class of NMF models } \item{canFit}{\code{signature(x = "NMFStrategy", y = "NMF")}: Tells if an NMF algorithm can fit the same class of models as \code{y} } \item{deviance}{\code{signature(object = "NMFStrategy")}: Computes the value of the objective function between the estimate \code{x} and the target \code{y}. } \item{modelname}{\code{signature(object = "NMFStrategy")}: Returns the model(s) that an NMF algorithm can fit. } \item{NMFStrategy}{\code{signature(name = "NMFStrategy", method = "missing")}: Creates an \code{NMFStrategy} based on a template object (Constructor-Copy), in particular it uses the \strong{same} name. } \item{objective}{\code{signature(object = "NMFStrategy")}: Gets the objective function associated with an NMF algorithm. It is used in \code{\link[=deviance,NMFStrategy-method]{deviance}} to compute the objective value for an NMF model with respect to a given target matrix. } \item{objective}{\code{signature(object = "NMFStrategy")}: Gets the objective function associated with an NMF algorithm. It is used in \code{\link[=deviance,NMFStrategy-method]{deviance}} to compute the objective value for an NMF model with respect to a given target matrix. } \item{objective<-}{\code{signature(object = "NMFStrategy", value = "character")}: Sets the objective function associated with an NMF algorithm, with a character string that must be a registered objective function. } \item{objective<-}{\code{signature(object = "NMFStrategy", value = "character")}: Sets the objective function associated with an NMF algorithm, with a character string that must be a registered objective function. } \item{objective<-}{\code{signature(object = "NMFStrategy", value = "function")}: Sets the objective function associated with an NMF algorithm, with a function that computes the approximation error between an NMF model and a target matrix. } \item{objective<-}{\code{signature(object = "NMFStrategy", value = "function")}: Sets the objective function associated with an NMF algorithm, with a function that computes the approximation error between an NMF model and a target matrix. } \item{run}{\code{signature(object = "NMFStrategy", y = "matrix", x = "NMFfit")}: Pure virtual method defined for all NMF algorithms to ensure that a method \code{run} is defined by sub-classes of \code{NMFStrategy}. It throws an error if called directly. } \item{run}{\code{signature(object = "NMFStrategy", y = "matrix", x = "NMF")}: Method to run an NMF algorithm directly starting from a given NMF model. } } } \keyword{internal} \keyword{methods} NMF/man/ccRamp.Rd0000644000176200001440000000033014333176413013142 0ustar liggesusers\name{ccRamp} \alias{ccRamp} \title{Builds a Color Ramp from Compact Color Specification} \usage{ ccRamp(x, n = NA, ...) } \description{ Builds a Color Ramp from Compact Color Specification } \keyword{internal} NMF/man/offset-commaNMFOffset-method.Rd0000644000176200001440000000062614333176413017313 0ustar liggesusers\docType{methods} \name{offset,NMFOffset-method} \alias{offset,NMFOffset-method} \title{Offsets in NMF Models with Offset} \usage{ \S4method{offset}{NMFOffset}(object) } \arguments{ \item{object}{an instance of class \code{NMFOffset}.} } \description{ The function \code{offset} returns the offset vector from an NMF model that has an offset, e.g. an \code{NMFOffset} model. } \keyword{methods} NMF/man/show-commaNMFfit-method.Rd0000644000176200001440000000045214333176413016336 0ustar liggesusers\docType{methods} \name{show,NMFfit-method} \alias{show,NMFfit-method} \title{Show method for objects of class \code{NMFfit}} \usage{ \S4method{show}{NMFfit}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFfit} } \keyword{methods} NMF/man/sparseness.Rd0000644000176200001440000000465114333176413014135 0ustar liggesusers\docType{methods} \name{sparseness} \alias{sparseness} \alias{sparseness,matrix-method} \alias{sparseness-methods} \alias{sparseness,NMF-method} \alias{sparseness,numeric-method} \title{Sparseness} \usage{ sparseness(x, ...) } \arguments{ \item{x}{an object whose sparseness is computed.} \item{...}{extra arguments to allow extension} } \value{ usually a single numeric value -- in [0,1], or a numeric vector. See each method for more details. } \description{ Generic function that computes the \emph{sparseness} of an object, as defined by \cite{Hoyer (2004)}. The sparseness quantifies how much energy of a vector is packed into only few components. } \details{ In \cite{Hoyer (2004)}, the sparseness is defined for a real vector \eqn{x} as: \deqn{Sparseness(x) = \frac{\sqrt{n} - \frac{\sum |x_i|}{\sqrt{\sum x_i^2}}}{\sqrt{n}-1}}{ (srqt(n) - ||x||_1 / ||x||_2) / (sqrt(n) - 1)} , where \eqn{n} is the length of \eqn{x}. The sparseness is a real number in \eqn{[0,1]}. It is equal to 1 if and only if \code{x} contains a single nonzero component, and is equal to 0 if and only if all components of \code{x} are equal. It interpolates smoothly between these two extreme values. The closer to 1 is the sparseness the sparser is the vector. The basic definition is for a \code{numeric} vector, and is extended for matrices as the mean sparseness of its column vectors. } \section{Methods}{ \describe{ \item{sparseness}{\code{signature(x = "numeric")}: Base method that computes the sparseness of a numeric vector. It returns a single numeric value, computed following the definition given in section \emph{Description}. } \item{sparseness}{\code{signature(x = "matrix")}: Computes the sparseness of a matrix as the mean sparseness of its column vectors. It returns a single numeric value. } \item{sparseness}{\code{signature(x = "NMF")}: Compute the sparseness of an object of class \code{NMF}, as the sparseness of the basis and coefficient matrices computed separately. It returns the two values in a numeric vector with names \sQuote{basis} and \sQuote{coef}. } } } \references{ Hoyer P (2004). "Non-negative matrix factorization with sparseness constraints." _The Journal of Machine Learning Research_, *5*, pp. 1457-1469. . } \seealso{ Other assess: \code{\link{entropy}}, \code{\link{purity}} } \keyword{methods} NMF/man/NMF-package.Rd0000644000176200001440000000211414333176413013750 0ustar liggesusers\docType{package} \name{NMF-package} \alias{NMF} \alias{NMF-package} \title{Algorithms and framework for Nonnegative Matrix Factorization (NMF).} \description{ This package provides a framework to perform Non-negative Matrix Factorization (NMF). It implements a set of already published algorithms and seeding methods, and provides a framework to test, develop and plug new/custom algorithms. Most of the built-in algorithms have been optimized in C++, and the main interface function provides an easy way of performing parallel computations on multicore machines. } \details{ \code{\link{nmf}} Run a given NMF algorithm } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes n <- 50; counts <- c(5, 5, 8); V <- syntheticNMF(n, counts) # perform a 3-rank NMF using the default algorithm res <- nmf(V, 3) basismap(res) coefmap(res) } \author{ Renaud Gaujoux \email{renaud@cbio.uct.ac.za} } \references{ \url{https://cran.r-project.org/} } \seealso{ \code{\link{nmf}} } \keyword{package} NMF/man/consensus-commaNMFfitXn-method.Rd0000644000176200001440000000173114333176413017705 0ustar liggesusers\docType{methods} \name{consensus,NMFfitXn-method} \alias{consensus,NMFfitXn-method} \alias{plot.NMF.consensus} \title{Computes the consensus matrix of the set of fits stored in \code{object}, as the mean connectivity matrix across runs.} \usage{ \S4method{consensus}{NMFfitXn}(object, ..., no.attrib = FALSE) } \arguments{ \item{object}{an object with a suitable \code{\link{predict}} method.} \item{...}{extra arguments to allow extension. They are passed to \code{\link{predict}}, except for the \code{vector} and \code{factor} methods.} \item{no.attrib}{a logical that indicates if attributes containing information about the NMF model should be attached to the result (\code{TRUE}) or not (\code{FALSE}).} } \description{ This method returns \code{NULL} on an empty object. The result is a matrix with several attributes attached, that are used by plotting functions such as \code{\link{consensusmap}} to annotate the plots. } \keyword{methods} NMF/man/nmf.Rd0000644000176200001440000007442214660663712012540 0ustar liggesusers\docType{methods} \name{nmf} \alias{nmf} \alias{nmf,data.frame,ANY,ANY-method} \alias{nmf,formula,ANY,ANY-method} \alias{nmf,matrix,data.frame,ANY-method} \alias{nmf,matrix,matrix,ANY-method} \alias{nmf,matrix,missing,ANY-method} \alias{nmf,matrix,NMF,ANY-method} \alias{nmf,matrix,NULL,ANY-method} \alias{nmf,matrix,numeric,character-method} \alias{nmf,matrix,numeric,function-method} \alias{nmf,matrix,numeric,list-method} \alias{nmf,matrix,numeric,missing-method} \alias{nmf,matrix,numeric,NMFStrategy-method} \alias{nmf,matrix,numeric,NULL-method} \alias{nmf-methods} \title{Running NMF algorithms} \usage{ nmf(x, rank, method, ...) \S4method{nmf}{matrix,numeric,NULL}(x, rank, method, seed = NULL, model = NULL, ...) \S4method{nmf}{matrix,numeric,list}(x, rank, method, ..., .parameters = list()) \S4method{nmf}{matrix,numeric,function}(x, rank, method, seed, model = "NMFstd", ..., name, objective = "euclidean", mixed = FALSE) \S4method{nmf}{matrix,NMF,ANY}(x, rank, method, seed, ...) \S4method{nmf}{matrix,NULL,ANY}(x, rank, method, seed, ...) \S4method{nmf}{matrix,matrix,ANY}(x, rank, method, seed, model = list(), ...) \S4method{nmf}{formula,ANY,ANY}(x, rank, method, ..., model = NULL) \S4method{nmf}{matrix,numeric,NMFStrategy}(x, rank, method, seed = nmf.getOption("default.seed"), rng = NULL, nrun = if (length(rank) > 1) 30 else 1, model = NULL, .options = list(), .pbackend = nmf.getOption("pbackend"), .callback = NULL, ...) } \arguments{ \item{x}{target data to fit, i.e. a matrix-like object} \item{rank}{specification of the factorization rank. It is usually a single numeric value, but other type of values are possible (e.g. matrix), for which specific methods are implemented. See for example methods \code{nmf,matrix,matrix,ANY}. If \code{rank} is a numeric vector with more than one element, e.g. a range of ranks, then \code{\link{nmf}} performs the estimation procedure described in \code{\link{nmfEstimateRank}}.} \item{method}{specification of the NMF algorithm. The most common way of specifying the algorithm is to pass the access key (i.e. a character string) of an algorithm stored in the package's dedicated registry, but methods exists that handle other types of values, such as \code{function} or \code{list} object. See their descriptions in section \emph{Methods}. If \code{method} is missing the algorithm to use is obtained from the option \code{nmf.getOption('default.algorithm')}, unless it can be infer from the type of NMF model to fit, if this later is available from other arguments. Factory fresh default value is \sQuote{brunet}, which corresponds to the standard NMF algorithm from \cite{Brunet2004} (see section \emph{Algorithms}). Cases where the algorithm is inferred from the call are when an NMF model is passed in arguments \code{rank} or \code{seed} (see description for \code{nmf,matrix,numeric,NULL} in section \emph{Methods}).} \item{...}{extra arguments to allow extension of the generic. Arguments that are not used in the chain of internal calls to \code{nmf} methods are passed to the function that effectively implements the algorithm that fits an NMF model on \code{x}.} \item{.parameters}{list of method-specific parameters. Its elements must have names matching a single method listed in \code{method}, and be lists of named values that are passed to the corresponding method.} \item{name}{name associated with the NMF algorithm implemented by the function \code{method} [only used when \code{method} is a function].} \item{objective}{specification of the objective function associated with the algorithm implemented by the function \code{method} [only used when \code{method} is a function]. It may be either \code{'euclidean'} or \code{'KL'} for specifying the euclidean distance (Frobenius norm) or the Kullback-Leibler divergence respectively, or a function with signature \code{(x="NMF", y="matrix", ...)} that computes the objective value for an NMF model \code{x} on a target matrix \code{y}, i.e. the residuals between the target matrix and its NMF estimate. Any extra argument may be specified, e.g. \code{function(x, y, alpha, beta=2, ...)}.} \item{mixed}{a logical that indicates if the algorithm implemented by the function \code{method} support mixed-sign target matrices, i.e. that may contain negative values [only used when \code{method} is a function].} \item{seed}{specification of the starting point or seeding method, which will compute a starting point, usually using data from the target matrix in order to provide a good guess. The seeding method may be specified in the following way: \describe{ \item{a \code{character} string:}{ giving the name of a \emph{registered} seeding method. The corresponding method will be called to compute the starting point. Available methods can be listed via \code{nmfSeed()}. See its dedicated documentation for details on each available registered methods (\code{\link{nmfSeed}}). } \item{a \code{list}:}{ giving the name of a \emph{registered} seeding method and, optionally, extra parameters to pass to it.} \item{a single \code{numeric}:}{ that is used to seed the random number generator, before generating a random starting point. Note that when performing multiple runs, the L'Ecuyer's RNG is used in order to produce a sequence of random streams, that is used in way that ensures that parallel computation are fully reproducible. } \item{an object that inherits from \code{\linkS4class{NMF}}:}{ it should contain the data of an initialised NMF model, i.e. it must contain valid basis and mixture coefficient matrices, directly usable by the algorithm's workhorse function.} \item{a \code{function}:}{ that computes the starting point. It must have signature \code{(object="NMF", target="matrix", ...)} and return an object that inherits from class \code{NMF}. It is recommended to use argument \code{object} as a template for the returned object, by only updating the basis and coefficient matrices, using \code{\link{basis<-}} and \code{\link{coef<-}} respectively. } }} \item{rng}{rng specification for the run(s). This argument should be used to set the the RNG seed, while still specifying the seeding method argument \var{seed}.} \item{model}{specification of the type of NMF model to use. It is used to instantiate the object that inherits from class \code{\linkS4class{NMF}}, that will be passed to the seeding method. The following values are supported: \itemize{ \item \code{NULL}, the default model associated to the NMF algorithm is instantiated and \code{...} is looked-up for arguments with names that correspond to slots in the model class, which are passed to the function \code{\link{nmfModel}} to instantiate the model. Arguments in \code{...} that do not correspond to slots are passed to the algorithm. \item a single \code{character} string, that is the name of the NMF model class to be instantiate. In this case, arguments in \code{...} are handled in the same way as when \code{model} is \code{NULL}. \item a \code{list} that contains named values that are passed to the function \code{\link{nmfModel}} to instantiate the model. In this case, \code{...} is not looked-up at all, and passed entirely to the algorithm. This means that all necessary model parameters must be specified in \code{model}. } \strong{Argument/slot conflicts:} In the case a parameter of the algorithm has the same name as a model slot, then \code{model} MUST be a list -- possibly empty --, if one wants this parameter to be effectively passed to the algorithm. If a variable appears in both arguments \code{model} and \code{\dots}, the former will be used to initialise the NMF model, the latter will be passed to the NMF algorithm. See code examples for an illustration of this situation.} \item{nrun}{number of runs to perform. It specifies the number of runs to perform. By default only one run is performed, except if \code{rank} is a numeric vector with more than one element, in which case a default of 30 runs per value of the rank are performed, allowing the computation of a consensus matrix that is used in selecting the appropriate rank (see \code{\link{consensus}}). When using a random seeding method, multiple runs are generally required to achieve stability and avoid \emph{bad} local minima.} \item{.options}{this argument is used to set runtime options. It can be a \code{list} containing named options with their values, or, in the case only boolean/integer options need to be set, a character string that specifies which options are turned on/off or their value, in a unix-like command line argument way. The string must be composed of characters that correspond to a given option (see mapping below), and modifiers '+' and '-' that toggle options on and off respectively. E.g. \code{.options='tv'} will toggle on options \code{track} and \code{verbose}, while \code{.options='t-v'} will toggle on option \code{track} and toggle off option \code{verbose}. Modifiers '+' and '-' apply to all option character found after them: \code{t-vp+k} means \code{track=TRUE}, \code{verbose=parallel=FALSE}, and \code{keep.all=TRUE}. The default behaviour is to assume that \code{.options} starts with a '+'. for options that accept integer values, the value may be appended to the option's character e.g. \code{'p4'} for asking for 4 processors or \code{'v3'} for showing verbosity message up to level 3. The following options are available (the characters after \dQuote{-} are those to use to encode \code{.options} as a string): \describe{ \item{debug - d}{ Toggle debug mode (default: \code{FALSE}). Like option \code{verbose} but with more information displayed.} \item{keep.all - k}{ used when performing multiple runs (\code{nrun}>1): if \code{TRUE}, all factorizations are saved and returned (default: \code{FALSE}). Otherwise only the factorization achieving the minimum residuals is returned.} \item{parallel - p}{ this option is useful on multicore *nix or Mac machine only, when performing multiple runs (\code{nrun} > 1) (default: \code{TRUE}). If \code{TRUE}, the runs are performed using the parallel foreach backend defined in argument \code{.pbackend}. If this is set to \code{'mc'} or \code{'par'} then \code{nmf} tries to perform the runs using multiple cores with package \code{\link[doParallel]{doParallel}} -- which therefore needs to be installed. If equal to an integer, then \code{nmf} tries to perform the computation on the specified number of processors. When passing options as a string the number is appended to the option's character e.g. \code{'p4'} for asking for 4 processors. If \code{FALSE}, then the computation is performed sequentially using the base function \code{\link{sapply}}. Unlike option 'P' (capital 'P'), if the computation cannot be performed in parallel, then it will still be carried on sequentially. \strong{IMPORTANT NOTE FOR MAC OS X USERS:} The parallel computation is based on the \code{doMC} and \code{multicore} packages, so the same care should be taken as stated in the vignette of \code{doMC}: \emph{\dQuote{it is not safe to use doMC from R.app on Mac OS X. Instead, you should use doMC from a terminal session, starting R from the command line.}} } \item{parallel.required - P}{ Same as \code{p}, but an error is thrown if the computation cannot be performed in parallel or with the specified number of processors.} \item{shared.memory - m}{ toggle usage of shared memory (requires the package \emph{synchronicity}). Default is as defined by \code{nmf.getOption('shared.memory')}.} \item{restore.seed - r}{ deprecated option since version 0.5.99. Will throw a warning if used.} \item{simplifyCB - S}{ toggle simplification of the callback results. Default is \code{TRUE}} \item{track - t}{ enables error tracking (default: FALSE). If \code{TRUE}, the returned object's slot \code{residuals} contains the trajectory of the objective values, which can be retrieved via \code{residuals(res, track=TRUE)} This tracking functionality is available for all built-in algorithms. } \item{verbose - v}{ Toggle verbosity (default: \code{FALSE}). If \code{TRUE}, messages about the configuration and the state of the current run(s) are displayed. The level of verbosity may be specified with an integer value, the greater the level the more messages are displayed. Value \code{FALSE} means no messages are displayed, while value \code{TRUE} is equivalent to verbosity level 1. } }} \item{.pbackend}{specification of the \code{\link[foreach]{foreach}} parallel backend to register and/or use when running in parallel mode. See options \code{p} and \code{P} in argument \code{.options} for how to enable this mode. Note that any backend that is internally registered is cleaned-up on exit, so that the calling foreach environment should not be affected by a call to \code{nmf} -- except when \code{.pbackend=NULL}. Currently it accepts the following values: \describe{ \item{\sQuote{par}}{ use the backend(s) defined by the package \code{\link[doParallel]{doParallel}};} \item{a numeric value}{ use the specified number of cores with \code{doParallel} backend;} \item{\sQuote{seq}}{ use the foreach sequential backend \code{doSEQ};} \item{\code{NULL}}{ use currently registered backend;} \item{\code{NA}}{ do not compute using a foreach loop -- and therefore not in parallel -- but rather use a call to standard \code{\link{sapply}}. This is useful for when developing/debugging NMF algorithms, as foreach loop handling may sometime get in the way. Note that this is equivalent to using \code{.options='-p'} or \code{.options='p0'}, but takes precedence over any option specified in \code{.options}: e.g. \code{nmf(..., .options='P10', .pbackend=NA)} performs all runs sequentially using \code{sapply}. Use \code{nmf.options(pbackend=NA)} to completely disable foreach/parallel computations for all subsequent \code{nmf} calls.} \item{\sQuote{mc}}{ identical to \sQuote{par} and defined to ensure backward compatibility.} }} \item{.callback}{Used when option \code{keep.all=FALSE} (default). It allows to pass a callback function that is called after each run when performing multiple runs (i.e. with \code{nrun>1}). This is useful for example if one is also interested in saving summary measures or process the result of each NMF fit before it gets discarded. After each run, the callback function is called with two arguments, the \code{\linkS4class{NMFfit}} object that as just been fitted and the run number: \code{.callback(res, i)}. For convenience, a function that takes only one argument or has signature \code{(x, ...)} can still be passed in \code{.callback}. It is wrapped internally into a dummy function with two arguments, only the first of which is passed to the actual callback function (see example with \code{summary}). The call is wrapped into a tryCatch so that callback errors do not stop the whole computation (see below). The results of the different calls to the callback function are stored in a miscellaneous slot accessible using the method \code{$} for \code{NMFfit} objects: \code{res$.callback}. By default \code{nmf} tries to simplify the list of callback result using \code{sapply}, unless option \code{'simplifyCB'} is \code{FASE}. If no error occurs \code{res$.callback} contains the list of values that resulted from the calling the callback function --, ordered as the fits. If any error occurs in one of the callback calls, then the whole computation is \strong{not} stopped, but the error message is stored in \code{res$.callback}, in place of the result. See the examples for sample code.} } \value{ The returned value depends on the run mode: \item{Single run:}{An object of class \code{\linkS4class{NMFfit}}.} \item{Multiple runs, single method:}{When \code{nrun > 1} and \code{method} is not \code{list}, this method returns an object of class \code{\linkS4class{NMFfitX}}.} \item{Multiple runs, multiple methods:}{When \code{nrun > 1} and \code{method} is a \code{list}, this method returns an object of class \code{\linkS4class{NMFList}}.} } \description{ The function \code{nmf} is a S4 generic defines the main interface to run NMF algorithms within the framework defined in package \code{NMF}. It has many methods that facilitates applying, developing and testing NMF algorithms. The package vignette \code{vignette('NMF')} contains an introduction to the interface, through a sample data analysis. } \details{ The \code{nmf} function has multiple methods that compose a very flexible interface allowing to: \itemize{ \item combine NMF algorithms with seeding methods and/or stopping/convergence criterion at runtime; \item perform multiple NMF runs, which are computed in parallel whenever the host machine allows it; \item run multiple algorithms with a common set of parameters, ensuring a consistent environment (notably the RNG settings). } The workhorse method is \code{nmf,matrix,numeric,NMFStrategy}, which is eventually called by all other methods. The other methods provides convenient ways of specifying the NMF algorithm(s), the factorization rank, or the seed to be used. Some allow to directly run NMF algorithms on different types of objects, such as \code{data.frame} or \emph{ExpressionSet} objects. } \section{Methods}{ \describe{ \item{nmf}{\code{signature(x = "data.frame", rank = "ANY", method = "ANY")}: Fits an NMF model on a \code{data.frame}. The target \code{data.frame} is coerced into a matrix with \code{\link{as.matrix}}. } \item{nmf}{\code{signature(x = "matrix", rank = "numeric", method = "NULL")}: Fits an NMF model using an appropriate algorithm when \code{method} is not supplied. This method tries to select an appropriate algorithm amongst the NMF algorithms stored in the internal algorithm registry, which contains the type of NMF models each algorithm can fit. This is possible when the type of NMF model to fit is available from argument \code{seed}, i.e. if it is an NMF model itself. Otherwise the algorithm to use is obtained from \code{nmf.getOption('default.algorithm')}. This method is provided for internal usage, when called from other \code{nmf} methods with argument \code{method} missing in the top call (e.g. \code{nmf,matrix,numeric,missing}). } \item{nmf}{\code{signature(x = "matrix", rank = "numeric", method = "list")}: Fits multiple NMF models on a common matrix using a list of algorithms. The models are fitted sequentially with \code{nmf} using the same options and parameters for all algorithms. In particular, irrespective of the way the computation is seeded, this method ensures that all fits are performed using the same initial RNG settings. This method returns an object of class \code{\linkS4class{NMFList}}, that is essentially a list containing each fit. } \item{nmf}{\code{signature(x = "matrix", rank = "numeric", method = "character")}: Fits an NMF model on \code{x} using an algorithm registered with access key \code{method}. Argument \code{method} is partially match against the access keys of all registered algorithms (case insensitive). Available algorithms are listed in section \emph{Algorithms} below or the introduction vignette. A vector of their names may be retrieved via \code{nmfAlgorithm()}. } \item{nmf}{\code{signature(x = "matrix", rank = "numeric", method = "function")}: Fits an NMF model on \code{x} using a custom algorithm defined the function \code{method}. The supplied function must have signature \code{(x=matrix, start=NMF, ...)} and return an object that inherits from class \code{\linkS4class{NMF}}. It will be called internally by the workhorse \code{nmf} method, with an NMF model to be used as a starting point passed in its argument \code{start}. Extra arguments in \code{...} are passed to \code{method} from the top \code{nmf} call. Extra arguments that have no default value in the definition of the function \code{method} are required to run the algorithm (e.g. see argument \code{alpha} of \code{myfun} in the examples). If the algorithm requires a specific type of NMF model, this can be specified in argument \code{model} that is handled as in the workhorse \code{nmf} method (see description for this argument). } \item{nmf}{\code{signature(x = "matrix", rank = "NMF", method = "ANY")}: Fits an NMF model using the NMF model \code{rank} to seed the computation, i.e. as a starting point. This method is provided for convenience as a shortcut for \code{nmf(x, nbasis(object), method, seed=object, ...)} It discards any value passed in argument \code{seed} and uses the NMF model passed in \code{rank} instead. It throws a warning if argument \code{seed} not missing. If \code{method} is missing, this method will call the method \code{nmf,matrix,numeric,NULL}, which will infer an algorithm suitable for fitting an NMF model of the class of \code{rank}. } \item{nmf}{\code{signature(x = "matrix", rank = "NULL", method = "ANY")}: Fits an NMF model using the NMF model supplied in \code{seed}, to seed the computation, i.e. as a starting point. This method is provided for completeness and is equivalent to \code{nmf(x, seed, method, ...)}. } \item{nmf}{\code{signature(x = "matrix", rank = "missing", method = "ANY")}: Method defined to ensure the correct dispatch to workhorse methods in case of argument \code{rank} is missing. } \item{nmf}{\code{signature(x = "matrix", rank = "numeric", method = "missing")}: Method defined to ensure the correct dispatch to workhorse methods in case of argument \code{method} is missing. } \item{nmf}{\code{signature(x = "matrix", rank = "matrix", method = "ANY")}: Fits an NMF model partially seeding the computation with a given matrix passed in \code{rank}. The matrix \code{rank} is used either as initial value for the basis or mixture coefficient matrix, depending on its dimension. Currently, such partial NMF model is directly used as a seed, meaning that the remaining part is left uninitialised, which is not accepted by all NMF algorithm. This should change in the future, where the missing part of the model will be drawn from some random distribution. Amongst built-in algorithms, only \sQuote{snmf/l} and \sQuote{snmf/r} support partial seeds, with only the coefficient or basis matrix initialised respectively. } \item{nmf}{\code{signature(x = "matrix", rank = "data.frame", method = "ANY")}: Shortcut for \code{nmf(x, as.matrix(rank), method, ...)}. } \item{nmf}{\code{signature(x = "formula", rank = "ANY", method = "ANY")}: This method implements the interface for fitting formula-based NMF models. See \code{\link{nmfModel}}. Argument \code{rank} target matrix or formula environment. If not missing, \code{model} must be a \code{list}, a \code{data.frame} or an \code{environment} in which formula variables are searched for. } } } \section{Optimized C++ vs. plain R}{ Lee and Seung's multiplicative updates are used by several NMF algorithms. To improve speed and memory usage, a C++ implementation of the specific matrix products is used whenever possible. It directly computes the updates for each entry in the updated matrix, instead of using multiple standard matrix multiplication. The algorithms that benefit from this optimization are: 'brunet', 'lee', 'nsNMF' and 'offset'. % and 'lnmf' However there still exists plain R versions for these methods, which implement the updates as standard matrix products. These are accessible by adding the prefix '.R#' to their name: '.R#brunet', '.R#lee', '.R#nsNMF' and '.R#offset'. } \section{Algorithms}{ All algorithms are accessible by their respective access key as listed below. The following algorithms are available: \describe{ \item{\sQuote{brunet}}{ Standard NMF, based on the Kullback-Leibler divergence, from \cite{Brunet et al. (2004)}. It uses simple multiplicative updates from \cite{Lee et al. (2001)}, enhanced to avoid numerical underflow. Default stopping criterion: invariance of the connectivity matrix (see \code{\link{nmf.stop.connectivity}}). } \item{\sQuote{lee}}{ Standard NMF based on the Euclidean distance from \cite{Lee et al. (2001)}. It uses simple multiplicative updates. Default stopping criterion: invariance of the connectivity matrix (see \code{\link{nmf.stop.connectivity}}). } \item{ls-nmf}{ Least-Square NMF from \cite{Wang et al. (2006)}. It uses modified versions of Lee and Seung's multiplicative updates for the Euclidean distance, which incorporates weights on each entry of the target matrix, e.g. to reflect measurement uncertainty. Default stopping criterion: stationarity of the objective function (see \code{\link{nmf.stop.stationary}}). } \item{\sQuote{nsNMF}}{ Nonsmooth NMF from \cite{Pascual-Montano et al. (2006)}. It uses a modified version of Lee and Seung's multiplicative updates for the Kullback-Leibler divergence \cite{Lee et al. (2001)}, to fit a extension of the standard NMF model, that includes an intermediate smoothing matrix, meant meant to produce sparser factors. Default stopping criterion: invariance of the connectivity matrix (see \code{\link{nmf.stop.connectivity}}). } \item{\sQuote{offset}}{ NMF with offset from \cite{Badea (2008)}. It uses a modified version of Lee and Seung's multiplicative updates for Euclidean distance \cite{Lee et al. (2001)}, to fit an NMF model that includes an intercept, meant to capture a common baseline and shared patterns, in order to produce cleaner basis components. Default stopping criterion: invariance of the connectivity matrix (see \code{\link{nmf.stop.connectivity}}). } \item{\sQuote{pe-nmf}}{ Pattern-Expression NMF from \emph{Zhang2008}. It uses multiplicative updates to minimize an objective function based on the Euclidean distance, that is regularized for effective expression of patterns with basis vectors. Default stopping criterion: stationarity of the objective function (see \code{\link{nmf.stop.stationary}}). } \item{\sQuote{snmf/r}, \sQuote{snmf/l}}{ Alternating Least Square (ALS) approach from \cite{Kim et al. (2007)}. It applies the nonnegative least-squares algorithm from \cite{Van Benthem et al. (2004)} (i.e. fast combinatorial nonnegative least-squares for multiple right-hand), to estimate the basis and coefficient matrices alternatively (see \code{\link{fcnnls}}). It minimises an Euclidean-based objective function, that is regularized to favour sparse basis matrices (for \sQuote{snmf/l}) or sparse coefficient matrices (for \sQuote{snmf/r}). Stopping criterion: built-in within the internal workhorse function \code{nmf_snmf}, based on the KKT optimality conditions. } } } \section{Seeding methods}{ The purpose of seeding methods is to compute initial values for the factor matrices in a given NMF model. This initial guess will be used as a starting point by the chosen NMF algorithm. The seeding method to use in combination with the algorithm can be passed to interface \code{nmf} through argument \code{seed}. The seeding seeding methods available in registry are listed by the function \code{\link{nmfSeed}} (see list therein). Detailed examples of how to specify the seeding method and its parameters can be found in the \emph{Examples} section of this man page and in the package's vignette. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # Only basic calls are presented in this manpage. # Many more examples are provided in the demo file nmf.R \dontrun{ demo('nmf') } # random data x <- rmatrix(20,10) # run default algorithm with rank 2 res <- nmf(x, 2) # specify the algorithm res <- nmf(x, 2, 'lee') # get verbose message on what is going on res <- nmf(x, 2, .options='v') \dontrun{ # more messages res <- nmf(x, 2, .options='v2') # even more res <- nmf(x, 2, .options='v3') # and so on ... } } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . Wang G, Kossenkov AV and Ochs MF (2006). "LS-NMF: a modified non-negative matrix factorization algorithm utilizing uncertainty estimates." _BMC bioinformatics_, *7*, pp. 175. ISSN 1471-2105, , . Pascual-Montano A, Carazo JM, Kochi K, Lehmann D and Pascual-marqui RD (2006). "Nonsmooth nonnegative matrix factorization (nsNMF)." _IEEE Trans. Pattern Anal. Mach. Intell_, *28*, pp. 403-415. Badea L (2008). "Extracting gene expression profiles common to colon and pancreatic adenocarcinoma using simultaneous nonnegative matrix factorization." _Pacific Symposium on Biocomputing. Pacific Symposium on Biocomputing_, *290*, pp. 267-78. ISSN 1793-5091, . Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . Van Benthem M and Keenan MR (2004). "Fast algorithm for the solution of large-scale non-negativity-constrained least squares problems." _Journal of Chemometrics_, *18*(10), pp. 441-450. ISSN 0886-9383, , . } \seealso{ \code{\link{nmfAlgorithm}} } \keyword{methods} NMF/man/nmf.equal.Rd0000644000176200001440000000774314333176413013642 0ustar liggesusers\docType{methods} \name{nmf.equal} \alias{nmf.equal} \alias{nmf.equal,list,list-method} \alias{nmf.equal,list,missing-method} \alias{nmf.equal-methods} \alias{nmf.equal,NMFfit,NMFfit-method} \alias{nmf.equal,NMFfit,NMF-method} \alias{nmf.equal,NMFfitX1,NMFfitX1-method} \alias{nmf.equal,NMFfitX,NMF-method} \alias{nmf.equal,NMF,NMFfit-method} \alias{nmf.equal,NMF,NMFfitX-method} \alias{nmf.equal,NMF,NMF-method} \title{Testing Equality of NMF Models} \usage{ nmf.equal(x, y, ...) \S4method{nmf.equal}{NMF,NMF}(x, y, identical = TRUE, ...) \S4method{nmf.equal}{list,list}(x, y, ..., all = FALSE, vector = FALSE) } \arguments{ \item{x}{an NMF model or an object that is associated with an NMF model, e.g. the result from a fit with \code{\link{nmf}}.} \item{y}{an NMF model or an object that is associated with an NMF model, e.g. the result from a fit with \code{\link{nmf}}.} \item{identical}{a logical that indicates if the comparison should be made using the function \code{\link{identical}} (\code{TRUE}) or \code{\link{all.equal}} (\code{FALSE}). See description for method \code{nmf.equal,NMF,NMF}.} \item{...}{extra arguments to allow extension, and passed to subsequent calls} \item{all}{a logical that indicates if all fits should be compared separately or only the best fits} \item{vector}{a logical, only used when \code{all=TRUE}, that indicates if all fits must be equal for \code{x} and \code{y} to be declared equal, or if one wants to return the result of each comparison in a vector.} } \description{ The function \code{nmf.equal} tests if two NMF models are the same, i.e. they contain -- almost -- identical data: same basis and coefficient matrices, as well as same extra parameters. } \details{ \code{nmf.equal} compares two NMF models, and return \code{TRUE} iff they are identical acording to the function \code{\link{identical}} when \code{identical=TRUE}, or equal up to some tolerance acording to the function \code{\link{all.equal}}. This means that all data contained in the objects are compared, which includes at least the basis and coefficient matrices, as well as the extra parameters stored in slot \sQuote{misc}. If extra arguments are specified in \code{...}, then the comparison is performed using \code{\link{all.equal}}, irrespective of the value of argument \code{identical}. } \section{Methods}{ \describe{ \item{nmf.equal}{\code{signature(x = "NMF", y = "NMF")}: Compares two NMF models. Arguments in \code{...} are used only when \code{identical=FALSE} and are passed to \code{all.equal}. } \item{nmf.equal}{\code{signature(x = "NMFfit", y = "NMF")}: Compares two NMF models when at least one comes from a NMFfit object, i.e. an object returned by a single run of \code{\link{nmf}}. } \item{nmf.equal}{\code{signature(x = "NMF", y = "NMFfit")}: Compares two NMF models when at least one comes from a NMFfit object, i.e. an object returned by a single run of \code{\link{nmf}}. } \item{nmf.equal}{\code{signature(x = "NMFfit", y = "NMFfit")}: Compares two fitted NMF models, i.e. objects returned by single runs of \code{\link{nmf}}. } \item{nmf.equal}{\code{signature(x = "NMFfitX", y = "NMF")}: Compares two NMF models when at least one comes from multiple NMF runs. } \item{nmf.equal}{\code{signature(x = "NMF", y = "NMFfitX")}: Compares two NMF models when at least one comes from multiple NMF runs. } \item{nmf.equal}{\code{signature(x = "NMFfitX1", y = "NMFfitX1")}: Compares the NMF models fitted by multiple runs, that only kept the best fits. } \item{nmf.equal}{\code{signature(x = "list", y = "list")}: Compares the results of multiple NMF runs. This method either compare the two best fit, or all fits separately. All extra arguments in \code{...} are passed to each internal call to \code{nmf.equal}. } \item{nmf.equal}{\code{signature(x = "list", y = "missing")}: Compare all elements in \code{x} to \code{x[[1]]}. } } } \keyword{methods} NMF/man/deviance.Rd0000644000176200001440000000623614333176413013526 0ustar liggesusers\docType{methods} \name{deviance} \alias{deviance} \alias{deviance-methods} \alias{deviance,NMFfit-method} \alias{deviance,NMFfitX-method} \alias{deviance,NMF-method} \alias{deviance,NMFStrategy-method} \alias{nmfDistance} \title{Distances and Objective Functions} \usage{ deviance(object, ...) \S4method{deviance}{NMF}(object, y, method = c("", "KL", "euclidean"), ...) nmfDistance(method = c("", "KL", "euclidean")) \S4method{deviance}{NMFfit}(object, y, method, ...) \S4method{deviance}{NMFStrategy}(object, x, y, ...) } \arguments{ \item{y}{a matrix compatible with the NMF model \code{object}, i.e. \code{y} must have the same dimension as \code{fitted(object)}.} \item{method}{a character string or a function with signature \code{(x="NMF", y="matrix", ...)} that implements a distance measure between an NMF model \code{x} and a target matrix \code{y}, i.e. an objective function to use to compute the deviance. In \code{deviance}, it is passed to \code{nmfDistance} to get the function that effectively computes the deviance.} \item{...}{extra parameters passed to the objective function.} \item{x}{an NMF model that estimates \code{y}.} \item{object}{an object for which the deviance is desired.} } \value{ \code{deviance} returns a nonnegative numerical value \code{nmfDistance} returns a function with least two arguments: an NMF model and a matrix. } \description{ The NMF package defines methods for the generic \code{deviance} from the package \code{stats}, to compute approximation errors between NMF models and matrices, using a variety of objective functions. \code{nmfDistance} returns a function that computes the distance between an NMF model and a compatible matrix. } \section{Methods}{ \describe{ \item{deviance}{\code{signature(object = "NMF")}: Computes the distance between a matrix and the estimate of an \code{NMF} model. } \item{deviance}{\code{signature(object = "NMFfit")}: Returns the deviance of a fitted NMF model. This method returns the final residual value if the target matrix \code{y} is not supplied, or the approximation error between the fitted NMF model stored in \code{object} and \code{y}. In this case, the computation is performed using the objective function \code{method} if not missing, or the objective of the algorithm that fitted the model (stored in slot \code{'distance'}). If not computed by the NMF algorithm itself, the value is automatically computed at the end of the fitting process by the function \code{\link{nmf}}, using the objective function associated with the NMF algorithm, so that it should always be available. } \item{deviance}{\code{signature(object = "NMFfitX")}: Returns the deviance achieved by the best fit object, i.e. the lowest deviance achieved across all NMF runs. } \item{deviance}{\code{signature(object = "NMFStrategy")}: Computes the value of the objective function between the estimate \code{x} and the target \code{y}. } } } \seealso{ Other stats: \code{\link{deviance,NMF-method}}, \code{\link{hasTrack}}, \code{\link{residuals}}, \code{\link{residuals<-}}, \code{\link{trackError}} } \keyword{methods} NMF/man/ccPalette.Rd0000644000176200001440000000036314333176413013647 0ustar liggesusers\name{ccPalette} \alias{ccPalette} \title{Builds a Color Palette from Compact Color Specification} \usage{ ccPalette(x, n = NA, verbose = FALSE) } \description{ Builds a Color Palette from Compact Color Specification } \keyword{internal} NMF/man/basiscor.Rd0000644000176200001440000000642214333176413013552 0ustar liggesusers\docType{methods} \name{basiscor} \alias{basiscor} \alias{basiscor,matrix,NMF-method} \alias{basiscor-methods} \alias{basiscor,NMF,matrix-method} \alias{basiscor,NMF,missing-method} \alias{basiscor,NMF,NMF-method} \alias{profcor} \alias{profcor,matrix,NMF-method} \alias{profcor-methods} \alias{profcor,NMF,matrix-method} \alias{profcor,NMF,missing-method} \alias{profcor,NMF,NMF-method} \title{Correlations in NMF Models} \usage{ basiscor(x, y, ...) profcor(x, y, ...) } \arguments{ \item{x}{a matrix or an object with suitable methods \code{\link{basis}} or \code{\link{coef}}.} \item{y}{a matrix or an object with suitable methods \code{\link{basis}} or \code{\link{coef}}, and dimensions compatible with \code{x}. If missing the correlations are computed between \code{x} and \code{y=x}.} \item{...}{extra arguments passed to \code{\link{cor}}.} } \description{ \code{basiscor} computes the correlation matrix between basis vectors, i.e. the \emph{columns} of its basis matrix -- which is the model's first matrix factor. \code{profcor} computes the correlation matrix between basis profiles, i.e. the \emph{rows} of the coefficient matrix -- which is the model's second matrix factor. } \details{ Each generic has methods defined for computing correlations between NMF models and/or compatible matrices. The computation is performed by the base function \code{\link{cor}}. } \section{Methods}{ \describe{ \item{basiscor}{\code{signature(x = "NMF", y = "matrix")}: Computes the correlations between the basis vectors of \code{x} and the columns of \code{y}. } \item{basiscor}{\code{signature(x = "matrix", y = "NMF")}: Computes the correlations between the columns of \code{x} and the the basis vectors of \code{y}. } \item{basiscor}{\code{signature(x = "NMF", y = "NMF")}: Computes the correlations between the basis vectors of \code{x} and \code{y}. } \item{basiscor}{\code{signature(x = "NMF", y = "missing")}: Computes the correlations between the basis vectors of \code{x}. } \item{profcor}{\code{signature(x = "NMF", y = "matrix")}: Computes the correlations between the basis profiles of \code{x} and the rows of \code{y}. } \item{profcor}{\code{signature(x = "matrix", y = "NMF")}: Computes the correlations between the rows of \code{x} and the basis profiles of \code{y}. } \item{profcor}{\code{signature(x = "NMF", y = "NMF")}: Computes the correlations between the basis profiles of \code{x} and \code{y}. } \item{profcor}{\code{signature(x = "NMF", y = "missing")}: Computes the correlations between the basis profiles of \code{x}. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate two random NMF models a <- rnmf(3, 100, 20) b <- rnmf(3, 100, 20) # Compute auto-correlations basiscor(a) profcor(a) # Compute correlations with b basiscor(a, b) profcor(a, b) # try to recover the underlying NMF model 'a' from noisy data res <- nmf(fitted(a) + rmatrix(a), 3) # Compute correlations with the true model basiscor(a, res) profcor(a, res) # Compute correlations with a random compatible matrix W <- rmatrix(basis(a)) basiscor(a, W) identical(basiscor(a, W), basiscor(W, a)) H <- rmatrix(coef(a)) profcor(a, H) identical(profcor(a, H), profcor(H, a)) } \keyword{methods} NMF/man/nmfApply.Rd0000644000176200001440000000467414333176413013542 0ustar liggesusers\name{nmfApply} \alias{nmfApply} \title{Apply Function for NMF Objects} \usage{ nmfApply(X, MARGIN, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) } \arguments{ \item{X}{an object that has suitable \code{\link{basis}} and \code{coef} methods, e.g. an NMF model.} \item{MARGIN}{a single numeric (integer) value that specifies over which margin(s) the function \code{FUN} is applied. See section \emph{Details} for a list of possible values.} \item{FUN}{a function to apply over the specified margins.} \item{...}{extra arguments passed to \code{FUN}} \item{simplify}{a logical only used when \code{MARGIN=3}, that indicates if \code{sapply} should try to simplify result if possible. Since this argument follows \sQuote{...} its name cannot be abbreviated.} \item{USE.NAMES}{a logical only used when \code{MARGIN=3}, that indicates if \code{sapply} should use the names of the basis components to name the results if present. Since this argument follows \sQuote{...} its name cannot be abbreviated.} } \value{ a vector or a list. See \code{\link[base]{apply}} and \code{\link[base]{sapply}} for more details on the output format. } \description{ The function \code{nmfApply} provides exteneded \code{apply}-like functionality for objects of class \code{NMF}. It enables to easily apply a function over different margins of NMF models. } \details{ The function \code{FUN} is applied via a call to \code{\link{apply}} or \code{\link{sapply}} according to the value of argument \code{MARGIN} as follows: \describe{ \item{MARGIN=1}{ apply \code{FUN} to each \emph{row} of the basis matrix: \code{apply(basis(X), 1L, FUN, ...)}.} \item{MARGIN=2}{ apply \code{FUN} to each \emph{column} of the coefficient matrix: \code{apply(coef(X), 2L, FUN, ...)}.} \item{MARGIN=3}{ apply \code{FUN} to each \emph{pair} of associated basis component and basis profile: more or less \code{sapply(seq(nbasis(X)), function(i, ...) FUN(basis(X)[,i], coef(X)[i, ], ...), ...)}. In this case \code{FUN} must be have at least two arguments, to which are passed each basis components and basis profiles respectively -- as numeric vectors.} \item{MARGIN=4}{ apply \code{FUN} to each \emph{column} of the basis matrix, i.e. to each basis component: \code{apply(basis(X), 2L, FUN, ...)}.} \item{MARGIN=5}{ apply \code{FUN} to each \emph{row} of the coefficient matrix: \code{apply(coef(X), 1L, FUN, ...)}.} } } NMF/man/SNMF-nmf.Rd0000644000176200001440000000546114333176413013270 0ustar liggesusers\name{nmfAlgorithm.SNMF_R} \alias{nmfAlgorithm.SNMF_L} \alias{nmfAlgorithm.SNMF_R} \alias{SNMF/L-nmf} \alias{SNMF/R-nmf} \title{NMF Algorithm - Sparse NMF via Alternating NNLS} \usage{ nmfAlgorithm.SNMF_R(..., maxIter = 20000L, eta = -1, beta = 0.01, bi_conv = c(0, 10), eps_conv = 1e-04) nmfAlgorithm.SNMF_L(..., maxIter = 20000L, eta = -1, beta = 0.01, bi_conv = c(0, 10), eps_conv = 1e-04) } \arguments{ \item{maxIter}{maximum number of iterations.} \item{eta}{parameter to suppress/bound the L2-norm of \code{W} and in \code{H} in \sQuote{SNMF/R} and \sQuote{SNMF/L} respectively. If \code{eta < 0}, then it is set to the maximum value in the target matrix is used.} \item{beta}{regularisation parameter for sparsity control, which balances the trade-off between the accuracy of the approximation and the sparseness of \code{H} and \code{W} in \sQuote{SNMF/R} and \sQuote{SNMF/L} respectively. Larger beta generates higher sparseness on \code{H} (resp. \code{W}). Too large beta is not recommended.} \item{bi_conv}{parameter of the biclustering convergence test. It must be a size 2 numeric vector \code{bi_conv=c(wminchange, iconv)}, with: \describe{ \item{\code{wminchange}:}{the minimal allowance of change in row-clusters.} \item{\code{iconv}:}{ decide convergence if row-clusters (within the allowance of \code{wminchange}) and column-clusters have not changed for \code{iconv} convergence checks.} } Convergence checks are performed every 5 iterations.} \item{eps_conv}{threshold for the KKT convergence test.} \item{...}{extra argument not used.} } \description{ NMF algorithms proposed by \cite{Kim et al. (2007)} that enforces sparsity constraint on the basis matrix (algorithm \sQuote{SNMF/L}) or the mixture coefficient matrix (algorithm \sQuote{SNMF/R}). } \details{ The algorithm \sQuote{SNMF/R} solves the following NMF optimization problem on a given target matrix \eqn{A} of dimension \eqn{n \times p}{n x p}: \deqn{ \begin{array}{ll} & \min_{W,H} \frac{1}{2} \left(|| A - WH ||_F^2 + \eta ||W||_F^2 + \beta (\sum_{j=1}^p ||H_{.j}||_1^2)\right)\\ s.t. & W\geq 0, H\geq 0 \end{array} }{ min_{W,H} 1/2 (|| A - WH ||_F^2 + eta ||W||_F^2 + beta (sum_j ||H[,j]||_1^2)) s.t. W>=0, H>=0 } The algorithm \sQuote{SNMF/L} solves a similar problem on the transposed target matrix \eqn{A}, where \eqn{H} and \eqn{W} swap roles, i.e. with sparsity constraints applied to \code{W}. } \references{ Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . } NMF/man/advanced.Rd0000644000176200001440000000125714333176413013513 0ustar liggesusers\name{advanced-NMF} \alias{advanced-NMF} \alias{which.best} \title{Advanced Usage of the Package NMF} \usage{ which.best(object, FUN = deviance, ...) } \arguments{ \item{object}{an NMF model fitted by multiple runs.} \item{FUN}{the function that computes the quantitative measure.} \item{...}{extra arguments passed to \code{FUN}.} } \description{ The functions documented here provide advanced functionalities useful when developing within the framework implemented in the NMF package. \code{which.best} returns the index of the best fit in a list of NMF fit, according to some quantitative measure. The index of the fit with the lowest measure is returned. } NMF/man/aheatmap.Rd0000644000176200001440000003615314333176413013531 0ustar liggesusers\name{aheatmap} \alias{aheatmap} \title{Annotated Heatmaps} \usage{ aheatmap(x, color = "-RdYlBu2:100", breaks = NA, border_color = NA, cellwidth = NA, cellheight = NA, scale = "none", Rowv = TRUE, Colv = TRUE, revC = identical(Colv, "Rowv") || is_NA(Rowv) || (is.integer(Rowv) && length(Rowv) > 1) || is(Rowv, "silhouette"), distfun = "euclidean", hclustfun = "complete", reorderfun = function(d, w) reorder(d, w), treeheight = 50, legend = TRUE, annCol = NA, annRow = NA, annColors = NA, annLegend = TRUE, labRow = NULL, labCol = NULL, subsetRow = NULL, subsetCol = NULL, txt = NULL, fontsize = 10, cexRow = min(0.2 + 1/log10(nr), 1.2), cexCol = min(0.2 + 1/log10(nc), 1.2), filename = NA, width = NA, height = NA, main = NULL, sub = NULL, info = NULL, verbose = getOption("verbose"), gp = gpar()) } \arguments{ \item{x}{numeric matrix of the values to be plotted. An \emph{ExpressionSet} object can also be passed, in which case the expression values are plotted (\code{exprs(x)}).} \item{color}{colour specification for the heatmap. Default to palette '-RdYlBu2:100', i.e. reversed palette 'RdYlBu2' (a slight modification of RColorBrewer's palette 'RdYlBu') with 100 colors. Possible values are: \itemize{ \item a character/integer vector of length greater than 1 that is directly used and assumed to contain valid R color specifications. \item a single color/integer (between 0 and 8)/other numeric value that gives the dominant colors. Numeric values are converted into a pallete by \code{rev(sequential_hcl(2, h = x, l = c(50, 95)))}. Other values are concatenated with the grey colour '#F1F1F1'. \item one of RColorBrewer's palette name (see \code{\link[RColorBrewer]{display.brewer.all}}) , or one of 'RdYlBu2', 'rainbow', 'heat', 'topo', 'terrain', 'cm'. } When the coluor palette is specified with a single value, and is negative or preceded a minus ('-'), the reversed palette is used. The number of breaks can also be specified after a colon (':'). For example, the default colour palette is specified as '-RdYlBu2:100'.} \item{breaks}{a sequence of numbers that covers the range of values in \code{x} and is one element longer than color vector. Used for mapping values to colors. Useful, if needed to map certain values to certain colors. If value is NA then the breaks are calculated automatically. If \code{breaks} is a single value, then the colour palette is centered on this value.} \item{border_color}{color of cell borders on heatmap, use NA if no border should be drawn.} \item{cellwidth}{individual cell width in points. If left as NA, then the values depend on the size of plotting window.} \item{cellheight}{individual cell height in points. If left as NA, then the values depend on the size of plotting window.} \item{scale}{character indicating how the values should scaled in either the row direction or the column direction. Note that the scaling is performed after row/column clustering, so that it has no effect on the row/column ordering. Possible values are: \itemize{ \item \code{"row"}: center and standardize each row separately to row Z-scores \item \code{"column"}: center and standardize each column separately to column Z-scores \item \code{"r1"}: scale each row to sum up to one \item \code{"c1"}: scale each column to sum up to one \item \code{"none"}: no scaling }} \item{Rowv}{clustering specification(s) for the rows. It allows to specify the distance/clustering/ordering/display parameters to be used for the \emph{rows only}. Possible values are: \itemize{ \item \code{TRUE} or \code{NULL} (to be consistent with \code{\link{heatmap}}): compute a dendrogram from hierarchical clustering using the distance and clustering methods \code{distfun} and \code{hclustfun}. \item \code{NA}: disable any ordering. In this case, and if not otherwise specified with argument \code{revC=FALSE}, the heatmap shows the input matrix with the rows in their original order, with the first row on top to the last row at the bottom. Note that this differ from the behaviour or \code{\link{heatmap}}, but seemed to be a more sensible choice when vizualizing a matrix without reordering. \item an integer vector of length the number of rows of the input matrix (\code{nrow(x)}), that specifies the row order. As in the case \code{Rowv=NA}, the ordered matrix is shown first row on top, last row at the bottom. \item a character vector or a list specifying values to use instead of arguments \code{distfun}, \code{hclustfun} and \code{reorderfun} when clustering the rows (see the respective argument descriptions for a list of accepted values). If \code{Rowv} has no names, then the first element is used for \code{distfun}, the second (if present) is used for \code{hclustfun}, and the third (if present) is used for \code{reorderfun}. \item a numeric vector of weights, of length the number of rows of the input matrix, used to reorder the internally computed dendrogram \code{d} by \code{reorderfun(d, Rowv)}. \item \code{FALSE}: the dendrogram \emph{is} computed using methods \code{distfun}, \code{hclustfun}, and \code{reorderfun} but is not shown. \item a single integer that specifies how many subtrees (i.e. clusters) from the computed dendrogram should have their root faded out. This can be used to better highlight the different clusters. \item a single double that specifies how much space is used by the computed dendrogram. That is that this value is used in place of \code{treeheight}. }} \item{Colv}{clustering specification(s) for the columns. It accepts the same values as argument \code{Rowv} (modulo the expected length for vector specifications), and allow specifying the distance/clustering/ordering/display parameters to be used for the \emph{columns only}. \code{Colv} may also be set to \code{"Rowv"}, in which case the dendrogram or ordering specifications applied to the rows are also applied to the columns. Note that this is allowed only for square input matrices, and that the row ordering is in this case by default reversed (\code{revC=TRUE}) to obtain the diagonal in the standard way (from top-left to bottom-right). See argument \code{Rowv} for other possible values.} \item{revC}{a logical that specify if the \emph{row order} defined by \code{Rowv} should be reversed. This is mainly used to get the rows displayed from top to bottom, which is not the case by default. Its default value is computed at runtime, to suit common situations where natural ordering is a more sensible choice: no or fix ordering of the rows (\code{Rowv=NA} or an integer vector of indexes -- of length > 1), and when a symmetric ordering is requested -- so that the diagonal is shown as expected. An argument in favor of the "odd" default display (bottom to top) is that the row dendrogram is plotted from bottom to top, and reversing its reorder may take a not too long but non negligeable time.} \item{distfun}{default distance measure used in clustering rows and columns. Possible values are: \itemize{ \item all the distance methods supported by \code{\link{dist}} (e.g. "euclidean" or "maximum"). \item all correlation methods supported by \code{\link{cor}}, such as \code{"pearson"} or \code{"spearman"}. The pairwise distances between rows/columns are then computed as \code{d <- dist(1 - cor(..., method = distfun))}. One may as well use the string "correlation" which is an alias for "pearson". \item an object of class \code{dist} such as returned by \code{\link{dist}} or \code{\link{as.dist}}. }} \item{hclustfun}{default clustering method used to cluster rows and columns. Possible values are: \itemize{ \item a method name (a character string) supported by \code{\link{hclust}} (e.g. \code{'average'}). \item an object of class \code{hclust} such as returned by \code{\link{hclust}} \item a dendrogram }} \item{reorderfun}{default dendrogram reordering function, used to reorder the dendrogram, when either \code{Rowv} or \code{Colv} is a numeric weight vector, or provides or computes a dendrogram. It must take 2 parameters: a dendrogram, and a weight vector.} \item{subsetRow}{Specification of subsetting the rows before drawing the heatmap. Possible values are: \itemize{ \item an integer vector of length > 1 specifying the indexes of the rows to keep; \item a character vector of length > 1 specyfing the names of the rows to keep. These are the original rownames, not the names specified in \code{labRow}. \item a logical vector of length > 1, whose elements are recycled if the vector has not as many elements as rows in \code{x}. } Note that in the case \code{Rowv} is a dendrogram or hclust object, it is first converted into an ordering vector, and cannot be displayed -- and a warning is thrown.} \item{subsetCol}{Specification of subsetting the columns before drawing the heatmap. It accepts the similar values as \code{subsetRow}. See details above.} \item{txt}{character matrix of the same size as \code{x}, that contains text to display in each cell. \code{NA} values are allowed and are not displayed. See demo for an example.} \item{treeheight}{how much space (in points) should be used to display dendrograms. If specified as a single value, it is used for both dendrograms. A length-2 vector specifies separate values for the row and column dendrogram respectively. Default value: 50 points.} \item{legend}{boolean value that determines if a colour ramp for the heatmap's colour palette should be drawn or not. Default is \code{TRUE}.} \item{annCol}{specifications of column annotation tracks displayed as coloured rows on top of the heatmaps. The annotation tracks are drawn from bottom to top. A single annotation track can be specified as a single vector; multiple tracks are specified as a list, a data frame, or an \emph{ExpressionSet} object, in which case the phenotypic data is used (\code{pData(eset)}). Character or integer vectors are converted and displayed as factors. Unnamed tracks are internally renamed into \code{Xi}, with i being incremented for each unamed track, across both column and row annotation tracks. For each track, if no corresponding colour is specified in argument \code{annColors}, a palette or a ramp is automatically computed and named after the track's name.} \item{annRow}{specifications of row annotation tracks displayed as coloured columns on the left of the heatmaps. The annotation tracks are drawn from left to right. The same conversion, renaming and colouring rules as for argument \code{annCol} apply.} \item{annColors}{list for specifying annotation track colors manually. It is possible to define the colors for only some of the annotations. Check examples for details.} \item{annLegend}{boolean value specifying if the legend for the annotation tracks should be drawn or not. Default is \code{TRUE}.} \item{labRow}{labels for the rows.} \item{labCol}{labels for the columns. See description for argument \code{labRow} for a list of the possible values.} \item{fontsize}{base fontsize for the plot} \item{cexRow}{fontsize for the rownames, specified as a fraction of argument \code{fontsize}.} \item{cexCol}{fontsize for the colnames, specified as a fraction of argument \code{fontsize}.} \item{main}{Main title as a character string or a grob.} \item{sub}{Subtitle as a character string or a grob.} \item{info}{(experimental) Extra information as a character vector or a grob. If \code{info=TRUE}, information about the clustering methods is displayed at the bottom of the plot.} \item{filename}{file path ending where to save the picture. Currently following formats are supported: png, pdf, tiff, bmp, jpeg. Even if the plot does not fit into the plotting window, the file size is calculated so that the plot would fit there, unless specified otherwise.} \item{width}{manual option for determining the output file width in} \item{height}{manual option for determining the output file height in inches.} \item{verbose}{if \code{TRUE} then verbose messages are displayed and the borders of some viewports are highlighted. It is entended for debugging purposes.} \item{gp}{graphical parameters for the text used in plot. Parameters passed to \code{\link{grid.text}}, see \code{\link{gpar}}.} } \description{ The function \code{aheatmap} plots high-quality heatmaps, with a detailed legend and unlimited annotation tracks for both columns and rows. The annotations are coloured differently according to their type (factor or numeric covariate). Although it uses grid graphics, the generated plot is compatible with base layouts such as the ones defined with \code{'mfrow'} or \code{\link{layout}}, enabling the easy drawing of multiple heatmaps on a single a plot -- at last!. } \details{ The development of this function started as a fork of the function \code{pheatmap} from the \pkg{pheatmap} package, and provides several enhancements such as: \itemize{ \item argument names match those used in the base function \code{\link{heatmap}}; \item unlimited number of annotation for \strong{both} columns and rows, with simplified and more flexible interface; \item easy specification of clustering methods and colors; \item return clustering data, as well as grid grob object. } Please read the associated vignette for more information and sample code. } \section{PDF graphic devices}{ if plotting on a PDF graphic device -- started with \code{\link{pdf}}, one may get generate a first blank page, due to internals of standard functions from the \pkg{grid} package that are called by \code{aheatmap}. The \pkg{NMF} package ships a custom patch that fixes this issue. However, in order to comply with CRAN policies, the patch is \strong{not} applied by default and the user must explicitly be enabled it. This can be achieved on runtime by either setting the NMF specific option 'grid.patch' via \code{nmf.options(grid.patch=TRUE)}, or on load time if the environment variable 'R_PACKAGE_NMF_GRID_PATCH' is defined and its value is something that is not equivalent to \code{FALSE} (i.e. not '', 'false' nor 0). } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } ## See the demo 'aheatmap' for more examples: \dontrun{ demo('aheatmap') } # Generate random data n <- 50; p <- 20 x <- abs(rmatrix(n, p, rnorm, mean=4, sd=1)) x[1:10, seq(1, 10, 2)] <- x[1:10, seq(1, 10, 2)] + 3 x[11:20, seq(2, 10, 2)] <- x[11:20, seq(2, 10, 2)] + 2 rownames(x) <- paste("ROW", 1:n) colnames(x) <- paste("COL", 1:p) ## Default heatmap aheatmap(x) ## Distance methods aheatmap(x, Rowv = "correlation") aheatmap(x, Rowv = "man") # partially matched to 'manhattan' aheatmap(x, Rowv = "man", Colv="binary") # Generate column annotations annotation = data.frame(Var1 = factor(1:p \%\% 2 == 0, labels = c("Class1", "Class2")), Var2 = 1:10) aheatmap(x, annCol = annotation) } \author{ Original version of \code{pheatmap}: Raivo Kolde Enhancement into \code{aheatmap}: Renaud Gaujoux } NMF/man/cluster_mat.Rd0000644000176200001440000000154214333176413014265 0ustar liggesusers\name{cluster_mat} \alias{cluster_mat} \title{Cluster Matrix Rows in Annotated Heatmaps} \usage{ cluster_mat(mat, param, distfun, hclustfun, reorderfun, na.rm = TRUE, subset = NULL, verbose = FALSE) } \arguments{ \item{mat}{original input matrix that has already been appropriately subset in the caller function (\code{aheatmap})} \item{param}{clustering specifications} \item{distfun}{Default distance method/function} \item{hclustfun}{Default clustering (linkage) method/function} \item{reorderfun}{Default reordering function} \item{na.rm}{Logical that specifies if NA values should be removed} \item{subset}{index (integer) vector specifying the subset indexes used to subset mat. This is required to be able to return the original indexes.} } \description{ Cluster Matrix Rows in Annotated Heatmaps } \keyword{internal} NMF/man/NMFfitX-class.Rd0000644000176200001440000001442714333176413014327 0ustar liggesusers\docType{class} \name{NMFfitX-class} \alias{NMFfitX-class} \title{Virtual Class to Handle Results from Multiple Runs of NMF Algorithms} \description{ This class defines a common interface to handle the results from multiple runs of a single NMF algorithm, performed with the \code{\link{nmf}} method. } \details{ Currently, this interface is implemented by two classes, \code{\linkS4class{NMFfitX1}} and \code{\linkS4class{NMFfitXn}}, which respectively handle the case where only the best fit is kept, and the case where the list of all the fits is returned. See \code{\link{nmf}} for more details on the method arguments. } \section{Slots}{ \describe{ \item{runtime.all}{Object of class \code{\link[=proc.time]{proc_time}} that contains CPU times required to perform all the runs.} } } \section{Methods}{ \describe{ \item{basismap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the basis matrix of the best fit in \code{object}. } \item{coefmap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the coefficient matrix of the best fit in \code{object}. This method adds: \itemize{ \item an extra special column annotation track for multi-run NMF fits, \code{'consensus:'}, that shows the consensus cluster associated to each sample. \item a column sorting schema \code{'consensus'} that can be passed to argument \code{Colv} and orders the columns using the hierarchical clustering of the consensus matrix with average linkage, as returned by \code{\link{consensushc}(object)}. This is also the ordering that is used by default for the heatmap of the consensus matrix as ploted by \code{\link{consensusmap}}. } } \item{consensus}{\code{signature(object = "NMFfitX")}: Pure virtual method defined to ensure \code{consensus} is defined for sub-classes of \code{NMFfitX}. It throws an error if called. } \item{consensushc}{\code{signature(object = "NMFfitX")}: Compute the hierarchical clustering on the consensus matrix of \code{object}, or on the connectivity matrix of the best fit in \code{object}. } \item{consensusmap}{\code{signature(object = "NMFfitX")}: Plots a heatmap of the consensus matrix obtained when fitting an NMF model with multiple runs. } \item{cophcor}{\code{signature(object = "NMFfitX")}: Computes the cophenetic correlation coefficient on the consensus matrix of \code{object}. All arguments in \code{...} are passed to the method \code{cophcor,matrix}. } \item{deviance}{\code{signature(object = "NMFfitX")}: Returns the deviance achieved by the best fit object, i.e. the lowest deviance achieved across all NMF runs. } \item{dispersion}{\code{signature(object = "NMFfitX")}: Computes the dispersion on the consensus matrix obtained from multiple NMF runs. } \item{fit}{\code{signature(object = "NMFfitX")}: Returns the model object that achieves the lowest residual approximation error across all the runs. It is a pure virtual method defined to ensure \code{fit} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. } \item{getRNG1}{\code{signature(object = "NMFfitX")}: Returns the RNG settings used for the first NMF run of multiple NMF runs. } \item{ibterms}{\code{signature(object = "NMFfitX")}: Method for multiple NMF fit objects, which returns the indexes of fixed basis terms from the best fitted model. } \item{metaHeatmap}{\code{signature(object = "NMFfitX")}: Deprecated method subsituted by \code{\link{consensusmap}}. } \item{minfit}{\code{signature(object = "NMFfitX")}: Returns the fit object that achieves the lowest residual approximation error across all the runs. It is a pure virtual method defined to ensure \code{minfit} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. } \item{nmf.equal}{\code{signature(x = "NMFfitX", y = "NMF")}: Compares two NMF models when at least one comes from multiple NMF runs. } \item{NMFfitX}{\code{signature(object = "NMFfitX")}: Provides a way to aggregate \code{NMFfitXn} objects into an \code{NMFfitX1} object. } \item{nrun}{\code{signature(object = "NMFfitX")}: Returns the number of NMF runs performed to create \code{object}. It is a pure virtual method defined to ensure \code{nrun} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. See \code{\link{nrun,NMFfitX-method}} for more details. } \item{predict}{\code{signature(object = "NMFfitX")}: Returns the cluster membership index from an NMF model fitted with multiple runs. Besides the type of clustering available for any NMF models (\code{'columns', 'rows', 'samples', 'features'}), this method can return the cluster membership index based on the consensus matrix, computed from the multiple NMF runs. See \code{\link{predict,NMFfitX-method}} for more details. } \item{residuals}{\code{signature(object = "NMFfitX")}: Returns the residuals achieved by the best fit object, i.e. the lowest residual approximation error achieved across all NMF runs. } \item{runtime.all}{\code{signature(object = "NMFfitX")}: Returns the CPU time required to compute all the NMF runs. It returns \code{NULL} if no CPU data is available. } \item{show}{\code{signature(object = "NMFfitX")}: Show method for objects of class \code{NMFfitX} } \item{summary}{\code{signature(object = "NMFfitX")}: Computes a set of measures to help evaluate the quality of the \emph{best fit} of the set. The result is similar to the result from the \code{summary} method of \code{NMFfit} objects. See \code{\linkS4class{NMF}} for details on the computed measures. In addition, the cophenetic correlation (\code{\link{cophcor}}) and \code{\link{dispersion}} coefficients of the consensus matrix are returned, as well as the total CPU time (\code{\link{runtime.all}}). } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes n <- 20; counts <- c(5, 2, 3); V <- syntheticNMF(n, counts) # perform multiple runs of one algorithm (default is to keep only best fit) res <- nmf(V, 3, nrun=3) res # plot a heatmap of the consensus matrix \dontrun{ consensusmap(res) } } \seealso{ Other multipleNMF: \code{\link{NMFfitX1-class}}, \code{\link{NMFfitXn-class}} } NMF/man/c-commaNMF-method.Rd0000644000176200001440000000161614333176413015100 0ustar liggesusers\docType{methods} \name{c,NMF-method} \alias{c,NMF-method} \title{Concatenating NMF Models} \usage{ \S4method{c}{NMF}(x, ..., margin = 3, recursive = FALSE) } \arguments{ \item{x}{an NMF model} \item{...}{other objects to concatenate. Currently only two objects at a time can be concatenated (i.e. \code{x} and \code{..1}).} \item{margin}{integer that indicates the margin along which to concatenate (only used when \code{..1} is a matrix): \describe{ \item{1L}{} \item{2L}{} \item{3L}{} \item{4L}{} } If missing the margin is heuristically determined by looking at common dimensions between the objects.} \item{recursive}{logical. If \code{recursive = TRUE}, the function recursively descends through lists (and pairlists) combining all their elements into a vector.} } \description{ Binds compatible matrices and NMF models together. } \keyword{internal} \keyword{methods} NMF/man/nmfModel.Rd0000644000176200001440000003635714333176413013520 0ustar liggesusers\docType{methods} \name{nmfModel} \alias{nmfModel} \alias{nmfModel,data.frame,data.frame-method} \alias{nmfModel,formula,ANY-method} \alias{nmfModel,matrix,ANY-method} \alias{nmfModel,matrix,matrix-method} \alias{nmfModel-methods} \alias{nmfModel,missing,ANY-method} \alias{nmfModel,missing,missing-method} \alias{nmfModel,NULL,ANY-method} \alias{nmfModel,numeric,matrix-method} \alias{nmfModel,numeric,missing-method} \alias{nmfModel,numeric,numeric-method} \alias{nmfModels} \title{Factory Methods NMF Models} \usage{ nmfModel(rank, target = 0L, ...) \S4method{nmfModel}{numeric,numeric}(rank, target, ncol = NULL, model = "NMFstd", W, H, ..., force.dim = TRUE, order.basis = TRUE) \S4method{nmfModel}{numeric,matrix}(rank, target, ..., use.names = TRUE) \S4method{nmfModel}{formula,ANY}(rank, target, ..., data = NULL, no.attrib = FALSE) nmfModels(builtin.only = FALSE) } \arguments{ \item{rank}{specification of the target factorization rank (i.e. the number of components).} \item{target}{an object that specifies the dimension of the estimated target matrix.} \item{...}{extra arguments to allow extension, that are passed down to the workhorse method \code{nmfModel,numeric.numeric}, where they are used to initialise slots specific to the instantiating NMF model class.} \item{ncol}{a numeric value that specifies the number of columns of the target matrix, fitted the NMF model. It is used only if not missing and when argument \code{target} is a single numeric value.} \item{model}{the class of the object to be created. It must be a valid class name that inherits from class \code{NMF}. Default is the standard NMF model \code{\linkS4class{NMFstd}}.} \item{W}{value for the basis matrix. \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}.} \item{H}{value for the mixture coefficient matrix \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}.} \item{force.dim}{logical that indicates whether the method should try lowering the rank or shrinking dimensions of the input matrices to make them compatible} \item{order.basis}{logical that indicates whether the basis components should reorder the rows of the mixture coefficient matrix to match the order of the basis components, based on their respective names. It is only used if the basis and coefficient matrices have common unique column and row names respectively.} \item{use.names}{a logical that indicates whether the dimension names of the target matrix should be set on the returned NMF model.} \item{data}{Optional argument where to look for the variables used in the formula.} \item{no.attrib}{logical that indicate if attributes containing data related to the formula should be attached as attributes. If \code{FALSE} attributes \code{'target'} and \code{'formula'} contain the target matrix, and a list describing each formula part (response, regressors, etc.).} \item{builtin.only}{logical that indicates whether only built-in NMF models, i.e. defined within the NMF package, should be listed.} } \value{ an object that inherits from class \code{\linkS4class{NMF}}. a list } \description{ \code{nmfModel} is a S4 generic function which provides a convenient way to build NMF models. It implements a unified interface for creating \code{NMF} objects from any NMF models, which is designed to resolve potential dimensions inconsistencies. \code{nmfModels} lists all available NMF models currently defined that can be used to create NMF objects, i.e. -- more or less -- all S4 classes that inherit from class \code{\linkS4class{NMF}}. } \details{ All \code{nmfModel} methods return an object that inherits from class \code{NMF}, that is suitable for seeding NMF algorithms via arguments \code{rank} or \code{seed} of the \code{\link{nmf}} method, in which case the factorisation rank is implicitly set by the number of basis components in the seeding model (see \code{\link{nmf}}). For convenience, shortcut methods and internal conversions for working on \code{data.frame} objects directly are implemented. However, note that conversion of a \code{data.frame} into a \code{matrix} object may take some non-negligible time, for large datasets. If using this method or other NMF-related methods several times, consider converting your data \code{data.frame} object into a matrix once for good, when first loaded. } \section{Methods}{ \describe{ \item{nmfModel}{\code{signature(rank = "numeric", target = "numeric")}: Main factory method for NMF models This method is the workhorse method that is eventually called by all other methods. See section \emph{Main factory method} for more details. } \item{nmfModel}{\code{signature(rank = "numeric", target = "missing")}: Creates an empty NMF model of a given rank. This call is equivalent to \code{nmfModel(rank, 0L, ...)}, which creates \emph{empty} \code{NMF} object with a basis and mixture coefficient matrix of dimension 0 x \code{rank} and \code{rank} x 0 respectively. } \item{nmfModel}{\code{signature(rank = "missing", target = "ANY")}: Creates an empty NMF model of null rank and a given dimension. This call is equivalent to \code{nmfModel(0, target, ...)}. } \item{nmfModel}{\code{signature(rank = "NULL", target = "ANY")}: Creates an empty NMF model of null rank and given dimension. This call is equivalent to \code{nmfModel(0, target, ...)}, and is meant for internal usage only. } \item{nmfModel}{\code{signature(rank = "missing", target = "missing")}: Creates an empty NMF model or from existing factors This method is equivalent to \code{nmfModel(0, 0, ..., force.dim=FALSE)}. This means that the dimensions of the NMF model will be taken from the optional basis and mixture coefficient arguments \code{W} and \code{H}. An error is thrown if their dimensions are not compatible. Hence, this method may be used to generate an NMF model from existing factor matrices, by providing the named arguments \code{W} and/or \code{H}: \code{nmfModel(W=w)} or \code{nmfModel(H=h)} or \code{nmfModel(W=w, H=h)} Note that this may be achieved using the more convenient interface is provided by the method \code{nmfModel,matrix,matrix} (see its dedicated description). See the description of the appropriate method below. } \item{nmfModel}{\code{signature(rank = "numeric", target = "matrix")}: Creates an NMF model compatible with a target matrix. This call is equivalent to \code{nmfModel(rank, dim(target), ...)}. That is that the returned NMF object fits a target matrix of the same dimension as \code{target}. Only the dimensions of \code{target} are used to construct the \code{NMF} object. The matrix slots are filled with \code{NA} values if these are not specified in arguments \code{W} and/or \code{H}. However, dimension names are set on the return NMF model if present in \code{target} and argument \code{use.names=TRUE}. } \item{nmfModel}{\code{signature(rank = "matrix", target = "matrix")}: Creates an NMF model based on two existing factors. This method is equivalent to \code{nmfModel(0, 0, W=rank, H=target..., force.dim=FALSE)}. This allows for a natural shortcut for wrapping existing \strong{compatible} matrices into NMF models: \samp{nmfModel(w, h)} Note that an error is thrown if their dimensions are not compatible. } \item{nmfModel}{\code{signature(rank = "data.frame", target = "data.frame")}: Same as \code{nmfModel('matrix', 'matrix')} but for \code{data.frame} objects, which are generally produced by \code{\link{read.delim}}-like functions. The input \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}. } \item{nmfModel}{\code{signature(rank = "matrix", target = "ANY")}: Creates an NMF model with arguments \code{rank} and \code{target} swapped. This call is equivalent to \code{nmfModel(rank=target, target=rank, ...)}. This allows to call the \code{nmfModel} function with arguments \code{rank} and \code{target} swapped. It exists for convenience: \itemize{ \item allows typing \code{nmfModel(V)} instead of \code{nmfModel(target=V)} to create a model compatible with a given matrix \code{V} (i.e. of dimension \code{nrow(V), 0, ncol(V)}) \item one can pass the arguments in any order (the one that comes to the user's mind first) and it still works as expected. } } \item{nmfModel}{\code{signature(rank = "formula", target = "ANY")}: Build a formula-based NMF model, that can incorporate fixed basis or coefficient terms. } } } \section{Main factory method}{ The main factory engine of NMF models is implemented by the method with signature \code{numeric, numeric}. Other factory methods provide convenient ways of creating NMF models from e.g. a given target matrix or known basis/coef matrices (see section \emph{Other Factory Methods}). This method creates an object of class \code{model}, using the extra arguments in \code{...} to initialise slots that are specific to the given model. All NMF models implement get/set methods to access the matrix factors (see \code{\link{basis}}), which are called to initialise them from arguments \code{W} and \code{H}. These argument names derive from the definition of all built-in models that inherit derive from class \code{\linkS4class{NMFstd}}, which has two slots, \var{W} and \var{H}, to hold the two factors -- following the notations used in \cite{Lee et al. (1999)}. If argument \code{target} is missing, the method creates a standard NMF model of dimension 0x\code{rank}x0. That is that the basis and mixture coefficient matrices, \var{W} and \var{H}, have dimension 0x\code{rank} and \code{rank}x0 respectively. If target dimensions are also provided in argument \code{target} as a 2-length vector, then the method creates an \code{NMF} object compatible to fit a target matrix of dimension \code{target[1]}x\code{target[2]}. That is that the basis and mixture coefficient matrices, \var{W} and \var{H}, have dimension \code{target[1]}x\code{rank} and \code{rank}x\code{target[2]} respectively. The target dimensions can also be specified using both arguments \code{target} and \code{ncol} to define the number of rows and the number of columns of the target matrix respectively. If no other argument is provided, these matrices are filled with NAs. If arguments \code{W} and/or \code{H} are provided, the method creates a NMF model where the basis and mixture coefficient matrices, \var{W} and \var{H}, are initialised using the values of \code{W} and/or \code{H}. The dimensions given by \code{target}, \code{W} and \code{H}, must be compatible. However if \code{force.dim=TRUE}, the method will reduce the dimensions to the achieve dimension compatibility whenever possible. When \code{W} and \code{H} are both provided, the \code{NMF} object created is suitable to seed a NMF algorithm in a call to the \code{\link{nmf}} method. Note that in this case the factorisation rank is implicitly set by the number of basis components in the seed. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # nmfModel,numeric,numeric-method #---------- # data n <- 20; r <- 3; p <- 10 V <- rmatrix(n, p) # some target matrix # create a r-ranked NMF model with a given target dimensions n x p as a 2-length vector nmfModel(r, c(n,p)) # directly nmfModel(r, dim(V)) # or from an existing matrix <=> nmfModel(r, V) # or alternatively passing each dimension separately nmfModel(r, n, p) # trying to create a NMF object based on incompatible matrices generates an error w <- rmatrix(n, r) h <- rmatrix(r+1, p) try( new('NMFstd', W=w, H=h) ) try( nmfModel(w, h) ) try( nmfModel(r+1, W=w, H=h) ) # The factory method can be force the model to match some target dimensions # but warnings are thrown nmfModel(r, W=w, H=h) nmfModel(r, n-1, W=w, H=h) #---------- # nmfModel,numeric,missing-method #---------- ## Empty model of given rank nmfModel(3) #---------- # nmfModel,missing,ANY-method #---------- nmfModel(target=10) #square nmfModel(target=c(10, 5)) #---------- # nmfModel,missing,missing-method #---------- # Build an empty NMF model nmfModel() # create a NMF object based on one random matrix: the missing matrix is deduced # Note this only works when using factory method NMF n <- 50; r <- 3; w <- rmatrix(n, r) nmfModel(W=w) # create a NMF object based on random (compatible) matrices p <- 20 h <- rmatrix(r, p) nmfModel(H=h) # specifies two compatible matrices nmfModel(W=w, H=h) # error if not compatible try( nmfModel(W=w, H=h[-1,]) ) #---------- # nmfModel,numeric,matrix-method #---------- # create a r-ranked NMF model compatible with a given target matrix obj <- nmfModel(r, V) all(is.na(basis(obj))) #---------- # nmfModel,matrix,matrix-method #---------- ## From two existing factors # allows a convenient call without argument names w <- rmatrix(n, 3); h <- rmatrix(3, p) nmfModel(w, h) # Specify the type of NMF model (e.g. 'NMFns' for non-smooth NMF) mod <- nmfModel(w, h, model='NMFns') mod # One can use such an NMF model as a seed when fitting a target matrix with nmf() V <- rmatrix(mod) res <- nmf(V, mod) nmf.equal(res, nmf(V, mod)) # NB: when called only with such a seed, the rank and the NMF algorithm # are selected based on the input NMF model. # e.g. here rank was 3 and the algorithm "nsNMF" is used, because it is the default # algorithm to fit "NMFns" models (See ?nmf). #---------- # nmfModel,matrix,ANY-method #---------- ## swapped arguments `rank` and `target` V <- rmatrix(20, 10) nmfModel(V) # equivalent to nmfModel(target=V) nmfModel(V, 3) # equivalent to nmfModel(3, V) #---------- # nmfModel,formula,ANY-method #---------- # empty 3-rank model nmfModel(~ 3) # 3-rank model that fits a given data matrix x <- rmatrix(20,10) nmfModel(x ~ 3) # add fixed coefficient term defined by a factor gr <- gl(2, 5) nmfModel(x ~ 3 + gr) # add fixed coefficient term defined by a numeric covariate nmfModel(x ~ 3 + gr + b, data=list(b=runif(10))) # 3-rank model that fits a given ExpressionSet (with fixed coef terms) if(requireNamespace("Biobase", quietly=TRUE)){ e <- Biobase::ExpressionSet(x) pData(e) <- data.frame(a=runif(10)) nmfModel(e ~ 3 + gr + a) # `a` is looked up in the phenotypic data of x pData(x) } #---------- # nmfModels #---------- # show all the NMF models available (i.e. the classes that inherit from class NMF) nmfModels() # show all the built-in NMF models available nmfModels(builtin.only=TRUE) } \references{ Lee DD and Seung HS (1999). "Learning the parts of objects by non-negative matrix factorization." _Nature_, *401*(6755), pp. 788-91. ISSN 0028-0836, , . } \seealso{ \code{\link{is.empty.nmf}} Other NMF-interface: \code{\link{basis}}, \code{\link{.basis}}, \code{\link{.basis<-}}, \code{\link{basis<-}}, \code{\link{coef}}, \code{\link{.coef}}, \code{\link{.coef<-}}, \code{\link{coef<-}}, \code{\link{coefficients}}, \code{\link{.DollarNames,NMF-method}}, \code{\link{loadings,NMF-method}}, \code{\link{misc}}, \code{\link{NMF-class}}, \code{\link{$<-,NMF-method}}, \code{\link{$,NMF-method}}, \code{\link{rnmf}}, \code{\link{scoef}} } \keyword{methods} NMF/man/syntheticNMF.Rd0000644000176200001440000000622214333255335014317 0ustar liggesusers\name{syntheticNMF} \alias{syntheticNMF} \title{Simulating Datasets} \usage{ syntheticNMF(n, r, p, offset = NULL, noise = TRUE, factors = FALSE, seed = NULL) } \arguments{ \item{n}{number of rows of the target matrix.} \item{r}{specification of the factorization rank. It may be a single \code{numeric}, in which case argument \code{p} is required and \code{r} groups of samples are generated from a draw from a multinomial distribution with equal probabilities, that provides their sizes. It may also be a numerical vector, which contains the number of samples in each class (i.e integers). In this case argument \code{p} is discarded and forced to be the sum of \code{r}.} \item{p}{number of columns of the synthetic target matrix. Not used if parameter \code{r} is a vector (see description of argument \code{r}).} \item{offset}{specification of a common offset to be added to the synthetic target matrix, before noisification. Its may be a numeric vector of length \code{n}, or a single numeric value that is used as the standard deviation of a centred normal distribution from which the actual offset values are drawn.} \item{noise}{a logical that indicate if noise should be added to the matrix.} \item{factors}{a logical that indicates if the NMF factors should be return together with the matrix.} \item{seed}{a single numeric value used to seed the random number generator before generating the matrix. The state of the RNG is restored on exit.} } \value{ a matrix, or a list if argument \code{factors=TRUE}. When \code{factors=FALSE}, the result is a matrix object, with the following attributes set: \describe{ \item{coefficients}{the true underlying coefficient matrix (i.e. \code{H});} \item{basis}{the true underlying coefficient matrix (i.e. \code{H});} \item{offset}{the offset if any;} \item{pData}{a \code{list} with one element \code{'Group'} that contains a factor that indicates the true groups of samples, i.e. the most contributing basis component for each sample;} \item{fData}{a \code{list} with one element \code{'Group'} that contains a factor that indicates the true groups of features, i.e. the basis component to which each feature contributes the most.} } Moreover, the result object is an \code{ExposeAttribute} object, which means that relevant attributes are accessible via \code{$}, e.g., \code{res$coefficients}. In particular, methods \code{\link{coef}} and \code{\link{basis}} will work as expected and return the true underlying coefficient and basis matrices respectively. } \description{ The function \code{syntheticNMF} generates random target matrices that follow some defined NMF model, and may be used to test NMF algorithms. It is designed to designed to produce data with known or clear classes of samples. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes: 50 features, 18 samples (5+5+8) n <- 50 counts <- c(5, 5, 8) # no noise V <- syntheticNMF(n, counts, noise=FALSE) \dontrun{aheatmap(V)} # with noise V <- syntheticNMF(n, counts) \dontrun{aheatmap(V)} } NMF/man/nmf-compare.Rd0000644000176200001440000001513414333176413014151 0ustar liggesusers\docType{methods} \name{compare-NMF} \alias{compare,list-method} \alias{compare-NMF} \alias{compare,NMFfit-method} \alias{consensusmap,list-method} \alias{consensusmap,NMF.rank-method} \alias{plot,NMFList,missing-method} \alias{summary,NMFList-method} \title{Comparing Results from Different NMF Runs} \usage{ \S4method{compare}{NMFfit}(object, ...) \S4method{compare}{list}(object, ...) \S4method{summary}{NMFList}(object, sort.by = NULL, select = NULL, ...) \S4method{plot}{NMFList,missing}(x, y, skip = -1, ...) \S4method{consensusmap}{NMF.rank}(object, ...) \S4method{consensusmap}{list}(object, layout, Rowv = FALSE, main = names(object), ...) } \arguments{ \item{...}{extra arguments passed by \code{compare} to \code{summary,NMFList} or to the \code{summary} method of each fit.} \item{select}{the columns to be output in the result \code{data.frame}. The column are given by their names (partially matched). The column names are the names of the summary measures returned by the \code{summary} methods of the corresponding NMF results.} \item{sort.by}{the sorting criteria, i.e. a partial match of a column name, by which the result \code{data.frame} is sorted. The sorting direction (increasing or decreasing) is computed internally depending on the chosen criteria (e.g. decreasing for the cophenetic coefficient, increasing for the residuals).} \item{x}{an \code{NMFList} object that contains fits from separate NMF runs.} \item{y}{missing} \item{layout}{specification of the layout. It may be a single numeric or a numeric couple, to indicate a square or rectangular layout respectively, that is filled row by row. It may also be a matrix that is directly passed to the function \code{\link[graphics]{layout}} from the package \code{graphics}.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} \item{skip}{an integer that indicates the number of points to skip/remove from the beginning of the curve. If \code{skip=1L} (default) only the initial residual -- that is computed before any iteration, is skipped, if present in the track (it associated with iteration 0).} \item{Rowv}{clustering specification(s) for the rows. It allows to specify the distance/clustering/ordering/display parameters to be used for the \emph{rows only}. Possible values are: \itemize{ \item \code{TRUE} or \code{NULL} (to be consistent with \code{\link{heatmap}}): compute a dendrogram from hierarchical clustering using the distance and clustering methods \code{distfun} and \code{hclustfun}. \item \code{NA}: disable any ordering. In this case, and if not otherwise specified with argument \code{revC=FALSE}, the heatmap shows the input matrix with the rows in their original order, with the first row on top to the last row at the bottom. Note that this differ from the behaviour or \code{\link{heatmap}}, but seemed to be a more sensible choice when vizualizing a matrix without reordering. \item an integer vector of length the number of rows of the input matrix (\code{nrow(x)}), that specifies the row order. As in the case \code{Rowv=NA}, the ordered matrix is shown first row on top, last row at the bottom. \item a character vector or a list specifying values to use instead of arguments \code{distfun}, \code{hclustfun} and \code{reorderfun} when clustering the rows (see the respective argument descriptions for a list of accepted values). If \code{Rowv} has no names, then the first element is used for \code{distfun}, the second (if present) is used for \code{hclustfun}, and the third (if present) is used for \code{reorderfun}. \item a numeric vector of weights, of length the number of rows of the input matrix, used to reorder the internally computed dendrogram \code{d} by \code{reorderfun(d, Rowv)}. \item \code{FALSE}: the dendrogram \emph{is} computed using methods \code{distfun}, \code{hclustfun}, and \code{reorderfun} but is not shown. \item a single integer that specifies how many subtrees (i.e. clusters) from the computed dendrogram should have their root faded out. This can be used to better highlight the different clusters. \item a single double that specifies how much space is used by the computed dendrogram. That is that this value is used in place of \code{treeheight}. }} \item{main}{Main title as a character string or a grob.} } \description{ The functions documented here allow to compare the fits computed in different NMF runs. The fits do not need to be from the same algorithm, nor have the same dimension. } \details{ The methods \code{compare} enables to compare multiple NMF fits either passed as arguments or as a list of fits. These methods eventually call the method \code{summary,NMFList}, so that all its arguments can be passed \strong{named} in \code{...}. } \section{Methods}{ \describe{ \item{compare}{\code{signature(object = "NMFfit")}: Compare multiple NMF fits passed as arguments. } \item{compare}{\code{signature(object = "list")}: Compares multiple NMF fits passed as a standard list. } \item{consensusmap}{\code{signature(object = "NMF.rank")}: Draw a single plot with a heatmap of the consensus matrix obtained for each value of the rank, in the range tested with \code{\link{nmfEstimateRank}}. } \item{consensusmap}{\code{signature(object = "list")}: Draw a single plot with a heatmap of the consensus matrix of each element in the list \code{object}. } \item{plot}{\code{signature(x = "NMFList", y = "missing")}: \code{plot} plot on a single graph the residuals tracks for each fit in \code{x}. See function \code{\link{nmf}} for details on how to enable the tracking of residuals. } \item{summary}{\code{signature(object = "NMFList")}: \code{summary,NMFList} computes summary measures for each NMF result in the list and return them in rows in a \code{data.frame}. By default all the measures are included in the result, and \code{NA} values are used where no data is available or the measure does not apply to the result object (e.g. the dispersion for single' NMF runs is not meaningful). This method is very useful to compare and evaluate the performance of different algorithms. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # compare,NMFfit-method #---------- x <- rmatrix(20,10) res <- nmf(x, 3) res2 <- nmf(x, 2, 'lee') # compare arguments compare(res, res2, target=x) #---------- # compare,list-method #---------- # compare elements of a list compare(list(res, res2), target=x) } \keyword{methods} NMF/man/show-commaNMFSeed-method.Rd0000644000176200001440000000045714333176413016441 0ustar liggesusers\docType{methods} \name{show,NMFSeed-method} \alias{show,NMFSeed-method} \title{Show method for objects of class \code{NMFSeed}} \usage{ \S4method{show}{NMFSeed}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFSeed} } \keyword{methods} NMF/man/setNMFSeed.Rd0000644000176200001440000000406714333201553013677 0ustar liggesusers\docType{methods} \name{NMFSeed} \alias{NMFSeed} \alias{NMFSeed,character-method} \alias{NMFSeed-methods} \alias{NMFSeed,NMFSeed-method} \alias{removeNMFSeed} \alias{setNMFSeed} \title{\code{NMFSeed} is a constructor method that instantiate \code{\linkS4class{NMFSeed}} objects.} \usage{ NMFSeed(key, method, ...) setNMFSeed(..., overwrite = isLoadingNamespace(), verbose = TRUE) removeNMFSeed(name, ...) } \arguments{ \item{key}{access key as a single character string} \item{method}{specification of the seeding method, as a function that takes at least the following arguments: \describe{ \item{object}{uninitialised/empty NMF model, i.e. that it has 0 rows and columns, but has already the rank requested in the call to \code{\link{nmf}} or \code{\link{seed}}.} \item{x}{target matrix} \item{...}{extra arguments} }} \item{...}{arguments passed to \code{NMFSeed} and used to initialise slots in the \code{\linkS4class{NMFSeed}} object, or to \code{pkgreg_remove}.} \item{name}{name of the seeding method.} \item{overwrite}{logical that indicates if any existing NMF method with the same name should be overwritten (\code{TRUE}) or not (\code{FALSE}), in which case an error is thrown.} \item{verbose}{a logical that indicates if information about the registration should be printed (\code{TRUE}) or not (\code{FALSE}).} } \description{ \code{NMFSeed} is a constructor method that instantiate \code{\linkS4class{NMFSeed}} objects. NMF seeding methods are registered via the function \code{setNMFSeed}, which stores them as \code{\linkS4class{NMFSeed}} objects in a dedicated registry. \code{removeNMFSeed} removes an NMF seeding method from the registry. } \section{Methods}{ \describe{ \item{NMFSeed}{\code{signature(key = "character")}: Default method simply calls \code{\link{new}} with the same arguments. } \item{NMFSeed}{\code{signature(key = "NMFSeed")}: Creates an \code{NMFSeed} based on a template object (Constructor-Copy), in particular it uses the \strong{same} name. } } } \keyword{methods} NMF/man/rnmf.Rd0000644000176200001440000003231214560210707012701 0ustar liggesusers\docType{methods} \name{rnmf} \alias{rnmf} \alias{rnmf,ANY,data.frame-method} \alias{rnmf,ANY,matrix-method} \alias{rnmf,formula,ANY-method} \alias{rnmf-methods} \alias{rnmf,missing,missing-method} \alias{rnmf,NMF,missing-method} \alias{rnmf,NMF,numeric-method} \alias{rnmf,NMFOffset,numeric-method} \alias{rnmf,numeric,missing-method} \alias{rnmf,numeric,numeric-method} \title{Generating Random NMF Models} \usage{ rnmf(x, target, ...) \S4method{rnmf}{NMF,numeric}(x, target, ncol = NULL, keep.names = TRUE, dist = runif) \S4method{rnmf}{ANY,matrix}(x, target, ..., dist = list(max = max(max(target, na.rm = TRUE), 1)), use.dimnames = TRUE) \S4method{rnmf}{numeric,missing}(x, target, ..., W, H, dist = runif) \S4method{rnmf}{missing,missing}(x, target, ..., W, H) \S4method{rnmf}{numeric,numeric}(x, target, ncol = NULL, ..., dist = runif) \S4method{rnmf}{formula,ANY}(x, target, ..., dist = runif) } \arguments{ \item{x}{an object that determines the rank, dimension and/or class of the generated NMF model, e.g. a numeric value or an object that inherits from class \code{\linkS4class{NMF}}. See the description of the specific methods for more details on the supported types.} \item{target}{optional specification of target dimensions. See section \emph{Methods} for how this parameter is used by the different methods.} \item{...}{extra arguments to allow extensions and passed to the next method eventually down to \code{\link{nmfModel}}, where they are used to initialise slots that are specific to the instantiating NMF model.} \item{ncol}{single numeric value that specifies the number of columns of the coefficient matrix. Only used when \code{target} is a single numeric value.} \item{keep.names}{a logical that indicates if the dimension names of the original NMF object \code{x} should be conserved (\code{TRUE}) or discarded (\code{FALSE}).} \item{dist}{specification of the random distribution to use to draw the entries of the basis and coefficient matrices. It may be specified as: \itemize{ \item a \code{function} which must be a distribution function such as e.g. \code{\link{runif}} that is used to draw the entries of both the basis and coefficient matrices. It is passed in the \code{dist} argument of \code{\link{rmatrix}}. \item a \code{list} of arguments that are passed internally to \code{\link{rmatrix}}, via \code{do.call('rmatrix', dist)}. \item a \code{character} string that is partially matched to \sQuote{basis} or \sQuote{coef}, that specifies which matrix in should be drawn randomly, the other remaining as in \code{x} -- unchanged. \item a \code{list} with elements \sQuote{basis} and/or \sQuote{coef}, which specify the \code{dist} argument separately for the basis and coefficient matrix respectively. These elements may be either a distribution function, or a list of arguments that are passed internally to \code{\link{rmatrix}}, via \code{do.call('rmatrix', dist$basis)} or \code{do.call('rmatrix', dist$coef)}. }} \item{use.dimnames}{a logical that indicates whether the dimnames of the target matrix should be set on the returned NMF model.} \item{W}{value for the basis matrix. \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}.} \item{H}{value for the mixture coefficient matrix \code{data.frame} objects are converted into matrices with \code{\link{as.matrix}}.} } \value{ An NMF model, i.e. an object that inherits from class \code{\linkS4class{NMF}}. } \description{ Generates NMF models with random values drawn from a uniform distribution. It returns an NMF model with basis and mixture coefficient matrices filled with random values. The main purpose of the function \code{rnmf} is to provide a common interface to generate random seeds used by the \code{\link{nmf}} function. } \details{ If necessary, extensions of the standard NMF model or custom models must define a method "rnmf,,numeric" for initialising their specific slots other than the basis and mixture coefficient matrices. In order to benefit from the complete built-in interface, the overloading methods should call the generic version using function \code{\link{callNextMethod}}, prior to set the values of the specific slots. See for example the method \code{\link[=rnmf,NMFOffset,numeric-method]{rnmf}} defined for \code{\linkS4class{NMFOffset}} models: \code{showMethods(rnmf, class='NMFOffset', include=TRUE))}. For convenience, shortcut methods for working on \code{data.frame} objects directly are implemented. However, note that conversion of a \code{data.frame} into a \code{matrix} object may take some non-negligible time, for large datasets. If using this method or other NMF-related methods several times, consider converting your data \code{data.frame} object into a matrix once for good, when first loaded. } \section{Methods}{ \describe{ \item{rnmf}{\code{signature(x = "NMFOffset", target = "numeric")}: Generates a random NMF model with offset, from class \code{NMFOffset}. The offset values are drawn from a uniform distribution between 0 and the maximum entry of the basis and coefficient matrices, which are drawn by the next suitable \code{\link{rnmf}} method, which is the workhorse method \code{rnmf,NMF,numeric}. } \item{rnmf}{\code{signature(x = "NMF", target = "numeric")}: Generates a random NMF model of the same class and rank as another NMF model. This is the workhorse method that is eventually called by all other methods. It generates an NMF model of the same class and rank as \code{x}, compatible with the dimensions specified in \code{target}, that can be a single or 2-length numeric vector, to specify a square or rectangular target matrix respectively. The second dimension can also be passed via argument \code{ncol}, so that calling \code{rnmf(x, 20, 10, ...)} is equivalent to \code{rnmf(x, c(20, 10), ...)}, but easier to write. The entries are uniformly drawn between \code{0} and \code{max} (optionally specified in \code{...}) that defaults to 1. By default the dimnames of \code{x} are set on the returned NMF model. This behaviour is disabled with argument \code{keep.names=FALSE}. See \code{\link{nmfModel}}. } \item{rnmf}{\code{signature(x = "ANY", target = "matrix")}: Generates a random NMF model compatible and consistent with a target matrix. The entries are uniformly drawn between \code{0} and \code{max(target)}. It is more or less a shortcut for: \samp{ rnmf(x, dim(target), max=max(target), ...)} It returns an NMF model of the same class as \code{x}. } \item{rnmf}{\code{signature(x = "ANY", target = "data.frame")}: Shortcut for \code{rnmf(x, as.matrix(target))}. } \item{rnmf}{\code{signature(x = "NMF", target = "missing")}: Generates a random NMF model of the same dimension as another NMF model. It is a shortcut for \code{rnmf(x, nrow(x), ncol(x), ...)}, which returns a random NMF model of the same class and dimensions as \code{x}. } \item{rnmf}{\code{signature(x = "numeric", target = "missing")}: Generates a random NMF model of a given rank, with known basis and/or coefficient matrices. This methods allow to easily generate partially random NMF model, where one or both factors are known. Although the later case might seems strange, it makes sense for NMF models that have fit extra data, other than the basis and coefficient matrices, that are drawn by an \code{rnmf} method defined for their own class, which should internally call \code{rnmf,NMF,numeric} and let it draw the basis and coefficient matrices. (e.g. see \code{\linkS4class{NMFOffset}} and \code{\link{rnmf,NMFOffset,numeric-method}}). Depending on whether arguments \code{W} and/or \code{H} are missing, this method interprets \code{x} differently: \itemize{ \item \code{W} provided, \code{H} missing: \code{x} is taken as the number of columns that must be drawn to build a random coefficient matrix (i.e. the number of columns in the target matrix). \item \code{W} is missing, \code{H} is provided: \code{x} is taken as the number of rows that must be drawn to build a random basis matrix (i.e. the number of rows in the target matrix). \item both \code{W} and \code{H} are provided: \code{x} is taken as the target rank of the model to generate. \item Having both \code{W} and \code{H} missing produces an error, as the dimension of the model cannot be determined in this case. } The matrices \code{W} and \code{H} are reduced if necessary and possible to be consistent with this value of the rank, by the internal call to \code{\link{nmfModel}}. All arguments in \code{...} are passed to the function \code{\link{nmfModel}} which is used to build an initial NMF model, that is in turn passed to \code{rnmf,NMF,numeric} with \code{dist=list(coef=dist)} or \code{dist=list(basis=dist)} when suitable. The type of NMF model to generate can therefore be specified in argument \code{model} (see \code{\link{nmfModel}} for other possible arguments). The returned NMF model, has a basis matrix equal to \code{W} (if not missing) and a coefficient matrix equal to \code{H} (if not missing), or drawn according to the specification provided in argument \code{dist} (see method \code{rnmf,NMF,numeric} for details on the supported values for \code{dist}). } \item{rnmf}{\code{signature(x = "missing", target = "missing")}: Generates a random NMF model with known basis and coefficient matrices. This method is a shortcut for calling \code{rnmf,numeric,missing} with a suitable value for \code{x} (the rank), when both factors are known: \code{rnmf(min(ncol(W), nrow(H)), ..., W=W, H=H)}. Arguments \code{W} and \code{H} are required. Note that calling this method only makes sense for NMF models that contains data to fit other than the basis and coefficient matrices, e.g. \code{\linkS4class{NMFOffset}}. } \item{rnmf}{\code{signature(x = "numeric", target = "numeric")}: Generates a random standard NMF model of given dimensions. This is a shortcut for \code{rnmf(nmfModel(x, target, ncol, ...)), dist=dist)}. It generates a standard NMF model compatible with the dimensions passed in \code{target}, that can be a single or 2-length numeric vector, to specify a square or rectangular target matrix respectively. See \code{\link{nmfModel}}. } \item{rnmf}{\code{signature(x = "formula", target = "ANY")}: Generate a random formula-based NMF model, using the method \code{\link{nmfModel,formula,ANY-method}}. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # rnmf,NMFOffset,numeric-method #---------- # random NMF model with offset x <- rnmf(2, 3, model='NMFOffset') x offset(x) # from a matrix x <- rnmf(2, rmatrix(5,3, max=10), model='NMFOffset') offset(x) #---------- # rnmf,NMF,numeric-method #---------- ## random NMF of same class and rank as another model x <- nmfModel(3, 10, 5) x rnmf(x, 20) # square rnmf(x, 20, 13) rnmf(x, c(20, 13)) # using another distribution rnmf(x, 20, dist=rnorm) # other than standard model y <- rnmf(3, 50, 10, model='NMFns') y \dontshow{ stopifnot( identical(dim(y), c(50L,10L,3L)) ) } \dontshow{ stopifnot( is(y, 'NMFns') ) } #---------- # rnmf,ANY,matrix-method #---------- # random NMF compatible with a target matrix x <- nmfModel(3, 10, 5) y <- rmatrix(20, 13) rnmf(x, y) # rank of x rnmf(2, y) # rank 2 #---------- # rnmf,NMF,missing-method #---------- ## random NMF from another model a <- nmfModel(3, 100, 20) b <- rnmf(a) \dontshow{ stopifnot( !nmf.equal(a,b) ) } #---------- # rnmf,numeric,missing-method #---------- # random NMF model with known basis matrix x <- rnmf(5, W=matrix(1:18, 6)) # 6 x 5 model with rank=3 basis(x) # fixed coef(x) # random # random NMF model with known coefficient matrix x <- rnmf(5, H=matrix(1:18, 3)) # 5 x 6 model with rank=3 basis(x) # random coef(x) # fixed # random model other than standard NMF x <- rnmf(5, H=matrix(1:18, 3), model='NMFOffset') basis(x) # random coef(x) # fixed offset(x) # random #---------- # rnmf,missing,missing-method #---------- # random model other than standard NMF x <- rnmf(W=matrix(1:18, 6), H=matrix(21:38, 3), model='NMFOffset') basis(x) # fixed coef(x) # fixed offset(x) # random #---------- # rnmf,numeric,numeric-method #---------- ## random standard NMF of given dimensions # generate a random NMF model with rank 3 that fits a 100x20 matrix rnmf(3, 100, 20) \dontshow{ stopifnot( identical(dim(rnmf(3, 100, 20)), c(100L,20L,3L)) ) } # generate a random NMF model with rank 3 that fits a 100x100 matrix rnmf(3, 100) \dontshow{ stopifnot( identical(dim(rnmf(3, 100)), c(100L,100L,3L)) ) } } \seealso{ \code{\link{rmatrix}} Other NMF-interface: \code{\link{basis}}, \code{\link{.basis}}, \code{\link{.basis<-}}, \code{\link{basis<-}}, \code{\link{coef}}, \code{\link{.coef}}, \code{\link{.coef<-}}, \code{\link{coef<-}}, \code{\link{coefficients}}, \code{\link{.DollarNames,NMF-method}}, \code{\link{loadings,NMF-method}}, \code{\link{misc}}, \code{\link{NMF-class}}, \code{\link{$<-,NMF-method}}, \code{\link{$,NMF-method}}, \code{\link{nmfModel}}, \code{\link{nmfModels}}, \code{\link{scoef}} } \keyword{methods} NMF/man/nmfSeed.Rd0000644000176200001440000000464714333176413013335 0ustar liggesusers\name{nmfSeed} \alias{existsNMFSeed} \alias{getNMFSeed} \alias{nmfSeed} \title{Seeding Strategies for NMF Algorithms} \usage{ nmfSeed(name = NULL, ...) getNMFSeed(name = NULL, ...) existsNMFSeed(name, exact = TRUE) } \arguments{ \item{name}{access key of a seeding method stored in registry. If missing, \code{nmfSeed} returns the list of all available seeding methods.} \item{...}{extra arguments used for internal calls} \item{exact}{a logical that indicates if the access key should be matched exactly or partially.} } \description{ \code{nmfSeed} lists and retrieves NMF seeding methods. \code{getNMFSeed} is an alias for \code{nmfSeed}. \code{existsNMFSeed} tells if a given seeding method exists in the registry. } \details{ Currently the internal registry contains the following seeding methods, which may be specified to the function \code{\link{nmf}} via its argument \code{seed} using their access keys: \describe{ \item{random}{ The entries of each factors are drawn from a uniform distribution over \eqn{[0, max(x)]}, where $x$ is the target matrix.} \item{nndsvd}{ Nonnegative Double Singular Value Decomposition. The basic algorithm contains no randomization and is based on two SVD processes, one approximating the data matrix, the other approximating positive sections of the resulting partial SVD factors utilising an algebraic property of unit rank matrices. It is well suited to initialise NMF algorithms with sparse factors. Simple practical variants of the algorithm allows to generate dense factors. \strong{Reference:} \cite{Boutsidis et al. (2008)}} \item{ica}{ Uses the result of an Independent Component Analysis (ICA) (from the \code{fastICA} package). Only the positive part of the result are used to initialise the factors.} \item{none}{ Fixed seed. This method allows the user to manually provide initial values for both matrix factors.} } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # list all registered seeding methods nmfSeed() # retrieve one of the methods nmfSeed('ica') } \references{ Boutsidis C and Gallopoulos E (2008). "SVD based initialization: A head start for nonnegative matrix factorization." _Pattern Recognition_, *41*(4), pp. 1350-1362. ISSN 00313203, , . } NMF/man/NMFns-class.Rd0000644000176200001440000001062214333176413014026 0ustar liggesusers\docType{class} \name{NMFns-class} \alias{NMFns-class} \title{NMF Model - Nonsmooth Nonnegative Matrix Factorization} \description{ This class implements the \emph{Nonsmooth Nonnegative Matrix Factorization} (nsNMF) model, required by the Nonsmooth NMF algorithm. The Nonsmooth NMF algorithm is defined by \cite{Pascual-Montano et al. (2006)} as a modification of the standard divergence based NMF algorithm (see section Details and references below). It aims at obtaining sparser factor matrices, by the introduction of a smoothing matrix. } \details{ The Nonsmooth NMF algorithm is a modification of the standard divergence based NMF algorithm (see \code{\linkS4class{NMF}}). Given a non-negative \eqn{n \times p}{n x p} matrix \eqn{V} and a factorization rank \eqn{r}, it fits the following model: \deqn{V \equiv W S(\theta) H,}{V ~ W S(theta) H,} where: \itemize{ \item \eqn{W} and \eqn{H} are such as in the standard model, i.e. non-negative matrices of dimension \eqn{n \times r}{n x r} and \eqn{r \times p}{r x p} respectively; \item \eqn{S} is a \eqn{r \times r} square matrix whose entries depends on an extra parameter \eqn{0\leq \theta \leq 1} in the following way: \deqn{S = (1-\theta)I + \frac{\theta}{r} 11^T ,} where \eqn{I} is the identity matrix and \eqn{1} is a vector of ones. } The interpretation of S as a smoothing matrix can be explained as follows: Let \eqn{X} be a positive, nonzero, vector. Consider the transformed vector \eqn{Y = S X}. If \eqn{\theta = 0}, then \eqn{Y = X} and no smoothing on \eqn{X} has occurred. However, as \eqn{\theta \to 1}{theta tends to 1}, the vector \eqn{Y} tends to the constant vector with all elements almost equal to the average of the elements of \eqn{X}. This is the smoothest possible vector in the sense of non-sparseness because all entries are equal to the same nonzero value, instead of having some values close to zero and others clearly nonzero. } \section{Methods}{ \describe{ \item{fitted}{\code{signature(object = "NMFns")}: Compute estimate for an NMFns object, according to the Nonsmooth NMF model (cf. \code{\link{NMFns-class}}). Extra arguments in \code{...} are passed to method \code{smoothing}, and are typically used to pass a value for \code{theta}, which is used to compute the smoothing matrix instead of the one stored in \code{object}. } \item{show}{\code{signature(object = "NMFns")}: Show method for objects of class \code{NMFns} } } } \section{Creating objects from the Class}{ Object of class \code{NMFns} can be created using the standard way with operator \code{\link{new}} However, as for all NMF model classes -- that extend class \code{\linkS4class{NMF}}, objects of class \code{NMFns} should be created using factory method \code{\link{nmfModel}} : \code{new('NMFns')} \code{nmfModel(model='NMFns')} \code{nmfModel(model='NMFns', W=w, theta=0.3} See \code{\link{nmfModel}} for more details on how to use the factory method. } \section{Algorithm}{ The Nonsmooth NMF algorithm uses a modified version of the multiplicative update equations in Lee & Seung's method for Kullback-Leibler divergence minimization. The update equations are modified to take into account the -- constant -- smoothing matrix. The modification reduces to using matrix \eqn{W S} instead of matrix \eqn{W} in the update of matrix \eqn{H}, and similarly using matrix \eqn{S H} instead of matrix \eqn{H} in the update of matrix \eqn{W}. After the matrix \eqn{W} has been updated, each of its columns is scaled so that it sums up to 1. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # create a completely empty NMFns object new('NMFns') # create a NMF object based on random (compatible) matrices n <- 50; r <- 3; p <- 20 w <- rmatrix(n, r) h <- rmatrix(r, p) nmfModel(model='NMFns', W=w, H=h) # apply Nonsmooth NMF algorithm to a random target matrix V <- rmatrix(n, p) \dontrun{nmf(V, r, 'ns')} # random nonsmooth NMF model rnmf(3, 10, 5, model='NMFns', theta=0.3) } \references{ Pascual-Montano A, Carazo JM, Kochi K, Lehmann D and Pascual-marqui RD (2006). "Nonsmooth nonnegative matrix factorization (nsNMF)." _IEEE Trans. Pattern Anal. Mach. Intell_, *28*, pp. 403-415. } \seealso{ Other NMF-model: \code{\link{initialize,NMFOffset-method}}, \code{\link{NMFOffset-class}}, \code{\link{NMFstd-class}} } NMF/man/checkErrors.Rd0000644000176200001440000000050514333176413014213 0ustar liggesusers\name{checkErrors} \alias{checkErrors} \title{Error Checks in NMF Runs} \usage{ checkErrors(object, element = NULL) } \arguments{ \item{object}{a list of lists} \item{element}{name of an element of the inner lists} } \description{ Auxiliary function for internal error checks in nmf results. } \keyword{internal} NMF/man/fitted.Rd0000644000176200001440000000721714333176413013227 0ustar liggesusers\docType{methods} \name{fitted} \alias{fitted} \alias{fitted-methods} \alias{fitted,NMFfit-method} \alias{fitted,NMF-method} \alias{fitted,NMFns-method} \alias{fitted,NMFOffset-method} \alias{fitted,NMFstd-method} \title{Fitted Matrix in NMF Models} \usage{ fitted(object, ...) \S4method{fitted}{NMFstd}(object, W, H, ...) \S4method{fitted}{NMFOffset}(object, W, H, offset = object@offset) \S4method{fitted}{NMFns}(object, W, H, S, ...) } \arguments{ \item{object}{an object that inherit from class \code{NMF}} \item{...}{extra arguments to allow extension} \item{W}{a matrix to use in the computation as the basis matrix in place of \code{basis(object)}. It must be compatible with the coefficient matrix used in the computation (i.e. number of columns in \code{W} = number of rows in \code{H}).} \item{H}{a matrix to use in the computation as the coefficient matrix in place of \code{coef(object)}. It must be compatible with the basis matrix used in the computation (i.e. number of rows in \code{H} = number of columns in \code{W}).} \item{offset}{offset vector} \item{S}{smoothing matrix to use instead of \code{smoothing(object)} It must be a square matrix compatible with the basis and coefficient matrices used in the computation.} } \value{ the target matrix estimate as fitted by the model \code{object} } \description{ Computes the estimated target matrix based on a given \emph{NMF} model. The estimation depends on the underlying NMF model. For example in the standard model \eqn{V \equiv W H}{V ~ W H}, the target matrix is estimated by the matrix product \eqn{W H}. In other models, the estimate may depend on extra parameters/matrix (cf. Non-smooth NMF in \code{\link{NMFns-class}}). } \details{ This function is a S4 generic function imported from \link[stats]{fitted} in the package \emph{stats}. It is implemented as a pure virtual method for objects of class \code{NMF}, meaning that concrete NMF models must provide a definition for their corresponding class (i.e. sub-classes of class \code{NMF}). See \code{\linkS4class{NMF}} for more details. } \section{Methods}{ \describe{ \item{fitted}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{fitted}{\code{signature(object = "NMFstd")}: Compute the target matrix estimate in \emph{standard NMF models}. The estimate matrix is computed as the product of the two matrix slots \code{W} and \code{H}: \deqn{\hat{V} = W H}{V ~ W H} } \item{fitted}{\code{signature(object = "NMFOffset")}: Computes the target matrix estimate for an NMFOffset object. The estimate is computed as: \deqn{ W H + offset } } \item{fitted}{\code{signature(object = "NMFns")}: Compute estimate for an NMFns object, according to the Nonsmooth NMF model (cf. \code{\link{NMFns-class}}). Extra arguments in \code{...} are passed to method \code{smoothing}, and are typically used to pass a value for \code{theta}, which is used to compute the smoothing matrix instead of the one stored in \code{object}. } \item{fitted}{\code{signature(object = "NMFfit")}: Computes and return the estimated target matrix from an NMF model fitted with function \code{\link{nmf}}. It is a shortcut for \code{fitted(fit(object), ...)}, dispatching the call to the \code{fitted} method of the actual NMF model. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # random standard NMF model x <- rnmf(3, 10, 5) all.equal(fitted(x), basis(x) \%*\% coef(x)) } \keyword{methods} NMF/man/show-commaNMFfitXn-method.Rd0000644000176200001440000000046414333176413016647 0ustar liggesusers\docType{methods} \name{show,NMFfitXn-method} \alias{show,NMFfitXn-method} \title{Show method for objects of class \code{NMFfitXn}} \usage{ \S4method{show}{NMFfitXn}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFfitXn} } \keyword{methods} NMF/man/NMF-class.Rd0000644000176200001440000004112114333176413013463 0ustar liggesusers\docType{class} \name{NMF-class} \alias{.DollarNames,NMF-method} \alias{misc} \alias{NMF-class} \alias{$<-,NMF-method} \alias{$,NMF-method} \title{Generic Interface for Nonnegative Matrix Factorisation Models} \usage{ misc(object, ...) \S4method{$}{NMF}(x, name) \S4method{$}{NMF}(x, name)<-value \S4method{.DollarNames}{NMF}(x, pattern = "") } \arguments{ \item{object}{an object that inherit from class \code{NMF}} \item{...}{extra arguments (not used)} \item{x}{ object from which to extract element(s) or in which to replace element(s). } \item{name}{ A literal character string or a \link{name} (possibly \link{backtick} quoted). For extraction, this is normally (see under \sQuote{Environments}) partially matched to the \code{\link{names}} of the object. } \item{value}{typically an array-like \R object of a similar class as \code{x}.} \item{pattern}{ A regular expression. Only matching names are returned. } } \description{ The class \code{NMF} is a \emph{virtual class} that defines a common interface to handle Nonnegative Matrix Factorization models (NMF models) in a generic way. Provided a minimum set of generic methods is implemented by concrete model classes, these benefit from a whole set of functions and utilities to perform common computations and tasks in the context of Nonnegative Matrix Factorization. The function \code{misc} provides access to miscellaneous data members stored in slot \code{misc} (as a \code{list}), which allow extensions of NMF models to be implemented, without defining a new S4 class. } \details{ Class \code{NMF} makes it easy to develop new models that integrate well into the general framework implemented by the \emph{NMF} package. Following a few simple guidelines, new types of NMF models benefit from all the functionalities available for the built-in NMF models -- that derive themselves from class \code{NMF}. See section \emph{Implementing NMF models} below. See \code{\linkS4class{NMFstd}}, and references and links therein for details on the built-in implementations of the standard NMF model and its extensions. } \section{Slots}{ \describe{ \item{misc}{A list that is used internally to temporarily store algorithm parameters during the computation.} } } \section{Methods}{ \describe{ \item{[}{\code{signature(x = "NMF")}: This method provides a convenient way of sub-setting objects of class \code{NMF}, using a matrix-like syntax. It allows to consistently subset one or both matrix factors in the NMF model, as well as retrieving part of the basis components or part of the mixture coefficients with a reduced amount of code. See \code{\link{[,NMF-method}} for more details. } \item{$}{\code{signature(x = "NMF")}: shortcut for \code{x@misc[[name, exact=TRUE]]} respectively. } \item{$}{\code{signature(x = "NMF")}: shortcut for \code{x@misc[[name, exact=TRUE]]} respectively. } \item{$<-}{\code{signature(x = "NMF")}: shortcut for \code{x@misc[[name]] <- value} } \item{$<-}{\code{signature(x = "NMF")}: shortcut for \code{x@misc[[name]] <- value} } \item{.basis}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.basis<-}{\code{signature(object = "NMF", value = "matrix")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{basis<-}{\code{signature(object = "NMF")}: Default methods that calls \code{.basis<-} and check the validity of the updated object. } \item{basiscor}{\code{signature(x = "NMF", y = "matrix")}: Computes the correlations between the basis vectors of \code{x} and the columns of \code{y}. } \item{basiscor}{\code{signature(x = "NMF", y = "NMF")}: Computes the correlations between the basis vectors of \code{x} and \code{y}. } \item{basiscor}{\code{signature(x = "NMF", y = "missing")}: Computes the correlations between the basis vectors of \code{x}. } \item{basismap}{\code{signature(object = "NMF")}: Plots a heatmap of the basis matrix of the NMF model \code{object}. This method also works for fitted NMF models (i.e. \code{NMFfit} objects). } \item{c}{\code{signature(x = "NMF")}: Binds compatible matrices and NMF models together. } \item{.coef}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{.coef<-}{\code{signature(object = "NMF", value = "matrix")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{coef<-}{\code{signature(object = "NMF")}: Default methods that calls \code{.coef<-} and check the validity of the updated object. } \item{coefficients}{\code{signature(object = "NMF")}: Alias to \code{coef,NMF}, therefore also pure virtual. } \item{coefmap}{\code{signature(object = "NMF")}: The default method for NMF objects has special default values for some arguments of \code{\link{aheatmap}} (see argument description). } \item{connectivity}{\code{signature(object = "NMF")}: Computes the connectivity matrix for an NMF model, for which cluster membership is given by the most contributing basis component in each sample. See \code{\link{predict,NMF-method}}. } \item{consensus}{\code{signature(object = "NMF")}: This method is provided for completeness and is identical to \code{\link{connectivity}}, and returns the connectivity matrix, which, in the case of a single NMF model, is also the consensus matrix. } \item{consensushc}{\code{signature(object = "NMF")}: Compute the hierarchical clustering on the connectivity matrix of \code{object}. } \item{consensusmap}{\code{signature(object = "NMF")}: Plots a heatmap of the connectivity matrix of an NMF model. } \item{deviance}{\code{signature(object = "NMF")}: Computes the distance between a matrix and the estimate of an \code{NMF} model. } \item{dim}{\code{signature(x = "NMF")}: method for NMF objects for the base generic \code{\link{dim}}. It returns all dimensions in a length-3 integer vector: the number of row and columns of the estimated target matrix, as well as the factorization rank (i.e. the number of basis components). } \item{dimnames}{\code{signature(x = "NMF")}: Returns the dimension names of the NMF model \code{x}. It returns either NULL if no dimnames are set on the object, or a 3-length list containing the row names of the basis matrix, the column names of the mixture coefficient matrix, and the column names of the basis matrix (i.e. the names of the basis components). } \item{dimnames<-}{\code{signature(x = "NMF")}: sets the dimension names of the NMF model \code{x}. \code{value} can be \code{NULL} which resets all dimension names, or a 1, 2 or 3-length list providing names at least for the rows of the basis matrix. See \code{\link{dimnames}} for more details. } \item{.DollarNames}{\code{signature(x = "NMF")}: Auto-completion for \code{\linkS4class{NMF}} objects } \item{.DollarNames}{\code{signature(x = "NMF")}: Auto-completion for \code{\linkS4class{NMF}} objects } \item{extractFeatures}{\code{signature(object = "NMF")}: Select basis-specific features from an NMF model, by applying the method \code{extractFeatures,matrix} to its basis matrix. } \item{featureScore}{\code{signature(object = "NMF")}: Computes feature scores on the basis matrix of an NMF model. } \item{fitted}{\code{signature(object = "NMF")}: Pure virtual method for objects of class \code{\linkS4class{NMF}}, that should be overloaded by sub-classes, and throws an error if called. } \item{ibterms}{\code{signature(object = "NMF")}: Default pure virtual method that ensure a method is defined for concrete NMF model classes. } \item{icterms}{\code{signature(object = "NMF")}: Default pure virtual method that ensure a method is defined for concrete NMF model classes. } \item{loadings}{\code{signature(x = "NMF")}: Method loadings for NMF Models The method \code{loadings} is identical to \code{basis}, but do not accept any extra argument. See \code{\link{loadings,NMF-method}} for more details. } \item{metaHeatmap}{\code{signature(object = "NMF")}: Deprecated method that is substituted by \code{\link{coefmap}} and \code{\link{basismap}}. } \item{nmf.equal}{\code{signature(x = "NMF", y = "NMF")}: Compares two NMF models. Arguments in \code{...} are used only when \code{identical=FALSE} and are passed to \code{all.equal}. } \item{nmf.equal}{\code{signature(x = "NMF", y = "NMFfit")}: Compares two NMF models when at least one comes from a NMFfit object, i.e. an object returned by a single run of \code{\link{nmf}}. } \item{nmf.equal}{\code{signature(x = "NMF", y = "NMFfitX")}: Compares two NMF models when at least one comes from multiple NMF runs. } \item{nneg}{\code{signature(object = "NMF")}: Apply \code{nneg} to the basis matrix of an \code{\link{NMF}} object (i.e. \code{basis(object)}). All extra arguments in \code{...} are passed to the method \code{nneg,matrix}. } \item{predict}{\code{signature(object = "NMF")}: Default method for NMF models } \item{profcor}{\code{signature(x = "NMF", y = "matrix")}: Computes the correlations between the basis profiles of \code{x} and the rows of \code{y}. } \item{profcor}{\code{signature(x = "NMF", y = "NMF")}: Computes the correlations between the basis profiles of \code{x} and \code{y}. } \item{profcor}{\code{signature(x = "NMF", y = "missing")}: Computes the correlations between the basis profiles of \code{x}. } \item{rmatrix}{\code{signature(x = "NMF")}: Returns the target matrix estimate of the NMF model \code{x}, perturbated by adding a random matrix generated using the default method of \code{rmatrix}: it is a equivalent to \code{fitted(x) + rmatrix(fitted(x), ...)}. This method can be used to generate random target matrices that depart from a known NMF model to a controlled extend. This is useful to test the robustness of NMF algorithms to the presence of certain types of noise in the data. } \item{rnmf}{\code{signature(x = "NMF", target = "numeric")}: Generates a random NMF model of the same class and rank as another NMF model. This is the workhorse method that is eventually called by all other methods. It generates an NMF model of the same class and rank as \code{x}, compatible with the dimensions specified in \code{target}, that can be a single or 2-length numeric vector, to specify a square or rectangular target matrix respectively. See \code{\link{rnmf,NMF,numeric-method}} for more details. } \item{rnmf}{\code{signature(x = "NMF", target = "missing")}: Generates a random NMF model of the same dimension as another NMF model. It is a shortcut for \code{rnmf(x, nrow(x), ncol(x), ...)}, which returns a random NMF model of the same class and dimensions as \code{x}. } \item{rposneg}{\code{signature(object = "NMF")}: Apply \code{rposneg} to the basis matrix of an \code{\link{NMF}} object. } \item{show}{\code{signature(object = "NMF")}: Show method for objects of class \code{NMF} } \item{sparseness}{\code{signature(x = "NMF")}: Compute the sparseness of an object of class \code{NMF}, as the sparseness of the basis and coefficient matrices computed separately. It returns the two values in a numeric vector with names \sQuote{basis} and \sQuote{coef}. } \item{summary}{\code{signature(object = "NMF")}: Computes summary measures for a single NMF model. The following measures are computed: See \code{\link{summary,NMF-method}} for more details. } } } \section{Implementing NMF models}{ The class \code{NMF} only defines a basic data/low-level interface for NMF models, as a collection of generic methods, responsible with data handling, upon which relies a comprehensive set of functions, composing a rich higher-level interface. Actual NMF models are defined as sub-classes that inherits from class \code{NMF}, and implement the management of data storage, providing definitions for the interface's pure virtual methods. The minimum requirement to define a new NMF model that integrates into the framework of the \emph{NMF} package are the followings: \itemize{ \item Define a class that inherits from class \code{NMF} and implements the new model, say class \code{myNMF}. \item Implement the following S4 methods for the new class \code{myNMF}: \describe{ \item{fitted}{\code{signature(object = "myNMF", value = "matrix")}: Must return the estimated target matrix as fitted by the NMF model \code{object}. } \item{basis}{\code{signature(object = "myNMF")}: Must return the basis matrix(e.g. the first matrix factor in the standard NMF model). } \item{basis<-}{\code{signature(object = "myNMF", value = "matrix")}: Must return \code{object} with the basis matrix set to \code{value}. } \item{coef}{\code{signature(object = "myNMF")}: Must return the matrix of mixture coefficients (e.g. the second matrix factor in the standard NMF model). } \item{coef<-}{\code{signature(object = "myNMF", value = "matrix")}: Must return \code{object} with the matrix of mixture coefficients set to \code{value}. } } The \emph{NMF} package provides "pure virtual" definitions of these methods for class \code{NMF} (i.e. with signatures \code{(object='NMF', ...)} and \code{(object='NMF', value='matrix')}) that throw an error if called, so as to force their definition for model classes. \item Optionally, implement method \code{rnmf}(signature(x="myNMF", target="ANY")). This method should call \code{callNextMethod(x=x, target=target, ...)} and fill the returned NMF model with its specific data suitable random values. } For concrete examples of NMF models implementations, see class \code{\linkS4class{NMFstd}} and its extensions (e.g. classes \code{\linkS4class{NMFOffset}} or \code{\linkS4class{NMFns}}). } \section{Creating NMF objects}{ Strictly speaking, because class \code{NMF} is virtual, no object of class \code{NMF} can be instantiated, only objects from its sub-classes. However, those objects are sometimes shortly referred in the documentation and vignettes as "\code{NMF} objects" instead of "objects that inherits from class \code{NMF}". For built-in models or for models that inherit from the standard model class \code{\linkS4class{NMFstd}}, the factory method \code{nmfModel} enables to easily create valid \code{NMF} objects in a variety of common situations. See documentation for the the factory method \code{\link{nmfModel}} for more details. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # show all the NMF models available (i.e. the classes that inherit from class NMF) nmfModels() # show all the built-in NMF models available nmfModels(builtin.only=TRUE) # class NMF is a virtual class so cannot be instantiated: try( new('NMF') ) # To instantiate an NMF model, use the factory method nmfModel. see ?nmfModel nmfModel() nmfModel(3) nmfModel(3, model='NMFns') } \references{ Definition of Nonnegative Matrix Factorization in its modern formulation: \cite{Lee et al. (1999)} Historical first definition and algorithms: \cite{Paatero et al. (1994)} Lee DD and Seung HS (1999). "Learning the parts of objects by non-negative matrix factorization." _Nature_, *401*(6755), pp. 788-91. ISSN 0028-0836, , . Paatero P and Tapper U (1994). "Positive matrix factorization: A non-negative factor model with optimal utilization of error estimates of data values." _Environmetrics_, *5*(2), pp. 111-126. , . } \seealso{ Main interface to perform NMF in \code{\link{nmf-methods}}. Built-in NMF models and factory method in \code{\link{nmfModel}}. Method \code{\link{seed}} to set NMF objects with values suitable to start algorithms with. Other NMF-interface: \code{\link{basis}}, \code{\link{.basis}}, \code{\link{.basis<-}}, \code{\link{basis<-}}, \code{\link{coef}}, \code{\link{.coef}}, \code{\link{.coef<-}}, \code{\link{coef<-}}, \code{\link{coefficients}}, \code{\link{loadings,NMF-method}}, \code{\link{nmfModel}}, \code{\link{nmfModels}}, \code{\link{rnmf}}, \code{\link{scoef}} } \keyword{methods} NMF/man/fcnnls.Rd0000644000176200001440000001251314333176413013226 0ustar liggesusers\docType{methods} \name{fcnnls} \alias{fcnnls} \alias{fcnnls,ANY,numeric-method} \alias{fcnnls,matrix,matrix-method} \alias{fcnnls-methods} \alias{fcnnls,numeric,matrix-method} \title{Fast Combinatorial Nonnegative Least-Square} \usage{ fcnnls(x, y, ...) \S4method{fcnnls}{matrix,matrix}(x, y, verbose = FALSE, pseudo = TRUE, ...) } \arguments{ \item{...}{extra arguments passed to the internal function \code{.fcnnls}. Currently not used.} \item{verbose}{toggle verbosity (default is \code{FALSE}).} \item{x}{the coefficient matrix} \item{y}{the target matrix to be approximated by \eqn{X K}.} \item{pseudo}{By default (\code{pseudo=FALSE}) the algorithm uses Gaussian elimination to solve the successive internal linear problems, using the \code{\link{solve}} function. If \code{pseudo=TRUE} the algorithm uses Moore-Penrose generalized \code{\link[corpcor]{pseudoinverse}} from the \code{corpcor} package instead of \link{solve}.} } \value{ A list containing the following components: \item{x}{ the estimated optimal matrix \eqn{K}.} \item{fitted}{ the fitted matrix \eqn{X K}.} \item{residuals}{ the residual matrix \eqn{Y - X K}.} \item{deviance}{ the residual sum of squares between the fitted matrix \eqn{X K} and the target matrix \eqn{Y}. That is the sum of the square residuals.} \item{passive}{ a \eqn{r x p} logical matrix containing the passive set, that is the set of entries in \eqn{K} that are not null (i.e. strictly positive).} \item{pseudo}{ a logical that is \code{TRUE} if the computation was performed using the pseudoinverse. See argument \code{pseudo}.} } \description{ This function solves the following nonnegative least square linear problem using normal equations and the fast combinatorial strategy from \cite{Van Benthem et al. (2004)}: \deqn{ \begin{array}{l} \min \|Y - X K\|_F\\ \mbox{s.t. } K>=0 \end{array} }{min ||Y - X K||_F, s.t. K>=0} where \eqn{Y} and \eqn{X} are two real matrices of dimension \eqn{n \times p}{n x p} and \eqn{n \times r}{n x r} respectively, and \eqn{\|.\|_F}{|.|_F} is the Frobenius norm. The algorithm is very fast compared to other approaches, as it is optimised for handling multiple right-hand sides. } \details{ Within the \code{NMF} package, this algorithm is used internally by the SNMF/R(L) algorithm from \cite{Kim et al. (2007)} to solve general Nonnegative Matrix Factorization (NMF) problems, using alternating nonnegative constrained least-squares. That is by iteratively and alternatively estimate each matrix factor. The algorithm is an active/passive set method, which rearrange the right-hand side to reduce the number of pseudo-inverse calculations. It uses the unconstrained solution \eqn{K_u} obtained from the unconstrained least squares problem, i.e. \eqn{\min \|Y - X K\|_F^2}{min ||Y - X K||_F^2} , so as to determine the initial passive sets. The function \code{fcnnls} is provided separately so that it can be used to solve other types of nonnegative least squares problem. For faster computation, when multiple nonnegative least square fits are needed, it is recommended to directly use the function \code{\link{.fcnnls}}. The code of this function is a port from the original MATLAB code provided by \cite{Kim et al. (2007)}. } \section{Methods}{ \describe{ \item{fcnnls}{\code{signature(x = "matrix", y = "matrix")}: This method wraps a call to the internal function \code{.fcnnls}, and formats the results in a similar way as other lest-squares methods such as \code{\link{lm}}. } \item{fcnnls}{\code{signature(x = "numeric", y = "matrix")}: Shortcut for \code{fcnnls(as.matrix(x), y, ...)}. } \item{fcnnls}{\code{signature(x = "ANY", y = "numeric")}: Shortcut for \code{fcnnls(x, as.matrix(y), ...)}. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } ## Define a random nonnegative matrix matrix n <- 200; p <- 20; r <- 3 V <- rmatrix(n, p) ## Compute the optimal matrix K for a given X matrix X <- rmatrix(n, r) res <- fcnnls(X, V) ## Compute the same thing using the Moore-Penrose generalized pseudoinverse res <- fcnnls(X, V, pseudo=TRUE) ## It also works in the case of single vectors y <- runif(n) res <- fcnnls(X, y) # or res <- fcnnls(X[,1], y) } \author{ Original MATLAB code : Van Benthem and Keenan Adaption of MATLAB code for SNMF/R(L): H. Kim Adaptation to the NMF package framework: Renaud Gaujoux } \references{ Original MATLAB code from Van Benthem and Keenan, slightly modified by H. Kim:(http://www.cc.gatech.edu/~hpark/software/fcnnls.m) Van Benthem M and Keenan MR (2004). "Fast algorithm for the solution of large-scale non-negativity-constrained least squares problems." _Journal of Chemometrics_, *18*(10), pp. 441-450. ISSN 0886-9383, , . Kim H and Park H (2007). "Sparse non-negative matrix factorizations via alternating non-negativity-constrained least squares for microarray data analysis." _Bioinformatics (Oxford, England)_, *23*(12), pp. 1495-502. ISSN 1460-2059, , . } \seealso{ \code{\link{nmf}} } \keyword{methods} \keyword{multivariate} \keyword{optimize} \keyword{regression} NMF/man/NMFstd-class.Rd0000644000176200001440000001436614335211134014201 0ustar liggesusers\docType{class} \name{NMFstd-class} \alias{NMFstd-class} \title{NMF Model - Standard model} \description{ This class implements the standard model of Nonnegative Matrix Factorization. It provides a general structure and generic functions to manage factorizations that follow the standard NMF model, as defined by \cite{Lee et al. (2001)}. } \details{ Let \eqn{V} be a \eqn{n \times m} non-negative matrix and \eqn{r} a positive integer. In its standard form (see references below), a NMF of \eqn{V} is commonly defined as a pair of matrices \eqn{(W, H)} such that: \deqn{V \equiv W H,} where: \itemize{ \item \eqn{W} and \eqn{H} are \eqn{n \times r} and \eqn{r \times m} matrices respectively with non-negative entries; \item \eqn{\equiv} is to be understood with respect to some loss function. Common choices of loss functions are based on Frobenius norm or Kullback-Leibler divergence. } Integer \eqn{r} is called the \emph{factorization rank}. Depending on the context of application of NMF, the columns of \eqn{W} and \eqn{H} are given different names: \describe{ \item{columns of \code{W}}{basis vector, metagenes, factors, source, image basis} \item{columns of \code{H}}{mixture coefficients, metagene sample expression profiles, weights} \item{rows of \code{H}}{basis profiles, metagene expression profiles} } NMF approaches have been successfully applied to several fields. The package NMF was implemented trying to use names as generic as possible for objects and methods. The following terminology is used: \describe{ \item{samples}{the columns of the target matrix \eqn{V}} \item{features}{the rows of the target matrix \eqn{V}} \item{basis matrix}{the first matrix factor \eqn{W}} \item{basis vectors}{the columns of first matrix factor \eqn{W}} \item{mixture matrix}{the second matrix factor \eqn{H}} \item{mixtures coefficients}{the columns of second matrix factor \eqn{H}} } However, because the package NMF was primarily implemented to work with gene expression microarray data, it also provides a layer to easily and intuitively work with objects from the Bioconductor base framework. See \link{bioc-NMF} for more details. } \section{Slots}{ \describe{ \item{W}{A \code{matrix} that contains the basis matrix, i.e. the \emph{first} matrix factor of the factorisation} \item{H}{A \code{matrix} that contains the coefficient matrix, i.e. the \emph{second} matrix factor of the factorisation} \item{bterms}{a \code{data.frame} that contains the primary data that define fixed basis terms. See \code{\link{bterms}}.} \item{ibterms}{integer vector that contains the indexes of the basis components that are fixed, i.e. for which only the coefficient are estimated. IMPORTANT: This slot is set on construction of an NMF model via \code{\link[=nmfModel,formula,ANY-method]{nmfModel}} and is not recommended to not be subsequently changed by the end-user.} \item{cterms}{a \code{data.frame} that contains the primary data that define fixed coefficient terms. See \code{\link{cterms}}.} \item{icterms}{integer vector that contains the indexes of the basis components that have fixed coefficients, i.e. for which only the basis vectors are estimated. IMPORTANT: This slot is set on construction of an NMF model via \code{\link[=nmfModel,formula,ANY-method]{nmfModel}} and is not recommended to not be subsequently changed by the end-user.} } } \section{Methods}{ \describe{ \item{.basis}{\code{signature(object = "NMFstd")}: Get the basis matrix in standard NMF models This function returns slot \code{W} of \code{object}. } \item{.basis<-}{\code{signature(object = "NMFstd", value = "matrix")}: Set the basis matrix in standard NMF models This function sets slot \code{W} of \code{object}. } \item{bterms<-}{\code{signature(object = "NMFstd")}: Default method tries to coerce \code{value} into a \code{data.frame} with \code{\link{as.data.frame}}. } \item{.coef}{\code{signature(object = "NMFstd")}: Get the mixture coefficient matrix in standard NMF models This function returns slot \code{H} of \code{object}. } \item{.coef<-}{\code{signature(object = "NMFstd", value = "matrix")}: Set the mixture coefficient matrix in standard NMF models This function sets slot \code{H} of \code{object}. } \item{cterms<-}{\code{signature(object = "NMFstd")}: Default method tries to coerce \code{value} into a \code{data.frame} with \code{\link{as.data.frame}}. } \item{fitted}{\code{signature(object = "NMFstd")}: Compute the target matrix estimate in \emph{standard NMF models}. The estimate matrix is computed as the product of the two matrix slots \code{W} and \code{H}: \deqn{\hat{V} = W H}{V ~ W H} } \item{ibterms}{\code{signature(object = "NMFstd")}: Method for standard NMF models, which returns the integer vector that is stored in slot \code{ibterms} when a formula-based NMF model is instantiated. } \item{icterms}{\code{signature(object = "NMFstd")}: Method for standard NMF models, which returns the integer vector that is stored in slot \code{icterms} when a formula-based NMF model is instantiated. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # create a completely empty NMFstd object new('NMFstd') # create a NMF object based on one random matrix: the missing matrix is deduced # Note this only works when using factory method NMF n <- 50; r <- 3; w <- rmatrix(n, r) nmfModel(W=w) # create a NMF object based on random (compatible) matrices p <- 20 h <- rmatrix(r, p) nmfModel(W=w, H=h) # create a NMF object based on incompatible matrices: generate an error h <- rmatrix(r+1, p) try( new('NMFstd', W=w, H=h) ) try( nmfModel(w, h) ) # Giving target dimensions to the factory method allow for coping with dimension # incompatibilty (a warning is thrown in such case) nmfModel(r, W=w, H=h) } \references{ Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } \seealso{ Other NMF-model: \code{\link{initialize,NMFOffset-method}}, \code{\link{NMFns-class}}, \code{\link{NMFOffset-class}} } NMF/man/silhouette.NMF.Rd0000644000176200001440000000435214333176413014551 0ustar liggesusers\name{silhouette.NMF} \alias{silhouette.NMF} \title{Silhouette of NMF Clustering} \usage{ \method{silhouette}{NMF} (x, what = NULL, order = NULL, ...) } \arguments{ \item{x}{an NMF object, as returned by \code{\link{nmf}}.} \item{what}{defines the type of clustering the computed silhouettes are meant to assess: \code{'samples'} for the clustering of samples (i.e. the columns of the target matrix), \code{'features'} for the clustering of features (i.e. the rows of the target matrix), and \code{'chc'} for the consensus clustering of samples as defined by hierarchical clustering dendrogram, \code{'consensus'} for the consensus clustering of samples, with clustered ordered as in the \strong{default} hierarchical clustering used by \code{\link{consensusmap}} when plotting the heatmap of the consensus matrix (for multi-run NMF fits). That is \code{dist = 1 - consensus(x)}, average linkage and reordering based on row means.} \item{order}{integer indexing vector that can be used to force the silhouette order.} \item{...}{extra arguments not used.} } \description{ Silhouette of NMF Clustering } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } x <- rmatrix(75, 15, dimnames = list(paste0('a', 1:75), letters[1:15])) # NB: using low value for maxIter for the example purpose only res <- nmf(x, 4, nrun = 3, maxIter = 20) # sample clustering from best fit plot(silhouette(res)) # average silhouette are computed in summary measures summary(res) # consensus silhouettes are ordered as on default consensusmap heatmap \dontrun{ op <- par(mfrow = c(1,2)) } consensusmap(res) si <- silhouette(res, what = 'consensus') plot(si) \dontrun{ par(op) } # if the order is based on some custom numeric weights \dontrun{ op <- par(mfrow = c(1,2)) } cm <- consensusmap(res, Rowv = runif(ncol(res))) # NB: use reverse order because silhouettes are plotted top-down si <- silhouette(res, what = 'consensus', order = rev(cm$rowInd)) plot(si) \dontrun{ par(op) } # do the reverse: order the heatmap as a set of silhouettes si <- silhouette(res, what = 'features') \dontrun{ op <- par(mfrow = c(1,2)) } basismap(res, Rowv = si) plot(si) \dontrun{ par(op) } } \seealso{ \code{\link[NMF]{predict}} } NMF/man/fit.Rd0000644000176200001440000000746214333176413012534 0ustar liggesusers\docType{methods} \name{fit} \alias{fit} \alias{fit<-} \alias{fit<--methods} \alias{fit-methods} \alias{fit,NMFfit-method} \alias{fit<-,NMFfit,NMF-method} \alias{fit,NMFfitX1-method} \alias{fit,NMFfitX-method} \alias{fit,NMFfitXn-method} \alias{minfit} \alias{minfit-methods} \alias{minfit,NMFfit-method} \alias{minfit,NMFfitX1-method} \alias{minfit,NMFfitX-method} \alias{minfit,NMFfitXn-method} \title{Extracting Fitted Models} \usage{ fit(object, ...) fit(object)<-value minfit(object, ...) } \arguments{ \item{object}{an object fitted by some algorithm, e.g. as returned by the function \code{\link{nmf}}.} \item{value}{replacement value} \item{...}{extra arguments to allow extension} } \description{ The functions \code{fit} and \code{minfit} are S4 genetics that extract the best model object and the best fit object respectively, from a collection of models or from a wrapper object. \code{fit<-} sets the fitted model in a fit object. It is meant to be called only when developing new NMF algorithms, e.g. to update the value of the model stored in the starting point. } \details{ A fit object differs from a model object in that it contains data about the fit, such as the initial RNG settings, the CPU time used, etc\ldots, while a model object only contains the actual modelling data such as regression coefficients, loadings, etc\ldots That best model is generally defined as the one that achieves the maximum/minimum some quantitative measure, amongst all models in a collection. In the case of NMF models, the best model is the one that achieves the best approximation error, according to the objective function associated with the algorithm that performed the fit(s). } \section{Methods}{ \describe{ \item{fit}{\code{signature(object = "NMFfit")}: Returns the NMF model object stored in slot \code{'fit'}. } \item{fit}{\code{signature(object = "NMFfitX")}: Returns the model object that achieves the lowest residual approximation error across all the runs. It is a pure virtual method defined to ensure \code{fit} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. } \item{fit}{\code{signature(object = "NMFfitX1")}: Returns the model object associated with the best fit, amongst all the runs performed when fitting \code{object}. Since \code{NMFfitX1} objects only hold the best fit, this method simply returns the NMF model fitted by \code{object} -- that is stored in slot \sQuote{fit}. } \item{fit}{\code{signature(object = "NMFfitXn")}: Returns the best NMF fit object amongst all the fits stored in \code{object}, i.e. the fit that achieves the lowest estimation residuals. } \item{fit<-}{\code{signature(object = "NMFfit", value = "NMF")}: Updates the NMF model object stored in slot \code{'fit'} with a new value. } \item{minfit}{\code{signature(object = "NMFfit")}: Returns the object its self, since there it is the result of a single NMF run. } \item{minfit}{\code{signature(object = "NMFfitX")}: Returns the fit object that achieves the lowest residual approximation error across all the runs. It is a pure virtual method defined to ensure \code{minfit} is defined for sub-classes of \code{NMFfitX}, which throws an error if called. } \item{minfit}{\code{signature(object = "NMFfitX1")}: Returns the fit object associated with the best fit, amongst all the runs performed when fitting \code{object}. Since \code{NMFfitX1} objects only hold the best fit, this method simply returns \code{object} coerced into an \code{NMFfit} object. } \item{minfit}{\code{signature(object = "NMFfitXn")}: Returns the best NMF model in the list, i.e. the run that achieved the lower estimation residuals. The model is selected based on its \code{deviance} value. } } } \keyword{methods} NMF/man/dimnames.Rd0000644000176200001440000001154414333176413013543 0ustar liggesusers\docType{methods} \name{basisnames} \alias{basisnames} \alias{basisnames<-} \alias{basisnames<-,ANY-method} \alias{basisnames,ANY-method} \alias{basisnames<--methods} \alias{basisnames-methods} \alias{dimnames-NMF} \alias{dimnames<-,NMF-method} \alias{dimnames,NMF-method} \title{Dimension names for NMF objects} \usage{ basisnames(x, ...) basisnames(x, ...)<-value \S4method{dimnames}{NMF}(x) \S4method{dimnames}{NMF}(x)<-value } \arguments{ \item{x}{an object with suitable \code{basis} and \code{coef} methods, such as an object that inherit from \code{\linkS4class{NMF}}.} \item{...}{extra argument to allow extension.} \item{value}{a character vector, or \code{NULL} or, in the case of \code{dimnames<-}, a list 2 or 3-length list of character vectors.} } \description{ The methods \code{dimnames}, \code{rownames}, \code{colnames} and \code{basisnames} and their respective replacement form allow to get and set the dimension names of the matrix factors in a NMF model. \code{dimnames} returns all the dimension names in a single list. Its replacement form \code{dimnames<-} allows to set all dimension names at once. \code{rownames}, \code{colnames} and \code{basisnames} provide separate access to each of these dimension names respectively. Their respective replacement form allow to set each dimension names separately. } \details{ The function \code{basisnames} is a new S4 generic defined in the package NMF, that returns the names of the basis components of an object. Its default method should work for any object, that has a suitable \code{basis} method defined for its class. The method \code{dimnames} is implemented for the base generic \code{\link{dimnames}}, which make the base function \code{\link{rownames}} and \code{\link{colnames}} work directly. Overall, these methods behave as their equivalent on \code{matrix} objects. The function \code{basisnames<-} ensures that the dimension names are handled in a consistent way on both factors, enforcing the names on both matrix factors simultaneously. The function \code{basisnames<-} is a new S4 generic defined in the package NMF, that sets the names of the basis components of an object. Its default method should work for any object, that has suitable \code{basis<-} and \code{coef<-} methods method defined for its class. } \section{Methods}{ \describe{ \item{basisnames}{\code{signature(x = "ANY")}: Default method which returns the column names of the basis matrix extracted from \code{x}, using the \code{basis} method. For NMF objects these also correspond to the row names of the coefficient matrix. } \item{basisnames<-}{\code{signature(x = "ANY")}: Default method which sets, respectively, the row and the column names of the basis matrix and coefficient matrix of \code{x} to \code{value}. } \item{dimnames}{\code{signature(x = "NMF")}: Returns the dimension names of the NMF model \code{x}. It returns either NULL if no dimnames are set on the object, or a 3-length list containing the row names of the basis matrix, the column names of the mixture coefficient matrix, and the column names of the basis matrix (i.e. the names of the basis components). } \item{dimnames<-}{\code{signature(x = "NMF")}: sets the dimension names of the NMF model \code{x}. \code{value} can be \code{NULL} which resets all dimension names, or a 1, 2 or 3-length list providing names at least for the rows of the basis matrix. The optional second element of \code{value} (NULL if absent) is used to set the column names of the coefficient matrix. The optional third element of \code{value} (NULL if absent) is used to set both the column names of the basis matrix and the row names of the coefficient matrix. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # create a random NMF object a <- rnmf(2, 5, 3) # set dimensions dims <- list( features=paste('f', 1:nrow(a), sep='') , samples=paste('s', 1:ncol(a), sep='') , basis=paste('b', 1:nbasis(a), sep='') ) dimnames(a) <- dims dimnames(a) basis(a) coef(a) # access the dimensions separately rownames(a) colnames(a) basisnames(a) # set only the first dimension (rows of basis): the other two dimnames are set to NULL dimnames(a) <- dims[1] dimnames(a) basis(a) coef(a) # set only the two first dimensions (rows and columns of basis and coef respectively): # the basisnames are set to NULL dimnames(a) <- dims[1:2] dimnames(a) basis(a) # reset the dimensions dimnames(a) <- NULL dimnames(a) basis(a) coef(a) # set each dimensions separately rownames(a) <- paste('X', 1:nrow(a), sep='') # only affect rows of basis basis(a) colnames(a) <- paste('Y', 1:ncol(a), sep='') # only affect columns of coef coef(a) basisnames(a) <- paste('Z', 1:nbasis(a), sep='') # affect both basis and coef matrices basis(a) coef(a) } \keyword{methods} NMF/man/objective-commaNMFfit-method.Rd0000644000176200001440000000140414333176413017326 0ustar liggesusers\docType{methods} \name{objective,NMFfit-method} \alias{objective,NMFfit-method} \title{Returns the objective function associated with the algorithm that computed the fitted NMF model \code{object}, or the objective value with respect to a given target matrix \code{y} if it is supplied.} \usage{ \S4method{objective}{NMFfit}(object, y) } \arguments{ \item{y}{optional target matrix used to compute the objective value.} \item{object}{an object computed using some algorithm, or that describes an algorithm itself.} } \description{ Returns the objective function associated with the algorithm that computed the fitted NMF model \code{object}, or the objective value with respect to a given target matrix \code{y} if it is supplied. } \keyword{methods} NMF/man/setNMFMethod.Rd0000644000176200001440000000310014333176413014230 0ustar liggesusers\name{setNMFMethod} \alias{nmfRegisterAlgorithm} \alias{setNMFMethod} \title{Registering NMF Algorithms} \usage{ setNMFMethod(name, method, ..., overwrite = isLoadingNamespace(), verbose = TRUE) nmfRegisterAlgorithm(name, method, ..., overwrite = isLoadingNamespace(), verbose = TRUE) } \arguments{ \item{...}{arguments passed to the factory function \code{\link{NMFStrategy}}, which instantiate the \code{\linkS4class{NMFStrategy}} object that is stored in registry.} \item{overwrite}{logical that indicates if any existing NMF method with the same name should be overwritten (\code{TRUE}) or not (\code{FALSE}), in which case an error is thrown.} \item{verbose}{a logical that indicates if information about the registration should be printed (\code{TRUE}) or not (\code{FALSE}).} \item{name}{name/key of an NMF algorithm.} \item{method}{definition of the algorithm} } \description{ Adds a new algorithm to the registry of algorithms that perform Nonnegative Matrix Factorization. \code{nmfRegisterAlgorithm} is an alias to \code{setNMFMethod} for backward compatibility. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # define/regsiter a new -- dummy -- NMF algorithm with the minimum arguments # y: target matrix # x: initial NMF model (i.e. the seed) # NB: this algorithm simply return the seed unchanged setNMFMethod('mynmf', function(y, x, ...){ x }) # check algorithm on toy data res <- nmfCheck('mynmf') # the NMF seed is not changed stopifnot( nmf.equal(res, nmfCheck('mynmf', seed=res)) ) } NMF/man/connectivity.Rd0000644000176200001440000001061014333176413014455 0ustar liggesusers\docType{methods} \name{connectivity} \alias{connectivity} \alias{connectivity,ANY-method} \alias{connectivity,factor-method} \alias{connectivity-methods} \alias{connectivity,NMF-method} \alias{connectivity,numeric-method} \alias{consensus} \alias{consensus-methods} \alias{consensus,NMFfitX-method} \alias{consensus,NMF-method} \title{Clustering Connectivity and Consensus Matrices} \usage{ connectivity(object, ...) \S4method{connectivity}{NMF}(object, no.attrib = FALSE) consensus(object, ...) } \arguments{ \item{object}{an object with a suitable \code{\link{predict}} method.} \item{...}{extra arguments to allow extension. They are passed to \code{\link{predict}}, except for the \code{vector} and \code{factor} methods.} \item{no.attrib}{a logical that indicates if attributes containing information about the NMF model should be attached to the result (\code{TRUE}) or not (\code{FALSE}).} } \value{ a square matrix of dimension the number of samples in the model, full of 0s or 1s. } \description{ \code{connectivity} is an S4 generic that computes the connectivity matrix based on the clustering of samples obtained from a model's \code{\link{predict}} method. The consensus matrix has been proposed by \cite{Brunet et al. (2004)} to help visualising and measuring the stability of the clusters obtained by NMF approaches. For objects of class \code{NMF} (e.g. results of a single NMF run, or NMF models), the consensus matrix reduces to the connectivity matrix. } \details{ The connectivity matrix of a given partition of a set of samples (e.g. given as a cluster membership index) is the matrix \eqn{C} containing only 0 or 1 entries such that: \deqn{C_{ij} = \left\{\begin{array}{l} 1\mbox{ if sample }i\mbox{ belongs to the same cluster as sample }j\\ 0\mbox{ otherwise} \end{array}\right..}{ C_{ij} = 1 if sample i belongs to the same cluster as sample j, 0 otherwise} } \section{Methods}{ \describe{ \item{connectivity}{\code{signature(object = "ANY")}: Default method which computes the connectivity matrix using the result of \code{predict(x, ...)} as cluster membership index. } \item{connectivity}{\code{signature(object = "factor")}: Computes the connectivity matrix using \code{x} as cluster membership index. } \item{connectivity}{\code{signature(object = "numeric")}: Equivalent to \code{connectivity(as.factor(x))}. } \item{connectivity}{\code{signature(object = "NMF")}: Computes the connectivity matrix for an NMF model, for which cluster membership is given by the most contributing basis component in each sample. See \code{\link{predict,NMF-method}}. } \item{consensus}{\code{signature(object = "NMFfitX")}: Pure virtual method defined to ensure \code{consensus} is defined for sub-classes of \code{NMFfitX}. It throws an error if called. } \item{consensus}{\code{signature(object = "NMF")}: This method is provided for completeness and is identical to \code{\link{connectivity}}, and returns the connectivity matrix, which, in the case of a single NMF model, is also the consensus matrix. } \item{consensus}{\code{signature(object = "NMFfitX1")}: The result is the matrix stored in slot \sQuote{consensus}. This method returns \code{NULL} if the consensus matrix is empty. See \code{\link{consensus,NMFfitX1-method}} for more details. } \item{consensus}{\code{signature(object = "NMFfitXn")}: This method returns \code{NULL} on an empty object. The result is a matrix with several attributes attached, that are used by plotting functions such as \code{\link{consensusmap}} to annotate the plots. See \code{\link{consensus,NMFfitXn-method}} for more details. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # connectivity,ANY-method #---------- # clustering of random data h <- hclust(dist(rmatrix(10,20))) connectivity(cutree(h, 2)) #---------- # connectivity,factor-method #---------- connectivity(gl(2, 4)) } \references{ Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . } \seealso{ \code{\link{predict}} } \keyword{methods} NMF/man/txtProgressBar.Rd0000644000176200001440000000316314333176413014735 0ustar liggesusers\name{txtProgressBar} \alias{txtProgressBar} \title{Simple Progress Bar} \usage{ txtProgressBar(min = 0, max = 1, initial = 0, char = "=", width = NA, title = if (style == 3) " ", label, style = 1, file = "", shared = NULL) } \arguments{ \item{shared}{specification of a shared directory to use when the progress bar is to be used by multiple processes.} \item{min}{(finite) numeric values for the extremes of the progress bar. Must have \code{min < max}.} \item{max}{(finite) numeric values for the extremes of the progress bar. Must have \code{min < max}.} \item{initial}{initial or new value for the progress bar. See \sQuote{Details} for what happens with invalid values.} \item{char}{the character (or character string) to form the progress bar.} \item{width}{the width of the progress bar, as a multiple of the width of \code{char}. If \code{NA}, the default, the number of characters is that which fits into \code{getOption("width")}.} \item{title}{ignored, for compatibility with other progress bars.} \item{label}{ignored, for compatibility with other progress bars.} \item{style}{the \sQuote{style} of the bar -- see \sQuote{Details}.} \item{file}{an open connection object or \code{""} which indicates the console: \code{\link{stderr}()} might be useful here.} } \description{ Creates a simple progress bar with title. This function is identical to \code{utils::txtProgressBar} but allow adding a title to the progress bar, and can be shared by multiple processes, e.g., in multicore or multi-hosts computations. } \author{ R Core Team } \keyword{internal} NMF/man/NMFfitX1-class.Rd0000644000176200001440000000701714334424361014404 0ustar liggesusers\docType{class} \name{NMFfitX1-class} \alias{NMFfitX1-class} \title{Structure for Storing the Best Fit Amongst Multiple NMF Runs} \description{ This class is used to return the result from a multiple run of a single NMF algorithm performed with function \code{nmf} with the -- default -- option \code{keep.all=FALSE} (cf. \code{\link{nmf}}). } \details{ It extends both classes \code{\linkS4class{NMFfitX}} and \code{\linkS4class{NMFfit}}, and stores a the result of the best fit in its \code{NMFfit} structure. Beside the best fit, this class allows to hold data about the computation of the multiple runs, such as the number of runs, the CPU time used to perform all the runs, as well as the consensus matrix. Due to the inheritance from class \code{NMFfit}, objects of class \code{NMFfitX1} can be handled exactly as the results of single NMF run -- as if only the best run had been performed. } \section{Slots}{ \describe{ \item{consensus}{object of class \code{matrix} used to store the consensus matrix based on all the runs.} \item{nrun}{an \code{integer} that contains the number of runs performed to compute the object.} \item{rng1}{an object that contains RNG settings used for the first run. See \code{\link{getRNG1}}.} } } \section{Methods}{ \describe{ \item{consensus}{\code{signature(object = "NMFfitX1")}: The result is the matrix stored in slot \sQuote{consensus}. This method returns \code{NULL} if the consensus matrix is empty. } \item{fit}{\code{signature(object = "NMFfitX1")}: Returns the model object associated with the best fit, amongst all the runs performed when fitting \code{object}. Since \code{NMFfitX1} objects only hold the best fit, this method simply returns the NMF model fitted by \code{object} -- that is stored in slot \sQuote{fit}. } \item{getRNG1}{\code{signature(object = "NMFfitX1")}: Returns the RNG settings used to compute the first of all NMF runs, amongst which \code{object} was selected as the best fit. } \item{minfit}{\code{signature(object = "NMFfitX1")}: Returns the fit object associated with the best fit, amongst all the runs performed when fitting \code{object}. Since \code{NMFfitX1} objects only hold the best fit, this method simply returns \code{object} coerced into an \code{NMFfit} object. } \item{nmf.equal}{\code{signature(x = "NMFfitX1", y = "NMFfitX1")}: Compares the NMF models fitted by multiple runs, that only kept the best fits. } \item{nrun}{\code{signature(object = "NMFfitX1")}: Returns the number of NMF runs performed, amongst which \code{object} was selected as the best fit. } \item{show}{\code{signature(object = "NMFfitX1")}: Show method for objects of class \code{NMFfitX1} } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # generate a synthetic dataset with known classes n <- 15; counts <- c(5, 2, 3); V <- syntheticNMF(n, counts, factors = TRUE) # get the class factor groups <- V$pData$Group # perform multiple runs of one algorithm, keeping only the best fit (default) #i.e.: the implicit nmf options are .options=list(keep.all=FALSE) or .options='-k' res <- nmf(V[[1]], 3, nrun=2) res # compute summary measures summary(res) # get more info summary(res, target=V[[1]], class=groups) # show computational time runtime.all(res) # plot the consensus matrix, as stored (pre-computed) in the object \dontrun{ consensusmap(res, annCol=groups) } } \seealso{ Other multipleNMF: \code{\link{NMFfitX-class}}, \code{\link{NMFfitXn-class}} } NMF/man/nmfFormals.Rd0000644000176200001440000000122714333176413014047 0ustar liggesusers\name{nmfFormals} \alias{nmfArgs} \alias{nmfFormals} \title{Showing Arguments of NMF Algorithms} \usage{ nmfFormals(x, ...) nmfArgs(x) } \arguments{ \item{x}{algorithm specification} \item{...}{extra argument to allow extension} } \description{ This function returns the extra arguments that can be passed to a given NMF algorithm in call to \code{\link{nmf}}. \code{nmfArgs} is a shortcut for \code{args(nmfWrapper(x))}, to display the arguments of a given NMF algorithm. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } # show arguments of an NMF algorithm nmfArgs('brunet') nmfArgs('snmf/r') } NMF/man/nmf_update_KL.Rd0000644000176200001440000000551314335211156014451 0ustar liggesusers\name{nmf_update.KL.h} \alias{nmf_update.KL} \alias{nmf_update.KL.h} \alias{nmf_update.KL.h_R} \alias{nmf_update.KL.w} \alias{nmf_update.KL.w_R} \title{NMF Multiplicative Updates for Kullback-Leibler Divergence} \usage{ nmf_update.KL.h(v, w, h, nbterms = 0L, ncterms = 0L, copy = TRUE) nmf_update.KL.h_R(v, w, h, wh = NULL) nmf_update.KL.w(v, w, h, nbterms = 0L, ncterms = 0L, copy = TRUE) nmf_update.KL.w_R(v, w, h, wh = NULL) } \arguments{ \item{v}{target matrix} \item{w}{current basis matrix} \item{h}{current coefficient matrix} \item{nbterms}{number of fixed basis terms} \item{ncterms}{number of fixed coefficient terms} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} \item{wh}{already computed NMF estimate used to compute the denominator term.} } \value{ a matrix of the same dimension as the input matrix to update (i.e. \code{w} or \code{h}). If \code{copy=FALSE}, the returned matrix uses the same memory as the input object. } \description{ Multiplicative updates from \cite{Lee et al. (2001)} for standard Nonnegative Matrix Factorization models \eqn{V \approx W H}, where the distance between the target matrix and its NMF estimate is measured by the Kullback-Leibler divergence. \code{nmf_update.KL.w} and \code{nmf_update.KL.h} compute the updated basis and coefficient matrices respectively. They use a \emph{C++} implementation which is optimised for speed and memory usage. \code{nmf_update.KL.w_R} and \code{nmf_update.KL.h_R} implement the same updates in \emph{plain R}. } \details{ The coefficient matrix (\code{H}) is updated as follows: \deqn{ H_{kj} \leftarrow H_{kj} \frac{\left( sum_i \frac{W_{ik} V_{ij}}{(WH)_{ij}} \right)}{ sum_i W_{ik} }. }{ H_kj <- H_kj ( sum_i [ W_ik V_ij / (WH)_ij ] ) / ( sum_i W_ik ) } These updates are used in built-in NMF algorithms \code{\link[=KL-nmf]{KL}} and \code{\link[=brunet-nmf]{brunet}}. The basis matrix (\code{W}) is updated as follows: \deqn{ W_{ik} \leftarrow W_{ik} \frac{ sum_j [\frac{H_{kj} A_{ij}}{(WH)_{ij}} ] }{sum_j H_{kj} } }{ W_ik <- W_ik ( sum_u [H_kl A_il / (WH)_il ] ) / ( sum_l H_kl ) } } \author{ Update definitions by \cite{Lee2001}. C++ optimised implementation by Renaud Gaujoux. } \references{ Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. . } NMF/man/ccSpec.Rd0000644000176200001440000000045214560454447013152 0ustar liggesusers\name{ccSpec} \alias{ccSpec} \title{Extract Colour Palette Specification} \usage{ ccSpec(x) } \arguments{ \item{x}{character string that specify a colour palette.} } \value{ a list with elements: palette, n and rev } \description{ Extract Colour Palette Specification } \keyword{internal} NMF/man/nsNMF-nmf.Rd0000644000176200001440000001062514333176413013504 0ustar liggesusers\name{nmf_update.ns} \alias{nmfAlgorithm.nsNMF} \alias{nmfAlgorithm.nsNMF_R} \alias{nmf_update.ns} \alias{nmf_update.ns_R} \alias{nsNMF_R-nmf} \title{NMF Multiplicative Update for Nonsmooth Nonnegative Matrix Factorization (nsNMF).} \usage{ nmf_update.ns(i, v, x, copy = FALSE, ...) nmf_update.ns_R(i, v, x, ...) nmfAlgorithm.nsNMF_R(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, stopconv = 40, check.interval = 10) nmfAlgorithm.nsNMF(..., .stop = NULL, maxIter = nmf.getOption("maxIter") \%||\% 2000, copy = FALSE, stopconv = 40, check.interval = 10) } \arguments{ \item{i}{current iteration number.} \item{v}{target matrix.} \item{x}{current NMF model, as an \code{\linkS4class{NMF}} object.} \item{copy}{logical that indicates if the update should be made on the original matrix directly (\code{FALSE}) or on a copy (\code{TRUE} - default). With \code{copy=FALSE} the memory footprint is very small, and some speed-up may be achieved in the case of big matrices. However, greater care should be taken due the side effect. We recommend that only experienced users use \code{copy=TRUE}.} \item{...}{extra arguments. These are generally not used and present only to allow other arguments from the main call to be passed to the initialisation and stopping criterion functions (slots \code{onInit} and \code{Stop} respectively).} \item{.stop}{specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as: \itemize{ \item the access key of a registered stopping criterion; \item a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument \code{maxIter}. \item a single numeric value that specifies the stationnarity threshold for the objective function, used in with \code{\link{nmf.stop.stationary}}; \item a function with signature \code{(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...)}, where \code{object} is the \code{NMFStrategy} object that describes the algorithm being run, \code{i} is the current iteration, \code{y} is the target matrix and \code{x} is the current value of the NMF model. }} \item{maxIter}{maximum number of iterations to perform.} \item{stopconv}{number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.} \item{check.interval}{interval (in number of iterations) on which the stopping criterion is computed.} } \value{ an \code{\linkS4class{NMFns}} model object. } \description{ These update rules, defined for the \code{\linkS4class{NMFns}} model \eqn{V \approx W S H} from \cite{Pascual-Montano et al. (2006)}, that introduces an intermediate smoothing matrix to enhance sparsity of the factors. \code{nmf_update.ns} computes the updated nsNMF model. It uses the optimized \emph{C++} implementations \code{\link{nmf_update.KL.w}} and \code{\link{nmf_update.KL.h}} to update \eqn{W} and \eqn{H} respectively. \code{nmf_update.ns_R} implements the same updates in \emph{plain R}. Algorithms \sQuote{nsNMF} and \sQuote{.R#nsNMF} provide the complete NMF algorithm from \cite{Pascual-Montano et al. (2006)}, using the C++-optimised and plain R updates \code{\link{nmf_update.brunet}} and \code{\link{nmf_update.brunet_R}} respectively. The stopping criterion is based on the stationarity of the connectivity matrix. } \details{ The multiplicative updates are based on the updates proposed by \cite{Brunet et al. (2004)}, except that the NMF estimate \eqn{W H} is replaced by \eqn{W S H} and \eqn{W} (resp. \eqn{H}) is replaced by \eqn{W S} (resp. \eqn{S H}) in the update of \eqn{H} (resp. \eqn{W}). See \code{\link{nmf_update.KL}} for more details on the update formula. } \references{ Pascual-Montano A, Carazo JM, Kochi K, Lehmann D and Pascual-marqui RD (2006). "Nonsmooth nonnegative matrix factorization (nsNMF)." _IEEE Trans. Pattern Anal. Mach. Intell_, *28*, pp. 403-415. Brunet J, Tamayo P, Golub TR and Mesirov JP (2004). "Metagenes and molecular pattern discovery using matrix factorization." _Proceedings of the National Academy of Sciences of the United States of America_, *101*(12), pp. 4164-9. ISSN 0027-8424, , . } NMF/man/rss.Rd0000644000176200001440000001015114333176413012546 0ustar liggesusers\docType{methods} \name{rss} \alias{evar} \alias{evar,ANY-method} \alias{evar-methods} \alias{rss} \alias{rss,ANY-method} \alias{rss,matrix-method} \alias{rss-methods} \title{Residual Sum of Squares and Explained Variance} \usage{ rss(object, ...) \S4method{rss}{matrix}(object, target) evar(object, ...) \S4method{evar}{ANY}(object, target, ...) } \arguments{ \item{object}{an R object with a suitable \code{\link{fitted}}, \code{rss} or \code{evar} method.} \item{...}{extra arguments to allow extension, e.g. passed to \code{rss} in \code{evar} calls.} \item{target}{target matrix} } \value{ a single numeric value } \description{ \code{rss} and \code{evar} are S4 generic functions that respectively computes the Residual Sum of Squares (RSS) and explained variance achieved by a model. The explained variance for a target \eqn{V} is computed as: \deqn{evar = 1 - \frac{RSS}{\sum_{i,j} v_{ij}^2} }{evar = 1 - RSS/sum v_{ij}^2}, } \details{ where RSS is the residual sum of squares. The explained variance is usefull to compare the performance of different models and their ability to accurately reproduce the original target matrix. Note, however, that a possible caveat is that some models explicitly aim at minimizing the RSS (i.e. maximizing the explained variance), while others do not. } \section{Methods}{ \describe{ \item{evar}{\code{signature(object = "ANY")}: Default method for \code{evar}. It requires a suitable \code{rss} method to be defined for \code{object}, as it internally calls \code{rss(object, target, ...)}. } \item{rss}{\code{signature(object = "matrix")}: Computes the RSS between a target matrix and its estimate \code{object}, which must be a matrix of the same dimensions as \code{target}. The RSS between a target matrix \eqn{V} and its estimate \eqn{v} is computed as: \deqn{RSS = \sum_{i,j} (v_{ij} - V_{ij})^2} Internally, the computation is performed using an optimised C++ implementation, that is light in memory usage. } \item{rss}{\code{signature(object = "ANY")}: Residual sum of square between a given target matrix and a model that has a suitable \code{\link{fitted}} method. It is equivalent to \code{rss(fitted(object), ...)} In the context of NMF, \cite{Hutchins et al. (2008)} used the variation of the RSS in combination with the algorithm from \cite{Lee et al. (1999)} to estimate the correct number of basis vectors. The optimal rank is chosen where the graph of the RSS first shows an inflexion point, i.e. using a screeplot-type criterium. See section \emph{Rank estimation} in \code{\link{nmf}}. Note that this way of estimation may not be suitable for all models. Indeed, if the NMF optimisation problem is not based on the Frobenius norm, the RSS is not directly linked to the quality of approximation of the NMF model. However, it is often the case that it still decreases with the rank. } } } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } #---------- # rss,matrix-method #---------- # RSS bewteeen random matrices x <- rmatrix(20,10, max=50) y <- rmatrix(20,10, max=50) rss(x, y) rss(x, x + rmatrix(x, max=0.1)) #---------- # rss,ANY-method #---------- # RSS between an NMF model and a target matrix x <- rmatrix(20, 10) y <- rnmf(3, x) # random compatible model rss(y, x) # fit a model with nmf(): one should do better y2 <- nmf(x, 3) # default minimizes the KL-divergence rss(y2, x) y2 <- nmf(x, 3, 'lee') # 'lee' minimizes the RSS rss(y2, x) } \references{ Hutchins LN, Murphy SM, Singh P and Graber JH (2008). "Position-dependent motif characterization using non-negative matrix factorization." _Bioinformatics (Oxford, England)_, *24*(23), pp. 2684-90. ISSN 1367-4811, , . Lee DD and Seung HS (1999). "Learning the parts of objects by non-negative matrix factorization." _Nature_, *401*(6755), pp. 788-91. ISSN 0028-0836, , . } \keyword{methods} NMF/man/randomize.Rd0000644000176200001440000000153314333176413013733 0ustar liggesusers\name{randomize} \alias{randomize} \title{Randomizing Data} \usage{ randomize(x, ...) } \arguments{ \item{x}{data to be permutated. It must be an object suitable to be passed to the function \code{\link{apply}}.} \item{...}{extra arguments passed to the function \code{\link{sample}}.} } \value{ a matrix } \description{ \code{randomize} permutates independently the entries in each column of a matrix-like object, to produce random data that can be used in permutation tests or bootstrap analysis. } \details{ In the context of NMF, it may be used to generate random data, whose factorization serves as a reference for selecting a factorization rank, that does not overfit the data. } \examples{ \dontshow{# roxygen generated flag options(R_CHECK_RUNNING_EXAMPLES_=TRUE) } x <- matrix(1:32, 4, 8) randomize(x) randomize(x) } NMF/man/show-commaNMFOffset-method.Rd0000644000176200001440000000047114333176413017003 0ustar liggesusers\docType{methods} \name{show,NMFOffset-method} \alias{show,NMFOffset-method} \title{Show method for objects of class \code{NMFOffset}} \usage{ \S4method{show}{NMFOffset}(object) } \arguments{ \item{object}{Any R object} } \description{ Show method for objects of class \code{NMFOffset} } \keyword{methods} NMF/DESCRIPTION0000644000176200001440000000462414661662461012422 0ustar liggesusersPackage: NMF Type: Package Title: Algorithms and Framework for Nonnegative Matrix Factorization (NMF) Version: 0.28 Date: 2024-08-19 Authors@R: c( person("Renaud", "Gaujoux", role = c("aut")), person("Cathal", "Seoighe", role = c("aut")), person("Nicolas", "Sauwen", role = c("cre"), email = "nicolas.sauwen@openanalytics.eu") ) Maintainer: Nicolas Sauwen Description: Provides a framework to perform Non-negative Matrix Factorization (NMF). The package implements a set of already published algorithms and seeding methods, and provides a framework to test, develop and plug new/custom algorithms. Most of the built-in algorithms have been optimized in C++, and the main interface function provides an easy way of performing parallel computations on multicore machines. License: GPL (>= 2) URL: http://renozao.github.io/NMF/ LazyLoad: yes VignetteBuilder: knitr Depends: R (>= 3.0.0), methods, utils, registry, rngtools (>= 1.2.3), cluster Imports: graphics, stats, stringr (>= 1.0.0), digest, grid, grDevices, gridBase, colorspace, RColorBrewer, foreach, doParallel, ggplot2, reshape2, Biobase, codetools, BiocManager Suggests: fastICA, doMPI, bigmemory (>= 4.2), synchronicity(>= 1.3.2), corpcor, xtable, devtools, knitr, RUnit Collate: 'colorcode.R' 'options.R' 'grid.R' 'atracks.R' 'aheatmap.R' 'algorithmic.R' 'nmf-package.R' 'rmatrix.R' 'utils.R' 'versions.R' 'NMF-class.R' 'transforms.R' 'Bioc-layer.R' 'NMFstd-class.R' 'NMFOffset-class.R' 'heatmaps.R' 'NMFns-class.R' 'nmfModel.R' 'fixed-terms.R' 'NMFfit-class.R' 'NMFSet-class.R' 'NMFStrategy-class.R' 'registry.R' 'NMFSeed-class.R' 'NMFStrategyFunction-class.R' 'NMFStrategyIterative-class.R' 'NMFplots.R' 'registry-algorithms.R' 'algorithms-base.R' 'algorithms-lnmf.R' 'algorithms-lsnmf.R' 'algorithms-pe-nmf.R' 'algorithms-siNMF.R' 'algorithms-snmf.R' 'data.R' 'extractFeatures.R' 'parallel.R' 'registry-seed.R' 'nmf.R' 'rnmf.R' 'run.R' 'seed-base.R' 'seed-ica.R' 'seed-nndsvd.R' 'setNMFClass.R' 'simulation.R' 'tests.R' 'vignetteFunctions.R' Packaged: 2024-08-22 07:48:23 UTC; nsauwen NeedsCompilation: yes Repository: CRAN Date/Publication: 2024-08-22 16:20:01 UTC RoxygenNote: 7.3.1 Author: Renaud Gaujoux [aut], Cathal Seoighe [aut], Nicolas Sauwen [cre]