MALDIquant/0000755000175000017500000000000012265255412013465 5ustar sebastiansebastianMALDIquant/MD50000644000175000017500000002523712265255412014006 0ustar sebastiansebastian3c1f1b5b04494589b1cea580ed310a6e *DESCRIPTION 082a5514e4b48a717933d8451af31975 *NAMESPACE a913a3d824e70c3ce10193bc3e0ced9a *NEWS af35d49161d4c3ede189d11bb52ceaa7 *R/AllClasses.R 8a5171f1b5e4d402b7c31e72c98520e8 *R/AllGenerics.R 2d882b0b6f2461ce7c5a5a0977366857 *R/Deprecated.R b873a74569968e09ef69ea7b1c33e639 *R/alignSpectra-functions.R 9d593c0b243fa8f5dbf4e79085c8683f *R/approxfun-methods.R 6bb19116660388bdade12b274bdc3648 *R/as.matrix-functions.R 4d3be472437f0cc9607b100b213e534e *R/as.matrix-methods.R b448406346f9406113b791665323624d *R/averageMassSpectra-functions.R 1a77e4fcefb233f9b271bf41db619fa2 *R/binPeaks-functions.R 4fd548b6a80994826d588c94f6f15255 *R/calculateLabelPositions-methods.R a818d929e95042af6d2371225c85febe *R/calibrateIntensity-functions.R 814c016cad379a43b12b1d2e2b63169d *R/calibrateIntensity-methods.R 2ae28c142a361a49a5a8537a20aefbb4 *R/colMedians-functions.R c43206c144c0be9440845eb8f4fb5bd4 *R/constructor-functions.R c4a18d7bdb1abe861f826ae14b3273f5 *R/deprecated-functions.R 191d2c6d7cffaa513c09d979fb302817 *R/detectPeaks-methods.R cd9c049c1bf4453fb5a453386669e10f *R/determineWarpingFunctions-functions.R b948d3182c93ec9b740f6a6da0942a78 *R/doByLabels-functions.R 643f2e8fc2cf44baef6fb9bb85f19b5e *R/estimateBaseline-functions.R c1c9ab6bbb61a50127da142b705a2fce *R/estimateBaseline-methods.R 5d383a16e116c66418039eb307219b07 *R/estimateNoise-functions.R dd728426cbd902a37ff5fd61f5924a76 *R/estimateNoise-methods.R 4aec612829572dc1f89efb45c6344e90 *R/filterPeaks-functions.R 2c86eb3543af7d71262ddca2244a3a6f *R/findEmptyMassObjects-functions.R 47976c467937248521dead20bf3ead59 *R/findLocalMaxima-methods.R 73b4a3abb7274e6a61ea9f3d05e10576 *R/grouper-functions.R c5aab7df34bfb9dfaa2eddf8d01d1fa4 *R/intensity-methods.R c5a4dce5aba026c4bfa6ec6287299128 *R/intensityMatrix-functions.R d4f8d194b910778d2089a50d6afb7807 *R/irregular-functions.R 742533f28abb0b0d545024c6d0ccf447 *R/isEmpty-methods.R ecc4accf68876e94b031734e47bf88c4 *R/isFunctionList-functions.R 0e9bb031d1d928a0803ecba6ad903314 *R/isMassObject-functions.R 59dc12204f8b94298db2e3d593918bb2 *R/isMassObjectList-functions.R 567d03d3d65aef2ffc8a1f15a05c3204 *R/isRegular-methods.R 95efbec8a53a6e08950ddce69c2808de *R/isValidHalfWindowSize-functions.R d6987dc0cceb070bd22953a46ba97233 *R/labelPeaks-methods.R 3cd0653b5e0799489623f97da9e313ee *R/length-methods.R b262f628156dec1d1fb54afebd6cfb6c *R/lines-methods.R 5164d847da62b1ce5a99014790514fc5 *R/localMaxima-functions.R fa7cd41a0de21aa57648a28df1d7daa8 *R/mapply-functions.R bb19c9c548e9b9572153e1ebbf134594 *R/mass-methods.R 88376299712dd24f6d308b1e3c7b1c86 *R/memoryUsage-functions.R b0781f3d04238a0118c4491e18ad3c18 *R/merge-functions.R c13f621346282d5e5e89a3bd479d7b2f *R/metaData-methods.R 989a68ca184ab75f35984bfd08e01d98 *R/morphologicalFilter-functions.R fa547213b2834923c27940ef9a72259d *R/onAttach.R a2adfd93615e2f8a6561f3fa702dcbc1 *R/plot-methods.R 7728dd2db0e907263e2b8175835e1548 *R/points-methods.R 5f8fd6ab4cb5e682e13fc3047b46d7df *R/range-functions.R 573b7d3a611c585f7ebddeec5bd8f9e5 *R/referencePeaks-functions.R f34948ad2ea6bd5e775b77fdd4c007cc *R/removeBaseline-methods.R 30c684b3c6d6f3e02016dff7281d5663 *R/removeEmptyMassObjects-functions.R 722bd6c3c1c95a1cf74a88e57a23ac5b *R/show-functions.R 2f6c3bf983a071c2de154caa74cf4a0b *R/show-methods.R 37eedd1fc72e28b324a50db663589a87 *R/smoothIntensity-methods.R 9e1fb858c1c6392bc0be9b0ade55ae05 *R/smoothingFilters-functions.R 27325b6557a06c3ed150139b36410b2f *R/snr-methods.R fbf45f4951c0f412157a3d765fc0f312 *R/subset-methods.R 99aaf523caa5cd3e75ab8f538c03dad9 *R/textLabelRects-functions.R 5c914fbd3a2dfe840acdf58341b9f171 *R/totalIonCurrent-methods.R cd57e582b69bd0480f8be7a840296827 *R/transformIntensity-methods.R 30eba7f52fe024e9d182a60f47f99b35 *R/trim-methods.R 61879b605350c6033da9b848478686c0 *R/unlist-functions.R 34041bc768c9d6a85fb39df78be63dce *R/valid-methods.R d23b986e1b0c090e1986f124f3302d14 *R/warp-functions.R ce4cbe14f1870a32bbbbfcaa391cf765 *R/warpingFunction-functions.R fc9cd3fcbf7f5b5517fa60874e2736aa *R/which.closest-functions.R 325598b0f8bcbe241bf33882d83b6f85 *data/fiedler2009subset.RData b1d4b3db5f8a9d68fc4692e30026986e *demo/00Index cd6a6ad12205a639b80a67a1a5080723 *demo/MALDIquant.R f533738c9766f5e5c19c9189adabfea0 *demo/baseline.R 76e17885df9f6d9e5d7b9f030d3d5ab3 *demo/peaks.R ddac40e52e963ddd0c38b403cc6c6d84 *demo/warping.R 9751d763cb4d6056e94392e33ed7028d *demo/workflow.R 4fc8ff762d2ce91d02ed5636f596d79c *inst/CITATION 932fef0296403876c254af44d1111c54 *inst/tests/test_approxfun-methods.R 16a99e421049f72f5f55027f63eea2c4 *inst/tests/test_as.matrix-functions.R 6190f4bc3eba28a0bc2a1deef66ad37f *inst/tests/test_as.matrix-methods.R d320c9127a2f11b8d04d4cc9283c1bb5 *inst/tests/test_averageMassSpectra-functions.R d513f8c0a0167cf60386efcafd6138e1 *inst/tests/test_binPeaks-functions.R 7f59bd9a93b716d2f70b41fa8cd670d0 *inst/tests/test_calibrateIntensity-methods.R 6ab3507a99d7bdc1f8dde8b85ca42857 *inst/tests/test_colMedians-functions.R 984c5e8af50ca58916eeee0d816326d6 *inst/tests/test_constructor-functions.R 7cd10c04b2aaa60229562441172e8c09 *inst/tests/test_deprecated-functons.R b94b7d40be1a2c85171fa5b73447d73f *inst/tests/test_detectPeaks-methods.R c97b29a2f7e5a426143b83b175aa802e *inst/tests/test_determineWarpingFunctions-functions.R 34a9dae5130a2fd94ddbd5b436559d65 *inst/tests/test_doByLabel-functions.R 3ac11f36f6ce4c70bdb4676ddd623865 *inst/tests/test_estimateBaseline-methods.R e310a5998e9e3706a82348ac9e4d1841 *inst/tests/test_estimateNoise-methods.R 01f20533d0cf0f2df4d95acf46d57be4 *inst/tests/test_filterPeaks-functions.R 37ce987d248c073119231c0d94098112 *inst/tests/test_findEmptyMassObjects-functions.R f6ab8ca435902df81a693a91a1787173 *inst/tests/test_findLocalMaximaLogical-methods.R 54edc8be527b360fe1f0bdc839666f52 *inst/tests/test_grouper-functions.R 4249736cf2705a5d7262520fcce5fd0f *inst/tests/test_intensity-methods.R 2aa015214ef211ea444d7556009e270b *inst/tests/test_intensityMatrix-functions.R 4280b30f805619983542ef41fe0ddaf4 *inst/tests/test_irregular-functions.R aa13cd831e9082ec01d0fa6669112a8f *inst/tests/test_isEmpty-methods.R 039cbd41e8a2db1ab24ffa2041fc80cf *inst/tests/test_isMassObject-functions.R 9edba7830c5c0804514173de766e0278 *inst/tests/test_isMassObjectList-functions.R 1463d5d936a582a0e41298237df175df *inst/tests/test_isRegular-methods.R b7b96289ddcac4ebdd7b0d9031c80516 *inst/tests/test_length-methods.R dba0f6cc7a4a19bf379cc41f14ed8946 *inst/tests/test_localMaxima-functions.R 3e700401011b7fa7d84d83d551fa67d5 *inst/tests/test_mapply-functions.R 253f03d93fd5144e4f187c1aef111adb *inst/tests/test_mass-methods.R 9a42fa3bdd4ed63c9ea5567d98944ff3 *inst/tests/test_merge-functions.R 49b8024fbe1066b5c68c2d079f5aba87 *inst/tests/test_metaData-methods.R daf9c7d9f789cc928d0992769f6cefde *inst/tests/test_morphologicalFilter-functions.R f3fe9d288ee8367c256c90525abf3715 *inst/tests/test_range-functions.R 0af5408a284ab5a166f06973f1996b05 *inst/tests/test_referencePeaks-functions.R 689a72a9a7ab394f532d22f14010c291 *inst/tests/test_removeBaseline-methods.R 813815527b6e591b215e065e7422dad0 *inst/tests/test_removeEmptyMassObjects-functions.R 438abeff349258bef816b030b88c3973 *inst/tests/test_show-methods.R 18638ca5fa1de8193606c2ba8bbdc26a *inst/tests/test_smoothIntensity-methods.R 69ea5740165c32cc7cf9234bd9281f5d *inst/tests/test_smoothingFilters-functions.R 52e2e182222dc5453228cee39eeaa080 *inst/tests/test_snr-methods.R 2c71f06b573ac902c3116f1525a152d2 *inst/tests/test_subset-methods.R f4165a0b842c0d27088905a2112936fe *inst/tests/test_totalIonCurrent-methods.R dd9456f7191165450186092b3d697601 *inst/tests/test_transformIntensity-methods.R 23ab4771e796d74c0849ab0602645d3e *inst/tests/test_trim-methods.R 189b492b9effdf126522989fbc96f885 *inst/tests/test_unlist-functions.R ae8363f7a15c7b4a1c4eaa7fd3faf3b7 *inst/tests/test_warp-functions.R b9b096e283b034935a4592a2e8ca31eb *inst/tests/test_warpingFunctions-functions.R 628aab1ffb1146aec4c2ef89812e9174 *inst/tests/test_which.closest-functions.R 5ece00b595c3669904f9f5a6ae21bedf *man/AbstractMassObject-class.Rd 922f4154c7bb75e18183dce6d6aa5355 *man/MALDIquant-deprecated.Rd 62f5d9a18c2a69e732d083c9ff7aad61 *man/MALDIquant-package.Rd bc3a691fc9e8a1f74b9fa46bbb2964a8 *man/MassPeaks-class.Rd 19ddf15c5cf41616e11d14c03d5c0e95 *man/MassSpectrum-class.Rd 1fa86de2543e4fc8e44b2a4d758dee39 *man/alignSpectra-functions.Rd 67a49749218344a5be39828f0ac6ab8b *man/averageMassSpectra-functions.Rd 56e7a500c415c16a4a2e4bd89f900f58 *man/binPeaks-functions.Rd 4d74031c209b539f38018fbf83af90ba *man/calibrateIntensity-methods.Rd 1a79411d84e2e9c35707ee8680e9e26f *man/createMassPeaks-functions.Rd 41183403eeb9bc97f5de2f66a9263826 *man/createMassSpectrum-functions.Rd 27b3fa0376af2f2548759e0693b090f7 *man/detectPeaks-methods.Rd dca09fd7a3e92d63c9bd75b95a080360 *man/determineWarpingFunctions-functions.Rd a4498c37355c279c3b8cc05bbad44804 *man/estimateBaseline-methods.Rd 315145ed28b3318420273baee81e8874 *man/estimateBaselineConvexHull-functions.Rd c49e52ad4762240c28af44ca0db0dffb *man/estimateBaselineMedian-functions.Rd a1134a1522db5c1caf44956a1407681a *man/estimateBaselineSnip-functions.Rd 32b0f4c89ec8a21afd956935071b330b *man/estimateBaselineTopHat-functions.Rd d59289a8cdbe5dfd348b173896578cd5 *man/estimateNoise-methods.Rd 86660fae377672e255d20f2f99fa5e87 *man/estimateNoiseMad-functions.Rd c5037fc8d28d20e2c24a1e5cd4896ab7 *man/estimateNoiseSuperSmoother-functions.Rd c87adadaf595b0aaf0157399b1d15ac7 *man/fiedler2009subset.Rd 766b5279bbce9bec9208459ec37cec88 *man/filterPeaks-functions.Rd 75fdaa1380e09a233764739574cac5b6 *man/findEmptyMassObjects-functions.Rd a7dcc9b53c98dbdeb2e20c79b03fea49 *man/intensityMatrix-functions.Rd 52135670a55c3c7069487e0ffb24af0e *man/isMassObject-functions.Rd 9c7e0e625d503dacba01a892591df19d *man/isMassObjectList-functions.Rd 8c37643a5319672b684d3585af2b49c4 *man/labelPeaks-methods.Rd cff3ea17456bcfa8bb153ee0e7881907 *man/mergeMassPeaks-functions.Rd fb017162f41be558869a41978d300262 *man/movingAverage-functions.Rd 0ee913d9a54a92565ade344b24475d57 *man/plot-methods.Rd f93f7f45eafef9291839f41f254e1715 *man/referencePeaks-functions.Rd d337bf73a87faf45758997eeeefffa84 *man/removeBaseline-methods.Rd 7abf120552084d6aac5228aafe2488c8 *man/savitzkyGolay-functions.Rd 82520d58236e03b74157373d18b456be *man/smoothIntensity-methods.Rd ade2bb00627ea3112ddf263b17961e70 *man/transformIntensity-methods.Rd b11d0c1c25e213f41f744fb185add040 *man/trim-methods.Rd 4507f96a48b8f94779c8c36ae2aa1034 *man/warp-functions.Rd 38415d834917f303276bbfc4ae7af2c6 *src/MALDIquant.h 60981e9053676a37966435e95997ab2b *src/colMedians.c 9d8576241a46e84acc556ccc59312276 *src/init.c cba6341e3fdbd1473fe19a992bff7b83 *src/localMaxima.c 799aabe8a7dc75123a0e9e958812c93b *src/lowerConvexHull.c 4f18e4c44f85c307d03c64d2dbdd1b98 *src/morphologicalFilters.c d584865ba73e0280e156279f76a77d25 *src/snip.c 8055448b4cdc287237753095a8865fc2 *tests/test_all.R MALDIquant/NAMESPACE0000644000175000017500000000350112237162331014677 0ustar sebastiansebastianimport("methods") importFrom("grDevices", "getGraphicsEvent", "setGraphicsEventHandlers") importFrom("graphics", "lines", "plot", "points") importFrom("stats", "filter", "mad", "supsmu") importFrom("utils", "packageVersion") exportClasses("MassPeaks", "MassSpectrum") export("alignSpectra", "averageMassSpectra", "binPeaks", "createMassPeaks", "createMassSpectrum", "determineWarpingFunctions", "filterPeaks", "findEmptyMassObjects", "intensityMatrix", "isMassObject", "isMassObjectList", "isMassPeaks", "isMassPeaksList", "isMassSpectrum", "isMassSpectrumList", "mergeMassPeaks", "mergeMassSpectra", "movingAverage", "referencePeaks", "removeEmptyMassObjects", "savitzkyGolay", "warpMassPeaks", "warpMassSpectra") exportMethods("as.matrix", "calibrate", "calibrateIntensity", "detectPeaks", "estimateBaseline", "estimateNoise", "intensity", "intensity<-", "isEmpty", "isRegular", "labelPeaks", "length", "lines", "ltrim", "mass", "mass<-", "metaData", "metaData<-", "plot", "points", "removeBaseline", "rtrim", "smoothIntensity", "snr", "standardizeTotalIonCurrent", "totalIonCurrent", "totalIonCurrent<-", "transformIntensity", "trim") useDynLib("MALDIquant") MALDIquant/NEWS0000644000175000017500000004006712265250703014171 0ustar sebastiansebastianRELEASE HISTORY OF THE "MALDIquant" PACKAGE =========================================== CHANGES IN MALDIquant VERSION 1.9 [2014-01-14]: ----------------------------------------------- NEW FEATURES * Add `alignSpectra`: a wrapper around `detectPeaks`, `determineWarpingFunctions` and `warpMassSpectra` to provide an easier workflow. IMPROVEMENTS * `filterPeaks`: introduce "mergeWhitelists" argument to additionally keep peaks that occur at least in one group. The default behaviour does not changed. Please see the man page of `filterPeaks` for details. * `intensityMatrix`: add "spectra" argument to allow interpolation of missing peaks if corresponding spectra is given. * Replace some `lapply` calls by `mapply` to allow different "halfWindowSize" arguments etc.; affected methods: `smoothIntensity`, `removeBaseline`, `detectPeaks`. MODIFICATIONS * `filterPeaks`: "minFrequency" > 1 and "minNumber" > n is not set to 1 or n anymore; only a warning about "empty peak whitelists" is given; see also issue #26. * `filterPeaks`: replace warning about too large "minFrequency" or "minNumber" by a warning about "empty peak whitelists". * `intensityMatrix`: rename first argument to "peaks" * demo/workflow.R: introduce `alignSpectra`. * demo/warping.R: adapt to current preferred workflow. * demo/peaks.R: add smoothing and a few new plots. DEPRECATED ARGUMENTS/FUNCTIONS - `intensityMatrix` for MassSpectrum objects. DEFUNCT ARGUMENTS/FUNCTIONS * `isMassObject`/`isMassObjectList`: use `isMassSpectrum`, `isMassPeaks`, `isMassSpectrumList` or `isMassPeaksList` instead. * `totalIonCurrent,MassPeaks-method`: TIC of peaks is meaningless. * `totalIonCurrent<-,MassSpectrum-method`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `standardizeTotalIonCurrent`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `calibrate`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `ltrim`/`rtrim`: use `trim(..., range=c(min, max))` instead. * `determineWarpingFunctions`, argument "warpingFunction": use "method" argument instead. * `mergeMassPeaks`, argument "fun": use "method" argument instead. * `mergeMassSpectra`: use `averageMassSpectra`. * `savitzkyGolay`: use `smoothIntensity(..., method="SavitzkyGolay")` instead. * `movingAverage`: use `smoothIntensity(..., method="MovingAverage")` instead. * `transformIntensity`, argument "fun": use "method" argument instead. * `removeBaseline`, argument "fun": use "method" argument instead. * `detectPeaks`, argument "fun": use "method" argument instead. BUGFIXES * `plot`: fix subtitle for averaged spectra. INTERNAL CHANGES * Add `.as.matrix.MassObjectList` to avoid internal dependencies on `intensityMatrix`; affected functions: `filterPeaks`, `referencePeaks`. * Add `.as.binary.matrix`. * Remove man/MALDIquant-internal.Rd. * Argument "representation" of `setClass` is deprecated since R 3.0.0; use "slots" instead. affected classes: AbstractMassObject, MassPeaks, MassSpectrum. CHANGES IN MALDIquant VERSION 1.8 [2013-09-08]: ----------------------------------------------- NEW FEATURES * Add `smoothIntensity`: to apply smoothing filters. Supports "SavitzkyGolay" and "MovingAverage". `savitzkyGolay` and `movingAverage` are now marked as deprecated. * Add `calibrateIntensity`: to calibrate/normalize intensity values. Supports "TIC", "median" and "PQN" calibration/normalization. It replaces three similar functions with different names: `totalIonCurrent<-`, `standardizeTotalIonCurrent`, `calibrate` (these three are marked as deprecated and will be removed in future releases). * Add `averageMassSpectra`: supports "mean", "median" and "sum" aggregation of spectra. It replaces `mergeMassSpectra`. * Add C implementation of colMedians for faster averaging/merging of MassSpectrum/MassPeaks objects. * Add LongVector support; now MALDIquant depends on R >= 3.0.0. MODIFICATIONS * MassSpectrum/MassPeaks class: change representation of slots mass, intensity, snr to "numeric" (was "vector" before). Should not affect anything. Maybe you have to reimport raw data and resave RData files. * `trim`: replace "minMass" and "maxMass" arguments by new "range" argument. * `transformIntensity`: add "method" argument (supports "sqrt", "log", "log2", "log10"). "fun" argument is deprecated. * `estimateBaseline`/`removeBaseline`: rename argument method="Median" to method="median". * `determineWarpingFunctions`: add "method" argument (supports "lowess", "linear", "quadratic", "cubic"); "warpingFunctions" argument is deprecated. * `mergeMassPeaks`: add "method" (supports "mean", "median", "sum") argument; "fun" argument is deprecated. DEPRECATED ARGUMENTS/FUNCTIONS * `isMassObject`/`isMassObjectList`: use `isMassSpectrum`, `isMassPeaks`, `isMassSpectrumList` or `isMassPeaksList` instead. * `totalIonCurrent,MassPeaks-method`: TIC of peaks is meaningless. * `totalIonCurrent<-,MassSpectrum-method`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `standardizeTotalIonCurrent`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `calibrate`: use `calibrateIntensity(..., method="TIC")` instead to calibrate/normalize MassSpectrum objects. * `ltrim`/`rtrim`: use `trim(..., range=c(min, max))` instead. * `determineWarpingFunctions`, argument "warpingFunction": use "method" argument instead. * `mergeMassPeaks`, argument "fun": use "method" argument instead. * `mergeMassSpectra`: use `averageMassSpectra`. * `savitzkyGolay`: use `smoothIntensity(..., method="SavitzkyGolay")` instead. * `movingAverage`: use `smoothIntensity(..., method="MovingAverage")` instead. * `transformIntensity`, argument "fun": use "method" argument instead. * `removeBaseline`, argument "fun": use "method" argument instead. * `detectPeaks`, argument "fun": use "method" argument instead. REMOVED FUNCTIONS * `iplot`: because it throws NOTEs on CRAN's R CMD check and the most important function `grDevices::getGraphicEvents` behaves different on Unix/Windows platform (some keys don't working) and contains some nasty bugs, e.g.: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15208 Also the "zoom" R package provides similar functionality. BUG FIXES * `totalIonCurrent`: fix calculation by estimating the integral; fixes #29. affected functions: `totalIonCurrent`, `calibrateIntensity(..., method="TIC")`. * `filterPeaks`: reduce minNumber to length(l) to avoid complete removal of peaks; fixes #26. * src/snip.c: fix some segmention faults because of a missing PROTECT for "duplicate" call. affected functions: `estimateBasline/removeBaseline(..., method="SNIP")` - Add `import("methods")` to NAMESPACE (fixes #36). INTERNAL CHANGES * Remove internal `imputeMass`. * Remove internal `.replaceNonEmptyMassObjects`. * `approxfun`: returns NA for empty MassSpectrum objects. * `[` (subset method): little speed up by calling `which` to evaluate logical expressions only once. * Use integer values where possible. * Modify C written functions to support LongVectors; closes #13; now MALDIquant depends on R >= 3.0.0. CHANGES IN MALDIquant VERSION 1.7 [2013-05-23]: ----------------------------------------------- NEW FEATURES * Add `isRegular` method to test MassSpectrum objects for regular increasing mass values/intervals; closes #23. * Add `savitzkyGolay`, Savitzky-Golay Smoothing Filter. * Add memory usage to `show` output. * `iplot`: add horizontal distance measurement (using left mouse clicks). * `filterPeaks`: add "minNumber" argument to allow an absolute threshold for filtering; closes #21. * demo/workflow.R: add raw data check. IMPROVEMENTS * demo/workflow.R: replace moving average smoother by Savitzky-Golay-Filter. * `.estimateBaselineSnip`: support decreasing/increasing clipping window; controlled by new argument "decreasing"; use a decreasing window per default to get a smoother baseline; (use decreasing=FALSE to get the old behaviour). * `isEmpty`: treat spectra with only zeros as intensity values as empty ones. * `movingAverage`: left/right extrema now calculated for 0:windowSize and (n-windowSize+1):n (before they were set to NA). BUG FIXES * `filterPeaks`: doesn't round (floor) minFrequency argument anymore; led to unexpected results; fixes #22. * `mergeMassSpectra`: empty MassSpectrum objects are ignored now (but if all objects are empty `mergeMassSpectra` will return an empty MassSpectrum object, too); fixes #20. * `.mergeMetaData`: fix merging of lists with different lengths; fixes #17. affected functions: `mergeMassPeaks`, `mergeMassSpectra`. * `.doByLabels: preserve order of non-factor labels; fixes #19; affected functions: `filterPeaks`, `mergeMassPeaks`, `mergeMassSpectra`. * `totalIonCurrent`/`isEmpty`: fix integer overflow; fixes #25. * `totalIonCurrent<-`: fix handling of empty spectra; fixes #15. * Remove LICENSE file. INTERNAL CHANGES * Replace all `paste(..., sep="")` calls by `paste0`; now MALDIquant depends on R >= 2.15. * Replace all `.C` interfaces by `.Call`. CHANGES IN MALDIquant VERSION 1.6 [2013-03-01]: ----------------------------------------------- NEW FEATURES * Add interactive plot method: `iplot`. * Add TopHat baseline estimation: `estimateBaseline(..., method="TopHat")`/ `removeBaseline(..., method="TopHat")`. IMPROVEMENTS * Include tests in inst/tests. BUG FIXES * `.which.closest`: rounding .5 to the next highest integer (before: to the next lowest one); affected functions: `labelPeaks`. * `.doByLabels`: fix an error that occurred if all labels were unique (fixes #1); affected functions: `filterPeaks`, `mergeMassPeaks`, `mergeMassSpectra`. * `estimateBaseline(..., method="Median")`: do not allow a window size > n (fixes #4). CHANGES IN MALDIquant VERSION 1.5 [2012-12-06]: ----------------------------------------------- NEW FEATURES * Add `movingAverage`. * `labelPeaks`: add labels argument. IMPROVEMENTS * `detectPeaks`: only throw an error if windowSize > length (windowSize == length is no error anymore). * `.doByLabels`: drop unused levels of argument "labels"; affected functions: `filterPeaks`, `mergeMassPeaks`, `mergeMassSpectra`. * Rewrite `localMaxima` in C to reduce running time and memory consumption. CHANGES IN MALDIquant VERSION 1.4 [2012-10-30]: ----------------------------------------------- NEW FEATURES * Add slot "snr" to MassPeaks. * Add `.estimateNoiseMad` (same implementation as old `estimateNoise` method). * Add `.estimateNoiseSuperSmoother`. * `estimateNoise`: add method argument, change return value to two column matrix. * `binPeaks`/`referencePeaks`: add argument method=c("strict", "relaxed"); "relaxed" allows multiple peaks of the same spectrum in a bin. IMPROVEMENTS * `labelPeaks`: remove tolerance argument (now always select the closest one). * `mergeMassPeaks`/`mergeMassSpectra`: merge metaData, too. * `detectPeaks`: new example for a custom noise estimation function. * `calibrate`: add ... to generic definition of `calibrate`. * Change demo licences to public domain. INTERNAL CHANGES * `detectPeaks`: change internal snr handling. * `show`: rewrite (OO design). CHANGES IN MALDIquant VERSION 1.3 [2012-09-16]: ----------------------------------------------- NEW FEATURES * Add `trim` and `[` methods. * `labelPeaks`: add avoidOverlap argument to avoid overlapping of peak labels. IMPROVEMENTS * `detectPeaks`: add error message if windowSize >= length. * `determineWarpingFunctions`: add error message if it could not match any peak to reference peaks. MODIFICATIONS * `labelPeaks`: change default value for verticalOffset argument. * `labelPeaks`: remove family argument. BUG FIXES * Fix `isMassSpectrumList`. GENERAL * Update DESCRIPTION file to use Authors@R and depends on R>=2.14 now. * Add CITATION file. CHANGES IN MALDIquant VERSION 1.2 [2012-07-18]: ----------------------------------------------- BUG FIXES * `determineWarpingFunctions`: stop with an error if reference MassPeaks object is empty. * `.doByLabel`: preserve list order (affects `filterPeaks`). INTERNAL CHANGES * Replace some `sapply` calls by `lapply`. CHANGES IN MALDIquant VERSION 1.1 [2012-05-06]: ----------------------------------------------- NEW FEATURES * Add `totalIonCurrent` method (replacement for `calibrate` function on MassSpectrum objects). * Add methods accepting lists as arguments: `transformIntensity`, `removeBaseline`, `detectPeaks`. MODIFICATIONS * `detectPeaks`: remove localMaxima argument. * `detectPeaks`: replace noise argument by fun. * `removeBaseline`: replace baseline argument by fun. * `labelPeaks`: use par("usr") to calculate default verticalOffset. * `labelPeaks`: add absoluteVerticalPos argument. * `plot`: change "sub" for merged spectra/peaks. * `intensityMatrix`: remove argument replaceByNa. * `determineWarpingFunctions`, `warpMassSpectra`, `warpMassPeaks` now require lists as arguments and return a list. * `calibrate`: works only on matrices now. * Replace all `lapply` calls by new methods in demonstration scripts. * Allow only numeric values for `intensity<-` and `mass<-`. * Rename `findLocalMaxima` to `.findLocalMaxima` and hide by NAMESPACE. * Rename dataset spectra in fiedler2009subset. * Remove peaks dataset. CHANGES IN MALDIquant VERSION 1.0 [2012-03-28]: ----------------------------------------------- NEW FEATURES * Add demonstration scripts. * Add functions: `binPeaks`, `determineWarpingFunctions`, `filterPeaks`, `isMassObject`, `isMassPeaks`, `isMassSpectrum`, `mergeMassPeaks`, `mergeMassSpectra`, `referencePeaks`, `warpMassPeaks`, `warpMassSpectra`. MODIFICATIONS * Change NAMESPACE. * Hide `imputeMass` method because it fails on Bruker Daltonics' CompassXport 32bit output. * Add \keyword{internal} to estimateBasline*-functions.Rd. * `labelPeaks`: rename massTolerance argument to tolerance. * Replace dataset sA1/pA1 by spectra/peaks (containing 16 example spectra). CHANGES IN MALDIquant VERSION 0.5 [2012-01-18]: ----------------------------------------------- NEW FEATURES * Add `imputeMass` method. IMPROVEMENTS * Rewrite intensityMatrix function (little speed improvement). CHANGES IN MALDIquant VERSION 0.4 [2011-08-04]: ----------------------------------------------- NEW FEATURES * Add functions: `isMassObjectList`, `isMassPeaksList`, `isMassSpectrumList`, `findEmptyMassObjects`, `removeEmptyMassObjects`, `intensityMatrix` and `calibrate` (only TIC supported up to now). * Add mass and massTolerance argument to `labelPeaks`. IMPROVEMENTS * Change default value for verticalOffset argument in `labelPeaks`. * Add pA1 dataset. MODIFICATIONS * Rename AbstractMassSpectrumData to AbstractMassObject. CHANGES IN MALDIquant VERSION 0.3 [2011-05-28]: ----------------------------------------------- NEW FEATURES * Add `transformIntensity`, `estimateNoise`, `findLocalMaxima`, `detectPeaks` and `points` method. * Add `createMassPeaks` constructor. IMPROVEMENTS * Replace `.estimateBaselineMovingEstimator` by `.estimateBaselineMedian` (uses `runmed` instead of an own slow `movingEstimator` function). MODIFICATIONS * Rewrite `labelPeaks` (some arguments changed). * Rename SingleSpectrum class to MassSpectrum. * Rename SinglePeakList class to MassPeaks. * Remove fdrtool dependency and rewrite `.estimateBaselineConvexHull` in C. * Move importing functions to the following R-packages: readBrukerFlexData, readMzXmlData. BUG FIXES * change `.C(..., DUP=F)` to `.C(..., DUP=T)` in `.estimateBaselineSnip` to avoid changes of global variables. CHANGES IN MALDIquant VERSION 0.2 [2011-03-29]: ----------------------------------------------- * Add baseline correction algorithm SNIP (implemented in C) [default]. * Add MovingEstimator and ConvexHull baseline estimation algorithm. * Add `as.matrix`, `intensity`, `length`, `lines`, `mass` and `metaData` methods. * Add basic SinglePeakList class, adopt `plot` and `lines`, add `labelPeaks` (still useless). CHANGES IN MALDIquant VERSION 0.1 [2011-02-22]: ----------------------------------------------- * First public release. * Up to now only importing and plotting of a single mass spectrum are supported. MALDIquant/DESCRIPTION0000644000175000017500000000206712265255412015200 0ustar sebastiansebastianPackage: MALDIquant Version: 1.9 Date: 2014-01-14 Title: Quantitative Analysis of Mass Spectrometry Data Authors@R: c(person("Sebastian", "Gibb", role=c("aut", "cre"), email="mail@sebastiangibb.de"), person("Korbinian", "Strimmer", role="ths")) Depends: R (>= 3.0.0), methods Suggests: testthat Description: MALDIquant provides a complete analysis pipeline for MALDI-TOF and other mass spectrometry data. Distinctive features include baseline subtraction methods such as TopHat or SNIP, peak alignment using warping functions, handling of replicated measurements as well as allowing spectra with different resolutions. License: GPL (>= 3) URL: http://strimmerlab.org/software/maldiquant/ https://github.com/sgibb/MALDIquant/ BugReports: https://github.com/sgibb/MALDIquant/issues/ LazyLoad: yes Packaged: 2014-01-14 15:07:07 UTC; sebastian Author: Sebastian Gibb [aut, cre], Korbinian Strimmer [ths] Maintainer: Sebastian Gibb NeedsCompilation: yes Repository: CRAN Date/Publication: 2014-01-14 16:43:06 MALDIquant/data/0000755000175000017500000000000012220560343014367 5ustar sebastiansebastianMALDIquant/data/fiedler2009subset.RData0000644000175000017500000341334012104230456020467 0ustar sebastiansebastian7zXZi"6!XaP])TW"nRʟXdA"#&'ƮBggx!u<]9SY#>X;S)ވdxP&64T:py&ю {M.(,cfpmD^O&J+L:8fG|}- %tDzZHnD]eqY=h@|~4Se1@Q=vߒ!~=zт~Z'2Q|P@MK8$iyMOES $ȭ<:<1xZVU9ƤI+ ÷lojWrMٿE5^`BZ= os>#e(:r۵zr&j#FR(8,ڞz'43fpyStt4įW(bT\4k!AG;Q P Q]2q>AXfGrČ&V.]3MDTsioCo05N!ɢ ݕ 2]77vtk}1 v'Ͼ(Z*dȍô&xxNZ]TmP7s)O6L{K)9oL o2 F~a*ToẀl6~{[)T`x:C4?6- V8.bJ?\jCt2`htxBl<0и/Bbi{!Hӆԑ$mѷUZ4֎C\.+\vǮ _.RkZ,q/DTz{23[LJ|C 28Wj|ZjmE'=0e:6lD6{8U@4dkg~zfXm \z^v{XJ|h9^)sxtIi0|X?HZMVy#^„+-mFT5qz9m5 D\rOiqܝzߕڍ*}%"tN@>GYWѴ-R0v-"B.PrֲR]SZN&h3Zgi$}XQ5XKۑeؽ+EjxSR Aoy4jlI-RTMdn/|}%yL;3tʿn%A7i*d)3hz/YjMo|:Y)І5t0qFmfM3f&j+J̴kN7C$lF^tYSS16 s5Ґ;Ө{,WXu-?>[-8ĎwFR+6F^F>ZeёWY)RT\+K6vuȑN҉8-3-)Ka\M$xkwd.MxOD;f2ȁv%& :j'sS0TX½3ܞڷ{÷&0ѭp'9  5w3">9Tнa lɷrpt eϮ)* eXWO)$Jg^Vby u$N-$+55 5鬜aaN)I衶XE2ݖai,cacT6"k]yMXL+[ț " uqu5U`LID,?4!tItLif+ .̿]r)!A d)2sm:Z0mUZUyX4Ӕ# K#ЯT%FH[5C6'`P͘Qwxym͊_%Z_߳նz|*y^8\HfH%gܞ4</tBeFJx'Tkʕy2sͻtc{nCVuWtU ScuPvI(× Uqd52Q%za/(8ߴ*:C#!erFZ 2--kp*yF0kuRmB aW;WMϞ6#N90 LS!2ifUsn$NjmAic%R^[xOLs=O_Rז%x<"bfL~& @';,O[lt,:+`ENxI}&j¡hcfC0?84j?SB~i .P'!w>m0y厀\-"0Tw>İ Rk8UϝzϫP> /n-QĔ7ތ"P-| ץ4 31977TZ1uA7h'u&b6: \=.agzqG[f #%?zm:'\R[f!5P,%yQ<ԐO^XǠ{L1{yf\ .v?Pt-wG Q\ݜn $ EgWn{bH\E3Qd3o1(F~F^QTЍ H粓$||+aOJbp!-sa VMWJ5e[V3=&6}LF}^nd Y2Lw#Keҵ2|M:=1H!c>HK>,BS(cG,'Օ1wwrۙ srUk8*CxI& R9oaeR哤ULDh%i p;g IARy!f=9 ˷H;jRFNYɓ y-ь)jm^F2R/QvLO!3ͽ/$Ocq\C7]vǘoV.JS7xP֬Wf ,ڙ"3:uuW fc 7:\"u݃sqaH${D&~{]Ӕb4'_Ec Nٽ@Z+ɴ˽^/g䳡 F^8UMoJC^À AؚNpt3[|pǂz|H.#.QƳF _b9cg 6HM'KƮє tǃR|Nޝi{CŶq,ڄ!kC7=gu2jg8s(hۗRcF5f[ w̮%jN0Ŝџ}&^ 9Uȫ)f.˼L^6洝mOms!vS d?ۿE留Ÿ[GkrZhC&;YxbQxnH;(Бp`(;ݹxg8_3=ŧH [r <n]8 SH,S@+G)J}2 [jg㹥ߏŴy-(l !; F~ RMؤAk(O WfWvA΢򾨧{(v-'Աv|838ś%~ #ah 9@&*T2Gf! 7_!=QݻpYDH4f@J|yQ 6Ҿa0Q0FUC?wg*̯XMt +QBq\6O5Tt18D*R'{c[5`5e$~݈{\?}AA`y\uƉەcE*:ͻ_w{-/_AHc{]% E6>0eD1ʤw_γ9 f8CB>UP4kv{:A] N4fCE!v# W6pvA=G:;)+y闚3{ =Q Q{I(R#T5'o'ӹbM QC'])_JV< ˇPsrR|܆SgA25) D6%isČ%K[E!&l~[J  sKVBr0{MvYol"{S9af=ZC,ab?iKlinusۻ%n\ tIj'páѓ9WTs#9]nV.>5y5!,wZre]P xA¯;vU}k7t A-Df~_~sFyB#I7we=σP֡RZ.:R6Xq<,2):Yᙳ% qrR|@p쑮4b(A*EU`X _VUӁ~1/'˰}%wgY3 W>di0/}RA{.$Kqڽ)[ =rFdjJ>Hc#]+F ³D ##g:l&Q*ƥQ"{.Cy^R&7bx4:Ȍ5JM[q=οu$9 GܴIХ~0^>|s[^7" >V7]W4iFdJ@p.qL_y7p.W!7rEy\9sG[+^g8lEq6>|N#O>-fR(k.e)Fٰ|N1k6}?½Ʒ箤 .V`H̞{fi034pKNG;7eynz(ay+ci]{b5)?so:y2^ I4M=_fQH#I(6b𗗒%XE-.w!#<ź(Vo^V$Do"%>awڄbyx sSD- XB CG8hI|I$ 4\ :h`%ke,k:dF&V5\"cg%D=2}0 %a-[ؿ`snoL+U]~gH Gb?Ğl`eHXܡvF`Q$/kigPQ6mf[WhrB jG)sWHm% W CTo|3$Bppn&IGe{RV BIDyi4B_gHB,|fXfc8.Y˞iwLkm-O(vGŰڀp(<*K:3\|UL; Kv'ċt#l, $_x_?\!m!7>z9'~Fs, F 1Z]%a ׷zy5z/vT?6p8\+P8r' 9a3Ď1n6 )1[RhCC~3b4OK]&kNxiD[P&?lGB025׋JVJ(4:;8+Sz]3V|5E3&6y [kyl)t6o($Ro^aN)Cc]x˿Kʤ^"c+5 G^E~çd!H\P~ouIvFRbJ6ռp `<toCALH+7>8C[Lc1<*yb%S衵gca89cgZb+VF hnydb]9^aDs )9T>g 1 EOjG3*`G"dh]+`$/D`sJ\fQ[1 A.W%EN[:l'ar$Ql{TYT޲v'VYf2U!>oAH-rgޘDt>jj%Iaۍcv?3@p')x&>Xef]lk/`lRՇ> -|KL$71 ʸp:р:"a%c,nEx'TKL2@Q{b%cKb_"YD)!3"bo GI]lv}*7u@i.  6k0.柳Vī@FӛXXtq&FXT3jB&QFѷBgP;wqt.6)4Ɛi05U w8Ȋ\_3321MH9yD"WB&f&>zr+}]Qd }P}f]F6[Xߔtyz0 =)m̬8@O2y) Y %B]{ γ3_H5`Or;o$!}Cdֶ1R󱳯 N'{$ %,C{4:>Op:5w\&N;ՠ'oQؽ7.=2)ǵ W%ӛs?+u_q+~ 9_fa DW=GSG@gL!?aRKLtD.%i)ܮT{i lp`$&ht:_myxm(;jT$U_[ǡ?P>RE"UNQA(X7/jE~RirJ/_DTlv}8ۄ= H|]0}A \j !ˁ̪|A Q_4Jd!SL49>Wk&enx",ĻiO|LpTݨ̞y3p6LSj=>Hh{']Fz;YAŕDB(f]+ oPΏ?_ -NnלR~8A` vHt>KJ6/O0tG)I: T6K2k+j9Di[@LFH;i6i>c%l3 ^~F)oUX$~Cz=qhv2d!!uPMMi^Ȫ<ؒX*͍gM7_."O**{fwq4YՊw7ۑl>⊇H"8/an6)+ ̏Mk. KE@鼗uLbmOL5[CpoµXe2!vWӽ^ƠcF~,x|"gvfw=zS~2/@vJsӇ8A_ >KH=Q]TS_JGg0UM7Dq.->E-Cd~ j5 0i hsﲝ+֤ΪAeAM n[E\<|+'d U˟bDZq Yl@m/ pRP36w/t{c%+uYr;A5{h%Dt%:׽}ѲL܁0h^R5>?%$~ĸӄ|`y'TyuARJ'΅ kŕ-G02f. s%Kg}V.Wп9R G+.14,D2ؖϫ꧞M:+r?7_; XIP_H퇘n@0뮝(l=9d7{SE23;;D XKf[l!&.0XXf, يn|_{: }bpt,Ɗ78۫5Rfg0ץ9j>& =vjjcCތQf7't?,"!qܵc,7Ŋ>Y2SAvy3k^zkz9(I9㝴wT,pK F rF]`=%%w 43"Ic9Ӛ*dwGzS0ZNiى>5wp33BEik'8r pI I߹Z<{Ɋ,mhrх1RR%+?2"oEPox؅uV+Z= R0͑`@ˆL?S>}P0v~YZ`s_sgKWTn BK1 !K6> 9ȅhu/M-d6438EŦUEgNA"v‹>tAGd[Hzz0v.1j=لa~nHB|$ezbrCDWㇴPbl|Vq1^8hp*L8=7+G;ιA2)tZ 'a:\YUAcr=O 7k%}oʖF,nViz kŞJ50ZGD1#`'i3:Bek8? IO1~hB?TK`e")^VȧWg?4:m`&C4ٺ"z!53-||t߅(^z1",ocA%iY'"ߤj6pP8qz|IbmrT -*PU?Pɠݓ4=B:P]nF6~3cyC gBUtLT'Rr6 ƂA8z-("Իz\R ~P0clCbOxFSzӵs8Zғ_ma5!tBBJF6IGyFjO@i7qcm (26.ʨl"iK ߢ ҏ'&lW2jn +hSa*eՃ CO[M9c.mv;^%)D|`k<: Xц<jr!mXh*`eIWX86zq5{ȴD[u a=> nY/lp|{]Hn S5x\9 IV&wCu덼KP]|cDZF^=(FTR,&RCv5&zm,fH5wf߳FoJPh4CJ2ȑ?F<~٘:FfC&ɣ,ioȮf T ־O+}Ra†7'P}_WR=Q:FC1 vpyJ"5i7xW3uރtԎ#.$ʀ|;I>@}*]P|~tg뻮Z81_@?O,Eh`"mݥi&fZF ZBd!0ßꍠ6b4KlVXߍnۯ :Թ>3[Wd\GxFεuKIR,չy$=ܧԟd˝DD}apm]C@AnⲨ=!q͒2}gn^k_~*#aBN\{:`sV{D7Џ~G˰Pҍ͕$""'2*9B5ۄ:t9|I1U1`'%Ƒ(?ֳp6I0[#F#iI#=m34XI=0xh} ޖ@g|"\SK,W ?NL]k%PQvOUdyL DGdmp0[RѷkٗIF 3 :#4O:QNWOWzV|ne#$Eȁ6Jϑ+],eEӏH^`ee> &l[$U TX1A' 9M$W r:"~DP0q,N(Mȸ]gCh m4H7v½k6򶋿5}ҟynJ7>#+]9ƶND).DUKͯ'Β[y([uK,X"-7JC >p^6}g"w$:/δ>=D.d8IxwtUYO;}fj`_0MX=lFsqXpD]q#nk]̯4S0 R6m"oM;Y9'8n\[W]麬{p\$u}7 &lV+tmn1YZzz` k7*yҶ+Mݩ3'Y8: o Ycf*DdDGg:R9x%,rOi~V@檞/=29p(#qU^8XCJDt ]<[q/]IdO)'IvFE>=06P5信n챽jiëv- ^G,C Nw c: R}_7K!Gv sc O.}1!@g.+jYfW, -3VL^Ɵ_ﶥP c_`?pZF%*-SdPi[hJMy]y"Q岈q9cs@d%;>B .&10Ch8d.>q :YE6P;!BapNB4[MB\ oHJҨ婱LwUHɗaK@)8 ښP2%j :=((oKHEy19&gZ,pfu'wTR~JMؔɳ4كG|+}jhg{Mq\s~_hx?7o=5F~|06jc%ٱBN*s<_ a.'T6݄ϖӔ=QV:u$I!.˗K%j\y &?3`('^İs,A3y0ݮ0J׻8h!Z ͔KX;+<"mVEwZ9g/Ѝj}:~M i\ =IAH jIRL̙]2#>-Hf"Pt{@M(x"^>&Ritדʭmy?CEkZ֘QQƎuo5/@[NrEtMԜּC6okheR;R{`P& 5^Wc+ԱW6DK]3[L]h(p & BqIwXJ<MnŏSݭDKc& ^tDY?AK{f;krm'GBr\1rbK]iX (,Lb'yXv`pLhk7| '0gⶪSG.{X1|Kg䢀h$5U3vTQ֓`x39甫Nܚ3Mt+kkZqa=(Y \7ku|44Vaܢ=S6bn(EÜ8= [:Jł.(pK(Cq tɭEI{TfW*ekqhu˥G=8#O}P]-Fa&NQ(iH"q%z6qnv!z>P_-բ^Pm`'$@,o_I_Vaq@ &EG53kqml@9^mr~Z zUF:91)Hж#.x`bU~wzn/JSw)(1~_b hq@*n(.r(xk j?nĽa.GjEDI PFB%F*`_ (pQ_l^tVdž6 ZlgP[."Дf>{opmv҃j9\~ :xjlVVf](3D+c=or2_>vy?ֹ5<@M tZRSmq#D.G&_K),`AQA S~vxnM?H#ťrG!(tW՞J:n5/Ԝ|z*S1z!ReHX Iߍ~;T$B jd|M# py'C"*T{ 9s,4G KtOsLLHJm~$g6p1gJ1Xp}D gUi@vWAκ'=Efߵ4T"el9gh_ch;p Ǫ=-}g2;Ui[T+d~)A*vvM8AMj=ͼXump7toңq6&F+67ԗ9HINW|O8}lQTzX`^[>ƨr5Jۆ3~Ax |4P,1 _] S_'[#>PKwA/((֊FT6O:kh'9; 0EpZmᤘnPX5owh^l|ڵrO=zXA}Q pmBß=o \v |f"*xkpfQ{ L%L=ݴ+)RRE;fɼ C;FN"Ry-Aռ&߮ȒgR%rlՀq_X G\2D5' b>ʗp&3Rqt}_[Ug.ǥG.ܪE\{{bcoR HjEH ZD,P<ɱij7!-Z"4A11?y,#5<31Lz(tXANi  'R%E z;3UVtofK3h)ɯ:gFBk1hVުz20_N=۫s*9]:4FZ 1*cy?sU7]|S=\qh,.wl|+B*qt=hCa^^9;lcV >\8U\~eܜ 9l#9 Q mfY]8htrJψE8/(t p7_Lͼ5޵@ӑIZuj;?l[uim6K.2qV?~ IƂ`%t!+]J[R ?eέ n׈Qf瑀`EM/ x b dK8l2mΟl|shY#q ̮)=|G] W} p؈521KET T +8kh绗,"g4\uS{Xn4>,u\  :e p@$C4A|=Ny"BlV%i.Ji՜ }. Z;]&SB\8cE܎CoSŊW?[u"yoa9 '/S2*y&xj-d5ݥPF=m5 ޤdh`kJlO5)?ѩBW*MfuWr3:g\ʘf9?|͗.()R*DW^Ї{ג`[9i=o-L8SdOՋc8+*'8ҘĄ zzKqɔeQUd 6E}5[&/ξSPqh/v[ _چj ӂ}g?0 J=wHp(H9@^׍uF![W@ |ک)cwhUDT5\܆װj+8.Rb\#TҸiC@D6AkaUB:T;DbC^So7#g:;՜3w|CdA(z!MNonsnV3OfS7SDDYT씩t'm{&Z_EGR|Sonyˌz ]nRsίCM j`81_ EBdDI d{owH.(>Sy9j&ThifF{bﳜzJq14C)#;'~r3׬I%i&ǽ\~eԎnj aakޯv0ۦ6aoyi 1o3?ah:)ʈד2v|$U[,,$ v`߲h7ks#cuO@I")iUȳV贮Kzt:dre )f$ >kćzwA@iC30BK{l'6"0"]zͼLfb3PO-t\vl5kgtDDk0Ǵ~1z~'$qvOU?41hJnŮ jwyj`d{f׶&?\0};Oz)s0 G<[IEpQAEB_ۄ$-1MiSOf"~ƪYIwhBg+/ѳi3G/JHͭX~A؋aM ɉ&%_՛eKC~M^%`s%:<gKE-BCz[p[b[g熯"^v&|^KmWEq=\p'"L#% ^91}w&?+plf2@Y\-<(j7f FYR TSvbJr4D1D^B`Zg+{sؙw[ 15 F}]pf+FrqpNȚ )vP0uB(!(xMF5񐟲Tp76+缊M0n *U^%/mIi<K%)oGpy8Օ>Dh>K^u)~Γwt:3FѰt;j%Vn.gBOXN!:05IKΰlAl [txBrm5aXKڴR5̔k pC1J|YJ/߳| t" d?2#j>PkniT_<fKI *~+5bpaʪ)'o `_H!]g~9UAF3E<~^WWBB>&kB~&nmx>?{fɿ}"D9Q+ 6';KZa7WP|W 9wkkROC|m[8ic]=Z8ynk є ^j \25[ȾD;u!_^azxK@wa.IA;ɭ`ГqۉEdk:/@Gp=OiNPeUD2#K_e0gE =L0E|1ذ\@-,->?2 $N<^pj[=:,0?ąHjCռ  <G)~z^z& {_ۋw}ssi/gkhy{m7i.mFj(& A{N-/lPKbp.ָWAQ i)E{8=,[x$#1Q %ԟƽ&i^E֩UDmWfRuzsSH$?BPhq4ƒDf aHtX~a~P/bҹ ֪ү{v5Kuu]viF7ھeJ3Y [>:20< !THrO^c\W?}'v%~FqDX[Q< Gqm8 ;ތDzM!qQb椝 6Rg7ȭ,fK@9ZÉoI < RVrVZʎ-ہ"ek, Arp;_(q)s"+/@+7deIBowCY؆&UId]=KDD>(@=&O6ы*NA⥋$K$v!wQ_d*/ѤdO)蘽OSi.6 &X"T|TG!TߖT۠ǚj!mE(RElm1}YR:Kd2>:3$%d5bcfxgztfϓ|"!ڻD!f eK n̂c=Eɦ3}HCo HEw$Jo?0s()Rj:z /?G! |O q]$[2ϰY$\=};D٬R.l-QyEf 8z0_QY`q/>Xer63R~NB1z^UMR~=-Bз񎯛4ߗj8ϢM^\.ou`~Ǽ+iT>ᦖ|&P?m*N2 f@ g|3F]+,D`NYάZ{%:mfѦQR͚8tB [q&<( \g3$Qmzza( G,5̜NjupYՖ<9]i^; D_{oH, 3bhkl"4Mo&sFn&^20 hC}z&N[= gUP`K޺P =P@(ܢ=FF8*ì{0 ]!H#tnGZ}D DR=VDf;9Oh_ߘvp1pLƫ)Joэ#{W Y3Y#0݆"VMJ&GeV͠[ND[~5zik tb˿ȷs&>0ʥKy`(~,aeXjed%}LYb+DWiGN w~k&>׷k[L{.(YG"-c_Kb݊H06ҦlXd7P7@0/k oLq]RzGk9&ʮO}k|\pa.BL8(d2Vhh :Mq b|+ ˳FsMb1=X-s&hw'<k*\8Յ*xu_u8 o1slj9ON~'b0OU(v}v}|rdJlE4qvo!o }Z dGgz)ST9ѹs ~Kb(缉;9t'ڨ83[q*I/<+$ \7eN KS cj{_6txOT!ǁ5{ Zɨ ".ҩW#zmcA1o=bkH[ {~:$b-:*1|CΉWvU OO9Ue'ÅQڿp"_(О =8S.JβU)oMUѮjhv T_Ű[/_5dwiT8~b7$z+۔V-[,@x-x}J4 ^(Sv2=M dSW,یNyMSv-vEKtu-V(XM6^WZ8#>8{OgdFhWMPhWk6!gS8ZԪy J;J/*BJJ10z~\u|&KgV >ս4mez`,=["Rn{-UJaL;gy_ n fHM u 7,qO6l*O bC&Я]Q5սl@ObKr]`tfsn`$/|WNّ;ipjFh~TDi5P9hpsfClP˦6%mjF}R g_2˦>K?E籇S(Ӻ9DSȳj=,)(O[ؤ'!b@ `δI>Q ^󶹖WJc n+罀d×'SކU_>B'4PkPK}jԄQ߈W9tlrpYdl\NSTzo/Eh9Y2d_u7f{tg9F<FbKOmK(UcT)LqHP9`'Mʜ݀h}SJ"ޅA7z2k0!{J'f'+Id8*scA/EEE%ЦhQ^[c55ҴɅtd.wuBdxDTi `C?]q"&]s#FAWb,W&ֆu8T)*epq\<-AX3'U [y;0`J $1[d]zr0_Qͼ9AT$Hu(#0 ^r{_H,8( ȄɽUH0+}@AMF9eGھG g9b'fN(U`Z>(XQ8upNGC ӶPЏršMg,IhΡ$[ztP5wa ޏf vެvB,'f$㈋|E=&C '~>YZ+'fKIO0b2;-MFF?uS:*WѓC ™$ٌ.ԔX-6̥RE< WaQ?{.iѣ2r1֝ZahHVt5W)M@Icz(s[˭L杞CƯkA@OJ[.]7G 4~he?$@tJw0qϋ"[ wMScȳm6NfT:v`DueUFlx9Ir[ }5Yp~Vͭ e49(= Q.bMN =Grv^/&qUjy$Ŋc+C.m류wxYnBRàu͔*dz=VE*nE7WKhۻS 2nq'n)^խRrR;Cـ^ټ9nsή;!5T5&S-o}F./%d`d;tF1,zR2 ㅆYxa҈d KYZAKݓ9҃ ach"q.'<>!( 9j1::%6HcouY v)h?P*GHTs jdxCL`j;>qI?ʩK3-"QM' $?mr,&vo|(u2o$j+!v \t:3Y2mh'*:UA{()Ya\IW(%[Y|_.uH峩l41oWNtܛ:V͎OsǫbS^A7z|=+6Jyq93 }{$E8J@":>8 I嬶)?OV`kI2:,˒ +dk~3y,,"57&,ˬǡRƓnK0)ڑ.S1+d>`.|cjQm.ȍ4n rQr +y 1|(͑l>2&XmOv;VVцm@Ys!EUQ_szU]xl^Jܵwg/]s7p﫫jݠ߹PR:hz(Jz/w$xҐ ԯꡧ)E Q$-C ;ӒN[ƈXZ hnɫc(U3 #Dj|0LҤi|@_@VXgy`0vĬ אT߹5Mk=3p.w8k-SiћeLwȁ ~xW  1^5FnYr뇗T3d>ʐ2.05PՐn47JF&Ŭu$+Z@ZO#-CTmuJM~jrvI_p%A .I?y%[k Qc3jedG)Y@KjkQCBXƙ*,Ǫ \FI֌(&d]*Acn\L. wT4#3L4Qhjzu7^:`l2E5`IoF /jn2.68ܛKC6Rk%fx覯tlÐz,Cy_꣕M/=(Ae) 16Π BLUn%|-) .7E[kE}=q= r V&]gG*;BgϷ_*5ܨ^?:wD;󲅄xh&emG},N@m{K-A2e1%/ʘD݈`sϕ>I9XY܌|Mu3uc9"2M}R1㣝ENs;z](ϩpDAgVq2l~C]@fJ%" iXpl:Ijq~溤ΑN+6F#8,xوq.DnN(Vqby2^-n*h 786ѿ2 1OX|xVT<)aiPã}& wRbxs-MD8@ɟ\4Pt\-v( |m|L>kt4\(YcEl*P4JbVۮg hl5 o'1Zޝr@90[0Z8Ӌ&hˇI]wu-{1C7gS)ZwtxJ* 5eQG\q @Ft aŕ5Հq/VȹJS6=[ུhT)J tVA]2M. T7qxФg{q=%,(]$^)K[2ʴ1e*F瑣 @B[Q$Ξx7s?dR~J'6I Sxu*ˣU}IPi>"]+7EC(sW޲$0 OMÃu=faխ/ۍuFk 6m%!^R%7js^o8WBsK@oi*p1f/4fG u&PfAr9%dN1qD 6܊hR8.rŒ_հqxDC4@^#d嚡GثٳeR%?gߛ2uI-"֪aBc(9GlIX4m>+D8[l%LGͥng8.\ISn$j BY,c*uU Z N:T"l|]8_8ud9iriTȗkw)ʴ34;+B}-$P'UiY %5w/s{fph5㓚aZχ0aiHC-!WQ'ՅbŅDKD3M-1:c82EH$khF,JBc,skC˩7ڥ8bϺi"䭮CNPݘAOD(##xQ׽%s?4"0c'A~(rxz϶`TOxٖ0,j)KkakșC&S^4zt_Ά̙4_͚fƾ/XPn;CѬ 6E)Ba>@+7b̯@#67szkVE4Ć]+:BVȂ|IzhlIQDY^RF|$<OW!) tc͝f œ~|h. Ϟܶ~TrwVCkecJ꤉KPx V\ ,T'>>q/wf~n/Xm#0O!g ),J {eݞ!3czm+Α8o]D( I!g|=!zdq}N C6d\-a3_E~FDF,&{*@*y LU?5,v(-l_Rth_ 'YjIfQ+TQM#5cͬjpj뙩d=?eD_z]![-W*+LDN%# zZU ib _[= Z]7~\#x1Z-QFK9j>B}G.,e|t?p1]fnsЀ 7vxP!fa+s`Mxf|LӯIYL)Dg[\8 J*ҝM$*H 2umgi-< R>!eUB.jXXH`ė$ +9ݏ, c-ܡOàAڈq yUϣ^g>-뒥@7v֐P\&ީ'3&7 9o3iVNGdjTD'3.ZKt2Z.EUAU6`͕x\bo; nl5}pȑteM\$#v{HPiæ&D+_ʕY2}vJ.H믭! Qa+}"EvOA\$wŹI*noY|OO$0^I8z)}loMJ.FC>;ZvDrM54sFLN ag8ݞ ˻:TfKD6GPVOe L\~t$Uu1Gr&ԙAQkk{#*[_;SdVbu 6_PײIhc;1cGe N@-FQ{`@|ќ͘wŋj_2{T szUj(E֮!حV }E$G /Cx#,iPfR 8i,m#m|Fy`dHSqsW*6/t8<ɑ_$sr}"Y AY;q؜--i)Yњ%hi75zN3?w~%_#Ig9 sX EZ%Gܕ*97nGRh'ΤsOoYqϞvj&:If]p;Kbq oq hbg@ВZats|NI\)ʯvS3|r]҂Ջ Sp RGl;{D`PU rk:nj?K5XǩlzreC 'tC)̡D#*0mo[6ڰ~E|q܊Lٶ-8)%F. :M]tNm.)=#w#\ksKJ$ Hti PF*/g~õ;_5u! ܨLݧCKUil1+\]߷vTx?hjpM%DE|/U6 r~< m[8KYp>Xd0|p3+}O&"is|ߑ/%r"*=RJ S2,=*QoX]vځ/`U`B\egD<恋hPLc7< {>.v+ iZW(OgA ƗfQ=7.|]< 0"#V,ڼR>[M4kB"ԙbZ\2W Tam<*Ïe hMmV,`\9> bA2HB03 +GV'_A)$i vGt g`ToCICN:VOs6,]CtwXq_LHXW0dOWX ouS{ۑW|wQiFMس~fv4kA^iQ*xË·CR::n9>/M'ϮNQvXnfl&)_`و+,D(+ikIO5#cq 8jy$AK9 7 Vyuxj.7SҦYa M7͕@J!h>ySO_Sx;&)R:ؗ>9l PlG7?0ߊӘ 0<+vQ4#J݈壋n.8 !=BhAd!&:;y'vȼPt o l!hꊋ/6;\ *TFMy>K.#Ie*z-7f @XPA>;!3.\2mNbEhoNɆ8eJ%VsSd-yTøYk@ӑUՀ=~N"bftO94hm#Z&$?S &w5o:;k @%vyca뙠BdkE;#)}ӄR0똦q腶ˣOjO_& Xm}ϧK'upVި`,]5LT) X@ײ噓{q>b=Qp/b܈%M\ok(^"}RH^QrZM")ԙڋ Rd烁){k0"z_=qLp!ke!H2Ew}XU:9-ˠ⋁<{ $ꈋM3LƖߟu5_xB7NphqH ٮ&GUIQkN93 GPRYֿ~°6>Ժ N.h'ghDI"JIj䮉^z144M ~@^C=t#`r!T𖎵4hS4^5:y6-:Y> ( EAfJ0WU"0{Z@A,/$,#D K5N$G^$GmFcN7fByO"VŁ,NtXYyaۘ[2KXn5ڌ`[)&{{{D" Q(P޲o95TzR"@!s> @jj8ڛSpZgxn9q`FM<!eP/b- 5q'^߼s]2FsIꊫ8 ݏP&$܎()c?Rg;yg9󵚾p&;3iu[umUUSG {^V݌чDivaKBέJbRՉ!D֍DImGHp:+5]@%(!60| ]/GׂNjRRxp|q<&Y2%])S,󾇒é{/xnY nXգjꇼxLܜ>i? >xO~#Ѫ8Hs7{F31cuH8 3:cx59|v@nƀ;j'$`&>}OY1\~VdDTmr1y] ! =]J֪BPT~ehHBeb QrK؊": K!UNn8!HpT,z[ nOZU%W=DNRudzG= AyVc'0(F0s[^|Z^ǵ80R}yތ {+9>yݦrU\KP<%%MI[ǔ:!^E0{ D93)幀p댹QY=+Û?S̹z(4PRު'Y)ioST>\C8[,d5d_ u*|NTOa=0bU g+pՔ-j9ZP*LR vFd62Q&J7j&}1ڤgOq=;ӕ%CP| .>)joX5oXQ&u5vL4 zzVܤSܟoǥ?~D'um_yQM8pQP?>lc;G-pTB 8_FGwFn/n#nj$F;n@x4J#h1<)X1A Aީ*I [B @^@1EI֪[B[X"h:&H>*TƓ/J ]\f9rT;i~}ʽ[Λ؂;1"{CbڐxR֔w~b#|9ozдlΫYUь } \Rҫ+]H#zϟL}fV@|n~V.+\&Qy|g+t yZ/ M^_~wFf)zmT^΢Z/-4jS7 O4<(yYpooτrkPmsiߏ)nĘ-ـhdӫ%P_$K/P@#KGU*|Dy jW&;J5gL/p2&fNSDyQvR>ay('.|P*xAcF=$ ƚT놥!2#1.uiAx^!ݪ )J6Ҫ\~}.?b9=|EKd3^֕ QSxƬҪ6 މ,Ke"gpB:4,{$mT ][?n++ "*720"Ts W7xg0W<#=RHZ8g<MlEޅ+ngbmTmKsY5ӳ;/t<Jʁa{m<_?R%xGpjq*[IzXAY[]ntZ'$Q-yvh3Mu+(T8ҐF{S5kfl3ROS_|Мx"^V7}^n/ƥAiQ]tܯ~ߚK) ;h}P [%E_z?3sv+hdp 9iYQ^Ydտ'SL\]ga4qK.6\A(Aտ DdphSs+%vC-Kkw_[|꼅SYN8i#-.OM>qB|qbROgLrr9E%__x5~SUZQ2 b9ٱ,,gf9} ()ZGL  br̨ ڼ G9J ;Wp5& Pˮ\/$zLtLE s,띁nΩQ=5@tPAxND^׷a>; t\ ._<&- Yq5PY?gY;AΣ}6u6Wi*^ p- yN}B%nl& hOCD2k+0AE7 ЭEgC]6a|]l(+hȫXCaIHAx9Uˀ,~| kO<1 l 'xV&W XmDG{q l빎"L:SŔds?^W]A]3 nGL+ 'G]!cޛ$4c{Ǻ8.au>(udv۰3`0z !h3=jw,ސyRR$ ,rfKai32 g3W[ogrI +e9kLpf\usrП)Ld~5et=@1oj_M<-i y#cS!ʯXs O[MXݓ.'_rΉVKc"WnK2pjO|޻1i vVXϺE9M *R;r']\2ӵsDŽ|cnD) "qw[\#;3yxkƘ\-%#"A;.?MЖK``go&}ȸ80i+PܾqgƂj*oTrWrٯk\12>+إ?ppk6lP4UοV< ۗF(}V򌂁uu6s_<coMܓđ50bPH"CHSOLiڇ5s-J-pyPb5ovYۘ*=QG~UUӍ{;yZ]v]h^!K!Qs^1R*MF/]B|g[d~m|")i8;(8@T| NMF%bn4͊"?ئCo R*d0X@6^CW1@Cy3#֠pBbM-JxBY9(M<=]՘mF'CՋ,R@uuG6b>`C+>*Z6#BďޓR <^M\Ӊ>Mг66EҾ1|i:bn"x.UDN]1k\71Iv%[v1w/Myzڱ}㒡qw V=6E4O'$3G|S 0OisܣB+29[}}2](!-tp j1*зt!ol֕ TzD>P(:>6#ԯʩ*%H3.XbFb2;a> _ڟ?zl r@eU߼Ҥwn`"ϹXys8=.mv(p4P\FkRb>rp26 z><'{*i!Y k3ES<: !0ŁWNsҞ"x?8K9PI id{5 [ 0:npek<:1ʰ:`0՜e׼Z[{,721šS"Eq8_EY 7 '*|a"?n|RȒtfc\GNu>!_;d;CB/MIءɘ>K^ۇOt-3wH7p z,@ILV?6J/ DS2&[8`M{*%)M#?eJJ*0'"G@f˸(u'>Y<#KI3#742*}'=v$#/F:z)q=- *F0O/pG<=l{s}`0H5ƏI3y'-߹6:#~BWj㉠kgID]0ylÆh7G]qnΪ2 N}tS0c|5%p )LV~o q.D0*q]Y2k^ ‰>dIͻtTАuL8Z,VF OvïϛMPsӤADgpn\b3 8bxN.ձE32Xo^r֕KϏ!FYIZ/&+uB]*دS)0RQ䵵obd<>M::{na"מͅR{fOt I"_G+]FFr239@Du+ yUĞ!6H Jfr2uJ-r6Ջxi3MYǩ[xW AhҠծ2D @½JpiWb߸wNTNlbJ,_1JD U%Ld W˘NR!O+ *' =%qVt53C*Ї1~^1GL)K1Fv72x޹̈:. $O}H yܓg,xefc[2C5U3bn2$b_xM,o4M(H~CcWbd5*7w)@ k |x[AY[B)ksQahaZ&"\RJ^t$l}^E_zq]FzΩ%xU!\k7127$_![R]Ptp3p> h _r b a};5zhH@ ^ 5Y@UҞھ/GGWEָ:C#_s>8lm5k`dRaDG/CyM xQI6nY $ *I7BUv%ӭ.%BnP.[1ݛQ`=K<+u)e1E6xt-rjЬާ`eqWZݫag޹Z%)? UPDd6.>]҉lFOʯ% -V{翨 o⨆z*BerL h' ۋr(wlw5ˏ|BLKG[tr5omwOe4I8xJ"j4 /VW A4f'-Z.'1Dg@8RzYB +;N< 8vD3j ueL:m+%RtU+KO +.">OQ_m7XpIwZ7YRB{qwdn=}q]T'Bs/kԕ%`5gChzVsn~"{}cIPӒ}#T}vy$a-7maڝ ;6ybKN"Gf,G]{!Z9bR; 9'` ܹ] OLQ:A)܃I@[# S9\Q8;f0s:V 3_ #C\S. ֠]mU 1W7.|j]$>n:[lXECvyftbniMLL,oY;fYðihG6۪ ЬU JTaoVZ& >*;z`3KFv[N87YǞtPYPzdk ӫʵn]_k>$i-$+ Bs;E3נ= "XeXQm|vgxI !Iq5Lڂ uV+h?^c_nnJxqtl)>P䲧oH'>0}`}C'b[ϯ(ݥkfD0 xN#+ epZC'yn0eDpTy]i&0g{{hiM3z*%Ync=D5-hɐ7 I%RZN[Gl|` !TİvCHn̻ 6wy3X_<"[pө  9~kv85Enu{"pq  ,I7\VT-t2T% L9{鉕{2Z8d)Z6KXQ-ca/j!tEn:tVpI #eԑ4L_ݗGf\0PDx{ 18?.q5 ^@dRr!(HkUz'n$'v@`i2`+d<;*iۀQy]Rlvk zȩ*Zҍȱ2 #wV-xe&^%ebCw3q⼳3/O٫$W奍01w? FNmh<Rؼ/C{Hs#sZRӢW*u`q0s(/xa' B (_y p .],n?7Ǽ34p;YJqa RKJ\;z_&yØ θy )D >Hq[}za!XT+v *;w<һ{M9g ^/[I&8A 7N؍ 9KLI. zoWYF:h /Os2xc:[hRM[S`Vc- +-;5T"/: ТVRO0`/gT3F&5\2/U%7€{2՟G:#lfmQRos*=ZNS; Kwߏ!u9ti#L㝮f,JjAAT\#3f7]Naf.=UYL""DmƒbCU܋gܰ1pюoWѴc`WA?![3|4mDz@=\CWڴkWiZzD6]BC]!J܇DU}zFmWIY"t*ӓ(ʿ󇀪 bgPI7.Vd!0tPݵ1WU|$ׂ41K&*'5[ভ!M*mޤJwrB?; @S$9wt#=<$??aF}^TETw9m=&vE+[,:ގIJL[ :+';>ڂ]#y6g,\'k,҂ a<;AM9-Wbѡ *o/7΁ ]]I{]  A31޸։B GZ n(xՒhJykhS)aTFd=s ene, Ye?cyZ, lSL˗yZ"|s^:&AEU"K1"U՟>u>wo^O @*:@Añj07aD'Vr-Kįy(P򡿞B5 ~VD0`"ռ|JlsqaPՆՏp`V)|1Q?")T>_E6pN (|gj\?{#-L$K,-:!^2F%8͞LDLk.ExkgP"āR=v8J(|b>1\6\\ O5@qf楢`u:Ӏ8/+yt7`ne(P'):Fa&h@ k Dq@/xP+9p)Ya&mSXjT8ߚS}#Dve[`2 Q!JYۜek Κ>K$ JQ^~ήu[Ԝa<0jUӒ!B-xCtpeqV`]ybɕI?ax0y)l5oV@w'.2>(~#w!'70YҒGz&ePX'|*8Ch)@OǒjtJ~5 [ksen毇xTDm A@9 l[J7:1z> wo٨Pemx 0M_MX>=䢦w;~*K;;J+ >/\kW?S#+^xl/-XIֈƙh+ _Cqp5r3(=8ܪ`xLNJDIIDK<g3!KKJ<,Ÿf*M z][//^fvGRȿB/DIskl 8M- cqoޜq덛Ѕ&ZaChgv^ym{]}2qa-2W^`˲h ?b @Ɣ\]I]ER6`X ޙ-F SKƛ>572qvˁٓ*:٬(CeP4ZIY;с -,~"/z,ʟ!\M&"5K2]`LsJ9nȯ˕28^"U,.9En.`F"Ŝ8wѻnzձ)1IYȱbu[-nE<X2DZkz#gqP1c(q'#G3Mɂ-dWL'd=\7sq g_DK*QCsubs4u(Y*y_QqN|#+a208l9FV )x&a`+IϰaԲf: (X:Q]'1Cl N9޷GT66 i1ץS'{t` y:p_%KRuu拣 .`0ƕC홵hpLGR TAb/UWኗHk e'߰#۸ý8>ݚRUT,{yEi?KSXk' }M Y=Pвc)dE4RrOۚ:}yX<-A*rD{7/l _^aJRbS"f*b|ڗr_a 2%e2[J'7 =廜DASuIQy2q݅LOA\TwpR),H TCv5 D:e`t]܍?ɩP3=.FEtMp{E%q0*T)̨D;xSP1꟱Q\bFHd$xZiɍ&pPO2s+l^ȾPV>W;z&K U۱ل{4 Dϸ4GӃ-WF#6)8d@G6=M Ң,32ĚzyQf-'BFߌ?0Eם耮$#BI.W%/]B#"(=}QX' MAoA3E4*qr-.ɝ.9|^Wʴmث:g05ѿ u}7,<\i3ϡxP/)q`JG"a<9pkUAs.щ2wΞEݏQR0 ?7 7(Z#s-wPɛq®=r=J?00,Q\%Sj0^[dz.Ev #RNȋfDvMV~X-k`aXog#b0K#.Mтvc\{L ~v&ͅu9\ы7ψ^0r"BpI>qn\bC.  lDuТkmcgTq3W[Z#M7$Å 9iiN#.ּFdQzh7ࡺF^O‹aT! ?\ (\eœh, i5gi=ϖ̵d@/q8O$\qO]-|as{0{Ȩ. ^;sq* L#O?O@d.biNnau0[wZw#&J70ON"m)L I ̅s 0XfӴ%z ><˦cLk /?󞊳CUD+ʟ8A).F~'FWRO'Eו7H3[?uw I:T{8+h 3$% NRk$T rnNJ5|)VIdI*a4ҖP2UeD6uJ"b1o+j{3.vPƼ ^#';DmT7эE whz{Ϲ+h>G.xFE-<~!&ڏdH=:Lc%V vzRGeK"`jhh%s݈&l[QP+:A2Q3 {eRW=֭HJqǧIvVGXGזA%ލ5rɎ* G*.(%R`4Bᄈ5vDUg.+~YLJ(89N2y$(e - RF'l!}5xy ?M&gู& <T˩SAaf]rdPېR,"sPc`ݘ|?pay (U3h1SOk8NQ)Q,|CL˵X7*2 ,d@m UB?ool"X9)r#1~3 W ֒z3&@5taj7Lk76^ ɞ{ۯi̩K{UbG$I J%ne%ߠiKH,RAE_95`.!0*.\ =amg>-m`=D1^pԿXs(ß6hd/;al7E;HϏT:w 4l= H*C&T jM ʑ6JJ9,SjltvOFnJFَ9r95B< ^?v&])*mg|",p۸"A385[_dQx}/Lt&p.' tR:% U7v,k(irӷ{DƲAF>*HDqJ[7Dq %cU0Tµ2IuaJkP"}|hsHT>wRhL>A[1#DXevwp4Q=8Lfw=C<ðT诉 Eʽ0Q T,eN!Hþs~vRsDz(؅bgz\=^S^"F[. ȴgW@g^wũM nZqH?KC{^?ˑzv0%|!y-Vl~Ҕ7265aĂj//]~\$ P v)m>Qd*$,q8[݋tOaX`i҆l{J3맳ÏMV1K0W%yOܑX4~ȚLKH6ҿ O{Eơq~!%80N*u-|:)2vtr yWu01 Vn_Chȋ2O`lɫƽauS6>ͯY RƥqhGVCM\[Sr|ed $w_5cP F߀tir*@#|Ԋm mţeCX!:Z{==1ZzC5<9־f,™T]:)\j?N˴E:^'F56urNFmp%/;-6~|TbE:Ooh1 Wy5ys5T50\:$ wnu뺮Q!Hc:'&/wÜnO^Q~'7rai5m߲dG+?X|ސx"D ilq~]5)"y(6s)t1M1ލe?SXܑabqWΫ xcNܙ6MLto盵M@CIc:K Mnv< H|Khp `.e8e2a,$[vd8=Aq mxD'XѿY"n(48r2AmSћh!dEfWC\'zxU$dyն #nj '>AhUt.[ ]cRT2iXYَC7G3a,))P#>`şv Tq&9_ß&ƳOQ'ɶ*?bC,ywgk\ h* mq g%E ah{܉1Q!H| :rmA#ʜJ@)C<7%*Nf|PVS[ޥ hEah(XëeuzyAHwo-ՁIZbͿڒRO|d$qm=!=h['Uxu V~DU[=½0VYst]iʁN 9=ū&kPE5(*eXV—.%Zx`ɠOWTޛD;y r]ەB iSHjDZZ}*sX ףg!LK$(kǬ\˹D0 /T"ԢYYOvO .WY+.nQ[Yy\h(pfH>) IKZh,mX./Ju:%(%ijrqm q UGVxW?2>eË/W ])Yxy=۷D5fGxʹ%'E~`H)mε"boZK&~HAl'(/7^ոLwq+.# j֋6]fl#lBpZyvesd/b'mcXHwTI4g ~s^bUU:of_ ;xLԊ :fŊçm:ηhn$e3Dw1Eu dr GZH1­L֑!UmcV"E.66˕Q55EyFI8FZ DI:wւb3wE5^2i Kt)yũ#Z# a f++$\~Ptf™!ucG/ar6B>7v4uomQ"AbfA G>p&k"Aans, V{ZA;B:F6RolM8&s!D~Yb4Ů+ wr  7I6ڼ8s1䱭lDUS#|;LLZ."tU٬6a(; /enԤk鍏Yw؆;NSP'ԞmK)깽'㎜ty&<$d1tfЯnv?4$=LڋfRH\k>$!WoJJKehXÐn/HlBu}[NHJ;G;Y)>OIPW~^W<_4)=U$)Etb:@F~&҅{Ydۛg5tUG-#dRop._%'bE"ȍDNKQrxǝn,pÑ05X@úAoZ}]_e?;1m4 nBa]X^RQ]m!Zǧ$m$99ًSTO[&X|(>3!fA/qG i̿q³ÒUAFD %M2NL:b=ŤgJ`M@}"Vԓq/ @*j*ï=gd#JPAe8&Rh[|B+ҜZ:Oje[HR8\}SryRĜ+7Y)ݯE.d)8 IoqC_='×7Hɯh{<۪͆E ?zC+XnPi" Ɵf2ϸwSqh"v7v-lҗXCA4EiɩЗ= ~xv^*m%.T=VN% w+H\d|2rObU8MIa ӃkEA| ~ٲJ4>vLa5kCVsThUoBCt3pe-wٗYqmuϡr/S*M}jkУ Q?c[@@i{{M [}os>v "'> >>Vc:$,qgw5ªXzuF.2 hEkDᾝH!Ŗ) U^1Q'ni2j]rn MS YKTظO>xӹ|BMQ8VM;$XaXߊ;ɼf|s w¤Ŝ JGԝQM9< ᬯvL:48B2tQwjT+~ʲڦvіCkOV@~+ZBqV]~8-L &BM4du?v1!z%t,yXnDŽUŵ_dzܝh䁉25C`yCR+ɽ WQo3TZ?Cy跢ӼMWXRd ɥ[YL6zM&.t0Cu ǹ\([v,"k+iƫ{({2@Ǎ27v-E9s໩p:B6{ h}Q1 _pk5p9PrUOo#kav%)'2=ˆco}!b9v7u'~y6? Q;݌].0+nʡi^H(mqr`Hn_n."헣+]@xa>ٜi[ȳLqݘX NGYFg!RfHcJJ ;4nPG-t\~Qw#8IrSQжڿ5gYe "2tj7C{M|Eb0 'S˫nl9>~ȵrݤÅ#~ B $Z'J V,[hEP]VmM w CF3_%΃Pj)Uĭ"!4 V7 S83F{ DinqN="y9&ˀcƒLhߺcVaZI/ZIvDgfTxg@EO^Il@mGr*Pv Q6=F AGglBs{,4AYom2h˪;D/9,EʹIS&D\D.DĐ /^Spyf`~{^BK׽=plVO\#&Kl*xà'*^fF{HraJFoZ@7=GnR m6utL WP̕l)o RemDI%voA\ŻF7lTA* lʁڇ RdghS<ǕvOtt<PzԠCM)Zx ^qxOh"y*>_AHpضg7'𑔆,2z&OQD [J?e.L#ljs&SW;1&jL;*.<]N"!K~lthl8& dRqt k峽sg (/m4EIhYU۹߫ et,T DNNz~/^k.]'AA4yĿw~DH'UPĕwe\wsL9O,ʮ5u6lÉ-BZ~sC7s_)=}$Ȼِp*KIvF.|+IWHbVˠ\9n.!{WbWJ0o̳J:Q(ĻT$S".$v[ fj%)}0쯠' B)#ZU=B{bQ!ImzI;FĀИu:XCٳm[Zr"yܤ0SqR)zWD{1bk96{e ;.V*UU̳5kvQ2hFQH $G-O/ͳʥ>u?0%qӭm2.V sX_ɕ`M hGH"!2ml >(Eh5BSQl$ATX)! &>^NSPqxt"&U 9ycTvNRzgi{b>Yష tY͏._׊=NpWab<ժD <_l86Sp G]0u`XϘ )9{LD ZA0><*@i6[Z׽baD?NB)w{HaF"pD{&UP 606;TU?%2bD%w S-PE-vxrXʙ/\AxG8ւEv8DE3d$%;c}Ox͛Ԣt[AZ{"d~t kQs<8;2`W\7cn_FOr4lkļI"LYbH  }bʆ' [vWIkrğN?±f$YIj=S}MA$;(S6h%w+͟98xqnfHZB _7%rȄ ~"ct.=%<%.|im~XhL=8:O +=#̃2/~k׸%D;kZ1! H[ RBOUgܯd~ !I+R6_ 7L^Bĕ$*&cϬizpq]E(R]b"g9gc5-CJ/ 1mFXn06|7R'E5O"@a'!O}uaVT>@pS-xQ#.-7MYse`7eIڸs2HC,9v0YרᳫNb[R!~ -[oĺB7}Mٸ0GYY' 0ZzCp(Iwm+ #<Xˤh@&ChFCOz`Yxq#Ѣ,uT:V};Y4y$ʀ35/dWUgsb5wDŽLP͸$^^ո-$*4s[J$t󶂐#9RPw2@Gl|\0{Ε8uþoFUǭD `4^x?]͚Ύft!}F3 2po.S֬՛~n!G-sTp448^"ٷYH. x.YucNs$)'jorHZ9nɞ\oy[t!S鰚 :WQ)xpu>⃧|EA1 #\ 8~F$. "uOCӀ4/׵M@Y\+C{Z3Y#Y)'??eطJ9+輯e(kD<+8$ݢpND6 Ϸsf}3qь 3O-Y4Dtnˈb.qM^ˆNg,!󱎖\8+0xO,ioAihTv,!dL$J1~ju/0JuоIn$ (t GV*R:pD`yM&D#'LK+P/Wa59MecaCcڜIF)P$O%UޡbiځX?T++jf3ސKuճ!nH}H-ƸCxЁx#]-ٯ86^W;w1>@IQ?xԥ1Jvi5NP%_w%/`Ej[SmV}hY@0U$YV$ yЭxŭ;B& `#[ q;206Ŀ=af^;_y-ݽ?(#Xy}_ET5t̓%^z|.E*Ry/D֮5Mjբ W ]^|d|LtR/eJs`Q%&Fm#COwxRoC-90Xb^79g5.Aooh%g!^K2Ƅ9Fm,ªQ,"7jJb]6v|) B.N2yl[*@n|ކ` ${f6 h9L/G2i~-)ENxMquꝥbe=3$q5>>4u!?ʃݵ8XlXq e1Ք4Z! *uw㔘Q5F1{\:J2}dtU^SgeS@5~EBD@~k >أB;r[(މ7V$&394bȭrlLpoߠbc8kCk@whTf+5ρo[6~b9:4}dKl2Q6GУxFz7eiX乘o[S/wܭ,P'.f"OFdg9IlѦ!>P)>cdw|;>[g22a |dt3z!91n}W}KIقi~Ϩf |DoTw #:icJX<-C:̃iw8Ú#CQĔpڲSk? 1 Z;fJCXVz+1+mnxױn!<4/K蟏ZUt΅@Trw'S V"b%a\\Cl4q85nJ~ H, IqΔ޿6'2mJ LͦK) fXNKH}V6rMfd˰l1rVQfiVq'AFt=ج2a?0w@Cg%t '`-dvB0̋1/ƱX`M0| @  hZu-@"dS{9iԃ?{ESt_JRJɋY/آ{y07+"nv"YMKM{A`hz&x]hiLz*ctP\ yRi`0\8khyC [Fʊj@11\9ْ1s(~䳐4hL}2s1c@؎opk(*7H5I. @Tzw8jAN1(q*!u R_'`1u^)|lZ; ,U:~|jI|9i/2A>B|Fv˕%/Φk=z}QgqMOzϛs\\ jn*_-Ա .H1m)1\*|5&o ه}p 4l8tC/ 0֓?'>N.( +s-L 7ӹ&ûYs sczt |r6LҞ,髩%صGSn$e__9-b툺vI=~uʯdWv$}}TZB˝\Jyxɫ!?l~{J=fN\:%p|eĊescEߙ4X`YxeD MǛ R;>=z"uX~h| -=@gچٸ~x%ʔ gb >W$D 8bl~ΐ2{;6ҿV-M]|j^/g"VG{nQfń󊞰IFd]a%H6'%`Q׸#Le*z)v?6|kW f;"9j)2Q*1;6=kfqS(޶^ZB<.1tf#;SX_.A,x~kQr4AJlcpc9 f .|+ҙ١XkbҾmՓ{sra~܂CjC*EK%Ob#z+X#ɡUaAjXN9Yrn+5EikfS_@{ŻJ`/nQUyuG]|U o폕 &;2k Χ-1j:ᔎ"9h|KI$3UH&p/ $^58f,xIL ԺtxOQF~W*+Ti6%Í`;t AZbGfhƮ[cQsJa }6u}TJ N _!`7AavѬ=?pT+9~,A vq%=ToGEH]I2BzgGPثhO d-4Mٙ)ڪb$̰+<:bS[ɨa&57L8=!`U5y:ISDu 2ֶ-sskh>1hSw!vUoq [(TwL`$ޚX@P W"QD5Lɢy:/i+<+k;? mZ oc;L^o C铐P13iiM'\(q4$PG= (bXt{,MtQ򬬣5y˱"4 Ǡb"}e%E5zsFq8=xA\Y,Jdt4f~?znqڔcGmF f +Y;gT`6s6jeKkyE`k(B)}9onvXaoL:!\"Q[[A µU5ct%_?h=ћo &DM| r7NtS!טz+9h}zڣ|ܶ,xʾVq#7pky E #V?PW[W~ 52r+3t{yQ =Ɵ ̚^Q_\=knEeݚQҡd{u:EQ؎i?Ph v7*:1<(9TUL}CY14ө_?pɽŀw(RdL ! Q֑q1 2d;@Gxw‡GUAEHj.NM8Nyl)dﳷw :ʛqWg#uy J +6Ac[#ΑbJuaz$6ۍ:fJP9|4xT&vNV 1-3 zyp KPE4CuYviűGη6_]G(=gE{cۃ0Ye(PAPd, r1{eikvt]9*Ϲו<^0> 2 CO.ձ>lWYJ_>OМ:OE9[,A~!NUxˎ l ցuSʖذ_>Q\ TsJB&5\|Ta@ex ɮq5r-ܳ9g޲wK ab#~?؋W&4M $f)ҝt9aֺT`r)qnDHȽ ]LLO£,n˛L;661 /;. dD5|L0p]bؐJ {*Z0v CFلa<;Vn!ԠLfD fڽH=`nc 9qyDUaG+jJ'Wpuk Sl=nM%xi,b66TeoQ#`!):!<[u->(E'_j3yu?6|3qXi:cV+0g4lZlFdnuIN\й0}XEy|-5(6$GP]z6 edzka}]͵ք֛FY$y;Hj])b֌|WpXSW:zb)R0yK^AguBn4 H,nHUx걔92 O*n СKCvГg$_mFi`,BP 5hx 5s}'UGhIU$~gM݀`rM݈^߁&Zbq nWJZ ꯩDs^g/H}2 Tze-` f?K-}8X봔NYF/Q'cZc F4<+1R)\upGU͓bc1VW7e#64n$bfȎnA9U?/3-9bNd~i^vJ@}&\ &х=E[ @*pU):*P7~kѾ}  >XsL L6W5N-GbW ,ܧLCbq* ǃo墿+QD><Qس xE]ϰ%P͹++xP|a 6Xe5~XivMt.bvZxU8ˌB`MMG1%\p*3Ϳqw4 1w_(Znf*8xiuH4&•P>2hިxi ax0F9;'yYYBQU\a KsToJvVd08>GRdn> @ P=ЂMFmM;]^O'FFN;).tJM]-z"{"VDF tXԣqi0L_5)jӌt̑o;l`|ښQa~u-?Iw58p~*7a&-ft)ے/su Nh M D k0 ˊJ9:L<qբg9ftH.?u&csOjI*=3jjQf@3}o},l.ubAa& hq'vG3 "Y )pI ќƦo^Tt'ȶcoc4ғ7JRW=ǯypvIE͇l)bUJ[-AKL8kǕsJ@ H-6B!<ݫ[swhpzz̏ܦٶ!}϶K'1"8{ssu!N[: hwT7v~#\.Q5T_pIa[ě1*mqGn0r:3)bZx)T$ +w;$$I/mBn=P$CU1*P3Uײ;K ,ne'ر K Eո݃9ߗhtƣWzV#g~ 9O@揶H'FTwȧP;}7zg#o;]r4~cⳕamPAbZ 74oz@Wi=]`ŀe4՝C2O@B q;=;~^k 6uj~>k p2-)w)шd֭dbN2`m1HCӥ3PpvZ ET_&MprnB ˬ[u VI@0sdFO ַJ(+G‡B>6Wfkv0O 50 :kA- G>صS'H?i%5]kpPW6 čټD0F%I\ތ!rΪhg Th^GqV&Vይ f2q.)b)bMdgjySw@elBlD.۫"M>l⛶]^eL<]_*BGF}o+0R&?0ۀ%@Zq0KMDO(;SڶFQxz^ŕÜ hޝM}Vz[G*W\xNJ@j"nʒhw*њ-C5 kKIVEv:詂!q[<,JUl"}sǝ|GEC8p܀Xt n$e!Y`#*e".TlSK"B璓;N7վV;JO_C/{*WU,[R;l5Etsl֒^`f-)"'G f*%Y*'6SPD ER 3[`GNT|.zABqi1n鉘8_<34vscU^m \b-8LJM cDhC+O\8}˟K%lu_S̱J`'ܣ毟 U)=UWbϬgv9~wpI&aHA'0ט3Vxe擕|L#YuNӠ<hUɄ ПmN* i(Fm+Z 0@ѭoHB tTWZ;6]?fdN$ o opJWѵ-֒AW%U=SF]jn=\C d<΄;^N i6QA[eL%;bi|[W>)NI`^zb` rWV`/ը.A!4Ck͋(갧 ==A,#j`nNuV5NHTerWc|WU]/y axu:Yuƨ% Ԗ<[äSLٷ*F|G_0ɽâYLtpwC QдB` r(M^l@0/`;^uR{mJp%}+]NmWN9zXԼg\z>Π_Ht2#i:j7S?&e׎qPBמ†jL$aQ5uVlOBy\9dkm~PfUn[ и;WR8߹1>H# C)jD:4<J5Bzۛy!ѝ˖ 4oZ].72wסR`S~"|?H:XWN CSrO`<"O70K q At)cdRC/i7U_P}ctc%(A;4z||6"҃>,|p[uIzF$g(f$r⁃r!wҊ71`@pu1<8s0F:VjI{Ӄg9s 9 (S\Kqjf}ךr/3lu^tֵp%B( ;SD"yƙSC~K}^k3' LH{oƄca ZAh>!} g!'/4aq -<_򛂕|Z1Jn+x3"室EޚKeZm̞ ;T^\)⢇gȆE}5iވDpT}휉$vOC!'f]kMuIJӦ 5Cq: bMc yB;cAW>ZםIk'^HBoIApibs]c ͕#ϴ:KHjo{Nj;`?3 TW],V2@VqF uW ]+-cOinM|zFXˢ(Ҷ2ӼY&\Lc$J՟_XEM:umA*6ࣆkMGm,%1_핅{3MaOAi-unt|oZ'@O%n E7NU@sN#0?V.gi/1JAa LdǁA|ZxE3[I!#< XGnyuz'C3[7BL4J`\|9q'p SrQLSzUXR_xxг%aNjrF1 A)4XR(HL`ը#bmKʾ/ZsSLXp%d#F,!V} b޿yy=̬B~%d,{8­)H^ct3! %#L.ZG>V&> `,' kTGOFA7Ifc (V0n'}<Zn'.\ScĆ3Xÿ3% 6s yt&rfL~m 2ԉP޲Ov 6!|"/Kv!'_sbk&+:ɻVBdeXr*(Z'GR!ڡK$`T9pbX##'c,x`.ܰ~>t+\aI:SU~m::Y:0GN𽾮/=@Xa>1N*?Յ'zfRHUDHDŽm¬%7ﲾCRalQ˙d046dKj #`"2U5j)`62yLneb% =c`ͬ^xb\n|k-^Y9ҙb{54-ޞ!-EaR'KT/#C3l&BH]jZ$.t6FXұ6r8 @!v`twQ&4cD^Al\k}B!ݍ&zJ=5KXF5%3>A6 &ЦQ/6Z~B h ^ H=c۷N?H =çlJl S%,LdDdRrXaY vSTElowc=˭NRoIU9V,vpML6-gw;CЙFJv.LYs=elHl>^;;VdAS"}qx2*SrŬi*L1"Ii7"a7&p_9'\Nr?4Kqɚ6C_Km'NGv!&;GLO ŰyH#0~sp*$A!lAmhtJ(rZjI T;r6izӘޡGl@6  oЋiAO3:] OW.8‚ $agŁL28_<;۾$GJA.;dF6-+L{?sk,MBpB]EW#M$av4 $ĀImXpŢQ€EXd3Գ/g6pr^OJsga,o"ИN6A'ȋ>7ARR(4_ DmZ@^1i3˯NK 7%_t;`I+.O9S[_[RAB|)," "z*Q!Q D}n k dmN8ʒm9cy`f'W2߮ kn X8/A:]nj%M'd/lN筒Jؚ0T:,iy {UA)i PU}덿0: jq1QrD>]|є>B*SL _:P8f?$'T&çp x[J .^kN,wΰ4^X}} +z_6V/(LNi`Tűs$_;eϐvҋuI\G:b!ʤF2΃rpFb$34@Rzu&3鬙~Zw*#3ϝW_yT"I,(|4-:ss֏NI}Ojͼ13^f_^t6i{PLlw*uչ*An9Ph HB{C, e{Z'ΚCi#drjFA*f^ߠl+ ^d܎య $A//y|t WYpg9 7_s̘oҋm:2{ Y] лuTQ[frQ9cdhNdyb?hDgi􁄜4N{09rFi9wti"ɺ{o xYHF&cDz2 4krR [k톏]$fN %ۑj; v7m>[\xǶH (-9:tD6R&G\#̽hGG!F/I+3)h1tR4Ve2oAnNy`A}OlU0;8O6(ϼ) j<#:vbu;0jsMvIܦȻ{yOfU-N.4i~*cG%ƃPb&_NqfS}c. mM%]-U}}kɢuVx9f2U{3* sv=F>7u&H`ЀW[=\1q ,EJ>T6 ZLn)[<rR?>k|[gwkMfn]{|`;DWp){]VIBız3" W]AlZmgҹEsipֱ^❗$ph11t}>|J5+#םFH|*5]1t]H (ϯ2iG`gXQWspx THv:{jq":S)Le">G'(PСމiX0]JҼ#j2SkLAB1ϭE,.A9? <&J;0?uTxhNIY:BBsʼnUaכCȎZ|ݛ#ݍF5y}a C5/?ٔ/_-/nMEmDkY`Zs[H"VyCQvlV} t KwJ\C8P?|`D.nš2q;gf ,MDwlT{zSLd5 ԑ]ޤ׊foNK>JG/"Yd$bT S)Bԇ7@)[l!A s?9(2saIU%*Dž)QmTGY/)۔6,x\R4J46]:nL0j'uiamj %=ג8]ޗQ*[6%zf+5H$cXx:Ӽ@8uýh35AcQ1b|tU Tg17:y0?HCLs  Y'?wS,Z>r>s(ɩi JY]L[QqLM{Y:Tt/EvUvE04jnFhdʞ+qE_a}܈Xa16La|@Ŏue08O*4,ͥ(ⱁ7;a"pDzL9HƼ4ʂ5pc޽ fAőV֗h擌 _ˋֈEk|B_G CSXԽvNBAeSWۍI:EXg{K7030Z>*2so"8ܖ9g"f Ofp 8dg7Q%!&lL}ɶ'7'Lk&hͩp_Z Nc@.{Z^y~qâ"_YEt!f_'v*aoK5x1:x`ٵ ~@Wp8Ըt :ґ{qV(J#r2A-+ `vVmhW@:mAhg$t9JD%K'#y-(zL,xWdW0cEhKq\&G i@&܁ԆiG[;Osѿ]5T\Dސtԃ{NuD(VȅS!@qō;84g/j RѦE 0L hP;܁*x0g݃vfR/7k5]7_[Q:TW0z>9ϘaE݌lQU<7vS9ER/ŏt]]+ԆHe.9Pќ6R߂ vȑj4om7I0E|mG)yf3.|F\fobO 5사l>a%~*>@wR& UTw+`Uz3SwOk*7C-R i@tnJs@&:QQj|X`_:ˍiklQ 9頔tnub #MF"L_u d!#N.lnT1U jgN1`X3L=;'Q3F| DVle2FE8 Z]1`'7VKԛӑtSwt3wD&aAP8!ǵk/bn5>aBٓ]#B+=[YyŬqfzX 5T]kܸ>hp: akux"NQkgN|o?׍larv}"E7( i9MB㜀Tmo c(у3m>.֛#wl:cKVV:5Æuo7d)*v 9L3敩ؤ'>9tqPb#Vq7IdXx*]=ۼ;UTjwV&]񗶮ۓ+7_++-N"ohtj:H.`vn53w&w~,21_;ry`o˝oy"%'N)aX:>b6dUܺxWHZҶdP4=!pz[&KJ-fR~ejJ݇$x+^{ A n\}dQ'LC]oG&sNKmҗzX gDjsEDVL%<&mc{o1ln!)֫Bu mHʋ֧'LxSEM{ڊild<("MOZB'3Ao^ѩ3$ "L]f֐BEeg:ed9~`}d~a/@s&ښ\C).ET f|% ?JsYґڣ6j f  ']2 qhpmiÞ{Fag:ٵf'擫AT?ȰaSKG~a4C+zXE2v6S;KsF EK"QK*^_թz4OI6ے[$YpZB]sUX6KY⥝vzO+:xAh9_ȟOTn 5ٚŗX!!ti8L^n4pūUF4^_D7#!kC,%|+7Ħi{-*ECރ̲Oz3#8Z2@Y0y;EɓhnT:.pM볢A#0QIG8]&!ȇ[3_ˠ }"`[峑x^2XhGq $[i][l|Xh;%ֿ6c8o]9.j wouoټձmC֪A?EX${Qs}l}kṈ||:PZҔ_{ $i/e=wї,b\tZTRP%%TVU҅vҗCtߘ6IrT:c.$$p닖Klg|fuL8P-vajavl6]q]%$vz<0{7p)z>7|M?[.#2Vb K{Dܰ]jDpidFk`-U=`zs>&ba&E'IZPCoNjasȺ-j`G!aC~L``#7pi̢OJUwnj!l_d]ch μsG.㯆Wk+}- 9<6..7 6Q!Yd#Ԑ{J᷃f+j24@:M]m9yeiֲYa:紒5\p[ּ52gX'*A]V`IF蝵E>|sӐB48R0 I}P̨Ow_HVZXWd8m\Jʍ0JZ"F lshÿ@m#m34KΐFR@(O0)ٍF!4! ?(1z, Gv|0rNi>c$;5&$JO" VL<\ EJyڒh{gTb*Z(t" }U Ӱ84pJSšC/;Xu=v/[L(sgx@Un"6n*P-|Re N v0!y;r(!ۃ55^yTF@]%1Ú=f¢IY5-$C6̃cjܩȇl}Frv޴% ȵ ,+ߗR-?2m{(1eQ?#uֱځbS_2"#{xH fP̞E`Ti%9NtNFE ,0W51]?̕Ym!&BpQRUѻ=P8gLY'n[+K]* FRݷo S#g_nbOwpVE(|8팭O Wny(\ӤˢS|ůx\p֥l<Y 8J ʁQP\]w@VV05pvI/ 魰;(RRL+r{'DF!T~s,R- wqAh. (8A6( 3v <`1]Nʈ4ۗ ::^L,W[R=\9䞑Τ'S"EPX p+^F/RSUxa=.i ~)oo X]6.%nLSclb}C7i',nFv`h@NI>ty .['1zi=?P/Q3%ot; y,* \8[|1 p `n+5E f94H$>) ,botjm7WNQY0ɮbF0S eF8m{oU/ N )_Qx^sZS$*>!d~5x*Ӂ4 TB}JU|#Okr(XQ, YJ(dAP^cѡDbͻt c^a`C4X'hҴO/PJp<(znO0mbmf/vD?D.z}!Fvm-ѯEjmV0է%pV2a ~ 9jx$u~AܚWژTMYcf1n/p aQ-oVk~eVt6q%=jD",K[[;-ɽ5%v'Lv Pbd:HY vy<9 Vg{VY#AV[W:k*^Q( O%Ke=]PzT1jIX~;V_E}3O1ӌStki#&+,Ltc=Z_.g.hZ5J>jN7@fz1qQp!2 ĤzqIO3Q-ʬ U6*{Tb+ǼAI %# TMZ 5|9? 2hՙ"^$a;;/<#̭ʇBTT`<^(t1+$x+H\2*\:k4 VǷi&pSKTێX ˲BP ۋqg鳺p_yp ̑pFOcuS *a>oS6u=8pO`UkxKw_~k|u8K=BY_y'RɶSc oJqWmԸᄋgC@"Z&X720/~/Lg P$' X!}ՖphY ~hʄf4>b/ =I=^y/9kSǜhr3}Ւ7jQQJ ZCRz'3 ц2>{{%wϩa!8``IJ{+Y&Ki֠EwCypCľa)/c3C.p=VYvr}`D3YmiAQdy=!wՌKS>龇hlӶs!B[ ɼiw o:4?ݴxA/qП> h2Ur0+UG% p*kS{tKQ% Bvnnas eaN%GP(3ȨЖpzRZlrgv\mCSA]My" 0 c^eM@#{hLyUN ワď0|&H|o@`RHS#$ݓg>փhѯt(g~US|*w@At,.Ԓ>iZ$v|N]ѫ|b☽!/kp{ RM79ޞ_x(O.97^JOϯQbavΔ\b*p%,+}  g͌^(^BkLP=juՉlcq ]-v=}t ՙR!j5eΨ>H9Jn~͊Ц ;ʚWPC>m֢8bR гtj ٍF!evRӸ 27G'㓂+nmc1Sϳn?GdK]-AJ߯fnY E(Aŷo^58E[Jj↼. |;R 䟔 ^,ASvOF *x`~mV n͇<62XMZ-)jϭsϢ}%d͑%Ѿ#v=8=CE([C3;1:$0O$7cl<[i6Jg > y2g>CvQ4|ɟ9ȀY> *a45Iqv$eT\76+XBC9<3 *g+3ˏK!gϞ\CqJi4F6 cQ$@R(`oE9S7!bm"]Go6Nc4T#OL\1C@<:lz8#[Խ- A v)6e sFe:N::j$&&M4uN%P)'%$?Ҩb${ OxJ& ros[ZP"Y3e XX# <#GOT!q'}cAAA" ZV*&(3qo$sDCmc7cl`tTy$H FF-}(/!?oYŀ1S?dg:yE:WnR[Ѝ6gL8M(]$U3K"91IQ=UG2l~a <x-E{sRw!ay0d8lߑBA S~,Oʑb=CEDD%Ѫfj:kS\bPvTeFEŌ"*av ? >ıʼnB xJB*=-UE̯xEGEuwlbW7TPSS6ᕜ9!~^kItqkJ,F!t8v12x;`}6U>/B 5Ȼ sńqx6xX.]d"tX#;} ѡ+ dL+ĵYyZ >Sh!Eya |aś2 NJ$ϝ?~ 9l2KL:wb}@Ւg ^wz&%VVA/Bo肴Kvͽ7Ks],>iZ7#'T́Wl>R=S7~`:Q7x:" uL=W  9ߧp!֦zLgf\ FF\aŰ8V \0tp <Rv#5ʆ`0sP{P\(Vg4 ~!7XE_,b}q]0;ASڶ²`"B{O%XfE-͸^xlyCSLAi| ]Qmy 4 |~alc яsZ\v,]G37ݮ}JE,wbU%)H?S%H w0P0a:6Qz:Se)4u ;AOm~)yXTNRb~0sr'@~@zmI f_;_/q6gNRz 7;[T9]:6oz.XTձlss7Srѐ1kO=|7{m];>t,T@VW  LRom"8SI(m61b6l#ְvJs?4sr xǣG6\;%r וFݚl:h",2!.(=89|9w#>eR%N ћ; lCϻ-?whnT$xpDܫZر?:A!b;ߔi`!\B`%(>sJ@k҄ @qa asj!JXl$\#1vk1o1s1yXETy1"TՇ iիFҟFvmaqAT$07+,( jT:qBRA:.gBAv<R4K\ţXW6œ Z|A,aװEn]ѕ\[]G+}yR׃<UlA +It }ibYLp)USC&eRc+;VD&)ve%h9]UUm`=ƚ ~:to;86,8GHY5{W(/B3s^ Zߎ_2M7J\cӖ@&+4^7Mp@aicHάUDHFxΚ3ZHvL{Iw&1]>?V")kPV{ЁX5bEK:6Ŏqj>^8MDFTiǍ6HOȤܢ(خcY'|,"IAyPdhzE;.覵anQnt.</b4'IvT=+k&h.(lC8qvUu0g ΂.p#/9. D$f)(oMe3'Tݲ!L|W574[WLPEaTq89!KS>8 $1+!?>ҽem<0e0uJCPx[P6 s: Z8-]hô.[w _:i;H\M%vUb+&. wГqw6?,t7-+YkM;Mj 4op#j5z{}+ޝm4 RTU_xl<&uW 7N{ i @a R"mP3'~FPB;p@_K^BsDā5lדBȿ ǕJ?I&5XgPqc0 _0+@KheRAeftJ լ8w/"rƮ5[P\{ mކ~ԥf*):e ]$m(ox|f _HrSp_]?[bQ^ga+U_f(@[e;X6XOi><2Ct0NN!+B8J%>s7riQl*{ q:ޓb9vD)G9hQI(jl?Kнv\-L[l Ic饴Xeмuoi;^nO0)b LLotTn'?W򢅴 uH bHmp% ӹAMs, 2S2f&Uٰchwk&bY19,y~δmDϾ2gO]`ǠV FF̿xX݊3IOKVW4{ نoHV$ef1KE󶍭pzzE $+65Kna S/P,2I =H+j/;STuG'u-ԫp5~l=KOBsjVsDV: N\UI寒dfOdۭ2*ߚV|q5eaiuD#|p t.vN^K pV9A;[o+$2sM,,Rs AMWI7wҫnO/-DBhJ j51$io>>sXa:$X 7 YǺ$/䔠b8I X!XG/L8$nfGeIL6|Y7N">c-/H}~TDﵗJ<`oD:֐6NKQcI r'?@[>:~aP31}k=ߡ}k'Q/VU<'>U&NU1lIaLM/vts*f1t=Qtf߃$!^j5) I&I4M.:@+~.ƇXDrC<_CE)@fiKqNSBрR[(waqc*NY_ymD]4bwkgM=N`AeR2} g#|L8:PEَ[la9^n4LuAz7|p9CL˰]Ƴ 3nEB '2:†_ᵴ?sJ7FRQӘSչ8 ,IwB9tZ@oOX"FvI Bnp%E~#~*h-)lͱY8q/ Mc~&W E=X 'g(كM~{!W;wdkh숮a#?2O?yXSN O7 E=8[A'w܋!W^6|@Uy}s!' "PeW/\-cy4-_vƳ3˒ȬSyoRVg7}*8bK,_t5ۆkt/!;G5p P@fvA< u'엿z?Ep8dYAx]piYQkqwcwQMe/U4Ih4 K8 \Ŗ- 2ˮ]l&XlLJٰF&F)~[6KdF (4x])ZyE10*D:nT yȳ$?xJ1g -tB -(Y[:LJ_am+rwlHP>uXQQŋW=I_ e|H"~-fwwq8dg ueZ{dJ&Wj 7J\STFY}4b":;u2ꬱxIOW7F2#{7$nYHQPvӵ33>X;QgzeR LX=Q%Yz9qz?cD%4UH:5'KsQe7( %sbwkPde3 X%@pIWJ`l{b5ZzYFpOМxDE^5Ʃ7VqgvuH;9昛}4*tmalc@4]q),5n`D1rEȐYݻRI(~R_ \~^U9IT̞%~Z:jԓ+2em(_.Ϻ|fA# q9Ei`- pbEhL/LFA/]q,u"6M Rх˞̦78Ǧr6Rl%%6jm<º=^ATpSia? d?y@}rq ;wB>X><kTZ@itiGK3xM8⌌>v_]bŃop4qK&>>McmT''ٰ$ Q$V C@4 kq= __s;TS!u}:}Z*{bs2rҺosuE 9T' ,Wb@eBo)T:|(oy:IGo(2錂)رF:m5 :#d3mY" B .9 Y>zN `l"ID1B[Ox|TBGSM)HI;{42=)똆H@0'_GI\ynzr f^|e> C~$ j~ YIEQqdJ謚aduϫ;1އxr\n6C8>f]f*l:3-7\?@І"}Q=LBL3$ kUI1飡< !GN l#je@Nj1uRvePvM];Q U߲dy uIn[°#4%{U5=X!<-ĨQqqRv) {{7o{.5,8A +9FZkZ7[NYClba8[6`)K0YoumyC$~rp|ɖJ܅TFFG75 S(,#5l<'qy+"i?3NBNPqyRO#2}wi_:%q!fݒƙ/XnR"^^mC _ܛET !lmM.+Yဏq):ϩ+Ip)r` ^4as"dLsATi9zU[yU|}*|\59i= )d6ǯv0z"dR#ȑHQyvshV[ܪd~΋L@PՒt;ڶ .Г?X"Knvm9ݝe7͵f+fIYcnChSPEO%Hd0 /S7j.{eLnDw' 0G!b q.mg ".D1,XVHoCW{Ƿph1y^+(G絊z<)C?gv!_W:5cIXG6]=`ض2\M|p:8J.KbS**9E7VUE~vlyn'=chFԋN+j}sFQbsz`ɾ`^@"iZ$wTg^!o>*NujzU3s낸%Q''P"nč^vЕpX,~PGA Q9K'!b-BK-4ͺd97r/u>@oS& K[~rpͪ8RQq3۔Ɗ^=+r%es&ϯ4&X> JF܀-s6kq-빫QvUf$TKv2+BtDlGU+?rZis _:Zi;:s0U) .xH@NHoJYv:OX_9'd[G3/9<Ͼ{mgHz' 8-$T=0;ěqP;dcI)j {N @K7_#L9q`ȡ1%>,Ӧ]Y[` -o}*n79:g‡&X1r5= SVX}U-._ %]A:;Dm=m#JCRiܽ1kO]}l[O8g CII=W:X⾶bB+,63iɁj9T窧U=Ee6b; Rf%{#"H,+šqhP߿ڜ@ĕ_ItǻUUHHeO3 ٪]0pYZ-SжłpU>I[K:շ79e8!u Y.ŊW!6DTc>޴an5s$ƳGrה 4 jԔl)=Un BMn|5ir Ѯ}!!dDE|̿}*|{M=%kg,u?*lwkˮu;xǻ BW2(-v[q˝3%:B2>TI~%anOXs=e7N!Ľz~; ݚ#f)*&O( xaҰ=S$iqLv(`P=㫬=9Q|g^k<)'Puo,Y1cܠa˜t,|%K%_l`*|3͘ ʇ`OO*kRya9&"3@2t~ ]MinRS$ О 5vrww0Ѭ|Iތ$H\iM>AЏ%N5hLbOGK0=ZB!dply:IJ}lz:_dqf QIN ĂH洙^" !†QNHryrhTSs ijML$B>> |Z=]NEPhԫo{I3-Asؔ!pb1Rlj%~+Mѐ>瓎t oy`v+6q>jo̍p^zRkWmTIdȰF#.؛նg@aeD*Y:TI}\`qǤxK<+i!*Jfь%C$2}ƶA<^1:dMܿŹ:|zZw;ɤ-B̞ͥ=;. p|KJE\\g?zmk:sj'CuK@Nջ[u:AJ>|,)qjK] -D!IiGWidhH)Pj}a 'qA}-3#xY\]5~N~zZ 4d+}e3"~80N F3jAXC$7ap'Q t/N#ppUmYI'DzENnn6Uړ{y 1c'ug[ڊIegZԆVOIZÖj65ZKzx﮶R3R֣Q$vM:b*w"j!ӋYy[9?XY9ݨm{Fj֦;m>XzVg-\(@=.W.[F1t4;MHKhhvHAA\JHS&{9;,Y!(-kzԶt0]^Mk Lu* An:n?SFydt [ܣwi=tpG;ľ*݄66,0IboKܟm(QV /)뢻k`Y-Nq+`Shr6_]<<~ :#KE刭m@t}.hZ*?N:}ܖ~NS ḼeOKP Tߩ;VlֹU60Iy6xW B#X-Q>8>ç A 9jm xsbc30 O'iWc2Jo3 mh ,SUMۃ^qF鶃;#G s˦"}zBBP`eD61l+=?ZJa[0 ܝ>OhE:͡d'zOp"-3G2(j+u3'xqU?91"jh4/OE`,vd|PMGi,1MrDdͳ#,KطhYpB@ӄ ooA1銱r=bJc&.w{@k[tV u!Їe6EO(DiHf#Эn(aߠ"Pw5g HY p++IeҪ7y):ZM ?i#6+GcA'ixЁk 4^ _{ɦIRJN :vkl(*\O cℽWɅUI]ɐP_ @,2Ab@ Quሑrݯ6'գb3<E=m-fʐ* m'4F{mxG|vjyC{69ID?vnec3RU=IȄϐ\'S{"z]z!zi¬L;%ݓd,Y2 DA VUM1w{oiGj^2EʘJFs[]Rl hg)j헌 ?\]ٗvo M: N;ǣ}VoKUu?@C O/r&xu%tZ9N^=vBΌPb>"r,4J)'3f]ؖ*ɵIl iބE'b9`#[:\?9r&/.5Orè|} uy 'jmsU׽O rpTQHOޝ8ok%sqdJ"={Jlv(ot r-*a  V,8CEx׾TM6M[]aRd4pNⰌt b~(0&wbIӟ(f5U`lk{jG:窝2D^"e gOyJ^UuSg_]{\[ߎCh 3jriCP8M}]`}tk}C[66RN.;{v5@p7'fi#h!*R!j,}BmcG]!W!DS^+p!lmg N O쑨, npK:E$QӿZz8Uņ; '"ɑif$hYYĂڹސMsZϮ#WVe]܇r i1ra 'ac*Lf΄ zٺ9@AnJgw>Әbۙ=FDerOҰ kV4堹s 81&q*xhIi\Oee-*~/"";aղض=`lSRD"hg6T V՞SWo8!%JIQv˙ֶeq.*t|g"R3.c>RmaV:0C(SdB))؀Y%bs{hKjݾVK)w3sTR1YIn(i3o)0LE2ҘA0a^#Ѓ|K]sƻW'Op0 'zMLWiYՂH m"z@_ ]Y4k:> -^owڛ5\1~+8L&yM;8HfZZѩ߮Z)hX1riԱr .@mr80\ ]5B=juth&~fq$6q'+@E3zj>h0g-#95U3+c1-w@:*$J"w+GwZUђWoAa$hC5Wc;K^V|J,+tep@,0F C|!s%3l9H`Gߐ@cAt΄T]_N!Z29*JTqZ:9JBG )՟1-?"4[o/ߤ d˴5BiXb<ذb=4YPSۺg3"{5* z(P#*R ł4PS[8*!mx dǸw :=kj ]Cx2[{/OWtđkr@jӲdG G|~,C|8D,򗽥 sԙz']G)~wWrIPց)hk"s3VH@9QE\}0]fSTȄ=,w3V$d^\<8pX߳ry  ٤yAyW~8.3A7D ]9Mɫi&xH(Hr0dĕ_~?`4(S-'vstS@ʯNbMcZ b:ߺaDǭ;MM\ty!ܱtW[@R0C[)D'Ux%`GFp= ;Dۿsڱ-w:uKΉu *H`tove^wcn˭P\+٠Xߎ"ر6,.t9҉2pNRNkN!g6=ZI\b\jnp/яVM2eHDSBqD mT%e|svs% 3NYfRu>JNB7[ҎY5 . Yٙ7h.j2wņb,qYuK,H`R%pN8ݘ\U3fA;Ù0`^+~FGֹ-ܑճcѝD Ⱪ e,`&`H|BvKq />@'cQ^Q>S$mc)rB:P(\)6ܤ,=#.IbOO$>oSj&-|i=Y6ǯv6Fk2D,lIɐfd*Va#Uk![87g!M @*vEG*o&_ז+ڌQb^1_|ۻyRP.cM) i "MGK;0͇W^#8r5z1uwV+}s *nj$ږD&*G1H~ *\^4UF+~;{t?NyW4h n@9&ut 3}e'E f&b,/YGu%zΕfس9ۘȨoNrBӁ{McsbC$agg&)4ײ0[2cOu۰P尋_]gsg\Bb7{0 P\6*8zS_b)cZ"v͜Zx'Xy[R{KupG\ժ3B,cYB'䁁疴 #]4x'M4 Ke),~cT]QT?(rjXo-0&r-ZC1mq֗,'v=۴)~Uow-Pqq1.{8KőiWL<&̢w8x_k(C_~I~b/ؖ)†|$}kI75c?r%|ݎ{_8_Hg]2RVLZ(YƜѱ2ooh3dwR@ Vޒ:>aTGpf_xh$ϋ_x-`fd= XG"ˈ <;U@UtuK5]> 6 ` *}{kU'rӋҽ1Y&9( P_~#Lv+9 7O8~cx0}\;$q=})nW dYP@YL`"6#u.~'xdy*}!@1EeNu_%wN0kX JW0g̐Rv9[BG5E "d32*b}A?h+X?\B BZg9sMcrNrDneqM Lߐ6N͉B|5ZZNx!:V%xY|bQ+3 Mө/ԯM~=T7KK BoNQq.6$VM58F5ci,ʨcXM4i$\{i3D7ithf{@1`aJt##0k}`Mv)hBIY歵ʛ-GR<*HɴPuIT 9pt7`Tij.Ne}R?#|\ֱdqmYuqͳ.brHYӺQ65\B$ΖxW78t)1dUHpȿi 6Tġ?+Kp+"}yoDy{d}ˁ{ FA aD&WK"P_ ]4"]$쑩O5$Hx3Ka,Zz. ؔ_軪۳wh[mpʣ$,U1~~5%]OPYo =V%v}ݏy{;Oّa*_aq-1ֹ9'C)_mzM>8e6Fql+E=Ee;TG{8F.U7kCdu&~${r#c\ٝaK6ظ Jل#T 1vB\Cc1\_E85& ߁:0tP ^⬡@Խr\\QOgq  ; / OR7f.[rJT.> f 2s=O zVoN]Q6ZSy};3}[#ZLU+śG<AGh3C0C` !mWLg9NC|DZ.W&9/LUDV>[}rP0[Y6$G@YPqL9brd"ܤtf+!u.%& L&QM#|H6a ^^I!aQXr zVI쵦]~< VN~Ul;T+miUx1kçX;%@iKjiBNp +@6nqvT}uu Xwr6P(ݨЍp:֙P-wEWV+Rݸ/|#=ݾξзG 90CM1{F$(`3jl .Cu`pgrЁ+13+ۖM6oluTɀ)isʸ%ryo4L6^_6G e/ĨQбsOѢ(|_.cyNyq:X5ta֥Qu8 ͓LpMTno()#O2'"vU\PX<$#`XԊ~i{ #p}-3XGi΀c{H$f:sUnC?m\׳~4wҡqhm]9ӤR:l &XNTu-EZno_yRg3fb&o@I:V|2_>\L !e@B|>R~>E!r}_*tbƊOq/c&mDƞ5 ypE(ꌞ:cH8Ȑ½P0ㄋA0K7`X+? wO7 g /u$?,>G.\EZZ.Iꎾ#Tx2;*Gw!(~(o@?ʗIvl1dkU$B4S3f(n&s$UNhT{㸦i n?bdt.]7 2@Ĺ~nK*7 FZ˗J̰ "cA3X!ۄ`bZl.^萮!D 3l6PǠ|m(pQaIt p,:q5-"ܠ,+ڻ?uGWuAza4 t ,+vS؞&5Kc۹=|{,r^C-1qAN _B T5IMpAO'%( \:di'ʌ8cДXZn}TRkvY޳pExdڣ oQۗ@<Ӈ~ ^RJYp#޻ DN* 3tdA2aCpSS= +/ 92@ X+(czзHpfD-5G+>=~)7&H \ZnR,sE  -( 8'KWoG69'*ep8*] L캸QJ)?ErNq&-1Cf8Q,*a9!T,QtY\NAL:X$STO]݋6gË;g& ck ǽ XI‰..%x݌XRHuFC?p{s]邬)7 ]VP98ߨGs~h&F5'ù _BBQKN; ڒcy$QnOR tMz@zn_Qpo-`I#M*Ej+Ec=FX:4zA/q9VCOU_xU5 `ds742nRسtX}U_b z[eEOm^?J* YDqw-|&X MZ_vE?{mOUmh+h(i_={'هSl.Fr ulQQieξ7y7NԄWv~^-&v~>SUd^ nr}l?I<7W4X=4=D -?3S&fwDʋ )8;1_+*@ dI6o8 @i {MuKfI8Yeݯr0-&|n!kQHȼn7n,Y䫪n뺹`]NT[YJI>dόUKSäȘ#p >Nys)sX[w7AwfoY͖۔Nq7[@2`IH2`* Rvȿ- ֎zzKjكLzcJ~P.@O݊\KK[c)~ET$>~Λ  E(yP1nԮXDS}a7#^G?,CשT j4%UZzSN7P+BJ?`*uӄgX';!&UrK~0]qŠZĦ,:gWޮ-5FsO%~6ЩBWuZC%a|z- nks;fu8X`,ۦU) @'=ҢfY&\ vvLj/B2gAEa~CWy`|p_ k9T{ ?:DxqDP^|ep ب_x+;آɭDfs#1*7&~Jw݆l'w jmޞx*x0MvAfox7)XфOtytIOk&Qs z+p[tG\__5ǒ+0h%h)Vwa _:z+K:S/AwN/Srr9sG^I fO,}cv>R,Y6LVM8s [eQ3HvN_.PA.j#AS5>-0=%tBf3D3@}>~lRUIhn2}z(\6>Q9FςcEu021$?c2&Pq`%$ѫmNQ~ )[u,vة L9L$cUPM3-Xgdo.̷(x0&'c1:DUO#\"Cy3> /x?K4}4]\ؔ.HXBBPٍ uwGkYbOtBvۉ]Rg3 9b} &"ėFe$|:!{Z_zW˽dݩ׸qI엾>)e;w77\HqA"FjMj1䉈U0N*nd~ÂLOŊ(a#EW$q; po]c8yԀ?tك&(m>,\CLO(w-HaV6 L>S8-,OFE(#w&Bŧ)kp`3AKgB5A݆X3lZP_Iߘƍ]&V~3djT 5픫F۷WLiy^p^O" pGdFt)w-ٰI=f'Kc25|/7N^qZ~r)VQ! C▢K,2,\\;[ ߩ}eALI9Llou d ډsVN )^4m zG8N% - )lyl_-pYw+:Sis%R 5:ֺɞs]]RHiTFɟh[%nĝP0VSp'+q}Q<ѽcUǗK%;f-~Z~oseQ[_/8߈z/)is{?.5{.='cے_NuT J$UBgprr@']bIᴢ#  S~)A)ܐY܍"7 Dޣ\y.2KD~[^T=gYM!ۅyE~׫>eԸs/jVa'vp5AKF 0 :tMجV"aYO lH] M+RQFziC1קwwCbzM;v9ajp%!o=a7tN+8~nz7D|s%7Az7/uQЪC~S?B*`kW\q"֨jqmb#3WW= @;} _VnϮSad3jW_{4Tsšx&b:kz 8 }%8i*c?0Yo#3qB!<dyV!)m: 1|a.o GU&mf0 NE  Q/,8%*- Ԓa*j}R#;Y/ʯ'r s>[.mfE7rx=P8&]*`̐a=H,bA:Fk6Ȋ|w܉֪kEt1XDt3ǩ扁7O@xw }/'41R~[ֵP&VhDOy@qΖ/`UBZw[yx>@,Fa}u2e<<""> @lxY҂z˰T&B-9flGk˫a}e?In7e/Wg[,,6{ݫ}禈sES^F&sإlx"P"԰,bwf-SQ'(:c C>kxB Wrek4I֡l|Vz9TtKqy)yר|][x!~?Z|6`{"(gOX ^v"/F1&B-vؖ)Ww3W.E>zH {J\€V&ѳ>1t3c` X(V T7gPv yI1TvQoX_ni-'is5]텊B5{ϛb\8"r;*,&҃SF釱ioA)%}_b=߻5bd҂8lYۙUR*=BUz!7DzT<< FXmdw8#է>z1EpdWL~kwi7>;^H> ~fu1xhG0U^wZqe)4]MN ^,av':7gۇ.a)( S%xE82:lεPb5U t5ېnRH,u _4J |+kSE8Y-Aז%|3 *PBbSʃBo&c&|9+e` OIIuo}b MR\<%n17c88r64͹'xi?e#6 lH)E(*{48uEpc5׉H!Cj:a_aԎy|q}jB* "d,ֹӸX|eНbڙĘJv5A-t[JH*~%4K X`l]7*{璸?v]fD\Mq))K+? AqpѹxO'BUc6@bZ Zm1d SCgqѫl6#ʻӯ~#Fx<tQ2b'Jz~ur4LwH!%I6hYä? ox_/0^)N{ z箧OZحI<0Kg,\ee '{*g0ùɷ=wSaѴ'vGAy(>w݆J7=kݑݳ&_cpM]C+B9,1) *Z0P%Wc83!߹`E~2fr+{-NV?N. 2Bwb/E)Yt%g<^7^SC7 r|-ڠߘ} eVD^F7.yH,U{j1Gm&CQfysĬK""(Q)[cdd.giKg3d#{NG>;;r)y9ЯFC~ %_뺂L aeMB"Վ]㇣^h:L&1ɲM 0*)GG3x:yȍON7&Qg1SY-77;Gs͓Xu2tgM;۟f-PxS[k (j| i< 9f/wM1ɣ/z Q]B v Ryղ Q Zs>N k~R;t|Z'zLY,~'P(פ`-s-RǼs}Uj2ʮQ$܍I1rIVl?I36]#~d$8 t +~Ojֽ}kC͏P DWXֆSm<^rF&l5)$~жI mqy<ܜv k]ZAi Pv؃| o<ǔyԾϜNtZMucc{W2[x˨~&W5ɞNd7 HyLvx{YHo3* qQz1=;~獋t۫xǾE ʂGr($k,dx LFr6NWi~~$b5Ooiώʎ,+!ޟ~E; &pyS~e 2Ȼ[J~4໥9K*0 ,u2NHX0ensOֳ0;]0C88T|*U.B${u4xǾu3X$~&AǓߘ—qtՌA[ o1-0<.!ypokx'yt<0mE UܠIMHgַQ,pg *ZI㿼tOffޝ*=;܌SiV|}=)I+yAi_F*=oz_ad\!FA SqӴ 9|}_MǐV c/|$]G=ţ6p^AO1>a(QCӂ2-Y]]LN; s$bꦹfގQ~Our;R2[ F7?[ ̱'K5 %ԡo77U̐rM1*dd, g)Ifnw~c`Gjn13ǂis),3fBOݏʂ_mT7PQ+3sZ jHR0d2j]gAdq%v&ݳ)mAøg]X TE5U]1nC ).ʭ.fI>0s6u1RS}?8oC%ˡZc7y-8 +ReSY]a,o K(v(:TcOwz)g{ܲW2W$(=dzއJ$ZmiϜ:C[4Cc.nI,[V˒rbʏ|)YEr7IQ< d .Z4]P հZ:rrY7֔^ҹ|?PU eŬxȤO؎6 @zpWdg3zЗW$J,걱W"iE<hdC*eqLk#<, d K0^Q O_M,Eɧsr wR[FSzϝ {џ=xm J+pckn(<CM_ĐhЋF:)7B<~7-G /+8V+AWn'4?%4l1F0艹BHkX=.$FPf )&p ;mœ/ѓݐv,4w"7='Ճ5^Te,D:}eq=Iu,Mϋ _Nr1٥T)0|A8\Q=uc̀a_Ol|Iq.0GQsmld!C/ o />OOy>@V(gaTWAMS #!;"s=X AukдDlCw+O[ 0 >[=#0*pQ^6_.3Gs'ʺn9QZl|ٲ0X dLƷPIi)U+z1ؒs'zds5A>ɿXE}~kğZtP'<%o׍| i2,&4ح1>8DH|jfdZ LJ-LZzƟJvsQ͢6eaP 8&a!O I,BEp7>H{6(ĺ3g4;g:4[;9\!] EivIȠM/;2_?@D8HOڵKgn{ymZRzsʣ ěSk{:#j{98C{ki9Þ j݋Q%Q}0*IK}[2\"U-K#Z3a2X 1f7,-}{ioηTOh}0R_0]XF)ЂVH[(|ϒZ:X_ɺ۴JU+4aV %MCb?/#YM@t9hW424(]f p?Tbކb^G/)C>FZUJbh`o~ ,I$.2ԱDUxq-->pOL.-kb8B7*LDN TrqoN !7&{9mӫH 7Ny0䛠a&改J[YEH['wL~mf6$%UJeIz<L`9FzX߮`.tsv"64HZAa#fZ, LYEϗzޮ6QHt>L<`lQUh'͹Q!ҏUwׯ3Z9e-g Q<&DoeUkȕABWʀ/B)uywzCe׬;HH$X~;[xdځƏESdAt)@bÖ²' 2,8ۅDWW3wpgNœI9x٧$ۦ7ťrFl,YP4vZyʊ'gAe6jps97բG\ߜ ճ 5JJmBKg>6nW?,XBAkvm_3s&-$-zȔNGnB}G.쁇׳l͢f&`\]ֿq&|4QMZ*GW?D^a瓸U4Vz 0"Is([Sa:yrG™gX9^S0[eLxo"n{I S[~_5Kk~9M-滣{3_G˪E,8*+fndj-!Q@WѐҨ5orڄ ܋1`퍦*?R牎"H.F;` F&6F;F0^z5E?4HC P)^YenoN&**p䵠DQ1|U񎭸#y6KN"+J;g[:9"ެc]b-C2|WǗ/`x=E-9N<3S .h4oCYx9 \e)S|hlt d#qkÈdKJUTcUS}!-ܗHneף/Y2l9N ی X`<_9B 5& $ϧyYQƂFmr) a:|NxE}{ eCeS5 6aKtGUSS&p4Q2/|MFw돜zvS‚z~B&ĺp.E{C V/E+ Hmvɛ JD?BaGRnXO˞`&@s s(,*4͔JxIgu/)/[Zo)[U\U9K# Q6wȨmOR9ťƕI9N~dM/#:Că4Y}۾ء\ۮT0~8L.]$烈#YVlOjא}E͐aNj=fΛ;8{DәZZJ(6Uz 8Sk +z8}?W S*Wo牗9)G#Ip:T'fdLjC=WUwgh?T<>kՒ:-K&,m[M:i <>_it-Ni)̧ba*{q"DEO,Z2R wpR?Zvޟˣ1ϛ%6٦]&Ue*(5xhPN`qMRt#IV ^L]<CK]]| MK5o4:??2Y-~Z1  #pII[%m_I&g:b p.jWN /-yg!jWt=MR"et4= .1< v?jdm5ɔ.Y7~E G~B r+ɬt JW1 }aD_9 IL#]5ӡo"BX}akƞ̰JOFoÆHo[RڎvYi7g["G639]0yjTNްh'Gx`($ʂK^ rP\L0z=*~g%qjf{rU0X@ĨwkBwmڪo8ڑ'Fˀ)UV8sQ7(r9K, !v%Ǹ)[21S9K/H!:n0ҠF{c?6=ͪ*}JuH/d+Ca`hO@{\J Hݤ.Ey'ZjzG|M9^^cTRk{`#ȹl|4Tx,61/}vUe*\ eQa ie:' >72 # (Cy_Ri#@$Z%T&GBqt2?si)5~vu(ELސcda8RB$I'<P}瘶KJ-iU`k(F UazJeZP$XNdvn043ţ_{ye<=lJTxz<`i6(Ba,nyv@ x0H=DC,r}?Vm>$̠MFEVYsCQ0cmR4Ԥs })EZٱVuU XAo#׬t‹oHWESߊ1I32M= AR&!,P9$fy-3{ŦNL{0~ GSNXƤX0omW ;tGm Ы4Tx?N \8&#\C9Qݶ0rXPlW 򹼉EveTu*s+ܾ"4Sr80x64[O>EK&wBxT >҂ ΋OrOӽk_u,70m0J]Ξoh^8O46oⳜ"X"/|}`P.#VՍB|&JKs$CCAujdgsOXEs aOuq_\l7d^1̀I0h1;=qGFFF>vﻌ.H2VeowՐqX_9=(|52#,rϽ MsJ_|R\pX'+nUbnOņ^Z7-fg 3<F4Od6s" 4@(1oen6s)W֊ s**C ݱ' w;:NZ4yײx<1! 67ش'TG|{rDl}磂~~ 3RWScz[6 ,w:@ C⛠eUtsiUTH,¤RP|թ>JO#% 81ۅ;Od<[Kɯl$l?Hy[dKOh3( :R׈x?rgٳ&)){P]6QsfmʢףJ[~8q SQ?2Vڄx0cB*DsnQwnT`L>@_'[nIJiX!G+]̞P) q(2>#^EE?S8"K2e8r@=Zչc8BߠQf~TVScK5W;x8 ~;eE3g+Ev38V PQiHl9+A&'ՇJw[M -[|;)T PC$M56Jk׀}n<:DCg>=? {'-pt iTTfqf@iTR;0+)^xLܼ뵁@#7TB;J O)hu"Z:cWݾ uIhG\>A0o[_?(Yu9WN~۩gFgmH(86 `[P0Fph%[=3"2J(yDlE^ȜᐝìE^[]h:q ,O Ms29AxIseF6v p`tJ7~ظ]^; a;?rģVf#s};mU&HkJ @N9=N[!e2}14lF6tW0`0u.uEvW`|34m`MH-PD@^ .()[RZp %bߋco'L-PU3b2f$ꈝ($ǫMNt#ý"f}6١JεrճH/ HĬDz*85jPAbkNĥ6WwfldDcUz\пc$ y:케;t 9hi\gחV0MhΡNz+-N:g}uۆ0&%7+5Y>CC HjZrWFF+dzs6ң@th-h݈T #R pŹX@#H n::]}X5淌N??V4b2 `N{{VZ{%,Dk ¾T gBPvOVßU哪860YP{ggOD*d}Kܷ.Қm :chQO xEBΫpU`[Ѫ5M7)<u1֐^ U*&KTHE$ƋW TuQ3[JJ$os^7uF)=[ι=G{iQr\ $wK\T$ Σ3P[Zf"RNTK邖o%gm#fZOCX,"x97\fI%Y&)~㒟tl5%&I6frJAKt RLOf}c!z,p_:N_y8Y ObNAUF!b֩Jr~u83jFu{VPRo_:-zLuEH>ގ"8i~wԭ7?*8L,@dXEMԴ?07Om)YH툵bY6`V<\}J?^u[ER3\`v%Ƞ|bM07Vgfܜ+ԊG^v@>MVCpE {hVR`=Ld߱ۅj/"w)}ͬA%Aoǎ`Gnm`#h~lsbJEӫ@sD3좳 d/ @~kjSʚ"jdmI?fDzcDN'RY\ 2zY}9`i֡#K>Nҭ%ߤy#:٭dvw[mp8]}vR9;kn\2U6^TQ}辨I"T"dU jH,: ,6c_{A#dB Cب@ =J ݮg42y oۀ\aDlDo^r< sTD&HmpB> m]~kD"|;}pV=DTrYݕ>4FI·Փ=` چ#`'3%ivGo[^0\„P~u3>N>hEubQLQJ 7q %-wN~)]GG pؓ, 2տs:Z,H in e{:sɻ$PN>"VΎ&W]֬IX1xK(s:D?NseGʱ,QdI%>Ho%"ѯaXNZܨNj=b-!ͻVAsse\F`'13 e2iu1Kxus ͰA<ШQGxS€FMme`1ܗ--FmdU+;^ꘔ;S 1Vc~|+w9]!ՠt (VPܤ CPs!f }`]|M= ήY -$i.yF7\гQm$DFdviJz x)3_l~^P 5AS\SXlO-4w܍#lX  uԪѢz`}PHF)gN1NBvtJ}X<&!+Rv=y26OfE ZGMm8vAHU$Vg<3F?GNG +4xfg測pNXA_<dgn33]p KG+ 0R5c}jÜ=A\aI̬s̈́|0p{Z'H!eO_PNxfHZkx>ٸt嚮̽~o1z7{bF v!Mar ^ ahJ/ڲ2~\8&E<%h\爘#;[΃5ٱ"ۂO h`-?0p&E5`aڃtl!dPpMHjT!lVtVtPc.Y0Q;!u3A(a`&tvMxYYţEVoBf܎sjcT&h(]la`?~LN~݊x8RiQ+-w"္}6yK"l%ňoY ˌAL!&Trek˾@dłSml C묞mk Լ~S,OQ) |4% }r 3S{ϩ|PaȻ-o底;G`Vxp?P$|mGA]^I" `ܵ9;ѬWf0kDR *P`@{֌!Y-$iyr61s[5MnTAEj%{նois3/.EC.J #,ͻ[̹P٫@9<#5x-8#T  0 (/ ==,ԭhds$2uxѱFCe1jEpLRxTdJ[D ڻ|S$kKҺjNi*s?6Uv, c=8D.*EfCJ"{i֞*fY,*:z:7P(b_jh1ԛr.}=\֥"#I_c<4PԑHCЁ2xszl E%r=9/glj|3 ]l]*~D՜{TeL M\ٷ x 6M] +W'vsDy564=^&mmsQ⨛j%,}sar9u,!ʑB?DM7-z+%X(3(K[VYrTb5uT*Չƾ97)eozpiQ1_g7;-^4 Hj$ 'e3ٓ]0ԲY ;srO/Gf[J4~zm1m/"j2;)K83*ҟkēȂ̛[CQ%\8ܮQZ2@5^iF-uN ߡ(F{y=Lj2w8ZaNI`Řy ?H]M9 O݌dXȘ*$樇!J dVך)TKzI1rKޡ欟` d ;/]pDŜ5q=á%Ja9e3f (y%~L{kRmmŇJeO@6WfˀP]D׽w tKhv;1ڥ]a$c]mA! ):(,ȴuT(Yjɤ<6D{ 6-9M.:]0;99c2_v|!ƌQT{3b?N9~;?Gokd)(v3t Ol!楣Y@%AIP&Vwv+UzXhjjT5,b,9,QphCsznbu[t@:`UN͖hhغFPu4% ԙmq]ɵ[_d6u.b?6E~4K1, 4MZ Bw+Vf|ׂ?㧖_V1MՓ.-4uI FbsT^Mk]itH J=sM׀XoOgN>t*jq/j"8Pi36& 7;dwP \"q+ڬeK̗] eeS\t".eA\+o+=XZhK2qč\$A_A-eOgx7i/;MQ+Znݾ(1%e_W k Tk@7ʾlR}YB,z<[32IZgߓ5<9ľ /%$8@qR3s}HeL00#o@M{XβoVw㽥eT/83R7T(KۆN臚G/k,aZCtV`9[Fڱs'9?ܬ8t`;gh!X"F\D(qڇ809ݺQdr8=FNC\FW☂>dch_4y.S9;[Fee¥@Ȭ!I>׿~Sp8p٣@9w4Wc:c=Ƌ^Ad1k5U3?dV.`mbzB{bpƜȀ8'"akafS-aJݵt<;GO]Dx!V3bO#􋒗C4ӏ<η[W8Qb7Y[i % e N&iU1Ѥm΍$5 )ROp8]KF^٩Cޗ3+&o2R\rU;2u0,Ï×k#) WQt)#v&&8oK%Bt69q=ZROR+IdQiELCv>OqwgqE"{Ox!9e[U zSOdB _ֽ0ߵkr"%Gs\VNfakufPZ_G:o1g+-~+iokb2 I9sq2mK5:>=5&T.wWcm]XRIqX/t' 5J=}ѢxQD 1"{k VTI*w[0,Ugrր67opHR=H般H<KgXS.*}rP@Jh7/`~#"xLxCjt3Ejն,-\z<\Ϥ}Xӽ }w0#p䉼!rCRIUz'E2Ec`c 2FClϼ=5BХ +ݨNBҳlZLp+} hk+X SM%Q8 Ӿ}9n6WAOԃ0.d5 9!#@+`ph7t7haǣ~rF6mBIU&s5"\ yZ38/6Xv>ʭq_@a1r`z8o$hkOkq)>j+`gf+c h[GmqH W ;rc%jll|; *LpOvF@X؞Ƭ ~٦J/9S6T5g_%ƴbn?z3V"_ZamΖշy4AEy۱G!Ӊ ic(\^Y%QbǗQ@ gcڌ(0/š?kԂ:r#*͚dvG'6yDH|nδhA>LFDU|ϭ6#(6|N? &FgWpR$O#|DbX/ƹ? ̥Q9u;}zJi>wYD3wșaps4E|+˷(7i*,/ܸ ml#B=Zͥl)4)̨ΖZfDrQ@zV(lPe%d]?C2x#Г9ܤcF ڍݙf"\iw9PpbVүLrFM5؏U2lLSEheb y?<W86.®N4ў~U : 3|3ѻ BJL:ɉtr](6 պbjtW⸮-وDX$v6Ԓ  PFg3I8 NL:V*j /ewnwc O;4g|V ۺzw w'!`nygc\d)8@ѰHe93?B_Է a R*kʠT 'YV)|:jE^F( P=-E%|ZDW .cy{OwJfy`|,طm8]J1FEz?(]5vc*.YFNfdzMdDc*G7=b<,ϑC<ANY} KcMI3p^zgKm2,=Pt{oJE)&GѧG/R[bB8}C[j6CL, booEIr.py&᙮?V8Zi8Hǎ|h7vr`5h27e 홝`!|+HK05ZuƆO70U2NIgຉn[N}18yfP0iXͲHP3BR٧a>geӍ>,Lچ;z;}õY~>r1zѫVE*G:72n&ϘƕM~%V/x>Y傷E$N˞E%|t [` r%觸*JQ{Jg«q_DVKษg5] \=5Py1 M({k؀GȺ:Xj5 \ Ch\#IR7+)coI5 `X{p;Vp7 5,>Y=٧po~WTEO5wW^ers{BV$J!Q;?PC>Mr룆0XuVjOɭ KXjO#B`~`V=þuV@A)rlaı]Ggyd!A`Yٷ>q(乒O\XHjyUhn4TXG@P^XT'TʊE ց3t{WcLU[-?J B4,6>w rG &Y{-*'@!,px%헄% Q~uDq>hc}u`cj㻑jC9!2w b|> dOzM'm0Zd#H02`6ywO9P-bW 2vFuGцn,QAyq(BMRn&DcEwz'DlvW?J-윏5k%n?*#Z(/",K9U|r#˳b%qK%1z98S.Q(l5.Y#n"hBSJ{;,6=Ha>MD 4\l YnVf 2Š;WQPsv|d:Xª <e Vc:0`fQwDC7ꍗ`A؂٥)-8E:irq)an|ٴd`?~5N cIMc[UVUuHB_Lb+6 &cW PȎT}$1~ϲ(;г0b ΁{|k8,F4b^9>(Gb#j*ĒYs?t.RC[gիp'<p`맊q^b [YEaeO .iII2cm'S?qe ;-f،.RFFз}m_4q'T*4$B@CJǸ3i(3< qTA ˢ`C9*W1Wr*YԺyxkOTŠ4sl:W"?*:kc A4 &2b6*}dwS M"˗"(_MUn@F%Gu h&&d]e?tGFL0l F&I> e/KWrt(L#HWv `y7eØρ\]~0{C\-& N~w rʘ1ՒTXl6!q ,Yt5<|*d_~a0ڶkxG#۳(`+PԨ C_Zv˦#g6>./ɲɏxo|73ڦp\ت{X3YנpC1s~:罐y@n^AM(jyq5H[Anƥ~H@pJ.GӟqjLD@yx-^#u7͆1+ -}@^f11$r8@k2/xCbWnfot>>x{l@I@Dw- 5hF:uw?m1U &tO-m8px&p}X=p )ڱ{,;G2O.5 :F 5{L&3r)ASog]:bT  L-n:yPag-Ew /,"k'cj "e+qu&CQ ^xX9Y_ڎ-~!r&EWSTj[gM$= J4y@„y~c{mo];?kde NL џma@~b\OR $%M; B%=w2M,: Q19vR=Tٮoҟ?dWE G27(lRʖ IKrklL-cK&ϝF2uw{̥\v [}[РSgڳKv˯Wg L HFqWM +ӃrN?pYfAЀr Q bނ#b SJ𘫲ֶacy. ſ!i(ITVB}j LP!BXFL֮=idjHSU>^>ҧ`+H6{Mм8D ]e@ve*o (:9uUħkTl']urG7{Giܶ 8s~(tm)h=G̳h{uNhWw.l^6LH^UPU-K`KjGiQ)g #\#1zNC?EU/ɝ 6.M]fy%%3R&D W EMF @9($gYL:]D t3V`+oG[Lx gU%$R< AƷH1]3OlQh\b?P.#YpJ+VZ҆a'b&2W_r[JB]995Vk)gAqz"PT[vZm]yrV{y90 V@r8s!B|)9ݛqsnyAJm@Zߵp.r>|􀕍ͦO0.a%x x"  0sX~|Ҝ)|sՓAeWیN*'&?A*\12) Y7SM!үJl;pYN/s.תRuu2#- Iő ,*2#GDm搅XGp\S نUX>{mqW%w^* *K } oCRpLCrqK@{ǛrQ.S-v^Ik:5;6l7ih~B|O2aL!p=q].JBEE\! d9>fj4WLʴȠ9ӆ]^vo$g87Seikf*2jl*҉&9",nlCy#C1?&=Bk8rS{0ƍWC,I#Q~i%̻htW92w1=O5-z*p쯀JJ$&5;>_3ߤ:/5 , vWؕ-0 32֥YJ*Pѯ0N X\b\:iqP2T(Hɽg{00>YDteqKShy@:8=txHzfZ;?X+e쵌 UYk,E#Sl*F6;w[| |AKc"1V!_@$Phrb9> 2> jߔDwOҋS"c^/>~oqǮZjZPq\_@P@/ɵšnp1+($Cba6/@z:8Ɵ _ƊP _0jN=~#djtcOfg|@-͘ZU-8w*R|J@+Z ap m3Ӹ){>nU1XoY6ceC9:z煭Ҕ0{J@G:DʬK$K?LP:`E=g/?鲵InrHV#"։ېoS"+9N`Jw'Y[M1C='y$Aze.,\na8Bi \֖W%M`wsd-pne7zՒk Z&(NȒz"^0'{uB\|Nw@I;N b/U͙K_s]ceX8[Ų!d(9aWdNXG<)Q!nLH94v"=.?y^COcuÎB,L-.]"ղK\9\[ڒ(gY}WI!67t̻qN Ȱ5GH.M GAU;t5QoXaν"ݧo 8ݡ`ɑ=mqJ>Wrij[N*lzho1C|]k A!$ dw86 VHPn lfd~A\:Μn9$_}X'i;/#r3=Ԝ(ɫؓeBT"J ,oJzxnN`&d`Ӛao+ tOFl_* /.5 [d[9j6" )D^0?xSc qW AKFy=Ļ'':d&^d@胜#$9t˛K~HJsĿkGe>*hSknD2(W{s¦]fDe5< yo=Ki~0@?}ae?@;Yjsҍ6kP]^Aڣ V\ﮔ$'ZXfQh(Z6/ٟl=yíD "zE/ } {.bN0R糌^d^be`Ӗ38=jﳕ2D{ ݓue_gBpm`xE3 1x L k1m3h,G7AqɀїE\CR Vruo Y[ Ǽwıwc faE [ζ~3?,][c>Stey5'*!#weOYi`)Lrͫ=02 =p=ePLqu܉B1T   j G}_0Ty@ p(1˽TI^5/1% Дx6>qU 5bRg9@Eş7T gGXˆȌ"*ER3JJG\Hջ=Sl̡F֦R`/\IY4q`h[ތ")BVeTn/!J -&oC3L61Ԩehh _Q?e}e& LhZTGVm"z؃J1_Hzlc0w+ 4@<ֺ6LRwq5gwiW(h-^sn -R8uy1=۞m^Ju;/țFsNԹ/Ц3wI+Ni Uۘ]oӞ<ELH!*kb9J](LrF[rjS6VczS*X)!|(8"e 4Jki%^^"wtsjg<@;`Ti| ҂kZq< #xs|e}P ZY;iz.&lr2 }sKOk+ dG{BD&f)2b:2nDA>х_x݇OQDc`>}\!vyAme~6dwc]wrnK0" ^+6߱IaKyʼn-q-}ˣPeoҗN&$<=JoL1N6G{yZ?ǤqkԄ ob]NP@޸iJEuMՎLB^=]JMK.+uJle"t,SG^$>$un.w5*R+m+h_s$T&;3늆YYGì-\^qSј':^Og?Vَ:iyNdYIn\[ q4hD>9ݿ:\r GnSbťOIWx7x;|2Ԕ!q`fcl6Bk-Xl/P($f Ye3GiI2P,xTV]ÈьվVw64>N\βZ]'g\8⚎#Kj])RCIvg_KȓYM|~n^J/Ӛ%JF oy$E4쯈HOK),f 98 A՗H̡ UZ:AWQ2M2> ccn ILQ^PQ'e֪\7(?yn }^$@Rnژ; s9ۡm:؊  ]6+ HOl)lvVUub)#}t˫* ީ05A ʂX3*(F^wpIO xT=9 \o®aބ>!n}"LoZ~HdPv^$mUa&#dC.v{sqwHȡ]Ⓡ'͊@m*1jcTL.lNk  i ڟn)\ n vZx0M\w7DdFE>+sc_p|LqmQz&T<Ϝh"'?ln\xD(;T$4MP dNbqW `ףxdû4N郦kGHX앲)>_1XjQUl3R`&.|mlԥx?*u݈&*;41 -%b>}Ƀ*b7qbUkJX{@,“ŕֺӐԊ֑Tl.+cjRZ'J%b2/i)鯗mքrӧ$^̍IJEbxFqi ud DT~D~ dΡ;!D[rzrKj^y:YoVsFQ4ؿ\~P;FohE&eg' <;rEѤ x}.g$9F\\1np<7 %apov9vkuct#4Lq gJZR/ 8PQ{4 t>T[I PK=TPEJS\tw'Y2 XL4m1%3CUn/6纻Т܊9̈́# iUbɡ-!EOhˏx0rvfQ%cg;X!6SbqN@5` 9iA<;-)ͅQ ;׆#|NUK\vY=^s@ b#Nj6L~ E,:፩dK\Zbr-[}r,R)+zYJǍu pr Nf=C]VasH ;/aOOPD,xɪ7$@W\: Wa+eȖte/"=Ltšӗ04ir} ֻy?%ZUͧh+̜G饉Y?)Qǁ}9*g@P'Lz`t>ZO㊚[ձ˕=Y &QT ߕ@}U:+pD2#1,d߂j oڽ!ZuWbU |S4 /dfxNi?s]z?G`V4ڌ yCz&ܧ]ô|:g +aN1t[is8"7tNž@bm 5hљc !޵W2\# 3 8O8{8' 6F[Kƫtf MYQGrmu8#Ë1X%9n?Y r}xEa=D=t*9ASM~t8X#į֨hif ChQ4)vݠT p @}En{g[wS+rj5ߍ' ɪ&3)W 6\ ubƧ&HhlX?&ׇWHfUsv}I{T|<_jjʞ=`T0$dʠGh$HtG ,mJZn ( jגRџ<%Ԭ5+̨&a"):tDX.{xa;iWDڳQv\NO*4H@3+ <)95]_}&o&n)z?,ٓ^mtUZgj @3r`wDF7]/zZ_U40+0+?p7}l3rE"OY%142 #<?/JʶkPQ)Eɺ=:k(C.{6}z)0`> aDex5Q+B۱NCBYE)3LЭ:GwT&87z !^5q+6  !kpFY!(Q4<)x;)AtG3ЈNc>@BhXYDM.^^gGb"$grgI1pekn咰$r;V Jͬ{/ڀ3l~( &o"cJ3 ܵKqj8%\ֈ%NCխ!`kOpo[e'Yk@KY+uPí5ш_&WV k8 ХI>۪{59!d'ytL)(#[8 Zk ?Ss?`L6$m 96H;đaN|T^垇 fS˪a URn,5PnS1|n1鏖A-O%~../?w Wz}yY ZVRYyi-|S#i'^\;:۹Huf.prAɻJ-,Z91\#@٘agǺ3L'sNh\BobE݊@4lUg%/k1_n5HUpjv[8I(43hF#'Z>bz9ֆads3(S95]±]u]ʘΟI~"6(jz v:,1 pI<J~˻6Cw:(.IM.uӥ4b EAӥNx{vZ|B-N(>ovqqt786g)7?>FA= %V(D)+?<21,ޟ *i-fh|k$)A$Qy L,g|+]`fn'j;(a[ uP=$ WOkφ*X;w}y+/#"><)77wHYz8IϿn\$0./2>z t_5藷K{~bw@DT}.P:LEܝ v9fNT*@ÏμWEtZ˵MWdSIؤގ2[U򽭟3\t e@TEFR 囤ik}uּe~@EECհ/p;ҩfnk V^>U|5vA(k;QcvS#a |þcb ER)kϩoE[1wt*F\o|^_ E⍉Gs|+y+V 4x2'CW|G`(.(w!y ]K.y‹/d7J7k|mVrfv׹˃J<'qixדB%=G:@f Zc.?9ٿCerVWXrj|e{bngQp(Э%YD%_<})A4޻DP7Q@qJ/.vg9f떱&)% 4_3oV[K45N=2VZZ f<^agH9ܟ/)1VjݚBdO?:1X2bﲞV{o٫1p;*(o;[wr9 }{fWW_/TdouqӊY)OCĤViGq2xx^`E Ғ8aq;p3`)&STܖi[ƷQVkǖ3u)brQ 8,iD~enN<>3.זø8p NxHS5< x 3W?#l{A3Z/5Z[ R'qc<$>Jc~: T*H V[T"d : 5ڻ aqG. !+͞QdJج:~41DHa_WϏS^O&duߜtlL=T); A]wTqRqraJTkQ[#笟I>Y[3vr]q4x\r#lmaW Wfp{W߬@f+gz<Y!~wн0x*L s:\w([*;1ӓ+[[SUvS0"hw@?K34 (_p@U9.>ee ` \{WOgf3 $=SHSG}@IG` j tJv>B0tF>9?RjXOQf}&HV#CS ̇u/JW( KWmgiD>}{0( KH9 xI1dїxNSg6,o'Xɠ#)LYuCÕ@La-10n ^GfxV >v #R}).H jS{vs4'W+WrvFLdMw6s2HIJLO"ؔFή/h.,7bj#{hm(pZU2`wq*5GrY'/󒠳|Ɗ~G e6'+tB :$Lstac UI&g|zÇ(,!5{ D\۶s&4l~ wy vf\*\bu0c7\3:nrch|̂&3 WIs.?a:˜%9wxqu(#nA8oa W̌S L ڝc̃Bx<3ڍ7t+ƦT 6!M1yZX:6CG$B_ qEYWX?Jޙpv,đhkP,@$G5>mìyjc\ݎK1zu#1"w]qm[' )L 4@8K:x9#a?TeyHdz^$iO'b+U#c9^fqk*Rh[JD6JDͭ}ӏwp+ ɩ_+zÚ^AeG P=|LH? ;b[]B *](q󕾍T6 ן|(iP.mz{P\FLts/]2WY N6tAMrj$!- %@KXiRV_@fMY Dl͉hP9*rY1]h2`&y/z+ 1&FV3 -*Q r \d`. .rqTOq\!ĸAѓ7u zqʥ!%:b( mQZ\* [eh}FKqAqDit=)V2T9%nfZ̙,krmO/µ58@=v ӓ:?8C <3A lh}eb)]0"Y Y1[@n%j,cTpyF8,'#lBT'rf[籟F$ຑ8PTh?3}x\f^b<i75yrޚkvIy|aFg7Knܙ&*\NG\wDIBPSŨmD7 =>YdT* uu(z!M"Γ,%ۻDAݱqhmain~dE+t6KwrZ2z[\VU_G.{f$a~tNc}i]{kg'x "F=vDo1 u# ^ȝW,Eu0҃OC GTãeF]~,6$ LAč3 ػHi5-ζE{Y OHbڋl_{A 6TB ^4 XF8] %qliR~:p Z@LN6TۃY{;3-x#yEU?edxsݍ`\uĥ򓈉ZwHY4n~`3rM2N W||LSp'q$w|H #sQZXvӥp!Ë9h5㕠3<ۨV dD3[[gR%JXKiF (;2An/ʰVa9j7hϜ.j}B2MK 5"|Y0\N2aPqjrDeIپe=]Oc6 6cHX$WWh8`,-tʮ+ϭgUJōV%Bߟ&g{/W t: qYN鸷0.Rߝw#\bJ]S(1~^?QD} =;" _Bn*߶xp]-:8S T G5z2FTފrk!G"K2&+P^+F}܎ H]UW [6\&\_LnXy"]<4 g̾{lˇWBQݖy)K>uȴ PR;ݼЍ4}f, h hb}#D]"ZyxK@1 (Qڝ[> Q:g`R4zmԒ =~g7bu]9Y[BMy[2zSx7$X~+ JaXvL(ZJ"̲4̊7o@͚168߁8y=x3{܅g]b-De17F ͣ_g0G2q|L`] cʟݔ"#)VS&|-IiFNDKPǾmA29قd&~8aѼK>|djLLF< u'mU l;)15pXpk{I~lңwIO#d|J JL$`weFyT JC@F%{J_d陸)!1@/ yA?; ˣSZso&fT7+Y/\_U>̲>(Aʔ n:yŷ|;2GCs2rE߸d}1pƑ9ސT?EM;A12N2섓lX7/xr>m)F 2Q]*JLp[!l]oGψ`$/翨 LodoOJ7`>ߵ?ܬBJ楈B1Ia)C_ ¦"m*g<8#8zo* N=d*H4ύPjÇ@L(Dpφ2go]n-p@g7m01˳lO >LJ'}Vq&CqG-,?퐸Ht@Rr8Ψ҆dog Z2QɡmK&06#Ts1˰rZ”,~pցȺ6qͮo4Yk[nU0( ҡupZP $ * pv)Vfd}' KS*^Fru蝌$F8 Օ"zJjiȇ9ʒ# D"޼'Y 5VAGGK(ȵ"ͤ"g$bo 7ƫ\3*ޘC Y]X~2)UL1{RE#]JPP)CLIf?}\/T: Ys0B_Z/2kvlstB=KT*ՏMh:v%TI(> 'e 7P2& m6;9m@@z܀E >k|w(uc#:cG/l)jOpӎY<4};"ۺ2x(̢ˢf0|%\m*m~yTd6.ٕ6O.UsRJդ 퇪qQe? Y*9DưgmM%I_jSZ]T"A7dμ^/rf3I뢅lMr,@[6(ŐL hN6% qrԄj}HK3k v}iR =,^$l 8 j8-!R_L.YJq7Duv bNm!i/Sx"EO2kJ2N ֶ+IwKat{f9#$uN YPl PERs?We $+P`q,TdN6mbC+сߚvq(# "^[[LZ8\Qz;^x~ Dvɨ1#i j=ppcKaPiWݤYkp4h\\f?^> :U%]4XoKkD#g\~n8O^ l.V\míWS:`5"?:gt3nS=c&N@L_˅ !e^o VJH#˹|:P"Kl.Gd?w'q[80/kEx6GGz N rLrnE4YhBư1PgpG D@HKڈy&c߮6{|-!Etr=)vT3[m()ᑔP㎾ܟ,!bP-lYq -a T',͡9iȁ:W~ezE'CiKӇ=Hg4+T1}HOhDgdP !0YC377 㢩%..piPZ,VNY`OU1_fE^ŏA;Bj!fֲb}Tm,ZS%~V\(]~(jWr AN5irϮ``[ƐaRBdgl f}7bawT4LCbLPa 'J8<½IrW]xОZP X%c{c7 .@u%X_|ؕ@ٽV\O%R5G$?9ccFWf)bslfWWbJzOlDW95ԱLދI:@$kS-.a? pԸ>ҵT8dL@y.푰G5SЈl uOH*Rn=%6'mƭS;KǤXSl~1,ՄU֊cњm$8Lsy+wgBAuTȾ1MFuq̸ss`&矢jfc"Y鑡)-0Zk|.'\oNzDC%kn5](~3}3>a> Ӹ+u鍄$_7|]6Pq @V uPuso07F:RhWґ4Sy45Hķϩe HN?М Ι~'`E/r6_w~`RC l/DT,I\K)U [ =Ȋ+ U>^]`7ԁ-p[Rd1RL[7ED~ rdwU_f?{aYYzHpUy; abb 9g\ 7;hZ)_ְ'd 4\/5fw҅ST-lͪ_}2jR%[l%z2HTL[Y8aq3#8Q~0NXTl3˒sRfa ,|19zG4KWGIޕ<|f$Z¢ a>~v1en1a#'/;=J)tB}&ғݮ?Ɔ"A˗N/6 ^:~X$V\Ew&fqCC g%uhS?Ƚ,Y$d#@E/isTF i۬[F:b3z^[&٬fCV{ǚB~4tži (6xk%3:(,U&; OoɌg$g\i?Z7;M<}^<2G: fc2n|vb:uA 0Z'E/Jt jJAqE"?mN# ,ξ8O%ooBcRn-0"֨ء m_}f#>.cK1#l VUс AL*0W%Rݺ&23[w _n=#(΅rure #H8zuX6H.gMLQ`L6+*7( 3WA;,KU bPOe͒:Fp!Djo1$=#h)ρ۴ S\FŜ#IfZ鰊&|V;J;IEB u{8%Ak;w.1͡1:T)9!-˯Bd5yvH"}vO.k$^ ɼ5UT 0~R~٘ o%1Xrg6&\I}%쮪eznq@ey.>ReŌXpBЄw_$z<vu,0x Fܘ~H3Z" ,z>x,2S,)`! |,V¦,Hbڦf-?IP$wӨPζ؝dR̄iY*,\̄4[Y}KNHhc+j[e7:-$ZRw?6 mFN(vȏ]>8q9JZY3MY$4~[B*1mO GiE`^`o'T3Du94U5!w$[(eh=;_;y!]L`3<})ˑ0Ƅ[Szzgy)UdaI I%$%ń^~n' })Mib1](<6Op\Dʄ0LDBID@%%Cvy6p/-9E8bY?;RE }C? N*u >ɴU>(G !m"($ 6̺FN0Sk() `;RCT50oݿ g)$8h^DQY;4Dq@1p:T躕h^Sz؄$7m;8YKi nx^L^\Gi K5r-PlS&!fp[pW 87/.ғXVC5 q2ڦ\? X~B3ҀM?Ҝc۔?UVbv+k(6U?PXRHC Ltƭ9+j빥+g2[♰zkL덢Şv`i؈Dx[ppr68kXvo163k?ץ^ίleyѵ`LZ 'OMVY/7SO ՔaR6%6Ky9l#lsPkY;O-JUp<@:&^(˛&JcX;Td8^ak5OM$d_DS #2 V;MR]88oιo2,| d|胬T>c/,cfo߉|o}QdV~K(=u_n3ÛMzөTYXsL["'V5(,#W9r|V8yP"H@ϫR\iiq #{"/ҍ~ls(' ZC o2U -?i}S0c(IhBFDd͗vpJ=2MYeoT`0⿞2+H L9={}$p>EC 4`8 g $M; =qiRC>~ͩ.kXկc.GduВ&(rs1n s"'sA;۫O:gf~#KaW<ϼORr+CY.D1DGY Em1/V["^*>>J}Y\]`;pNoE2܈ 6ߖ2T@/H; -F/!aYl#3Wz.Vx~X;k Go2g.V.E/det!UP^Vc/*7Q ؍!p&7/GnjRT%"V:i`)54Ѡb6~[VyDЈ?DiC遳Gw ?vFry2%1@Xu Y7*k~hZ?9a&0cq[l!~:c~ (}1qDOQɥ$uvGJ ,vD*'_)pIb~%2&`*}|E#@.48 c*3mѦef s%oٴ rXtd,֩l T;f>)6OUP|-y>wfi~^MnuK~7 ΪsR{iChme}jUD_T4_$da1`YOIR>6ۅ[wln= ʿ(e@C_1!xFy".@EaCD$ngkLOvnx=(pFxJ2ݫp~LP5۵# zyzJ4b녈75C"mm0=$/@Ti=v>,#j͸_WfF@PWo24f{έMuV9o\)jƞ cB*1kU^\4"|~Nq{!.Bs|ci$r (%FM-7a8^$ubt.-Bd  ;__xZ[~pB84dG. #hԔܡFxV~LB[Vu/eE833UCc(U'LG6toz+OuI´swL氥\ TɨN_=>8\BOɤWbru ൉Z`` #Ԃkސ2X+=sN9؀9G *ZeGDFdӱD":d#|S9 f E76Uf ,)u՘ u]ŇdܰG4^9t׀JGLܤ;s>mWmwz5~Yj= 6ulϬo((HQ#3TVPP! 6hot~[s5Y@_d+LӑH8q\\7;,iO[~A ~CC~H]m gCap3Oԯ'ېr`7(RVw܈Y x.3oD fEغe$8r6MYF BJKiG% ځ$rh6پl"E/;"UQF3e B-ꗥ~BD5p k;ٿn B=8A~a+̣$m+>Fl SMF}n\!඙!R\y"L4t$R^t>[fXSSHtP$w։pWB)"di7Z98%czx6sX搼%2{2b}!o?jI |/X`fL`m}ȇب+\WiYJԊ[XvtޟGui~8۾q }]o3!?6 ONZʶ,? |F;D#ElON׿mS۪W==զ sf"sBqI48K%X:ˡ08:M" R?2 R+p:RMtPN-0 .;i1t@Bx )F@=AN)Y6b*Y}%tEqÙP8fˠ$P 4ڐ*/;ҋ hyBfQ:@{:Gs[f=zy+b?{ _˷" r\y!qʼJ^d &wU6ޛGdu੍+yS]|_X>hq][+9!ݫJAX`zn[81P7\`3KՃakJҸ=襣je8xAӍv.ۄWaW(H>{r9j:Yn`>"jz, ǒK* `u-Pɻ="=;g/[⁓.ݍim|kj{"=!j#߁m>AM7{8xV}ù##9>-")6iG Q0uZKMXkV/Kz!}&X 7n`'̩n?p%_"OxZ3Y劭ٹE}4[7>['shŸmxL=U,C-uc=:dz)|HN{a"VIh>BXuqT̤eӨup2U].ie+枯Ri|)0&ݠ@`uWzIT-2OS1C8VGi7k'س,ccϿ{6]pm:H\L^^>FT\rz2 T[tp.of<&Q,p ?t17!U5r4,x)>}UϺT¾|3xCdp4N6wyh5\zGǫwk]Uݳ <1g=fUԳD L@'l NKtW!S1CZ/U~iL$5SYbǤȉ(uĤXdoNs6D FMD]CsO+ZtjqmNz#3¨W䀲 6Oi \ҖqTϑƆd&0|Q=ɔ dǎ@AI_4’Ѻ M<@V":ֺ4DxLnPܿsҘM}:LhC˚:O+?DICn}zu?>2$>'MP'Ͼx-kqKhWcؿt2=bc0'Uj&Z0|j pLgoddEy>Y-rC<&IH/8,YvE]՘NjQMq+yfj VAn}2d/AFRlt]짋G<ʪV6+93X>l3Agcpk;C@!9ۮL8.eMn%raqt_ѨF ;!KKaD-K{`c(W'y ̧nd'|#MJ??$5Ze Qx-T7aIօԊ&gW&Æ23,驳r#lNEw(k!iԩmmw,:}kDfLYcz&\^&Hp@|T 3ZRI6^9TV"22{`܀f?Q*wGrI}QSd =/\݌VG:e' eٕwf^! 'D C7嬫EUѵ( -ᬄr)sOlِ.5eqb{T\SD,;3~ak S?\9`*8uDVo?gF:g>;!5nlT"O (}0ܡ9ꁕ"׹[hnyTӢ;&e)gƮp|٭6܅+ږWBL_#'zh-dy}zݒlGɯg:6g~$Ga=o1Fg/1=D.^ 05dJֈ| Z4z!zH=6~a5MuF/yרd: ty61 צ=n?C{u ylZbºx"4*R qJ}R(;VTm2x(3etOygAz[JFZ;U}`}a(tXӌhX '2a¯I.N9 @l󛐋¸ri]g4HzAxV~$xt X;^ .)a&~&HZ,ZuU4\D AԠTR'M*pF l Zjg=h/_ U3m/7|9{̱ F7-&djsZ x̸/ħ 6QDlRH">[# -?(eyHΝο!\[ 1Q y"oXr4Ka5u4CO3q|2 K- ! G⁏TfyIrM`R{xՖ-6&!hXy. X/j:DY S/e1δGE[5 E*Mzhh iF9HLpq¥X"z-I<T{e㱻V M} Q1fz*?Muɱ[P2=XlmcAWDP(܇UzHkuRA3bO+߹=Z$MItTŹp\c֍z1FmrxM^T Abٙŏ>DHS?sDŚNo)$ط2"iVӞ31Ӳ̠ޏvelLH/=E-qx)S^t}".ϗ2\$SOgc6Qx6Lf">e5oelTKZ6Ϲ -ظ.y`" ,a{S܈c]͠ ݵb$i[|TσH)u;MҼz \WbÃLb].0Dqm;\ 3O;s*gf!Vi;FIdj X`_{O9#'[}E4$t|Xr>ZPRL66N Gļ)wy9_/m;n{hg*7CXL, e p%*ۄUh"IoO3w:[G=z{,b/E 4}Nʝj`47ЦMخ?Gd|4*Gn'P BNradF<_䃤y /k=R3fT1(S{Q/P`,"b~]ƹsE-5 atS] R5~|lYw&Ampec*!$)i;QKԿox!k) ̰'L6Yނ32%\x? Yy|cg=dt[)1#Iqv;l;#,MI( f]%*a ]|?0pЬv\ lRn4Y ͇S4 2hn|4ع!: ؎ ǵ ,5#V˦X-EvK?ՙ2?AL^^$9zU]sfϟ|ΰ$ ruG 7i}廂xKrF̟&;dzПfj[W|usO+[_& |$25~(!4;ҫWc+\AEƾKu6FQYY{ Q2r賁Uɵh=-8sRT%8P>sk2-P x#+E;ۊ`bfH碖2-'L}(b!{J!%+4 {wo=r zDL&{X yj" (A3da(urFF_Ge $K ]C?$Β* n9 >{V4%0M9;F.3.&KۻЃZ"|6f Kce@p{! RY 3NZO18n,Ŵb4q V [)1;-ΞZS~t$OkwڰVy2{,V-,xEW){꟧vQ"oQ3dٻ!.w-%ty, +pwkǒYS g+ROA,uR_&3~AL0 {%Q]exAxyΏGB9ct\9R3׸|/8&kTè7兑E >Qi,Z7~6y9^^w'Ϛ2 drv/ϾR] qD;C;e%;@Tיv PvG  h6E WA_"+Yip 3XN8DR>6 7٣|ՠQ/握8f^&T!.Yc%oFb;~d\4~S⌈khMvzZ鷄nHKSU ʰ9esǚpI4k;ul[uPg&PrKxV;zߢ x^gVJi;N(=}pY3톈#nţyAF4_NPU봚:hqQqaNn6}0O!WtP6>Pd{o𝡼=/p>$PUgȘ/|UMX?\GRhf{7*8kݬwrY'YD}B`tÃwƦ4aaa7O3K&&#*@XDs\ /)<-KP{ۤ$=^2fcҏٌ82k W+f#Qź(Elh7r毅U&qU~{" _^Z:a*hQV7`pr3#ǞTU$9܄tcn%*S_^}nӄy!Zj+t=rɹs0G9@L!Wׂ͢nh]*z װP1S|wϝ*sojF~x"44Se#Su,Uş!Q ڊȡz*pm&dY"BDJ[/icܷqp{: 𗰓"WTq玳;[\^v5Eucȴq#,°^k"?<{X"Ie-͜6l-CL&Hx#}Q4K$H.!BCKR`c.UG*8W {Q$6mfl9|>f:"WdJPS*{ >jUKQ5Y#DoQQ.ʢ3C(%Vk#4`~p*T|(CZp:lsx'S]hO^,;|DVwj&ZJCNq4HcʝMB&b`b)#zN*-Dg}:S!ף?1eMC[V%a,0wHJ m%zg2RByx=],~SWA?e)3yWM\ ?]p8B=ZJ ۂF?ئw cH7YFU-[wGTnM&hnx׻ht,=yleT[%]Hk L_m[ˆQu ^|=ih ,Z jbےN ?-.YyUITzB#XM`΄_j=Q3UoB?-[8aDÍ1{:F 6mvl%/gr,R*>*_Ɖ#4b{7Z@SaPfD)u8jڢ-7&ثV($ & غߔ)`5Qxo7بynbLVƥ:T%DxRoV92hRIt*՘Cf*6.3dǷ,MhJlԴϩ *<h5o],h7%'!aL..Ո#]yup:3E xCV+4i t*s5,H2|ca :.~H9S]5M+nˈƌr(\@5赢f* Kx){6K%,I 5LwۦPS!K+eC&D'|M7K^ 7Pݬ,jPԾIzmҝm? <űuW芮ckgejKѺ?$ gY$ =WF&^W'Oժ;ʰgʫ#,tH۠xR6pƆڬ7ݮw ё9 ntAwaKp.VTq K4x]l x8] GiX/a0:_-rd=`W)hf0>$LfՋ;i*<E1N6JN"VT(d0.ƻ$5ŃsRb|}vqhQ?L/PT۹,?~X A nf^VӞFVG?!W#NWD6 `cX^Sl@N6>&mٛbYQjIc r7.eIH p:BU<٘Sx % g=ڮ 6,׮|Rilqv  dWJDAV aǿ<%1c%ge@}_'y]r}y5Gְu5eV4_P_$ ->{v#lPCvfG _QUq \av'8#+:E(tMT;DE'=I]|Vv#e-;1I&m&;^eě_JXPR}eMElp яjto( +m}3/G M/eI]&z%>L4\Q>V\ZXG_z7HHLyvU]53>3R VU^R%)j"@jtXn+-, $9Z yFhGXp3v>S$Z<v oȪqª?m¡,=ٮnSD)XiOG%Us@tƦ쑏QKUsO|..?7Wm}h|.yt@e8s `;=l/m2Hc,N=q/?%|@Ռp,[|qݵc]l~ghz4.zj`1/?=q7kw(qs 73{f(akj~;?jjUm-( ~&9P)s~{*=pF]İڮE+P;`6&J5I 9Z[;v*eEL޺>/SKQn-"<$fj>/ -[C,hJDc׉5%-O^W@ػ+k[O(dg gŜJ*FlNJLqgwE5DwƳWFm}>Lc39 >2xk;k]sتbV$ت.g(V®(* )?q sh8JA@j&X"PȠ~נJgR7q?4hOC@/ 9=쒄!SŜ2xOջ]g U7 ւS[n)ū"{7ͼFQSMnuF"#TrdDWͮrmS[Eeu@i:ׁ/[ DEpM)bMĶLQs;%LWk)Uߠ rAR*E \Y9$ ȤqIJ34TP$/O)˳O{fPH^d^l8`PpF >+[Mp74qƗN,lK|zh] G 3hK:חMt rҫbJ^9 'h+9ˀ[ixBj⇠ Q,uSv/1rE٤ApI2Z(K7YNU~*b%ȍ@zI NOX, mVVlCU QGʻc -dx7/ $j׽| vKQ3`+HtIBvNtһmi^ M6_l &w'-9C3S< k~~߯c+[AT_ta0Ҿz$kG67 $|\ jDmpfԙ sj܌D.kuOTq$Tl+#P†붤*u|G3*j37Y[JͩMWleIӭf?>u"C=ԬA 9Ԟcti$P٢܌RQsцf̚`$]ԗfЈ͡.PcFF Y9ߗOxW<少gb²eAcMrL5(f`'Z 0 +tl֐1f9܊w<[N6oP콍jE\9v{Y 1]wuTײe\r5-(3Ȉ"Ƈ O@) {'AZ(ea7iقE@v( E$w2`@%RpXNhھ|*FOD?01jo/X4.6nRrP .eyy@LLgSg7Ϛ "Ӷ59xx-HbyV"(BiFa~[bQEneH#{r5% i8fa32>i5Z|Z; otc  ; -D9_hZEK95|Aa~0:POl |QZ.9&ኙ>}柢NIlb`t;<_r ӭ(Mzh^wW^B\s&T@!v7MZ5;+^,2ZJ{3[BTU˺΅L BD[-i xy:}Q## ~@j\'轔Ex\n:LB)r<`%kا>OX;@K㪠ld'b4|V&BsO«L$i Jke dN3ЖbV!T `W"?.1ܥ'4 J1j(7'ngnH}xL]gY/oVۊk. 0y[@c T_Tv ̔q5Sɠ^U&aS4(xa?)GsL(Qb2/cAhTi[zr"7:7 AN"Z+d,=)?ebuML±r.Mng AT;<JX\$ʵ&<8îi㇖ KZ'\ɨɜ{og߳rLhq_xӶZAaR%AN~ <`:KzL:)͓?Z:枍^lp4Qδ8!3OQRklk,|h \J-BXw7Y&RC qpi*w3{%S/PbpOa7}_c@+`f?f޿ԃG=꺯sCR!dwdNḏ"%{*Չ`{mFP`-3,F H] -tڝ-B˜*W>ljkaK;\끃gՕxӲg%8N)K0^~ D[ À)Andb#$—}Y :9{ g-=4=AQ#kOttŊ*0uAw"t~5L h{ лuͮnftDyl &VvcMvHqlYߕp:&GoCּޭC2zZ xB!s]ASS'>F%(k9Hzƨtmbz:d#I1b ѯRC@^vxRbl4L1nN`ǧ}Scz_uFo{N[\,BL`;3l` B-Q]d9Ҧ#:~FJzݛ' 0֊RhO3aɅ\⾚wĖ(i]'!tf,ق}aNE>B_TB.[=OyEvFk}X֝A?'F!QtݓCAfj g{v8qM#DDb8>i4UfCbys KY*?8| o8VxNnBCp?!>yֹR:I *17W:mWTԺ`9y gpmQ k勚ro_ s~7,2I : 5FũlGMm ՙtВ{Jq*Ko_=g,]LM|VK,?8/d7MXs];.L#*Zw8W\Ʈ:$ݳst *=\2قܸ<c1,CȈ|'fW:6TyQàg8ƒ(,I&zMOh+~էOL8Fىl7 9dF֒쨺B[1ρm1f-#8,:_w jXj+cftK'+qs|ArX Թёms\lFX6$vIX9 zzqe ɨ=0.ZpCB'(" 8:Ȝ%Dުt+_Ҭ#u,lWQ*rLSy3 TmIPU+ ,o9xq'-j&MXLTFOi ÍYk(\!a,Z2n=a]10\IKN=>:g'/䬨5lEi كUIOQdղǍJɘN5bP+pc(>ew84<7 ))jr4(ށێUt.5>|\ HxCih4ZM]xf  h8(LqgfRMLm`JE(==jNNKUdhcl U|ut *jEh@I8V>uVDjh"FpUk=ddQ>yI!@z>JyMh@PH( [(~H'f!^rSU2VaXs!V%r]:@?+bWUbN8f1(089%d>.1uzJG޲ƮR}Jd6{>ܟxdoj'_^B_W!RrUbL 7B1q$<~)C=ĝXi^ulQ%KU<*jV-1x:C?-CQ6:UX с9x>I՟1{o3Z(#73#|Hjgɨ+MCՊԕh]e#HI  JX\ bfYF]ۖ~1A~FbA5ׯQ9y h /xHdž(dENQ0! tԃkMb3nH`;֟Bj+'s;ZcQLDN&uP@43זGwc . \ rk+PTv:aG5!~BnSJs,84]y86p寣=XN]ݩJ <>8P+e:y9^ ̡K /lykN3J.xYҬuĤ=h딅aW>J4 K Q'3Y=GkT% VnY6`.7p=SYF:2teH.~r3s=7cnDzkⲷK<ޑ_ E4s^ :VvAhm4 Ȋξ)j#y?Yh^kHDmH'5ut=vd$J1Cc_Ϫs [~Upr,2pz7ĆCb*ÎhH*ì-%rM4GdWC']f ?Jچ?2SƇy6q7`RPLjRvyqodlw#"ZD0H;/54HaLEt1o/*LF0Ac*^_=[GZ14flWM?b ,Ϭ{~+)-)V^dk L;$m_L֟y]FD<6ظu%(V8}V?d$@+ Wpy)P'\ga8sB${svݣRg!iRܔorĭ^2L5\c. uɢn6HI)QA$kL89k fD%C@RU~YE:0~f} TuSs^JBlo)iuYY'b\p/_V̨+YODV8`n3f$E m;jB$[awꟚ(6SOK;*;0"oJmh*#=>ʵjۤ}^wHYzkFH e(| ֔`ϾڛQ!Yq˳v;Z+-#٩+<NE0gU7D.(,Ԁz,I4ALjb'`YG b~>NoQi? )|坎w7 = vϨi"<-kdDuAo{F"IrIIk^y-N5t1ש@@'dTe*'͎`9ax|IHZ2Pk+qw&7ICT `6!z*:u6؆+]斨&3A&WP޽ss W9yѢ㻀wX(| P}!V+#8_h/';{kkb℔2mVW S70s]{ /OZaoWL{p:ӝ->A$_qx=-*~a;7sBLDoo8vSo,z$u*a38j7$-mPa1r_O8мyblbߑŎ: 40;v oUEo|/8-_QsAmIPPT=t*U;? 9(u,k:gsvV!IZHG|Z)h`Yu'5M8[ELc=]g)GE]`y0PِdЙ1o@F/c̾%zTf2&IJI6wA$|Iq5+hPƐאt"$ Xѧ{%!%hav)bgԁ.) y?^G0Sv|XQOLC&{qҴvQ*8(]`w?vzL3Sl@l2F=zs3SQ ;Tm0fQ!*bX0Ÿ,wd=x %j?76\L>/b/{×|Na4 :^H\kPQ9dђt0HUvC +r{'z'_r42(넔.EIVhqd={W~9l:+Kı||4zVmh BӡFv(ŮK Dw\XI~2ovu(G00u lҮ^+;'E-tiVjWdNȕAuXEI:ƾQx͉~Z8:[b?4j_Bn}>-PbO-ZxRC$3#mt\oݹK]A<2EK\vx%D7,1Ӏywר"bиiĬnF fcD'^~ྟ^biaI)ews;f2m@Cs?^E/sj%.YsfګFg[sA/gKp˓zP0x5%V廌9d~Ep+` AsvBC u9=9Ǖ[VTrIRţu 5 4{\Z~Z@2Fup `:gOĴ>K$ěx{<) ?˖K1 @ܡn5SJLXd2ǽ8|2/ڷ٠ZD?r q]:VaI6Y0^QHW!UHmz#noCX )QyhTSBˍ)g?$\ ܙn.:rכKf_Ř'Bfjb0Z. ǹ?E+;bSj/嵗K6 'e|W(l՜;:%QrWt j,{0^Cyԉ.!:|k7t/-LL0>҅Vz?c suG 6CWsJ o@lg+W+9iI@hJKczƾ ,јe޽_}^ʉ {3P[x:7d{lv,^k:9*krÈߗK#lJ`wʧjrT]I՗/[EN96.贈X7n -6R_o5kؐtJniWmÀg/JEjno$#zz ߢc 7Gm+ 3W!v8"J~/mQčʆQj@Fd7cLQ5')ptNu5 P$/DW0B7Aŵӹ';ZZ>ΐgˣ~g5s}T$\'eż8ʩ۪rx{K{NB nyl5Dtv@rj "yeM*L꾣D.ZC7<%rDK'GiWd0%ف,fV}Q_lu8Rvqlsd{X;;dKL EHKij`'/n%caa $v%jיOxHDH* mj`IJiH< $`6=;V{|2-[&/H!Ӭ&{Vw7K Ĥ9a_{kѝ#8PJ9nQaM(9޿G[ƋA~'8GӞnprSzH"-m]0qNGyH,$1(ؠ#Q&JJ7Q9u¯R;kIPˇu1GGu*B(\aQmpiFMW>urLŦ>6`kxH}:W ̐ǕCR4yU7x+U^PcfdIWVE !ycy,*2mkȤp[8Z{^鮨Zz<3&KiR@iYi]vmISC0"FGsT_+́탿ֺz͇lLH >HI3Zt*`fGIkT"a)ȑn(dO³6dbь<AL)K ,QVGb!LCaf7S# 7}8NeLyp!"cz,>X ~QC`с Uu^F^QX_a%E| E[A-ɯ~?}{°X|`4^\s'|ܕM|L9 GG9kZ19r؃^6'cGX`^ZU= D#x Y"%”a޾?+bd*)L4txѮq󧖮JM$%S|%Zfx]b.21(}cȫnb-oFekӾ-4TeQ0zsUDPq)!*n2vO=Xч$$GG@ɤB~![BmGgX'!T Teiq+m`^EoY۽nyq >pyvUim= ƴr> KGDğgγ:E߅fY#X) :ZxWmq.N\1'B5k'RZ bVUM?zd'"6P+RI2ޚ6mr%Th*_W![mIPY\M?m[Յ8}hޚ #a*IJ;9alT7QݨA\1:G(s3Tp6p¹=TaIR$^`ЎF5ayx D5ۨ+B5[|F?cּ_Z‹}Gy[b_4dOE>4 ܓ\$@'3G= N`{ B᱾d7&+S\>uiO{"T2)t2KeUv^noER3᠄B+COGlGOHbДj!Ԣ{ 7$mN@Q{񯛠 'p{ZdCXSRF~8e @Q 9Nk! Kj2O>)5Ȟpxt|!NT\Y50/) Ӧwgk;q' }49D]Jlq~E!q`N< |*\s&f$f %D9GWS;P 1'7@Ǩi\U4t裧Zi>8N[ AGn G٘S=n[f%HKg[y1&sޥ=rpiˇ]؃^9* 0mg=9 ^a:`ޢ:B oeH4zKp͜2JwZhBb&fd~dZNwF`rQ\- ~+)Za=Rvg<hv[oT\הּ)BuD3y=-7=W݋AWwM&\(raD50]֔ۙsAtJ\fո(8l!FYN %P xp"^4X\{;AQ\=3r@6D\xoge闵K԰O%<ǫl\~ȲS ~~s4H\yA6я)Y' RWX+G:]mkJ1[!RKۧT= .oNf!¡NTWJҪ1M5.Znb]Ŭ\b * o/w:A``!z(׆`,a t"`8T߯Aꌆ%ȑ_m-{td S߻([w͜(hi{vx7j>YT_ZK^ _t5{]UhUpW1sy OR6lY{C{Ml<2ކˏ3DyKhNIDR&~o6FYQZM#/!$E.B`R(-M̫BD3)2M.ާjk+=1~(Kh,rGR7k@l% Q}#j`BHo.gŷ Jw59xZ '0 ĝQlȑ=<)?Ogf}r)3Gs搙ϲd Lgs.wT`b  FצeEilJXEO^WߚJ&YyZdz~R#^AcR 8:l!5;J:B 21):wsA{?ry3l/! VP}^0+plkKrehqiokr Ɨ{Ba#;fX G_X(5U SHև?;6q~%~0I΂/c/ѿ8'{|wݝF:PGKDu|Zf}eM&>ͱWs4LJv*k48S,U[ \7hUAO=NQ/DhAXܞjN:5ŭ6ޏ6旔$Oڇ5gk޶ݹhq.&x I05em9 g֟p?x.J9Ya) m\M+x"/'fZMC-O^C CA/#yNeRI5ˢM6&L]sk+#A y)[$pY,O pwʬfn ՞{2 ,]M9&Mx(H񛽤l;':Y2|THUAL!:`:qʹ\EiqM\N0tyrBoq;eaP9S 6[kE"PE %2m86k$X^:j u> <!(KIak~S-KA5PkRk-W~f*f-#RW!6`˧`Y+ V*Pyíyq@,D'_fUoycOpx{ :A q&yH~&ኳͶـk .l{ky} u[`_eͪ'di*! lc,#&WΈqU{14TĩHO2xݳe-::5 /nSJevf#`Be2BL(Ue=Ѹo4螬B,8{ܘua"PN#4vHI1g6"wvI.Gy]V?H&gh0Bl/YHɍK<;<7(ЂOX\8jisD ?n pԺ`l}Ðtٽᄹ;1eWx7}|,nLu4ޤ}Dob0+>}Z³{KМD'a~$5[$r/"O7}| ل>6td=U{K?-_=#Ct,(5 76pΕ (SM}hfb59pRJB+.b>pG ߅{%a5LBub }wNՅ}a8 *e&ɗ&vr`Zie-(G!c>_nl)v'e<=Vۋ 4r'~+Oƾ0*YMũI2湔D]X%f'}f \nݬ!*EjUYe^R`D5WM5 =]_K MgtƓm6[ioUOtD݁tt&dzu{uhjoD\iUIH_ ӼHnBx׭.†۲_s_4jqzPcGWAuȟ},r I1UAN~8J  0]'&Il05`䳒8 YfgUj@/1}6&h(XK:t 1Дөm/gSo0--VwhHa]TWhiiF0!3D8g^sBt`-Ul ҽ{'HqFCmO2 2VȰntr#}μ~'MD7~Rr7cawNp; ?՚`9W`ZCLlGO0o>A'+oQ@ڥw3^_]vN@]=!ff%ţ>ttRx;?0mR]qSERTy-˨ )k'_􀂤!85xK!e. f-PrZoEրܤâfaqvf 2zD\r\ܵM+uԄhgc!@h=٩ห ɘO([C^pT@5R#m]1q ~eL (34k3X>N/8YD֕Wioy\ԹeN~8&=ͶX>f h󝔢 M 69x[@web%ok(/HP< JS~"WCͅЯtYw͡"oWɃ~fwnmZ'32K]]a'T6y+'EI o`s T6Kt ~IW@_7Qd*NЧ %ݫ.(R/Jgh{5X~GxQIݸJY)X۟ךyeXP>T\ӎD[Q9jd@@cyvr&~=ϮQQ/w:H̥2.zly't  6{e7ـf,hda8O)^t2Oݦs7"Q£*<:Lu0jT9ӧq!Ҿ#[x 7Eɔ6τarZ{lRSc '#T 2tی ;*kʈ2$Qqe7,܂ cDIPf_y㺟O {O:u< By!Z3u(bPh}xt9CJAu=ڱ\ GNf}>#{@t,{ƔKuR%Zٵ-Qngs Qյ.Ze%#v=Q//.ck4Y 9UIAΗXi!CU(bIH"l>LHDrgWMb\+iܛܣ8 gfy6T@-fPUT;@(/`ZBJP1u'1 JME- 8)YC /qD_t p,z3{ډ~TRզbrȪ $D`|I;/{7Vf&\w)/{K_Ory@>K :4F|+*fЌ{Ĕ  ,#t+2 :X "OC}KQaGl/u[ۚ|^Hz*S܊tJtHN|eG:y c?v%KUWxųTp)[!ާ)UͥzB<mEۿ[8Q=#ËwNv>0͕ybXs'@*8w/Fli@6$ժz[;|6B\[ر\O~!3,!B.M{Kn1 e_~mm7ӃYNےD=Re8Eqf=!xM~x+ >3JUYr d&6⎡m^F7˖j .!$cIjd84qZsņgGA5#G^~/ԴLP"\^ZONjp/>-W;SN%I' @R5Bq8!nZ rbF˕-~vܡlDp -|s T%;~D0z>I?~^mPi h#RϠ!&nS:CsvΕdy.f .!dN{GPǥA7M,K-9 & ̘%4ͮݟY¥ i*~ԕK]O:ymS@b#@]ܒ,8yUBهTmzJ,Jz?_G[",:b]_\ r%K=XdMNVԽ.Rrmݪ&sؽ=3bV*)%Bb@4V`.m$CN/£n>FM7ݗ&\~K͜ nL ) I[|U__0ۛo7$upu)#sEyʳH0 )qbtkyT4>)'C~Qb V QI-)XtKDem 33ƯZK 7i/U R]{YSgJ|B ]BpIjkMhR {Q`O @=tly A󉞖&@V ۃW(FQVT*,D~WairaKxiGٶ^gs=TZi6 >'z3hWʣr5 3*rguAHc=Y : SkR ǥ"Hnj@ 0,&7,R[țXٟr.tZz@jEWGK8XYYQO|IK+ՏF$b&1@Qm'@P@ݔocC<{s|4ȲRE&",k*e"7F1'yq7.QqMPO; [b<0`/*iI)|^QՑ8Q. (6`<8 jyHѴ-h^aS#wrk:%cV&4q2q~E:We ЛkU!շ7u.2e 7Db].|n$`C1[SbNWޛjeI[+#/8m&&cq~H- AlZ;pR&HCC]&7sGAx=׀hKIhՎCg(mM$tjv>:'W o:D#jM %=7'hRv}-U=O> +ζoa*5.NvϝDe.V{#> u&usUٱ@X=\Z" ʆTqp—.Ӄ!(orz|$37 P\iySjߪz~z9x7K6=dMqnǼ:$n`Z4>|m#M!sb1>b(H\Gv !#wgJᏚ~,{dAb ֩LAlZ*oCwِ!{Mo#R z2,[Wش3"ôK H5mv 0RP4oX wbeѵ"6eh{bʕlX&ȹLWg>tl/r7pG17A"{(`fA`}'W;ABxh̤ ٣"O|&JF~~:$۷,͔@`OJRGuᛧTH_V+d q&f+X)0ȯYKt.h#b0ڔFAK&wDjq c#[Tz'^0F! \ӉR)TwGf28(||ˎD;IхieB)3sr1Q:=FTY?d;/إQ d[9OC>vz7q"W=K_x~w!?@+ *+q~AHߊ jXĨTˊ ;s1.5kV? ȫEWvye{L jCzqUY*lw.Gk y ԘfiStՕSQMgV ]AC/nuݒ*DՕZۭ\Kvo7q,q6dg0"ģBgi xՒ QxɲQ/f\}KP͘۳0?- ĈO. KY\!(~&:W&F$J^F+Γ_*xN(/r ?Ɵbn!LqLWK;F-c_ z <#gЏwvG8yVTr u?r2,F_0Y`QedG1rm3]:<-\kqw)*t!{VΦ-v%ou[ 3ҟ^r\\[;d4AB<r%kLOVw> _<¼ĚN6½?KeK 2Uu-5$-'"3*POs_r hp{h tO_,t#ϡi6D>5A^`X.v.c3D'Pх8ЃLBo6(Kd.Mu)gBSɰ<: ]^rY.W$46.@)<% ַN$ !CN{ ;(e4;{v ck^&滯6T融ԤQ :}`MB/]nbN\x ,A݊ULśX/LXFauSQmP;h5-hq)!ӌ:2a-1V6_7*)Ŗ8qz79^}VA:-ծXeς?r(a]h2FOi\nAk."m<h[3_暍}/XwF!5“UH P;@tsN[a(H s N|%і 4MAۈܹXk.9}*a>C%.Y=[ y| -7)~Z+E~}Wź 됊bY!~6&My__XeA 2jZV<}K}B jf 0hbNVAW/@hO툩!FOz{>#  ?qm٧ou`N2}]'U}Ґؼcue;%\cIk֧lqjUwy=ظm]S5` Qz]jl+4nVMUgԺC9!Xuk7wP8A_0Rk6̂]ύsWD8xVuERܣɗ"2Jy"~UmԂKR3K{@'%Ŝ$qI1+~pٲHy{|MyL36tsـupG iQ=m-jʩA|ofv7}(l SBċhYx EaKpʭ5EU>?·MQo$ă1q 5ʇ'fj2AXcMTã.Kİ_[C|Xq(M9I/=;I t2$b7ƯM,!>pQKtX:DާtR9b*g{㨶s'uHs6[%P}%0UGcU1jSiǂ˲cxɱv SZ C ɭ`HF:U8]CUiD Bz Lٓ#HFqZ &kdd7BF]*t1/apKq>&4ߊ^Ee5*?ƎM0WnGFY< .s=W&aTáKuT Ҁz̶JjO0Bisy."6^P`#͒8E QIrY6U+YJ.FcϖB=ugw4_Q`3Rs~8'ݷZ>@Ch }Z4/GZ>YQDwhثAHdvd6XqՓݵ>4kb 2k1N`UL!< Y*@ q$zdd[/ouy+I߷p=̣4P`}z"7d7cZf-ґ,Tu}1%t`NڽXHJ!-+N ]^;b[b# jWv-!Sm#-4:'g1aN~lX q\ZɗlS};A JH]7J3"e-U#2 'Y#c8ܽ(%YG m5nRU77K "J胉KuEn]RF.;#2gL5p{#[}.sE8~ SQ1[Hɏv0gé{{}`9sA?7^'x)]AgZM v%6k"q!.4^jЅq)i Sv:!lǞ^)rG'{rx )~>8% GC4;U`AqXwr+b?l{z`1$u8X7/ uewu!D<%~f16FNJh85p^=eLf\[jG`afExcgH|l7b7pv#7)<#8Y0{( ֵ_}\@|^|1w<\ljZhMsfdRv#z\<)9AZÑzc4Ǘ_XevO91g*'76X>`CnRiS"9C6 qY'xC$3;Ԕ7 l3̡z[kd<6i#N))JV+źpsfgbt%)/36EC)TgשgzӘ'H#Lèҹg75az>ކauk%$e|^khG|\ ]NPP:=ùq,'!HD(* ;2k5t Iue-i0'tEvJE[U>2 6#d9fr?`>.$~Q!E>l:7I8Y9Z 8cVGm?^ħ&clc@dѶ)tyY~/0@uN\ǬCK6=<=Ldc!nK!qÁ6['-%S \NcX{iӗ+95[g rS,X ^YMrpF`PYVV)/.DmfOMYW&>)/q ۡewUn>+ ZRX {4LRs'NZ!"1I=F}h6*+,^g̏\(|!fځXi;]Y*'K ?604# @g_- B995<9Ԭ}Գ8aՙ\CiV~fĀDrvZiF7cXKo|.@wa0Zl/T|b s|nw9yPsUޣʯ3yZǃ|RFÎ}nyBn5~@D+wufmQ@&hdai0crE  `@&E`; 8c|nP F&wZJB+Seׯ^m p-ٰŤ@ FYNj~Uxt$?7 h\%?"و' 퓈q[-eZ_|iimgՕ"j02/yu8(y$ȍ|׆TEȓy&P)a>75.s!khHфw\>q8i܈ 9 ax2޽t /|#1 Qɦ5Op/N= ~\s'%%04I? j3mRrU i).5T\TiH7)3-@`l"S<=ĉ>CFG>ezhRg2AdAnhPG.|ۯ/TńɞxCU -+&_z2)KZ9f=U9MmFP3Q.L i9/EHbhRʱk((K }1HEߐ$z\T+jUtyƯɀS'{tW#Ynf#XFb$q'V4i7ԃyQdf789h 4 ubT:KbԲ;MfZA~ $. AKU݉/J}Qj$oO?.L"cU(Qȉ,(.^$80hPXe<| ҉YmׇkY(fogJT"xuji4C:W&)+o'Cc S#Sj{Jo:hւP|-& .n(RۛxٹrU}m Xd00ZM(t0:55r{TBd;Qۿ[c4ՅO(|^sNcսDn,A% ?).ns+=Ã,y2b{h?X_)K8~4v~˿*rnh#PE'4rTkΥj'~Q`xjNp' Wn 5wxE8ѧƖvω,'7[֡08먠0*,=­Jus r^vbc-4KʛQ Fr-1E]*6)UᖼxTL6?͢Q ?\uHfԛ.jHGmzjﭖBx>TnXsZD;1hΤ*5,D!lq7'8XkBY]rTBrT+_)en[ڸڷL[}3l]qðrBSL9Q`WPCh5$sTkliV.Rr*'~8Ze!@2sa_Gc0X(q+-86.ݩIIpm7*/h :0S~dd{\+ Mk_ס#h5,5 AGG:ӯwBV?j>)/JCUh@z~pUgh]?@%ӐYv+eo|?FvRUZQBtnN/?Z`<N!&'D\^*&k,6[ o84̓&;GLB =+~&(SQ|h-@ {3 ث.Y0SQ iVktCƖ9Ԉ!v¿Os@ܓ z$ۓMv\ ôܴGsfpwʣ5vh+w\;n\"4xkvf"ԼւG ?p!:D2y+i/)` L x&lWj)QwfXh\r!Ĥ~ͰeP=EHgw|Z]D!DSJ03#BI0*d8adSw| 0bD ŭC}WDĦ2Xux w4b:F {)|=0kl$&S7L:w"bW'n4;kW2/d ~_-3_&IB[]*-VŔaBvєo).Wooԛ;ݐ.t>a~NE@_0֟@DѹF[L#a,j&80^lAblyʓ栀fd2Q%Y\ rk-D= u3K#6*KR0hMBo1L[9Zf<;J ff|))Jul9RxUcRVj^хHQdR|5=ⲒKؖ0/W1=듷E3~4R!7x{rlhmZw\MZ %ݙ]i3 & n?La.La8skeu7"`ʭVqD&'G>yrfCP[sz\ǖ k:bQڴ#_F-}`lE s U%CI]59k7qdko5 keE[POk:IcZU(Vb 6+7B/UQR7>(XNsFxu]h9Lr.,N.<ץaƸ#8:gW Dgz;8`h>T Y $ SWn7‹'KV9I߶&/W+ש8wReI׏Am}Sen4"p ^NH@dR4,p-Qm}*ep(EFDX/[Ձ#z_ ά;UqHТΒDk{ qk狁%kAš@/nR}EisJ7\gN\3sfZ8]+CP]ycvc$+:=}kN̎ ő ;~pj0 և#{aÓ{tnJ^]Wz>9 PM4 wN7S[Sli 1l@p_lW5}ײc[c-{HCV .РP:ۄr*9lE3 W^%pv$%k@mHRKXsE3%}b(=A:?ǐ64ڀB7?.Ib`$N1܀`[I4#d!r4A;jrI"1"H=`f!hڜFd-'ᖊ1qA`AkS;X]Pg<7_Oz/j>RCyWJ& ;iӓO)RU"ajr; Yw98 N'0APgoķ{Ă#lBAa v V(a\*Ӭ53v#k ? ݟ C_!8yBK޶ٌ /KtvkrRa.+ wɓVXd?q;(!uv3aJvqvŜɯJNQ4@% L5^JȂ-<ܮcrH(2A~ȭO,J8ࠃ 'A??i5e4ݨQC,?5]t}*ɉ=gF=J2"EHщGG`^Evfi+Q<fCj#$[ ed1Ɏj{r Dj쮜w8E;б5h$tF݊aU_3*OlrX>yqR@٤hiCl+C)갌`v$qg.GhwTc\^'i`-gwlsE\uAkL '0MenIJc컓qf'-qɈ9ɸM jSM T5>kLz׎}g K=3K^0og%;:"m%z]VāX$IKOȣjs/>+r Սg}h6l?:N?{V+2%;jxs2G u?#M&m{$,>m`=cA(ZMDKD9iKB?GC5p6vN[ӝcF~/ΡT|9"S.k[BM^~*aZHBkΤс49>LA#(#5 }bwD6*w!8pUe{甠(ZbHX= u)z$m o}*j:<}]6+p:q)IJgSj_F vm鎢"W h`ߧHH$vU)vmpgE֊NK?Ny*6A8\Ec˦8pSxH!@[} ]`ٹ nE艄]Q>2\ %HV h;9xB,"}09$kR?717S% +z667ӡ~8C{i~bskdӴ:JLCUONE,)Cjѫr c.=eqBf0ݬXOjX_juDk߂_rl]+Jl+4ɖ:q8}ë]TgQ;-J %+L E?A] =b G8@/I4BΌWzop`xL *TK2bG$u?hfҪ;W(܉?< Y`jK8wB m<\vi.MmT O{v~&&1X$g篭/>QͫОsk|SvM~YctƠ@Zr["w?J,<{z w]dX%t`[CnՒ\"~Gdz:hG=1!9" Lm偹K`'LPX.Y) tN "0n''4j9[4zPAAT6arWy-m]gKRZ̾ܲP"}3b&@)JAv>>l9!P;!"mmiuGE S%/ƶ0>'̍^u SX)bvT2sdzS&M0fFAan,Bn;F.H9T`~ |dWOR҅Xqc+v5:-)~b'{̓pD*}vV:Q '*l~fԸ [:=흱q85lp,)@atTVGbה@7|3g_ֱ)9 /.CW;V  .RV|351VwW45Ir悁(pXjUL-.(V{d | 3p U=oum#F@cV^Hb=1c,e:s_GZ,mR:}1E Z?2QUP5&~|4ҭعg.^hLo]1at۲˱&aVO<:z#wf|j/aب {B *7+$d:K/lTyT^4(6c Z9KN?+=O+u܌wW 4q/RB~7AVQ<Jo픈KpQH @%nAp(@lwֳz0 şȩ^av3g{,GAvx>u>T eԹÛ--Zf$$s]òF*7*W[2V}7h 'yui4ԔdNKI  V;?.$7]60d$hW^yrgڹiDzWk^$pGeb%o0*j#O%,Gjm,3zNǜoL5)ygx0l}Ξ~r'UwS$@iu4IE64n=IF@%}&u߇gm%loSSF(['+r}4c>noד[E쌯YmFĝBW=b,7ؼX o~Y A)qO:ƽ3O)b5].o*4ZqL%2{| &,>pf֘aVL : $^ gZ4dEb\Nх%%Tj)^Y1 ;j'^SG`Or #>b  G^U2F#9ö*]TtjK,htp`Uφ!ߍ[Bo$ENŋHrM35W#fI~ y,nG2]S!s{7sl'm2[MSҘEH1Lsй$B}\r8ʼ:([ 5!)Z.Ndļ@oNۇVtth9$b6O:+x9Ʌ&;U)%8+RBDdzpO/"JB9#U NvP/J*)*%}>mC{~'e8PعFG<JuCF>RʽJ[m['D;2Y m\wi]rtjgj#(%H!%ϭq)˰|x X "uQYvybSp$'>ʢ#%sj ](M 3͠^*gQ"ԫX8 J(^fux'&i}!"~0Hџ% W۠ϙP~Dm#nk K%V.Gv􄺠ϭr&MƎQkW\յ+Y_7N n/ҰJ`uiORkCCV6Qb|O]YY)cgzPjѶc>LK7&md6HbhI 򼽪DUyÅMGnd~aH9݅rJ)[hca97X8Xb'\("J xjMgfx-IJGZEXhzD+ x܍iNiâJgiztS' )8+"?@i^Ff2 5Ml2лNu_fa|v*an 4iyz!&1Rbk0)/0yqfಾ^=IQ`>cm~7< @XAni2 9c?pUS)hf$"y }z)駏P; ΙOE) lwi`eڧ]@ oCe- Cm',Ok<o Ph@N6Jc.|k-M1 //sdS7-^,#9,qG>ܲC%$&0DtL2T>ThP9O;~7"=?eoB7>T#7o|*U'Xx45r i6Xjr=V4sJ?qst䮫*_Tk|C'%&4qrtVa)L|dBVM~k$6feOlB+Ϻ*(, VRIHw7d@M:&p6vPQ oIX?^ă]#2ao<hPxv{ƒ@Xx3!j~0M~a'Ɩ.R)"_kkڜ >^ Fs1)F[A&I#[#3 Hq hRPމΒ``] B7\?ا*d ptBz,I">`'yZa >}TLE^7h^чyv@T G079pHփ-r H4ǚ XS63^-8I0\(Ő̘kj2AVF,a7@cDmc~SK/o4vԈ\񅖲SB'1#x:E:|gYr QZ#启e ^7] zxռrAZ ׳7@!My_F_B)\ab`!RA\Z 5Ofgԑƣ9-3}p\J [ JS< 85U5YAjݍy 2h9R1+ՉY4sMM-[O먅fGAFJ,MKADxqd^UډD>mjU@uӾblπ1\RABt;1Wm@<}G3JMT#g 2{?8}Abp)e b3?x2'nfk8vޛp#vס%JrΣ7ز·)FE)/_2n);0Ԧ0F9HY6]ᐐ:Qw]o_?S/*J39 ,R|gKPۨ$ϭ kһA#F!䵥VէEȐT+k)ڊK7s]ÉMڣ|[<j<eq{ޡַ 8ѷPak6*na.Dư u'(H\r䫙 7 >'V0V#-6y>_o%EnFf&pACE.]韮ZP˞v.+BƉWC,9/D7:x`%vhՕ1GSYC(B>^fD4;pL><^ ?v+)+\:<~H~z u+|$( ܳ9%b&%y']JKA}Ի^,.ۑчOT3l-j^C;zFxOtr:{au, ײғ岁}^(yp⬏Kɗ?*w=՘hYx ~ƨu?>n,'fHl߇+7_j#X)D ?w)js@No8i(Q,Ũ[\uVجR9ߐ JhUhq4{1[,`C!؁rEGܤf$zwp-5qU\T%{ Ywg+VrkUT@) 7{q:Qmo{`Umb @C Վ_"ASy-ቈQ{^_6,+sZMwT dD4#ވ[f㢟1*C*#_ qNhv^nb|o~OEzn@W(ZD;At͂JpKTP"t&;k-\!f}ٔԂ ޛlMK0.y*xOFYQ^~ъOσ+S^:mz#Ao-^^.  d08~&5Me3Parw36/icCy$e'xlf$˶Uu+daCkT`SJ0^edz0T2&DQdS{`!ht682lNy""ۉg KWS& 'iASF|Zjs ~7k" #o͚=fmn&N.\dX2iҍ-`Fis)93bf{ d_VR3--;ha"Nw3n=A tXW/iI2oe&œ9% :ހC:.]+;ج68@:K^YY))Ňp" UJ6ոo*fYo-Y t#u[nlf/'~W+wTm|EU^yo\F'k@>pgj6ez[WLY@"OV VJp85 :zx*F,r:V;*Zfr&d;M57L ՗ʛ[M9K+2@ &ЬgQliXZ" O >os,9/ƾag0U~S7oY|dEjOlΉ"/U×rzvV'͍bZ٢yE6Pʐ?qBѹGiuU!j%]SC#|ϔSJr 5 Ǻ rs7=d[;4 @k-Pjϋ=ځ`tu ]o#MdǠwiQұX"^8[cM8 hb.^JWPMyR 'HA-.FWzfư d,B)m%qrtQUP !Y-b'se-ڱ$_nGA?ar4 fKεxO"~mo#MX˳4hǙ )L,D 61go< pRJ'G9 (CLf:x-}\HS8/azǝžnN8sH) @%=.:,q/N^ު\f]|a<&aCK鞡7]K~mtXɬ_54:,N?B XiY9]Y+.vi Y|V/Ow#SHM݉(3,$B R&c3rB9oG9o4Cߝ_?!N8B_/xnXG=sp:j8/C<ǔY2!W .h*s @۱ݧCRcTjő}qJm+MoXȷ_ƯY^x SJ1%ҩ%՗?\y uIxg'6%;H6SUnyX0Mؘ%M͸oTp9HzV<Ķ(81-7pvi7(nyha2X(Ym$œKbՃKL>0o`BU21 &;]SD<*P1 |F5/]HRf۴6%b5zWXY.cBkCZ[ &X\޶naf z _6 ,F8)vݯh7NrE5$2Y+3NЊ≲ R Oi8V.JbN>Te5,DV%?Ɉ%66|l'~@(V Ke]f_w~cQ$YT1 E0='4bÇ']Vҟ7Z>c1kӔs}"м%3G[=q=wHI㣶O KI (%/ljӀHCݨIoΨ`߆ДH&N'z}+5 `,[65)wUx=B$7F ]&۫$fר o!:$/m BF/2 d VN8z;}_&8e=d8/K?8Ɔ.T֙GV Y(T#h^\ϙݣaO/7z6_S4k(4s0ѱ&-eݸ鏍U6*3: .8y̠?U$(_fXJ=t<3ఔ9hhŌi?Z2-\yI;79!R[ALc V?P3 o+'A1oEF}AER?W0VU*Y2m6kS#*WuJycnY*COC6Go|h*K B IV{~S;=7XڷHdߢ3$*b=$s p&2} B 7s/MZ$J:!-6F 6vqs_'pW,y6⌂ :KWH֒9aǗ0rxY'DeuŝJ$0,}Mb657lXHhPYiץ5]kN4r&nJ[OnKnAw3r7C)r)>oЊbMA@,seqkEK_!=cEL[c48{8ExC DO8.=#7 T}^؄lW&4Σcu|⶞#iE7QYDz[K*g&Tp _7O} MLYzK: NJy`*CK *Gv Q * 5R[ALfK$㈅Ӣ8j%tTiӄ#jPXÂQ#`me=Cvg5HLɈ^j=ѻXP6 Oh뽙J|cc;y )a*xF% (`Ģ!vDY 9pN}MT{ Mu?=i@}M%QY, M?aC?KNKuԯMI]Y<\|iBF-5%U\.<Vtx>\Mm*da KkH{&n>s`i&ryyȉ"3KG  c֓yd#9mR y (1-rnfOV zeRI.Y/g b"}ۡE,z*4CgmҨ)Hr_ƁߧZB3ޗ14zM ܜ:uVO:m<) 0}5n X&xqAorۗT[&Cn=VWEpۈ>iK4B3X̋eohQ+?~YIZ&Wh^꧋\}I9rAqm/'oh8heO(:{ aK^l2k;#牤,BCVd6Yð6&oRWs| 06ZsEl,ecam؟V'`ΨtXcD)Eί`ZkM.@~ } |HjE U !%Iys:jzx^̩c`./3ysoQJ:28Ƭu(1!.&)pQ'cg `N9E"~[EnRZ!XP6 3v j/Bv_6 غ+b'.p2C I_m,FS&!][ө/HDJX9.ԭ> Yzm'֐ahvb2~ZE@q`G A3 }5KTLMt>6"؎|={.^nu?vV? }Lҟo)7ե3&.*kL!LQo-vkx~ydu84ߋEtTkAI~ݪG%H!bSy3T^,1!I;-f/ Uo .GDj/:UrG?CXff]DjIKHn+afe8 Лoe~>g L9]X5#X$~Dٲbs83%: Lnk8٥u%])Zsۉ o7[GRc/g4*Fä8rN\zd皒d+}3YzK&z$~|^Z]ɷN>YN6U6ж|zŢ_d.=g;QnraK[)-d9~F/{2W7L_w4艀uR_&h<*mSC !?.E%$U:@Wr FP:l^p" dht˛@[XY Y֘)\roEom}D#[gSyrFi6G1D~ꑾ{3X,05 *k p ϊ8HRTxq 8{jMSihxMNd>e=Exo39a *\|g _Y+SQ"nDtzU-fa/v,\E6>A邭ajz[ ^7 _}q+щ DiFCj%LUHr7Hqh1:tMRņJT\ c%8v);CaXӬ=A-ͧT]VDxjBo!=|s)c >#67WF`yȀ7RrLy5A]蠊'8wJ-Gߚo]>tzFH8r1ҝ+7 ج@ۘ+IJ+hy)̯zĸ̀ Fm4c}pkih'w~ǨR~rKGdμ !~=vy\02  Vi?d>ԣFȏ Wtg$8'FJ9Hj]#{b^OՁ:4Pd$=lSK|%Ranr5h 8 HSq# ?>8yaL7 u逳P{n#+W$77g_bW7?Q&TUT P.tj;H.Mqϖ2^FQDb$3cք_7T#y2X~yXE"}eǤ[]E-h%N4&)Tpdl:^lOÕy lhy J,Fg" qN=67:!y0aP'V ⸧:V "ɌԫŰ24|;Aϛ5ot_0b:d{m(`F*~00}PLQzzhYWڸ @O7j2j^h^1(ޔ"Hʗ\#qwFqaH5?q}dZ'0p CX'Q*I6k)_.psTslswp#22 EjL5PZ p5YνcbwvoG `@]%/׻2gT(T9i~wD;g&"6x?JJ5T@@EaqPF_f KҏgWOiW 2i_U@ ¸8ݑjU)P,DI(^[縪2a5Ҡuw#Wr{K7a #| $@IweSocѿ@'J4@Ev):cPPLuӺHGdJX9)>_3BJ <=.$oF֔:\ b`)wWoH0?ʅ>+Pm/ʖsC$ˬ%?Pↅ*QEt?/jCUHUWvU4,T:WK36(Mӑj,~%^X`Ѿ%ZԭvDVsSbgk¸vRY{_j@ȅt0~ڗNt$`+W ŐU#qfJs듶6}CcHK(̰un( Ȥ}U:Dutxl0FD eMWq(`JgF>:>2daۢYuTtĆ^~,] s}[X,r# 8n:wU'G86n<]i g8$Is|Oɺ4fдY޸%k,T9Ml \ݣPnw]!Vk|L,g[X\ŪH}Cqڂ1nrCȰxT*o4[(ꯏgd<ciLM ==r0u ڮxjI ǡÓt-*h };ݍ߷^so ~Y,.ҾވB{r6If+#) t5,rMYdfF O{buQ8j[#wQVV!"?X:̛`>Q05䒛Ts5.wgǜ+c {//ۦ괴 _p5bݚɅFSg5*AᑷFÎ}n*$O>"fs>Dja^QdAy q<5wS=9;pM 2k$"E[xK6,}W;hu)0 fn.WY$rSf9:(5?*/\)R=\/T|[ddJ#y~&QD'zrEɭ)@Fk9uw[b rW䩤c`2uJO;OOVǃ?(a0G38P@j,/qR 3}{-܃plٶud tw{$G0(8U_;j38 4Wāwh8XO Iѱ]2` ӏ0E!Vu.=פ yogKN K4"%:2#'oY: 4bL']UגrW"n9)=匊i3:dT$Vko^UBVcH~DwbJ&XYu~U 8X8<6]<_fOU>Ka'{:ٍc8B:x].۾G\sa&v8FSb)1:[Wbe_QB2t30*h rBJ~pD|c#ޗ 4Ǜ?,p V:꽸AghYR=ގe?\f %w u[Fu)9Z؊sP)2"yhu道A̢O`4kK1C|?Im Q[4UhQfæfRNhnΊ0m+J;cME EQ.{l(oq>q[P/a8*_^5}Bԝ&? ? wgiABW 2h #t/ ]>G\WSP" 2qxҰ (!i2oMܫWYoS{ PZ7‹"(RONUO&cZ `o݋% v¸뇆LRmE(}\"clbZ63eqAΠyJߓ#;ύį)O0$@)ˊ~e|OϊotNO&Q*N![F=jnDxG áӾ>Xy//tPfu /Bؽk=47ތTc*TxNU\yDOdf]T$m(7?6Xu9Aք4ysѻw06^chI 1X@?fz9͖=ֵi3,Kߙd [Z J(-ȞQ,ՌY*ZIV4Jjsg|Voi4o~ A};{d+m4IV^;:G(;\9o\W!b:q%ՒTRgRrHqaq ALu4l _E*:FR3*?_`$-H /BZ6vOh"ϫ/ݬ[4~Dl(=p0<(nAE(d<*sZ kB{FosD`nmEG zn|, ˉ<Ɠͯ1M-!㥲'uxrAy_XO.\n+KaA sW4F>|:fŝb'=K Yڤr"'q0InMX~uߵ+;41{uӑxL-3-ۿh(Z?@vJ(3rv9; z_Yk.j x ޱ"X: A(t!yV-~}hHj5@S57?捖Bq]toLJd.8l$3Eym#~n:sPr;SC3LWPO]Vo`)GItC8gN@;9S]+#;o|V,ukև=-Ďv'ec":tC+4xK;#^ }.}ľ.tV,7C6E@;`b)lBYdqC ̴wB&1pH8)cO+t)#| vWE7ƜX*UB TX-mä_/ p_n< MJm8z4GI/^Ct?6T?2bZmH޹%>k %HMm4UdJ)oED*r#YoWc8U޲E,dk{wtQ9-?1NUDRI;-ؼfOI2z~ d>YSndw, 0qr.JA*~#,m\<8=zx͟I3FVV=zpNiP?: .e)wJʫM1p٤Z. wUh~uDpܩW1M&_HLuL|qDOh_IUBRR@:8QY&5LgW/, ^..AփvT}Q@"X¡Sw~ò8#;]dІ:r/JsKخ{Z7c r"660R$WI6D*eg7wKt eҾo0 JG"\^tTr$o[a_o0swwvέsC6n"Av}odfu" Jg=H3s1B;nDDSRT?wO7ߣ] _&#D_mLjSUW F57bl l!&*8 qX`m86T%5e6|nF=^p"9;NhTy6XE1=ӳ]ΪЊ|]Pq#Θ2=K)R9(F q76[\t1{(Xq!O9\6:s?C*Yjm*N牆ZSH!SRv:,51 G6#g 9=)Йl9KG LzppI߶<ё~BbxIڶWWQ y$٘q8F;hZu2a+ _Kub4x ZTB"Cs+NCX83I;U3ypM"kVo1ρgy}oepACi̱4nƢ<>{σ1uvu8 &HJi283Q#sG$Mtwt`A19B_b  䣷럱Uh_f^Q˘fC?摛,6WXp~6IfCz%AsA1PLFmxb%8^V{$sߴ3\}"I1cVoRUul DzPVc}(= ^Y4kx>YH\<[:bU k޿k{ ECxIչkXuX)oarUpBMf%3~:;[vƾ?h1*|N \\YjlOʼn|toRJϚOcLh6V~5 >̑chl[`f^]ٙC`Wl>mhHnsXש!1ͭщ_]ˡ8љ44GS"ur!ύBSZ&hX^l)\ֱ'dz\wOuEhXqxi䡢4sr!TaTjěm2 H>1f B*@ hcGqg2ܔ]s _i۶3%;LϼwX7( ._%8\ϼ֮ |R!sxc*dxĻʇ{8aDo+|U"ϧꒉ|ّVb PƢ6YYhCeIԋlpқ?U$V8tHLFC+]93.1% Nq>Ŝ˥~Fc%.a7&%Of`h,x:G$[|5o8D?e_/;Q)/L֛kk"P*K zf%38E,j.]Mh*0.KWڗMw뤙s)M$%I/sH :b5dy=IdDXi3ۥ Ea/CZcXIɒJһq$fI0̇rr! 1V{e=)&!9pxdѧ @ɐVf4}=s)ȣ~o߯{<1\ .M`@u4+H W~azR^q+oicL*w  P' #=R X[tl x7aFnؒJ$K\-'[0AmWo_А=-W&/?ī~C"JRQH̸Deo<)X.8ꀅowq]GN8WruNhbʴ`lԐt~GW yEW_XtުjZ]RZu㭃Wax;lB0oo&&O {HC:ij_^N(!3"#"4VZ Ꞓ\ 39O#n=FLjJ"z" |@]L"Cθu˜JiNA8:7tM B7s18xGz1Mv'懼UC'8< "QV Xn_kD FfwƠϜ.9 4խ;QnUMEtb~K`J BvsxTo=ˍ')Y>`Fӱy> <-mv!9R&/ZГ,TDԝ<5ɕu]\0&J\}_Ord}=HMGVR)%t0q焹_K0ȺeYMlV| Ш8eTfaawA5v40,~W .ӿlٛlߢ#7JzQ9mw~/eo#+^B$Fhsɋ@pvv0\ş0`چNC̽|]O٪й2%Δ#WAc!LP?kCag L_%N8l>w׹;N# 4n1əmHHҸXxco{e}FZjsXȗ4:34qh#Sw!c&e~3eNdrvfxtK!"}aM|TymM1u uQs# :դ)ڛ`c]{e-j#u2eD. ЪT(m,e$#)}r];l&8n];0fmi< WuW4t>{۰gg?: 0Z >'7:种%L_b{Wk@>h/D%ӂq7dZ[';O4PjuΛ a÷/iïS;ԲOajOAMVS-6MҔA#>ؚo 򈆃/=,x0-VW>V;"=_\.0y-@7 =E)MV8d7*e9լTsf*۴FzLk6Xb+dOD"?hb@6A!~Khzksxf[~& DB*x^*g4q+uwA! #ͱ5g-8! -A/A[nߝ~v؈8V\$r{H6zib؋b\!v7΃N4ޟf*?lWDF#w ü4AJ=Ar N쥯:r7BXL"Ӛ9vŐxޫuS4oQއZn2O!f5Bw,=Pa1-]Gl:kCs\$wdɿ;VrhٞCP?As c.'S,,<ߪXS_my+_t'֢asԬ޽k/ZWh11SpGM0SJ"T3>TKPϙb{j8t`?utW ([GӋ5R>䔴?&ak^Y&kF=k^̓p9UKUH Y7T !Weu3@:Om7"Ӽ^[^Vis,zpi@ 2.,.Zu( *ebc0:C[n,.>62YxRdfG0aõBK%𒃌EU L( } @hĩUr_H~Z*/M]/Hms?X=ީƽ hkRꥵz:E-3.. CqBbܯ؟2~fTdq6kF͡ܬnN ȠyAuxoFbkE[^Vл5s,;YYWhف{q.]^[= 5I9|ʣ,f"朑[!*zdchPB,N~IHwSE0esb\>҇t&wA#nT%?i= a^F8bphFb9o`>␪i/1_ٯc7 4i:a|W tQ(T0JA,{$ xu]~nOg(Ť8;wp6i:҈>̥LHe t"` v`9l*X/8/|([-[U j5:gd @MeI^ޙiTNc2qpgb\Ͻa 1!A?Y: g 51ש7q)qha5%2!9\#34෵pe-jER'r5#5)&{nݏTɱ!e'O{$2_.vɳ8ڿյf No33@n@;;ϗWPQփ*<&T֣fQ $uB' U9iVqWt3MMR#J#ŗ/ Ba;K hZ .S+ln_K "!44qr(UՊ,IO "ddј1cqz՛Fd?5%l0Dó&1Ա(;J}#~2ɤb?.uǾlpM*dsEAKǛ+PQdߙ$%$\#)CfJeCpOT$<$ߌ3 G"h}mAm&Z 'e,Ddt.jz =2qRtg^$ &wQﷴOɲ8?La f9=cU@?Hܘ M2QN@֨^b !@sd}S:]4HGj,?j S<6N+̋Uy Ia-#Y@AT%7BݏɷAk)>E Θ`Ӝ\P?мK ΐh-jc۔oHE؞\+YܠWS8R蔂B4Gh52&M|̞W>Nn4Swq WLعQOBVьW .z(#ʒ<^؈-9<吽AKaX305J=m[3PǬIMr2߸Z^ *aU㘾qx/ ԎRGD>W;kJ+.cLQ!QQ 'DQcfJC>zHY;Bh&8u39-ZC?SdP4mrcF'Tc'L$;}I_:Y;n]k @=~pTB’edT¸&'gŤZG@g-HMx=;v eŖ2CaK(+-SZ\I GOh65hMJapBҙ&?Uɽ5~^X/$t'21lA>M7; $bJ̇ > `k1V$;n@ z(sFQ^"}K"-}thd)MY yab?1:Zb渺{C]JHZ1q ƤS"4Y|yq]p/eU"5vbER@uY{#]x7-R^5A mHM` \g>lDnmA^. HLr+b"7>–;Cs` xqKmxf&D',‘G;| A9tg]N!|-TC 40~pjV%ZKVĩ-iI]Z%E~^sEdju?_gD:qMmm:`]"uHӚJpBk?2g՚!S@0ACޥ-o=8 %mŲCk1uۈz4,U! ?Ĥ4A%8+dms&[|aprx:{3ƽ.t.YA*%:W]Zo5S47C l ]#mxzUiо{BS}R½Pm^+C^X>;9n(H' *z+X,~Ff d)k8IHQ6ε14, )JJ8?R΍-7,zYD'C@w`98OqB(;Zf)%mQ!~ڳЎԅU >KR cnUѰŢ8ueTí=z{aNz23}#uw]DkJf]X-NLkyp1ڑ p&~]s3cRvC2PgMv2pd_'LǵU 9]MXWmXEYD~"\h}o (vld- PbiT̑?>HAЁTHAc? LD>zݿ̶".˸j/mqs*`WDqJLmǼ2h苉Q0omRzퟴl6tts+fXʪx0vp.igD 0˛ ;]Dc`g_E3: p߼%ܙ"fōzVƴutȁl/H7Svjb:=% f~I@,V>AmuWǛQ0-M+K_mڊ6\ꠊK+HJ:G=p0ݸRz3L Y{A{\HA1?=:r{vX$"8vLsfֶڷ[15Z[@Wtg X;UB> $+Q$ H}X]IpfP B^c)+&ؘBt^p5g~[:K ł%O>4:Kc KJVv-@Y,29j8%JI5HM9|yeo6.gVhqNmGP(tp~Z{,B}يO,U}9rcs솿l72@k=3}ͰDLv-N5‹9nl~2S|Y» e&a*788ǓW 0ͩenڇgVYGBŇȑ2'W‰a^6N@ Ǧ]Cy;a|M53=nEӰAʂyOlԖ[!PҘ>pijm h}AA7[v%BX ƍZM?Xwx s+.>;G{+ t`AMNt PL,Yu:<\&O9a>@۬ߚ)A㓃B?r&f0lt1\s&X+w*z~bpm"j<ĒZiv6߀;O ҰtJg'P+lʌDI|{߹JcFb"XBYC@Ku]I;Up{]V*@8ǟ_~eҎO}N?QLh?㱋zQg)ϻG8m`boބGKOĺwWnn[N7EG'gBˬfwW:: U`%qy|us9Xkz : Qt}v%,,A#o]3m_8X#~Uptm|3Q\5%c "|̯ٔds:mz}NL풏N u-Z~APeM[R=m ;G@9޼)2:%@^He)U8y) SQXb|~`;ljז1]Zww5D`3!`fwU7mY'a*sR WjWB;7R(ɄH,P%.a2ֹq9UfOe^ L=窹sM.1E G6;q.f(,A]I>qxoӉV)MC1"L5*>2zT14o< O"o}l)Bu]$_'m?p#8g%9\26#f<[n9'V&.BnTdvfunl|񟫮 fAaT`vvMRnĽn|lP wNHXi#@Ӣ=ЄLuH;=.czsDGD#:t=b98*QZ/e\UyΓsJy J40X~ٯ7,OHgd ڮ9=edecL^nVBBٲ]`UWdWC_p7$87=g%P( M/CKxf)uF'32WIoh?sqdMN6a{5DvdREb>ՓAЌ/{:tDsTrEI$x%֕&,NP[>܋OVˑWw^G^acgbUfI;u=G^$#BaAX3'ZNUǣʂ<i(^lZPR3iDF8☂+)}J Y=7kx#G].}ALy`1c]5lI,l|Lq92݋te:@|:7x f?A<,шm-_fA#uys<\!F<4p?u55Sm/3>ðjm{NN/` ,DT, J,e[q-ӿ4v?2_D%$ P)YxN>C]I7@XC8;~$N'^p݁*E4Ҝ!a ᵪD6g aMyت᭕`#RnٵU\iFܦ,l,V!J"sճPƄGO}E#\BB""q3w*N{ 2 '^XGn"~!+W?(+OKӌ ,3I0 3 Es$yB=,pxŸVu_X羖jRpErc"ib8fQ!srߥe~:=ݰJ*.ӊx뢈r(I'T @z,(&s(,ovz2ۡ‚򪡤̯XOJg;NʣكC4(ӍSӺϧ-O#kc7ZR/,oO1CY־Dô!j^hC c5+s2c )BvޮG8D(|9fWؗyjjҲc/bﶰ\16 hH(; *$M O3-hyv䍖d 2܃Q?|BЍMbe>Z [[&ng߷l5x1{g&6Ku@ꨇrPkᜮ9Uy$q ^Yb]rKYd( sƌ4:&b@eˡ;*Y^t"w98aղӉ .[+CMujV*4xc(X&)e֡LЙiM>uXH17w,VWI緪K;,+:įAXFJI }'f0Gח)zp͌]?Crj!>/i⇘5TB?Q>тbYב}Bʄ=)8_H٧[}oRhl(ҷn/pavuAinͰCYCk * ua] d} "?ӽ/țn)#F'OWwo)7,5!Wt% c=b(7_c".4Ei6q5&` .b0?oʻb hk5wow}n3zeіg޹@{9?'E- ldׇFkx[7v)QD7d+ʮ_}ȢJDcXRZ\(F|\-8VΕIQڋ yJ`(JYBjL{7!A. ν,Է=;>#UdUqgy? ?]\h3'VgjMq$X|Coˊҋ9ՂUQ ='Fq jm\A8i:Xp0a|jQFڒBEbE()ӧ>AG؂ bSu ? ι; L:f!ݱR2ALb]W7hiY̬. jL+tdu2&r?*+ikS'_~i,*Ah3_\=̑G4qC޼X)-. #VVWm< KF@o k4Vcr%v6_ylC@hsO:J(5-+!YzKrیW5l/4pFY5Z8ČD\ΓS5#*a,cvygN|xWʟD{)9Jr:vv9O6R@n~G+LMj ڼP \9i֘j7kB w@yCDnVo,[Dag\f.3EH3>dSEӀSח:c40gOaXMP @zBJS؟ 57QUI e̋E|[#ǭI_T.:N0`Ґ+?.RԌגx໿' u} |B]sz@+|S[kH?dB}꽕oxu+ %bs\Wc1qp Y0uES״MX6KVmBUmz@s'1BBxrU⛮NqV0L/Լ6 M>:8aEr}&#GSNpa  "$ 0l4MùNkveԺdc4E6BV/XK[RE(Es)S+) | ;Q xfrxwv w^\WhG" F JU5o4fv J1ѭv%#cG4~lšv.4J'  ;j=SEZ05$;ꞏY*Scdd^?2hM7bP=.JbLImJ"r ,\2i)TrRPnlOpǠxRc/ED{q]y"JY?+_Rmnnaf/1G9\ڙ= Џx5KMVA lfMzA`ίtcZK:cCE/ Or%'9NcJn9ƇNfY.ThY}aZКxv=^g"Dm?zHiM J$ϷϜH0?%q*AztC/^l0ahǹDco[8\(W[o@ O;mgƇBGuʃ/%A1GI]L\bYJ*I> &"Q틝}nM5Qj@=K\yPaJ IS)3lS+xS4dN#|ee;n] fUZ-n ^ \'I|SwX`Y;.벶Qy{y6N/5<<ؼ5sX"'23)6DeH3j~vfT^Z`|[לC;5]Sd7NDrØl hntu|\[F^p>2N$TƲH_3j}[_nmn {'@dzr+G̚,t%hk"2? iuZW6K#a9́iX{`QP}) MN\9^c-JF-@CmGŤXxi, ; *?J>tkmĆn;{sn/[ʇɵ5D4qiuM2t֡֌8mH۞Qrqwpu3cSauPj>H`3BV?&:Wߊb ׵h睐'm! }H^uR\UD"`"9G(l ԎؤEq;PkYW#?bsAuX2 %%[` AIׯ́ U*{ ×[8_irxl. _fd)!eYt lvâ ^4#lY@ ScRgk"ٷ(y. v94~nD4j4F},01 b඙$düA6j$ q_E[\@ڍSUJDp>P;fO ura#X_I '#Q-5Z!LDp#3&H~29Y E#&QG$7mi0a)u-Rb7E7cڹϔ%Ig~KvùpS6EYH~Zllsrz{{6:="WnPM_)(p{{npFNKzKj mNT FDzQNg]tP!4X٪.kK_Ges /ͧ/>2#;0+юs _\|˧UZRw68ٱl[*Ta 3&dˈ2gBiF zeYŨb\Bk\dv"X ~7;<\%ہa,.čj-#Lm8'#d'ˑ*}!돳1++)[C;.D.%Wf"6HCEv tצrX#E/} /3X>Shpp<_v@"f3K{ 0,*d+S8_mkݲ 73 :W+R݉7_ jCUZHF΃"Lݼj&YX4"jny\S/{,&ͳ3*oD3mwř%AKS'o%}|v"̨l{ӂJ+!e9P<%g jͽ |Ⱥ: ѣH \2Qҽ!~?zJ|#QU 7B6T"FTMd궷B2Y)%?@S?l.^}Ok/+M+OWKz*D6YP:* 1\d$.= tcTH@d4tؕ|f&= $KcKvOrкn=H` wWtC\E&Qkjbw+ăਟK7<63-a§O=NTɡnٚXĨڗuuIW36tsZYh; Ad֙9&.r }A=\ggGNٱGKS=:24he<ԠMq} {b)AO93RE%:"]M߳)>GiG*]'|(M185S ޸ n` lBEEf-SkSPoư폍Xw[dN4wytaWͶ㝉o@叮N֜;Tƾђ])DY6YZw͚e ,G}nAMvdG?Z5ȩvK6ϰs|LYXlER+R2lICw*f9ܑ^%ދmRv炠[h CHɐ>fa^ iȎ΃v&>"#GMH9.Jv ZHU NXoSj)R޾N"~Ә'ٌ˟YQx(]FS<FŖHk",LXdpIZ0ߚ%m.xbAʟ6@Eiܴc@:X-0ՐLHr܂n L_Sca0AHX]$٨KV~"Q9̞+kJO{p)0y-NJ~C fS@RqFc (OƀdύN}"IXU],E@oYq3f+T"ʎ:l/1MݲMdBC,B+ gG zEzug̓D֊{pr*-3Qv._-'_uӳ 1V;-~k3t!0't_P؍Ɗw3-A$߮J1^i\0Mv:)vI2=z1tpb3 pӽEcô.-51գHnԗ繁~ 'F&AC3C=Aypnۣ٠`6p}^i08$sˈeR=V ^2-W9aNʫE9'Tū?|VeKs@e,/=+6t{~"-R O:QX.fh`cʖź ]=#1aiHڱXrDZ}$Ri_r|U$i-m}+ӖPưDw{0QOd[C7mθ͍;)yGs*1L6;D茅;m7W["Lo9R*=|fgB ܋0׊:ȕ!& GweGp >Jh }wB>:u9c#[nF/(K~}閉fɂ󎉟ܜdKb>(UPb)"qJy5 ϜO~tm8n8 l%*/ZT X mYCe)䡐ce,lN~w9 R4I~oYѢשe;oPAi&Fo@[ƥ+ {w#Y(YLٵ/"7 ~ qI9|I"{qTJi.h7ZO#gl))pu*v |J+WD!%'[xFWW:qrXZ*%5HS%T,ru/D6<ڊiyN`9N?F@!z*Q9ѕ°q k$sW<b빭!·+WBFgCma'dpw六1OfX嬡 opѱU( cd-(hX*`;p_WbؽLug+Eq̛e_"wub#v).ɺƊ[BԆ^g̀k@Pq!TAI-2w(>n>IZ$"P%.+r5x3z~]Q>@$bZg4ՐȀ x}IG̑]\ و + rDdJ3IQ qH- 1^scBbuwx<Q+֙V 42y,E (6WC@r 5NI"蘌NK=n>-^7ۦGŮ,f!QMfH9BlTae܉ptIϮt탫KAׄŽPFb&S}D,z%;l uvQ*D+d8Nh wɇbl} ?fnP OJ /LAUQM fɉ@R-$&-Hg!W3f)C wUykXv8{ KPx͵M%rPق>*R.GLU>(fuα&# VxxA@ƆQAԗ=Ϸ(E im 5@52Nü&D%1iо;r2A̛D(ڈ2WɢCwLsi|Re0:o}AfdN'0AHa '⟭(˗/E{{1* .0, <ѯ^h ]!HoP+ׇw؃^7C{M*M-I<.VG4RYVgMg߻K:(5C[ F^>  QI+Z*?-:QϘAH4^< |ȴ;/-f~˽}8ILeC-kBs!+*$@aKƥ?JV+Aڲd(CL1|L'3f+CenV.a936iGF󇧌_3F)IjX߱r%d+PVkEzI}_6~/ M!ٝQ"  ]_[0a:k#S@w k݌и+J#3-)A[͸۸_ɕzV :+D`@ɛ-t M=uyLoKc'4PHY1 *jN<<"& + v/[[ٌHb `À%ۄ)w Ks✊)Vb8D(]uVX;󿿲 F, vFacIC_]ƾG'}%:?Y/̽tҫ*/ZY\k H(bCXؾxT#ҴȢB8Bh#G% 0<]:Vu eP0~qLK"+f-I}v$Eb~cC`^FCV@kw?cIKhmO|l8"|"#0h_Aa sy3/';!o)qFZs)طKsCq1e|_ hS^*'x,me {( KЋθXSy&N M2 \ѤrIs~wm"Ԡ/F)c:2p>3PΧ'D;qZM E qrz,P]s붅W+&KK%҅yݩa(/G~ 2pBtQB88>by+^!r)uA[ۺ9%v 7ꏄ·-q}|vɁ`@eN90P/'NiL`$! aќj!6_dfgkb ^Ɩ#Z,Y vjcֱ4NΠs n 9:6`eYu yvN\/+ @NId1P~w=U2Z15%Obj.? $Zl6O#dʥ,(dj%-[]JVK䣖>., I1p-*_=v[mxoEhXj%=i=w<:3q[L2BE&rԈ K 1"h'}E R'_Ξd(67m4^#8ytݗ*pfO 4fߤ {*]fA ,~z]gDûb:@<:$@W\H5ytnVzD$͜޾0v7Tn,l5L?zǗcjjN}8,ӪMYTi`Cր=+) jIsϓI6z| FOGe'J MV#ڏW;wR&_~E7#62%<^0Q73^]H qWu[-jZ0$ : g=|Za33#Mv WLe;DQ&e,`\Ǥ|2{1 tv;!r{¨1Eg_bSNo:vmI?{?c%%In40Ӫ0Rp WɨCses '#sq@7 :jwP?/-fDҏ)4a/gQ~!Gle1R1skX96J⭤ tC\~L~$@0h&b!;*jq">A$ ;PRNpօ'\bzCkm~0b4m 2, (lwSV%71{#Q_?Ex2iiLK=/z)8ڽmf.`ʹPJX#!\ni"R7[B.# -(D8#~6wNT*!b~!(} 3MiGָD%}5tC@7}RԬJwL2yģۏt !ڈl%Fũ.%KC܇F& 2"fX^fvs}o8gG(YTƣtzdSTY/|="<Z9EuZ pi6{3dLIsa pC@vv2 i@dB l~`\N'_9K_[ia҃\ܜ7w@ޜ]UҧyۛQȕ➀[@};;%_qAQhXJDޚ\MNQ ӔQI4s$~X2aTǷ Z_Q7Q=?2"T&{LX`k F[ܭ9 tmį&#NiC]]&,9-Gɾ%E2"@Z.,;ln6=`ֈv)-nq'?&)&@!!SEuRy*B੅4dR0gkN K^īٱ)|f=fo?Juv73]t ޜ(+Qz3taCކ@q(Qhl\f]v]2;"&̮Ҝ]j1h e~KM_4U+Bw9jɤHBԮ[^Xa? nOӆ:|Ks(hwd7UGXN>)PrS_:xJj2\+GͰv<yC%HAbBCwc@!yL67[z"g1&pAU,&ɈU!8/E2t@J4ܡ05@ |䓝4`YV>~^{w]x#W`JU0^ )83Rjs+[t\W]Ji" @Ox~/91kOŌAkt8#ڹ<ǣ2y(`mkFXc ZBHEX8>2+_g$&_@$;P)Hv_XXUu nm٧^WܖRs,| >!t0קPxbeceW`8'8 >vu^l@)a^-˭dG9yϩ A&m[0E+!~yE#OesI}Cb }n zE  ,+^kNiwC/JToW*kLv2* x`\xa qi o#թN&qyX AUZ}4k ޺c :zƓ r㔙SžfVBN,s%}.itoJP|J{F%@/2ِ,Cñ抸ıEҺ,ߐ)K@6^9muYK1(cs 4/$H$o{c8w1uYsA#nujhULoEi]9os*H)D匁~*S)zU 8DoQ<=uYжV.kgQ G9JߊAg%_kj{(7# luG{Sz52+%'5ϖv cUEqX}n{1Vx}k`QйoB Tgu?3LJ_ؾܞJ{Aae/6]iKwoK OJB1O'm6N87uޏٸ4MX cҠߡ%YSݘZu=[7# h{-q NI3x\BIܮ%0eW})4}Z5JENт.p4Z|~GqQuW1y@< nyd` JAd1S%2-.%FPWBpԝN$hRIgr^1a}Sk% ,&>̐ y%LXɱ.+)ُ:#)BH\(F XbCЦ|Bw _ǀ<}yР.}\!ZѥhyM5%c=].3dJ`_ ݎz7}"o$rpF6LAAQA J+;}vxhmq B=ȥ6eonIT"*F3&P K@O 3VGX`r~&[%6Ϸ]_9hhk;XlhF&шb&2cw)v*_cv!pAZ:μ3qYF5;#_{^vǵU~sZl*e '8|TyKLHo$Ȫ6İ༊h_G9;7 u V/Sh+K5G@"b\y_]Hb\}ʽ+k6UMf)U's#~ qa8H\2tr^;=M$pфiZ^1Пv XH7܇~_c}..3W }%1fQ/]:Pe r?-$߲<0kUvw~b0Thӌ{Oƨ'>2˖=~נja i:嗧d!;,=*C %8#`۵˗598dlAYL9һj&-&#?-Y/wV8c|4{ҽ{c)2}RJhB7n:E!^1|aАX&&9VՠL|kԞNEE)P '6tSJCa4f2y<ּ90=T#nCMX5ҧ!ž`%`ѽꠡk掞'"bˢ@ ņ`A9Sb̔Qa`QՐܖuf$6zbb@SNW*aF ^0%8⵽gjX[.)uuǂ!06K\mox$nSv.ZfMr y *ӞOsj,]4NtS ۰h~_yp' {1LE,$uRpQg(F(h +$JY]5es0fO:9L]O?nF 3g1VvYϚWD*S1rglJuG F.y^MPr}. , i 0lE/93ˬvM*e9+Te.w݂C w[1S|]@EGbP1OV#\ F H|ΤRua-=]ƙ#=B7MГkLX|5qӫ8t><1j:muB=v}k[גV%;@}ޯL"s ,39J=oשO*xVB"*<ck'Uϗy x{a) J, ٌ! tE6,>E[oo5b L' M +ž z36 dT z:Խ~:E *#)q6UL=G~8idf<%xLCJqKu0#nY][< J}%rl,AsdB!KU- >V/emGQw6Yw׌!gP5J6W1gR%d ΩN_r\dO]ny;Q߹RZs׽O`?mF`VC_9wgX)QK(& SP +wsM͎ "=*=ɜ ^E>Mdp4]"= |"NjVF\Jτ֤.5F.TQu[Ӽf9kԮzϼI TGc p-XG $91f{ܖ0ɠ@EU7BCnego8ֳvUlQ@ҩs^R1אpW";IYW>2tC#X?+c'щ:tD:A\ z6ܚ%Yq-I} ˲LUS\B,#gRIzl jF?2Q.[ q޴K {g!7wT̲u␠ZLq8Ik:Ag/dުvbhG}[2ghY =&OJ4JDwVS~#\q`v(]qR}Q+>ueyM!-r\ST@ۂC¤9inu=U69v_?j -F1fP6+7qH F[%Fʍ] -|wKx9.mi tDDG /}f iʸ!ߩ"|xJ[H>>e7A2GZ =-V,u$ϰZn)y?W;J>'1PP~BtTv ȉat FQ)-̴MſeYr(,:_{%Q-N׆^xG6K|E4EzV ?U'voJ:q-IU=lѝpoXo,bX.M`,GKf)KcvG2Q|IR"bwHBct"$GB⽱"'~+ߜ9ϗKVLw. ?D9ĤI Gs|S8J=mD\jsZ:!rc&IfTSPz?YYʹI5r(_%RKmD,4P 4پxTr,+l"? b`݉O?:#d !orwAsmyIF hu sZ8]NEW L9Q1n ._WYjZ7lXW;=̴/Bdk8Ud i+6㥙9fX'?/a28adOohPR@\U"l$(`si K4) &bxXϘ\UEeI,fxYhBx^B\m[Ź}O1;^zqÍՎ{zI,gJ}hEMScd!WɚC\`7ef(%#;\BHX*xPIIW'Uep{~3;=]ba:,<;˘SLOy{"~hy&V7,;S,qgF ֞Nz#Sd2%}YI&ٌ{MzĝgbQs!qN@`Z>G۴FeuHfN ]Q %;ë2F7BR x?qҽ6 1p;Hη.0j1mϟ./ɗJzX#E) @j3ޏoSg  SC[:ߙiܖVid$(=\%ډ% U"fR%ݩ+`%t܁o ,-tXUyYK!:t)EXʊ*1ߩ+j"{qv;bO}:[a?k"-G0XChK0XCL 6|ALwӣ*}4D+=*v(.13rPMΠI/CU =Uy0 CuޓPXܦRr=*UL Cjá3"bO"|`U[P@ʫFX4`W5`ѾBM F* N1goNx_UBhtٔ;~ WeU4(*T.fފpap[$۬(Ԕ%M\+L"ڸ!btbX|sR?oGz~l48g}_V:VJ;i;\ݷ*D{]p{ ?*To.x}98x|[4c6 ĐQL|]jKc e 19]P=nxiv};nPǘޫVަ?GEYh=x60 ʤ JlbhLgYd@^[oe?pѪX~yhtn%6Fsȧ*Ĵf)h5\'hڔuKzc\I#;zİZ"&]R 7u[qB4֭7biM]?ujr!.y%3ML5҂>jzcoc^o>ti<(!{b K/a>ķNi t3?̱4j'( b}WvYZeR+ ]4f o?>Mi/  o!ۛ/Ia؀l b$xBKx,[|펿DbJ% x@~dsYEmMl3 ـ(-'H_/n Aʱ,#D :{-VyR!n}6d|&R!pXi~آCy48$0CN!!mtLe7bb%Ot%.l|+(MCkb9_Qm~}A L &[YdEg? \$q aEJmBnQ/ydݜEBKf&X:I58s<26$E6p EZ_f2Z)%\dcZ0'mQ0ɡ[{B x1( B[ALut0RLpN\n<N> 9c1"S\8ݛq_}R3Bd|_(5:=#x1]%"te ,`<`30Cgc@XEQJ?Z jaV@t\c&2eQl6mfh1. T$"ԗ]tj2&zE&5lMQl,Ԛe g3C*ydmY|bW$zaE pl}[ו@=Yp8a^#L[n c31QF&hMU0r$9gԦ`ΡWvF]Bf[sp8+%)F_nZHx\(Z~LOYs7YJ,܎c_?w!/}^n$ #O%낒?sd5sgh-ќp\==D`KBtx5L!>yub D,K~5xd M;Etgiv>#B4v' btR>T鸯gBڰ)hF3в¶jŌ'껾^͌8r٨ѯ Sȍ=R^™E~ۿn~qf?OD9pV2f^KeTE4h[ѥQw608_0 %fYԹ: s=ڣzt Vj d8-A#w+'3o+~RDJ1T6k*?:c)*\n>Ѭ "ū[{QUny&=Is|Wy T*T}Bv."nr.5F)>(g'ɘۈg j[5ŇB[[ōL>񢎈|@"Joəɹ~3ݠbfer 釴h|?ʺ $Ty2Zv@0O 彮AO?P~}]xըҦ..Al[GOјU܃[@NS4SS2G{Ga8QtJjmkW S QR4iXs@0uԋ6-^VI'Bs[U:EP~5vAiey񁤵$E=-Uy{@>F^Ҍq#.vW+?u"&1J[7qÈ3Ė4~k R,,$48u_Î@yհ*0QQL&:zޠdourZ}:~b0zMϽg[q= ܉̠ړ}͓b2b:Ia(svWAs$AeXC ΄h3j*H}b1%Ãe`fFqGYS!Mw"r6C (ŦȾN0u*$a*C (ܧzc{+ ҰAH|9fW~5ӈMb)mUiiY?Sq(LɅaF>ZpҗnΎ6SI\:P51-7f@^J J&C3hf|z>ꍦ_p"z|U-ty*Ut+J-'A= T=AȦ3GbaAhe.;2>c# Sf%C;q`(=&㧐N!`s\q=k"@l?`\1\hjxW&ŝ1äX= l/Ჲ$]?i/z ADl#5^:ج@t0ɢ\O^nE}̰ k[I(8SNx5SMX*ƞ]cf>產Ϋ[F -$(\Ne (}B8fz IgUInwm"&}KVZ h]5 κ?Sv~QH`ȟL " бwdT:LUڶJfjEKʓ˿\2x"2;P'lX -t!L l.swĻ}My CmS\¼ꙑB=ssn"3tw pȈt.@"L#'4Y B1މG9f0/{P>O4?i`R.8)`|3ZK/`pʕEFݶà X, A/ӂU[U濂TB*CR'XFGуGY_ſ Bge M/q"ڷSfoek.5/\(e;INހ))GƬJwT͊h)>\R\v B)U7jLڙq"C<̤{M4dB\< 0,}NQw{6F/OV毙sV>؞7 r=/c% p_8à Qw0+aRL]C}@;;qqqۋ ?X; $]i)e/]Wv泎iT4W8z{_{-8슷ˆ&Bnyd3J&|[?jnG} ےA,WiI4Y@N[ϾR"g_$kd(| f o ?>)7kd0 :{o>7@ |~wYΉo!m +G!]8$, ߴ똉7.*%q{85Kbc-deхףHoT79IP6^M$$(oҾ^)&3׏ᓋ>ZEA/5!!I4PK0CtoYG#ǥ;l^piK_*)׭Oec-֮"QwyIT="0s_\s{, u@hM*5 ![gM(vrD`G8 |D?]K ;bCd#ԴAGC-`l9zdWcg4FfGWUl} Oj8,΢Pkdlr _ҲѸ =18Xb›{#4v@}b^x+92lir-Y7;vrM EY `7f/68[elp6# IIekMMV'{¬47 #o)Z@B)xA Ki? |78,.[?Ov%QT/{RK'MaӇ<$GsUYnCM;RS6֩gZùn}{N˫hRˀ܆*زy7B ] Nq^ʰyYJGߖ!CTߟoA\Mcrf!h2ڹ nT}SjhvREՊN4@ "\1xO&AY x#Fк>ޠEkq|G߲Su¶vyft- }gsY tETh(*zm0 ՕL5Raiv>`.BRe*wP@wih"5@7e3?0_@ĴQeW-Ef3y"P5x.Dy9ʢp^&'G8< cTX._a+ı?S/+3D6Çw1]qGsvFk5j(1 (:r@`?("~!GnG7߂WI#HU Z B ) s"+K`5lM[oQs P=\켱}oY̙,iD.( XGoo1|HH\K$q` (-Uo>\mĽѸ6skGKv /%Up 9wgt{5b;^LQ+Ɨkpf. ZiR u `[OdMZEVǏG@лW~,($oO-/Jㆤ~%8T xq<@w;(R 3x)mc3 .Q_ y|!O?y_)-=S*:CBK .q=i//$L4%|۽rJq<܉(ɕ;-<寜(p0c;Ę#]%MՃDH< K'$x 1'~uE@)@Ogb4k4O2oi\6rw$>)|VVlUr[#dOֽs^[+ImgĬFj q8T=ID;-Y$wcjc 9xt ;s*͇P=>wpaX2>F@"q}9` ʬG񻦃jzDQE_b 8Pj)p(ב &`^fZ,2J6MrKhוP&kQ '5s'K:Ν)!c^\AZḲ>ovmKDNt-dS,9B5>ƌ;V!R  %vlI ƩM=c% '!(Z+< QJlhtuPuooC귮AߏmeBwCz3 VPCgNYy&7:+ߴR~}JL {Ql 8F6C8ƿeq0 Kc:)?كAY؃l Eq3܎N.~:0h2H#%g avOH+Ŝ|%g5zOq/Wr dWl8\s M;>wk<*D4mD` ZYY pu[ AU\f3GQ)!\.ct\xC0LU<l IFJdm~|՗)V`=EJzI#nX: 1B7, -؞KԀj2OnVJROi8"y"%;;].x #ANy.Ku&=[ڿf3m] fV!Q=88]AaP0Β\bi%R~k+}kNcKL>$pI)ro֠7(v~v,E^_xXki)m(̒[O[Ac>"%ߑ iܧ8u=1}S{P؜Gx6-Eߎ⃵(Z6t{}wkQ&CB֏p8`N5TY5^ s9|RӪ>Sy[Q I!ʵrpQG"ױ&)4&?|4[M6`gг19^>-P) tКS<-`]wJ5mo:b"(YչgVٯ^3c- Cp̦0ry)@baY^ӰC\,$K1:. o$\@F(=7TYHCx7D-{Z|;hؐ XSf˝-SXXo F@ɥ^lE%I6f#qK6uM f^ y^m.ݥv 򝀑+AoxBmy5Yo\ñV,[C׈mf /^/~lDF9u-ƍ75M4:~f}ny Z@€7ݔݪEkh>(ZJrRBy# m ƴł "5 &M4{ʾHz\͞k:%zf޼NciRQc3"ycf:g wɸs댟Q9]R39n 8=(1huj j^tŌ}2nTV?,T#a`h{ej0gRq{"budk C,mvz&:|Ͽ`Lh9 dk/|jl5{&{zFoǾf6XQI  n|bƽӈ(+CEdo@ ߼ Hb8h?j|)\ϫeub< cvz_()da1hGAk`tu}&f&yM94} kud*Ram z|%J;P)u!K5K{^x ~4T33|D!2X偷^aBJ}( <UYhgG&X'8pUaߣ?$3*Qib"wDZv֙nNz|"ZOB&TKU G &H3gN# 2tbFG=b >*(nP6⎱&KO} G5ޭ|qѥ `  "r {Lq`&e\SE,9sqXi,%?BҬVGm @m+d<$r ~`TΎ#r#6ˤ?77:A"g3#^U n&QYk'M*#i yV LԿ.G+kBz$Wq o/=Cw=ŝۏ]OWc@޾gYT~.U'J٢YmIR|ߍ"o'+B=6'dC;h e(.L`E%n_ #͢(VvT'5w g@̀#oo' ~B9])輦@%!7XJ%(Gap؄\x쥩swlLPK@vL}mo]3-#m{#c!G/$R l(fźVEڠs⊩Qyo^.4P;cISq_-NT#{1gcfCB ̾b@Sm,2nW<0ݦ{ɳқ:SR[,N U~. Õbq9ܡ0hbgZs/=?L"!G_;QsiElew2$8!sitr?3b_-~`9(jZԘ|YȒDʣB=,sQɫ-GAK΄eSe? hV]ƟM- 5)U|{Hs vOJ\$>L 48LyT$r"]ƒں6ULIQ|ghg8Kbl;y $Č,Ls>K+l+geX`|0߃9m jBC|7x T ؘucbFf  p-e7ǂW_k-ڮzdPY+ʽz2fSbQm$x>dV/2R[%sOfc룢_ߖ8U?.=jpu=B ;Xݼ2OKLa _Mf3CO;K^&}(864ܦ$B{JUVKiF}Io)+0ʬ@( Z&$\g.s"8RRKר ~b6* ʡW>Db :Inԟh~69#*wtV'Bú{ԙ;ⷘ°Q 8}vm1jqmcg/߰ٲFwɭٗIѷ`~m㑏xIp`B,x.?ij{okBjjW157]M-"]Z r Eٱ鞴E;sBʼnwJܙw.L gOϥ :lvgfp\XyA?0缙 —Ͻo$jG3{~b`ζ7Γu~ :b$p]dUC*Hپ(;z,ޑ@,/&LL-y6~M|L`ʙf|`  ~YqcRf %B˄JxU7 !A( Uon7H9ga'|`J1͈/5U&/ؑժBXE@ڿQpsCg[HM{; 3H((?t:3@**0fb!Pcy誛# MvTGN޴cj"iB(΍PܼHqgYI.զK@LՊbʇO ?u%yunTڍ kBۜ޸|ZT1p6lڠv jtB;ِ/(i` ƎgY1x)e-PδbL '.G6 mݒq5«G ޓˣ=D$LioyD#@ Q_G|eV$Ĺl)ԟF$NGL _[py!C9cӗNA H>'so禽$겥];8Rdb}P*Q̑@ϝ˫ ̞9ig|Ȣ-u%nD$=I_*EAKc FyztКU_;M\̩q" 8SS fC`lGԇu_ot$@Qg-߉>ˢ^s58k<G50ב]ԹƄJQ,Zkɇ eiCѧmh i5SZzPpׁVGTD9]e)9]KBÔi Ww{M q'zd4Z\F6M:؎ P];'W)Tu7Kth3 E?|_0gqm$b#+FjwcȺ+rO%mEe#p}Iq`uPr׵B, ;\~i[E@2^9C JTC#6im9O,]:wm](50}V/jwS!tqUp0}F_ϷW }a˱iiWQoMt<]J|`z#+0HZuޏ3?RU>m ?Fv ];R~}+`߫~},} Hd4yZFp~K|*d*,44AϪdDoUdNSRYԐwGMsE@bW#G>uiiWk*k!úЍG)k%S"1#M~Ig٪01@fS6G0YA9{  S Nf9R綊sz3EgS gƂbw B ߧ>5'<ΣP$ YCoV`_+E[V{ց[fwJ$c9~"-1֭n\xnDٍ/˙CByf9 {kY13lY^zKvXḀU[[ͳ]g{ū,ka刹>7$OA+`byʆIn}rS~IJwAp-24+aF{ܽLJBj܆+l N'h6܎;7)?nf=ڽYjl/ ?,Fgt[X 6tjGOQmSKZJMtְ$$2|aܾ>*,NSYګe@sjk/d4Z8nS<I-B7|Pڜ (`Srτv: JE`Rq' QR M^Ay8>G;r,.s_hFʓ m+'Be"8DⲜTS9D~.WHo-@-T;͂ {Ӫ&?\v1#a}T<96/o<" ݿH>@cxjCV$KlIW}6❂&,^I5VV1KȚ07#@[SJR/`g zX\$KH9 &!RRuF5\8 q gXQ&ձ{`HLT}p\]E>U[W>\ 7 bZnd(>EGUNC<}E 2eP+{I ^se53F1\Z_1gs>bOW[T˝!phP< F{Vi!n䶤|y9D;sǷl+:4M ($ٯ1=FYE0"{V҉?BF>S],߇'=."/Ds|E %#ALijB[ ts|X 'cIݷC3-!1;ʯ;h*PT%wlKl$!}?C|^yn}A6Z}f7]k[#5jr`3AFў/ǴP_6pM ]7tC2S8tviG͗|5M*$6WoDE`kwr=C%2yqLF-ʨ5oi5RH?kKbfg:5} 뺮7XGe}7ྶ:ں9珥S 7 Ue5OW"ߕ[n_h!E62] / Zv]ЫrRհXZV|{fpwu̕KJ !ąMhbnhbv <Cܭ + z:E̻as[ⴁ2p F9\x O@sb]T-yQuƒTwV-^ E#yjIT3a_.YdTd3q d7qVTXȶ3wʈfQY2b^{zpuD_Pٻnm7oFσeAnU*n;|1epxk%I,(G/00U E.Uw%jJ$ۤ#Ǭ 3NBa ea Č]ƴKh ]NA+|rp_u{l֝/ @Dih9I6@h%m>&;Owd!o{VlJ_&]EFM0klurjL7nY3)1.++[ͲUHBa~]2/No.q|2)Ļz 01e;,u/iJw;8u1*ēfnG,ranٳ3=@Ofrh(=~-)#`_P">Ӌ͔{?%s X A`#0 Oo>KkSOQ`ōavJČ Sb]wA{9ܶ:YTI_ӣX`h Bgmw˷b]=D܇xwkH-%bWEnO8wm0ߢY4ȇM厵>5'u9^jֆ(T1 FL)ny9PB$ 65Q1ncIlJow7mS}oܸ¬!,C {@O Dk[2 "!0SdLt'5j B6isTՎ&&U'>IU? Rɖ>j#`^y61!b~bХ W{sh7ۤmvLݯK\Mބ փj_z^擴UxI\ "SydY+_ 4Wgʠde2Lb (џbL34Wy#śj͓)z: cA792!Ǎ{)"ڍ 1!r] ( ˌ- =YHtk9 S7f#*IXCLP.L#S*u5ri㓪Ce),]^ 0=J{Htb{,ZI@{.H(-u_"^ :С}IN:˂䑅&)f\ޥ@MTOc7DrS:S-Y i@݁ N|$q@#@O`U.v!X )/ڸ<=ƅ#Y5I#Ď.;:Hc|l˄/*bz!$˰ICԾ9{li7n؈8 m)(S~|c ($xŔ/Qx88Caz bj|B4iJ3WMp|hz4;]fAW i]gIqYO7+\ZwӕxkDŽT? wB|o*›ęEBA-cLÒ(&b(#QS/X|s,41ckHɝ%C+'|k(+32 [I#fNWw@q]\tK%&5&pUWvpnO2䊃,aP]@*&~W4?g]pysthZVT՞EBp('#}>E㳥;,>5y%%oɯԇW+u:9q$ 1ƋD?ѿ,[Q!#˹$JaF}#[wql|ȯίƪO1N`^I 1y.cFvvsסcGz,NcDZ*L6ZN"߽TRCgI 2Eé{\ohmT3:9ډ\˸ O>̜|Dh$cq wHv4jtm?JV{k+\8AOaw䫂K)Q̵uvX3@I5y@^rϳm iUP&K`Ay uԵhuO|=/c&iAdۚ>vK|tk7uˉ+Zp?(UVn@ .s{F dvR(,1yILEE[FJ Gw #[,,sPZld*Xp*zg <kv-?ȕڃ |@ h )fk}9 @T,n7U 8LmٱV^S|y %.N]nUw  Ijzv]ku o"s a_$)w[,F08ljcų.ɍ:YUl3zz䍉XPYTHhE Cf7QůM$X&{&Q'PLT d9r-ε`"q">]'qAaS$ U&\_o}2$/h|| o46[vVLW]gGVC|Uog'j,Ǖp$J2۞gЧH!ɑ8Hpl#m*Xg @[+Mx8=:)fk=hNU8.W2u`bL5pR_TLo @P di՛ _GjҽH13Cل'ljc' 8d Air 9z;e0Jo.mbtDêi:D[ e|*vk, 8YRxA\҉.mku J:72Ջ`Uקzr45{I)ɬ'5dS/"MƮ[$fIUm> *rhJqT[w=1g,ECaRK0V>Ӕ3||vʅ eRND٨5L.Ð[ ur<>Py@0aG[÷Ela ,ɔfA 3\J ۶])Mm;}|kmD`N#޼輺Rd&3bL)BBרL#ɘ>U>ȣ-,ʙ'Du?zSh | ț 1CΖӁ4BN ϳ;8p%o Ǔ9M3inw7U_% D?'/7# а7$I$ιSZoGHhyۺ Zּj}k; 6&yGr~L0#u\C8*Me$fN^Wt# lXTdMyݿ/̓*&5/ 2AtZ3W V_\n*Wi6#^JpH8}IjPbOsqBs`qumMfZO <4ep -)v-m:95 ~!g{?]S }5x V8#4XhRO8J$ܢjUҍ6,r}0E QkbdiG`4@[ E0) `RpQp~ MBKAskJ~D)::eDЍ"B(N?l_С1ΆQ3'F%^sĆp8e&'w#[}V'1 } 0fuWӹ"|d?qyQGBGG1gw\뤙F],mG"IB2cvz>BKTM_s`Փ8Eʛe<}N}A|xF$B哴6/DL6܆FzQG v2B{jmG}75AΚs5ku{KvR9̇qog=veT0`OΨ9ѱBBA0Jv&يNhu[(BXz*[p, ]zm <$JWn^:s\Q3F8&p_?_ \\UpZ}J#J8 I2]@Qzgw* )v+ $,^N`,+TL-^b IsĕMz(-^jR0L۔pR.q6 vLEQc/wIjbj.} IlcCW7 6]DJ5{¢%x89>_  ]޺ԏZ:xe61SԤd涙yAc{®-R_pLJ^ʪ$Y &ʮbVn}#nv[wр\@)׋X _ x8g@֌]4T! qa- }tgώ/`O[ 3-l 9Vm:3Y^ą0Izp*ƨ($5QLm0ʚUsv:j7t6s\?ZAi楉 ;>$crC> 3'v"OS7{afR:zwo.)x|Taˌm5<3!©>9CKl:VB(Lk~Ԓ%Z 766 Gtc^= =ֹ.Y1cLaLFmM> IH*˝7m'SqܜfClޢd O D*beکh"80֞27mJT Hհ8rwmBC}d`ci]zn K+~ɳD(p9J"$wI-Sѥ7I &3k(K:?bFmuccwt#fEJQvSh4]_(E#Č|b0ie|9n/bES/y8<\Hl3xHfR߅"^s4Iq k =|)䲘2+ ɥC5[:Z->mM ~mP<_eyEJv~%#x B`{ ڸJ R iO,.b2x$7ҥ0Wbb $Nʂ`4Hvvcz5{)@/;*)3!9֨("euPv{xBRwOL>G‱tZ$ÄyhmҮ zrkm,jv`@Jd;?ْA%ǐ\QZc=!7b_@9~QA"t+g B\S85MWP͇#abJ6W`Ho.jjMw~9a[LvNtb>d*Q봺X:L?֘__]3nT~ 5<^ mz`7c wjb!Q : .V4BTbTtaddO>2oӿ2|' Lj*qѥl1J=;Z+8z\gVC >ހ pWzP <Þ;RV3Ҏ C!DUw|ybgƲP`$T&u DvTNW!zj!m@zefg~(K5@*(#лsRM`bc &}+D ` W߀p5Tfܐ*G;.t FLD7_Bk57 r&;3"e>Ŭ *bx? H쐐N mmag!/QO0 Gi\LQZelG8fIHSdb ,b]ϊ5=Q$v.w3;)"Q B%-ȸ:"D3ت'񤫆T?5ZLΉuNZ~3s|w^3Z<u)e1*a\T|@[Vd M,>R**(]>|z'Y Nj60\3uˠw*`ޡ6TTR ҥRzM%}R,D|Lڸ1KR'VA٧)Gz \y$eelR 9LOul -mLݞ[Wa}f`I`~YhH~f(X{T_T_?}kP@(7N@\l-u=;xU^d>}ʠh"*}@+B.c~sKrZ^[Ba.&IE?N_r}Orߟ Z b) Q@ݕL]p VzmެeksHe\*Yv.Hy92g3h;p; 倆Fpɥz8U M51k7L/Dg<_+"zܓYˠѩOF%Nu E L[emiTWs@vF%1yd*  e H顲wgQ(:M؈yt̟R.|ˌFSf&᫹"z\b\q'7X=C0בq>G9`?ќ.,Y4.UGM^M`2~Lc$[OcӲ0bYwVW Tҟ, ;[Zwl;>bU6#cu"SYN;!{I3Pr]nqԷ?V7KbdaS9r2dz4פ. b⾠"Ի,S-!e~{x"yp+.S$, ')(C'@!*pS4Y^oB$O݊U!Ke`4WǴ?zv8'.a`!(,V NjdsO]Q7)|/GWRizs"ڎpd88HMMݙ(QϭǨlEtk;Zh(\Pj,7dB@*nb(m\J_fs 6t9+RyWJdNʠ> X[J g %1OڹJy]Z{C (*#̓!a KƏ_mV}LX=Mqx2's9b]CS̅h/1GX`:91’% vJ9R[UdA^ v?IB|Q",: 8L.Vix|[MK(" Ed {י=2bjlXlhά+sRш{`Ѩ!!@Ae*^ō$%װH0u1s 1`.{%xPkwU%&u|ْ_}v՝ǩ\ }XH6Gg'oXpXF` 7܋, BBRkv9SV0!mR KWeun6$kި7ж~μ&yg+5Gl2kAgK]VX~arp^&`#DX B!.aUϵoE$n|{Ÿ$(0oi쓞OI)ߔ|ԭt@ӺTN9)p U]7>9$ql_JGLQ)Z DQ\tDj#=N5 WR^O Tl9Qޟ ?Lҗ۵M{yAdMzKME׸Q~kF?Pf/ԲvͿjgݦ,16Ya{-h l$_׎3KV~_gAFj=//;l"qMu:TruҫQn3NdفgHŅ"~|1à03z(No"Pbh̹Zz;D|(:(uJDK*X!E+B*UAj.S|IOK_0s<9qm.W\yq{(B{!MA\|Emel-_ S1}U,=CGjLjߪGEELљ!Ȳߨ|4ߒaĕ^b˩tP`!tP𲊵>W>퀥9fzUt.MH$۪ Q r<) 8yޖ,H[0|\ogd!-;?`VAYΪ,r\ǒ'qa4.2PSScfDXP/l޳V"n4f&yif䠐XEFg=jM]Ko}Yl_}a8ixTNK̩ˮ}]1ę}b@RћA NV8Y ~gb|?֡9B/+ Ypd"vO-쩞5Q"hFW {KB7Йׁj7ïwa%QmD^;]0x7._Oܝy*XeD pp(NI._pYe몈n*,:Vv< 6o;3`cݬ]/D?b.qX"ۑAй2S#on3Tƽ{l5;17ފjƌQs=ԝ<|J]aw+3C֦.`9\GFbJ zE6%o?ƣVU ~ p yXoCj$!_!iۻ=2L  $nV`5^2R Aδ'+҃wGdK{%䉧owd"P|G=O]=1jy5{ؕL< mkbdpUioV;&e z(yj!2#^G8ǬնǪ2pN%6&UIA,= doؐYgc17* ;kW<" wǚ#Kk> #78Bs PD&W.qSܙ E?Q>P]Rm&Hy6j_LiFEΗ Eqj.ҏV |~ؔKI]$s* LImwpKmd`g _xNJq< IT0;a?.'顕"LZ=YA.21EڈRyBn66DH}zW:yAn]f?NkeW#xݢJ{;;n-B~8 FS`B Pۿ%TNWpI@׳r$?& wц҇#OP}?Td/#2LGBэRloa =-ܲX̎w^?=.ƛp_"k| rK' fYu;)u{ (A/64.:k:/0vC9eH~ 4{FwVp8tã{9 e N$ 0'40v9" q9s0;4e<km'zͿ"^Pz1 ȭ51&'4Ԁj s|V~{Est yo-(7S/3M4%o?S*F˂8z ? jVt^B7tfJm!)R3_}m8};S2PjLf~W[ Mn_)fE; SRLڻL[M"bQMv<曗/,]J5"umuR?3 Mp+xbŴ[OHb,A4sӶr&}pqdD':MbH516Y| FVX"_?FiX2n8 #cO [8&o)xsuqV!y^ʒw}4.j  GXK+W1- _Fj:'gvI7qR"Sʹ:TJ(nE5VfQf5VP~gWKهCvj_Of{.^_GѳUTg8=Q@[fl@ bH)]Ĕھ18ffl@Q.7hX|UI2\/,AYh#ҙ:06 fbz9h9ЫZ ͩlva%~Xk)D2SEPa #vw˽fSq*KuΗ:V= ay5~|Y8Xbl3W6jjA"ϽoH("!MI8]"e yN:h-y ~ez. 4>oY4@֬nz>SbvY[$Pf?; tA4]اY`G7#J.J*mz3?So~AA_(_H6o_(K'l| ᥙ60'ވjX'7Q^m_^VN;.kp1Af~ZDh0_8&\ h6,,^\Y 7u R"=Sfw`'OM;L/-,(h_ux,.t谖G%C|G>o˿^ŭª#ōb-|S?gL|dHWK2џ1K08"rﯴ&m ^x"h{V9R6BoNo! SKD` $RP@ [D*f^IA /L|)H_!7C4=M~ZFGe:I*A(l7"D`O`m4/|Dl-MJƑsS,cb'#X(~g+%lW * bo.`2N1>)a'M>H2/sdAD*:@5l:{-L8G2 ,g݊h~2 LBRKQowL,m˧q/ZmFwӴ8tZh'meXbJ@S^]]3j(-FO~ 78F8{#2u*T7Wix,!Onl3(&XŤ#2Y_&?pGè^eٕ6j@Ք6ĺl;5U#d"JDc̾8ʺw.XcZŔmMLDBPT=@/v?|}4|Cuip ȶ#=NE ,cQz(.|ķ"*+NhֹxOY~D!G Ov7TxMq ub`3m/PDV%=("9ƾeyU4HdNj;c,oi,M(dcE6t%m}#ə= T0.pb5m2"46X29QFBu\ppށ&tqo W-^kPUyg ,x,70rQi,WGq[`3HvҘ=06CQ1C -_2(%K^Q!?pi.g_DZW!h@15ub_=ѧ-npq@ iPD)QK03ֲ[ǻؕ Bs=҆㊖M=1&(`,keP}"y$.XK5`F;Z'T 9lQXR1n.V:l 4I^"V3g˳2Q/G)0 &TDS&`{2ѡ䒑J/5Dž& ~Y=ZLREELʠ xD~Ձ6OObb'ׂ$z+ }g_9?PZ 촐QӺ=NO\cyjvϣAZcOO"m9) { TsтG[8y_󖙻z9,#am8-j?}\Ey S{tJD_-&KI>cBuS6+>)ʡ?@pe.j$؞RWՇcz9`w#8G/c Is (8Bhq'>7ǪnR/`(f.wP0mil;:T!EׁҺ$$X!n蚥}N{ܼSRFB5 _u6664$7Kp¾Sxb$h}џncȶb2jÝ-*MgMgGghȱk-GƁo^BHY'o^Of@NR5AD ֡EFx)K3,ЫJJ\K"Q:T,,ӜS\u"ˊܶh/1|Yh*K{A6a[yQ#=]Wo8=wO|5_(NߺK5#&in;?QËO|(wiO1zGbwpnO_bu0c }A2_7Y]=%*]"ޓQ ڿ|lBUEh#0Ы~@آF?daPN9@d *M0)lK #{ɐ΄C?P?־=Z!Ֆb'bVk"v\/TT! fȳc~}Zl! bM8'dqnֈ FJ5-lQA-3xyMesyD:S[3@ey4ek}> }hu̓wҽkĭDt ui͵@hY!/Y4tR2˱d #r-m@ag[h!{>uWRyǡ?sPVD!c}ޙd] \^݃qC)GL"\^J'pzMomܺ${dwRjeY:WH :gK ʪ1UIT/ ;zPǤƼ~HMڎ؀?ڭ?Ѽp䢩ߛnԚLV}RNYq+7quo3E y$؅\#3D*Q7V spLq&QIoO>; lavw0 [쾅qzϬY-nqUa-IAȰ)9F[b$l0jeh/$g^ @0)/Cv}QVk6 ]WLckMBOJ'nC\YTKfl莴"+^CvgOՑO컌Д4޺hy;tNwrQج oW5i9ôT)'EG[əgƿ0_[)6t$ۢ8>ݛ"O alAho?: F™@u}PCf ѾQR"Q}^v{u48Tݙc/YIh A!^*=f 6ıLdRDŽ(h@F6R~{t5PI0KMjH9)X'd-2 f\|F/*pyVՌ  YTi$WCw^#P$[2u"vX(KMd^b-Oz:}@A0{ XCݨRM@ 7S%ΊE>jI{$O؉T RUpe=Ww( G ўu)EĽ+%G 9JyW,W ' SOx @ %,=ttJ|׌VRBz'?Kk}C*7jR^}k+y24ZV-a'60>1oPOv<0oX&s=O3tu2: ovCsV:XB~y?x;r&d c?YfgIA_˜8Q8ݺqZmza'BFl6AoM3~-K$ ,;"cȥy+ QDg_ Js\4 '"k8քf]QłX髓0=v\+М#ߖl_L'*9F-?j|e_|a0#+)=cH|u6 iDصGi!2 DA q9cl62TxXs)nw4/J%I% ߗvĝ J5_(sb%L=Y`7ǶH!T߻_AUQajEVHyFM0ާ h et,݀X%i.*ka )g*`lӶLx B,ᮖ0zY [;۾atU2RݰRԔίV gj## ōhkYѢLׂ a'+&1`K2I!I];sNz3,WSuw+O3@1@/sEG32{[~_ZMG$9D]I+6$ҦcL~*nZl˲wE߅]2;vaF`ȰrKH>`f_>Aa[Kpk4,O8 5KuЕfo ~E>O!$ f{ؐ#1˜Ϊ]gl#/YT'POsF&rWFEQUOW3|;+Ot-wD=KC*@-ih6& sY e@{4"ǰ"u^2`o0EcADyuA$Q:J~ОȺpGC-?{LˏZLasS|z9$G׉c!sJFEem,rTg%]!K٣!f6?p[k`EG{DƩӛ,_Y3.;7ҫ=.W !qe!"38}Ky2}'sn~} 3 `v:t©}ZX1.YLj۪[br ^\VnSTB`Y?@*k/- 1xi33fK޼3q ,ANyw!j@vs0x@qk{j[xUlsLIIsHgm2Vv"n"`ieI<}PX#'% n "$8h:X)̐⼹S 7')CuNtFzzcCSG htS/7eS6j„X(wZCKNc,vʷ,SCH|85)h#mQr; k*UE|zGg&<>r01񣬭fv@-.[պevY˕[gr/02ori7nadzܸVC~7wW)?./4Stzl+ۥ* o6鲹jШ4~:s֬JWQ]We!<"<:M'Lْf7AAŴ -2eՐE#~DQ !5NC4#Xw3S'h:C >\*0?Xf-8~\J&|Wy[BN힄vH:%OEf W jR 7a%ac4[@xiSW8%?)m|!ht;,~EUӋ-騀+nc# [DA%y}1_9$Gfsm*p?㚛q>li,`$z9%'b#VnZ R6`6l,?$¼L+Xgi4ܟ8jz nQLZhxQrv}%;ǒ=w]҇9.s<4"k]E~L`m&Rfa_aAB04?*ܳU 0NLeYBԲi>}vEY5h vuOuqk,%P_vXvy6n$ Ͻ2ƣ?> O .^2 ve(n7]s! >V9lc*uR]܌>ʛ?i5#1zd`\;srkf}S#zf{^kd_|(0)qԗɛ7ѷM*U}Z/EyH#KP?Dn 7n sJ 愭g',ZpC UhO=F^cփSCNYl/8f3ɹr^J/DKN\}|]Mp ^!|rWj$xNOj+r#jv'.Õ84刹 W\i iCyӕB q,g,("0ÝZrǎ*AK_#9 [ p'֚=nPJbsm^aP،@=ĮdraLG xQ}L *1ZqC6b8_~d=jZk4gC(Oo޺ }p?wm>Lm{ ؘm|>VS˪v͜S ԣ-F5< -OF0gbeH\=3;v[|[d1|o?Ӗͨ-$[hӯQoVp,=160ͱ(Ō:@Z,o՞pN94oؠ<2~QC9lmeO4XMn 0D9{BB7٫!**);O[jc/ 3&E. &d5O"V2H`Pwotn(?W%~CL ,:Ay=ߞ,q{ޒdi:']q8"V L/9ljX 3a|kQ~t؏n֕J'j%EJLe {p*ieO4-Z;,'A1Tp"kASUkT'ETMƒ7.*P}laj Sp ߫"0`^aºiƨETL!'Kepk)`J?,_M{QJ 7z.Bҙޗr GKDtIs̀uzՓ8aDq*<|F T -)!(oT k{:X(*cuo dY3TF9n5-m~J-J;ovI &9O@p8c(PdP4S}wX,t.Tc@FMg^WiGxO*XGch ۹q~VVّǽlxs)pd#r$3s*oh{tA',7&Ǧe1'd˭\y s.*q< ,q*_֘ډdӠFZz-lE }r+FEՌC?ι @bS{+ hq__BsNb۰oFJ},u4yMIkiܹ06Odoc"QJ#MQ9dW\`5pp>%ܲ-9TtnF.tζ7Yӓ?aV~H%ld5KuD&,{DǠxςU?gNɚaLh+6Tbuc89;S&f o2qYפ_u|VsE=Lqb0m (;GQ܁i=u\}ۄE~#Tŷxks'ZmL/jq`stI8ݿԅQ '|u/jE?PS8 Rj*n"l>jrmz'u_lP%`u@*6pО9$SrV?tI'VrF9Nܜj!P- =gX*Rథ]E$~foI汭wqS&g1[! ̔=ng:xO2Οh^͙Q"c˱QwHͰ遷L A!TG?517)"nFřw`5Q$8S_n5Q2suKyo,:ʩ_穽K*6'ʬCmZ89_JVOW8;:(z,RC׸-/l<,G)ۣɱ!/^ʢ es%or+t/PeJ.wvЋeɒ3 Q{씑u:fƺ*`I3YC\߃m]8W5 ul^4cVP1鹼;F#vql0 d%kr^+׮bJݍ|Z\Ns2O&X;㑝=E"'Uw:[Â.G24~"ܭԟMrI!V̜ 3S IP1q,2uʟuZ2& ~9qVؙ/fBvA12,CH ƌI>?{9)鼐|ݽ&udl^]A~P{DG/jM;d لp`Ikن:J'ȣBUꏈyWA M|fQe }p먗VpچqmN\Y+.Q&i<8\AIJ03 &ȲzJВ%5EzǀTDKAqqɤfFGN w!qd3^|丛T(X.aT+]k:>#l#ؒɽÖq*H0˪8b`~=-rXN1}AMX9m{ntԓ2-@}YrFAi(5S7RKN:[3~S88ްABۊ=>O~].TJV%/=NȍMqZBR/ vg0d QZ5.c2&+(%LӅEGϔK)mD~z1]eQ(Ӝ,}b\ɴ42$+.QtMS~alԔ}^ xm!`@f =!_1hw'6EA0$ve[|cZ֤$x~ XȰSʭ Ya}-#@/rb}arYq.zwp:(aͺ,ĝyE♟S|NjQboz4t [P ej8V#UA+7`iDSrCD;'b3L).L":8 ;*O>в`IP8}7GfKzjwi2g:~%Ay, (a'} c@*V7kh7|6ה·6-EQ-Zl^)sz:sTк֑0>҅{;R70}gL$Nﺉ >_6V?(##ap(D3_Dew:( }C@X%-G =]ڮY NJ Kk5s7PfWRѪQ;YyB7 Cʷ"4{S;&K^58f^:ZS=غEFT2p%Y5h5mH93^צHS*?2?b%5IzOf^^ZJ9 IG+&Â;<Jß*I~,tL3x]7_쳽@ WxSm軳x>>=}?+3O!C9\-t(cyi3,д);A$1&bK^s@Rt 5OIgf]9$D-H7œ7D"Z\,D2V\ft n$YC1| R 4rd1ly&;#]z*昏ix->㎊w.k /[ɚ 59#0 -]#ȝ>m,|%XՍV2%s +!=kDMFk\u" 6A^d ϘA* l|*x<}&B6rVxSM"Y+ʼngM86"xnX砣fӕa-l}t:1>%R15Szُ %YH¢ԛ"g/|h@tH/öF"L(/D/t(-. "m9<[SGF KHsFzs&XDdGq![)#4'(?\ًxZpTn53QS^v*s2Uή׌Zt9ZiMUE73Eep tL2gB8:V3 c"l!%Cip ҫ8,.cWk?wbKvy6?ʟ]8*OhE/,֎t9 ʾuad7.aDICXĄM.pv<jbneʡ3@zp ;Vj. O-}[} 9Dc"qﬞb,)7@h"C$8NkqZ'LeMCD'YV'-L)q2ގ|/Y('$Ch'>敯% w</w9|:jINEa yEĦiMQw2R\ %B/BcFG:y%b JJzжctسKB@?*c Mꄮ@$CVn PUs$FZZW)}@tLď|A-Kqx" ]{{à՗ F021v^R*#nK-E |;).-UDHTyǾq%c } bm&kekײVFv+TЌ˱~y0?4GM BzHױcl5i *wɷU3G9rY=}nع7xlk{q*MPN'IEJ"L'Ti$tQYbЖ ] ?|0"ַa(l7Pm' dr9,&]rRikN ,EaBjYDn)gaj.:_M#xyz~Vn( ҉#Zϥ~u3J!MxXgERzGfk;A`wce…=1?..L ڢYO%`7ptu&v^_@PJ ,>ϻR*G&Se$p)jD&3I)ߢ|zVRR@"yE#6mf)C^H6"ڀN{vq#9˒JMIac9@ͅyl.`:+ Kг}[@ Lc\% 1 ssARdαB;&n7 yiB})tzА8bx7*1q\^i#lVnS\gHy( W6CٽTu@>l6إ`::a=AW4f;#"rثAzM4,č );qE;o6RG{ B:jY -ߩQӸ.ob'O*F[CV'^2o=u,I z4f9x]ũe 2Zݢ`MAW_vӆvX-r䴈~PI5:eQI# lkJPȮ1 ˛M l/o~| _ /(|فWH o GjC{G~ꂹP3}${ 6s-gȭx_-y4o/h_R{55rk/{b)1iM5$}r0\Ǝ[GIK.f_}7Z6+Hյ}`?iR2@,ÒAӖƜA,Jטٖrm 灵iN1_(UGR x(wʣ+Hh{a_tq C-?B۱{d_}yo>i]h|n 9Hmi(" }D?б9cA,Pj_{N"T҉'gTSx!b}4>OZ)[=(ݛ/[(6 ͱsu\ՅϭRrRL)ٮ3,SʨC尊 ]aE@(5ѫ`@TM (0F8, Wb@䯒zpVkR~ISUxKuffrSx@p\v#п:+ȸ#1=4dW4bvI9yfHki6 }Ҽ?-PDX*3MssL<5iςPCTa Aj0Ҟ!= bYbϮ. ňX864D>k"sX-X1 j}Wͨ"5&jwv68 xUZdX\adG& QwCʊ D)&)DX"X1EŢ nϝg?թ%,mV)s^:«k2Xl|Oلnz |q:~bc =$$(ދg(l[ mu[uW 9MAy]bm #p+AI=9h| KN'G8Pv~9y6 "퍶 DNtzr04š}٤?P"/:/` ^6֖Qt5.Ě-Ď3[@휀Y"A f(M!4]96u5oq^ 唾K`Q1D =unh\i?ڧ 8بp";jlIA+qdˋ E\ji|YZMiDׇ_JE ye_+A'k{ o8Xк,.m1!8qC9 PK?03ܙB4TBy|iF  KSCՆ:Rn1d7 #)m 26W>*mjwDFc!'#pb,& >vPpFtZ%6nY|:i$ޤ--Ħ̀B RB&"+=LLO)(f^ي[I}lL"0s_l"[%2qkxբπu-)0٥i>7 ^0pT+Gr:.\9fUWDv.R/oe_OP='d5@J%{ȋ+e &q3h5!FK.SgmBGF0]{ؠIWi?/0mvz|ip~z|*zז1R(&w 2n ;jMyg="HWQ[cLU^fR $5b41QC:}T^ؼ 5>c[!'> PW1U,Ȧ9B_$?+؜6:Y F$/^倵]h~3F{E\͸>;"k@$$t%+IJ_qc,a& G*˾r"GVFBC@Z s8I=z$m~źj6[Y^:+&v&OgEN'耣¶[՝+DGQ)2@)h-l%QR($q'i ݴ\* Sdj:$aAgS*K?>Kc5gю`IE4P.nOlc}=áof瓵0ǚ"_e @ĂdO vsX~Z‹]jt{_!,fA%֭CW4XA$vwB -=S6L; A;$ԡ7*g+g8d[pWswU~O&aфD'$gaם;1N8g%g(fsڟD`RccfJT'b@A –ꎟ/c2]D7˛ѳjKI-#4FR6XQtj%=T ؿ#q9`Y=lZ)3Mi3+>H1e |4xDö Ett'9^Jr9҆_ 1^|[͟(cmO6 HKQ^iF-dxQG܃b _%tR?!'qd6Q,H.L◜L}cKLS(]K'2ѤKKa?^pVɵnrN5!P87o,F Pf+QQf`[sPWњzm%Ҋ6p(ې`֨f% pNZҧ"N=4P7 RCfp\noMf &K I[M O/ rM)Lb{6=wHrسZ^2,/ o4"߽d:܊gʏ,Ƒ֏$ONZ 2ČVtK:\?l{+:Y+d!\ ekS?|yO4u9Zb}\v? ]>Ng+Mm%)U۱uQ5޶Zg|<~bĭZcf{ؗh؜1p&='_mمތ<14׭kU0]/q }&T3Y-WJkU9+PG!O|n<@MSZBS͋ n:Qr#]4MaP(։D'!ܲqnD1)Ԏ‰  :(]ʔabʎXdQ+۲=O\pmS*P]O9|NIAE$l16B?G(ʂ7{73\9&w9[ }*,yPECWY^:|Ҟ"`z[R{?A&9UuCӉ<T6!CG2>2=·YϘ]%@6w,⏿]VaviRY]P(  3*fe22q\(YXҐ?5VbiMvr?b[2MQj!wNsG+|\>bݫ>];m~rh8Nyr6EMB BjmrkZ2Ì vEֻSoSzsZΤmIF񫹵"rbS8BH $ 0wؽ1 "yX7bM̿)$Ƭj':U`:Ox/,jrS"̱Q8לް/+,8C+oNs(F>$oNwCE{fhU<+~k)@ʇ.'acL;zaDThݫ6G~: M9턅F^eTPtIob}`$'`;n"w_`hLqAExg,ehp"0heOy1ְQMOQZ"R2` o;JP7MtQMZ *N| q1Yuf | pFnXӓ>1Ղh'(%pp`|hK<-p06(I80C85 ]8v8I2=rfi8Dm[Ο ;&N@EP 1j+Jv}!AAmH, aO;09:<4`0TIiD 0Yzeiu|)QQbLI`yG9J !O@+Չ-n2N;X8(ֻclKGa_ڏt"{gF`!٘aÌQ#/Kǜ8ɛZJLY6#og [)9R OhQuE8HAX_=O+[>/27AFqJ+n̂z$cD ocWۆ/_32fRɟXc(2#LВfN/\ǭЇR@һeKH!nEW0;"ru'.px%#I3J)Yxv@< +sQHu%wFs%n MX$ iccif]e+TP rb ] vJc7aI Pf}UdȣG }'4dHWBa12\#r18Uvqn }}yKY+pj3on%| ѵLy!3 i:F+P.MZаF^Zy?E zR@maW،TM##92A7DjC7F#%7.$>hwP2VVPŮ<8w2= tq{I^;!NS-oeUܺcf(KSY-BӼG>gzɗ-]f4iIl3LyF[%|w7bkj%H8$郖n48Kl"[NA"2~ͿubռQnaM(K$K>ch0Cܾdtwp&@5⼦9"˨n؛'K[qRK&,{g y\ח'm%$䊮`#To܍ GaŁhL"}V-Hbw:bwTs k2I͟8yF9h3dhm<8+=eb \$g dE\,]MkjͪVVaQ p j;@Lо;9-h' RR3I>sX⌁bEѝ™tn͗2T"mOY-Άî.7K4n]|(଼]Rq1+bs$ݞlO4: cL J~U9ǙNe㕫f5:īG5N,c;*T%ޣ2]LŐ9ͭ^iaslZHa ;(gG! C^]HL>R-%~@FP.F'z[e/>88wK7ԩ).tJNA=%fϻ"9cI̵lds1HGQipѴ T [Sk5#$tդ̗-8W|<'sXy핌KkVg~mR `j2J4lz=}Eۊ4W O!=iV3d|B+Tq9enVٛ/>H2&؍¥hŦq- t#~PAuŲ Y5HH.$[# dsCNmV~ >}y\Y{EY?y/EηxSvX/fVQ\74wgx%+Ċr/Z|f4)Yiq80׬#쀺(u?a.Aɱ(fO㶽6*=ڢ'*60'C`ՔŹLaʉ)13ԼgILSj:( 5"y#2Fg00^FؾO͂>%ff]hSm uQ*6bؘ~Ğ6%mDrByeE`>&jm T+nubZ*ҮJ;Kv(:5jX'B <&NfʎV^I~p|k洂&L8$ؗ;}uuJ x[! ,}k-aa`(xHIWOeiT~V?jybN Z yu:4<7D0-IɞÁ&:zt]Q9 5 eF&Bd)~M`py Y$ $}SheTo˝^n?UPu3lMJ֤qV/ Ų# k6[af39},HcR3xpnqnR3o`܁nʟ]GI?>91t=TDF?#,^ )0hAEACS|ː(i:>a7BJqXl>nBǧO5W8rRǴNҥdVSj@n0:g m oa88obJf'3 V1O)ffESZ.!@d5Ȳ?ϫ&\C]J~ɯiqBꕟދݿuy.ŭp'y;T2K?b*pG-O #Y>ofoʩ k {D뉱#J74#"YORyi sIrv:Bi&~bB襒Ym|,, ʴ$^%!^|Se!\eDǣLfUSWB饭^zBvl͞ݕ֐2ZDfpT}ZG8);u9~2 DxR7*[6l Ֆ8;OI k⎠@yCsƽ8R5WB*J\oa{υ#spl^A +ΖьmxVB3 [sTSSCԀ)tL_|z" lˀ}94o_kɏ72dC ۟ F E@nj9 aej-b21 2/Z*;dy$@Gk5h#5%P赺k6`1f6$ST79<9aC<+;A_HHwB%uzs=sIl\jK;9O**U90\aW۾OϟiU헫Xz m hTV h_uS؀s}zm1mFޞ<-MQ*QfN2!r OӗF4| y_-$礁vho"$ȽNKI7*4Xs+ʜnwWl$}44ʼ+r ~z"0_`g$-ɚLnGC1FI HncL谔k4: F̵CJ!KF00sLڹL"/&Q}sėp)+ G%~{kkuhX=-τ]HWP'OgteJ49J#6`񌢖6Ֆ;dc|0<[Ոњ 5Ɉ5 f h/dtO xև͕88ϝT?W#?z=H\-nj{%#'壸~M@s~'ltȻp'~85}3hMyL P6 +yzo9ͪiggx116ό\.9L.SQv"b<ԋq8i̙Lw^ιPisHv床;T ,ŹϲD3O΁u[)'%KB}`'yt=Y |xqJ6jY<ߖQ`g?iDCQEp{$=Ye`^Y'!)/ b/cm}_~N,T%ubYlS{űwχb:[K`Q2.vBu?{]|>Ji;J6WԿߴRo{œw L%S;nGCp&xVJ~.`|\c)-,4XGI((Dt_HQqikRsN'WOE:d$+V[Gш2=bi9"*w+yrW#Q0@CS /#-,K`̰67 %WQqr BIA8&k9Гyt4n)KAǭoC~OZGOq^]~#%8=K6vax^U}K+(&Ah{Q8:z@$MfC I׋5~/婱s[CaLL] ;{7EV/@{B7}+1Z'`1c$ݤj:%|GA3Xf/Ŏt6/r22ish\TBh^&>=g{8 G~J従yT6#?IG.(HQ;}zZ8.an)U"cxP|g ,YJ!s+Q gX@tT%I*+L+oBSVMZ eM"fN>Ǔ|mL,>a[3d -8nUa , )5mMg  d[,z^T䬙(:CM3f\G|~Xq(Sۈ8 kՙꓸRS;^tw'd1WY&U{"WUF޿t߉=;Au秽gm `_|W,MR䵩}gFf(+Eb-IDTN<8: ' /3!\,95x.Կz7:ml kR`ʕ-LJ8SG h;L7$O:#iYtҎ^WO{l.:ѠAhFqevouD@2hWj 8fZQkW=\=w& q[S|ҧ[[F8iy>}:0qҵWKCpK}@}FO9Qyzl.9y R|4%FXO%h'!vi掸BtI !̒hnҿ3UG7ʷo4L#wlP gK s??G+/$#NmT"TzWSp,y"r\4Glp 9yO-g%\ ;.DoeRlE ~psR;2+o"F^OܽW`efO@Hf h< NhlV e؃[ċPGCO$B<ę2|N+@X)$6r{cQldK4[qMCPk7# L8Wđkd=[&=L5 <w L!q)Jw j\eT.1ۊ޾@7k5T0oÍDw})ϿU,Hcoq}շ (pг41ӊ^}KIVuByv%8 ]~lv I892a`}EWW4s_Yl͟%Ѧ^hE cT-t0Ѩ Ѱo\'A1_ɫi(pOҼH`}OIFxk~3|㨝RShgmu]2 Fg7r#,׊[s`l9 y7!;M2(`73PGd7xW)!SNN-qvݠA ۑ=6LYT )kb;rh{/*l[-ͯFT֞Ke.Y IT< ޶BK~F*,Sի5.X5/SoA*_7֬G?ᣆ1,H`F"Mce")1s”| ::\6U,TxQ& 葆ש %MvQJZDuqğT BvBVऔ CN#Jz%=_̳6k.A,Amցb h|U5xaD9ȑiab%CKkM|J 6cQjϔ)\9>Px_8su陻m,wbʿmUwov*,93T|b% 5ݢzz yAɡ[PkLz ,%Pu*Φ'wuq+CB.XY. AQ yIS4l`/=zoj43,gh4UH[fQ"$8 ߾uIpz{Er%#U1HN,j嬭I$,/ΟvE̮Aa8]N('!U'O-s~w/v]_ MC׃EAnny'v,::ŏnU'BQ]hϾQ]vN$V }?,Bq3mN!DHaT~,>@ohFL,JI#lSHrIeAO% /tmS<9.ngYZ Tmn.1%fx Erja#4@IJ 񉢰ds%\-sF=pɲ)"s @]]J֣嗣 icAבg /(6Z05[ͬf8܄xJ^fz@-6CO@0Y39[{W;R`'>FMHpMӷ s]D܄F1"H8ɚDM"z@v+jNFniع@'o,q)kV4Hqki ױ<0ütHZ(?RP|}!*6Tf^ f)e!$1p8da?/E&OJG(3Cq7}> oN=#traGf׾YM<1ofzb[O_[;꼙gn͇ 'Sgjkrh74(K㶆-a#JqUsLG,ajp/Ec^`r)H"/I}r C-^Fd 4ә3̴U-\hwZzM,B]|r־+W 9r_v땣X~ԸUa>Sc/QF?ÁTIYoS4ᘝMpC:,/oE_r$JQCNA/%Ѷ<H6=xL?R8+FNR-Ƶ~݄MMY5pB g},H(kdnoE=UMab2"ESyﲻϼ$K\ߡ,G#&y`/T33,%}2KCnw$p*zvGK |9'Z^ݐk ;P7#T|fE@Ba(J_ mͅ, j*\ `d_bP~6}iŢD @*(H{:?QffJ{f귭:*6(p&)w^#=!]qnV!K:A7 :RO]/G͆ 6:dw P_0]ztx ¯fz2W+e۵+QfBap1s2}c?TEJ c*0!| ? iDŽ<՟]qψ:I&Y'>Dŧz{/3J#ۧh>Mʩ[/@v du55{ ICۅ)~kwu| >`nqN!Qy7 cl\Qk?JsiH(5'$S70o9X}КA IvI? /L8v-h'SvB~x _U}J}@z.& y4f UQp8IR(w"j,?vş\ӃThW`ux+9vQq/h K.ןz/3I& >~sbF&]e(Іe̺_pz03 wQhuװ2z}'Sc_ p E0^pH8{27ab]_O+Y9p $ uyaʺWx^[U>:m"ܙ-CWI) ]o_֨Nf$y}Dn6K1 s+=T:d*7hzOabm&ԷGVǻWB> êQZ`a2E dXXF=8fGOp gB'CTb`N¤&⹽U}acd6HTKK70EF1Hf͹bBSo& q}a\F]rT'`*h؞Bۂc6+2=  < 8FxvwKw;]-E %m+uySaC]g2|RW1yi!Պ" ~CsgG~lS!@~R+Y$ y9g4n mKX_NhAj tM3_˃ 񇩡| )bϭ>߃ϛ`A2u|Y&NRBioZCx!GSy7JL!]'1&*7ΞPh8TnO !W>{ ]Ԑ%{,f:0Džw=E@zEek՘Mc+DǮa+&"%)<֪m'Q!|36}FRʱu ?"3ʍ܃P,~$gaOEO2^Vp;@qi:_D}gّSU2tkLWaD /}qktAp6LiSLK!{(?S P)S)08z(B `f/Iݴ;:L*Bn,)Jژc9C9 \Q&Wk%5GM`G%pԡ^rߘs7H_CyFx$8yՕEWae h[Oi9D| _Q;v?D#mx?]T @I`!'~$7QjQ_3e㈵E٦^kTqjl>i@p=ܜ6 m'#Sb0dE9ϡzB%lu n/KPyW߶N@qLkjX |;VW= ]͐ks[_ 2< ? QeYCjɌV͇VT9ܪJht~A$5vcؿ߿a]dRqxZ"Ċj,ަc{7ڧljK;CـO x{)&df-#TP2*g+X#ԯ]dD _Ai 3 ݠ)0f3[c5t c(RuLAGn-G* `%bm?`2(꺂Һ@S4DP/ FLXe <,4LS0M 6R7q|S\/iu),d ŸIʑ:VaWW"ګVS.ɰ&H#%l7 ep^:+.0;S8lp}kj]f t0m'TS>VSLˠ^ǴmʼnOO}Z+ޠS?Ir%| 3!8E+&@k5z@nx(u'+ܓ+\4?YVTe(lJSMu %u_m*nDS^Be+ py9'c:_[a?AX{$$WiQZŵl[Jw?rbTMoJ⾒C^m/֥Z'׷?rm> 6!EᎷ-4< "t٩; Φ`Tι<޷+\M@6?Hᣤm:uLJG&&|vhN42L_&C~qhBYg1Iģ-/,|A^u<םqڧkƨjAբ2ȶr&٪Mi";#t|{Sha$1lgJl AvuBEf*JdMIKwVZg&Mz Iy9E: MPd6g=6c[n yv30[퐟O}{4n0/|P FUNVp;27 *Z&r 9$nrFԎ k }cU/4jeYGa߫C%k I?SIQ۠^$ƍ@Щ{cƞNU%02S:;K+# /]]o7.D@M'k"ǔEbM}ʠ[lQU6 ZW_WAݽ;W5un%+U#Q&oz3(i.r7B}\hi bW 7g]uɄE`ȯ}PKpTX3 m w`wHD͚8;VE)ŶK1Io mBliʉ: *4p;ph`VAص.Xt]PFa=kYvl[ͼڇ(YzVƙdm)\ByHctŗov9'ʏZvg 5 nKA22kft Ko ]^a_')Pcs_=)YyV6B9I<7@@bZ;}̪q˶(a쐖RU"2$r`(m<feyOЈlYDr*4R<`ֽ /ߦ۪@iB}~2 }_1e|w_q20.DoK>>*M:'RQ#zMTi8//9y\uR/ᏒB}Oߴ3KASX6T^o,$z .ލB g#׌7Fkִ9qP7ky[nC.vqc̥v5שBzVi&)J#NCueẑaqi6>o%/K[$ 7C Aav"VLQ x/EH@Wx:l<4BjfbG扞Ɗ5[*Uz+17d x`u?˽Uk Inn0+/>oH/aO|ba _ZNaN;J̋x'f |p 4OIWN?">ӥ}qv[Up4v>]=v %1yՃ%^ .ϋ/hmkgbiB'ч! b}>@OYϫlZ{*(I=]z3@OZôxjp㳧uO(+0z܋/ѬdC;˺<F$&|{Y,i4)+_m@eVLO 9OL[ȹa3ѥh&!3↯40|z?l^gHqS{\KMx+$DIqd26M2p M)eoݧ%oڡ䖾]~5kԹeGbBF*iAda^xJxDΡ.m-E.;02;\ew[ MDW^s ɻ 2tNf[>?`-r_ۆ6q= _Qmp®~ LFe\IwlSǾsǵL`!+{/ɏ_GHKezWwTX&8d 94:;(X~]P7T C8=Fvzxk7[V`e_c6~"q:q~|P6گfL&<3L&P= k/W ^?8hm֪b˜v,_2I +R0ħ=,;?kׁvY&#dގ.KM$HkWL# V NbnP _E=lbm^+qflUA҉ 5#qSs2`t5ʊt̴#U@%|H%p0y=櫆I &A4;mTMIp> @hRc(l{3*Wk/e!EFdgqLW(@h7AY&1[~rpQ^CEtowIXN}iz,&Ӑ8m2G DwGUb1/Aq釟!D#}`)>N9cg ҃9 *DTv*L=/k]K(b/ڄB [Wg!>YNGJbT,Gؘify;FT+ ŢFMoI8.3H5;9,e Dy zd&+Wc{cygatam7}XOGMvPTlF.:l?֫D3ֳ^ Oʞ;7 ֆP+fPs@a)kW.+gj,M̵dˋs 0œ4x`V$ƖuVH@$( Xu{ry%lGxO5 F&´0DZ\>fv(Y5ׄ.k-$cEjEa~H|؟)6MZY6;2&B=nޔAt\ѡ݈f+܅H= C]^C wٳV 5.=8"THrŭ d&Tp'> (4Y!S'=Vi+it?^3\.\8;u rQ!lT}LNa$215Jl^{ ԞcQ e5ٽ\ɹѺ:MKypwi['Vb\5&4l<-=bmxHAT 4HQ7^Xx1*=S _UX^OÀ6"O{h%NXPPm!ڀ[CBesvjoP$lAp2آ%DmN;/#{X Ȃ\5P; "g8`[j˗[OʨR_mQJ6 嘼.Hޕv`#K7D\#Ix\"lpp Z[ƨcPɂwWF$gʓʥlƨcvKuCCHк3F]a 2Cy78-eϨc ybl<بG2 ^(Ľ˔&նw1xIn}+aR8~J6}O3 9ac  &̴rMjB_VPK2N7h8Pe0M-0U^P,kсd]wfay&?. oh}C>\G@mNEaK9pu ԇA+!3k c[)FykꇔX뼔@LZ@"TN_cw7mrcG-Ynh m0*4la7%";&@cA4P;fduqxX3 ``)Lz*m9M?Z(ʒ \#v^ۛi,f.z ,Hx07W7}e3=lLڵSCqd/W{RQ2OK{oN6oڍ-1#&,]"DfDžADQ!Q9ֺDYN=՞ ,_!90ⷹ]m 2T;nO&mU꺿k̰Uq)WrHBEM[z6!ЌԆ1M%GO "u4;Xxf<,[W&;Y`nnyq$W끉ZzloIuSW칧!oʵ>OIXb޼$76j^7Z/,b]DM*qDZv%#Zı6N7j Sv{{lNIG/R 0JW]Q)؈*=,޲CA&v ז[wk2 9b/p]Gq M,E;C+,> tɇb̭mf 3[§V&]DH&? $IUR&i ž^Ul{gjgV:F[VTZ+3GB_~zdMaǚZ 8;C_5x&e72!y(qb=͟Xgc)菿;ԫ㶿- _ IaW4VILr ,噼N dTs6J4ݓ`ndLUM]Kͯi$d`!݉T%iQجCzf;gi__XB}`.[zòtJ!S^E&Œbn%l hq3jʜ|&0(2S3g ,vegK./YVB@փzѲuff92/\9;&^JA9yop u8y /<& jIR4IAz(hOjKX0 pN W_ȦC~@5tJ&|ܘ! 5ܒYB>]۹:Qy5UJ"0_{$B%_Ҙdp\[(.^"f71̶v_e=&48!DOEQnC<'zl9J"2X3Wi9-p͊.kBrGYk$C9ʳWp tbp~ȫ:H J C֍sA)*"^ٔXo CƶY;;3Ps RMV& \_GQƕa#|3 {}ͩ ֨6!_ZP wmv8nOef==Oz^4y\nsK ɷi_jt"_D .M=y; >_V!V5=`-*<Hw]r-p]|J<-D/#K4a\aOFe@O| ;$K^Rd pBH搾͎bw(y=Ȋ f2}KىMvsb_.hw( ׍ZȦa>8[_X28- 0(|ʟ˦D u є f^Vkf`U4G4K"38W%\rjυ?)*H`r;ޥ#w% varO?kCsY8 %]T(|7Y*oZkzG)}18W27aX_DPblon)MVg-q~_e쉄mŭ sƟ/i0Aal]yS+ZzY؍i^$[4y%^FZ9 NUYbuATe1a2!(^'2,OoxV#5$PJR%MV(cu$W)Mm Ar҃Ǣ. ^!o+3 #jщi+*KU#<]|&\B$'޺BMYHG~(LʷǕ傹x(`r"专АYd^bR[oվZ th#\Tn-:RE\wą&۾ꬼj5z+ LDTiԵ:)61D*\)Q s>^ "Tmsrdveu2O 2]O{"Idnk.8'iȘ vX 4#V]Ԙ12:VioW=ZݲYpԺ؀L^ GtW Iɮgజ> ՆxC~|>'ж hd:HLvdNCD뛗lٯy0 n(mSsx]IN7U]-XLBĵN"28b($}͵T5n3dyQFvnM !-}F,}IknJSFAѲ݌v&FQV=^+M?.Є!g'վnTctOI*R2ICXI1?![ ʓ-E3S$cԉhk}c"kHܦr+ʾ0|@]t4&,@?E|\7"#]Lg P nT:V^ 2(Ϧv[ :@0cɇ'>s@!տVc & c.8KAc. oM? n1wPmiެI pO 6Κ]|Ԧ4Ms,"LJvӟ2 J pF=(Y`f9,|WIߕmD+ .B>Ǽ. vax< Ԗt9Nce<2aKg:ǠEW`/ND_~s'Ffݢ ?b ?΄oWݝn-ؕ݇PIISZ|rТ Ӭ&Ih$rA;IqOOcCw,}Ȇ_LpcJ WJr}9A+'FMMfvr4Ndi^vD0z1n2)ƙ32& YOyqk_pN@+<㯁2jTLLK;Vj\ڷeW]gYiԣEISv+ cgչ5g4ZAR2lJ z^e{h4Bt`<{\"ߺ4/BT=bOcJ,+R0풫_x*aGsgznGa|sz8 Ne,6^E _/4뜛~;}6 +^1\Jn:;'Q)-Qܫ  k9hl)J:Ko0lkգ3$ VDL?/8CZs.(k\4?]\mKFyb :U 5Zg)ړ_ϗ$D|᦬Qˑw3+\~wǷե.2FU,V_(vFˡp ޢdA, @Ϧ?_Sqb.%QŭrR\Ǻ-,P%|yʡD#AD)_mͳ p־fziTG^$.JGDa9,Guӌ;h!IP T c#|(W8tj{1o(} hqn#TxL:iy<l*Tw5 ۷x5iq~:k>$~b*QlTJ+eE6y\ټm *ʵB0lmWĤJv۹3 ܗIu}8:l9eϵ3$t0;ޥQ>xkwGP+Bqr3i )zщs_ʩR]ϒ eYO My"j9KY(P75Fϐ&P 1_cP$J¾BEpnR`\8N,= (ws-4ezݔy-x kӼDO-Jebr/qQ¤<7DBȬe 3bQE_H%$)azkex袴 npzu#Z썳2$gMI7S>ª- ܤrJo$E=RSx LcT/&K"f . \lekwe\uy>t!#UtQϞl8hՐ<1|,Ӎ[&)"<ąKn[)ً[H)`͍_*aҟZIY׍Qz^fÍ%(ח u<GҪ+ZtX|ʭ~R1bJͳ*@yU`f~:i|.QY ?f;〈PZ]*4$dԵm 8{ !6Z09-`AⅮ>~ll">AlX3У(cjٱQDWADĉ9s n)=3HG5J.խOp ŝ:j:u{ƺs$5uGU4 E=8VL;_j 8(cJӚSCzSe跫:d<^ h ހhVb_ֽ1b%襻2x>|@o/H݈t1g ;k2>cҍ &7e6jX"'|~3aD̤+Z@6w}x%'\~q`DMĦ뚉ѡT8e0 }$&=|0Zm&f t)IoHwÁn6y(n4*H @!2FVr|T*3L#ͳ<3>D64oAp'rr͙Rxv୞{ߴ3@;}Dy|D+nR)߁4,N!|Τ^5Q/y)*qaO}4Vf~晩"T's$@"J̀?ck5LE.<]+cgUqPqJ\?j{edJ̅wVՍ ig,{ڱ,ّ\ӻ^6mZ`e.)U Ԁ=#mXvJWJ›m7>$.Oo4)|_->Z>c`jO".8 R-|Kwv̗6eCŅD5{~\1p}] b`l)':4-b)4H$x͜r*]K N&O%3ZSTJ׉'XQy9G+630Ti u5=n2ms>V pL=3ݔ3M>qNK[]h+'L3^+c^lIqPSf@PnavZ394\XR7CN`(ps5|;)K,|Lyg*7fՀIlȏj>'gAQ 5Xy739ҫ:<` t-xSA$p#`Kwi70#P7^1LEn}x]`?}:kή:^n{!?Wǭ/xI㣛}%)ћgjh}Ѷ}u<@}?òN7ߐ,<7^xi?p=e2e {zr) 3 ġ?'#C,hQ~rH] B2+`PrXנ}#5Og3AEtnb6tćiF_)[ }T`&]t$U٦0JaF `B}0vAW'ZءuM0 =MŒާIzF3\ $z[콸oѻCph RF78#C.iiX^/_mUR.O[@}2 K}fOXVc[|\׆}{}3Lɇ5sڝaDsZgUh7v ]cze3Ńy74}TM0@ ]*ȀF~I< c/xnYTP@: HԒ4-Egd1z7o_ iE{|&!=]sjݠQИ4fbd߮@j7yi٭N7j"0 |+޴(=#_F0_yK޴1 nj=}6y/2[ w%H"tITmblT ]Zmq^[HIq5d@dHS)9+'80L'E'+=Z$ޛE.lxw /Jz^ d8ZicIi/l$8ٵ4rD$J>f&jn.0_^g m~] aYPsy:Yz@7=9FWīa~qf+E0ҕYz3|Zb !Z]4AU#ek1b.-IAYtBJ.((58ެSKm6;? lLWzԜ2wZVuMC@6KmMdxP}+Ca*?c ( ń[Ā3TPk^838908 %csP Z聭K\sjX?;=KSK[vK7_ ?PZ(.3'YkLP5b ^,L8{^/W#i%Bc.P,l$keܚBQՊjjWQB1ĦS&F"TS҅DzNX[b8x)Fe´K&Q o=ql]0z>eLXN~-^ dL?$xE+".&K3=dyrQaWʒ7}G&h~Cɤ)i(BM16}<"%DZ;G;_St(NM?7ΖU/S~Vh`m=un YG؃faQqjF쏺VV],"~[[ַugfQ6py.3'W91fbM: +Qdc0\,4CϠAˋO1Ua!%.k,Οq4ϨKrPRgMH׌v>:s> G] Alɵ Xq\9/a#y(XF_yK;_N{;V?ޝ84ndxR tI~ ՕQd6Sh*&fQ}qȗ;Ǒ/Pl y-d}-c!n!eRSnK'Q>zP0?֩Vɺ'j$kwk +; $!eVҨI+XgrniPz'f& SVFm0 u:Ũ5ɢHEvA?j)O e^5!sW~RDmG* <,Cj{5\B$PIO'4[xIdykkQf:|RHBəB:E'ƞݗ:kϢRi_# AUYTzqp96eժ'k)% OQnvJ? '?\{m ߳]ĖNDC ]>oz ٽf%݄B%O̥wFn&w8b 5aF@hAKN$rg%"D;\o4 MSޤr낫}֞Vp ($nqn8Ku4]ФM{#"l&vx)H@'qԝR KT/#7ر:,pG&m-oqp8jU14m~5WվCY6#! VcgqF驞NzF" o<Li;{U{\U'~~2;|~Z}iH%u[CY=6uBr_GUo25^U^gY!ml*Wģz6 >{mx:cʑGr S a 3l!Eߺzo b<Yާzo(,&^H՚d67n ~;,g@LKnekw}Q^v̸ /En/Ҝ$~Zu NsC{BRRH%mR.|Yzr<C=?9FEk<%<V{ʸ%v;CuZ 5&Bۃ:kFR}X 5|~SuN}k03?"q,wk o;AIl)!&'vR< SQvUpD]Pza+Y^ȶjl&vk^N'}I޼p{Y4m[ sZ[bdž Z L'w$RXZ$t6Ul T/&sE\`R^$Q'0ȟx8wsrGc0]TS8"mӱA:Ik>GsA:Β)APsLQ)o6XeA>3M`~$DotͺTײTZ`S b>'+\o+/~+;O 9o#p*:f49Dh\v.NlN YC ﶞ?#Ϙp*mRV9.ȶ pu}9Sy62MXSo ֌Gk?OF@tbFeld StiSbEؗAQYrEaˇ0rKDлyf"U[W_'̖W={֒h6,xm^ƽi7"& Q2(vo"ҚO]=Y7GHU$R)&>s @Hme2A6*2'MNr* J;+,xw5 ~ʬ(!Jc2U!B d\20ZϽ]|Mz^~N_K&1ĴAlM eZ^zR>[SGfҶë$ux6Y{ƂfK9l0 vRgP"L)`Z m f-)DjKH5%;+w]g0ƻX-a;U,} pkU=F ocg2Eq<0~W9GOm,&L͚hR j~wg-l \=? VD=u3*Ѩ0D R;Xd~(TBS0 jT0 t*!Ý."+if ߢ{<zy`w}3dH/#/t71A`U>#g@ 3>iYt[ L_?!aRNi푕*[FQ!+RPٝ/_iq![–}Pf0DfSl!טs9̄N <@\~ :3v? {Уi]`vI*xzw0 ĩ؝Kq xDlxHH)MĮ-o tGd [~nSF6ڒv kf ~ePDY9E^[Q$lA Q/|e8J4qB%_%c.l.7J'\=em(y:ܘ:'3)vpWxxOy5]N? &K7{uN\G^%>0nQOCJ־MD nLq g@&a jDn-- 3fb8ujx ZanA("-^ ''2`cjQJ[(t%ͤ5fۡn7kЮ@sp!{%E n)B<*HcAMxiCW9$$ UvRycGЩWnz lF`RR FAIδ_^GxZ/d e*z4=_(`|!Z}HΌ7\# TȢ"֖$#EFY+iU턒r1Q$Sm~ !:_O=&RNGE bqC4k Q@ݼNt-nW3Rsvɛ'$A SUl{lCd}ẃ'c*ۣ8$s*Z1]T#rRI2AaIx\@MLrV5bQjH.qQ %*u鉿 z[W =(A{AϘɿy]q8sPK:>Gƈ*4>i 5 W8FhSݙtYfOzJI=51<۟LKJHZI9!-c ϒ)SZVD'*B\3{Zb9lC]J KE2$g 6T*ͨyǂ'Sըr?uOF^8.i9T{-ȊPf X]@fn>&s'4vK\NA'b2j#D|#PP.E6 i'WxRW!'#ʿK%֡]N8sɚ|~S؎{$:Kc.RvLxVVl_q2$Jz;}ll9ci2@k1'5;*$&8:oU<6R'":d@l7JZ"^:{7cL;ʤezc1cO4 ZłHٽ :BvS64wJ28S~ҍ~q2o4'_ WNr*'Qc٬Ա%m?mxTA!eyzcN1;<ܨoX8 a*FHvfψj߇G5-c첮3.g@N$ODj )=s9UKDC#ȯ謹ZTt X*e "^iXd WV_#!k@~=^<.L!qW"n2%zvp:<a<+l*Seҡ GtJ$t˽w"D6 Щصkސsݘz9_;e%x[>*mŬǻ ސ_]y#VYZwi]gjG`PRK R$Qq -X\i 氨\rf羬Dcᐈ5[sG$͘'lJF\YҷRPSj I|h:YUc kV +A7ͤ?LOHO5(+?Eh6^Si7uÍPYGs;97~d.eRLUy%=_kwq=ASjk_x(Eʁr^J< ޞx5 } bҍʎo(uiɬwZ螙'݃3j@U0"2qJHd9IBK^s{1W5ϝaaxh RѐXV;uجH<䵣c-,FCtO3jx@dR`GLLۛL<,0@mw.<`[K+17F݇.cWNkkʯK"ҔEցwoi%QNrҮ"l1&i$K.2(_yYw- M7J)Tۅ/Z})OAEe0#aXf&5.KY.ف|ښJݫM }ON=gE[^|FT:kC"37|i(峄 ~X,e|0'+C~P2<?t,'/p)J02zn8[ׄMMa3a%P^Z[qo漫V`$vi?W-i`(*GɳNFBm% \ ,r M*pWop@^h dƧ;'Ssq{ $@Y5vd"Kx"hАH.^S#Тz4XZ|]bZ8a=)[[q6Tt2Z~.ŲV\kI#bbp_5~S/_R/ |ҕ\w[׏Y{dmet1jExj Qi-8mkH/~\K|ݳbԔGM4CR^^L*b4o܆1)gY5jK24A.5}|m#WJ ͌F8%{9"ҩ?KV)h 0)VJVK{Lg+Fˣljs#y>${]zjIFzߠ_R:M|҇Xpk5Z^4e=l ̠)AjT;.z@G-y"̓T;Kf);(E)9ЕYJt Cڅg6pIUxqOJ@TͻR\t/x&<:"l=Ds>_>6[.Xh4O>>odڙ7WQu5Krr6-"Kx >!6]ݢme4_~Qi1R[[ zG@ uMnݹq 26p{q6)2훼l69AY5\==Yگ鋠̽P̿>VfI,݃˶{W Ѻ񯎨$>Lc;%z-R<\:֫t_(g&;8aTԔ\hFMj ledhbcZ4zzyϖLR֑*3@)W;RQ_"lEʗ:9Ђm7G? фkY<,xN_ZlQQU׍d^`2J|ҩEAe`%I3.)ƤI+ݚODB0|h[upxg632+L\Ю VY~V?L2rѭuWJԽ1'ދ"qGriGxYQ5'%hPDΆrb0pX$V]VWQ{>O7^n@I&fr,?i9+v]w!UaƮvVEHٔG7~E?)beGp< Bdx NBXC6 M,Եj+t { Z@ؐ@i~ XP[r!FDs6. }B5 iᕸ8o͈Q`kXg |sw۝CEBlNVC'Q"NuS0y_.X56fRȓAfƖp'gMM^5=9s&0_;Y 85DvzV\ˀ׮ M\?ħԴ`dHnE'oyj K{N;Ć$×?r`MaG-I%4[SyDUKNO'CwKtb9ޙ/qr!t>#A2:In" G}FzמvNqT!ap2f̺'*v !2^WK)œuϚ aʆu=8fb1/#qD[usUcZV`\p=S mgp} h4mn&Ѝ9U|?my,h#O\Ŝ?wAxSxkhF!dQ›l\'zP':WHAWfV4m4JpJt ong p%s8gtѾ3νg\y,x789 ?[ksa0SKVy[:|gl>\fR\VL;l̊HGaw-sF#› {߽r@\90>&?Yn./P&䣞 pf4fok%XAuc"X5(ǀ_fǯ~,W4w,ۉt)-N|Ȃ^Dc)Լ E/X 1zW%;ESQPN&$/6g>I&6loR1\*z)XFW1-jCK=.{/U;h3䀷IPsTDN*YQDJ[ə }8C/ir*rNEDxНЖ i^&)avJgqtuV\i,9 "^!B>w<-(N~uEХfIJJCW#!uK3̓Pd^zv~N#g"G79`8TdHF/o#!s`н?6udGf"={hekADT,ɛ*2uNpI6g̖/&@/ ' ND&OWt}3Itng'; Hd\jTLw4u^8U U:/{goBee)(Xլm235uZ\G}c+7*JjVXp⿸_ {7&_РdNŭ.|N5<4%3Bk4Yյ]p˄XDAu$`o{H/-CG\Dxx)+VLV>Q@rt-rCT}@͗l+Av5OUV21Ka9Ur3JZK*{;/a$9XLlo}:ۖOGiC`'Ҙ wTIF_5GU,K"'=iKҝiO> l.iS5Lr[L؀׋û萻%yDH1q3E%Bكvgtxh`)qJHB M>  \48qQ4y:ZcVb"⇨!gY-EFg@ ?뎿F:gtUb͊, —i-b_"wV ˒b 0A0m {`]D@z|ˑ_}QۦԨ2~2>M e)jS2$s'k0 f# 8ё~ɬTrA܎}Z;贄&qb)*pki>?ݷn.1oSy~2i43aӤ6SnŒnXHmSQa;3R ؊fbE `bֆeDSꮸlU[q)bަE.4ԼԈ+NV(f4Ao􊣶 fv/qRuwmBŞf<[/kK2hI[ nl]'ԇbLzQ<r]6JTN,^6kJR-^[yF]S~oϟ6m[Aw@k!0{g-]2O(f'x_.7gVd=;O s} ,֚1x4' #G`WOőI-FE| 17-{d \)!y /T[L1NqJ鋀XO5qKT ֻ#n~E ?Pm u7DM8NDsD-0seu%%?p{> 7 Ҝo> J:cqfLׂ̖I}V` Vˎ.-U#`C ayQαXk0pCw="_n֮&P|7s$YX'ݧGG;>ricT\iS-7!v*XK6i!0 L#|+Sφ)HhqW9jDNB6:LTJNw*(m+o k0pHdSgE%:(o)$%ɾ){Np'aMv̧xg.Ӣ2xXY c?j@. Z;ߑ{iQ!!- FXz [etivgS x҃A|_ht8\MRWLܬB0쐿͏>Cɹ'>]B͚}XP>:rk`8`LKHv{awM)60؛6L?YR<H!]sƇ'glUGGE=ķ.3Gb.ZQcb\-s:SZ6I?q^K5i9X­lvk!_EFRjw| -\ KCBR}!Ø<%ǂp0DUE,7+MW Hz1.Gȝobn7\!kSB F~Q:@HFT, CA`\ABVGr!ILԑJ!U]R!v5.M9\d9^=P6C8GִKyH#!N;9&/jS-!4·[LIi(X G`@R+خĄdNkd-[lmm E[`J;WDL,%`r'>?Uhf;GO b.ܣYJ* n42 6\LMyu2)E9.g(Y9ָ_{ˇ1(fYL|S\wR[rp]=vwJEoB9 o܏^;7Nl9C:_o%_TK݃|ƀZ]lNwWb ho`s~YQ"j1(VdiTY9sRNoC`$]pL]jKHVbwC2>خu7BUM#1frqp9릁Sw #O c a7{fŧt !E[-_!k׌T,C5x>TV;n1~^{pmm'y4YTٹ}+MT' \儡9_!Fy{`Jh1<ѡ0T΅ܟj2W&=([ :C'ƦҵeZh2;u z/[[u.kTkaB1kR&}nh]tD%w?hXfgbg{!KarԈ0c;drmՇn3K 縚ʔƩq?d ΠA$ |&Ͱ+I8!yO,aw.ijc VMZP?M=#q3;Z҇zY6TD[;_KSMqbɐ%uK+E#3 *T$ 94KZasEi: ȑ0˓!64/$X AL\9Ś3HW(s6*Δ:B|nmseN*Lw Z\R :9\62ı ,nYi,)KilqLVUi9XD ΄hi5+=>i;0|;y߽pbƢ>&J }%Q23LWr' ( Pn _T'I4dJ-^@;yt]g1w2pVQmT3caշ\6O܇;NRMGG&_5VTvExv-C1wso?^TͺJ&3bʴ3%6Q&"N/Xpml"=7J22A] ,(n510ʢM޼kRҏamTkR4㛸yIډ|&mP'\sAUK U *Tk9N0^,f,v*EjH%嘹Q ܖɘDwū{㔐 ^<׼A (nS]/lP nn՝MIΒu4doAR 39'6n V&v6=] 8kOӝ$Ggg [>5I בN[dvq7hQM]-A_ ,_atw Vu;P`Q4qaɺxoGȴQx|?fўKD?wjW4XZ"סZv@E  iAX ZYC>fˤfC$ʒ@ /2)Lj+~ qw5yԜ>^Ö %!!X*#m 7{Aա`gZU&O}@03 1i@4{fރ H0d-,P ,\c>ߢڗ;W`H-dpȶZ5VB̨/~;zf1<4`* ~o|++zriwƗP={tV{1G*0:쀔n iM=k<{y.<=*`?&SIwY+|iReϯĨOW\(\J`g/;p!$Xf8 ՐxDb1|t9&\A;S~rBNy_=$8uu[áݾݲ{pqXBfSd(PYՎ[Aj6~US}oh}iJ) lgm+ ?oWhc|X2J;6}MOf2L=r7&=;P9sܑ1 0cZ\4 Lq@87z٪mQ&s]\s3|ŨeM }l*]c#%L?I~Փ*E'ؒd Oub&8H|7˕'^]q4Y.iĐ)EzceS=CD"'K)^6O!ckҎ&qAM$($㺘geF^?]kO&̊d7M}8,댊tպ>G3A[E!"7ׯg'\SKޗ[b0!Ôjf!hׯoCFUnnuӏ]Th).vzCۡMY/L.TܛBZrNCNdq qBnׅwC <8#3!iҩy?DI&qqpz+u*B}@Q Bp?X=8"xVn[p6fN4 Yp xlG=,N{#t #(އaG{O Th gY=+/sZ«SP|vH7baɜf&B-O̴QnҠCҝe$\4[w}|p sC'^,\t tª;r[\45WIğd &FeݏIFR*'<<>ҽRb7չ GB#SP}x>!WVp)o72ѕk^z'd!Z.<}ָZȗKU_L]#-ꨛt`)]d7۹ X_j-U=UraeL'6(; "Cj\uܣ?#m51uBr s $JwZ $klfQV I9S>V%| E1{p{w0k:qy҉}!;:dFKJ,CFyMl©S$S*(-N'eV;ʿnn5w6=j;䊫wTJoNOHKibؓ*YGA2brFX"usEďS&(*a2r+eiwCt+0!R!g3= wrB}d kW83h^b1bɐƬ߉矟-,V hO dX{lv`vr~IWY1-r9%]d h&InHO1XO E2gccn Yp]忠uLNbֽkEsk\ߵbƟ\·) K8}VJUy(z~%+D3;~4a(Bxc% =vʓaysf=PX}'>Y<99?1!$S#kkؿEnʱSLurmiHJF |$GdVT̙7bӪ3HZh#%ؤb޾OQK:9ssϹk0\&@ęv|Ux r>^ ) Z0v=.oZHtKق6Md_f*[NWD| yh$Pą9j9Hb>̽ ~$ .VNN*j>pS$JDWpxt7^&_hbBnپlK # I^c `y)PJ(wUjO-03FdL>Vp4nRGm\MC! *f3R_6sp?j UMfġuk!d,UQu6UMWB 4eҧ˼;䂶iXG^L?%TFֆ*"m e[I 2}' |M9#KɊa37ܭ2=t.!{Pd"~Hգp /9yxb|8g\թ| N [~ jɾu\^/<%jʀ+w{1 W? -k *LYDn p4dPV6 >NS_@S1/"y+2'TA4_ nS\lOփo:^e-uD[\UqĄSN%O ^y觧>##usbRRƹmd_A ]%w-=yOS(6G2pE-c;eZ~]B ѵb$(jkb NFbZbȡ*0*?^A2 xwNڍުi(Ph$NA2lHJ*,,~*eߑ}wwL[kt~ t뢙B`WbhHQv' 3~nqS\5?>?"^sMfgQUi$g%wz*5WQ͍ /|w LቐhL.\#o[C(vd,Ȗ |}_e1U- %sAl2e% BH y1aLHderkL-czŷrV&|}fF LG%xe,h;"~˅E/;f^O{%˳kaԨ+ؼUl;^5_2tgJFc w.cq6R2XH,[S]3ӗX9M+$veHpՎR|֡Wb z4^I7mچA79Pg=HW5&KhR`j'NVNR9שiD*MmU''L,tvw{q%rS8fQy KT7Tr8*HH2Rރc^4$.-/̒}{xC7T07E4]ȷE0Z81JIWVt\^"+wk[K'"JT O3homl4Śݮcnˡ(#3UKc胍[%~i`·fPko9 9PoKRi! 볼CE |+f{SQ$WQ BIl[Qāf׸MӯB_ nF' 5 ުVJf,6q MZgq"i7csv֜ky/HżB1"DZ٘/?]sxrwUXb<6߮4oj y)}磓#U5O@N\"({^q]7d~'Y;'9SeO[RU n,Lٽw +XG?3mϵϻ {SeF.pQA]kU@@u<;+04@W磖e# ɐЗCmWtJXV(ϱf;F#lх$GHG?)3 i[Rr!B?\D,Oibo봍l m&3l僛pDgȝ#5ݴLQÄ qP}-qLfqv0E_>ڝ]}-e5^Y;8uNYК.Hyصmnwl7 "@/Ph|&ijDw=k$W&kcdWd`BOqceg~H@9߻7ڢ;Cp' sq$b 'sJ<A~ۀ&'P<~"4´), JT!"* r|wڬ'cUt ׄ<]mR(3:E.2ƹNv2NK`qy.e44؍z 29 <2 ]@on<#xPI)63I?c6;'_ڇtQk͙+rQ$ `R>AᓭIcYBeˍ?u?+xg_,FPIYǡ΀1CMU{ZuEsEOԇ "OP9VWϳU5pΥZ"[:4ms҃0# w5nZ}8 ~ r.[K$(<ED4C!_-K6͘Bҹ%1$iSe;Ywטd[P {WdMl=* dWd|ڞ5'7~Fӱmcxgu Fp#[F}kKZ_$] XgVwAޓuD"m \`V!8̧l !Jʵ}Z̾8ozw{ysHo\,,VQ$) 3cME43,YSU";P "x[tv62!_i>#sd!) wl\豃ĠsPl4-mQy7qoKb jQ_e$}OzA[nD'G:% vM΅\sJtM7g r1$Vm GRm8esK:xv'h(Dcj*_{S{S)٨0;:IVa\W@\ .|/̲gXgH_BQ}~O:Ybΰ+Ź1]N !LO͞i;edIU^gn=\aگP*ܽ%cﳱ;r@r8ae6(}!+PV?ɜ`PEBم7D~Vj!pfų{zzڒ4kSwCqn~FDt{Yz?6:J{{ 7UrAh[jף1@42CKbtNW*RsY$ d?PQ&o|\b=`6Hq>849iNsの[ E,4W.?^ӥ *I!H;tgNtСXn =h,W?}?00_d <_F=>ESh|@ʛ"ʋxFX|P{`I)F:[c G˓d /_r<]ioŽ{Eò(YUQ(DiFW.cx 102rgDhᔊp%?!$ p>װ{1 *Z&r 9$p#_(˅ѕ~Jo1#)jtL~n.\H"ۛ{M3d|DDKlJo=6̹8^d) ?(,8Ġvg('=;Qg~Joq  HJ2]O7lMQ|!¢M6Dg=)û~#vљ{ t1w1%uiF^8:muM;Sy_SguDp3Yy5@c%u ^S{Ko wc5jyU30}2B`aދĿĘ~5,,RWOAg9:]?J+C$Y28Cp9crVF7E;8R;46p/pE賏ȓWľG/3;bWMC՞(] B_^\DF$Ckle֧!W""UEd )1hƂ|L:ꥎ{ 99 r04FI1d&V+iaS͐ʌr>Fz&&`,17ٓvȍqHeufINyPL2pXD ;0Vubؠ ޛqta{]%B}ωD A<TrP2N->n!͸C Rs^*WcxA1:`V-ܒ#~i#5 rAF<~2;|PH\Y F4%q8;d)rv[Ku>p[c=DX CkAb;Y-C6%u?ƺH܊$ѶHn#/7wOo-MsYV^@8,{_jH Ōu8p[lUdyz\!?|lۖUmUk)irrx/Z1Z(S-ad:u2닚d2&b;$iH5ؒya l3؈.$5^䋳-l(b|8 U m/@}^rVΉ̂|t` M/|~5Ѝ{ b Uڈ}U歈e+SIԟѪn'n at$q ?8(#%<wQ6XFOf 6xWwʛh`a/;=0w/9/TQ@@8ubKH#QPX 2\Dv6:p5Re2W Q4בeZF{OG.$NGR "gW}E F8_e^1hD"H{ b$iFoƴ,Z Jn#.&CA^4E^\k6l_OCiL$G\:"H('~[`ifзp5JPw y6K)T[ gERhTa׌IEPu3/jx̺*B6EZ*#4@\Gh#7P|:2D Rʘzs3T~HsvIT5k;ize_\~gV$>/cHR. X1U/] 33LrũQ'DR,s/ (\wOD'V#Wfu!GN=ESq.J{OhmvzY+#Wabl&V LBP{?z\Bڗ*vȼGa>d|Ɛ%G:9_Sϝy`Y mD5a Y[}OW WI ~K]?BBgS#b'K9?ZxٕH@8/l#L/7UlsLT±UuhE's޵ݣϘ)XK4az .[z,YxC^"v]cGBm[4fE ּ9g[H6Zf|" HѹXV::{"u!0J/ ;Վ F_({Bț3E (L( hci0/6c换YfoydoRIh9U944 &9QL ,?oZJ׷#:)AVx.P'o\T 2 佂iiu"$&^A#lC%et!>!$L  P|NG{r[4uc8ǵ,OYz'lp #):p# c2L𭋛b nmU![!q >.fؗ8x/;Wwm])w``Ia[bɶ0jx"щRڊi ݽeMH 6r&ѥy/+QU8oJcE Ԟ-E\jkmD(ae^:چabAV|A|FVm o ,ӆ~U_06[ 4^2ͭʟ4-.}`pО%9?="y=tt\g%eo)`wl~Q5x"XTP[iL:hW YLVii? +.0gw5mǜ9о~6Y ߃h\]:o'qײ@mw [P0ڻ*,Ѳ/"l䄷x `ͽ2߉unfP>%҉s%xz2a(=s#>p>VfFҡnv*TpJ^؟Zݣo(JMxK,tLr l{'Jz'ei U@oK'k[x7H!mJ|q^@]|K'%O,th57!nJUR uEFկ\EL+Q0d<6U]D7g&Bٞ'`ZC~58Sܖ-OthC ;l!N¨^7+.7JޟH~ ~;"m"Gb 8ke+q I+KTC2]m/ +`\wSp =:eVu= =I(e*oW.{?ϗ'I(mct-w~ef0j?y2`?YHq8{+(HG!,fG>'*K-@kWy@7I/!M.%@W *PzBI:\ɱ 8-|ѭ͠bmH].~XSF{oH:/e$> ”ħ'AVTC;"A֦)ϵp#>&BuV-ntatC`TOLX3k̻}\傸9^FRt zzڄY Bi`x,Y_k[WJOV3@Bs&>3!Tf,b@mP૜Ji-A䁷kfd`ezʷ͗DoiIUhDV+5i3+RS?mH}JM"xp O}b:FN)Vш Z}ćAF8)뎔?Uסĕ`=0\B'A딯)0}YtvN⿋0YmZu:$/&yY)+}?t/Юq%Z깕Zq*)"y:oͼt9XImߞeo]3}[uu1fX;k?c1KFF|7jB10b,͜pVZd02HMCکĨæcSDdm $Nj9Ո6zƈ`/(S-+<՗)i׶ySڝ~=I?UB/:tObP`Eg\7rD2gPn}e@:ZDUi׷$nx4 }/U衰L?IM.߄%g 91Pcu_p@P\oО 5 Nc}Zv:(N}}FE$ R,*D a|vή6H^,E#ea`l0H)#J'5zEۯQK89Kb"kNN4׵DqD6ù>(W^%"E|ӒDdvE@0>aZW2d#oO 9q&͹Bb!ɱ]6MI|mUUR$dBTE *G̋cBaa]6#;$9L1H _(QN` }+ ֠@/ڦh)#N' |Q]Q$ls' X>ukG*!Ⱥk<*l ~+fmt@[{wNW&Tm<\>pR@=㱖*/̆167C|.e%'.GtviLCr~Ӎa0\+zNh~"m%/**tao?Еzj2ķTi=}z=0U{zYl!^t,q*>~ Rt' KF/1ܩJdd;k&A2ۙCs!vl{7ӎnlBRaHL5AķRa?Pdif'~ꛑ\؅^#EI#ꢯgLqx,=H9HFhen0A)J>]%j̓ba!"Ast3 tS.-sK'jg@>ۓ2 qYx:#V">Ч@hCQ%$1Vs,#Jx#[uj'*l`afze5 ?aVC0-N㙦=>?s]]]6[ 9@ޠ+هM46?ua]QW%+^VXK]}tQsra0bDܑ8جuZ?%Śo;kq@)df]f-봾D+Z(X=qqc4qF`qrh@-4hC}-vVY(׸)W- ~m% `P/JNa$r̕4dl_ Wfkbܠ4o2]!.7<"xc?1)̓6#J]Gy톐Oz>B-?BBzʪ :>S,g߅(uȓc! hSm2Ѱq@|Nٖk&`-`GR>kf/ ߠ <*B LM^ Ċ 1*3pt*iLXէVgCUg=S ;ꧩn6;V~+0"KNB"N;2< {ϸ;0e*7uGU_K۱15C'[ 2s?\SL| 8h]y%ݛ|?#b jR\&WESBĕ_ Tۥdqxop'P@M s{ (+Gg;cJ8}d.[mF5"V*B ft!xdn#6$P1EyS%U$4.o^c_V60׬Q(?>LLG%j%zgd;vb -( )ZDr?m5I6t/6x {1dyY_ȶuB@_P Ǜ θi / ٪\0fu#:tZU8?? Ha@4{DJ9c^73(]?@o9DF,kV:'e/t&8/ټuip_a 9 Ws[#m1s\"Qbs?qVFxhuM6d\rlVӜ vmY$*y|#ɮ`[>(1/E FIKE4m@dE_toiLB~:e^G% ΰ`Ʈ^IޤAhSقxK"_!#cˠ- nΦk+ƽuLe`AL JOGBߊp81?>\R4:kM`m]4ۊ *a$'1 ?J%@}(&soAݭ^ZQ x#߯&2vS$>@t*4Cwe*v]qaǣ%'2pP9$on:v> 5E\3 l3L +%Jߵ~ UK{u0hF oyQ~NLՠ|~ux.w%LVoN~Jpx-i+k۶rU8YEd) 295_Y@<9GBUA }#_#o 5Q=Yyq,jMсf]a #<`6VLK+A<+ȱz! % fAqxDZ:vih#461C]Hh˝uj nNz JI"(>27i8Դ\R(;߃ /-6I_AG/'nڰҮxDvqJޫ< \Mb!tE ;?lW.AHR,Gj4s46s4}^.)f{O z(y I"e80C !*2 Ds ](0_=a;yg>9UmooRBŧI 66j`~.;FN`fy%%L[W [ej-2Q۷7OH7ߧx n.ݩ8_ mԳaЫ}sHc `@gt Q̞7W%e3~s'm*hڻD.n&UN⣲KFV9l<9 R~ys\‰Lvʴ`[sԖp r]1!w$TN|ܭR8z@OLJ)Tؚ+|sS«?~GtK$q.@xlݹp.FBa15> E,TڸL6aNPPhq1V[tBN\hRA͎a<뚕xehl聃i?-OvU`A GД\wr{C׾\¿w&! ZL mն1`}vJ@l${(/}BhA.'X#$P fN?#t Р8q>V8w0WMԧADyyQ.M6+nc8ߩVЀu*iYph:S03UجIM ;/]\ޣFm.{CB hyZ1:fwñBMkrP)EM~ՠ*~0!# /rLuj>T#֛muBz{^B۟xpgw?`F=#- Y0v-NaBrNMSXk'Y*u_ĽOIN+IÿK-DkcfEuѭiYK/YjJ]yΑF@cΞ=(r>W0AFHh꽹/UҸN 9NLG ?r Bv螢-P195FZqRm5#Gu^Se?2Ou϶uRA&6V()rk}# TWWd[T:LA7PW"6EQߠ %% /7*#iH_;ߌUvFԆ87lo18fVH}wwHYd.sϜI*zrN( [7\ n&HOv|ہq@s-# C?&KD83Y~ùVqn_w5(24ǽ:ݓF2} [wp (U ̪~E|d }*X7+FǥW1R7GЪU]-š|dZ NZk<R`WHk`9_^~ b,pk0v CR_iҝo?|?ՄT|O*DtOoJ>lz*,㥾r3+|h!_JΉ,:'H2jrV-;vGդ ǩ톩S"=a8;ٕdUk=PQIӮ/::_e>Oaȧ_; 1\8vS;v s*גO"B,t>!Y տ)qG!l^ޖ k!eõ`8QH-0?"40$'Fhuą.]S'z77ղ3_ i"G1 1>4L CJn9L%eԄ8u5+̲ګ+1઻G̡ X2SOiNҊNDTj\c#(悈)F H)Ԋ*e iJvOq7≯<~ sFl'\z;N8\d˦He.rx,ȵ|y[MXlѽ*)$γ`SsccfPк1ot1=jRAiP9;҅Lm/qtA%E1)8l{#&دI&iiW8/n ߃ƩlX]-k'P. \HDQߕ- }W&c$e$(8{7<[xbM!t벝&s~*FP!9  }oaE%àڬPtԑlo# >MP5x 8?'eVv p1zQS:UwcEv8朳+S,E8+:6U faa6[LVeAk,F.l @*9M\x=c)q'}I̫u*g3rSǃ(=6 ">=!e7_F ,f ,A-]Z.#6)Uh1 TXzV)4A!ip=0>3^`^%r [ F4DFO7n`%ۿ%$I >]f9{5jfS"oc0l煾 q~VRm+kp;{_X*w,؝^h>9&0l\TWT8mxp5|j1 {ueV\\T1o'+#0+_ETmf[>W)-%Gk@? w='+@onsA~OT ӤZdTʋ|Vwв,cis-nidckXfsr舭T^z9߼b+_y@UuRcFm򑘇vև< &Ћ8PmUZ?/7y>9+)Oh8@LXOJYN< BL.n?ل=R* l+ LsJc*яVk[wH] #Ď̯"8Ň]PR~(,X1w; X}zTVi@@فGm> Cp[NZ A'kKvj`b|bf MvfufU=*XEFQOK+eMx1ߛؘi%qt(?@O5ͩPsh{>et!QEon"mmOxoii"6 g9WSǯҹ $CDe~V%~w{3KT,̒ľWrZ>+=[V͊BсQFmX|6A%廞oOsЏt09dzӶBp[|$}Ф]ȎNC]uisG,m}3^Vsuky[8ph쯭Q~Q<ȃ_Pg8c PEEr!բCs2;(c m8?+øK^ 5(=$ZՀf>:bD9?)⑁la;?&gqܺudGl O>ecHąg)S349:c}rr^p3M=*C80mE؍^bH:}*ttYp"f y.tKtP 귻k90cVհ/ۏԍ;iL;3l5 ុ~Gw.+5cO$F`mGC T 6q&A5 FYc8WH}q-.=QOd3 gc#co|M)KevkP1>)Ɏi f~Wa 4kѽ;[_Ouip؁ƄH-D;ygL]z[<KLՋl34j1Xgl(M*ZXҋ=Vt,Mz2= nwoG+aaRL2ћ2$;)ob@O[ }FQ5')W.UXWZ5i1\vM ĥ'S(Z(MCͿ^HEQ拥bgǴ Hyt{pAfYsf̼.JA6 ^ݜ1UoSqQҸ9_[3@/AWڢn >ڭ^V59^HBm(-xIodV/ͷ ĩ h=.lNн+ԋS;޸5t]~.hNvbx]MHeu|ѶRCTIL({0nޤL̟DP_$XRAƠ-g}H|aOtSG>>~}wUגimfu 74 Ikli=yZ8Dū&]53<%|wJ J&pZT̒0w|y,! h+ Y&O(ZG ҺG&0j wBQ|*=<-1Ғs?Aw@my4fl]/vB!˙G۲?vcoKOYHeN3o8))) "6{K] ȚP_õ@wz8yB'F);5:3cO,^zs9 Ƶzsjɢ5Ϋm>P[6kyp W NY> (`T90@fV-Y}IQzӀd_LfOQPԵ-J6'cKhNrW;Q? pq1yAP똅v\ң.'fO: ߪ'M ︘g(ŧA=PŰll\ j#|UBKhbFtډC(Ր.cx˜̺ì7Kee6_O_gi`'y\5R9 -Ԭ$b#>`7Մ:qBYp7S %GZ~)_~*$vNmocFrW.d&{K[#|韚C 9dռE!-,D۔6X4B|l)]<%`ieV$l͘`~8(Dc@E:0Nz+ qCڞ >RcoTBhkuT,f8q(!M^ꮳDQYKDc3ɏH˦ZW,ͦ @<0^}r^jFpAzbLoH^.]f;EO2Q[9d#&w ~Zlg-J{,GR4T .h`P'- /Y$saA`V2iM'E{gA2m扦>3*r'WgL@a!M>i2LjZᴀ0dK/ny+rzF"DzK /"l=VKG(M[x7th1B8pEh 5Mvr^4}Lt/ Z!~ ʌKԀ8FJ"#Ģ}Ȃ8X%\%5})In׃.%񓵚biy."?''0|[#:QP԰9:P)~0 {9f6 :وx|.Nɉ 4ZiJ-,)0G6&ugz}4A79IǶXΫYol{G^#{``(uHK@c'e{;_*Gi'V1Gn7w62AI"ŕm04$3.LR] @A,@\%_@ajqn̜'l<vA#O^o1mX[~p(;CyFP3"zr R,sx@x9@k ֈ0k9$jߨ`<@)(IF͕rGg<|֎b2ZѠTo!Q=0lu] ^;yZ"?ඵ$(M0 {z')jjgRCżXx՝OO5dPb%zTvo |rbޓ pk"*޵y,6U.sC+޼x.+~흊͑;:Mx*~- xY-l퓹ݽL,>g =DZfK+̂Bpԫ Ax. /~_DYð,2 }߹b VV ,s;niGk\IvKm9V 1ڲ^6gu%LG-X߃ ,/7:+I Ld$;̌޶FS'+Z۲J_VэK0 WB̋8Eס8zMJT |s,ϭqybfk@1uCܿ8&saPM+W)gVkD?ÿd JlL;>tU+[+tRUxW4= 4yC7o@˟5HRwCr %.`-< ,P4׿, oI!%|b5m2}v6olG |;H7IvOT7k8DMfm!>b(LT!GE2p)(X 0FR0FOK64xh'\)?5 }[-$SdxHIydLaPv{F.-鯼9&*+ݑ1IVw2K;Htw07ַ>5?ѾFӇjn$uUfms7:ZQ*hW 54W z/Fǭ4JBmTA\+&%oG06Fkid,]ඍBѠ1Ja9Q~}0֕1yJbC>{1RvYxƒ8ů+]dMT?7Zj9gfW䳼$ N DɘT_Kì.̎zj2 uRt Ԫ;%1XU3JK^ef&Uh7Zs}0tU/fIy}0@&j]ۼ} 4D}m$⫹v}p++ޣ7H6dH^ )7<6J+kM>1M"Irc^UXUVN_ځD_tLлtѴ|*Xe4i4*ښ 7 X"RBĴO8F%Vp!C*7\kP]7rL؛8E2E-;VPhBY0fL/Ʉ1\kW::a:RryϞ]Kϗ>`V?kws.?')pn([RGfNb$}f>&6m}}E*O1SQ0nK}PM@ֲ?-Y*bضϪca$g0.וf3y=s^KyDşfS=i{qm9t g'"/RQTq$ypTSh3^nTkkF7k)ҕ~D#Q*r FEG*b!-CK\u*?0?Ytr sZFOR]J,}[puC_f򭹀=ZwZ2 toEukOƁ(O"(6_YS-o7wmGOQ.Kʹ_`iUI qL7Du Mi-yK(N>M#g^mlAvtG,H0rw_M Jk3r};칹z?  ꄁۣ<Ȧ'W?_ n17%,w1\$n{1Fiv^O pbqr$),orN_]W+fBO.g^Y\4(h/n4)HmV )~PrWNxmWAaohP k!c|: M;B`DE(A1T)u n*t#nV?gLRANZdNSk`U29[26| ]琺]E~skJnZLh#ȘeԄ/~Mxn6*"xfdBGiU={sV6Ph+i{a[nh[Oi WwaxkbƏY;b:.pIV>n/x*7J}-z(@KS唼 %McਠMOqdć=sR9JqWвNKqN5aP : R#ˆAI2t[,F]W.~;Po2!y+^OPa Nѩ6 ƍmC "U}nW%x:".0CR3wM#|W+^ G󣪶^ > ᖧ1ph]]x5Lջu-9Q,)熽~a8Z:ܑ*l\qÊ;ЫFnw܂{v:^(])l=G9Òx3m%nn 9”Y9K{uqZe4ceA$1nʕ)*uWSDi7$ա㟣_X-wj4ʹUZ 7[tF\0:#e LfJT/#bӟn-&m>?xK ?Iwp "BC,(%ձB(}h>YӜI~4naA|{bkGR)dIG@X}jLWlnZ=j O˜j /5;%L!u41[ji֍` 忍rxޕ-Jʟ]6wUf,tE!8]BXk87U0W8V[1a7ǎS(c =v #G"uGD kyjDZS#\n2Y!XӷO(ݹ+Ɠ-*pA{d4Rw 8T(OQQ.uz+tC A\U`ԓ,?cQLu"(6_ppmݤM,*sa-@lBS(bWI,:vA𺘗KsfD0#]y x.p3#ȑHHuvvd}zjVFbא>i pJeur/AI5"0r</"2g7Ӆ&fT6jafDu=*`t,>u W .?ǧJ;ރDtB)8a&@ α}Hf94u %-9E#|] 3ם]o > Fyzb! ւ^DS>Jpy!WQh:o^<(e6#%jsXCpga;G1؍ {ߖhPK&.ѻN$_K H ;xCOV7|S\(R WSAqba/ն!lM,EaWf 78}9#x.Bя+! GGqJR„|J]]5Y$U#F\ '!亄Z@\b'Wp'.? uVki5`^h03@ Px5209*$2:}сF)bƵwL jb7GuB #hTM53P}&Vf p99b_qKFj+;4UN Wl(&FdIw7o$E7}b8%"PlQM8z:ƔH-YW 9Hz0W. sKV_ ա}D!d(a`P*K,mA <6#l;fַ1/T֯-I#걌3Ap @6Q/:2OAkYTBG ^tYݦzO c{:%%1opz\;fn W5 W߾C#@]g埻H%:Ĝ[EvͿψ3Oҽ&2P%Su6{hozꂱ:)6ꋮcń|Lhޗy3 Ţ _fiڥ`㤁"j m}&t!Dz}Θy CFr OxDP/#@j㌱6$yBu9߰>@ѩ OܜHRHh]U1X 0=f`Ɍ>O iL|Z'E Dma&@%,6*gd9 699uZ|Ϊ*j1lYW~gpCoEh@,Gd_UlYH){ 2Dݏ%ͅs<eI y[,Gj<$1C([!o{b6<,a)V^3cD yDS.J5cy4wm3'ba/=m.w9SfR8J q^=w~du}x\a2oO,13-e{;J,vtjq3͌:eÝs},\Zlc.SFvF5=@-ͱH%:ə~-db FmFI /M!}ᾢ(3KqB$r33!:Y_j%O~&H@!ugEC.'x[׾i `_j1cHZw'pAi|"4ʰ@n.8'ǘ~&We籟3#{%^y/U_X1+xzZ{e\@7|sgɐ/ƔG26Go D8ՀOnAi8 fU?v.y Sߚ lRGDhF CR'!wG]$ٳl4r3$+.rcI(5tF2Ys{7sX-y=2ƠN˄B|q8Xvx1B~LIvPIn9' 5!Y/αMaP>|1H񠼠ߛR8p>E1pB>KIIgBs ϸrO(;PdK5)} 9%<&CTAGy ?)0)F~ym>fqK@P[ l`;ޢ]h p+ ;y`@ˈbj%zY(љA8( LrC/E6ɇBxI ?A ֊P9;xO+{Nd< #1|W ᨹdmF 6ʦ)X6Xyհuo+YRyzNUk &VSN{=3pPXB;VeM81SO#@?y+!Za%=x;@0[JiM9cO-'x^_*ºAACQ|7p9+>jB.[rra/E3G3E9ϫq?Q4\"BʱLgK.5>e;kQ[$χSb~K]' CV wod+wuvoח.otUmw)K.Har|LƪTR@[L7|{9G[% 0j\ /{Z {8n4m`0 *R D[|L*Qvfx1.6q6yF =-/|ܸ .6dPmۜ~x^ʼnO-dgk;! 6-!#j& }R$}!v_RYx. l`:SϮ#5)ݝs%N.K0$^Fg)|ç9p?GR4|ڊ{za(:, >⼉naL)B Vz_ jPKJkV -QrG9ϧ33fKpV_XzMu%jqBKhՕ&>v5!?~>QaIDLq﷨3+y#9sBr~YVeU: 摱XfEyK\s},][h:ݠ=9]f&[_o;UQPɿJUB!/8ZU5渧Vѓh}C YX݀MFVqbLs0ws(pޡdszT m [E12mE~!+; |/‘;ȒAհBZqep:6&p [/P|ɿIF^.ErC@Փc"P0'@L>JܭL;K+vٝ͏l,ePSxx8irA*\qn]:Fd` ee=d jFP K !SNdCGl5r?#.g_CokYqb W4AmH_[? ɪu<,~.>IyJ)I&~OwG Tr C w>cp)>}~,kus?!B>~SyX+ fCQ!3S)~%mO=se_ekLilc4X=7r l^^mJ y'+}f}Tr'6/U8>JǽFNP >Lo?+⛦D[ KIBgqG8V0뒌VLlS#OP3CO&œ?3 j\(6db~L'~Ǫb>ȷ(U})-h2nôhGfEBsBmZei"m oOԡ0Li0{\ ]zug< ;d5?=Eo%͚&F͡#OUj$c*NYDӵSI X( Mm0 {e%G۱/Ü~C5IWz9琓GAgv jRsnGJ ]Kʒ<|Va41Q)$^_}N17vV!*o\p|Ь?(b6"#YðZ(Moyg 7& }MymʻX>S(`۲Ynbcv Rd:}}VJ*$ L@ϒKuIs}gwrIBxtzwZ1dN~u1H^? 9ݮ ;[9H}5ڑRry|ǥ q8DؓV m+-=  uˤlva-gwfhʌ64O5І*;Ɋ" 5duK;.d5*QNr!oӹz4gvQdWsI5lDa#.[XM/fwSFhy[g:9Do _̒z45₢k<9V,)tP3tZaY3s8 mSӮy<6|meHG 3ƨ+rK?^Д=MBvU j72~.|jQƻJ#:$ވ M"Pac?PYۉ\Auvq,(tϫ SXRz] @g}*@բ^7>hJ$;RH"RSBhGt'H䫟ABȍʣоt(X QG :S#7v.3*/@x2_ ;\h /ZfO2lA>M6>7@z2eZ̝+.QLGSfA? >ap5m8}/Ijơ J6#o]\Z|냏p镢lICTЯ4{Zv*v Hr@̖hzA-zSK8B&5 HjA2 q2b-5L?mˊ.\]HX:a9˲/YG|7"O5]t㸡Wm5u+'g(j֬巣uE3`zgdv(Of #@ׅqe?F_γn38B(yfdE{#V=b&HC.& "R5_D9~;7(̢զ(Xkky9yi ֱ 7V> m  1M\NựʿE2[4T&̓6<` ?ɔ]DP-r"9xDdɯA H9M_ܠ/PVS/9?}#KM獰 lo5gH'>zx7G@8ZC.َ9W|cP*C8yEhb`cE,γՌ~B's;SQ%Ev`;a<>{{2[dK4Qd̳#+S^bԗV+"Sh:hҾ 1Y͟|qQ袮Lļ#@JG[G <#װk.5s_X>z%!Xx 9yps13$$H{bt^F]vLT~_^ (e@5ΏJɠm N<>LsR#x#h)ʸ2؇pI(z!qVo4zf+)m }:TgsOtgX{*v!q0-doL)@u:'2ΟESR8 SLbܤ{i!e8w;DL GN607eā)GHt٦#TvLdT֍(XqJ~DffzxK /A*F#!֦pmp|b5H2jS2 L`}tI7Q=YSxG_V=Gn( Itr#M7B+ݙ`DJ!1ES4mDм4*7A-,ٳqANnΛg7MȞo7~Rg3DJW87'wݣ;*lt]Z~ϑ3زxbHwx,KV {MTP˽[\ePMs2jM<@vS(;b471Nz^kjT `N%' e/\Ϝʇ/* tRɭU6g{o`<6we:ʞ;bz5!!o,g>$TX߱dAy?k4,c/7Ah1ϝլO :2\V|M uG&5}!}aB? Ί'^jo5p2JRyf:(7ޕ9 3+@8r(H][8;2o ,R:SAmQ$쾣Tj"+0S>S]bl+[2f#5Lx"HVw#خ,MWkK8 ѵn5B&1í(-k)= )跀y6e;0;Wt$v2> 5́ ȹ8OP޹ ,+xү n*gIסjل_ƚڟg+wbC4AT+BGߋ.Yw^`[pqGs'`/OZ},(w8aNƿV,(0R7d(*pqΈ$dy ׈yU4Y%7 9M#rf75u`gfIo{uXi'9 םվO~\sS`H џ3C> wYR:R3*,`۾B}cnOG7wsOnG^s%*.-F\>p5:v)<"qWv />/1e IdY%sPq" ?XZ3K0yfSs9{ՆoXg6ʩL<'h`E-|;Y a\kUi2-kدj pu5B)dj(*iȣי@X&~c z9ԝRT4DVI)XpєyM' W U쥊GO8gT`)eyIF_"!|̽Z;5~=HGU!0CD ,GR .;ɈոA>$N^o *鬆PNL Vt|6r'w>MR0ѷΣ~p_irN*&D5->l =%d]^:M XEqs; |u֏ݨѮxyˁM3 6幛'Tb8$pgshޠɖ:@b>F5bjaۀ hye)R r]he}\d `'$%J߿Ŏ^Em`s8{WJ@2f5ы*\7߾3{lskgUէ^P60uTcV6b:!: b^t`t2腂m6l.U?w2#zjye"OadV N[S}1 udft eCUmx|}gŎUJ%/N!v #r߻HUnMjX(`N m_R,+?5 (davonWf oԵ- ׌G/IElg*tqSJy2}`?Hjz,q:֠d"eu4~,%& \qTkG}}<]G:ۻ^r[~֥xk#1(Vs{|ߎ)or`N'x1+!IʸmPamXR7Ts.dF83̆z`6!e&*5,}i\BIBۇ:GwsLbFf:[q b"g"d0಑@iJI[N7`l>Lf2KNC&װ3,KJ2dPOiAٛt ȏ5]P) f *qх8;@x]o:AǡBhaKxԷ6ڍ8R\yaD|2<~t}nCiI%{^\x%*8ʀ*b|Kzuqiǣ /f*H&]sYCclAĤ.L CurV_d8WbZme"݃8 eGertG-YP7u *&`ȫ ߓ24X ZG3[f,I#Ͼn@[ 7xVBӄ9(.ۡzG `&?pw+^7j+t=wLhz=W&` SUl\`sP*׋;$RJ/ny\>avP,)I 4$tUa l&O鞯L1}dW-|ŲSt /iL-90K+kE7ފ33q6]¾|[6ckA)v(`qkX^^HSb)?n~K+޶Þ9L|W]_C< >4fAg.eLd(BfW*F,y6Wlrhωrq#?V俈/+nOޑhS! [ۺ"9/hP$Tv`bU0,H_ԈtӱR@F*Gױ=-:$c6fJ]YrEBW&p3<Ķ-k^! 8*ZVU 81}lm@;&љ;p@ڒA/HT"SmNe>ծn1~Z&CK[om>*!>ҍx ?ѓv-BF6 ~xt %E:Q4_yXjbq)g[%Կ">OPM8}`d$ ')v.?'N1' 4yz27l%LҔu2`J/G=޾[BĄ80oLBfб|6QCЗڲFiXg=3AB/ډL4ݖD$}o{~ yf+I".{A~E9EvwE?/l31|'w1Ib7[t9H5SYO~y8xã8nHc b^]Àmqv*4w-ӠS]+6,kT_}9@ #k$p4cF⭵zt.ΆƦU* ЪEb$4hjDZi˥B~0[Bpa%@1PṾ=$1fyI@n'eq}&`兀FZUG5(!2!r/fNp m'(~0͈ 9jCШ唋Y>Oi+}Ωdbm!L␴ҥ`\s:TOvf!:9] kRځZ|0D0ߘB6~GxE׷`O9w:oZ)*#ygxHU岘qYቦ%w3 NS e ieb47x. cF`L6dN+4M!J4o*HssxZ=^W?{cșagఓb@R(~NϚ;hw2"=!+]6vEw]QңӃ _넗'{`˺U)ɐ9zfXށUH5hM ծEfMzc_ňНŒo%a>?k=J5bb00ߋgV]1!Qzϡh:Qޫ :-/{Ml݇] J_FplvTUǽ/.!0aν߶e!m HMщe)ʛ.ڬgFr3ʏL_urK3BJ<јr!z6slÛ2^X" 9&cQ>Lu71Dfn߰). 1 y7˩h2+kX'(Ў]"Zv^9Pgیkhvmvz23,LH_aCB5ftH{}tE &Ii /I 'Jy 1Si.fk|]V޶PA:ۿ'vhy,/T_r|/k!PqB3uJ3|U}R\ئtd(6"FiQѺ6,Coe>e,&O1w"G/MI=Q0~T~fXl p^+Emt;s]ta{Mp F@F^LKA@ޣPB `ӫG!\] TLJ~+Q^4W=2[˒53vV#~]w2K.mtG[Gi!r ,ĹҌi#N9y3A[6vj=@!uvR\%GډZc|bB*&FПcl? VB b6_wolY<#POɪ¸d>azc>*eX >@Z2h.McD@.2}fV6QUkb4H6d sv{oc]g4:=! 28tBX.Tivj@HJT' JuiPFD\d34Qh |.W(h% `&1 kf"V7-ó渙Ԗ^#mJ5bghe=XՋB5#̔2!U2Xz}}fM2W=Xyxkr}veۧ%EY#Ǽ^r219h,5'|K eBt~PCz3*`d!h|}Aj#tS7V^J][躲D&X"ooIԯ7`;6y \MZӤ8rw'J9[dioj_EGRө ꀼQ$nxMjȑ% q]hUiUhUQvI5A1;]f2Ɉ:ē>٤3F; SJZx87u/֜L=B_0by nS'_AK?֌SPw9_Rɡs0jJwWK*rz*!_W,'};J!\K  m61攏% &e:mHxuj/ۊC/zƺ;ly ![FBrVS@.DaA`~UN -Nrh?5GTsx7IAq?ZXEm7aRŇOC:b\N=1]1fՂPlX͎鄁IE%HwzPp(Jav3FC@"FmMܹw6}ojk{]0Kjک2^a?s. 5Ԭ<&] /`Q-2eԠ6_1w 6 Qhӎ zڈ^nX(MSN(Rߙбj0(lW^{HID_"^PsF㉨$܅R!-vaف%>Y^6LC {4ޤ"^qS!z4AĊpUU[=]S+d[ltZwLacvFi;\Yɼ}").GOh4CYwߪǭ*/!ޕiXx|7($u}='aȹ8vz0=V r2_;a 9m;(j@U~ v:C6`1i~''EbqAqԺʮ[.Q@Iq7n)a7цzB㗨M nM7wHmlxx(/)$UsFt1!|*![&3ګI62?q*0RׯL:$xv\e믲Rm(NPl(zlHA)/i3]kKn#DS(mQtjzll'>DT_^W`oߛ!e_+XTƩi~#7`RqT+tq=^X_=7th)FuR}XhGQ6LԙO,Vc,F)3zh oW? ,G'”z .Vxk!Sbm^ q!jP1Ά)5Ss Ťdׁh-mZqpseʙ'?::n/}]lzb5!>DUΏXSIFL?&r8NMOz9`y1],-[/~2܎ ԯ˔yςwO-ys>s.6Nk |& m8/Ch:鷖NrA_!ci]EeP"8~7A{m6WU8z$::/l' ɂ}^ ]C{Mj%ARlb}H~Uy^|$9H^F6~;yf te>ŮX0LKB#\i.A0M^XPBG,II:=kʝWHXӈS]FP,X|}dazo:ϙB'/Cۃ j,f(i2J {+&Q!a"c?\BF@)v9__o, fy䂎]Y Q:3в0 +p*,\xx8aǗx!DChGL;LQ$Im7"v/H-dml_NK*`n<3 IW's!qDHAx(2EWPjR/}svH᚝^+ :)-W̊kx4->Š+5(7L_ Pq.uEea cդ*p5}(*S(fŵ$$M(ǰ^5 k˥L;AR;@'P<dـ{# n,x +ePd) "G)m+n ;p./^LĂ@&Ízcmŋ5)`te ýk5B .>GljC?~ W;C/}42ͻ1d?„'X$ځڂ\Ub vLFX}aώ4Y!ӈkI;dkEj2R̮煼 r'=xsD!wT(ǂSѤp}9˜<6ʈc[DC%d\5-F1)3)k{w^˱U)+5ftc"2 LfI;mJywdi TI!7CS+bS#nQ3]$1WEhK>9U-yHrۣ<I߮{ׯ 8f45Rl&:y'PFS(z}3(QXLzS>%_'a+ۨ[V]-+1S9`y}!s=G:b4#=Ch[KA3KӼrY3H*WdG(W[6y pyra- R^Z۝\F T,}3”,SZl3l4ZC߁Yz }GES8mGXbr9ZsJ|p*nǡHp{Ww)Z$Y4R+~M8wg%z?V+:%~:S*1B+-#,(ݡy{S;[p-O@ݜufk\xI4DEosN*/ΠDHOJ$R 9;W=7Pb4ʔ6|V2Ƅ֘Y#(i;PU䍏״Yזp\/hi /3Z{yjjrjBڃ[M&7o{b2$uL y4IO% W\r7mb%óaPf3,(*lM;v2")pBW޴Xقu+>~7.un'=G3/ώΫ|{*'gŖ% 7y@:p^zFs6qS:ɄaNi@6bZ'E,8#q$jnqo<zOT 2d_|Kj+} ˷Rڜ!tC?8K2a w*lݖCX% |0t 4 u'1$>Sô*ryO{cHZ/ӛcig0v6#ֺ@e\s: >(/0A4>6}Gw҂H IYvW鱭U碔B?9=3wV HGg@Kq1x≿EQn*[HvhZ=z?#>wgwHLQ A/[^x; ZΎK ,ZlSH$H H&КAL`3[n'H'<)KaD T{ xm؄ζ"϶m^qЃrVOmֵ *GQpˇ'ۡ+ڢVP 6QMps (83mݴ35`J>h6!J02wV'_5Z]+(܄PP@r5` 64f: ๗Po>s uH藰\ΖٗЍ0.C'V5잨#Kr|^<}WT׷Xkn+}R SvS*c텘_xYuFYx72{;LbBΠl=od6ڦ}TcD8A~D&NLP:);[PBLPpK[򥶛TB~ ujwN0N51Tt% Cb:ɸ]Xƿ %n9FϴK'yӥQGR\.tgJgwA$A۔7}[!3/2dݓ[|+?;ChW>|wXN=2./3zZ;%S)Qŋ+tI*VpZ*daEJn Brh[Xf{~ZJ8$&Jx_µL.g[y+t\sb,WMWU8r1[f "0}o9q^ho&HBRv=L`嗖Q,·DE$yeo4&P_wf hz!֞r1ˉRO]IYn)!vbU.N0"TU(:{Fv.W;wRw.UBms"LX4 ]ͭlI^]4 ă ;[\o f~͜d Z$ˀ+[9 I8v^RbHKCٝ'h^X _,($5E<5D&SeS#s-Zx=〺# ?}w!nz=Be׹*r­V[nU(R)ɥ4_=PSmZ}G.1@6A™YX,dEb"xh!T?*s(ͻ-&3H+Bp+tCRxPVҫT)M:r ϔ}~wH$5}PnpZc sIy(arhRi "%Y+Z['͉rgTS6~yi!|e+*/=qҿ:pp^\vn}fRKGn?#p"6 cP;1B@էDHa/A~mYwn1 $$LCbUZge\i r-pL=R'Cf>X]Aơ?i'> ˶Wڇsn-:ҐYXUH.{Iך-淸J Ǜ$0ǧm wNXp͝ډ 8**DkArYqBA% wTOz|(LCL3V2_1R2 Lc6.h"Ib^|\)>Wy< S4YIreQUT9#\gۚ>B-kf_&֟Y*+7&탷nK3z-K,A}N>6rkT>e4]i-O22&ȣ p-!I(R5[J7LjfzlVW27I\1ϕ7A<̀$Hf:j{-AP=M 6雾gT<%F!U%Ni:Q8I/}s 5wՈb/Ө'>FiksF쏰 JWB!HQс;K*@ |7'$ۢX0rTsb~r޷ZT9fSSkׂ7g"b7gYcz1`MUnT;ǽz$H*5@ns9FD:{$S3=%ݗY.0M^"?drZZdh$LDŇR=jr"U,Lsm b'ʑ 7NНpc(YYc&LuxH\YnUʹNҥWCeB fԑ_5O2CUE^?ucTūvܣYg!r0;5)AH pm>$|CZOE9VY-<r"@ ":@6<;yJ!wN'<М'˵,mfϨ)0rήbd#,/YOy wR{ )2,s=Q@Fo˖4 )pDr,4Y#\,Ucf0Z?F+VK<+'@uiD {bk}ϑX78c0,kHGf-|'f(xy: <%BҦTϸE:Rr ±?4+0S^1p{ ݦ5Laˏ)"& .|CQ݌0Z܍~D.pM34HZ_{Mwgz+#Lk1+袐S6_*šfqW m\w(t#5k@;JDX!{Odf)f'pp ']Lu3*޾,._zy6osCIFO 蓘l1p1bvJ) ʛگݲp=l ź6?V`6%E' ) [uژw%ܚ5ث4QRjM?7AKD,%~ Ső7e+)Ԓ`j$FHu L$bR !ݝj35}4;A^/4M %5l6 .}nefcV颎 l4"\0߇$#IWc4˳W{ٮnO'׳ae! DBNlgbްea+jmW5 C D:gFa>#"-?…Y6D Gko,Wly/RpF06`CL&]e\kUy$ӡf >k*8MbہhĎs;kÕr[^/\:5M M-pyawՌ9[־>T lkL"ioJy3z;E Db s$wvta| 5s=Ycd(dil˰c;n 7V[R7EjwԢZ(`ZWqS O5_h\[b){U^eK{QzDXU a nqS <^ R&=^Eg1grR៦s;/rՈ'g*a KGA,lKSȃeJ"mC (߶ 7cIN/x&𾼒ulx!>$S&UCuti>8i&Th'-jՃA!%,[OA<"1D$+N-q|[T_ 6 _\RϨʦҫrvò:q&\EhhJư]5Z`dmƨ(sdfqN[{eRRYD(/  ܦ_nofB:bnTڝ8j^->)a7nûME*8zJśw3G9w59d59:Gzjxͣ^5ZC7&VO]<*<|2ċE[N..(oKD!07 EƀgP[i:C%>ktK[{>Vj:[֫SA2D5GFL(- &Z Uz,y8(pTgl(ϹPڷǀ|0l%ݞr`FxEV|ȢnZ2XNLԺ@A"͸WWE}dDZ]11*_8NZv*bYxF7[] vkg}3v}2jE fz7ǸI+9^ENDuٝW'MfmPDAſby~ۼ(w3$) rq7]q8D;?IVkM6K^,'Ֆ{8ydlo'1L%}"'}Ν?bF u 嘜Owo ]viW?`(0l&̬cGRxPy,bRtյaB] ?/`vѿcn8!"`v?{ڤ(:m$7?Iz`wNlRcJ>3?`dzuh c?Y}/`^8%; `a)UIH~<5#U 'H}զA I>4:^>Anf4ПRgԨufKT-[;i Ap0>l `z)l,co!o.*$ $t'e#a%MUCI`+'$EҩϞxv@68OrT .0Eؓ c />D8T{:Dn@[!U=ͫo£HǏHh wܨ@Wb]eJe?yy2-?O=߽FCS c}l3ݢWϹA@FYh&T@Ъ˂]Smlnx?~ҔUXme6`f5hcQ)IP4Yq"g*# DWOOKGm2pUܡeApbڋxe^{1;mQrp9y볽(FX.ǢߺN龮SrAVVV{,֌UA<r]9a |qSIwfag{3ƃڨp/->J1ڒZ4E[ %_{)F.@hIK偱ҍ?dD'DNv\-q[޽*K翕gi9C#mFbl0<]jAHD9 #AieF`#uʢ~19,L%W(av4_ĕ%2ܙ֌P{r~!NiTJe-*;~z.Zh|SV$8E2XWj!H;@7p{ K_IceKp/\V! =A(N_r(DĞD?~O.l>O_跢 O(OF ecw4-F^u>2촤;`잊ԡ +Hv*pBR(+,x}`?)|>gi1|{Bv2(v1;OSXrAembœ ^QG`r;ٰ!uNXmbhrEaRt2'ɜ#zKU2}gi6~4 e梧C2ZdRF ~CXPЌF]|YF& f>B!F %Yc;e_MĴ||:_Tef qDq.߫syߤ BJ#x  \f2-(> oTK͂JM>j=<^*N9, [gZkx0G9N?'8va =y;B}BeN ÂC(q?Q,X5%'AkqlPp1]7lIC0SM}5rҭ]$@/4;J#R,YL<H]/rd1.´ xTdv=aqOL+j*NoֳY'^Ht4-/{B #zx};et&:bĈׯ1֠T#.Rq5ɕk̕Vm5rG>w}ׄ{E[v:=A+m\B:~USXpZ5cQ=(FY[C;Kvʂ;6E+j5j[.;ɫ_pB-R|j0oEa)>`2F_D"[ rb!Xڲ;]Z*s#q&r%7α{Y=@Sb q1.n *Lރ ɹJ1,Yzj{q.1r$\j^IeCdT.Mvľ(0R χ_rJ[fTi e{i M\RHs&}I}bZnazêQX96P<_ qW6搂HLxxntfB#:/u|L82UŶW=9*>Uj{fZoWOXk~&; `Nj?0G=ӊ M6<@ Nj-(X ]ʺTTϬf,pPRn3͠?i4"v\`K K>?"#ޝSa5TTv߶  L|Æ);Udv|C[CV9ΞF=X*XMY~'L¯4K^>H& 6tIgO ~<.w My/i;!6Ot;ja.kX#>to4TOFek6$ "Qqc(̞hB0;ɔVŲq +;ŭP\4obm{zKQ 0A񗈆zftZ<~TTBopF1o w&b){Wg(֙x4r!\2oniZ\vZ 7(u Q 5D ~NPFXS$<}l)ՠN9H:WHAkʂ䚭_m$7daq k΢OWT[]?6oQ|e2MuR[Oo@WuҐHW =qbk+IU2^uS'. k:B!mCg(|ONt+!i"Mt5>k/ʂzx 9WZ\,^ׅH567nu}0d!#1{uon9/Q$z0ʻ}=yq:44n>VgcPg_o|"1 8)0?YX6}o)0Fذ/]M>:;ḿxi?}̖v!rf&#SŹGA0ތC/H6בtEV Al (cƥ8Uѷ|I2>"YoŪM+X[Z-e=Pғ B\{fEQWc0zݭ7X[Η{@zh]"(8pa$^)hSݿphCWEo%Gc@/% gSQ~R)"Ǎ 설; z})CC?.8֪сYL?ݝ(SI{ ifWnz -R$u)5Ll63AEдЩ-Pc^)8'@#`Tm*I,4!)Yԥ[a>c,ύ}W/l&J}--=w :5gq݊<6y-oKyU@wBQdW,d4bқcfG0n5 %3h7?D_ vCǖ;6^fQVbAP5N 7Ewg*o9υBnؙ3 bsW vq$ @N[g LK&\Ojt1+z;\ ֣R?vkdzouE :;ˈҭ@8= H(?e;>=^rD.<c&YA(8IcзZHV-{yS1) I!440~ɖV9FGEr4q|7nlҒx]g/}qZrז2ٶƷmCqQ}dG[,N%uas{O{dq}r$ cz_m2Ky:Kҍ55Y $ ctk.k;)Ǚ6C8^Xt#+WG@?{ؙpF+pqdxH%>6׃cUۿ!~%%){;W"D[A;|E4I;j-H[|Us+j0g,ȇPT=_I-9v':^t{"Dģsj߳tINQX .8hmM%ad<#HqK5h[2"\ n %Ư'1ca>;^K( Vr`/119|q.L>WU}5ƾza"52RE|rt.Uq@NcxG`zW,|H%`BbSu0%"{ĆK^FfIX& r|6ܗ{0 uۆIA<5Q, ҤF˨)B 0-r)7kttGw*u2#s $מ!|% (x[;;ҫz(_-)~ Ϯq< eL}]'D! 9l=?9礚v-79aîC#<`OǃK}%W .|?H|Qmh(pn+#EktzĜ8/|9ו(=Lƛ4GBxQ:Ldy's@1nVR5wS:t> Ev:S|qVzٿ%h Azii-jg{4*I">u*D%tAV IT{#Soòt*cCj8oV bkJ$_]44XZ.'{L8"ޕC/nUw{%~{vT:@r\y'N}nʗސayYWQR}n5P<^,% G])h埛TLVeҏ;A+9U4ʒ*Ǚj\ʜCb4,أ` ɾpRA?dq+y~$5+ iG:` kYZ*#;nN~dL`&Vd> Ʊki_5@p1*{ZEO/ϴS\#lBk4C^(tu5(CW`VZ Hni ފV~OSϞ dWms=jg eЃexC)36'(hUx;;%ɾϣyCM k)e'E/mn)>D_#v43GtzXXfvirpT."d̆@N>t|#QNqnfў0bʧͪ,S2|J܎WHUKx3Ⱥq-40E2^W4II0C~`(*.R KCGP+`j76T<9G M89Znrn$0xId?Z}g҃鞌\͌6RVJ!%0a5lY[{0IU)TsMuF(zbedăaF(3=4vNF"f'XZu*~Xɾ!ʱВIjZ9+0~H WX(:n9RbK1H: z7ᐆsߚmZ;>ɕz/ $OlE-t&I9rt~9n~"0E2_sr`u 2L1 a ]$`b]0}+;. άtV녅Fqg쒆G2A ol6ʼnYoNd6 A'"܈q[PT!hg-IC[pbfqh@,Kq1^d/OeO=p?Ue܈ iD&wlzN}:%U֤ y;:CB SHC>2=ra(,ZY:P_>:5,4aGM9vx/O&p0XRn lU'+wAT~Ӝ"*otp[.㣨nzZhpDM웕zĖ GS|9{(j6pݎf`P\A#.3jLj>Pᓈ|4šM1IB {`!k1|eC$-~9MZy vl36cXvw @VIBoubݎ  ss?4er"äօͬE[AR.}67r5X}Spu4e+\{ܕ6u\,(rLֿ87X \"_ ˌP@A(f񐳸aUex]k`1ǐDǰ_Ӧˠ2Khss26.lH:ag#Š,.u sMD"Jn"x"Ѳu Or_M2aչhuJK5\+'.gv oR,۳IxtM`,ykm BkGl1VՀ-My. G"slut-*Co |+inkW!'qC% œF7 ; OJз-xE9ime_ bNikaY(csWdJNߤ3Kq|U1"`Gc/1Of?$4N}osݒ5pXxV@SjQݐ5Q\D_k:6S&ᰯݜG"\h'UZ;2ʹc2#ee-?Pa vho;dז0vx, PNpA^#m`.QoUJ5/cXtW>021nζe.p{N %lQ  { Xv}1KA\ ʼ$ \ߔqdw`îS` Eb Ey 'wQ-@ΖM RRrJE'!UKju -DS9x-bl2js-wpAG>z,cS<.z/"^@? Fm&a!W;LrYOt e&~\_˸|PQPU Tb"S$a:φΐ.ڰO=LN{77WnO E3ʦ: >mbdjo*P΍=3F͝yl秨YS OH6*wT, RvҬX ŃKR:,ul35tX{h'X(]JY q>[ #wsnIKwj\Qx9?  )3?M%K"7#+C-"c( DCyWwl^ ZDH&Lw8+x*f >Ӎ\lm@]%#b\2TH &7389%@i:CO8t@Ԝ,|z8?.Gus"iVSyfNg]d?%I5NM %=+w;{ϋAT  ԥНSbPʰ)~? |C+k7*Q?( 8l=$8"A,$: M!Uު|Y 3%x4D~ġ|G=n:βpm[]"-<xYpBt_&,c/YiP__;ACDoz\7YpQLddUk}M}+Ro'dM!u>z=8)(n`(]E.u[%c tL>4Q#8W#ہ\}0|ܘܧB @r 0k0z }!D U^9[67i_3;(%Q2[D"ϙFiJŻC&o막&^i* CA %`P эGA3\'|T> `޹u a9I#ǎ^_>d8ठm̊L]KtƳB#;'y|6)ٌg@U )&U(28E"Qw39sݾrF!mVmJzZ\;.fxn0war8 TŁ/|}繞Y(>!8mԡpq (]A<wC-r(fiiR cm<7g414ܼI|%nKZ/?_KR#eWl\w|CPݼ1qJyu!>CgRzh]πԸ1ʃ~FUfw=Hi'fGd`'k * MXXgVtp3l ('6_vPhB-oYY4IY_7 E#}B6$tۂ ;Pԍ>sV^Ve  QϠB3{S} |/"Km)T}㣠hƹֵv V@' kvUoOy3[74ߵ 3G Rivtf}MUfR`s!6†PuQOWJ5^c]D &w?)ݽ\|i 25"  4_3/C3My-[SY BxLWL |_2h1^ܒ'Y==M.[6ǘeqI5 dw$4z&ϑX-QEi PRys2?q*!0h9%l2'{Od>Xh걔 [`&XySa zZ7?i㾩Մ[+++4hཊL&RZ$FB| =ī`!>giZ^p%4iQ'bW(jo3L&YN6owg?u+aȰ.{A)a8`n-3 ۙ(.S->Hk,* „jIJ(Tm@rz\峨[wyR`Ul|&zoGEہ F2r.Rɒ &o&M#G5NʾIb)WڊMWB!97(xS(M!R +"d&j ph5K2vd -$i hdhG^,"|ݠuC.{!z@9OƷB' ޏ۹E=~0+i3$D72n|YB.B\Ě `?(4dkY'.&z\ȟxn9|of75ِ$9ۢ* 3IJtz'OxR p1_*1ƲO$ B7fx6̿Vp+qc$s_R̗&sͩ) N;o/4ɒpLX%]Ĩ\=fMv˭ݞ& Đ1:b\E/tn9 0aes;ҩWs*/3 ?Lobv\MjgE 9lEL$!hP (d:[czf?[u%giFP#%#Ux}F)!ԛlpZ.pO^)շ; "zv[SWCNZ9dC3HӮ174}JrAQK)'wHTďvbXIRG uzm181s:BpaO,M{}R;Yn7ccerH ]n(zu< trf{_Ls=bB H 8&ZA˶ +Ug~a!/'( n*0q?=VVMS* :u6j浗AJ6-3m%هWQ) H3vJ pZn,lb+#i4BM6[^n dAQ|KXˠKe[P~{!W4 LC7VtYgŮr-!-Hz&D.\gk{9VZMt|uLi b%9}ܯd$,TKƔbk"u0+GE"5p2ocsLZEr3]д1K#T43)g *o#L+"2hnM" y(EAF}K%<~4v{cNB% 9a|zLo`.6<DŽy_ J;On-қeKW8 dqY|ϖfϔJ9o/uW<%µ0):G'THqBw/K`jX{^BVnoFį5U'{%y$#YU"P\6q:۔9.`R;J1-Zci!a D0K'L#jpp&`TO3yiIљuLdy؉ hEl˃yʪNmvC0~̎M:z|}ieiR}.:ݰي⛦>^ryej&ݱX+C4lBk~@ri*Gv)fA;du5 )ظ2+}B9scŹ!g= ں eg3`ˠ)|.NxUrEÈo,)^E ]RH5!v u!v;v/vH/:#=wC6'6Tܕ `Ihz1`~7inqT(a wc[m?"=K`Y6r*m\R U:$3RG=x$ym0 g(]m~_SrkN)aEcvkj벍z^1.(Vl! }OR8sn hs+Od+hH["9ԗQ["ˋ +,F;y*ѕȥS| UՃ=Aa  Q$\aWi늃'?8Yk)WT>}CrKs /B&Or;i.xog&D7.Q!\-Aɘ~M3YGEtj]S9Óou 3ȄՍPMR(;x 9NFhB,*;M9^J7VܚlL\߮ؼHXgkifU*foE#}4 <}10ٞwL4ՙ!W7&ʇ,jVɷH씷6aFӀ 5zzy~f{R݃I Oש2<xEûNwx)?Ѿ.#|;mc48/-eK@,)睆B㗑.7lcH3 OM䐃,{ z|%#QTo;J&1y>˃4j]'i~] 4S]ը)0ٍ!@_n y˓%ЇRLx1#j=691G- Ajhm7E9v݇Hm[gh4wƕ,,EL]K |,$ {4VpyVmD;1>^Ƈ!c*I삪c8%qc/ۅǨH[6 ? 0Ѱ(zo j!mWf4gre%L:PP|g*Y<3 <_}J>-65fڒ_i+3_y _g Vp3&,o'ISeؖG`/wfr&eQ -*[!1iL4 ~7`]6U=\AeW!!(3.l7|ə{4Q/IUҌG gEx"+L|츚OH4; |/!~o5T?mʋx NL\Te {pT2gQ,z+?1}bjҎd/M$%?@"b6+<3xjԏ'7CGn dV%QT.8FVnF '&A L\|2'qQvEGyX&. .6JІu@͙d钱V$ M>* KU*%$&E7UK@t-D@B(V!B-% T>:;ZJ2tLU[`)x۰eCVhhvM [ڇ>"FHmEwhYxTU(/j!Fډ8 GUQ(\kg:CQs=+q=b(QF@갈T"56'ƒߎ ,8t9"[n6Sm d!LvAAuQ0!Dkۃ9 |:@c6nx &VH:2J8l\=;ajԢ ٟQuBSe0]lim~5Ĺ沽`>WX)B'v7fyͦnu-]np2&)xqږ7ԡ4GA<~G"g?3a "(8/c6| %G'ٙ O\MȂ\@2if0Xn2AAx6vMmU\m'iqQ-1nִz*±DӺg;.BK.vAFܗ*ȼhl;<:D9D]+݈M}{=u.AfP;%f&SnxYa _p;-qR6?^w)sBTx ABe(R%}nୀmt <͝J+Y,:%l쪉ϒr/"}g)䩦[xٕ۔5>(zzb}kT*~:߷Ցп C}M-T0ɕ}BB}iP_YR:S Di)Wq6ˁ۫#gyV EI*$8t < J9cHv_<s-r4"QObe)H8s$vp'02Im^aJ&fDԪ?NBAD۬ʣ ÇϮ :0GLA?ƶnW49K)l)I*jk%;aEr}!ý.:Aӣ,GelQJϦX'q"QALK8{W5WryH{"oPLl04nsνuvxg"]'bаD|2:ׅ4eSEq0#/WedJb~܈_MLЄ[ L:i᷸l_cm~hm?/{OAs:Ty#WTea5UbZ gjOZ8x˙+}+`N֫e;wNI3Xv$IAlQuKXiJ }yCM$2 yLfnܛ0m"\J\b)Kx"ItK)>>I7~{e/)H)Z`39%zfbtF&bкpv:w %-WGj1D{/O\%Bp [Oe#<40*ym2 Xdα{MeW~hJoیf ŷ.Yl25K_9m G .$1$OHD' ›m:4ls^!}jFv97rĸDP?>puF,/&=1O#W=Y0ǎ[ W7j,"ɺbh|Hj0*;28<G1o3.풻YL Ҽ8q ?p(ћQ&[7)eBrT5%C8Գݰ6u܆[@5 VDX(ouRL~WF,QƉ'Mz4w `5>7Dgg-l0FΧJLah:`BkHh4t(}@IUK( ӌR׎ÃĜ$mr7 B<tFKũt M  Hq. fI&xZ `l3}}) qȐrAPKx5{z Rm$TFi)0s7_ 0o#%|hKV EOן nv/偲ȃEP%8b`RعLBqtOffxG9ӎySEw!](,L/_n^7kZU#1\tZ=\yck(wZc^dM%[X,qS79dm'܆:HT]o1 ĠCTi0"ٷcCe f3ML)E6ZM IOl0d,숮'_7fl,Zwƣ@[#d ^Jמ [VhXHB*ɍaC /ߑ|w-ds`ݖ@1 _z~«t~~n*1edc|O+Z+p^SftS5m-lW&`SZ$j!WnpH,_ë|Vwvos§z|vjhH3 T%؋Uɇ> Z^?qWNu@hexߪMNdXtw L_yl: ]ZSjmfy̯/sb9o `,z&{Wg<8ņdA J~E}KGo:[yz=>En:[׃./^QIh9=fo o jfh\^'}U.값uh&0E@p}騪O!%_k .-N??悅^1M'=y};&z(ha=~WҷMNeҾ0MFjİςdj)0s 9 98 @H6o@Fg7T,w}B!pqTGe_p$3olÁ  1,Yd)ZVqQI~ |ˈjqS_Pt=`9oO#'||2qjm Gm7 ou5Dv=Dk( 3N"`H{mSkQS_$+*DcW[ȏH˜1H]CSe0Ş83s$NmFwԢ f^߲[vP"oؒF%8/-I{1tF#1hv-9G$ 3zv.7$yk<8@YxjYC{ojM˛D:z6 @:~R&AAu*2ƈ[@ aYⓇ[  3$Dm²m&<: и*qʄ@'}[C9W,SQa/wHw]Wqy oOWˀtl9A]'9|6Ez Xihײ2#T@UmmbDX)ZJ/DaF/䲗QMv'?˒,FQH;7r=8y?ۉSbYߊփ i%?jz>t)J٭͊kBٝ4Uf ۸aIKKmcdNAY<ӳw^sҢP"[ Lwfnl? " f뺢4ׄ/X!=Ց)my% z}MF9&Q$_Jtr!d`sGJG`Hpt{W"h1d[3JPNlSo7H L`zkE{;glڎtXTsי*n5!Xu¼Cm6C_rFKQ}_` h0\,m` V @_ |휲ɳZRVEq|[: Eqek;=uˬLsrlll1h{>;ut)˛Pz{a/l6" Pxi:q*<%.wQ%P:%jdkqX)}al}W|}>J\♴ P6S2ȿvgחG„K?ePz&%8>bS@q°h m.Uܴ x3Buv*:"(,gw PO~>ۚ>YȏԤAYNϸp&94Jn@rPfoE*~)+xvH)9u&6ejw@WPnRs,R3cfo8~P0e u)] XHcS3àU 20L76콻eb4lKgŽڏlrj~篰%'\86xRMhS kօ+zf=E;K4 N(7zٗ08TaD;СLʴz}B(8qB@m-\({kc5g:0md؂*+ggV+ŔS"}'ifA-Ek:#ƣ]\lCO5nv;9WfntF)aῗi^sRM@Q̟Z1?LHMdΦ%#ަ̶ǚڶTZhwykfܒ,aLvp,:ȘedA  H~ag$& j.+.p,e=0yF ^9סK kPxu;̤V嶨k!MnHWOcnNUZK'1-xt ^pJ N]N\5,$7A%4Cox#UnR8>ME?zu_?ը8r\<&nMh6T:=o{yGP0タ|5M(vwlխ<ʲt[;WӸCXU IV4S̲D[aع΂FS( 1n@b]?I@ZjopF@ϛD*H҄PΞT+.c$>83HY,灕g)FGooqC'"Wq)dMrڍ0ϒ g;dRTYr)R,)eiTnA?*䨖Zg΄-tj5k+ة__t^A[XqaH5 ҈vZgXsH2u> +VYBYQhmoՠGx~`e S)]AG6=OC~&'V%NP' 3733'ӄ He|Ŝ#CN+ZOeKcf{V*n~0jsӉ!f=W-p%zЩ]l dHMĴ5*J>KFCGtA -qѝS53Y8XG}yiM[ٌbBؘv 0Ge?G9UeaDCe9I/0x+OFi Ij'8FtLF1F@mGo ǒZ yW{M1l6l,\¬?Ν$`pu_d ,%%7dr7g2*Lߊ 6sI.gEzi;W&TSAR~0봩IcXgUD`;E5Ҿ5ZDi4׬>n+8|Ri%Mvk^:BxdmXhFbDFw&w8)qnTlOa#1Nˊ[=]4aDoert7RCG&Ta^1˅wG9&?kq`,wEu @5ze??CeXˏ*HR"d z8$qKuw4nJMfYɻ{.@a!huD6ŜM;/C-ԸISl5]<)63Ց9FopZ1dD};BSΜYJrFmy#3~-- ZTw%U[KE1&]/g'7N7 iѬqAz8rYxNg(GHG(PZJуӚ4+&J8Qߪd]R\Y+Ao=kCXzizx3eB v\ni}%@RǶ+W^iXvc8`P#@GAlCB EFj c ͫ7ôy8G^ ,'05q꿤n,Ccj$GixtVugJF:[*Jj"]>WiJ/]:a訌fY lyIpU3`t!D`laoZӻRuYwU: ;ڢt' فkFLwA X8X'f1d.|Ӳ a}f%Y.ys3KP2TY5m?Xј/-ŰѤW,11RG+J17R,mNVƝ3Ib\A-70'RY!n 8d8ϰOdAx H}7`;,<؎:+VL, &)[r~KSO&-kKsM(wu R)"R T G][ S#"J{5wUcC>g Lb &*A˛8[_NaB;Sr.lK^Y.pz$#q-sׄX L7t$e50 0Pj.U圤#L*q x7%)W+gɚas9V$8Zx9+P+Ml"ζ*_qZ LA_X^ ]Ӗu 9tg]I=q>H}78tnTYhK).1T3>'qFV1~ɀC?9~k*?hm 30L.$M›*S^u* .)>x:3 uju) 躲btZ\6w\RN@9Ktּ3}ѿ x xpusQpq^FԀ/xˈQ?ЕQwdžsHc>mi_r1r "7xs"43* f1;g:`jhQwXem 5ԒP:ZyKy^$ɱƥQI ɅV;BD`skUcj@ JZZ8}f T* [pfԢe-)oXbV\#3\L$qVPĘq_)۞vG\3c]"eIxF\PQ9J^!zTC0 q0x/Jpt慠m:FC`TL݀1Oݖd"KO~p@z y1xB(O0BO+tdyqɑ&ULFCj"o<ˆ)05)x(qr@ R3^&(b NLcϡiNGNUȠdǹː)尒Mjƚ|z:z<&`zh50;5gkLlFPH`7Ս3 "ft~8 # pϚ*6 Ju8`ܖx [%S8=.aA|աlL:z1V rd0HLM;NCPDyR{~4bpVrhAļan2w\yNY!ӥ`mg\,T[>JiLCXn̯.\XS穁A@WkpN(G4PoBNh(RV'-_5iX^;O,OJ!`hu"Hje Q/Gwi,%]cN?S*N’4:VU5~QFtW Gh.unZ O T*RXPt;kh;>G]~/L 5 !Ro\?Z_W '.cP?.ɪ;|U`46)?>Hz-@jQʤ$ii. ;+g?J!7g[9Їܢϻ+6 TLW̑^A;`8jQ*_#<1o}$af Nh@]υ/x9}mħZ{:KV]GDmN]-ݳ:vy{hx:||x(FM4F/4'\+Ǖ}z =d4ޓprSC1v*DYD~3 ߀ b ĢeG: %E8˱Zq!?͍g|6OUޥ(6ޣcN ټ=ZZ>lg8ڊʊ{[V$uOGu}ЄnX"*PdC_7#1n q!m={_=sL/=d,hZ/94܊1P,~RDTReydijA#>Op=rLʌhq% ǰ– +> DV9zO]NLx~a?dN<3W?yVR? ]~%yLi]:xx%A<8$K=;ópRaJ1io$ ԘI-in6cAzul?4ΩX/z5K["Y_S?c[6zqFGLU\h_!- +Q^D8vKfՖLX0Szb)B)I9IjPN2\Mq蟧M]esha|X6`  D7f_  <(",qnX-(?{%1c87$u$)gM1B\L0"v.ۮbnRe7,[ÀKӷ(4&!މ3m" RnA!g]l6u8{*|J#Z4 in H9? ^U_ K6 xO*FO˻; &KxmK1w[}U&WWn3 6bNY;.4m@8 H$fӁVy>+kԘ$vmKSF[߾EVraޥ4pl>|=G+U0F06~ñLe2 ZOh W;/x>Wm&?2aUՠ洙!<ΘA,FsKs?n;* 78 XT ;*Gk<20;©ĉM{bJ.3CLBC"6 քQUhdnPz'2!aNi_ ł外'Jq> )~G{l<5j8d0JRXqS -5NF\M]J]ft4TDLfGB3 ?{fqsnUluzo @{<JPXݗ,4ec:c߳h/j4r- x LX3Y%x |jΞI5 ވRz=̑?xJJ I8\{9L3^ @DLbR*r !,BE[,#kN<'-:i12_t`w965[c&>h֬ εxt?HS8 qj)WGi#+ٰ*#-*\ͽ'?`ft# /?;YoP RϿ/ *bԨ>0E{'Y6jvZp ck#z {`T(1?Y ozy]ШJMwR.r">J<1So:ߚ*ok?UJ @6'9~C;'DREr7$ؕل} .757-X^Vf eH=$k/,i{UaNhꕻzo_L$~lܗ$dBRHbyIH5{kOӁM8F '*z2Cޱlؽ2nJnG2{{od6hI>{;7|H#;&lټYFݏWVnn?}Z! >off%$to(X7w'[t!t64=`G]Gs\_YTGP30MY8CAa/w58nJ&C!}42Jn{_m c;}:@hp {%~6K)mR(=6A#P&VT>B{%6ɽ㋚'sFM|@;cEO)5x,&LmLR6m#hʵ_Gy/os"\6Te h8yvHg6pW4<Œ|v qz:vH2U[+|z,,kx  [%U' NQ|݈J_6نXh< s$Sw`:x]qv`zk'7h9X[S1ND (??؈ }WPij2LZo(یO& PT>of>› L 3tsphi~xG ;Y1MÛX*e 5k q>EKޓ#RP]]dWnɻ=Q=($Q]N?&9ý A^Jrr? YBͲ,uL?Rr .)˨y.?ިef&Kʗ5>8XW!wea# a_Bs `+UkH9DB<ɗ5-7~vP2s+85B^WdC-" %*`wNL9@%c:tÐ=B uc+p?ྰI`pXi'FPp_\,ΐ-}rި c#J}^ȞZi9~O}D* ʌr~ ,Gb^(M8Y0a* `sӡf8;#V؞7oefЙ9#eSTTU䤢$+ODnLu_x18{.ؠ66De-K3LYUݡi=|- !rs7a5Acɑp{Yw)X\ӛ&iAD6H`cHFp}^aR̅`%|P8n̴]h $->Ĺ5$m\Y<ChiN-z~'}uYSe)+H}WYW:eֆ#= pFƾ6߻W&V=]K FhMvOVi tP62I/z[A3nڤ|hi=p@ԼH*yCl]Dc,>E *׿Yozn`$Q!Bh-SEc)O)lj؃@ND,Ct{d.aJFϨJU.p>b}3U%(8u G%d ևx}ݴp~K4n#Rp˒ԫ V?SׄIXbA{{RQI B<@ۿi+0zidpKG)$DA_i6VwH(Ę{OXh%!r0X?`jX=z"C0Ꜻ8 #k5s^CUMRl_>ӡR5!` TVm#m@?@ރW*jWO4@J x  d|"d2I} lm %dFP0 Ĺ9m66%s: (>3 =˼EP/trS/!>C"T-+/ ;'tR9ΑRd&1B!rqбF!#%blg`+|8,[ѕqdY_s1¤ju47u;E㰗B<šEvV;DD:L.G)YH[^>RcF52B &Q4. f֐N^ӰWN`)=*P#w؏wЖBb1JLŘ 7z8@S،g>`/c7K0Bp2OPGiNv? >$S#q)sCVJ13i"!J)/2fK峒6,v$Mэ>3~:Ibi> Zl%%>Cx%pvsN֩ _cAGyd=>/sX\>(fuα&#a\W[`Ο|']*O=N A"y_;{ĢxN=pf4kQB%JUn}/J)9~bA{dsK{:MmIRun]_fC+6.Y&>b TkK[8سDO` #3(UBԲtވjNӗ|ªWW&I;xzp -='zGQ,N_ϟ:8sF)Za[dfIv-x_"dY4}8a93vߡCܴbӭCnwxTH-[% fi AEs*'To]J8up玹nVلJ{{'{Aio~֡CPT AZ C&= _P"bdx>zM rl] [)G.]c.Hl#(#ue5ƞ94))1aFK.#bQLYH⋕Nݹ-Lg:"-lsGsm -aP5:P\ .Yi'"*HnC6XzA?!cH9_DH+SmkYhsV>Xt b: ٝi[R<WHv7DjU!BP˱43w9KNaZ`^8Y>'>&`pE ?cH<{]*)4Mn%fһXdY0f|aPHcs"/}N".[tdI̥4m7MP`Z# _> fCNJĪ.PZ !ܥ%aKzC/;"8I`[4SƓYz|Ig" Th[DJ[D@<.CF KfaZ :ZxF$:1nXѡr)7~'Xc"w9`^9jؽ+yJ匟Z{޼ϓ= Q_@yTHtXG N(0UBf{y9W;~qdm.¢,u(^>0*PqJV;bPwJO#mid08 1bl(]ԣ]E`ysܚʐFz ,mՐv4W=oү)GFwu:j?ƟedRXf=vJY|ޔiVہ#Svb$OO:l:.O|=0H;:~SKZȇAlUwڃl./$Nj2!X'j*cnG߻w <سf%:+ƓnY C_0F=ɊPcds1BCr>$/xG u=KÓ@~!+L g>CBXӫ$6FDLD )Gjq||J"/@iɘ٭IީN2!1=3{ h~h t("l|i0 rp}B9ڧ?tWi!5=Sk՟ ;@a۞TKRQSw`7R1 KAYKѡ*%.<Φ$h3>4cklL\O4g^FpvfFoƴ9C0l*+;)z0q®)m:}^^y/e?Bϋu޸šHk賳5с?!T  7쳅,*Bv#Œa4#MrKZYõ[eoOYg|j1ЈuNpב[vpNi%,/z]>~/}f׷Ѕ1R?$_ra%2Oٕl*''EXKuT'?vĘhoV\am]cPQɑ>F)*F 6? *DiNDy" ȠJTsI0& I;O-F:44ZԦĶ Ӷ* ,`iu[E22*Xt>)2M_46myd!r V"l^6 ,$R.Tk5@Kn*E69 :ʖ : 6[F;aabmZԁӠkf-$ҳ*胳S> Q~{&w)Bo,;4<|ab!kR71du̖VطpZc3X?3/V`2 WS&wr :܅)AdKGw!;Z6?ku󡬽},؉XD8YT9ob(&1P_Й`JO0JM^|5D8 G)Vs4&'8ӱo9,6 r>cu.P=͞@NCKsRnEO9dUܘDNG)IG#H bc<R3a@  mQ A%oʠvnױa<*dotbۃ} +Fae('P mj7g&_c'+k|;==rH묧KGsz,jMjorF-=:WȋjP6) ]'GdRk" yxRheeM)\d :$GQohbM]҅;){G9ۼ{tmFdx IY'*[]hB'dOp+7Fs$.F*,v, Cy8bov^!-yI[q!k?I&N% [A7 d6n\O7OA 9 @Ѿ mEzCW:7x,֛EarۀQQj#,hyUY ֥3] F 0 \YCq=؝ N]ΰXCɍ.{tHDM.kDܳiaKUǎ eyx^FNE(OQ`zA x?QZ#_'}e+I$2j (]&}mvlOR mW!S4̷AǞ~ʷD0t14| BC`DYiIrRƴl4"fnX/FW^OZvj6A,ÈR1e/|v#{жT=!>Xioq>뱃SS5twrQϹ#^byeF-V;QP'WeV)A'8FdP[d*zjU}!GDD)$!hO[#K>e|]ҫ\ǸXHuОm0T2DҾu!*K5'i/QN-H~/s&GcT #O~K+ۧFTZ#{9Ej!4e`qed0d8ۧS_s,3,B-y{>d3% gܲA*($6 ;QpM-0.Uuftjk.՛\_-D9`^L]catN=Uw>:DŶ=(sq/%fY]lv逻Sƽp$M吠ңnڤgQz.)5 83tDS&soy32?H8ޡ,̐s8OWֹdS<[c`l)i_ɞ'!mpNhx'n, 6W% ͫ"T^l+19MsK Z@2b_g幘'nfeA^u(Nv^!_xn'MCC W20^AL4qzSbZ VXD>ۗ HUE_Qn}su'e4AxR/" %!+ *3_|$e>/ à=:&k0:w9Q:9=b[NG4/zy7_?Wv ,}]?,i*Κ *8zGR5avSIȼ[%+tW첾,(d&!`H+ o;N 5 ʐ1 ζx|Zb.Dž &L(h AֺP$U vFw$,7m<p#- E}4Tm:sQ'4G'V:C MyJTլ#`. \J8G Q/, n&Ez<h' #$tx] oK:G0\n.jbd\řnx+qDqm(ʒ1f ΀P+@co^D `ET ڈ";ki7y_!<0e l3g8g=y"sĒ ڝ a` [s3F 8.#vK42dq.e ;qIzA$(q53|9弝œ GWܣ+hSmиŁYp<œ}<3SB7pf ] Cceo K+( ҍzTϏwxh>7m<;򲶛;!uun!A7+9yv\<&J-VV5t3ѿ%Lh͂N+3: .pdἺ$`Pw߬Fuw<5?DmN3n8[ƼđL -/ǷrP̱/ "r4m ŀ5-‰DԠ3"gx8sEij:iUN(s# !@Bh9 A:wbɮ$ܚZʤ7d<2KE-r `HVIr(ߥ‹X83JR]ɝևv'A}ƤJ1 ~*HqlHՉly ,ng[>}%wZP>73GgvKEwkQэpR9Q0Y02c zË5E=::*oTpeЀVx`Y,BH$uS4Py/_pY! S =b ͸o.rFsոc |NWy.xVuC3bTF$uD^U|?&݇כkLDخat5-P@Ҋ2ڳ$[V ݰ>p'&f%lWa .\*ij59}#F,lh 8CyfO;8ޮWdڶgEI n!J:5jXހNl0w Yӽ7Sq;J:^Q HE1|fd(Ќ7#_g~LPqxI_A։6TL#Je*=B p_ r'J] r:Y]ֵ_&DgK5uqo"[~j ˔6;Gx<[w .sp.K8G9Pv&hDTv^ &)t RŅ@QM%8$c9Wk(B9ֲd<|NĚo$K>Nj> 1`;o__I0 2HT>0VT;$A4X_N4=QX|E-1IW,Dt (xE YZǪIdcT-PԸ_=Jp`(+MV̺U̳l h O-N,D+븺2R=u87ZVD)dM"_D@R"njbT4ǦK jޖVTݢ/i!9L?"Wq{0!fM؇*~܆-.+,y3 P#:55!x[f79ʁoCVҦ`v"?GB- _''Н495`Oә<& 9Af$Dk 6%r}hdi!`~fOQx '<v}IƲS'순lNR NcE ׌{J*GVqs ?`a.G TCNf݈w 0CKǥԟ?XFq^I;R(U0ظXΪv%g)u{oO7+6vLEV~2-Vj-Jc%iQLUFuOG?;Ñ>lK3ڦT%[2';N\}vyo䉨p+ ܻ-î{E"Zq*or>j࢙{{*KaS=O ,(Zn A^)T6_ 4)H]Nr`aJ+Ҽ3$Q( OS>Z{uՆ08Eqprũ̃}7?jfה_]'q fH#/v tpp td0:-Qm?Ch?ĽlLڄAJ1ʪ VoxK=o;7̹'HGGpнuR.Wh-ѓ_3=.Rs^#u@~rF$&MUb!*k,ݨXt g*Mm80i]Hf4]"d-.}XU]q쪲H*`S_.;>%q).2s*7ivr˸[&#.x.!*@Eoj[!E'=HS7lК:☟XfٿTe|`$@eK'H|_Ch$֊C1NDUi^\c}Rc2ϷWQo6u~yEx dNōG!enQ;7R):<{6i /{lʖ_#nN2XW=BY oMb0߀/:CpO½TUZny̍NIkrо޿PF |ߌMcl<@ +5#VLd?$\),J4OHiHSc>ٖԃp&pXb))+R SY`Ze7ZLP4_LZtNȴud LӤFirC.iLyɪzGi8U+3ԩ4Jx)D fh7+ׄԆRz|-i̞s#pZC{/!Vev0 ~{"۵ 8.VsA +EKlP2Xx~ۘ!?? r?aJ8{"7DLj md(BM+;V@):2s$D:i !k{23)ܜ)? (r+_ɇ*M]z5?XmQr:%̟*n!s-1ǐy]a!-pZjx"2 M'6)M8|Q9VYPK>tcLP sŨIe`|~0W8W)hi̝c4ĴS;J'ޢԴ͢hTBPhɕ"9JcU82hHD+bR9]2rMIX &JcU_%Y]Wrd}= MjqLwЉ#UqLж2\HĐ8 _g{Q|OÍ I y>[A%4{_g>oYoY<7FmʟSt,`k|8k]_zc P?Ĥ2SX1nՉ;J-kidfbuIje痿j-]OAƈMx jtu&Y?2 OE 3%E-B~y!7AL<%hJ³E3뜸7"Pibu% Ss21QywH$L*^u:("iZCw{.$AwK͗)pShObF̠mVd O>siprluRMPQÎa%@(9Dz t\D) k`Dⲽfqk¿ߐ.7|nD| ROc3<2\ KP(v U@lZR0X޹%+Y>?%YRK:vR&f18JhABJ6H]nz~-LvOQmԛy|N\A,1S"R(e0Aр3+}xXCŸe'"-R\cdl&2#],4{{D*ܰϜʠ("hbIoel2!c PPAb^e(ȓ01mGcED֒9G6!O}NGSḚm-ahĨ13jCh#AoO*j=.sJ3:q4W[7Y`B$Z@IG&4O5㚰xkW6:s)(Ay)ö]c~QnoeZa0F!<œߵԉƝ{|C Qow hQLQI!L6&k£E2O{)2\D.̯fΚ8pLZ#;O8E̡4`vT0vZɛ4tBWJ1EQxsZOj ѥ!ҽ//Ya3Y:%_Agf o$V˫cD{Mӝ4$=ž"[De xJMR"/t3`>Z ^:Th߄U8 dô ~]DZ5§rg_:}TNKn};exDž'ɼ=IqXLARs%C hh kCShZ6I&,3LV>yɭ%@BgC؆(1?$Xp[ cPbOKJ=GP8L$&vi7E浛bΝO-'I*)%kǹX0tnMIJAf,_ 6-J\ ՛ۺ-ڦ;I? Rv}i2 Y|uN0Q/ IT c-MQ4; š{Ĭ[Cw8"qu$&3}ȵWV*Dn3 MəFnWY€yF"kvnpND#N8C: Qqh֞ #bSJ,'(ISvCҚldm?0z3s#3%7f&P;杨u*gH8&^Eg11 ;sUĵqn^<x3yre= fAPOu&ΐ8CV[*dkⲉ KhA`7'ry;_f-=^CؘV'p~0]02-Vw16Xͯ諛4|AMcQ:fS&PFnHf+ʳgϮbxJf M !N5-MB.k{ 2IÆ#-o&ų&gr0P{=S4%E4ዊ0[^ Пf8L:w,-q#mh/AtGWI-43#yBOӋ)ɥr Qy2ez:Z9e}Q>]~AJ3;Ոy ,3KpϘZX_ TZr`0hPxm y)JH^(kt,FBWtVipՁwMHutH(Fߤ:e ᩶׵=kFEa*4gkSޟPʇ, ۉHnpm;}woDESLE$%$$}Ą#753I S3vZAbA!83C{`&r ,sU>i+Ru pgWi' wO)Vbk j[ "B޳yIЅɍCURVݸ > MQә{1JUW$zh "[0ىnN>faJ/1-$L:>spQ3Hȍv$~9bzg?(ZaǍ7&=MXolu;~'Fm>X)_֠(4mQpVdcB볜!%|_x˟8Ŏ|UdK%Ms9ifEOi~ldM.>]i{tg[:l;vVkD"d=Û:^`ic"xIdgf8d)_ci]ખ'׎g4N/CpL@HQٷ?FMmt j`VqB挊B/F 9Ax8͒X$AKDBt3LB )~GΪkhH7ҊxhC«n%ös7xZڼ(oА.Z?'aECЍ1>ZXi>ι+"~Psќ/[j3'ΑM$ :O jD=/V0IC-[&Wa[5o;kDmH+ی]=IgZ:3qgv̍,*tBL%Ԟ TZnm7@h81^Aa#Dz (t B+({|zvѾv?wUwJMR~ڦϻJ1zhkkIІڱ!S lo Wi%L{}"J'毯r_O;kea;yAF%EHA$BC#!`>9ir vA}/洆D'Ww"5?JViVa9C`:,66bA|Wvk܉ @<1 !-Ĕs`˱|@CT,@qTrgwFF|Y\TJiӊB| lRtJVCR^io6a_͔o,^5I`G~F'(}$|f)ـ h(8dEyǒ=N lכaԊmfت`!|׿i4o8Kp%̺ =W[*KKs坞 RGDp`5Aqo(a`B\6.ZpS!;Ы5QS1ex?]XbnYѾ`?Af8Anد*SOa# Mfʖ ~e?`R͙ fRGсo~pjfQ;$R (4Ͱ; hT Wlf/,xj7⸣ hôq*,喳H:Aը&a>\MBV˹АDzmNuJPwKLm̷dG>W ҏY~?OM=oVRiAљ xsW\ۋ(@ r%΅~®9 hlRaoaGSxu "(6 Q۪Ltۛ=beHsFwc !*{ MU7\H=gu:ޥ%,rS,p'Ihwk$9 SȀN,nK w4q|oWa\\漕ZR>C#Srܱiݍx˿L'>Z"I۳n$7 gfD҂i %Uӑ,wnqbb=O} l2,%wy>(l-HƵ e҇dz/==uh cڨ@mDqm:aEAIOrM Q % ]9#vWLo>ee~00I'Oyg+ \̓ƊR^LY(m z||I.w⤬q ޔWec(ɻMZk{|B"-cXN]vn9Nw +\s}f=ZgTs 'L}{<֤dqmt4c$ K_>7 M^I^fYL6MJ}t3J#@L5mk(8fuDj:(q]"DKC~A[ qp]>\֝iX(FDd&ciđWD54uLT^{/]hhHIF Ņ,LYFMӑ,q>}A@Mz3L,T8LC%%Eb\э}J&$wxST^%&pki* me zڂG]*$o+՜+YzB%" |% @ z0:יݧ}QL.vTO1LU:RX1a>-2?6<> /Z"۫i$xnsyEz+!$|E'ʔlT~55 M+@Ϫ(>[T\S;?!s+N'fI HQyNإi n*c*v$<1<=ʥ8F5m?J7SR(Hn{>qDK~໹@y;;I;Pѯʚ\-ʥ\2,J{_V6GS#3#ePoRC+|/zؕ]Ly<qa !uRjDT~ٖoDΈ8ky?c@xUnp./Cہ~cLΒF.`ƒ֓[6l{U_T{J<|U jYyK_Sg`c!{s0PYyI0~8#!00jf0PL3s9d<M"޷Pvϙaʧ 9M:8aB;4Aj\/l M;;Z9`}7- φewO61<%- W;W>tw ,t+Ya=c%"#]X%-RL{&? ]>DzER2qsМڋ:D2"IEqa2Hl/Ä% tZj1 0 1eAb_k ҿc~YƔQR`TB7.) rjUApAY5ᤄ4R2r9k4CFn2(+֨4̌eaNP1f!M>Bc薊z-a ک<\VJ_8 ˣ{ǒYt@CLF"a/ߦ?}/]y20W[yw6Mٙ߼Kn+KMCHU'ƥѲD=MGG00/K?;>2~Ю, p)2+T9'bE2w ^T X8fA-'nkJ%5<0[p4tS64~|KMYR> dЉsB'T8{1V ``3.w$Od :u% 0%pQXݥq6w pyڠT~`K FPn;QJ[ EuCj^f>l}P3)J( tZ#ը 8,HDP+IH#R0O׭؃?q/Rv4GXX@밋ANR:!2 y8(LvX.xԏ3-ѡ\1t0QR^@b뙃K Cbwo7#mr;b axJ;<1[^L&¶KMcu5WXMev :sm\z|:sVpX2XJU;}\yi28bѣ 1?tg 9"۳,npTZ*̟P P0loL=zw; 0Ev~>xٖӝj¥"LzYLpuɵ%3QQB3[FN/RCg7 kRj`Nhq(:v) OX88ksǮ(0X?,6;O|OSdHذX"]ƚ1ʼnOt2eΎ++>'Z9(V{}&rb~jkBq}Q'9#bJ#%9 w0֩\FUNvBL8Rxx3֔&ν?BoJ@Z+wqixF'O8=T~~C8g 78~/" +W. zAw > G:eTS1IZm'qaH4K}@#J;'=,X=Wu?YUM7,X|!.碀R\]:Y>6Izm1Uڂ]`;ӳ߭0]w&SJPn/lǷE0ɳ }6|ҤYv ^@[5%D6r(u\_R%ǹCkR-}eѴ*db{q_.{0me~W7शt q|㲐}[h*%gw:e&R50M:`_]1甗I葖4!@;ܹȦt8O5 7zhq#Gq薔B4m2AmLLM}v3 Z= #T0sCQF/$rwQ褻nuUu])9k<ʰdƺ.Φ(gE)+^5s miR# c3U-~MzX{zw$Z -4 W|  w%zhU> Tmvv 3`G&dFuv12>9y#'묎lc.n{NamatP[N4i[i*, ߺLVU# Q1VG AY *>AQKZO<:>}«? ⶜v,Lh8~mp2]{͂:LҽW(Ti:>M\`x>D:tQo㓕Q,KNVfН'G?tAshf5 ]Ep|Ǯ2MJFD@YOxܡ lhjO9?.] /AL9e3RW7Y1QN܂J:3 .)<7kMPAF{HxW%J:^U营9( I{?^kԿ4mqDNq.vx6Քn*77i8G|:Shybլ2( i C= fIy8!3jWU`CANKN,rQ>0\RFP^1H=ɛdۢzdCEBsh r2:| S A3f}_JM|EFH!bqݫ&RisOQؗFvo nU\^$Cq*(T^cǂ [n/2HErSd#|4b`6WE t3'ZͳpmmЫn3/@}3* Pq:M2DCWoeJRXd`HJ_6c{_rfIFx3UG/5V;3;١2Ruy#y*+},76s@7OPChZg&dKGx<(GAޮeuqq?O͗B@:)W~ԑEoV04Um@z?8Ǥ~b%b$!,(R'6*eհ=@lY/ S R9P@wz>Hh2 xds:ڍ}> 4h r~aHQZ*:mm1/O~S4ZBІ7uM/kZ|} q  [12xW!K=\Nq{tHԚbw ]3҇9Gj4f^_A!Z|w"7!<,G{0BCtuNvwNnx8A%Lq7~ˋ2E*x.act 6!w\vDI?֟ x6p|nōRLBJ3@ETܬ)2b$),~Y Ωm=k ;?UEG48s֍uS<]$Vms!ZIMb:EV`nຝiD$ p p_'SMԑZ;m>H='^[TMϋE1l^K4z(n@EhQ EKN%BBAow:w/͖ӧ.*_i_|K:m'@8l?y$ Y3`Ⱦ[p%O-kL/qFWƙ_̹ ۨr士%lVlɬzU&TYPm le^ItW:f)l+-d2-QMټ21jbq/ݸ_Ё&~rRz̍%) qU rM}Zi jSB"ӶOC4"1U'BءHʚRLuT:p#'ʸ3 ^`\ҚŅx/G{a" H!+MJaz:"عURl@S2|{^(*r+ 5Sժ1ʗ[; /Z[Dh_uzQ'CV2}7p $:cnaT#mh ZbM ^@1kwɃM*Fñoj"8}ٽmg'nsaD0^9~D5 %se BǠKy:i/gӳjtaS%|޵0q~bdl}{ (xDXwIb*Uڢ+ˋAk3F^WYj+6(Bc(r i̎P;6^Ly6hBՁlyA_Z"Tަ2=OX4]-d:p A}/0FnO P.\N<~R%YPe] ==)}a*]CV3,M \͠'Kd0\_&rx߮7BbƉs6W;|t\L.oqm Gó_VU?V|%Ux.#q蛔D# x oΉ6Æ۵sWu=TǏX6!!1G(7j&I@GEƃZ 640NY~cҎ<&7xdFJؚuf|wHՍH;Yu-K#as_.v`jz:LqoPD8WG;F8oZsϟxkau/m)axlݑV]7 ; u #݁Eg56;ͷ@i&I=09$Yc-AU9a}ADfRapnP1q(CVdT7<.'~̤Ab1+՗ gAj@b=^eedd0Pt?X`D=ٖ9'$u*b2/In]'t Gݼ|uefa:6L> p-ɬ ;'kKz )oZ؝m%>)as!wHVёs4rLJF&9{BT( x\咶Z(U603/MړFB> "sxq.M qE_۷''ka#2e%pJm˸$[Yit-p}i @e-9S@feW33\]YE4f\g<Yq|<z}3(91lyݐ0Vo}GYz-AyI `3~-m_[֕xKZܢ6&[>NhEWj,g@h=$#e.2REi*`)5U3j{w Ԝ2a_](w,`wg/VS+ǭ ؄ax.qw:.8[M d,$ZM9ޥJ@ - X3>ɑTqol*_pbvhPQzƵpwg@ (>_ToFG,sD8~4 E3ː<rW3Ӭ 4x-lf?w ^ > U)z j2 O/^i邏@8?y o3 rnXp&:v4ey=:9l;D" >aGG-< ;$ Ib-=7lI*՛Q_\[Cпp6?RLJ.ss*FnDaDzֶ#,L%f:`V.V)dP-3CMG0 CT;cmሀҩ5㐲oلR׺l H7yRlg$6?FFx? \@$L~iyc::dA WiPws'HInc@G ^¿N9to_l7%hW-F7AuŌzÂÆVV޾fsk{b~6& ؍\mk Hvۧ? T[P}F6gD or2LV0..Ne}pctqQZ'y.{_Cm!.2 JKXd񸴨#oqeA#ǾYmBop9nL=༫ig3!F?.o#7Ỉil|(siE5l'Z1Ħ}։,j?O% ݍjnx^8WzfX.;RB4}Yc,B̆ŁۢGIOztjE8Nx_`E?Az f0tVttGjGq۷O˓M\6b"Ӹk j4[Iչ6䄫)]K[W,=w'"orYi:Ǥti>Uq I'Hc <[/ꟼ; }t9H*pal9 B69^n40֓ @pcgԕ ΄s)$E6ƊjSE5; d6e `]:mZCq P%L]lUmݘx.9\,(*̰Ms=Mw~c_Tދ qþ0p/H?9JKL;"'/6?_Xp對fsf6.Ħ;e-|-fl3B ؏\W:?>1(pBCTba05Q5H٩7x]/A i!AbfTz.S>CF75KLO޵>PxYoeEƄ$7ooz&=*hoph0j}<bl+#e45\PgHaJ~f.!Aۥ驏0} ^Q6r5FzӞbV!dhfT`+ӿXC &ka߇ǘޚsTy@ њoظw@2A$ ;.oGkmC}Ow@k\>uGlle W)k8Tإ d]HE[`Qk~dviJՃŶGyWgCA*E$Ў m/ *rڜIEW@\ѣ5V@U~%$=u7T{UbyC ;<4f>c) 7 r}iGm4! 1³&x.O/ }|b#jHGè~-6.p$(؀e0:5or*}՗cu(6Et{VWtv2|m>G+h#5 mX7a6K0^Ďf4^`v'(ZȶLnߙ]XsI<`YPf[]RWQp{`Q"C lmxhZZêXr0z@kSpX?P.L[X3n$BC\J6[wHִ 0YFęE"ņq˄o|E薖rYN5Wܬ&($B1 2pu= Bkes8k<wf?mȍpuVd13Pξu+PL82v{~q+0ަmq@L{ +D98ϛ'Q2 9y|g+fKz\eH,0yj^$6c'MEm=Cc5S3ሥ cBc|[ѡ`mrqa42q6@]GvGwza^D+DNg)$w-aM -sǒ}b! YuY]*"tE!cNn[? P7)N5Ťb&:%lq̵-(o$=;K 1/[!aͼHzާ3WynkCM DgDhz.N)v[P-mP'n& F2[|k! )&ki`*pJ Z1SVN-axneKQQc{HkVUs hQHi cB&y,gsF'TN>j]ѭZOf[+e 24(q'pYME2@UO=;PWR2#%7I坒2ԥBXШnas*_k S,p jɠ]8~\g̋MtHQΏvӰnU+XVWSNϵp0лn!+7kW(*auv͈̉ٚnEI\Ց6bOTc0R-a~퇄"gl{iLBBkK.8)ityzYgM/Liz†OYʏnpЍ:($_-q1J08M] U2WJ.+:񨍼@Q-EƆKL'A"8Eol*IMFCHJdM(>qNjdUFOYtK;yBm8r\ %W֞-qy*W݃LX ZptU:bEzaÎn,,a ,H_)' W1oUHJg {"v儓rG-ߡ56fzS53FV!XF35[xBZݭ8J~=]n 洙s\|RJ˂d[?Ͷi6Br61#g)2-QYo_ 7-sPB)X7&-Ө% . i;ew_beu(JKC PL66$—MP^ثS@$yIhĶ5XiiJJö٤!>`c|>@BvCr}|8%(rυC)Gqnb3ޤLRz pNgF+.^ӽMSN 5^] EۢxIv @2%[$34[E8K?lvd7 HP=Q>~v͙AycJӂ tܩr7@CGP]*nb"Yd4%KGg qtz E"OG&9NV+{0MGE:S]S` /8 H&&QЙ6G ð=4rXչXz~.XO4P%r6F({aHڐǼ zV$o-m(ژtrX@vP~y||xIeisyU} "Rbۮ΄oIucyz2jSSAl=l"= >AbH"y؆tBȴKvmq^ )*I7t:,0$`C9f-JJQB?߬3$HATJ|B1$}'VpE5(** `O#:M57,_[iԄ;8ϗBc}/lm=t$b&/7] eӄK{!`|f8{'ЎqxY|]`P0S!pdmMOY/p4 Rza`{q5\:ÍjU>hZɃNG [Ӣ<+CA2h<3ۨhrhp/^anLF8zHuaMǣnn,a;? "n.z')cԙPi0Mb|=x/`ft] QOh38`-=:*@ԢMP/?2+M1ՄZfB6;/f'Wٳ{r(2tڰH m9C AM8x{@=e f"DQ:~Vwcѻxm \ir0DtB zw7'Y Dc "|D00yf7 կgXJ`ЁG\Ds>tYC_n'S1>XϡO,!#]vƃYQpaqY zvT|lI-vKYoB g4!O;x}5=֋wIBJ8D ?˓ 슺U㚨An @k(u^wˎP . ?3Uv(HXaў9t!ͧwӈ)97).~CPFK^<۴ xmov zLxZ/:ՃVVK!K@VɾMK"KV,cRʑ"qʃ t}.ܖwwh;ԧ"xUsssg9X6X̽SFocNG;u=DYyxԎG7\OHNh4+4&WϏw Bv*2zW֊V]uӧVQabIR59dObZC&#5*ze;1Mj[.( 5Uץ)/I09&Mz)p:xnBọi@*?~@ae={H V2ą@>|ܱ;n>ѯC8fwϊPn7]!n90kh6s; =ʃ>ƠmEA˵8㟚j6.CDvLjB"5Jrk S\4 "OAM9-L늌7ôɂtG&d..U ї3g}oo<[#nJ%]l*2*H'>cǾ'ȍ+Q8+>VW+>;+Y ^%e=N0yAAxȳ29Sr%kרB#<^Cʐs g޺W}ʧ!Xw6U`/D$8?-Bsxb䚽]abKx36hN%4 VPKΓEPma#naR-7YnGqR5ql}s`7i‡{Fݐ!qo}a5](T[>S^pfw/ ]FZ:f/#qaKmZVVi V^5G2 DD]ccfY*0O*\kBT`V?#u:ϐ#_r|iuE]IL*ibJH=a{_gtjyţ/"b$L QI('5u-gaV^B Wlغ渷!v%p4{V_H1^  tȉiS5OH:?.|/m@]HqM2%e ɳfϵn^1n*X+&ڗ$JKpTZ3Pȉ$/ΘIחȕS$K$t 5脽Ԁn =kT1zTӽ\#|MRZ!Gj<z?i՗vlĕ~!f i!)nq1fԽ5oDF4GKޟrWu%Bl e-oK?2=EqrA]K~ѣcA }eaTH\#Ñ8-sUv= pylZ3`y >3 CCѾJ{f5v[KWo6Bn!Ңl?oo14E<LL-6X<8G!j8f֛.1a?ID SGt1בbî{A R/~r #4tdRPDtT&W%=c ڀ6Ln66W_ll7iI;Rb^{:?#gP.C~Xs8Q=[\Ā758HC*<2_"CW`[Ԓ rȉyH E%CFW͔MTLu"d4HBjA G}HU"fsx(O[K!:)>}06e~)6\Ɨr(n9ُɄJdLE!\o)vN$^?l}Q Φxw}mesYR,k-̋oc(2h'Qѐ  uJ5%0)V}Vв78z6zФG87 Zgʄmr2T˽YZznv'XɗQ"\l2$áBZzY"mBp֖a/fOa?(ƽQ1:L_Tew FlaykUrN'wwCcK5ʹ'f%X4)lҘ0G$J%м)w|a {\1Š*uTU@~vAyEWǗw*q `A^Ax&0Gj"uLv8UZwtԀ?;Å ;q{w`FB 3̡Qvi8#IkDcr_\xM(K2rKGIQ@[tf/H 9JoK0# :殪duV ч5*po5|z2 Z qI]\Fn*5zZ˸M^0tT*OyEu""h "n++r͹!+J@/$C1_9T#̓"FVb&s&*5EBGGi` }( Ek%GlN| 7Y.FR5@l#Iv8سAɭTzvy?pމkq@ɱO7aG}kKpH!_?9EL+GNRVDFTu,0Oϕ۵ms1Kamo$ _]d""8(z:0W&Hj <9ױ0l',UXKЕzj)%a.BKC.WTPCc.HC5P?؆sӽ+ni+ ygέ&6fɲ -)+c Ko0>̾yL,ϒ+:98mJ DjR=S ՗7 3jA:0hʓOUzv %gPU׸TIxr^V-}-J@Uh@A !sa/'C3򿵲E.~7Y grbav/uV楹M{Zkۨ`ם]D;UnOfNkrO4&-WϬ((ΐ*B5L.}ILϗy,Q9h qTN=@XV?vJy03NfJS֖)x?#?P?RLS{[m[*rѲHSaQn Өl7a9Qc-k(RAO;5l~TrY)Z'n{ Pf+הTC ;4ɕA&ZJRA"OJwi mf*띊A(G9(&!Dy{@ـ@3A=N+n >\}t-̓q9&`4,ZJӖvR,5 &떮Oׂ_HK\BdOApe|olɂ yaqIC2ٴ"_9aFSleg qv ozy0ARM۔@SNF@BL.~㊴Gۑo*.0-SZp0#iȇOh(yxC_@(b pi~D L^$wxUl~ IUGsvJ Nl!QA2@"yg3ݣL➷,8g8##Y1^\=uMʍ'Oy?Rˠ-Ǝo㐻2;OZEr;_QTBȳBAඞ 䠐9XlҍXUH6svR^n{0U~bUa..W̫8L沘>tNz|<'#^] "U޵oڳa6N#lwl4q*Aǎ"- evJ"TV<+ }=$hmTLgyͬ{#H 쎥I4.e2.D auAܘ.mK9O)69G6-l\=g`J \HuMjmDɓBNwcO[ ݩq۩\ 9 uEkfv8 4pTz+H&{_gw%q,˓:H?2y[BA }uFHI%j/cxi7{;ʢ9kh(th [?\gN-ډWUET\t\,mviU']oP$7=5穔?<"sai_j>6LY`aC^fw1YY\n-~Mj#\/aPyӞ{h[7遾Ԩe@ P3g 1,ߙfk5cL)c D ~Hd4heڑ]\>ZZ0_4|w7B+"&yoAo[{fi1m_$c?1ҟއu-T7Qu&m%y(l ްWcCY&Mv@&EVyn):СѷVEyAk9kuU)3ō:DZ-W/N8̒묙/pD)Lt8;<ٰ/ T(䨎"WcX*|kjxOgHPSUye&0z /WLPQejK ɁlUJyLkC+YBx,d1 6 g] #K#f)ڦs:kc{*{K~C>bbNOb9!OLls6z"[y oXkK+ oz3Ayo_b,o켚 ,ʱhP~R_)']NFSoC[v@\ (2}OF#::C8?S!swyH@= Y?L=oq$BA:JIf.;(Ny6r>^"on*K~e>sJ]4h\jZS}W~OӫOSzi]bG] ѤG_X7+6HV뤍a8q]kxlp߁CXo5 II85P$+f2܁ɷYgT;vQq:y_[~CaynOEw-NioG{HJvq|ۅ9a>[Z/hX8wIŊ&E;u@efJ>J&FiYbըR+lDlNF`N\U;_&WCaaЩ٠rhF!Zkmp8?8C(,Q(:5TuvD& ̿0n'G?TTC}b ӫ镴 ^zԼgNR  'mX\װYlDO:Zi^ +pH ∲z(kC̏ p:4z(XKRş?8ɚ06nYYoMJ\ 瘘ks)*DUr*_}Yj3\mY mVR"P9C(Up]Z Ѷ&R7X08/_fԸ(>JFTJ7D]cD\qg0ɰb, F+mxg!b2.,(\lD>'VV,ks+k D(>apo"'KTXBAΖ@>o;;rr6^4K|,dUvz&Qc?Iy#ATmNӣz|GPtg 0yJhnirqm=Rq=\kAY4cYj~~eY~yhU&(Xĥi ztفT )y SEigQbzPڋ"JqCM1Q0nifZ[yF _40kmz0v1 =wqθn Ar 7e)Rn;Vu[h/&:Tq+;Uj"z=) Me֊JJŔV^ڊ4$d \ p'>ϛ+!f`нL<} 4(ܼIV]ϔ E]3:)znug8k$p#_o}Lp(+V,Y Tf4S:);v;lM`2HPTkN`2+jtgtVQk3+c(PK>٫A!#ZOBZ4z[:/{Ki Bxi*8̂h 6eHx[Fo3݈Z5RPy,HK<mcI~1NFlv_nE{-YynBl,Mdx֮؃&q|tA4?f\v~Xi[)Vyn,XmD4oȋ} 䤌OٗoKX=ӹFG8W!.ä!<Q$yd!A isM^<*fN њ,~)k/t冬C&"}Y k0o ͆Tk MOjMt2P"ܑ.ׅref?MQX%[l,.ip`9e^g`^h˺~Vha[vڜݷWwJn/u_`e@c" 2q (i*ۆUsB肂a>au?䤂;0/BH\UO-A)xBO5R 5B"ZQS&owL:< H3Zs= M`7B,L5V+F3ɘs_G9hx$ڹι9r7(9QJ(qZylvɳgqJj, 7"C+uMm[m Tde#5tA #|*V4-nλ%h!S9q-i(5?51 *TR1)smUS䴮_ Yh~ XEΒܛMlFOG֥p@1I<%?mr5e3_%>Ʌ6ghjKBY}LE 0P%!yJ?U#U ZcŚ:.s@:{R7r=~1]oxlb(뺗hGDw>ڌx"t,( @Ȕ4 ):KhBz\f &5mcZhDGdQ*bOC᥄?Ԭ im#uTfzۄ݊zNήɤ~=#2,.Qz4q}VԖtzSLoֵn 7O䮒c." 2Zr=K`X3my@6ؕyb]V0N b&-7gjvxط|{bğ iPcx}S}CHWUI~/twQ |8.o3hr(nu~U>=2XQ{5~hJs Ƅn<&bN'\qHZ''>4Tj#ؖe$bݓY JV]8%]> [yamW B aZȜTBX}phg]9~>fHEOJ__FF9N}nbv3M BRDÀ<˥^2;C܄=LS,+pQf1od5ͪĚaa*@}6OOtZT]N}]pj1!cBoou< GvyR]O P ¾6P~ʀ y9\DFAОbht{QK(,ڬEŰu-VW I!cQ}GGV"cqbRע<ī+<:I?=i](dF{dpgBMo8ȯʵ2/!@ǚ^'ڳ)B2A-V1Ϊ0V?_N'BGᦄy0J11#uaXSN:ĵp5h@;n<+- y/wՑ#<@ FpNOf.P0nh_͕BLʜ v-1"t ;̀Ud'2h}"g@}Jhh`Vp0cy!5\#v G^rTKT e6(~i^>Wvvtqu~v߃ {x~:T3nf>mpkYҴp|"H ]ɫ . ; |;/;! zsZ%Z}mr1)9 -)9.7az(/LmIh̴S? }KώK)8fhQR#+$l^Ov7ᦆjLnjv(<*.#OtrGpnxI]f$אz :\XwQ& orNZVaz\;M2AKnXE|Rj~ѡ}t[|:v<%w0BTd-cD݁l!ȎП@9 8Iv( 4/4%m0 U}zL;}ijOC%+Xn&BJv|scHh7#VN֣5͐G&chbxGr`zWg$ߐԟeǸfQ^q7jZ .6j_{ufAFU(_C^4Sn/>5 X̢$T T(Ys(&h!7=TNߘ~/L-MA^gaVP]痊j~498,n/ePW@ѬX `MA3kR4qX**`C"J,шxοTs-v1* ÿ\ze[EOV@\%/ 8}VDŽv6R-9JtcVƪ1ʼnܠ¥+c`^s\Gԩ]eu͞[Xȗ[مEٝ|Xq({kts)7o@mF>`)4,'L5(L HJo3okJZyJFgBpb ǩw  XJ3u NBU"%l u6iUKLt!2k$\BPz}9|h?\ y[ Ot$ReZk-\ !/<б;hn6LmwCaci4 ʄfeW*C1]?Q^UvzT\X؍?tn$Lz4,NLt6}hl+xa'&I~ј<2 \esѐ!4n@vl:GhLIb`?n Y;/x\ӬatpuxZ4~lI*./xt >tܣW ,M!}d: 1zŭor+^Dr1\ Z==Ov~,eZ4{2q+OqdVrĆU(?N@ݰꜭ,x7UN<^៹+2Vr4|q [:X~+A }-OiNMM^$F}%-\&1 XXȜCiSڍrhj-e R`t'p`rpxR%E̶s/E涓}\1 BʸƦgJM4P*r6 WA| hB9cZR٨K}DM&dH)Wr2üЫ_I̘V^qS5H-}[[f@aeo$cbTMuE$8>i2al >".;fK@OoiPڱ\c?ϑ`RP3t/Qr̺2/~O-c?qvg1nMd$A$$лA:[oۄȠPܖuNQSG%Zo*\13'jQ(^_;NR i-S9c̉w0#s([4tB,?6 CCGaԋ#LaVŊ0똒f\QM--Ru7y^2zU}1r|7]'\`6:k^pp>zS67]( !? 'A'Vt57ƒQù2 V{h%y}\}5bEg'x!"E ":Mh)n|*{\g yH5XsIJط|k+1 EۭLo8R5RMlfٔ-A;ړo4e?\҈.葿Fqa1@nVx`)rQ[ҨɆ )r|xG}q_t,|mZKvΘt,S잨!3.8*t3Vw$\c*KrNI,T;-50WDvvRT\@HԌm"DI>xF"ʽ:0{  [R0)'R4RKQÏF)jϓ x\_<=V rJھ+>8 #^5jX$lP"0FWaLDA"iBdJP{o+f >n{Ӎd( ܊̨w&jOT=n g/U 咐#p.`e3)6A tg;Kq;|Z&` ϒs {etm1R@?n8[lBJcl}-J|7Jǖ˻I$b{k#픏񷌦9?bYjgB ^a_yLU-Ǣm;b(BѰyKG/ӱaY4gͣ29\N4`?rFD(xxe3#%E"EMBTYǙ23NSK 8 c8!z}}C#yCl/?PK6Z SY@\- {3<+ |/V&{w`Zi)`U12I[6O䷊aU6E mߠAw:+F/qIr:FW|Qa)bC7=G߿E8,& EM zrQcyA6L̷&ZǾS<8[p"$ r{l/eҹ#`run 'adYVB|'q"a)P# _mO1xw]|`)G=F\Vؾ:b6Z$ ݜ[:(<?]3 VFTķdZ/[iR[$Os< !tUJD2THWen;uEa]znUrCU@yԟS(Λ(Cy$;K۸F؅zHp ְTJ;wKc٦*8*h:} l} =ْ; ?Mh o.&53nN .7<24]G_sdGSpH'ȕ%plV^҄#sn.k[8#"X5Ԝ= =eb˲/"ȶ  =HSчɽ{z LEՂ7~QCT$tf\ t:,|-QHkj1{=ݧ ~~ qmFԦ)./=_;'PO]XXt/.#fvU:G]bPn2 QB>.-u)17G&WJg7ma~ɠ@8&ՒQlHA%?iNjΣ7p8k텳<`ɇɧ9`c/sp5 q\ZCd PO ṃZAIHa/('t /KV:g}Wd wE?}dIG(|EtW@;*3ҡqU0)rvOxyM="bϗo.2m\d9f"qųǼ66g}ow;5"MuQ^VjcEZO0tgBħP`!f1w B_'NmĸDGLFKݧ;݌z6cvTa? *!%gH״\Ф<"q&9Av ]ĴB's2$W!K0g~bk'Go|.RWAx)9d 2%yIR Y,M\L;?ۜ곋<=T NdnXS4lCzSyo`KKmV3eK6|dxcN sk K~/S1r8:b'&.vX?juZuw.˸w}+dI>#m)b>|m }D\S֕]v:!&֧ypLOj|n>cV3d$d- rD1MC784ܘ|GvBJX9K3'̉|XK ٽOZbI;KO/g#/wxYCChDD, oQd^{;ya N7,1f;pz|[ i-vxeJQxY^y& T?(Zo^gV|MX>bM5@$L*E&J{ʪ[G:6@W7,H?ӬLYRR<@`PQL5%#㱨 ?hh~])~D#LNSjqɲ,'>^g8 |ڣitdzeݾK£% -2*}/\(sERJfJ#_E66k`,>9 z\"E'<5<טf)Uo,PwT4s*BbVur*$t0p^+\ISxש:ST/[ E[tY$ɓ!2'3+ aV-&ہqi{oSK<ɳsA_т&E&|ۂHU"xo$0,i3ꤵ=ȩKX_"@ɶwrNnzo=L4X4|"e~ U79.޲KD AH6A+3kzH16QVJY ÝݠIwĿ5@BXN9%OۻzI~8@ -|EDpε8)h CTkQ)r%]=sRWUmU]|:Ln%KmוՅXWJU쎕PNI9V7pn!{ pTE]JPe1 V=)⦈gTJ5-HړTUL)ӣ-hĐ@ ґ""S j|Y &ǛjUñd =%^4;:K;Kp9P9m:=N N/G Meui'7c ayP<R`c3t+X(维2|Hxa#pQdP\i{UQ4q.Ԉ9khf%)Ǯ_Aq!LUMkm0Wq֝w[v ͯeq"U-6RE93اaUʎ1z\WQ]bĪ,:7# hkHsb0ӂbdr؉WFiˁ+bBT =a\?[ŵ*N=Ԁ6gcl_&H@ĕ- ˕}!(r8L[7;=(~,8Qrt4Ltjs[ov;\j8o/oHK0֊ݛw =[j}&4L j爊h6nZtVqg]0U>]-ьiȉ3 du.+%S%8M*Y+ n3 +޳QZ;dϕ"3bxKX .( І9KvN %uUω?w/7EwO״b\(FInp¬ϊ'qqT۫4!t UMkմST,r+ÐS3 |aAv?-c g/z{9w>#g6 ^ы^f6|ĮP LUKpH EUI,g]_l ؜3uV  te=/O19YA/ZV ܉(ϝ_ Ex#@O)xO& rI}XQq30LŒQ wB/szy;hkon vvCR A`:PvfF>txս{l#WHS[P֟gs*=7% 1ᥴhsxZ6`fTZ\NzZu,yٹbKk*9I;1] }F4̹7ݏ;=Q3.pQ;*9:.qԂ*NAOvӸ%g5)R,Yz{1ݶWݦ-FԤ&;TR Cbp ZE G܂*IEM" ȣn:]WS$Z>/~ HrN\0mHl5Z]!A(,c&%GCo %rӶ*D[_a4lڙ+`eщUԷֶGa.p']?qC{P~+"~5M'$%dN8Q=?rؽ=.I^B,T 3`Oun.4m'r앷UjqF0 gP8B"Ǚ98trMڛ E`n UCϱB6<ژ `iks&_qD胲ڟfx'd_ Dq&X8W 9e!b2yW"A[Hn~)Jty(_%snN2Eе vǬ(9Wg*+@ XEUVYG WvO .1/ ( /'d('<6w0Q+r;W/Dt>W[s`{4|]aJ.$貦]WX H5Sd$,ǶZbrV[2}%T3ES "<qdUùgl2XH3w\F6kKikaFzy32CL>/X$y6E j;c)lګ٥o|P.=RJ|e2G>)|챩(%;ɚތݩįoʟt9o8{>UD}Dɥ `bx/6-Spzd R}PZbBCCN3m W"iHtA(GUrr^"@D@!=KsjP VkKhl7ym h0#v΂f"~43eaͧXnaD#rcp>{:vEkgYLVɪorm;dݙesmR٣2v#$ F4 Wb [,9n\3?{v˾)k,(؏`m@߱0M ˭nGh=#@HBNV:}sMUm$kO*B-3lE+"4Co 3;[ (>G<{y3QI(bZ{eJҋSr=)ml >>fa|@;:%z'9#L俎Y+>;^<e+I6C(.a^ߑ*q5H(8·1 ܛ)KjrC"oVnXըwLsk;Ѭ2PLDP/J,*y"/%KܻhW7[2A8G)V&zńtgD jl^G`_3Ivk-Llncěp [fbyqLp*K&N> _ D愭c8hMj'_+*,*֥n4E[eo0Jy?qdt_ܕ΋>6}_Gpy&j 8پd;W40{?3{syqQ*>opRqZ%YU沍r!P,߄5"`B)qZ8;˭B+c0޶ur=&Z'sD1l ˓\,5+w{$TtuS2 zGU.[`(+q8tN%K<0kZWh bAcU} `c4_#5.~𾙕e%=%'%$s'Ra4?Ŵc5v^nx}vɟdt!*+"lUSYUh@],WxzoE&ߢ sFIm 2& HY{i!KKMQDjj+GhulS xLW`, %CK7<Y#]Qe+i:ؗGvk#-/ewS;1("e!w36 BH C O :X&GOQMPW_lXaܯH&X˵,^D6ᙠpE_74b@]9'8ɠDԷv;Y,nY+$q潞2n{մJ)eD l.."]҉ȇOF`nSHh쌤}7QS z ^QY(|vMj]+vO44up LY2 tgY~dy7Gc"kb u6jx5 hBd{P+O)ر/˜ ★}|X`k xr)Mո[)ZpqFjҪDQyMAV57H +mp霖(GuB\ i L57zf^UQFV>F]q}+wB`:]<~U*\ T\BkafeX*2u'%FR7PF핖.7F H%/жO3?G^sO5/Ye[VTͤ9r%(x8`Q^cݓq{2Rb]wʜ)YѢp|la/s"*rd,sv?/q a$?KnI㕻*E%!̝z ɚxۓ+ChBop* R 9o w~HWUr"'qՋ ^ZaYm4E"!5b LYnI__B`Ib*`7wr͕Qֲʡ™̔sg3ONSƛ~[S; Z{kzE Insȟ͒ׄ2TJRSU~ )V noY0"'t~WFHu^جZG CD 1'}/ ddʕVWUC 46Xnα uhUOC8;%PPxDJ"ZbܛE~/B宂s˦j:R2q z Ǟ_$#oҥ)a})ʛG їb6x-VId-|T*{yH1hb:_Kf}턩\;g@..v2K3<'ܓnC_i%`XgF5:s<9zk]BJ)*,_~ޯC{ɑe?eҏFq9w({@xisC|z5&ybk*+NUBOy MbjAP7#Ƌ|A@>ZHdx@HYE [&lD6ܞA'lǥ/u u Qdl,WZ-GvE$Ipv$F3Ʈu}DrJ$R&"ٳ"zSEH(`U6m@Mz6nVC<,b7/]Ԛ2 ,Ԗ*O\ EB{MK@s*jevDuΣh;̩T! `"Z3o@ RtA j36+o8 o%~cc8^-ڵ6|6>NL'm֚ SZ,ޮiI4- A)_PM6tAėȨjp4J(KNsè;< . P\(;&QehQ6إ<τ֝0}?x<3udx~KcLJVCŖĿVr"J"/]6s45q:~*edГx[i{þHvK+]Re4@,MR{q榜.t$2䮻uIa f xBXNܴp?WkRívS1u jZBiYȪMpp }gtM1/}K}jm((GNjQ4 [6B94ݙbWV%BOC=eGv+L]{P+/q$k:͵sIA.YxA\'}2^'=p1|kc9epo e~'9׵b;gHTLA^<<5 T7KQ\8ח>hEG_nQ؎ތƷo/*Q4_zqd#\|F69ЬJ&"G_ԏ -Fl1kgH1I5M%E㽑20Xg 7rxX[RY.u̦<oq#sڧ?7_$dez.M@3*["WwxWn09 wbL/ 2ד ԪGS 룡@i7{k }h@b<7tE:Mz%C7VZ ڧnm!tQ 䵑wq [4!`MG2 eJY}C0ɤ&5U,Pj.FV{vqU(P8ם+ӏR}n 44@7Ƽᵎbhjn$c0#xm|#҉$:.ez=b8lE{S':ş֏ 3҃}OVX1 -VžQZ6qg:_ DӼ-p$gQڄvP_]H_ !`mQ=8ALS٩[L͐tz."`8ccCR-ձ'lŨ Wu,MUM0|y9x?3|J3,Gvq>)w'~,sJF@8(ܦ^r@Ubf;l>[N ܩjzy'lD V X%|W"II; (+詪{^[JjJljݮ]@RY\"PUFP.$Jb!*$y7?y$F=&+R42Uə6)k VYyn!3HDЛRȦZ>%x xRO@#OLWۍT 'WU;{3L4jSCp(Q,U1: 9bbxl65+򝊇|k$L`Y[.ƍćG`y+Y!r?GV2)9˂Ѝ gOh]0 !+Y3T\)nY_}(wДeR{&zћt.\bC~fCLi_惚Ȁ' ls?JtOgrz箆΍mjj狅Vy~<|ń*خCuZ JIX,"~ֺFrlg*OwZ){K3"@i G `h - 2\jk\8̐)GMl㗊: vR͓.ӑ/đo@dFzpǜ̿݋6}V#'l.eBH?tͿ&!agr^1+Ù[Jժ{qG^S^ֹ 6r5xu5F eHf`wל[?PwjڔWjJgÔϾLUV- r7o b`>F*6秃nû_"D<mrc<䑉(ta*}y-g4g yCq?oN+Ϟie'7^e|jX1A<~h]"iX`4Te=B*,A3KrSCw3H@NIbČ+*i᢫}_ *I{ƹ{g?ͷZ.'e ;b l- V!vQm'At9.-'JJ~i\@Ziܬee֎Fc U$ܫ* TPK񌪿nUvѭ, 1:(ufZ-pO# ]I)#NʁOFmrX/1#-a?kDeRoo(KJy9[yԕ;uڸWE7&A)u:(0lL |-4ۮjO 0g AozwÜ\13'ӝCRBQ3;E`jVGy|`:v¶+,GA:Ya<Rkxns+٥ j(4!)vu&ISR&8ðП>KQGR.=VRNP[?a |gu2_1 ޒGb~'u='dsUk? ~?ͦ 0 |c#s%uCL\2[xŚk6VUc}9VٞOBCݕCx( @a iK#_u_]iI d FIӻn CRKaIt9$*4e:"J kMî/}? 2c+CW^+0bR5deA _u~w*BO3FnRȽ w ٜVeV还nB=AcF+:{H:ܮC|fȐ$Qס ]K7咊ֵնQ !Tu+qB-ڌW=fh?ā6FW}٪~]g ;眖a oQpw.I-{{.3 ֗LBS7Uek?M-՛ %f5gݜ#46u.ٛe0%eLMGb+5B-X1)4J?L:?3bk8El߱Q ;u{Υo>7f')fwӶƷ5a+.,˘q}JG;sʞ3 h ۈAoXqR44\=Z)ۄ96MGgd.]uRY u5̯0<ЅXeQLR ]p<;+.{j29f]0j'R(XwٗdݹM# #j@!" \B:{ 冫LDZd95,:620@TGB6R.q`!F P$]>Dt&E#W_J,XV3Jz)$W'%,NJJ2cFGISd{ц^O1MqV(L{2zAh@$ [-=djEQCz%H O&Pm$nAJ>\;U%֫z)!;Wnt2VP: V-m#-}t6aFR8]ֺ6y\'&U1wXtF|gg=I?\j6BJf>R;qby2d`V&fs5ڽ:LT/juy D"/Iqrٖ-Z*G`|n+e wWWp Z^p:kQ~t-z,ZCG쬵 )|+Dܪr)~nL٥Vvhn !_ѹϤjZ3COu _ JkXs+D4xڝG"`]![ա5<ڝ!)e^(_kq[>qf]6]~!(i 2M*,(UeHՀ.7v-O@jw. ^-,>;dkkwZ`jʻ7fJ<%mGŚ]&jz~[UW0LОcJ/K|D9kv+ˍ:uo9ZENa{އc\i1Ұ5Ů~9|5ied;]Zћ;=q5npÛpA2l3W#՟ƪ7jP>{À^V#{Ip]Z)5 *5x)߇~jsgϡf[(0 VI;, |"a3%4{sw#qȓ.RblQ[ [2C2%26>$4fcJ欑s||uJ2qmV‚iO8 dVJk a/*dѾ:wd=, Jݘk؟zJ un@;װvB+jU*H'썈vY$(\^WMO|'scCye[;Ɩ˘ vo4I"ؤVus:d@0ITߩ8~kw|O.̾S*wA^ʴA @P*:Bz3U[K/Z($(O,rrg.*}oiHur3,6U~%!My?d@4q(j T1N2~Vd.ݕ&rM^dYHArlSA{//Xqᡶ4  %۸xu _.|fF7k-TBV~ɲ?ߢG sr=M*qcl1u-R8@hʽ{%)ia^,b@/OE]+C vaCM"tqH20eFahs*T`$8]ĥ|ϡI1 S"x_xzD "/h`D} [r)t-q]A/mVՂ"okcͺ(ғ @1,Tx;Ihnyհ8(7./ L,v/ewu)%j&ОIbN6Ht83pS ?E2"0ODLvP0{rߔG5-<&%AlQL+N|vRMQB}tcrӣtޔˊmd4!PHcH$}äGQ+0@jO=B?U@x@Iu@8qvUCb4%ƤSKSAvkl%yEzHmw-d.xY۶YM|ti s^VuJW$kLmDG|aҊOaSKm 9qȡ gY z篴%oX*2J:L|/C28$2QV!A[/ʇD4Hx}.ѭLgXD;״f9'ED7䰌sy4GI NRß>Ducc?0}*TUkuq c[jZ Y.?.#DPMO!M]P` &s/-Q#WTׄ6Voѓˊ#u} }sjDx1"F"IT?WNa.w~ت:N2]]I|ҾX<f{ܺ.eHqG1sϞj :E}.d$9u=@6I( r"ziv^W]Vl^B4%Ρ#X ;t(EZ%w UB$P& aRKd锝~@9&f.M * GR+.tRjc%f7QxY峫u.O*J (*P-FTfsFPv.1ڬgRBcMf}2VC: t44HPrî:=!7JFD>[J߮݁kwhF S҃qU7Z$h] ME(*Dx$SW4mNK+>A_9 ̎4_^_~̚Ň, (ø+3xΆ:HGJ^>^R]?"h=兡!ҩuPl+GYlڢ9 6Y'vhEPbĵd D!_~ 3n)Q /[# cJ?׬ w HZZvn*$"7 @YBp,ag&s c'yRm\De|>a]5X 4-YR6 xI6_^hO6Vr%ב*,z  ,F&?6xM[*A𰀅2ș (_7E1?=JV?SPtؗꥳCyep g4MGL>|"ٻM14Mg_H;2oJNÜ_NF\*$ۚ>#x.zI5< t85c19 𠇲=s>3G^D؝['|Ib$TuĂu! w, uuլ s9qM0w_U+R麢#rgWi8{D̈́F/p-Qb@.Gy/ٴ~~!ؠ:=% eBw;x_^|N9#2-Q/j?ҤO^oMlQ!,b |B dHo vx{"F*A?Oo,$//Mɀlzz|96Ke]nBP)Ÿ\h}\k{j7 )OOE-8¡˵w4EQ1 OۧTN\1_L)8{nxņ r){dQ x ZY8P٧Pϴz^C@4鉶j{1S8=S}aXmp#ӧJ@~U>Lj,"IIfe[JQ 1N7cLm)A8 dlƶT_.=NSV(Öe)[_ ?@p?9Qq=0,c"6Ԣ\"d] D tdcF'#Ļ4cRcaTr1*-x64= )C F@Uh&\_v80Sw[r[H:d}ŭO:z,noݸbo#kū@[l{nw1Yt7t 0^-q&mzV)xZb&@l"J50 ƔoIy-3z~oTܸaGL0۸mP! 4#q)CQy! @35`}j98x'L͸EVVاHŋ) _lgڭ{48*[M.'3_}S7IlPzB玫kv j*IVpMPOhjWwt-S#807dB}n#uDsAud =Ѐ!=24,p EUۓЎ`?;ͮ:n?W @b=QY =bZK\lx:渓TkkfM$0bj."{' 8䵊 WTt WFFLR9ny!BBMY< _"l6p~y6xNpžc "1 fy1^jS: kXߝ7*hjiB k(~v&$XS^*+ j9]bX"-봼4fI+1P &ڥb 6|@9("k|{f9nwk˺($;zq6L(- WKNugY`F`^*>wEqC狕e[?Uߪ^,YXZj0o cVh['XӛghRO&])vL;OQσfYO@i%.Li/V)rje8р=$bI -qT$dŗ 0/cS;f4D}T+2<.i~j5Wl>%b@[hUf'Su9AU=\MZK @z /b[&\O&WDH &z,B+c|CS+U_[}7?G**Zegpmq@-+ϣG)h~;:hRFǜa[?bI KV2m~ab p8׷|~4HmDT/gy}:Puh=u8"(<db`iߞJAeg֊L+Gvn\w{{duCWqi9h́YX At‡i*61[G_)+=ʊZ`B[AtNTYRo`%Fٕe0~ְFxpumlNy}P@& ´PgJu=|/D-FZ?A~C$7:o t69>V`I NDXfksGrY&/@b`wetޖ'f$p Nۙ}§%JzN֤̙n 1q[i_hgNs>JN!_ `elD'ٳCA\^G0Wm*)to4&oȯ>i<y Țu*@%ȭËL]W6ur\V5ÈR}FZ'Ռ끨ެ}0˙)t "٨^ldp!R]SN* NH kcAa\4B'0v`Ɓ*Wx 6G+߮rϦ6>A5|JJ}r4P"͎\Wя3<*O<^E{FجP~\+`z_~nҁ-:$"bd2|mkMZE|IӓJfq!T=}Ŵ9Ute>'L3oJ&RWɿ UW!(L}gLeET9aMJ2~.&s\x6 d|idjܝDCU#U-ל+CpӚo~K]0léh"@yRvţ ЉDm&".oNۭƽhQ_5'm8PdpD(|R-󬶈XxU<}t :,l uK!SW.0yɏ8jdA,U-2Ed@Upo9m]#?;[Mn­؝zo&w]4 WpRD=ӑ 2ZNt_&<`(i>X X?75~t 3}]LX(.J#ue܏@Mٌ5qG"Z@ w9[gQoPH؛o>qs>N k_~NQ#5Ưx)AgIs)P>fa[z eL0!_Ӟ&&%Sک8^#\cNX8 ,#Ғ \Ʉ6njSKAEӳ3'Z >u,:iLͱCk4藍=qRn6ņKbjt[A1 gw1Ɗ:K֔չ.(P6ٕ3sܡYGp2zFܻw(͍&@6Qkv/1/y7Q8*8sCpq 60 LѪuݯPNo{( G- 0e!̌ G"1TLelo yA?#Ty[ `Ѕ:sBHj9h5%E9q*dCqJW/ ΅ +`Xj+,-,WjMO͢-L85¤2ӊ |;i{ >!h(YƵؒ(#O]=a4?b[l*Kݒue%AMCF6Y7)3B(OA@t=uYO<%+,b @JļZ V;!k!a&s7xZ!HKGGo>¯bR>FQ-_dEʅh/nK8fp1$bUK^Ma0N|1DeނUuiIɐ/9@^[İ lcFzEѿK%`Sb+=yJ݆P czՏ|높]AC@*k~>4U2;rO1ڗX27]≻Ç-,$'nFd(+A 6 pVƅcQV648C ț[\Y:t t\Bn6 dMi%*FS T-=ݔ$+$/> 8A~e~:{EۘΠ*j%SSkF7mC3.M1Gs?Pԧ( K-4:ys٫D`˧l=V99'~DVӞmj_Vƿ+SuXN=*xAo*g?,RGhH,:9H3Ŀw!{(/LϹ97(0P#(؅uQWT 'I~K91Y8fB6ֿZ\SZ|:`Ƚ~q0 VۍXO 6SE\x MCQcIbL] *̢ ^,6Q7OA bO>i豽Np3"8#|cktgޒ -`ޝmO'>`!<7&H=kc`Os`uiPXE15 ѨxRAјhn4.:bTF46DvNG?L ;-2,#6ʃfmv.Kp,soZ?n;hEʜN ..mu9.6ؚ T vJkg>fwfi@&"=␂*񇅘~=K*`IOF9-dŝ } H3ͩ[Mxv 4f)ixId#m[{2%;?DvrKZDw3M#]kל'! W.PA"xyhYLlv:aX qu۝4VI8nCE7FHq+neiTMfI82!'K۽ ?nzA2ޟсUGv_G#4@ NӋL-(Krvϊ,79S珃ڭuD%/~Tf STEGX`|Ѹ ?BNv5?̈́cP.ȥ^TtӶ(c^PyXL#w\̸%uJseޝj&u8E;L/ @0V~1\fず4IרPze4$G]4Fek? =v 7X`oks aRߙcÈGy 8Olr.hk'*FplVLXSeyK[Cyv6 8c˦(ʝU-T0TϥچZ ހ@{neMz^BQ+Z[wm>[S  gQv/*G\e0LF[BٜMX>ɢ 1@"}܎¹TCPB1י 7w1Wr?)v=̐ݤ-&9E5ixn1K9UɃ4*sQ@ʞ7V;l L\6PI9ɡ.5@ۙ= (pM _h_N*mCMx&("sQo* 9&#~ ;)G F47},+2iݦnW v:2#Ѕ{܍r=[085ol'OR#c7%_V9Fa1??-@;tu Kwn[zCxEa%B]n%6F3K Uے۴ljlg3?tf℡QnarWKCPc|%u$IM c<{br%2k3v@Yi?ޔ[ fs0-&[6=oa"=Qb(4  ɅEzRWaOV=BDA4!ڒZw^uF c;3 4S^ǟT8%[pYn!0>ׇv}n=4lE퓡mԎfN=IO49NcxEMk[3OU1%:nő )Eإ ]x c 8G1-+C6p'xDz G\&8!yHH\ndm+ηw!ByMhceZK4e_b*DG`Jb3\B2Fչ[.@øTNQݑ<-m _(=ՌWKPGڱK~'y*߱_0&ы?^Vt3צg?mќzuB1hVCo&Nǹ x0BFA  Lha7n ~h|jܴtfnRa\ ;Cm!W0Mhj?ɽ00TwjF ճ<0GRU-Bk\d9ް?#ޞ YڍxEd/9Koʲ3,iT b흏U,bmq4 MCl4'GF݀|Z{`E Yb،5a!+2B|҈IÖ14GE\ 8VsI ui.)ɠ/ ΐc%ιT8pX8A=3I1_,ZW-͸RWy Ac F^TLycR.a"Mw@[2/"k}W !";~Uյ,I7mPy^O=r>Zo<5f!7 oOՃ9J\꽈YoPf}O'|oV&fސA)kX3PG+?pGf+7QJ<']YLB1vR<0wBZd2I{#+*J,%rl|ӏqhK>n̪Ob\37p:p%j2*F]XmcvWjgh&WmXalԐE\ud\cҞ6osאҞ?eBr93l O,NǑ?{ޑ4ṽ: Ью ]bk.&`-ҴY mY"X&OW5+gT.]0:n `PܘX6Uz ם( Dmyyy{SuTY!ƱzM;4$V.0ofg\(Md󟘲b6܀K"ֳvmZg|Ŵk8 ȤiR{IՒQj HJ-ncBg2m:$;Z`H*S+b#mՋW}]qNWsq7F՜8QUoB#_\JB|<3+pe&i?p&&Ȅw amtBM]g\*)p$STBoVj IrI+S&au:L} DMg;:^uRg9YUUt%G|ɢv(S!0mR9Y+"p}\qG ob@dkH3=m 0wb a.Frs{K5CH* tfH"EVe3@-l|GR&{7σ!N O_1M)go*F~u>秶\qAl|-5_Gܛ-\*(P vTxos"RTgv6%rs˕av lç<KҒƗmKr ݁TNZ2u _U/z4:^2=ꄅIi7RaϺ/e;:FgNGUB%o@HX;A?ЪQ=>d4q y'9럀i`wju80 eABF78GL.H=Yg<]dG2? 3:^[ CR8erیor6z.v[(,${^giGZbX0!޺VETK}-Ma 5El 4y:">A ؊is@*ȷ]O3Xac›q~naJݩ&]f?]Fo nt|GZ2E9Ի\Ό8;*u'ŵ&V%7Y/a<$rWVR}*?Pװ7v G*}WNp )הb$a |*=;:ׅe1@n@: }"m!e[BHlPe3Kw8LnaW" @CR@zCyK-Mȹ#BkˆwH}lZFW1y#2\9[H2!Iw;`$$x7֭4(H!'XNd^\KX(ċҒk\2 3v yW^e^!5#|1b%Q'd3%X%˘Kd~|0zS1d;D6X4QFdEU?{$΀@&Gm?=Z0󡋼jF6E@Ԯp;ؙ^p4[4^nM9ë[_D߃Dn a/Ul\uNEa>mŪ )RS)b0^_S[vSFo| 8I.b~ح asp91+ztW2CBA4E" />QW>*N@ide\K_KԄ8-~ɘˮ 2} *cl2`0reRPD.hTsĴj"4,Qn21|!K5g$CyJcG Dqi0>/`!d"C z0\&LHw.Jdž^wm`oDMIndQE[&:m$~ɯ#u&u7b}aTnP*F Kn*\+}g_* #A2ZU\vyo9p8O<[s(Zb>ĺa+9XJ p1RjWWPkI#Ph]WTTN9 yIYHa CIq\=K[~ƌ:)>nϬZ߳`.ju(8H7!4\ܛk5L. Z6!Bu$u1z#Q#FŘ޿郲[uϐ/g!vQ"lA: ϹjXϬ^6u)D͈&p0 "vUbq4xlɊE/%(n3ݺD)_0s6i2\4њK Dj0E!bf]䶔354kUx3g$nQ›gkw;Ii>!KW4WuN JJL `[ѮiT eGi"IVZ80t^BRՎ8b(He1\rfiӺ<=w ~UT4*:Z# z5VŊsX74Tk&G7Z:gT͘ m*:*a61k`Hg fV(Ck7Un kc!R[K3*MDق0`БY2Է/U'%yoie -H|. p?Vwv" gXyjM,lw>CB;pċ, J $t %tdXq5s`宦1~(..qq2 ~Rv ]7՚VDrAˌx{,Rۨ 2@1*>=Yw[, Oa؝% `Yl@]Ϳh(K^hqoeH8 hXŠA"htPv&r]hYX2inD Z)i$v"u6ݔIXS Iuڬb; Cm ڵE[!%=tĊ`pL{Z-THBJ&.h%bK;]{TK;W$r0χ4,>{p4ļzqp`e8&z?bɊN&) tkJ? P!AOSfD'~>/.fUؿs7y'?$Ш%bUjb 7fJ,aKwѱ5GLO`X-W/r%*FG.ֻХ}1غE M4/釪@" Шglҕ)<,BgjuMjRkOi K=pGRx*߀d 18n:9XqiCĬ9 BjK.omYQbP61 (eڙI$a+o N=ي%i޾˒U.K7JV741b~JF v몏@1`I@= _2sQhoJNgǮeq?z`$+r7 !G^:t+neyz2Hz|Φ zS_\ bѶ?&TO#,d"lDDzq_F P*_kO [9Su^;9E O5w w?cpk+gƱ"Ę\2vʢpF bcUIPH8+JJTE7.#UڀT]"*twE 7 6|N@u^ieN/O:4H!= bb>DݨFjs:a`l8cܬ&"M <x!ت0{#] k/Im?׶e*,fѬʩJ'N1Qg/nP55+vs~A!]@e5^pMAjbAzjI-.,Çn 5>yգ qz},(˜=?z2+3F:䷧`"Ju欿EH,fZL,Kx/g~C]ϋ}T0C;eet]jÑ]0559j[$敜hEr4(6PX]f_v& .[(DFTH@"vlX TzoIC!A$C+uƚ}\}7 0tO*1/4G+7 H8l3b}d$ U+<#TbW*('I]/P˝]Qp2/ΜjJ;&chVS[@a]҄=3ԽZ5΄"5,Zv1E~mρs*AJa1tfĺ_rZ=2c/{Phuw$JjL*;&R;uoݱA7++`]UESz_ +%7Vb7 \L8A)q2 ~c> N+P:'!FV*AuE64Ѹ[Gp\yVy؟~8 ZvZTWvgW;s1`}&u1K{XA_xp93VYQ ;N)Od&zą{^Z'7 u%5AU]h5dfP]rD <U.MW7K0G̓c$ϕw#f^ $;y;]!D(P j;;v=V +p_Ŏ1*emȈ0eR)Ɣ QHԟKiaIdIoc (Ӛ*E 5CS;N 8 Ehy/<7}}R,\|1I&?+{M_Ea(6wxd;B)$8#9y9lp~aʙ0-G˷ŀ! hSU;N3fB $ D zWs7’r;tF0ެco{>R7-:gk(52(^fKE0 SDHX^%+T2|D6ƷE0zq[b,]Gk+]MTـr6) |5he_;W]y5*X _{db zqLiE&ơ9uEV1,Nj{@ _XxLu&) #^%x腅/P:(@!Ha+G^xx;w_$rȘQawc_?'uRVDn| K:_+4#ZUZ){٭{!x:MH'[c6rMO[{Z}l9 L`$鲚QHjvpQՎCoִe ~ꀛJT5Z)[wY^dS@O['|ɒNf6ݑ}=lػ p_ָ!n2&^G.x% J`ZaB-3ڀxaCr"dǩ%hOM^Zj7e?r妰P]h 2%iog3Y`郯 0=mw02޶e[SYBn+&$L;#WȣWGH+{KH!pfc P^P"%ľtG #VV)UKե%#"|# k"vӷ\ҷs9BS:ݫ7Jsٰ 1/J^zLw&n02Zoh|yaq[<ۮ0ƏPDO4>4cwBTE\c~}5 V.9SCD㍋I3WR#}!z&IonO2:p1M';M4!m9B3E2n@+U<̔6r?$3$ ?Y{`$bg:*z!+hlT6i[Lw_2Y/"\ߩ,ጉ?NYz.ua < W():t_6d,tw+|>#fdOy`;I߄1wP$obzi~35ϡh62 zaL%hffgoaa٠f#`[[VpU`^$j#Dhʇ27?1ր$t XYTS&2ϝ0`XKwDrꛦ>'JBWH7R7J=wx$@b<FMƝZ!39e j8 PIw&GR-A,+ MyROI׆&6m"Z͘s(^H-*c犉]6Y!+'ZTUqSU1_,% cc`t|X`S6Wb}xqJ F#Y͏V |YTGA |1*1 i넉^M8z:s2dߛ~1v9?|_N XOٹ9su1A% 6=1Qpa?>|炲,pqsdi۔`0YL hMr !G7%;]{̚[9F 7_9]uº }IFt<{2]:64Ꙥ-+'It5]uÝajx5m :]"ۮ/JiLy:oLIRI 24 Sо0^EE&}q^\~MMjh)!#4 r~sBkLtab^L?p_-9^]L>dvO LA27zpb1B^W]QEM<Z_b zHNU+?K:/ -31$Eiʹ6s]u51dU"c01AʷT;ȷW9:!ڧyfdEwS) iqTp+1&J wLq2P=d +/RV]i.Mo1N7DGi|BV\97eN5Uw[*IDigo"_abV8F|[D mpD>8[L8PT2(&/J) ;q#C#yÚƜl05. @%$+U-nz I+m3kAd7cwsrY; rվ/BG>X}:%hCy۞؆0d,!yl۪FߺNK%*52x/YRir_6c/rBBO&9"<4uNR+:w+p̾pgAG#~>W&DRo[`x,rhexm< @ưj8/ Wv-Syp/6fSQ_K[Q م%VMwۂ+BQ>רbZꔗ8^۫YAwoؔ_ϯ q%ޚ+v"GKhVk]֮G59P=1 "v|? #{3z 4q)/R]sP6fqD Pg*"[Í֋{sPf& U"{B)g(͕< NNLO7=S`#|d_F'Z9]O>J-w%~z~iP폪yZ+'+){Neen.YTpbiQKYrTxME*9_}R 0m(Ǐaw С";(A#|U+Gp|jm'JnU39Evw7g]N$ﱭ=VG }ٷ &^5 *@)(!c=! hphʒaP|W$= a:FáJe=!0z Mep62Aؚ>&5$h^&X8u? }gk'-j_1ZFD<;M] t5:b\FրDn:POO טּg[bkˍ=B6bΕfπI:\cB1t2QQ{}e$E3}'= ԱKF6Nִχ$Y&NEwM%L^aZ/誳R 8R[(r* =#QOǷNbhBs;aqM@7'/#p=p=A]N>D?`4b,/0ha( a|KQ$; [d1'h9jl.vĦi T`i1zc;`áu%UՑTm 澎1$s8r3Q_\Ft3A?*KL _ ؾl1S#Nқ4ruR+U{{i5Krwna+L.0 ?/9IJFtYՇfVJbf ~HOo-4 Ƭhl k=(ڲb&AZt+j'j<2 ږjn Sjx,Xcu>t/ҭ݂ȦĚo?XVj(%0&^v~rtSSn |زG+j%!!5a {;t/@}s*-ѧeePK0HF++p=%NF̸meCq훕iEIn#˼ZsJНpj-Bqr7gA7ziJz4 C`Ѳ2:=\脫mn4SEsڗi {odY6a,)Ko`yGe7$$&7]z?1q^"Mؓk[[RQI 'i̓dXꜴƝ`B_[qHB7K;Z.[AIIhL&Fo!ĎѡB%6ʩJď:=8:I Ŝ  'H>31|JmlRּu0 Grnb+!W)d!H!+]Rۄ dwmB ɴ79[3zcAA'A`HYUV&w/) h\:i3qI@@]ԫN{swc;ՐJ.r-N+IAꔞ!opء2lQ|ocVXy&'*O+?O6e&a)0S?db#GGvʘc[$Z9>9TcQp_n6bM޸R .hLsDV$eΤ!윯֚7WX) _"@(TWy;X<¥+mHk@l3yǏרJ=c&-4f/{жxUqL ɋtl_":z ;2[ ,V޹tL iiYW^> Ϗ#,oKgcʩ2t (V)v,gZK>_&Ѻ`?ztj hl/rG()Zw!.\%  I ;ˆ#jXAɦ.GT*ֺ:Ѽ%ZĐmA8!Kh7`n|X)?$jT:UEԤ ~;J{W5M4؎:I(1/3m i[r]7ɤ1$ˏgh Bm6vu?Fw!@irAE 4Gpkd͠AyQFZ`y7"fQI[Ux3󭀘.$f?+9Iwfm%¼c>̀CKq4P4TeiHT$b3El3>pUӞw/*xSSٜueݙX-έ O=p=:QZŗ\c{بY%7Ph$fZ6rL:hG 'Pߎ3ΉrFE*Vc"C }x0噝]AoL[hIgwҨ)Dn~Kj_7J"au\m}[hA:j(h҄k<)#fL}`5bpy-Zm[-$C/k59*޾9*k25߃ Te7pjTZU6Tm\Vb<>/*>8vS0_HD2d?R-"GZe4_G:fA+E."4h5?9 M3嶚4u,Vht8+=PIX3f+¼ ՌƯ5b5H4C$Aw:GA/Q0NY`=!J+*GYؔnx0 >C4]$Ԛ\E(>/$ly Z\.n=g8N;X3nGv8au@xML\IKuH`0?fz#$sfﻏLܨް6  R:A7YT@莑;mıd{\ wTxI~ ^bSL*gNRpg^,19&82rg5}pBb ROkNxV .QbVI܇.3(%Iǿj\@Obgt|jR+(oEJRJ' å>n@?6%Bzހf.Xu,kQ-AQ8Nqy^z%cV}qDHM#ng 2f 1GG`R9e_|7ޱH׸uNmd/h0(,X[ ImfY=TZL|~/qY\XEG"G΃KK;FQĄ5?n{ |4>]L,PEةk"JQTT*ړl<᫔ )^|4[ͨ3?l`Rvzo牪Њ/1'QZW(м3VL<0H˦] r3aFl\11RSN㖪np[]AП4F$Ӧ M$v"$dES12 ^a^ TN,Ex 3E9i=jȞXsp=#lC ^o^2/hq4}_Ж5I9vn;#9K.-WIڣY93:MIO+Iĺ=M҆ֆ si@5Z ]3`ѓmo^S۬#DdDM/ t.t6'SҞ,gˍ6"ZXcfm^1YJɼ[VN7!1ѵ3&%xzѸ?2F2%gd<7H͏[^iz21.mySE SGIG;цoq[.)73jx +O)B2𤟨Zvh ߥn"ؿs/LЉ7-N;߹Ndh X'8k(60!8ى=ۚ!vJU9Di]O HM.x@Im˩^pQIfAOt%[^/UKV(P"he'dֆ- @!)a 0 f}.;D$[RD*[~Yi!Al)`|KF?,\@.Ghh%0ab׌̒`x-L%9k5.$WQLČלƭ%Rf@uO3]p>)ސ-#rߌE#D  vp ~.-Z Nο3r9l(; waِJzO:H=Q*  PAMC Q7|NP2B_1 "9sJ}sd^CH"~7ƈutpi">u,þ?kev`JcO{?{ZbY b`?\G.NŅDl Œ [HD/'&Cu)dQOn~OT(pW.ЬB5ϤP .˔ݼ,ϐEt_{wQ i, +l9xjQ 'VVhQ'u$́#o)z7kAۈc8YԿ֥ I*d7ZL\< םL 䝮ܮufVr>0&KʟyÉa oҥmFNhbA-qڝZ9.@,V72+x0Ҽ}trҼD-爎xI8rF | hl WhID1Kʍ+9L%҃\]M3О"w2g2lrw~Gbk253kwep/ + KZI_UC$-5})i#$k?/Su'Z1 16~IL;drp3V }PA+2U߀y GsK =hFpd!|2\zkhO i"0L}8TFwr'oYsGYV wq纬SZXx|g3!W`\1N VFa$l1tfԑ$sCfW6%)D|<ٶZ\fo^ @q*ZLJn3!rrVJWb&a?Ï0!@RzVn8 ͆/J&p1;ę9=#YwGE ׎(QS)R 8!iIm> Awk>7jG0dceN^'fn?ָU‡qX !-RiN.rDž| & -hF)Kx[b+L+k^7osR[Q^ f%!9"᷶^L1ڳB!Y1B؟#C>?jūg~gFk'Jl/oVm z g[RtՑ =،mƪ6=v͌-nXpNp`+j \.!xiAAwYFUkYDatMR (q<& dM'7PFCJ霟K'JZlwmKR`coQ kV,$,6_5yf+T 0k''Tq,-R-iУR+wz(ߨ)/:O@Op Ha%TފGPHϚ͟QUǥdN!_4{kRبAԨ9S߿/\Wa2mgPmžjnL %ײXȬ M)L2DkBƽr\`n']k=x#!Oƛ7ㅣ;JHg#hwx$r-#^**:CâҵaIs_UJq9,pJOO!6,?<TPM5 R_%>=kOlqC%\;iL`$N T摨 H˙*ݐ%d ȸiLE d_qwNpHȗ8@%j4aM}։8(^m} V$enLg澿il$ӝ7ūE`4Par2^CYHOzw=u96 8]$d*Ya@v,pat!lh$7߯S*Ck%,,+0N vƕnyp(%gNr'dnw]ʻ ڳF]tD#t(f {圶 uWa$٦Ŗ͙)0O4h=􃋏 |hzI(>Vv@rd'=R8F][gSէLP67 S4T;l{خzˇKffFp6!8jF}Xk2 ZT@e"5_*eE}1D&9VLq͓!bW7uu:T8ZP WObB|RۊBCoJ-r]W-˭}eh՟0 r y9tb\7'WHm7(#g,%ZyMeT2ջ R̼-W]5ѹ"%QvAhY:r׵)@?KQY(|1'upg[*+jG/2IZxr- {@mM1l ֭ Fjt"CX'5TT2˷F?QNN(c)Ƌ;^ًٱ0oPn yGr%%t9RP^|uDs/2[] u"g|cf[)bDZ3U*}{6meXw>WH(jW3i|8TN\ۻ&.$1iE:gr=-,pܖpN}u".S;0+_ap/\A<$=;e'8-Pxk-eq!/(z&JhM{WeIylS= G;ħZ4ap8@c7C!ƻ`90̢T[}ۓdy@>ޓjVEPښtro;5=m&]"&izb~m J6FOA5>$XSĢnY,WS\-_'[vbf_ P ?5%e;&GDtQ'Ġ glC:615Hϲğ.[xQ͐-$_0eTjř ATzYv'hL\DI$ⷽD+L;0BŒs>ҍ(=Qyߣ!"Om@ԛyŽ! Uӫ0&lx8xW A{(4.vPw j4b |&]w +7M#QzV6))mJZ$wyyo3ꣿuňӊwJWh F2`Έ9y [(4xޛt,c7AHs.<וgp]ZWSs\un6"}c{!W921]Q2g@n (3Rf2~0`3UXdII(<%.i =f2bG/ +!ǝVΙ ϔ_DuH(^zT1jbbv[=0K $-XAW<*djQ{Yg qJ$ Ğ̘*@xUR_tBowA&$~kQj ᴮ(X^}VND_j72X>|qZ>sx~6Œ5$N$8rLj#蚲һ-BEڛyH ܭzC"V,tctkYTi|Ij ``@Y>r*?bWRc2fKv[ozU~ E-kUXQtmGX:?Ae}{ck'|8Q8L#a~1.ͳoؗ睪( iDE7^e;&zFf{D=}PO6ʢ7sJWONbF>Z@\!X4('+n3f0&QY^YYfp&.JӫG S4]&,<,2y3zQ4+fܑ&C1.zspDw֢a퇒W,wDںH^ 4 I3p1ޞSiJOҕ va=_e*x-e`V"j 6K7'2"oȠxoKk`Qg@n0s о}hCʈCQQ+AnlEVmeZ`pNJh%GZ6 뢎aB ~tz?0^xl/6BJc Yחe ,?J]veX-8pa #W |G =(U>;P \bl, ᝜5*(2gs.f9{RH1e"/}l߮wŇ~RosĮ/c- [GO/SXHxӴA8+qԞfжlշ ϟCQ+I%IMP*0nMų:@@Hk\ODJ̜]5crXlf<vy\%/ P rR*K*khO˜_Oc,ͨ5 VJ{ _SºrgbVW됲7 ]mQW^ZxxI``qʶ3K&%5"k3jU. UF9dAe;ꝃ@AUw'Mg.)`dK: 0O ~v{a>,mx%W66m:sq lK#1zڪr& Czj.-.WzU;01YH{wДw6n~iWeo:J5Uɲ+j A='q,ٶ种c}d/u4ᦶR@30q]qp[ĩ$2?§ۇZmp՛$uAOj=6Z`ʁG`ι/#KaR7{wEJ Mդ)^NTS!r Tw̃Wo}Q3>()ҏavu1ڮZ{yr$k[wۻuBӲqDIeSS)Gmy!{q=Q~@>ᦪL6pځ袌/$d&`þi?YW T=q?M,?~É𮐌mzZx̝@|fa<0tuNݸ +i,Og*FGV96~ͅO f?71r<_b z)r'OϒN071֣;N6D9L%?Lhp~er|n_ 9}%;Q {^8Wxp ԅiʎ;H;a#^3ꟃk$P1bG(n+An.%e_ kKsG[4gQ_2utx0XK<'9gVN`HxyD8Oa8P3E0yD < ĴlCbmp"6Lj>>gt.E*ʺ8-X閶R#ERR!Wxg=w!I=7-.`>[hlTQ'O͈g\d'SOgr * u\\ _;K `%KEgI2 ?"&jr/SӁk ӄx]ݓlx^xH07l|<6 ?SxX8!v"7`DWX{\IMifGz>>\ZJ1<ubcĠA*Ntkd}MT2^{G4pi{gy0n47 }J[SmœnX`$ېx" -31Ro]j@l,ck_* #Q}DdEn.!WireƤǐF@gCtD6R&e(^t"ݮ>NE|Z$m!F+`',(N Ӕ/!9?Vsj%(2 S4Z+dTb=Y$*"0kA)m.!)x,8)MAꯚ8>Vj\jKT 3"\LAcxZ ҳP(o-Ɛק=OCxLJ7Qڸ;m[L '3?tޖ\ÞF"ԗY("%C6ڦ! Md,Gʯj1C~5BڂJRˊ$1 `ߗʏ@U\в|FKzzUѻ3 %xNz ɈgL$8RۍA+G珃B3PL;x)EwJ݋yWb1?<{X#NJ11}(sl<ɴОCBwFY-kTY]{r(co :&$nx5)0N/d9+ B+ͨ8+izc%bpX@0q># SIipl20ȕ˙8mߛ[R`]2F)b$Q/sJoHBـ36 N2cPw2=vwd!0Jv!]_̦hEr2ύ )n\')_!"þJM]s.q\$NW`ft@1XD'yɨȇu"X(^7/_8 A$4π+/\P8)cӹ({ k3aOxnMfw=x=yJx Ga懋|Q^L*jG}=M(tώw!6cQy"ⶠ@$N뿉(xuq+g6ǘ -:oh Ivj5w=s|E!$7NQvQx@h] Zo.]T ཹOA+p ]&YNL8ƼǸغ }=,wigvw%ɲ*s0U?Vu¹﫧Fye;PmaJmIM>@e;' Lmbꏥ`16^5i+Z,&fye;Njg8QMцt`ddn[v|7SO;& JkLE)ژdb\mVV[D=2( (È {1 :%(D&J7kljK(H8r7 etHrnO|/틱ֆewMːJҳ!m$^{?{yT= rOEJU@R$ ^yiV9;$Ț{lfh!_)ٖߛ1\R,~t۟0nfmiFM-p2YY %d9EbZY[C:=BK}A^tl( iy`ږTB@>aLym'uG85Q+{k~ЅlQb pOɦ@=KR%!I(&bWa>Ej ? 3 {;tE[?ev/~CK&|FnP1tRUae젫ޝk8gXhI6;IvuOd,/xfgm|˸bn0sju7+ ݸ Px5Wm y|&-3&dYp*Rpްl3M9r0䭙I{-7 Uۡ-^NHcZEfp+9Ȗ?趩t¼ECERls9@oGC`iQuC`MN~7D L5a%U4n< vJqХb3s /Q'|Vө؝7 [3:s#R6'PILsZ }~.СJ*'2R*APfW^<%Y 21h-!b|UQPsd7jjCYE^3?_qZN|+&nO|M(g]1]ZdX{ gRbK##v (EKk8M tFn'am2 KѰ[1V-Sڒ[ fwdIz~F|}O0*AGsJ; f`*Í|9o-'Z^oEI؝Ƚ^B o*s p9j0YQlQ`U7 ݟLK4u6él{끢-6ucuP?TDȥ_rGtݸdU$U]"h|>Z syϤ_[JMfsjϡ< Ȣ@qUn~-u+%f Ϲieˤ̟rá(6tFAݡz}}½i"2r#̹c5PpSD(07ߑȈgeќdG2 ՐȈ<iƒu&;au@LG [Kz 1L.Q#h抟[n xj)wbbfS U SAݚ5l5?$$ WWVle&OR'7_A 17pg?lL{:6S4l|AC8؏6vH?|(__l4JS qyGNP[ڔ9EtԖYP \m5 Ԧ2DwoI"sPm0h.d۞Q@0ƃi*lҎ{)ʘx+By7y5cZi|'tq0bwN%uF,6'WÎҫ8Dm$Syy!IW2G*5Rʨ=uJ9nbWwhG'ip&2>nf k=i[kIK?,|tRB$俷PinЯK`# Y4VzTDȷYw#W}}£7L`_)Q iFr^M`j-]O9;1kׇN4EE@1^;t ?_/奰KۨVQFrcQ$ec-no0Y* ӢiWqqUNoU`CKKF{:!vS 0tj1"YΤ:^=~9q*/:S'Y+Hk&W y,֗c;hAhd+5j6_t &83kcքB[ H+kZZ}*,97fbEnHԙʶreCE ɿac X}D+i_d^(72WQP U T|A./)ԒMmlF7av9A.K3^_§&՟\>3jھ/E[^B_{ S\6>_KOU f@)EL p'df^:("zUyTb21YK˱\a$ڦ"}$Wί[3%-¤%" Q%9}0X^Tto"7UĢl#fY]gJܿכ prqVMVi:Uh _g eYEXꆬK}p0bc9qSC}x+2V3 6mP@)K7Y4Q:*OY4f"% u )Z*q`||to6Uao`݋Kj pMg"9k,Ry|Yaf63ەxݼMh֒g-j鐖 HXJjˢ@iV0 `&r|bsFiad뫖_,XpyasWsM?jċq=4ö{PजƸ&/VeqA18U֧vJY95-[!Ao h:N򻠲D '24 B`P'cG$bTQ-&0pr"͒["W P$#Λt%MIkx fjtpGy?<ƏI%?%LXV;nJX.JnzǑʙCn=eڳ ̃ W<@@ЯVz.GLҩ`wrod.ZwǏ; + ?TpSpz<`C.Z>ʞ I8y]lcΚWQ KL@TÀSAsb!o]rHTY5k}?T{_fMl3 3R(>ǿL& azL:x;J\= ˙,zT@#[? l.?Gpj߆6T_O↼?f$wyաB/=@Ű?)٨ݔ]:\*НA|]wm MY0HdR4WH$3l*;B ߱->7S͇S76.*$ˈ)3:3t^*k3Feٙ#3Cg{5"UUIƌh䟍w1ONb֋"Aʅ˙ [o)_FЕ{Rxz ZUL)-.kCev5i%%ȭaC~=)XijIѰfą?0z{lMZpƪ}%} J>z1Rf:@OφD>̈w!}#FW D !r!F;DIԼ>ALa=ۣ6qF_{9{<g-yp__c6Tz4t(W'ɻF S%ݹkA3=6,mQ+-24GK])ȍq B.S8@qS -ՎOZ6Q+ 0K Ύ80T6zhj'%ݔ/]Ir˔ӪzLFјF#5( xvz".Y &s?쟚=k ~7!)fPѐ <,+k,QQqYBvWpld)y.K>H7'pL{CI\gH畚Pd/z>߻ITu5lq)│7f4[,3/.[aDȥ/6~D7b q:Nhl)Cǣ9vta@߇E^.HlXs4**Щop[V7nS1Z3ݡ<$m,(tc;YnrXm'wmOށKq0trthj}p*#nv4?`{$e3"-]̝pՅ-`0&.%1rV O)cڶHpv \~N!Lfay mvF`J`ߪ/|,z*z{_-PalX٤_oV}_@>a[HQ ?)Ij&jT^O.Vh#HP#{2- #+=n _Rn8aEMӕk;I#[oW67x:Qz px-Y~Bd(J{"kBq\f@y+RokQ!mƬu=W%qNG6fb-T"|Ye-œj#yrZLg݆k' sY/v[0`޸8a\7'V5e ?9 nVcE 1AS/I*bxs~bjeu\kDvmIx[MzږO C.ӶB֭uɭbI_|k O;g*O7fq,6 "7u$.FF(?'e~JL4}l"H;Q^F'KN&v+U&.29>T(UQ)G:oXJZL&j׆閡O,ؠ5!Iг T`-`(NW7_8殗Xa̮=rqjοi氯s0E%TEH'5P #Ѽ,j5ŘhΣŎkkm'P$y(5ͰxDց*epmod@Q%iz Z\6dSZ# o^kdE8N=I&}PV˱90!IQ9b}Iϣ;6:/}r^Ey =J\1NTx1qxqp7X7m|3T>=8Ti%Hz}W ,L)qVzc_ x-'Qk)W7:pQd;?_^w\L PqBQ%h. &taeyGMfRH~#0[9d}՝/Fxf4|r C c,ࢀCU{bE'WxX#VbQYw׿<<#\ G9)e욷$/q,X!!ĺq2/aBWZF+ jrZ};b)߬r2Ey Dwl@jè?cDGw%FCjZ\HvBJɢ`r8u8ø5lkiB'n:6? De?h3NNP&E\t`ΛC&Fb뱞k` IҙSѱ4p E ?w[0fdlPOaxNC<1.]ōС(0uwfN}!a!$!ͱ2 n+%mXz*'hSM(?A*7.ZdVI4[xl nv /1i(V›݉U]'Se:l=eq9d!&.'P8 U|n;ꅼ_TKlV@эz9ob<04MF|ըAvI?: 8!4k Uⱥ‰ˉ4>/ˇ!oq1ͷ1bK(i~IHX@-a4ܖ0Bzz 6Bjr:[yU *`QTULCPC?vu( )Cf ) }ygIpVLӉΞэF_ue£d}z?Xo"|39_9? q B3{/KP[o*u^z<-XLIQ $C^&  hd'v8ɶ|tV)ڄRe^| kZa(k60aTTa-4rXNߠ/ҞA[Ay'k#L=Q/SvLIʜ<Y[m[1> [c2Kߌ\U~%dI6|H2:fGAx[{]=zv$%oP hTFFAy3:=?*ř2RZQULͦX'TkT53N4Ir,+BG:YJEP[ylR群,K ? "Hie=-O̓LCUo:ˎ I LM8k4  x* a<4t`9B&3N$N7PxVKԓt`؂q*1"IUU8""DZTR_ Bf5vAP-FUBo5]?ԺPN ?4-Sn- E r8؎kCR&ʑksU2^05' $̮lQ/@LFXr̫ >JOt8$̬j1ic^I#h}ۈDFZ6ٟ:֞oz1׬h%>绥|u]7|:R,hi) 2t& KM{(K?1h8ӑ)y^B_L85}jtG&лI;ˀ</cǫT,$X4ؒLb[Y*mCyxf=nӋgb4q:o¾trT}If\X{L<ٟ+6|ht-#BZ&n8J92O; ~e_{:{;2\8mKT06ݒooذiR4[sJ`cn ml^qCϖN'Bח-ÿ >J㑁""( "Þjm$h0=)BJ.V}:O+MkFzfdW #QpOs-esjAL +ĮL ɔ<A- n'A:J'ZHkN T5 ]~QR(HBp`dg+uPo܉:!5r@RXvY[ڭR+t[ BS=#P_ItԠG_'B/2{ ] LjN!t;p;o0&_6> 뷹ba{bŕ hmءam\=O_YADu[V -JK)XJ=[cyN<|"sZEfEQ}(nB%\p>LE} C` hZl~=f?t 6JPKI>[QV56jtjya*Ek /^B[`x>j~:Ӎc |/]qƌcGb8Df%@6$,*6Vs Ss6lYumnUK"<,S3 [p{${\`Ǫm/ ^5mWa㶇uuΏoy3 @e^LU|mScɬ&ĀBw/2?I7v=p\c~GUXK0 Q?2S jp/)Wawc)O/ZP4;uT_!{|&l~ \ m mdx/,,]IMJFR%FHXHiw~g?gW\3>vݴiSxltό@ H$ϯc MZxn)tڰ#*#}s#36F_N\{˨/$% wHD9>)G,Tu:'3<53ϲJb?40\kHGmh`Y}f8#/zZ\{﨤"]W |Vce);xL4gTԛ&CdЃȜ V岌p`-h{2*ұQm[VXF=z " >|wE3u5^r㰲_}w%~`kg. qYIVB­zɈ?Fڦ;c+M/;tK4qg[pTYQ=gǯۍ_ad<\:߫=zH/b\>a0/D_|Qb{Q}}c= L,k7gM6I>}6wL2b8p:%vO%{ЮID?pP y'aPoU1PI:.'Kϭ9zABL&{S:.B*Ҩ-\ F9U &⽳em]]K7}u1Uo~>Jsv\,N(=ٷw:ܗR+;>x2pF5\8u]*3-~ TO+"] qJTwd! .>-*hP̆3?{J@9wi&)N w8ڤwh b?@'Rfy{=4_G*í%s:#UOY0N = vz5-Z.r8`@u$H?2&`(u!Y"+)zxo>~DūMÒmL%FpX Nu>:[D[{tf|L. 7$EXG-=Hl Tx=x@U[].B8mK&Pm,A>X?9O˹n5=I~i)b#/4WZ^CYؚ ?+Z%gK{Ax$x鯷Ik]֠gK]؊.ÍvVRK?4nl+V ׬)lZHأC h7&sĖRȐN_a#r! _,lB@Nݒ{V.j'*RH2e\}(í0e xЂ^.\o"?X B` &VwgM[ r殖d3۩Y)⣵$x,8[Gb3pʦe L nKO ;WRٌP9pԣ~?=w~+k Յ4%x3EX<9P:pꄦpon(]SP6>[˨<f]1& JσiJYH|."a%2Vׄ971Ya%kԛG\[֔!4o) K=Xq4ZU썧c|Lk5cdxWұM*&&r$r)z GssM! ~0<6SS R~-:L6 *} rmh$S"?[Cđ\fXRm*z؟??o)\¾(`poAD0ޙٶ'X Ş6]; [ N[9<p¤] }F Ϲїdlu}(*|(qX>,?6#}`ǣ_MCQCBusYc+c HYesRO@7<_*إJ04YM3{P-#"nZW*4B` ߖb{G@ԀjY2&?a88*Oj?v>ڲ=*XբJM3kP g@*s)(TչهxP}]ŴKs;DnM%Xc6Dog`h~|T޷~ub >:sS^l}MFA6o nD|uEU; h~-8A# [DkHh ?ڣ&'v[SReV9^^[^vq>4*YAܞf(TfZ ö) 8 ${`7踄<޳c_+Q1w͋Msf#E2f8ujUd.*|<LL#Bi6 2誺,f: Hw^nU@<8˛dЃ=+5C[|!Wc.Os= AeiZG|41f`L}aV+l D>[]gQ"ih?wR$1a`.$Ҧ"߽n(i8ΜFۡE=˼-6ֺjed^> ʀxqؗx\y3^;'APJ HA+o?}jPn\JJG.> .9PYe A&cd^Ʊ-K*&>aټ&ԿqۡtN=0.~6py $n 1W׆*b-!-VRb<1B ۽+D^E&tprw>ڀE?nI/`F;Gʎj\ʙ?)"::-ߜ ԡ7a4 s,c$6G\(~Wu|I)g|D!tf-F$/ x@aFީhGFҕ}Dm85+n]`O fSL@"c5Pg֨"D=1)P^Q>dɖac訹%,E &cJmo ڋBNMz*R /i@7EC樤֬Xf-JRYL,3?m8Fd%FT^+ 5Ix3陎FGSH´k_'KtL>(:H/`-C/\[Vp#{EMɓʄޝ|-cA"A3q"R N}:9߲ hDgsy[:ZwP$L`FXYf-xJfe |y /Z鿫]Z-䝻`CJ #è{YCkyn!9oO9\+BҔ4R Xq@h(+ڐƚU[NAM\j,FA'Y@ͷ, N.Kr+ci2Q[ a< H!i}@& P`&EpHF7-J l=kTOoYI{\.Yl Mk[P i*%;f )s C?oSr!lfpVj爽N$ynjgE/J 0Ŋ0>*V3s8]fY[D+=-Nr)ǏmHHǜ/WRӹ` ʐwSV@"? NQ3q@E^Œ~LAA:-ta@L.oh٢q2'bԭwb$ HڒgyI\;מ)]~fHTo~ĉ.&@kNh{VZT"c!1)1A]x`*;vp, CHm"> c]4RݸP L8)+)v砠PIYF~Pe,, ) Ȁ>5T Kѩ*Q!*<3 wNO=ϕ549WXn7rNHv5jDqase/^yZq)N:6mC߱ w;Xxj xFukp?6o.2*UAFȍ[ O:Ef[SNUB6vuSF(&ZߗF6J/l<-F|SSH{#evl+=TFv<at0봈ԡQzU9j}&}QQ|뚿'%mWK,:䕙K(9lC^lLj !J66X}GxUBR! #23%tɒ߯:%|yñǗ(~v.ji_ NMXd(}f6".{ƤtRd]Si% A4 %T8<⨖rCYÞا1' PjYu~HH4߁ĬјI/{t ޿4 ڲ]8UWq|X`$DR|b 0g|$MDvWZvռ:]=n[ZGZ:n#l$`獞iS3S,z2uL}q쩣,T4fNxEl&9#I Y7VU}("漈ݛWP):=E8O=* /}Iؼ>U~It^ QA@ѝ? Gߔ9B'1C_Fn1yQ`)P!+ѐm { = ,,twz>ᗈ4#BHMSNtfA4ijɟ|.(KOl_Zs` @w H;H +5UJ4N6dM,5:\DBM-*54>lL-)T&LVʼ%NKYpPotG,Wqh4N&PsBӓ_us>F:LxgoJxDSV՛ζʢo.+VIԢ:R`?js||9AyTVRU3%Meh֌VUH~ d~ |Gyh^KxdQו tLݛb 1h|K0wA݀yҵC1)rhףD=2SӦ"ySY :r=bS.nq(slv P#zȋ68qDEO .K<7˾nAw17{d{LJ8}& h$}`C-Կ AAAmOc_o/0+tmRˮu[dU\WWE *u/]IΉB:f# ˄cg9l @t%P%C/Ɲuו;'0=@ SOjUTd7 -JR4>9f\fSX]r\m$"_GiMS^z pLa.%01U ^oU!3qB俠|{ ,^҃`%9>4t_8 b~djs<fmY#)z!(7ehKAhi3B dy4ZhD/UXw(<2eQkҖ&!l1^v_ msԏIh J[w0N0|_),Ig%QA/jq9.G/q;K\ n$?GKѹc3NּУ1II|[ FIqzO&>Ar{qgEt;pac5FUCzvIm%yvz2TTH8'WTNQ^"/AfѱT@l݅^+k)0{fO%WƢjZbX5H}e( fA| eB Z5 _"v:%NbYoU{`[ԐӚc0C\磝Eu@rgDŀ`iJ33'Q,{|E%/I8W>m<z-xʰY4di^Ñbc$,-٥p ]iˇhaSɩUE}MN,luӈc[*{_OŰuՍ)?Z~;N$:rM44W'-x^?zX27wGcYw7M."ٓ漾|\O+Mi)__L  n3Wh Rh9 fT3&2%EFTN*(.wkB"$(ǮO) d/Hr3G'(!X @\v|xjX`Ug[{ټh:TŅޥXdWno؂K؆4nSG9B`>.o>;T)B61VJ&; ҾUdLP^i"hg/O0Se'S$Oˁ) >L0k sA`)55Ũ:`oZ7RWşu|fwRqO-d~xr EYcٿp]Np剖*ӖQ5:?TlSI8ufV4uNNOX-8:x%eK)k!1s8 *g7'fhWqfq.ߴqlF<ǥے4'StZ %z+=-wcց?@t۾{E4 z%H0{_kig-s-8˷69MAj=Ȩb.ˑt4/L>yŵ3 A1[D!o+$8[k[q $j{:V]DEwe[}?uک<`TyA۔)BJ%s *྄TsBO3NE d1%"b dR']ǖ/_Aې-0Ƴ Eͦ䛆}y6 JI]œ*)*ה1jY Wna`AT rA O*j3]Ѕf[6pZpBL0 g_@e3C}Ҷ{Gs[ 1#µ.HLҋ aHp۶`;)X(jVVo7|Hx%rZۥ$iփ'' swGL۸s#eqɦVPi]UtRW EH@a$cLf Zɂ;N'a|0:Ge2)LI (z19 Gr6;Y~/l"*lXnD@/&1?&wEoD#tۍsvڹP4:뭻;;@I2@@-ʝZdA`:^o}IFiG8jڌB&.$4"03/:lF2Nw\aJɟT_SA4&'O.1=]ڔ+'|"]5ag#Pywf<'ܘ+<4O"0F!UX_Ž ߝ!= *slѺp}nޞ 簰x;m$&k`Z I\m\uS}a31d0\I F՟$&/us0Ҝ |J_&Tiow U0\#dNRd!a-ePsuθA9-d<>JC S,j똤)Wr1v;Pӯ𣺩az8!'z#1H&yբ a0-7iGjI&Fu|\%IQ{s!H' P/e09hikڹ $26sD Ƙ}Aá57il>s"iV+rYt/sg:Z}/P>`Q<[bzNOvzȅN@i\_"8,Tݠ/@vHᆰ޻z6p?wP|Ƚ쑑B-#郫޶~An3"9XMe7K62}=-T!Y)-{ߘ d[F榫qIsS5 T/I8ܝ.$EUs.xJ6 2IP-ƳW'-as YO$u-RR_扨W ?@6FNp%cmVr HXqKlYQUDivMCT&s[4 9E]9t-)idw+\=mLY쉩C:񺆰cA#"8)AtI Bg@.#͝ 7w5AV C|^p^Z;nVjn/ J2+JV&ׇyUlE.hV#4Z\H҄GoVR3e$UD{&3>7'{8A{3 ]el5Jvd|kh۝WNXfXQjZKe*7%Pn QΒ$~ҕ_nY2ڮHlPeceԙ Ůb4i|l(SntTG3-QK!1}ϥ<籸qAqWc'SL|:^vpV au%FB9Cr>پmVͺk]%D$I:Nr uڊYZ\8~P5e^^ 򾫯㜭S ٳEs-ܺR >Bީ %`WjIHZTf =}Dme Of;cτ:D:Zz[q*F!ChhAtNHOvK6]aY[ZcY7-V n۸ x6JoaataӞglQ@BejB%gŨV+U⃧7jnx?g ^~F,lxy} ;Kp ik=SEI1RU2hle -,9WL LmyR8LY-zK RBg{'ji w2;΢r~l$:c *@Cg1[_3EEV3sڐ]! Si., zGȞ4w\H%`*-NYŠE3(d:.9 !?Վ_ȘkBLLUv=޳$@1s,ɘO 8nMٕ+bD#P@WQ|W5h?ɑF]ݫiixN$ÿ,Yp&\hQ2'%A dN< Uo0s8D/|e&ނO[ /SwjCIdń>~4N9-ec(^+QFb,GAVz8/dy/hČ>1)ݓTPf|3 Eӗ?fYZ/BzyFlx9!p onTP PbЛl}pv^k)E/3/ijĪ'yꪠ 4jq-\Ʋދ(~) pex'5~f8"OHLafFZ|xx2q!:&QD9_gU O{ʋ+w؂Yn"iF輡}u"@C2AÍ_Q(NŢJ*"zs7`z^bN2/.3otAO'A4GU7h?M.AGY:d?a4&~OiN|d9jvR|X2 B60t*a2l;D ,kWaR:Z\ln4oCޢmj'ƓR I 9-Av߃l`Tcrj% n%OmQ?}UE׀c} :X!,CLLʹK{fӊ Ė=ˊTG|']=tDd:iVu(wG>*LpnE1+>w'F}Ҵ'%Y= zbvT5lG{y1wDhgo} ,.y-4t#r6 J.:0kyNkI_ŁiZ`I,k \.&g#8225 !%tZ*P/ɭvͿ~4 yϒg`F:x,nPA4DPK/ڿv P l'<ʢOdv5>8(<5>l]vona)5Yb qK Je0^>᩿-ֽh[y"f @o} L9DKg(|Ӱ# L_KOVT" h.؏K[~QJ }8F;TNDՠODOva*n@"4jC"9o sh0nҝ7 5W$##NPdSfSa'Jw|U (+.--usƗiMB<_+ Cpuچ;nIJ<۾ai{`61+*㫹NNfy3A`2T/,4жӬťf(-Q["B`tW3{>ߗYaδz=n&ha"O?uOtRL(l^־mwC\(3(o(OGNLo꼟}'њe}'0">Nl<-^GlXPHQ+ބ;$*ڰKݙEeW7b qU[^Wk7В@}Fr-Qo#?UsVt/}pō[OM5*K82J ݞP٣*0.9e,*lk/,;7&M/qܱ;g^4; 6ܤ< 7 l-i TXo=&[:^5J>ů8' EhL#{mǔU!7%GvF3/K~r S DRqeJ h@'<:K;j+C݆CzWQ@-Qi ^ 5)H. T)aN@ciEZ C*ͱ`ԙ_hAEP;Ŭ U3 !!0#b)ógf9P N] C.ȼ;exR }{GsUQp((!)dtWг@rj֑H  EK_ tA~6qD:ujC+D%0I3YȔ64Il8SXEG(<3p)iu,fysp,E*_\y`pUXË8WC[%gW/fx!V%]::eRxF,5lړ>kmDӣٶ7l [8UHP3-'fb(lp6`gk j1*H'/7q+Mkۙ43F,q= iUulIJp%91)䮈v06=I( M,\H&EPAs dkClV Au$! 4yzvhhO詷2W]O /HR*R*WȽhEqEȐfZ๣1zfgn,<RO]Zݿ5X nsPa04NM,d9h ";t@~Q5EBAɠ;i.> &Q郰jbG=CZ~vzW2[L70՚ HG##Q+I@%A% %k9@(l͕;XTgb ٢GQ3/}[YDQ|Gul8ۙʬ5fD>"3 zj@1y͚!8К,[F/BQOF; 5Z_t!irNvݱR(ܙĉmVP_/rBP),Jt7-076WA|nK~f:%_ҺDeDLUM|4y[^ĭ`z4$ҕVm# KwB9QڴO:{+<<\ekG㕱}o .@TiG36  8)z焸#$i\*u-Vp^X:nٗJX*.p̅_Jݳ=2OWE[K *UˣkЙ My޽9k47 H"I6gn ^o3A=Fj'w_}0=csFaciG/OυMMN ҭ NEJoSQJ)TRv*xChW lȶ~T zh1Q\!i{f#qߣYD!v2Kmu,AVI9y+ͧdɌ+g1/Z=֯_ѧ%HD#nUL/tZ.;|MT!A뮈^Kn/d2$gY8a/d{@3ƞ<{47-NRn׮sE*gi&E(6͹:>5,_Eypڍ#6OB8鬸zƏ1#l!4&/iz$\5M1u/k' #"Y(wDؤ eVm&3Nv;ͦo^đC|"՟~[<`+OG=.۵A3#`\{ G?d 6DFu/(ø̞~/ip'Asٙ z9Չ\NT8ߗQd>jlEcNȁa}_z KTz@~ie)+;+~cx] U텊1-"PV|/z6iL $nx$ByɉztT5w H6")g0ϩ=;E 0e{5H87.bcϠ4ikZOnS S#f H+Suk-4G+YPt,}}u& ~ߎӅdqۦbe|imhRnmBƲ9&L3wtbE Pd45H'ZIqW*CTE/fnitSZ ~LL-1$"jEޫm<==]35N#&U;t5 c-m֚V )b "7`M]RPHmYj7Osx9k0^Ev1K~(2*7rreLSwd!9P?~~F y?.|YT՟g[nNm']E7ip$3M.U0y%ڈ h{۸(ɰRE(QDTh=+[1$Tb:58]Wݝ_`q# tlTZ/̍lOҚRδ?A·ş)ʫ)ξiU9$.ћ0Oq VS3[㴑v儒tdi-QbNe廳 %G#ɨJ -Lt*׊7B`fWTx$PisbCS&N`z ?fpY>*F<\>ȪE!cƉԱ)i ozE\-;u1N8:ȅ7'4eS[uyYTMvHZI["Wq9몫7ypU]~lu~z"؅p'6V"l&I.A7p0[P(Vm+'H JQ 9o)pwm-8%}|sԬ-q>wq][|Zx l@α2L;L!&?itd rKtdHgUfv0wφ"Kؤfc ^p6*K)įjQV7 D"35ٿ2Y!rn4&|DUK|ZicEF:>Ѣ>f(ιt=u^K_4u$JZm[&[0'{e&=jI&yIk`FS}y֓\Lcv_Ϫ_X) ]ķd|.3f&r"jIh&lN[H)~d͈k֪\t74c4L:|_BykP#lŅ ېmˆxb+,^Z9fah͛GL'":hN"us(Y4<G; !܎a-T n@1cSex<6+*{>1E,ܕP(oȡ`]=·'#4Z2pa#~:e|Lg(OKA hTAI}`1=rp<oWF3Zbk?? *ɰ /C]/>|nQJ|mNk*`U]ȿinuLLx(wMrlW)N^{F\D~z3dgݭGUcVkzq} q hU%Yg${{ݮY{6N 5_tL#@8*K.oX}I_ݭ%5J}k~ 3'wlkf:x11I_! v݅[7O0 Ai-V&UTwg==fJr2xxyئLLCvR]x)]22WG0~Zn/rcSxY:y\.\;='e7$kuoP5GᕐZaA&,Fd9v˼K^~,$n][a~v3y \@Y| >ac1y>~yžK]nd.[D]F+ =6S 4ć _Y•, yoXcWcJff&5:ل)һ9 ODZ`vNs#/ݣ[i;irrܡro 7oT:~?ʒ@80xr *vQ:tD}m"C&Ag2%m]D(u"o=%1d7BYF aW00$Gz|9 oqO\<5k‘>ꃦ})B JGfx*0'̖e",b_FpD?!#J?S5 W \nũu^1/Jzd+קr!Qr1dYz\_(hU6pb59˹a# /rG?-;&]u d~[Ú%-y.j_spiv+,] !J }t)eC2 PmT桤8/gPn+[H+@a9zMU}jJi;؛D!bND6"Wf rK kCA]\{vꡞaVR L}URtɸ( ?^.v uSǪcvM+yWls Z)uW&ޥΨm6ȴ6-'NPj^K XvT_|v DWܖ[4gC^'LI~L+R%9-6+m|i ="Z~)1Q>߲B]- EHEA0E%ep ۱H`c4ô*B]ҷy ~*p(Iw6٥|agB U|?"ю~uE!O$\j4 :2-[>6cSJ]ptzdO6 jr1*k5Fq̑[G_8,J[*R ):ԝedA\/lt-ypF#Ϣړ.lNEmPQA.7PĊ s!!'Vw>MbwKG[K ,a3=rhm lM)Ўլ[Bpg"U81@kZji#$Ę sǥMI7 7&N`$l]p\>뺥d`P}/Z8lrܥCЌ%BpX%`$f^it;K"m*?z*'CZ>|-ܚHN@cd0ߝoȨ}ߥ{x]5Q 60!H{끈jBЁ c*16BWVq|ъ*-Gޘ\θpbduA$Q$=̍\H3[&<&8(c^:nƙ7^.ɻ5 svZʜ6 X5]"L/k"WE !=\y M^0g:?~:,<,d1dɖ[N[^0咂uaȟ2AN#-% ;xDsH z2-%Y1 ,?>dnA+ ?JH*wPSB3>j_\_hF@ ܖGR2p)؟?rmN)I Pg:0L IS\=^9+Wylkx%j)'.WӊDU rin׳R"vۑW E*+:4`* 04<%_;o,1GJ`?N_4Dr$lWyBTP+,wcmi1?p uƉaXG=Όj?OՎ241Scv(NM %X))ֱݽ=Y9O>O8LlyVshp~Mǣɸ~J''/w\T*) Ȗyɵ*}:V51t*Jb. 妙VmO]\%PESJ.+W8w 0OhəڈC%=-2YT2u@dԴ*N),/v;NĩWO1D]v17Au|cqe{N>eA\yҕȫ,JIxۊ"i^zvp轎%TNLN ;ɇa =  SL?Z1>ԧÝf<͍N5+.1p\-7#Qpҩ̆:j^io_h]B5Wx?]?<ٜi#2;K$'ϐKbiMGaV%u8z7EO_/ґ Hgde Zd#7zP'wA ;Oۓo#كk`cx*<5 7YK#uS9HLfk-;w(!MNzBY8rpR1y u5f >~[Hw n)qK/Ѹnt׭ij"V{VO!kYNi`y зiev+󉷂ƺ mH|O4Ә@(5aGKu [mbq4A5M`*XP{id 5D$(Zf6VA8 yPe7=BۯxsGkM%9cT{!Ҫ1[=УAW"zqDJQEز%CyjC߾5G}2jrq@֊(#d=Z&uQ@05YP% gՈX;{,\hJ݂7?Dܼ%{R=6-&32@^mMX\>MN4[XؑplWO8m;2k*! pO31ЗmhWe5#-d9^ʓZHN)~]?66ܛs_˃k"Gu aAn۪s&.wɧ8zW9f8i-Zoq`sN-!{+e6vWUGhY NXSv

F1ͧBRFݒlW30ɺGq#u\ Yz׎c-~a׹4j>CXqweŖx )x =D4 q<9r4Gm];+b[(M.C@m5n$~[fݢwĊ5ȗ2?_3mن~U[˪Vv ᇞҩt#ۍ{\l@"X=sdE6ӼÝU|.J{> ZQ0&eH[ 소}O]K9E'1)蹧D$@o /HU8ʁܲG=-t)!fbӇ'bBOqҡU]N}c(S"u-jrXl]:kĚ N˂6F.G-.(w0 k=TO+r'>0ؑ(~Kjn\Y_ij[%u}<\:K}vIq:N`Yr;Ҫ59kKdzSr; $n:A~GdzX@|ޅ)9^lOjN}$#)ʝ c@eww1~~-`-/}XSd zSD/=4: PzSmϊZ)k)l` (Q`?y/K~%/q%Zy3G_1mew? B#~B-JMMypz ̧yIx[(Ӈ K7ET& TtP_V8-)^T$m4&| ut~i q`&ԂK~g0=9{e׵˲\a#3Ǚ ^B O`. @."ٙ|(-F"7_[z'PohA+ j䩳`P:O:Z|jlö>`Ev P!Kn/EeaPk0ȉ:'^_M[G-ޙ_V 1w~Q|./*D]2 QA.FP`+fgk$tV/k¨%z',u1 Uق&9kwPIMSus&kiC{]vUl;{dl%4ZV2Rh;&GVӺWT}=*F]Ĵ$J k,ks?=J ' $BՋ7r.0Qz!8J6hN/E+vPL-6-/"5?FcWZETE2ͼ\kM6T4(ʢ5cJR~Ƚ$jq7EwIfdڹC)ߛ"=i^SPt.oJَ{I0x- -aPn tFq$TnpT FPzR /{8cRV {>mR^[_2'0$JHNzۏǻS)̻8y䠁5F@[QEUjll:QV&Y8ްRscA'9zV/q]xs gJ0)"3Ꜹ% k ^6VIgK[PW[o/L&_S&1Цq?| ۠[bHi߷37)-w8bT͈g D83; \|K=T jdz3Ri#XH+BZmDi4r%'n\xDZLݻ7A3]ci,oBhpZ>k EZpu=,CD\'=s;?Ξ; [<ǑH1]moAϹ\*rZ+]0,e9a =.h|пx4z=$ό%fڼezd@1<8 (gI!Fky絪ٍ˫"`xcw?E2b[)鴔usZY=NG7dQ*UZgeNI5EP2ڑ*Qg6Gp|))`=I2j^^3)Ubab̐T9y~L}ɨ_qhBWϚ6j"W}>|3q#i~%\H/;5 f7֋]Pj I@f`NisUN74YS۫@]PD s#-َ3rjZ)szOqG@;_-zK,,Y{1hqjǞV]1{}Jb]kfğHuղ~.Jgyqă   (~y`P;tEuCxwトuxɨsABHcb~!>jڵSũMh00,H>g-:NjVO %a%I-6&cX$;9DzeJxڋ22]rj q!֫^ڍG2poICҁ;ѕkWb"8Pid^Hj@.N-hqMFi4 bB C0d,I1 =GqT`?BåHyr>' HX[1 ccdxi"@u v6yjR~/}7H3ZVɃ<'z2ڵ+y6er;#U9{ic,az 3"0_!WwtZ׾ 1:(N+ tg$VVh :--?Dt}!.V|P3s-n>-\= q1[ۦGrO- 7 PaD<b01+!־]^N[N?uus~YG8TY{/+@2GPO6B99!JMΕ0`-vp02!kho,##k\JDsVՙZ^*+{KUl˚d;\`)wm6eN3\r)[ll #/.W`VݒBi[Qrf+Op UYr)b5[nZ#O0B:l\l&ʹ0Q疬#񚵡Ci<~l*(zB߼zXk|N4ÌryXtT3m^!a>;LQ..ߍO4̲η!ZNQ" S&9"R?\{y&vDz !E;y ǃ\p#Ee$D:ợіgń-JB3gYDSCYLsΦ~)ۑ57JA ?hmlYL_K9 if4æ& Iqd @V,}ߞ.J_J&ϙ(.@BA9rH M_]uaeɤSQyo|#FPYF{w4TJ"=T懧JaO):buM&lD25 l67=ІSlbHx!]ɍ pyVW9:omF0.E#-w':7:5+ILW|q ԇw2Yx. n?&/"d;ZFcl>;C-RAMA7>o&HIS qs\4L"E/) +[p G4B|S,* z,.s4ԋD6M jۦ0A!(ٷʃ k1~6iū*i50hڲ%򖣉(wq)X7xD=L#dL={jۧߗ#-;X\XgB{-gzr Y>N8Txs1#LDi#<{40gEKCziu_ v\wNgyF,hSBvuC]I=2tr} ܉磓c |J'DÕ*z7zTK2Dk5oxL=SiN-ym Lx`~á/A.џ}xLJt~"'Go4~WuV.#E7h#|x9:m>)ʀ ]ͧvcq ȴ\gݭ2^* c*JXNBor@ ?&x60&n7l免]-i`gkA# }1]ȟ[)d{kQ?.3B}#:(xN}B0 V^RxŢ2mx9`#4[k6-$F!1:VAm{re^ix m:SP?O`&Gs8iD=ٮ,e Gd%\.T$dw w$=qa[oJ >ol"q4JjF.EJjt ̯ N3-UCW$]xo…K:=Ū1+V>ʻK:Lk~K(_ZؐmVvP>+%~5IgP($`6*f ɫ4S8<0)o޸^/EyGQ~6Ԝ(GDPߩPOsFTȰYwO0ʰ$'Phǀ\\'xս\ww,MA>?MlOട^kϽӦh2F-ӡW@ջpn\_FJ+7CGd5etr]׎;K$h)F,7XI_wa,Fz#itMFSǸ%{?7*N,|~ј(cyK (P! mBROd!|&!(57X*?bsC5PJ۬*(L̃Cz]KdFA$ H{;!ws=YLIyl2_ ',(Rhtt#?7&]Od➊2jGi_:{TsY+L`hIܓ}q/i56% (\'G7hƈ;6_̙HҹJfBhQ/F~b&<&IE֘ӵ]1jC3w@Ftrr%&SұhKG-(\/hUo>xKH_ZɔAyCP"P{#H 3.vДXgμZ xF<Ob]2jBw*wba"o+jDo 8n>vB¼Cnnf5QN{[M}!;05#ryc3 JpAW)( %6Ezc/Vz?!-hik4mIhΎ Zrn&aδLg3oLRebt3i %AJ~(FBp E:"P?YSH,#ǡ,RPe JR¼t-kZ߳~4;fOIY| 5&J~}Ri[|@A->E;&u#o DHnMx"QDz|ڣ7!ZR=RZ?JGlF}M څ0_8`؜H:ˆNBn:wFs$wJ%jmo|(>-Wa>mfgb} ~bk"Á-^wD+|&ҍD9TsL*tCuO 1T&j *Sw:G` \e[],wz;PoFYX`sEԗp RŚa+CX=4,ۙ TZ'~/ޙ+0yy5Fg8B.` ar#m3wnQzwT Y6a*^稕ٷ55رplk-Һlfk  <4Ux15)鼕QUؠyhRΎB-PS-RYQEDX}#U17' &Ǯ<0Эc^/5'.uo:aùWᎁ?@oai-F f޸z((T:k,kgkZ:r&B9΁E N]v٭1`3zU')V_%zib- >lYO-U(+B%;, k|/F0\l EBƤ Æ*kY+d:m7t-rhMoəwǓ~0`+Lixbm:|o=-@g}ZvDX#ev}JiB"PrFLZ>tSmǍf=!71excNy&ںv&j(h]{q(\k)t5怕j܈ 0JB^c&k{NF0GX$bVE@LQHf2jP S7j6n,~S+&VJ 3ZHFEVǗsC| >"d<`a{_Ά|qewruVuzS 1y+gW +Z;FwXѥ%WW]} `;܊#bT5TR\7Ԍ!\r1NQ#!wGot%UN |Q f3GQeZ(P9v򿆴C2l>=M|YP[Dq0/C궙S[R=ZDw#C-XeQ6PĻrx,9?R^:{Bh8&M̻`LY͇ŢpS_Ӕ~e%5͏`mj Rn11#>eJȌ5xm^x62ŗXi;|H/c+bdT#f]Fqu=qUS;(v/Nc!NZKZOWog ["HBȏ[;Wn :R|$ tHkg!WwAFtИII+dfϜ! xVNgHdq4\`8  ǹJ KC5czh~4Y`FDcCNr1&g{wcjbDQ8*t͓I<^#~{ܫA+ 2"Xr|] !]9%,lr9s0z%Fxgʜ,=qZ\:LlaJ>" ﯷq}I['P{ڃEw7~޽,&#4VKigBi 6s*%F.n_rԵ| ]%5|~Fn)_> O%'9G5wJ&<0WN/";4PIg1#JtSn2ʋ;~<eȰašVz|U'P)Q1\$W>J Ѫޜ߄_p91_22ʣ yc*D5I u$?ԙmi{Lьj2ClZNFhG?3Kwx=u$)/K*a4!2 Sv_ǎrWvIZ $lq ӎv7/^z% ^)^A^ \Lapgp6P0Q ^hE}bu68*kxnGrؚP7ֲƌ6UyV1>z(:LqMfCCވTuK>F=LvAlgzaN< UIa${)[~\<>MSyޖ ߥjYDbբ <=#Y|^rg_)/}+)$1vՆ8( 25v,`Kӣ6"]D"w9^AM6[#%l]K%2ZhH.H`.Oir  ?_[umt@eBtjVqMMnW[0W&7(X$^q9,{*o1W9G侧\~s٤0aCpyZ?r#Sz7N0;HM^ץUe7a3fDEpT|77=tw$үC7#<9j6ߴHQ US 2k ꅬancaQը}Oyk_Muw>\cv98'vznc2a^_ߧ'aN\l^ҒwLE oxX>zSiW{EiE4JM.o{U9qnGj[NVFJRA7w̨G# )PP\5$CV]kD8L0No1Ap YHgf<ӧ+irbXר@Bkw?]])fh4 g8Ee.^(xf,A盹i\weM]vm(R(ZjO~aޤZWIųŗ#DK"_I|iB7.O3lB q%GS?z-i׷^d"" wc,*cP/XTj~QĠ|ToaVϛmVX, Q~Иl"?80¨HB>} ϳOk_҈7y`$ <6}AI2>_*|na: SՖŇ2m"X]oBΫ3X}Hy`B1mVǥ T5 Tj:؞ Y ޫł8X9.Y} rϋe`ʶN>JM%1 ?7L}-(4}_@ίJO[rt7{|?l \-pƕfy8)*T%'Uמm !7^E} к<$,t@ĵ{"$-/״`ef䖺lv6(㕻{Ǚ~θ{qp͆cr B-g'% b+hJW$! լ5`|‟(̊-ɸ.'yΛa.-oF<>rvEDU5&&T"&-L<"™@d &S!a fr;̮$Ⱥr2Yq'/2 N_曫t˝ |O>sԀ4CSy1:^cji 6d^ec޴#4?őVvNMWu:7\$n/Ƥ7]%7ǘ[q;+cK=12>X CdG?Kuޝm^]<[)?#q&+ NwpzU8H DlYJk}z?=65Ph! lw):YR<tXAlr iغ"R/LAWasVERg˪O4I`PTǒ' fx8R]Y=8S8\&lqs^ϗ $\\tL84r KΟƘ:(e~ζ04,3e8uWGm~n_=DRso"iqLC>+Ϛ {ʯ1Z kقg$ɱCwFi@SuݫO3'yP*Ȥq,ňyjz$ '6_Q>U}$%wp3Z% 9+ƃ_[hA=ics(bu [ěʯC :ygsת_27>/6EUޗJ`9 ׹EpYS;t_ʫU=9 VNnEnp:GޚCݻ'+ESUzpܵӭU=?+F޽ (&Z[fYȡvD#LR>m\| 㢡R3%[Rw{"2γYlkK C{p8Rڟ+X71ûƾ^|fx0L0k?tĪD!DZOFE)o0~E0G8v1f֏X_MPMJ%l/-X7#;biɶ^F5!²Į\7_GܠV32NI:f#(Wzs ;]8t'2=<al#F2Icie?9uOs;gّ^~Nb7V<~J)"1feAY>̆wW)چO1J~)~X/W&1i W-{ |Lݼ:1H lkڮ& tե C3b>C2+ܼ_X yggUc cG8^(9-rXG5"`TzQݘKfua8xA)&0쉖6^uhJ.^!,aVc$@Ϳ|;Iͫ pP~y*/"@TgJɴYG4ALF  yEJ '9G8 YrU!m ҦXhYn䈏(:O 6$1'1DW,vFc9Ri.̞ 4ym3*HJ>#;1g]|UƳ^gnvD@`E0ԔQbĕۮV`%exfuP] 5cj8MtrB52KL?$L⠤}O8>6GN u9ZbVlo5;GN y*OG}[ʻQW ӦQ5:8iX\[cpkb2 4(XE0^pC컘&0V(P;'Vvd5@?;K, W ֑M-✩ f 0#j0{g[dx3.z;5\< ɈݣzmsP]K f7:cxI 䆒8z:=9 Q?(sp3U+ nDJaiáajS}Mw~n%{fvY+"RJf}()<L ˃+IGZh*EpoX(s=WC!9V <]9fVV͵FZN쎳J˳gGѾ3.;eQbWg}][b4R%D+|7fc}֯uyV ok\SEn5ݍ"O6N#K `~ B@^P{Rc)븲R_xvlb IL D1LbFȍ1; ijBuɳ,O`F$T֢j+klc+xxJo7R2} ?x])m9Dq/3yBNBpCoIé^}ċX#I'I޼T]G'2ds(Ar&7ߍ r#^iI\A h+6!\gqV\ͤz0W&MhT4lUQL/gurDfGްW55AaHDf4['tf[=znS+VD{ rǁqM$Mm(E`J$T4$؅iau&Qks/^aDDE[9.NZhDswêoӺef"ϒڌ.tq$ ^IIzU4ˇWBs9& K"|.<i̭5)2&?j9 y9h |@iug$i=BQ5/ `/4G97F )USpWbmqz VmCN9 9l ͖ ,ͰzumpN4>b uM @qs7BQOb&?vTJxMӘ!]2c,A{lQS}˽T~oBm/VB(@ TtxfqppnbѲ΄b}lήZ[V[{źzŘr $DVy&Sr|pdW•+v@3J.1 ?:@>;:C9־l6Cȩ1zv[ "q5Oˮ$:Tl?} 8kiL7?e}OhX,< ؈}w4Dsdhr>IqԶ5Ns*lk6Oz14@+F)jaڳ&.x7GӤ]Py6^XSm%z*]Q{z6$CDԁ[lsLd÷3xcpP 2g.׌hH*a:i8l i^u3ao@Aƒѹ-v+HUGQ\ƍZkU+9<JE;}`*ǧ>$owr)aMZZ%Xfr3$) :}-Aٍɷ\G>}47K۱a <t :EZ" u[8lz,o8\nO0,q@}6\eqʕź%=L%FXhn_t/?Ԗ5؇ho) "zZWaׂ}K,r8V 悭?~8Bړ{~ zUOe69&Nv2XFǑZx<,L"xd)ǜ󯮹t7 OTi"dحL_P)Ͱ0`A1;c_xSCK&mOjAТ:‚=8Ac]>Ud=k>m MJ}D"U21x8S[q0zz]>ǒ)&/eNϊ^#M" #H R}eJ 0/f3qYO@^/FȴA$6:|;yN=6V/<+sW˩?"J8DKy^tΝ!\'۔`@[OZg: } Pk4ܭnMT(K54dw>&*XK{zȝh>ܷb #&Nߧ$^[N8aA< K￴F^y|d1} rB=Z/e\MLK"c%ukʱ X:TgXEz+$Ѻ2eӤe2vwXne@{5KuJA3 p=< Q}br?-Nn Ho7 Qk4}4;c*ǚs|IgKV?ӷR[X&2#d hl_yud^(|TfIKPN[P;&|K =}jyV0U /#-3_ԭ7'4RJ*j4IRV;UF{ngF)w|11np#_(˅ѕ~*'uC*YY" M Ұ76"<P%OxHfՋoiGk)5,y x1]ג>J7kboW@i&Zgl)ثv;* 6,kg cj2('u+Q(Fc5ǔZ;I裦Fd 9뤚|xiݓ=j2oY)Tr:[r޲3a%9]5GFw`Fț B#1 o%5e_/XtN28.L-dj 1Tw5c#֝}hYF0q;N*u Ѩ˷+Q:|w׎?tDfrY-/GӫU5%C쪌4.XH; "be Hد݀% ;zթd&g/->V+9kΦ[}ݴB/_C 12Vvc2CR6'%̲+QH6f}v qOC4|nlگQ 4R+a$VBiNy@6L+4zK0'Z/rlN#4`QiBxAdbp$TJ=*E+Ñn%.3A4?, `G=Nw2^'*]4`cA..܅E 66.͍"ڀH9DǒlnƹJÓR[6ۘ;5{xQ Dqf+:PSI)@w||^D~}gPoGɒBf75>Xr^(8 xaڼϊIϾ"GKz>s&t"e= g"|Pn?#g !< b 57x;?sŬ>$);P):ΠpуsS;򞐳Ijv`xWG߾X0RWQߟm?/1)wW6M+2c#6-O~ O\=SY(%~-?L`Mlr tuոY z mQQ^יQZA))tؘ YQOЍ_T/> RS^s22OTE~P,Ql[s^O7n f~\59g:rXV2KF2TZH1wyc;Ocn6B­Y/S92 kaG$븀ymL΀h~FFO@8<$έmj6ưĿĪ92B\`cy߷:oxr`lw1h|dqґuE>)*($ӓ~ᡗMyLɬrR̹Gl?}p?o  ' LX+lW$>L3e~&aޠ}ɅTMT޼9'qh$Hvɼ?axP@-ȵzy"'jPQ}!\8kշ}=E y=k֚7j|&ݢc%fksoEc?Qń#PR[v5obCʊN`"RЫ]x?0sl}(j3*r)h SJ| j}EwsHlwIB7gb_'.eP!oi-1[%`ڠoϲH!\w~z֥΍> RNVvtKjeAEȚnPzq?ݻ2v|B/oS䝙X>*89t(GFnp=8ቹ(@z)tň}zԥP,X4!1V.(C=wxP*V%J%u7= 8Vl|q-G^gTٵ>KV-ya~qNDJksp-zw~ {2]`8f]sТ-5lh60ʈV٫e$`^9]Ǫϻ),iL{ibہD (< a{'| Щn Qj@(J4y!M!awp.,zA+'{Zd ivZS*)@Uɧ؆TITG2l:c-BX_7uP@qɅf]`3s.྘^UhI_'$ڰP0":0&lh*t-7⫸H4IdONdůΝNX]vg1 Gi˷by*S w E;.9y:@Я1u| ^́+m%I_%=z!UoEQrIz@T"B-Ůa]}wbs9~zxNlTyA?Wh N=5Wy?}Ç&%j),@|UZ^rn=ˆ|a0J\ tcᆇfB <ίI$1@M QH,B}Lmr5ҧeGbgA52m̬8q*4*v䂠n*MEUKhfBV<NE(ũ=OO}>x@c;5ʪ1n6YfjE}DZl`Lt֯F{)<ɘVgwiK"'䒌]Q>ytJ/Ӎ϶(=}- :\٬tFkdؔC-_8p .ݭti;}HVyuW2/IlzK jl"}P(ueu`@7 fpYKG_ح9T~ȳ$&J\xTMo}Π X>;CvTࡘN2oq6%ܛ%m$(wG,\lLրފI;ѩttS*)WclK\&Xנ׬jpD;hiŪPF#.I~Gʵ*柣lGd(xYO$)]b(b&eCITk_D>kP?+$f >_JilH|*4zޕٻfMF>%sʆl?JR9к*KIOs$Ai41J;T>_CHtmI ZWK `iF=7u#׀B< W˵S(SYfvH"?nSd`#{RS40kfc"bE,p ,?Q28 xL{!`K\ʄ>iLm]L-+y Co\eɨ̝=pz;S|NY} :<$i:Zl#b3 Z5L%.:[𧦦,̤4V6±W5s7~k7 sRs&&'S=gCU!b"woC#We\.qi;,Fc!,Ki{T()xj/ycz{ \ ;L0g< ~L~L}̼.kӀ, nI!T&@Z;U4i׶14׫~rL)`CK|9YEE ^PD$k#Gu[}'B]H 3ܟ$5=,{aIr|v2b/=-<?/b۷R9Ң3A|3%֭g`hU$D5+k OsI4h"o 59Z޺r w^&e<3G$ˍ.Eh* ٠L'ЂxAA7*=GRC,=Š&-%%bROU_۰ .w=_J]As)mNnnChz1i,k8֓%$+ wX96n9JcvtSdz6:pQѮʺ[:uw4n(+w4o6twjڨ/">ylS{⶜4hgax* Cz49[?pI Mӹ NBAqmNým8#$Lk x`Tֱˁ~nBQE荎|m0R{ˈB|/z[Ih;/TM(Oç%O^@ŎE{/#cqk7R1n,v_KC(W>W?P_ -S7SqtlR2㋢@T+kaŊ.8|Ntu#$eWu{{OAIK7éIp%`*Byga j,hٯc 屼~^~-G -je߮I&G@8%3/xuO\:Yն3t]RcIz~p(gm7I"Q֟?QWOb +.!@|&ɛ{Of< Sq< ZNêB4X*3䍩Zg{·V"ɘ(YBb#;wu'9~gwmT,gEo=<=a[v~#BtǑ16 +5N8"r?cbBLe!F&.@Vؑ0 鹾tWv!pPC`^I\b\W8 .}bD>bTF碛L~e)CsHGZ-&3'@Ga[&v<1=XgB+!唚._ni̓H*Eh lvl虲Ff_xr*\S,!]i 9u\RSL[I ][6/s^ptr\By&J XIґPU)5cAmō6)wDgYrs̰Eu}i~4oPsW\Wh:eQ Z7WËgyzC,?{2-Q8/F4j*?&|ǡ֜gP9!)&aBvzځO7wi0k̪֦ ;G? JtKd` (u +B.xTB?N6H2O{ԳW>KsS\oe"@!du]4j9w}eqGtɶ*ϼD@)>AzʩQл|ևeY>cL5?` w?%`is!RoǶޘ2 )v_TD~Z2$!7E|c).(H 9{+7<ɝN`Z7 )姚6k3d?ƆPC)'DBfW[v[K;Z@,N#,_?Md> $%~hka%kF/jP,&}nsGgK𳰬NleJjqz[zMvLSlY8ev2VTSi7HI|pBOMP:'!alGnl3 d,#n)NոD8kr ֗=\rR c}ImН9!\KYD`_Q ߄'\ޢvX)4ٴWrVjÊP{V!Q/@*K42R|* "K#Ũ\c(ۮ)NDE]\#L^tn wg)xu8~kMǙ`E"i ߳n@S_ZuVM,fuk oӽ@2&2rhֶX.;-TYq{J3es* +#组u +TР*)UbhkHRǼ8{خlbg 퍼AT}6bJ%S#h /Uv=?>٭OHCXgT6߭mV&jjd[q4oV͋:̢G|5 u_c`%!9KnNZTĢX {\rW&U_/]%r]W@$>^Y`yCBߕ&qXNɥUZj׍񗥙.g#Mc~!X%1pVb9OkZIAxrjnKnll!h<L96H7SmBkK@jO}֎ZG-"z]wS뤙1G6 U$0 , dn )GW| s>@O囜Fc 'B|O4<ف:JGS r9'tcql.ETTnTl&kסּpz>Zܼ`߁C i "way4~jϴZ}G37*xxXBKI{NaPw=UO(Έj$)dog ;j/2_{Z%$_ -p\-FaXDZ Ӱ~)ƹ]CHg*&rcgmRy6O* ތ`xg" loKQ%,d$T0} .))- EŴPLwgt%s(Iw [;qFsbI~ BblvgԞD _>R_>>Ҧ.\E&="M_d{ 9jT&CNҒka-ͦfMHTvw||V-|Lf(0kcOHwj}uke)kSeKTW4|=0d;{@J8TB$'^P. ɏTD"u`ȸsJGlKԶ+ؿ,٬`!-Yjoa#RwRF){+o!!J+(1OPJYXKR:#HQ5 ~ \vb(&7u3kmb,6yp<4!;:omr}QidޙHG7 8jdn_! 8 #Y0(턎h#bK(Bc5rE0b+]=xi[S7鞱 7u@96O/}.gkm-ΒAÂ/!= T\1jߴ, JT)L3m e>`0˷ƕ]Xˀ݅H4[h A<$;t >nTg,:I6Pqp=H\k_Y'ex1VM43;Jpxoca|!.wΞ hz gE]Qkf xm\ tiRK[;\29F-כnJ |Jl ˽ Yc’oX{AFX ^|o%5.0!QEƃMb0c'C>-1 3 8{]i} aF4Q=$(iݽy@gˇ=V>+Zi}Sm lǓxIe•H b7=|ۥQ-EAO ~u>{A)o U"1XA!ژљ\wכ]D *J')I+}DEl΃A*eExe'r#50F0.u3б[)=">3s'~Ypc.Ż]`R|4Rqk7eͺP)tllij#aܿ Ֆ]\$4/hrUxRQ²%R*̙otVh'g[Jipg ޕ`6s7^o!u꒞Kr^`@6w aFI}Z3B(Q<*J}k-5z]R77銁rF/ިlfE윸'F`?Ky~¥ `YN嶐iqr56 -$UN\6U%󠁌 J R?L#'x{ n"7o+/:x>lILHhq"?9&E,j'q}`ಶV`_"]66c\ܝiPR8q:,4f R)R6LƁ-0Psro o1&b ,PnDY~X+VE'6y >&>&U!НbU=TN3"S0 Xj(Vbw_X/R1B?C\FD.e[%5PW9u*Wx"f2PT~ $˨{^-|ͧ7R-:) &mx~/zXw %H~}uЈ9Y(2^͡<37ǥd;&*D@wmѡBqVa:wtiU8[J5GAEX4r#MrHN?#yoa i+x Obv7:?=NYM`"là4pk1_*Uzi;Lo#.Z}u} |j#ޭ>BfwX"N02v%BSQ٦Nӭ'3*,-"\2/6UDduK!u _}83Ё(& ,ؤi 6``S`>XcHH9nn EGPFe(k~q9^;q6=RU=\zQ!f4ⲀtB/GjztJ޸@TGġClm\zݮL8 M;-$SZU#udgee xq%s ?Zm|OEz!:Gq`.7fгtpuE٤D׃ _7\޲Q89r{rͻ|n0c "݈VynV - /b_i%MT v[^ክ25u4C8ǩDQNbK2' 3dAsqFzssY4zܒ8 3վƗ* [F \ ?QPWsLRJaM R0[luP<|In{qFTp(BDZ/ ϋ‡u,Lkc"G7پkpyA9lnH$o00=dmw": :TfїmԈ,R DM~&J "@_~auLu׳w RUF, *G,cŖJ|Me&aeES`ZXaWa!Wu{+G`>۪؊&jT( SἻ#9 s0dA!Xq9r>Ie~} dYd_QLCFe^+q>h6'7C )4`*XV.4qoMn穸qi4BY?"U3;t5F*R5Ԃf0RKkƩVuDdιZ*LqlaIXXuL!,V%R(ȳWGx1ۖJ=ǛD;m!./X<kȁ `U/u8ړX|a#ha_ujVB(K%ܲqXHxMnOU.`Q\/Пrn0DnV`r|Ó ZV2xsG\Tr6?A dئh*Zk( Tz\Z-Ԉb̛K屄̸\](.ebe8%{82=?97, +ә.32[X=M }$#Op'!S$H>{K29zi7%հē]g7AS_iݞpBЬR7D1ٹ)h2N)YLClWX"ϖY^NBH~^IHb[B/"|I{h1z{ ̤w.D0XW:|L􃧛 'Ҵ Uڤ!ٓAP)愪n@7;J Aߕ-w nI\=!"/[iWf b@ӵr6` jh`=/- r[f&OGq,yp׷$&fpkde@*  ꉈ9kz'taP=5[84p_<)cLv_ؤ ٣jıh*JuȊ4߉V PIF.* W!А[ pxD%.oho ^4b,l$/zio(xX X4ZO870Np){BV#i?<=ep RaE?7ޔBwmY1t7XXߔ>0˧ӯRb^|hC3y"*%)׊%Uf,+/ WNfi^4?+k nWe]K&gf]Ph-.~҇v 1R a >JDdQqbux)'чY5W;wC\*sȏu>vE&q4"IZ0an۰.PK{ %hel8УЁkxW,d-2lG6Csa iWUR0)&nTNMh j}[_7~d$ǚ߰|K>N:h`/e"0'!Үzrn $ц^Wř̚=@Qγ i9`Hkޛ,e99>}]=9Sf&f{4mZwo8%@kaoawT?WQgWsGl$RbRz-E9MFIY鬐'{,k&),矣UHv pE'tAnPHXAKo}RhDQBɟrnuQTZ[@lhgıU۪l"OTB#N 99h 0>6UCDfJ1t%ByqLJiC]l8}qz:6;( Ѵo>Ew]LkTmV3QK2{`WR34ӷ᪚Pڴ~qvP{T[,Ʃp 'PpϻWk g%5ØiE-P7)SlWsɔ?g/)VrSstۮ| !@=4mG8D4E$zgG4&](/]l)3d'3!۰Pvݔ $Ye@s$pȣ闏GWӴ U»?-Z*St=R빽_p/Ŝ3#5{ʂӠ ^̬T ,cˏܽ@ۢ@K5:?WO0N[ZZCЗH3Ev@|ձ9  |u۝˄榮SAISnxGbt֟Hˆ6Ͽr׀Af{p)PSN9 Rɐ߮밠l!0@`J*y6/`G]l#/e\7&yQ~J?rIګ3w1N"/)/S {Ja\3//EO{CV39BvT28U"'8YS̆PtMa$ޤiϚiϥh n:n2{1 1DlP I++Yf!L!Bvgr5gu-era 91~vIEaE(xiڹt:_uapPPa_3M\|٣g2c{hhT|6SĘSz\SK[qH.Ť4c,- ǢG r)9E/؝baDdSWUx䒡ᇔU{zM1 '=,w.[75.i|܈!Y;Yw"w5SϏ`@uyD?rA٥[aO~jHkv}R7) VlP__D]WGR`C/^ g(UXUHr d \2$!=l ۫tqiP$bQH3ʣc3ǩ4׽Rg7q 7 .K58ri6K9$E 2-հ]kDuya~j]-?&IY7V]a%(!rۛĮӅǕwL~m&Et"y"lL&A.U k D.Ml:ylojK;P::Ayk<8Q83VRF Q*Q|L}E̙ y:K_`+ٌ toN lgS<ѳ2 0Q8B?1Ҝ7-6%1jZBbdftL]wtC0!*I߻$"wu_כJ@+yOHS.jɧjh$'j,H| x# }TkJpH"XxC4EWb{Wb'+kuJ2U %f %$vjMa zIlq4&7%Mib/ZUGi3)JTmqse'ՇWS<|_HFSA on ^@ʻq4u6!oMȟs`a`% v.d<"h#Rȉ:O*cQC\(PNfv?ިs֐@Q tnqYt!l a:,EHlI9S~ :YxA9bx{yxzM s(ovzםq^(8pe`Mcxd~; b3@;c?8g.7$wv1 r 'TD \l\3L"a~)Mp(>"CQ9d:AǩøtB"۷zU0᫙O‘('lUY=eHE̝'bHuo^f?уWG*>d} ~#j=aЂ_F__N|Dp-V}xh =2K%YkI̍ t7!J5אQsD)(G˼2ƹ2A m"ޢrCkw*.f$p{+V v+$Sn <NJ.ZdTEd.Rna%|*<ŗ>ev7MOO qm,;i;،!k:)Asݓ#V[Nsׄ"KDqQ$9#|nTigʼ=/ʤfä@4hbp=U Ɖrqc9 [ޝ׼E1M5X^qN(+НXP: ?qE;Ek@ۼ83z Ɇ-g/D5xP Di߈J]yPkygշ}aDo1Q+J3S%cꑣɛ*(㖨 WDv O^W|/|%sހE p܍` SFWst, b ,. 1D7u)54ob TǠ42as,IsTSs #6ݻHhe8]@+5x.*4^&gqBdL_ɐO;3q$р6l()4O4aez̳))'.rkI[EpHgԠ@'ch`Iz7FΧԜ rQKkĒ_)M{}ԯԦh{'ec=RC1r RZu\X~B)ʠHb($6CهwtPv1hy'cq5mv QKMP։MOHqNۓ@:k~-S!nS;LӮ -t` r*<&<믺:5S š^EA>|)IdBdaN}X W"H 3B08uF.J3b^`LPcEBN R\͚.,Ma.7ӌTXl 'N~ω#ZLQM{F-%e&rxo"_*21,VA!it?_z4'#)×0Ez`Ň۪!~] )(I8q5YZ.J&}lvRn: U N![ûf?X |֖\CvlQĉEc@Ǯ3Hv3b4ܪ%Ԑz nj+x B3>;m9=&Bl"x3Y^\+%'tA RLS$tݒ+[tCdU` %/E3$j^fk}AlhE5 ,U$U2rt^Ck]V/Q.}/(9J;CS34uѲi5Þq^HBEiWy )2Oкmsu5_I&` N&Œv$nhmbej)ӧ9P"_n?K]~QUv-k"rVXX5e˪:+ j(6ѱ|%ҁi[d4Bɼqi2!_f;*$#YH2~&+EI cl_IZαO`kEѾpi&=l>qk]n+%卽('/: FVheg/Y˕L%W)m[ɴ$Nܦ91v^p2$Y'=|D@O;~[nGԼ({Uɳ##įiXP|Ugj0j>A"Ys>#e8>rK޴Ux= IKDq׍L62 ඖ%4h!~3R׶vU/Ox7`U'*hw^yQ_}TC㤦 M^VηPRQ`7g O+uv[eF~LJɕo罿1CURnuKK,GR@Ƨ‘ Ti/ 4!0OqY ރՊU>i,d:9*DM,dM2/?| 4?2R% -4F寲}V||Eƥ6v9n^Mk=\o~LdoE(m*A+(؉jzY4@Kh~:.s^3->h٨{Rά?~gCj^݋ˋ}iO 6O"Q2PSq#L'&N>¬uѵIK;IJŸKr;y8"&:okgf䃙8V QY<fVTwC$%H !K鈝U)`;= \9bW3L1 Lle8f!e{֏~@Z/ yׅL5p0b'9HB6 *H/{CLClz@ \FVl/j NyvsC>ZO5e = 9j&t1wo#荟ue~}TM=}r| fBH=s-K 8pZeEM6p uڟ=MX(IˑR¹D)oQ1vh'|XtET ^]s-lN(wh@eۍ Lۆr>0Et Kiu;F(Be\%Ii{ѴxC+ึgmUd1Ł^}$3c#RVHBIcun-z7o yB.p #vBvk NGC̢Zrw -(P#erhXEq:_"p{!7U{_CһmPKZDꀝvV_m abO6`~U6!]s4T/HA]_ P!(gFgo̚ۇ鿦B]dnXFqu3ppJ[d_}, -/+A3]!d4ɭ)x0@=Uy&Rum=n?c9dH]j8DϪ@QRZ'-߿: RbepS xSBVDDab-)u'R;gND> e / pg @y9)>'d\m~jZa[#.5J#$3i'׷%<tL&8oEI :tO^aFK)+BfgK]cD3-ϙŠncdV"7#16Eb6^/bMӳ}{`.Eݥ=~ ;ju 6+Fo(Z4{Vdخ&ԧ*`;j_ɌיSD`؜:"%y*B嗄㿍Vܪu)z'fT%mߍ'w]h{UڙMW{~x ϲgcHBhE 9 yXW[δ1^JR^7N37pcx!wi8`&'^yK4@>//O!``YjU6I*SD(jʢ6vJ,}I]1ؙg؃GO8*;؆^ODB,Fͮarat?z=݈6NT_3h?#Yh P]@ZY"= 1&t7zNǎ~ϰe4N+Dl?7N)J F(Ƀ<0Ip?>(dj\{+VdHZ㌫&o(ĵr:\E{J8bӴъDj`!rK^$bQ?u H+_-#1tv@vO<>e`pA=Ep|N8g/N9L8)̾ mڒYW.RJϯ518@a)t3G7mkml RS3[kaMq/J<գm0_ߧU1w`$8윆(iࠠ$_k3Y WUUAlwu[Ǫa6`DMUQ:`辂]*G<reE҇7W!Zil61bsRAgb3 q@Uq7ſW}쉠!`Tn 4?JH34x^T-%k%D=R`:brve:\!Kr=l^X?H,FC3zq5<{O~>ˇ"eM0~ ʍ#+d(w YT>JIP}/C>CIGΕ4WaHS("%+I6J,nhnlgvTu \%D!JLECfȻJ7m%'`Br)ЛC,We6!4BY:P8StWkK<0#{,'0!OYr\C7kSP8`L*jqF)m26.@* +r?HOW2Ċ֊ܬ!j%"㌰yLzD{ R&GȢܸȯ1|͘B]r54IpxfkdÌ*X,:laF {d^9gc)Dݜ8NuB%pEɲT@4Ϟ;q^EdrAokΌ_/#um0$}q\Gp;e=|/"iԼ9 jG=hcU \鉈vߖ* cݗUy*U-"GV ?kmR+7=͐ģ8/摟*rȎ Y9Jktu]Xv(ӣ3f'dQMXs]>uoh1[ȴz#OC rFì¨4*0ثV~_j MY=aUStǘH^<Ul1T_'UػILe !R8KD3"%0][z> D`k ҔAFM1M3+(S.)^ڶoS̎$耻첅yg\;nR?y3GgZ/S-yr*n\5 n/ %76$w |Tv)IKADPML2kub}ԙK ]8ax@gh hk*B^`՝&3IӃkO\m|xq~S6b: 3e8Ӹ_f]LkK 2tmb_.2c^&Dvm˧PKk&fw\WDR>ГnHN68\16WBqK;C <켏dVOnoKQmZkE$rHc-Cⴑ4{>U8 oG2(hd>4jZ@}G3b\اtģ\R. !7-`7s@M !ƦBf=iaaikq*Xv?⡳GƦCgS vxH硁|sݺV5;wom-qP;ͥ&\>6Yӣ;~~]L'3dCO(⣊?h?T)(( lCt <ǙPv,\5)2>#^b85m&YS 4]@Ai9RCẸ,\d@@TGV ԲCu A<`,!~;zz;mz QL 5{v&<^ebtred;h46%UcDu(# GT|SFOR{_2qdWc翹OJw;X1M~`fCW,0\iX.G43 qʁNɘK|{*KbRRZ&SF(QҤި)ɲʺN3C }+ނa,@[j  }9t܄"@{ew0ظ|[.'R:*F.OjafڨRΚPmUxʒ:[3t42ߓ-3pKRLS(eЌ-+jbgu5Oh~Ӥ*?#'|6'#ښ`Yz8?J28DTzIb$jV&N. +b⻴[*浪+[N Cv9>:RXsarz*%xzc}gd8cLhN~G{}x<v(~Y'xIoGI h8@m&Gb#Fr%A Np(6ިZ)Whad:Ф#m]/m&S6(9)'bǼSs۽A3Z`%uq .'oyqb+K.l799ϊAq mtL)溺0k)L+Dy)x?(Z-~=') (t}CAyzG*醟ukD9 w!{ fɎ-4z24˙dϬL7~]A\ 9Xc[].d7L?9FdnLL")ڴ%,UÂpKM4zdqvr9{_0ӕ; U}Sf0hJc }+ 2хj4k7ꔰ|z-3xKz`h}@>'v*8gv'QW6 G g V)q:+] Ua(&'¦KS_^?>1&`oi= >z}Uǃ7kaQ 's(b\R`.vky5y >>.Yr]&roH3eK%E+o2([$CJzFnf gL }W8%jk]~_>_ @R&8Y8s?Q7s}%!p5`2RyMruPFRLyO\=?{fG)M+ IA(]|r>l?bg]fWjs^:+5Hx:?fFVJVrDA*Gş01ީ~Ћu{JAv/M( f{%Q> * yU*Ed4?]$Roig]П_3EuAΔ = kFc&R E[TB(PUv5%@sd3q͠j{*MUZQ]g:̋twZchmQ)bm2IJuf,쵍5Nep$smp94zU1ͤḾ}'QkOjK̸zU/5&.鳋"X~Wop]um}")ɭHNW>W%Dߝi2@ acRy:-$ WH"%\\{3$3jF nJrbY&.mcӐ/"_D;zHm'&MNMBg7x0JPgɢcuO%{#r3> Pg AN} Y:a_.y ]>C$v㌥xzouvF?_Ӹ?|Zc9(p̈́sN BVfLWvLt{Qc4T-? |Kyp oA0X‰ 6y,H, %^f žyX"]~{Ibr<,TYrl}YP-anUz_ ~[7KBIu;@< fS8n7ڀ}fRdۻ6Ƶ0*K[yhbaZ0[vCNG,^P}]5us09pUW*)_Zjl{ I欙i$X3޸ؖŴݔܷMws\KImugg Jbbsն_]sT<}笼Lx R|˦ Hw2ἂ!6 _(x_?NAgRWʫX]Q57&jY$ AI,6XW}:vUz@[DPVފ8|˽*UBʼ&2JwUE]_755[e?2`PoH2Bg*zsCYq3@"\C|n>Di[t_ٴheiN-9%|ėEuq'u&fⰒh%h Ts|)[#E0]p/Pb z TFhIp'-KpMN6RgRxXq Y윈`O(4}~}dt'k*vM&=VoFƻT(c* sq,7~l x\J@\|͑u|N@$o#@t24Mw2XG|'Yp(R&pȦ /$G*|p,N c0b(LHR}CTx/UB?l5?LԞ5-|KaN,e Ɨj.S,|Cv‹Ѷ4J^Q|_Q윒wTpWl3Ƨa{v+)u"t+1"wX7P~CWBc4",L SMcPQsEnM F_LC?Wu4\&~#GAVꥒyO) 8"{Z$~1.6eªqP]4ƣK5?|=m2|xo%གྷ*+Tū@%Ao]ou[kC4VșÁn|e!,yxkD`0]9[ԯyٌ'b0\ lLze3o@˖Q#-\}wſ$O|=⾞7>ZFTkܰw 3ïƓs 荩^nlri %.+Z.tx$T]KChVKc N,n|<'|~$ox wVF^đVQ2Wg'qg%G%9{te`H "p'ewrrV,6,M5Idw\ܗ4l=JT2G5Y_E4&|bꝅ!A$0kL̬QJ%s+;T DqAOdx%]$( 2 F,~M ]^/ ȓЯ%΃1le?F]"> P\³⚄r!Iiø/=)t<:q^xl<8AȝChNm-@tVQf o޽٫2@9Em_iEoL"e6-{ZB͞agF#6Т]lXhk@h&d,9wwURzO; +qt*Ф }I.lD.rBt54*(yC=]nx%̀oUx(쏂va Я[ T,DynAӱdؚDASnYu6zK bԕ#r%L5-)^. E*]֧߆M Vdv4kIx`n2հvbNǃI{n,Mqsw2=RӘQWH#ܴ'@1lсl6kuGQ g|J]/W<酮e)G(\!OΓw ă^:=#69)ytS8|0 c=H6j3ybi{}~-qe7hm SaG9TTql nZwPt/%M.CtTǼ=lD aDuO+\5vrb0!5W q*Β~~<];pԢuS1BxdcmfgYq@,% qS]]ɗĀff]=;7Tob"`eQ i6M6_w:S! Y|":"毐!'C!fb"<*I@cc೧DHd磾e'$%#Ex#[ ׫pȫ2&/^/^nIv ٯZ-kl?/[ItlH%4MJ%=DpԚy=%0% \$/:QʋH m8*<ڟ2kqceŘWIR1cQq +|?5A\& bCOY13fjZ撗1vG_x*j!)qoI$VzFzHpF.foaW_pB sYSN^ם ^BliC':{= l!(D&FXybA%F4~V{3psӿrd[!=bW=Fru-Z`$xs\o>eGE›^eil"8;GH,]*W~U'%yTzi?W(c2u(3EΊ.O`l5̉oI{n"\)"%x&-4b`tYYyeEso~أYXb ̯3H|U E$XZr;5 = aodHvcvURcG2vىJёHڤiQޮ$(@1c:-iUVs_ 2WT1D@ Wytuߣwq7^KLHw8Z1œeĽfNt\lgwFA1"(O;&JrJX.Gʯ0<=s{ |¥VOlfQcwzy]'Akl&(_P7CS72'e-eGUP}ݸ@*m5~*y`V/roԪj$ S }5 !gYiY* roBKjR(bL>Gz`KՁxz.mDPs DɆ6c_ǂ4lrDdͷX9R6@wG_/sfPeC|/;1W_`ں_73 RRh.PNx/Z`1GOY>J`ZFYψNP|^OCYԭk@oVL7_KiPA;4m;^sS\!,;z.Th0A_fWͱ*F3("ab=~OFGoU/ #?԰G/HkjpjGx"EbEqq/:D }ɈkֿhA2X'򆳑<|~ Hx>LUd# =WL|"@ų5:֋+,wd~vӴtq}FcKmh827iG\#";к+6]a9]pKNbvU3[8`{f0 CXĒUn3o{t2ŠDy%d~?? D5j֓M/ C8 Rr hP:8@򟩨TX= _ϝKb, <cP,c8Qh14?Ƹ b(C6."@w3>j1 nD` em3 C,4wCu1:LxR |" W71G;F1 7mM,!rɒ;\ 5B. JonikgI1=El8juI#d ivιHJ+!wmTLK[/1cF2R|_j%:G06Ɲ~aVV ڶ ^ۭOz |%jiA M7e$-ܳW͠iwN6zFshˤC &+M_ x ]:TF }`xn8cP/VKaUV=͞nI!5x"vxunjHs ڶW9j֗)`[Fl0x'_|ӘGudktd Z)o <"GUh[y#v _l0*X~_/FMu`)@KtL @zt+1xK&)^BWQ- ݙ_fˬNTJ|aWhCBR"itRZ:5%^S[:0<)acy$^U%yy~F}; K9#g1м,T'V fE,aE_OETu"O렝3XPipnwZ&ߛ#Rv7-[!Uăg}Ӝ%(%vC2'H_f#O^ڒ"x<+s2[Zޒ_y%6m9o7S|$h\Wn}_,, /l^d;mQu9w >wxɧ жoWwFX= mS ߇PJj CF3!0--q#`d_;K5]`YD@[)q%%Z P  nsm/RVcȺ/KPs\#0O4 0Fѧ @siTy-D _o3s5,O12vX0) ~)2Xe+}qץVn `u֌69˩sB E!&t]9Gmۆ6}M!dF{`ޫj_2[r[><;}bь vlFO_zcs8r>ĉbӶ<[gjp~;TS KzǸDroc7Kh!_Z |E K;[z9L n?t" pjqW4SFk%KHqG\PцN1'l=2[tOV_gx5|-UkJb{?Bi^Y/8܉|pGUq8#̶J|W KU,ZysDu"%Ul-/lzh4DέdW)xe3wё]d[y Aa?5UmO*-4?юO/OMC) _m8jeCh_BdUj1ot< {$\`ʍ:Ql=&]n?$ƣK8M~6Oܭ7^KKmHABނ4+'Wy~;"au$hޖ)u)?x9AZZX\4GruU>ȉTEaﹳɕM2/.e/G )Bo\`Es!'CF^&g n90iՋNbk$Q[ԥF"D 6bὔ=%a 0{TAs$(7Uoc'~&}\Kktnxt K2&l"cFq3_5v-*{.vHڔ6oRvAicy?4(_'!y_?sMpP؛Ei#qPTt̾3QLat/DtъẀ1Կ]o1xj4$L&]u #a0x/8vB& L\C+?ZnGfS|$ l9f(1H[n-oOTے8w)(9HbvYEE,zy&6AKh^K(MxpÎ+XQT/tT>2zνtMc^֎cuH?Чow{طy~5Cr˝..5(DK]=61*Eٺxҥ ?I?diEp~ePGj]pۮ8S8sAwh[-o*T_V"GQ qxMxdbPrNJ_ m U=uB67a$"ߞmE nR/_LTS{m22'| ̢BEO ̕D-wi,WLs$"Z7Wj6*sQRqeM㛨:v9 *+jo1d{v#8)$͕|:6ĦdzÉj׸΍`(ǫ_sƊ[#LЕCL%i (]ay*trvƏ6n$b Ur|pbz.uIF:yu71[j79&@Ѳ8V *fGnyl1ocD#[#$˰he*Yo?Cק >4iRMu#N;]G+(w-\T V^k=١Yt7}3}: p@[P9_t 8ےvbi-Ym1ݬzs%u$5EdHqSܝtk5j KOV$LxmNJ*YkP֭40 41Vi$iw.T_Sz5}Co%@ΕgKn{kwG2[D,/;'u6/16M()g֎fE5I3~vծ/-bF(BN>ў^?n72 YkO;xv y:CuL y{0[OtW4K h%Plbfl_܃GFrЯF3O|QU}N4 !3uHK+T  tjBr*}D^ Eg͠TRڜiu䀞8/H%ngT)Ⱦ1/$8z}OK vu2H!e0r)*9œWMq'Yܗ?ϭ>&g'^b7:&?n.ȖKO8=^:E9lKI {D_7dXɼ={iCAgy$3}]Z)%QxCEF- Kk$k`Hp!eT^_- 4?dF\ ̐MM',E U_)+0HJ}$QMATy=GCS|-E>x\_˾ $P!v4ɇ= GX] Μ[n+4oXOCyъ{8Yh$%%%pǤq^Yܮ|{xUwui HUN[Y*~v_ttp` Xġ}N8[u_/ Ϭ W^VcsiV-DQ*BneDtlGXËw،ңd1jn.DֲQQk=tl&iHaBSi -n[~;FX}=U@7jtj!J{举-h@a3FoydsU,>ϊwqĔQ;MUNx̦-oDh+^|+$+L9$ygYO3". nATۜ 9QÂ-hސRBc^7+ZdҸ1/UuU2;8L;cm%rdrr*mI>/gbna;s'{w]/+t|:Tjۓw7| fa;@\KebZdc%pZGO+[î0&a ]b;(xůp}*m˭YF ˅  0=1=eSFn',V@g /0J\ߞJ]_("Iu)\l#A>ݘ8HAG:Q)>5Y U\RC#z{L^sAfMjX$Pye2׿sZDe6K%8(ɶ?1uTbN}=;;kAv(H!U~lLiOz\dI?@2@GN`24ZKaUr_v,7!1&( <E崈6&R2hmbU|JGPɂʡ Fb~̘ER3eA{hu\ߪq]?w(̛z~5.eo%]7 ƲRBS*LT Qʶ=tSc52c="TV+ =ti=EHj%WeR"6tp QmWG+@ws'뵀R?&Pv] dߕDնڈ(!)azDDCfJ2aS/m&ȨV &~YWLp߼>iPp1'{'fV f @hU-sr,#_)T萚v@A*/^mH╯u=)w04jmq&Ri`mS銒v'm[%a|4J|M|VN+yj lI13al-m? ϱUd.`5_ջkbQqW,jB HQOQgP9Qźp_=N3?о Ԡ %4X&K8D^SP`WXic[i*XZ:MQ3nϱgR7i|&N,SGM'_*)[2U1tً}%CAZȪĵ ~@-8:N|&f/,tFcAfq,g!*O,O|º]a~JM+ql2̽bwǑl{LgN'FcO"MOLmwS|څ.5-sn\M3zpLJÕR zrT^L@LSW'J~f{l[Pܯdl`blΫcXiG{^47p( ؇́0!pJTˀq P{I9ƞ$ ([5oU!ƸxHf h&klp8lΕud_|~u?4QU3itZ.+c9 m`{G'W%/=\: x\Z~X}$>4,xVh|y5{d#BV| :wMZ3n+&_^B.̴k\gt8%ryLhLF 7rRx9% O"*a#17iKf=&Ac`v]>;1L2Ub"G48ؽд`3äy<oGE<+S:*D0q!S5jQYWvXI ?@Ux؈oqrF1%tgnDt]{ו32QO VQ!ܛcǜ _!48p"6 AOBO$:Qά`.G6c&i/DhOD7]# fRR u5j!Dp] kt{'&XD3PRbRșº`Asр$OŔD[!\uh <|T9yCj_Pr$ڌovC|)uŹD7T̐ o~ 9茚Se7,7=AiQW,Q;P9[ F<9fCC;!ؘ t)%1ј<ٷkMnί9~duULL6y.WmezL6b%'W(Iv<:`Jټfxt&?\iS _7s~䗕@oZ/M[@7OY2|i{B%0-̤>0O).^soՉNs7YbS6S6It НS̉J>._3K%LIy- gf#ah,Y3dۆh]YF\)[|ۿݴs *j.1ʼYdfEDG4\%yU$8]ܻO7\ W¸7lYϮ0 6c\.ҝV`OA {  eHvG`oR"qB폚O *tEFC:fU)6;"`e-=vS9Փkd)1]pÖ' O$'`)n$iHYuET=*s>=-*rBo_1vv_ O )L}R\rN]\6I]OG'&u:\ƴ;A0=[ί|ˮ s)t7,U?s X"-¹g2e8u)}m=$Y9Ww'&ul=ŗ7 n43V6E߸hj1n9T#FRc@8\A?+5owXۭ0̊šc |g@#&3B"I~Ob -6``o5|A3/Ni}t+{\j>%? CUDs.m`` f N`aϷdlaM!W-WR[4-+IA ?͗XA?f6 ʵ6иSM/:t2QYٗ)BAyZK(X'h_+; =PNBQV>d;ݝ0PšIvRhfs[ O#NxPWX7%@1p3mNq ĨleZtxN #A5.Wcy0kz[IQ0zeN(R'*:ԜṮGpڗL?ꚋW÷ B^`='oQE68QMW$O.Ug} zAEqP8ZLSp']DId6{Rٵ\Z f9ybmt5Õ NLiT2YK#M:-<(5fVpD:JEstk)W)B= 5m<"(qgyv{8ʹ _-bӶǿ9#vpϼ\ƴPՍ_sx.U&YfrXChpTeFV:G[\ M(%V|[ }M(W r/t i@PZ|Cl)+Yu^}XcjWi齗 d:7_Sx=?O{|8nV.;yYQ$9K6G߂ϛ/8yJ2'{ISe_}Sذ=O>W ysϺRo!lpǫqçyXJcPrѤF0D V^D`(+_~=jޚyc>sc‚ignz WaJا,M4߹`un5~Xu)E/?!)3H }ٓein rn,xk uĞ߰ݯn+r¤AJhQSͥɌM\F_!3$+f+'{i?jBRi 咞L- s #rBQN mȧ"2! j+pggOU%>"&}O[koz]>Z`=LgIQ[~9t}BeH Dughgg?ЀRC`v5imXHzZQ/rK15W̧_m4* q?lVb kDڦk`A\ORx) @t2~ ]f -gƞ,;Os"+ H\1RĮgH܇(ݤb $W*eB :|+o l0‰9UygciA9?0xX b4V&Wf)7_jx-7)dօhceZG4d^r6:Yu+']&OmmX3N Ϊ+J6SRl2kzMsā=4lӈ[_F9#}`  H|^FO֜mz;0'kQJׁʘ$҆2 ҥveO[xw*-o)(ߣ^f?uso=c ӝO̚   ~?܎;-':f FEmfx{'/ȶ)@կ_Soڽ1O}TRiir }ڽK *̬ʫhjwxLg_LPl $XKFgh&AՄŻ!g"?-j8~mS{g}Q z 4PXĚtHk19ȭ!(x3Uc{D RQ+\?fh6&ٳGTB{O6BV:~Yc5ȭs16!NגV(QJVÛ>'k8Ԩ Uܓəd+囼ߟ1At .@3 L٢>t ts y'?'y$Yδx8RU<(gbM^`Z5y;,QX1Q\vU4ny_U ?w .cV)m[ÄB Kܒ)&ОxWHAY?7^@On?5f.Zœ*YN(\jV*1`uzNuKk]pQ+cQ \VĦRFI2[?ޘ\ ȉvT]UCOc ;s~i^3pL]npq+GOwj!U"ҙ=^.&櫬 N"9EVH;6 W {T5Xg+ΧߊcV5Y(\2 k(6B/ִ^$ %Cf(z# VM\DI+?Θ1E">Y/rĵ<}_^"s sY{T ZV^q R|N[ vLS'u#2UP:f.8rjfj98LBT%"f_[#=igK(V;#O6,n/n w m3thb7D_rՒNeNd3 TF]CR V2v U>Xg 1 ç!FxZLU-kDB6aQNxFMwM''m,ቀ~18_R@A!ˇz_f/3?fھf jy/VuJ)E:Ң;a҉5}UcI!4_hP_ X[An=*85h=BJ4x*YwT`-ݦkdnc;E#[0mNEnmx=(a,u¢za=ʠ;MD* Tszoa#P)xC89I̊88* (!?jw 7 6;ȳ=%R՜p2%m넀;s}͞Ľz[_|pX[9N%BrÝF@b̆[xȖ@aF'Q/䙄bOw_ |q]{UR\$%KTwLE 8R-48CsN }QT\k%Zfw!^"oh~ ZAHS ɲ|ȘfK N10=g~8/>B6ְN\%^HI^'٢=0kW5(>NfmlNBQK#XmWt&ھr.C e[#}'V%Õ=:JLkPy3 D᪑DŽ *^5R46oy\-l;v iԧ9=!GNeqW 4MƕB)\ 8^r!O^/d]Zh+Z5|-߃[vqo2eV5 y )~OPc|c" @E9Xd=AnZ Sg,|~oCW{-siܡr6OA ;EV >&<l$m1CCΫ,}iU\۳_Gf@"g䈳XΑ5;wI8CyJr3kss.)àmnyЕCqfW!=}~;Pn9bԸA4[H7$ݲ$Mϊ`X#/֋SNx#P?-o{ jniLyTp)L^JV&L,G.j ~ ̻~vIw)Nn,U"}1bN#h̬!鲤.[߿ 7mo-J6m.7qIJ PR_ɶVu2j#wM V22fo'($JK?Sm~<ŽQ:nk{ݫv7VEd޾f=aX@B0˯)RL\> 3-Ijj J/MNөkgЙ~ʙ,7LJN[1@hoxRW-V\EYFJ(x,ƇGG<6(FȯNjt7•NwH;:Q(kW73lc<24תNRRzB |=V˱]=W&Zp:bUtNzP} #l!*Q,P uc~o-kK^M:˦׿ߍ|͇ rtVRݱqgA@&~%ýoE<I .I :^~o8W`"RC롩p80g*ɍkZfwX]C=C,ǭx,dAB>їSr|D_Xreݽ7JVw@ L“eO 1t LV۱f|IvF~]+3?a"ZMn*7qHt%sLj4X+ܥ5D3J9iH'̴)u fs.XL31tcH+ =}1=JLY$i(4jϧ+>d&H'/K/i/ տ;CM쫃:"\J6R$-ݪR]FLcvG=мtZӨĞe7KG;Xhyy`1ͰD.9:,)Vzfۯ# Dƶabˀٰ;r7)l2H_w?ST۵ vmxel.3%Q;/L_BpH4ؼ*z$8yGjpؐ44~߻l!j70$2NezyaH}aª4t""lŒ@gΝՅ.?KmW#}MюHJįnĚnd֯['{Ƴ30`X\%+IO< ^qh5s.F)0+ ʌȔ71PLm":@A4v 'Pfw.`$ë+N:J*`zOzm ?bFK;3+fxGҭB3Y"4er3E|anRr߮ט<c31GVUf0. ^,o-#)?Z~FB(B+d)1ڶ=upIkqj)9=0m(/*l\'\ªLH n NPx??,-Mvz뺧 `n4J+45R߻):~W B GтTnv;" Zomذ{cEk\<ǝu-t"1>REGxUn0P<|t>wdsL9k_w XN*ĠȂGshdy${Ֆy80 =Z#zYo #AH,)e)7\|_.Ql] A QG%qnK#k̀$.A L5A9 !pֆ|ѢH{t>V6T'/ؿ\mz@lc{qZ_~ dtMRKk(Dۆ7Ɍ:M;IjMh6=jmi 27,bGsvVؔ`2 X#3l=/a;cZQd,~8WibO.'^˗z`ad?{fu}JTa;Q#&A @MIo>>K` 9Y9.;=X\@r$/q{f\i!: C b0KTU79x-yy#~FLC1Vt!D*f`(s}u5wꮮcNŲWv֞e52\Nfb1`'E2^V{RM;N1rOHѓwaK7]4`$X(p OdQ Y V+z}ۖ T1{" epg(~+qS:H'!mwx 8WB<67d#2䮿J!$PgZX743r&낌 &_v|ejuCß&ZGrNרo㏠%x + 4=k`.?YT{hPIDr~'9X# *;qG<<)aYˁz}ahG9?!C2u qX64etF'Q^-y,2CUmlzKAаWeIhzR# (-I.#sѓr׶ ynXTBiOT-(pW gaV?& \,j4!*>[њ6Ô5 'nz9/.|˺ƱWR ej P_Wn;-ѠkT`pK0?_I \.7+L.b|OSHzr@Lqy`PN J/_y84V)㟺LozL! ;Ktcz] ZLy##9ðP61;0uU7M"ag<ڽ%/M\b@ ժsg$kH׵gOsr/53LhLG /ξHUs.ƋN(H ]ZLPq.3WLF>Wrq}&ޠѷo]Uφ^Ϸ5[Pv= EL,0*ߓdaj-m6O0'}n wqyL/<]8EP,E9~2}6O[~h+W.H\k&Fs+w#>i9Gթ bkVI@DS&lNVa0w"R<EEbu+F$ -ǀmfYG3 ,+ >9P+Mϖ0l:9T5C25r%ELxQOaTݭϷ!mZ3|G="NJ9Ý­lFOϢfz e%+TN5cN^&ycDFB`NSvfjmztY_?pJqI:{CER#tIv[y/x~^O g4ީgѽ[r]\*;3!eV"X%̛tdez"t(ky9y}@EBM0O=i(YQ6پV\*s&7 hQdaɏoI֯?NZXl_e"YAmU/Va;6IIZ(lg[ˇq֡x XקLRW5fP2?(WzZh2st}w`.>Cnju rHdZH4җ`ME0~ƽ#Aa,l@-B H.gĬ%.кK;^C8'U/oT5GT ,WSG˽*.?Hdmɵ=7[ޕplR"YH3sPD0 $4GW ݔ9O Y7` <8W2$7UhSM{ #yc>4L{Yӳ@1s ]в/%)hHdC5{Y4]%'TAmvz4^~FqA24i̻@fF:o&(:nt04j,'N ] o%yV"#_'rXʆgc;œf c!jd-{K*Y5AvС`Hn ʺ^A9Tfq]V{Z:ex4 woUwLHˮL yT`݇XS;O4,ZDBRЇܼvDy+3ނ,/F3RE~xHBs/*9!bϒ5ҐFG;vB*?̆؞^"ʶ]3Nr7#'ɴت@ To#eNUFE9P?R@-˶'֦< /.z^iB^tvj}݃D· ź)go8Gk4[ɴeƭDe\14yrP].Fy˨Ce`B>]SU>ᱫ@&{mМfKE; CQ1,VT*keYv..4ߕWJ'Z09}7R1z`@_8ʎRstP?B~ cQM4Q ˘e(8O)Χ:{| B,K4jeQֱPQs)J,XxNWb-rVSdEg4,'0Mq+z=q~='jɻKM{*qa:,1"w*- tą XNjy<,Ոa oLt */3WF\Jw{13rfWgv̴WNIFV{FG.X~3͇2l8+Z^,3Fٶڤɹ0*e.c_gƅ&"12]՝:5~(xذOџe::vUo1x y' h|6[mhRTeEhTP 'Jc.S-FGg#-mi'C f"CvOQ*ɮ:QtV2W,T5PXF*h vG?;Z୫aљO00el@,jb+9{\e7ٙ?d獣ivuId?J7g%Cd@1qM_=иP:}%uһh P~U.~;Q˅&@1"kҌg,ĸ}8+IRMv> Լor=_1 tGj=aעck;@Ĥ!̴.,ueHs RSFs s7N_0h6c)u'|B<#bP_;ۖeQPWi 5HnLGl6cOY UIzGزɦzjod.s0+ Ȣu\W v\4m0"sR+pOxߊ1Neά"  Q_X{КjO6S;P:ߦ܃35&Za VŎ;JZ~o0wnk%RGk%lTVGVǮ<;Lr X )_N=E趛|&Chto;-`7 P?!ėJ=)48"!@rDfVD^̍)$pf{e1NT= y?ġ4G$\hM߲IorCvY+%1ǡZG߼?3qבePBkL :&.Ϥ-gע(@Z CTqX@W jr dž8:6mg=W^.8%dM2+Q3lD\MqG3~_Wg!TԯsAr?ڔ)Ie|*>\-4E]^zʿ_>$ҦWB+(<#CA,תSihkoN9M  >擴z]vAwi{aK}ҪȔHe/|~huqZxv QbjwC;tkP4=c+!xe;yE?%>ag}$" ^rW1G`Srvc:X$dFH {H(g#Wpm ƩP~"}'l1R{MP'ɝʨKbFRm `HL8" Br9zL(Wj|ha7&WI^*Xbr_d_4a|~t[6 ]8UݢVH1^.q@w{>u7n;op2ǧyY0Z.θ*F|K` p&*ʑ7 L^{/l]O [^%IW3Yuur I[fqA#Żi+8o+BtŁ0c;ke#oqነ>'0Bz>TiO,c^M9^`́.:I/,ezeY #|= vqNj4L#ڹ:I& "BdD~Lj7Xfd \7l0 ̵L㲁)ʑa E8PrlhatlKZ0:uw}Z;0 UCú+;p+)@?4,'&8$n8EAc0oj7`ԀRU;nU0@궔C 7DNPh n|)*$3Ym:jI/kT6 #_Ҳu. w}ψu<& Ӊ&S5`82!pQ"Zr~ l;@_yˇ3qt}fNfݛZj{g.2ATC:q?jש0s>еD=e`(J:r%մ4ޙAЅtL_nK zT:Vw r7lₗ˞%|/"ɇ_;'K]|QR;U0[v7K4Æ=R͕i[L0vr-njy {N 0)Fێi$f9qƳ^5h/ALjg̸[1L~*0\{ bkPw:@@q=X-.U‹Pz2k[1MfY|`s@r {5hqֶhhc7A'|⛓|EEY]_Nsi!(w'`z.aS;gjz0v:{."0ȯ WBZHi㋞r\ٌB53wTy i_k:Zi*`M { Uٌ(3K7qaY@0~k. <I6vZ!.YF gr 5e\H"; r0 =墴-Z|S? /]sN;v)ԕ U3/q0Z9(;>`.6 ^ $&̔!e#%%ߥJ7O:$1.V[c:y$ki^( ;V|' bd[9IDZLc6ai[ju(sf3#|`K%!nll!Zь >*~XE 憨1kmɍZ˅,OKd~dZK=5 :zGxrj24Y&Z-tmD)!! Ɲ9|9^l̗W!wA%}3SN$4K^d,TewinTAG27=$}sŸ2qeU'~V?7Z(eEw@,eP,,7>kڼ9Px$p 3ٙxުQF&Qe>!r7zw-tߛl6[^T n]1Aw i*Pκԉc[..Zw|zwїTl=2ƻ=#vL<"ϕQP5C2zPGMyz~&ntXbFcEtԹ/|bAԨ :C]`JӅФ}ˑ2,]~ d'71*5۠}V򺞴c7w~xm@2s SkV "mcZ(m,Ym/yu:.Y!F"#E#'٤- 5?.0Etx"BR{=Uأl,_ ["o.ytXE6Z}G6 ׉\RŬ0+?q2lBx9s!Q^]iJ/PUdFK]V K>5A)N Z~AnV፧JSB/Y y H?R, Ɉ^CZ!4rק M;Q: 8y*M{H|F3:%U%a7$#V ܈+M[1o wf_?aEfއLgӁ *j>"DW_ЩS ]a-ŧQ7]sICs ?'Fzj1p5m+Q#y85wW%;aL`dΦ{$.tMO@~y>*66MJ(FW: Jy9{^cޓXEE_GRd^z9*/j%9WL@hBd@jLJՓ+&/ND2\UjSNHߊ -j58) / |dm'vR"dɈkL%#{rdlsv f 7Tp⬏IkjJ_J< Gƶv(gB Emab"٨r%9[]Tb3jgDvZⶼ]VHiOw 2~c) $AJ!jPȉY?_4J.~;18ҿ;v3Ѷ_nuk'%k fwX0WfbLe #SekA\[&ZJ3N{LK"WiٿK] ɽ}~Am+$``ds<\X-&m`r]rl. Kn>狖Sfny&$~:n,?-PA] Q(Rڔn>JBFbμpQTp}M񐾈'k!||5%s F4 _gkI OEj^Mz=0 ڍRc gU%HXp@vVd4 3Y!%&S˰F[($oIϽJ5wFsNl]ݛUo #] ]Hmv{s?WCvk9}I#-X;q[ַtыb(wne!AF ||7FOX Z0CIZ\}~m*^AӼ+CvZ/걥=&QZ*^uJM̩3O8ÀC~tH[x =9xU>eG3Ie5bvDcJcȬ$^Z)kM'5 LbbdǩKNK`F*ӍehWc㶑=Ud~Ǎ5*ذb9Sr*sc/nS"~955nkchfM:D#`B %E~NweZzʔ@-r:. 6]١A@rB۹\vIՉu93fnO?\AE7[=/(8Ya+d³Z*k=*q n-h?`ubVBM&(/Q8;NYgvRO~owڦU?YdB>bJ2B(Uf?oB=5t895PncMh fy`;y: yءedM#Eqҋ{lq2 Hsfo/Cb- e\B6#E?G|Q N55}n˓ Kp9' B/CqBIÅ?tΈ=n. ,`ytޛ{['J,A_\:{$ Ԭ`!eؗ\ H+G e#"k iyBL( |og-QZVvtG? d4-Qs}L"EpTg%tݕ=^!-g-|F8oJO7Q8Ţqq#ԎG}TBVudɠ K Mõ| ֱOn3vkݐC s߮ĕ̕NE- W} "j5 7h|5˦dE4[d8eN?O&qf_[.a[vGzQkaKSL6VK,H%5ǖ&Wʣ'Ѵ(r)o!<ǩÌ Ha矾qM:&al˯L7$%q!1z^\sZܵXct8lK/G-wosOk>3yDSo IV}|؁|x{mhHOpV1O}WISP` T[[=bwl8]D}W,6Z-~6Za#Nes(RoLJ55%Ʊ@2i>O ÎڱҳPdmM-^T`Cq%+ 5'c)s;qvd>"SFUu޹&L:)2TSA[*@L  BW"--R!b.BLe1-Ws&wL{ FS+WtC YPMؤQa|hbW"=/m0QȬ5֪A&;l'f{tω)$ aI.ӂ4TrNjN[%tCn EP8ï*AMԏiDA߿sALrxVaFl!{mQԟUZk*H.Al/!Jr'nG@;{ 7paIbU6/ꂘ]Z\hMctr 64w_^llK5r${岬hR @`[}y`X1NB߆9[&S.hRܡmudŧȆ%g_fjYzx+;@Hj܌]n\6MfuL plLm A\iw9ep]J:TD\vEN+xY>t3MN?3R ڇɒՋ7K{FɼFnl4i(pL*xD>:4[ajQ[ ӷ^^3RJΎA@YBk{ jX!K=8.uB`6źqF25.&f?\_ͲQ F֨&^QVʫJw? 95~E`81&|Hf%ோWs@By|!xuY_ǚJRm\ΏJӞR#}4R:m0c:%آ"Lc5G3Nڻz輫1gJnhJH8`\Up[ҐqwT ]5{C֝lO4\B@)gOXe~I@l},*Cn8`c%D=@Gd 2Ʀ`by $8gMå:OӰ(jW#ZoQ2 .8!,.*{(_Y0ՋD,Foh94wÔɹ2oػC ۣq6Ia덎WWd]D|;#mwS+qʆmo~|BwdX#<Sz!3x ZǦ@3" k0k3fD+tEΐ)f[S˭dg=0q3s*Me@kBoIRC-06RQ)ȷNf _ 7D9M6sVe$jW/R*ۆ) V2[ͻt:D 5si5&q[˝Kn(M|11Ae(P[{*se 藆j!NvE!.(eQB0{~SƽHPRt5.0؞e㭀I:rBF_Qa >MHR -?6bwRcldd[| @Bb=9P@0%뛙.GɿǓ.cS 8j{䴬!֚ ٤jf<`tq}IY#=IT{ZD\*A w˦ƿ tidj-fTNwx) 1lZs~$`1hj$~ɍ`>4&;)0ݒAvʿ-0Ơk;:!bl<^reXK˝2OxBqJWgU&z. U||:Te?UCpV*䊼hIo^8pr߻%pLc|IIDsfp9D'AzGK#B͌_@Aɷm 14ZG$5CRdC3hbͦBJ}ت$hJsgC2J\@4WD%XPsE7uja"zR Avp6 P`FꌉxȬRX3`HfW09p/Ѡ=m(oP'8{㳍3Wx?8\HrXgfG7䄹Hr'GuF*N$E&݁MG mqmxyg]={F? 8e}"  /?LdwSN¦p7mL#}_8-X,=3RZJѿVb dRE׎gwrjn[U~rM4OHꈩiI.լ1__Y.G(b3KH aMAIƹR,e-|kn$;rWǃ̼o e %RP(A򒃎| B±y}ORVtMd-v8 bK-9{V2 Z4I;Bs~B2ųxG?\au\u;4p .D1$,kf3a E5-Ɯ-~&B"I7ͽz9ʔ5^nGHbX wtm9F#V4|@rϻo yb,Np!4L-u㋼Xry+cU8#RʺM:ÅwSfh YJe>h/a/_W@š< x}3fS 7cR5/C`#Sd[2"c YDk~TBst$;>J-PSjnkw+Xq@~1uޔ@lpH|0h q}{N>lFL2%w4atɪ2[gpyhB[FaDo./Rxbza>NlBFj:e; 5W5.H)ҩTyh3bŦ$͘(&&x Q#f h!Q|9WKr'*ҰOڲP̎t$UK B $#DR2ub VI{+;ֺLDH'7(vq&BJRGz>BK@md`rzEŰƛܝgL%`!-+lĠv:?1}iܻŬ/-(9 G'orulZH\ub!Si,?3c#X5~ "'}6f"+ BeA%sY rXc:Fl)Y|0LmS[H|~K_PIy RT`:Vwx^"ᥥzzA$gv'H90<2o& ENei=֡0O$-l%I%c [e/.!%bɦAEu25zI}7@v@(pKK#IT!,e]m + \ݟi"~*)<˥):٠m?0H_Y#cRCI.Cu)rTƵ$O'EKL!XJu$vqfk? f73\DR NK?APzH`OeJ>:> 8FN bQߨ ~QQ~0ޯz=i@&DG'^l-%7o+^HosQs`fYV?SM,#^-& ϕahm!Þh6=Y[;/$T()Jjn.ڀGwy,-X:㴎^'7 NV5?ꜘK~lD@ׇզKqyyK9i!dMIL^")$w2PvJMDbz%:=ܺSD >c_WnOC"4`:Y)<r[;p+;{ η 4u7DkF տQ횢 >G co`$I1Erwݎf&_#{t,:Ҏﱯҭ$eܫQ6$_τJdP@ae ]G :0kv;;XjK3iI=Lpj+k&/.mAр_ fTb<HVu9tb:z}JvZQI4Ҭ$4 i+jѥo '#$B9 |`KX#bqihwzEOeYj.dvwЌ>3R^XҗZI 38ϹL8猉3ʪ3MPb RnoEέ=l{ITOqMT"XNըgîZl<*T' f2 bkQ/` 򉧉Y|Do+|*# 5*꫉h2|?ȕ3X_Q}BJˇ\t3?%|FC,kbfѠ@pT(3}D=YB3 WfZ[hj$OU:r hiƾ$hRGOfPܐPEe-=K`_I"9Cʦ 1 S#G{Ml8)R$m%J[nMysg{'D{i'ZKv+$n1L F9kpE`HsȢž5ٛW# Bw2fb>?USe 薊`dnwQ(m_=lIVw +5Z1IJ=HAŻ *AOYc,΀֮@zz8d A|~*^q*Z i2ELB76 5ej̅?C!^,tmE4poy![8;lHg>jv~})À~pl=AQYj' ];^j㞉|=6'_)q!^0A"..q* Jo^K 'RCwŸ <]hNʉq5VY:mzb٪[ DKE&&~r:#9$uEp#*5hCz'u CA}Aڨ^|[=c%P6;ELKBT5H_-A$ ˈSh#{w$Bpg}W>z*wߊiVRMz%y;.E~1)!7rpX3a5*8]ƛ#uꎺ}A|41 SF28}Uy+;3ͱ3WS@l'OZ92)vWp`'X`dWsub GH(pD.#7V Dݔ} .,Ei0h[sB1[͔#4p=?OBX !;h|@H mу.ZE'goGp}16~Y8H8>\ppV2up=dc98Fp mCq_u\';IUYևcSLAWkچ8*P2.Ca+Vve3:d8LuШxX|W"aeIvb>/|ko/Oamʮ7# (ŕR(c%%Lrvr"%䨖}z><_+&2@}̇~8Z}f1+??cr#xCe13SD:ʶ9VW9>qZlߨ I-X W&ݺ\(5EPBAihDALsr=e{ѝn5kKcoٟ` EuFqRO}1Mxs"Kz#{>gTlF4[ʝ 6,!d4A. @Щr* \/]?t0H@q06gbqt/n= \H. c^iRLʧ<`!͕"!jy3&s@ +-i Ce97+XOlFk{B\̫\/1$yQ}O[`Q̽i1P]qҁI!^iG4hKC$9 h$ckbSر"~9j4CZ}R `ܿUGT@mvL[8bV:]h|}j;| >4V&Rl-cw{Y5;RP)™ČxEڠS٘tN~fKGՖJ3,'yѐ-W BϐbT 3z&x;w7@ާ4oe}@}8fߋA]#NV{i"#TgZSy~V%} 1!GR(q&vp) bw BM$z(Iw!^&Hsi" H~>L@$[0il=lLwd9@n:-@sQH@ 5khR#˴h 3WQ !yh^!ulbkִ?yɁ G o0B>dpE]nGNP>]9'䅄hWH,ȣE e>t YZBt&i9[ʆ$OAkn~GRQhP^>kތKB{au=g_WŶJ/U;Jyc@54˝TKԢWG7F ^\Y6ec `m̥!lYg=L!lqzG]u)^aa( :^iI|,;6;`[! F%Tp$⯓?Yzr`-v/Nb%ǽ$2mÒ7.g^aLYo~ wP0<{yyKS6jv@ Y=*4һSv1SEi~VjBhU+#0k~+b'maW,SJMrҗƝIT 3ޜIaOjEPS3OW.0% `oM0pEb U6*/J ,A0Υ||p-uтh5wWofk(ws~(l۶B\Y/ TmX$I]XvC!2t-eJ% M j(0cHd ^W+CU.+}7 %&&ƽmE,M"0ηA#*Q 'FN~N#8-n \f6Wnn#(K#"k[KXhY%Җf[g&#Vέ6BH*.ٹ0WM "s&l?G˜SFW 3pR>KLL>7 M"p"Ę4Cn>Cq\nd7F~Tǃ*,xeWp&2.\jAlr-CjT*Ѽ臐Nc{)~2/Hb m5 o&?ﳖ s;VfsaaR ,  i-rkOSq9QIK^oKGAmKrC-Z`:5G-, m1bIh~JG%ccE<݃sf_ ZkN8dLju6,~aknCnqؾqKdcX"~:6D2=Ն (!h%޺$5!QRQS!%2e8,O]SuP./]`?scSh֒]&݈,?3 WqxSU}3ǚ5Tta6ؿ,l EҀIמa'9 G3h_; -LlzY OeM9l(3~\Ȁu`7"B`y'm | )D΁,Qw0!ʲ+U HFcEqL4j/a&pj$e榭@[Q_ѕr-K0a>\*Ӣ_q$ix2_W|{(ൊ W>pn7sB7eOcHR#,m6K\.0s` 7jʏLrb߶#Bf16ͨ9$DS`,oDImPȄfWBH]xa]…E/I&A=ԜzX.?傺.tqg]"+SlK/ `rץ$89Gq[dIGzhpQ).|L՞?2Π > EҠ;G Ӽ,E(ɰAOs@ N=> bv#_HD} C.\΢WEI,2X\#M Rj>cSQEʪZ5>uXbدxؔvGu?M <9c d\2S1>DND4s(}\0ahzޅxJqjDi_$ UuقG^hTQS-*u0;7 bQ}GzG/ PD&Vi* \B6)C(8|r lxBfA5И6v|;@)4!HW \>M USِõk|L@$y5!~s3VRn~n O٧dq2m,??q@tnD5Vl3pR'7&aો9ٯz~ljb" &sVD<~#cߌ5zmуe ,/'7 +|HbfC88*,bғ,STZ(7/McՃ f')%غM-cζm] ) `ԙYPAu?dO?lApLz*9^y>aM3Zg rjD`DP`|6y&9N!!߮&F'}g<(߅=]뛅Wy[&NB? A46 sJkPQ ;;b VZhtVހÔ._Ez\#֞/cx($ŝ/ӂ!** CGF06/䲖'TOt~9EJP/ŝtAwR; ;[Bδ0wbv%hE|g@jߓN+Xi*'ͬ ^O e7~0 -nwǏ\?dL]® QVoT! a20#{wȒIph_wHc@t*HǾiqq[z_Իf$Œ4 T"e4S=g\<f8uY;8!G9quDTqA)xWl6QLo%SކPX-OkCy2qo[VE$k&6hk֖E$xLi&Dd |:qgX1t@x,bbUYC6??4Vpp2m@Vn>yTJXCW䋡{֦V4mmE(O͚\h ޭY'4d)viV!-XgZcNEg tl>rs3AY5wPQU苖Od6Ft5heR6.$ , ]syj-6?1ˢ_X{öEtg,,C[}bI'քLBJEL20Q.% J+Ӻ͌hRX영@.n瞱̐z7M%B/J%/8[9_ޗ aew"++%YICv ZdؚgƹջQ}>;L\# ѹ m6-D]+F_`0z8.VX3hޜGNHk Z-W%nB3]boP\E B$U䨬] OSGm~^OI:prsho cx*ʾ hub]L,b͕)@LO Ӹ,۝XnT=#CXH~ ȇ\*m 9QKyiiqxc Rxj$U3_en5pňUr C[=((ilYAbc!I"ڜ  `F:^Z%tWJc%FP9A6}ZP<[5b$F7} azVM\K!fpIHe*ԡ]]EvwL+p=9#|e1\` ,f#k4i^]LE*:. DwвX ;&EF+j"i7"kԄOH;l`ϰWϕ0H`m$3#B"ubEbKϋ&4y [:k,?,ႚX>Y647g[E\ ~uQ "Xd,YhݾKh]&0jxs{ZV4MNHF& +ǎY9=¡l텎\ PZ G%)P;,P Xr d^VN. sQbRqqvExbF\PxV 'dͦ|2/:Y${);gE\74ζHQ&NƄ`6X]*9Xeq,MjhLB U^π\R?# S/Y^` )H#V"Uj|H#hl ŢARo,~ kHmgqn6D[מ9FCvob";9S.ctxZ\nˊ$m~`|]xWOM@Vw+gIb{ M̆e')~vf,x_U8`*|Kؠ 9i'7Dp>#%׮AGpeKnm*1$ %:j'uqgמR@оd" wXlЏtX 8T%{qdza LdLz~"pTA6QЙ4WzQE ؗc&Wў:IARs`buh2#9@3j|w2TyfR'W"+$=5|Jv<6H8$o\[qx%b[cPPY:Uk?O%07*1rėF n#zbliX+,+~ږSZ >P9O^:K^"ϑU_5dhs7կK*Dyj D);gQ4w~RcH~Mv y9SvwFt L,9Qk;/>0p*bƬvzq-1ء1Rp?jtqpmplj2w{HkEIL]L8C(Q%2KTy~Y_Nwk5XQN2^jOdc·dagpdQR}g$Qƒy Mꟳ,qI16KĈ6aݟG:U1# .H2j,E\ΡRCr3uAi&q+Dqsfh`؜쾱 3spx}A˾^zKt6lK\$߁c}Rl6b* *vT[Ilj ~ RlSfLc SȜc23trX`+?O5yń:RQU)ڮK_VF <A}|E|=9 LѫokKV:hy ^Wj7ZGMN~y:|fɇMI@wwĄ6x c@*&ّ;0O#LH;<;C&pa !\4QIh ͹$.7PEOyEqu g5C ֬V}Aw}P# `Y07_"W;-s4)Fb;[.g".Aج./7!2-( vTj![/yo_9n~2ĴN)8tDߵaJB[併u~)PG s9h9aCaa5.i͂5HBE|Jg*BrֻQ{ Ȧ^q>D6n2 ӝdjL)C HŨ6*l2hf߭kBgq3#; pEMX 6adfP$TQzN]]?F1iC儉ִH~󤞙 22 I,ySET!B326Ű祼qtEnTM0茶E}iRPP2T|Ptj \C'|am|;W*ލ@ ݶ)MSX?)J0/zI5JIV5ȱF, __uW&GP2U@Pem2r&b+YBLkb^#Bkcn j=ƽ;ejISvi "|Xإv%mWj1K..mUT/nz￯^\oX-}yj`<<*qI>9xd(W۟nl8́{y]\z ;PDU#qL4 /17KR?[uDjbv멷'Bs'4y`ĝ֍;8 ֶrPVԉ(iv(>x;kf1w+c197^%*"w(b}r9fXq;̫KUuub)6YKToӚwp(Cm¦f:J~e% 58ԎmVN#ٷl ?kW`Ctºj (=6ǐ@ P.ŭA{Hu:lK9q{̗!aS348hLmt jJ~5U˖p`2~t?̈Oɽ's_`ioS3 \7CgB/#x&lǴДWF&+ⱬd 8&$]{%y~Uwš &o+xG|v`%z2,)W]#,ճ[Y4`z2SFHljQgfLQ+Q"`dypY0skAUԽ 0jlUz~\Wor?Ox͂8E 5ֈ;7Hݑ-)+1^RhڍnL0}딾2zѲO@wLfb aIhPcȌ NSLԈ63;d{M(hlWЅH˾4}](!|$_`p MnéhcgA|:ZH>&z8}[?+;+8H_vP8r_<Ԕ]7a6ߖkB1Z3g=Ue! '6 mWفG1f3Ҹ jؒ; 'Jva|݄ɛ=dE?Vr[fwo.+4D-6yV@*jXhr]*BJ.-Ip32אgꔕƪ6yno$VS(&rELi ݎ͞s B@ dr>=/G!7 Jtz9hĵsK)+ gPxQF"^YE+6$nU');zTx @!QW/bnJ<~[f_ _c< Ik!Ij_W:lԚJ` 𜶙! ~2y;:nI uf eB)7mh N ex쓈 &,~/1w컈4'v4==R=I?.p'N2We*"8GŰs:q֚ X<%޼qW[-;";&ׂ") a|CX2AZ|S[g+<2ig^TI|t&^ڙV^SֺYsu7j^RA8}Hyޮ њsO2xWCEk毉ꫣ'UDhT˩K־˓A?h+kPC lKWl&X;J\o4?Ne_!45߬np V3iM[(fuα&# =7xAL>/laxH|c<6ç>8%Մ{rKM<z٩87x`S1N!msamujC7/0 z Ҍ 2}FSl9BNXcyp~v .1>z ES%`^7A^.%D}`%µ\\X , n"#ީ#RWLxIoC|fyO>|?g_~]UCdm,!yl_fE1`zx(uhIJkODDe2[7GebesE.hMNu->9 0cFG处/1Bfn)Oٗ50"^J#PUz7al00}2ϱ(A1{s ೤iݠQӅ悀گ^i\Lrp BXsĨ\@Aև\S%c "2X~,tn~%IēT=AWZ>+r3Hb/]J5+ȌNI[4H? Q%mW#9[N'f̬|TK:Qfx7_˞p*[N ծO 3dmӠŦeCFp &_KAz6eZI9)QπD'f =uvZu kX& =8}4\~Jv IF&?pƇną! [-QzL-d)Fjm&T'6'~Ȋ! ūs/nz 'Ǧ)o52t\glqd'g^lr+/NޯrPrgyմ߇2 z84&8P;6v3z^2ym-S2@[_|I%!LIkpT5B~64+OT42Y7 33b[r{*Z;v$SCV6']<z}lf 0UM?T ,n1&Yy,LU9\(G<6m9&3Pfo ,] BKvs][{=YUȋ2BBV/mw >L^y7'x` mL/D[WyU 8̫`7#, ڈJM(6M#֞ 6n*<9jqGDQtS+F\P>$ &>6Q5Gfвuix3$6Ѯ#C7V+RRZŀ*ѡUĴ% 8g& ۹g~3lPih3 =#l SM W:DY{P>kJ4\@tbxTnGV&+"Dy;B愜˲UJ9]cZ9í{yy`u:p[Pi@B2O^5įKgB*`6i*^9jN}~S/GZqV=L˜OA\:n2#9Nϧv7~+@aEVՔ bf'>X K|u "띆.Iai32o Elhego^@WP"[f|k#vӉGa_&xس8KEF.$RZzyP7"l'iW8 *ԕt#ĆX I2 , +rER?T9y졧.{glZD/29-IYA(OJ)nA&X >| bbJ۟;ϙ7n12qyu9YHөYؕ}|6&/ ~?}>@pCOEݶ/0y;BC6#L{v{ƟVTYq1/^\>#լr[J&I1_ߔK=wuw=HW S >8]̆ĕ4]:7 "D͈⼑NKnRf U suÌ|B`@ ܁8&՘C 8H$cVB_Ct?)(Z`%S .4аӽxo9cx#yD/d"/Mc'*X9U`vo9Ӭ0";"y/ ߃B{iϕ6L$\ jnrָЦk#mMԂ,޻XtIK\-M okg~':i\DZ H*i!RO T'm|ij`y ViL121tChT#ṹ`k)9)̱iyF L`oh}9@hA+"05u 'j/û;y"}"ߜOʩʞT,bE௴ zT>i\l=EhҷTqߨ b)`a !^@@*=Z;S%E? i'\+Bpw@%V*'edqQO&Y-T{5EZ1f~))[1^S_]:!)sȮ?)`cp3|sϫa`6?-ՏfQOS"M7NTlD\$˨ZG&MΊj#l&7bȉ4`ks8|!MMex=,[؛ƃ!&@JYe7HbB}:~LL}+ 'rC ;JzoxU7!AiO 80L܈EKfRn,wI t5삍(T= l DG{̾LR"I:d#+7A"~B4\? 3I8p<7-#t@<T2Vg0L^t.-ջ|C[5Ԧf\>4Ƀ7FN©\Α51ObX o& M9G* N"NZxL::kFIɄ\.^Kvhm4`vPlxp'99BS~'k-m?ROoJQ¾4ўeP,ybUeI\,,6*Rftv{:gZ63J:#U'ӽ錝;Q@M٩[O]M;5BGs@^Y/ú$Q=q*s&Y9̍d^؅s!x EK rfnB< *k,FdQsXE}NjP<;LƓ ́Y a5V![z7}ѐ@.Jy·ljmb*zs͸_Z?_8ዕr+ wF}aXNN%i/("վ(щ v!jfϑTHB! t@e>$oNykD;26Zxfڴ` O9mEW}b{wgY7k$8ۑ:#Q_DpypFǽG_nX"q 8p/n:נS2=d6leءSk}\>I &քݱ)i'6Z/WFĆ&als+jؽ#Dj D NEpL`0kkbo/Ā4WE*f|֘z䓴x+]=2ι2^n:DχXdM eQzgI36Vb} or9x!(.9s5 DK;j/Im.c_#@FڈX^ik]2VX>g<.ʠHTVWguY{JG*{i)Pڙ+uNVk C@-N!yyF|MHT@:]hۏ ,cbǘ\#| D|Be_X$:-?D>-nh0n C/בm$Oi.j8VPN`7wma`0PAxfm ϹaxdnZh9EjN{7$f7d:mS"/)s?uʬ:hvpMG{r`W STHJa,  kOG C-}ݾ;!$0)Q\C" ݟ*&Ŋ p7~3zy5AMR^Ǵ(mte@r!${[Q$p)rjyJwbJcOU$Ucx3$9vdW:Ê2DO7O8yXߦMF~cފ!dL %m2(S$t՟/}|`bҋBҠkHHzB3G&?131@ 59f%7@r99熻f 3Z#X-R0qQfX[FG/sTµ#syjʴy]D"*|hewWf|v,L 17! _zbG,Nd] ae&ǼhM8?Ӈ`$K4cNwtm@Y s[C6װ_ZSR!<6 4l]/޶H7{46N:K J79_s! '0L +I5۪]9NV+a+¦֑ *A 5:=ĉtlxNBQM*I6ATVV1O<"3b2`K;SiF3qÍ`''6h|͑=c_BS d[.Gd^Pr$)յM،|u ոV,RDW8dΈ ,NdbOǬ76U(cLNŽatOtp}8s[N4\?y%/gzcBW~&W'p1^:: jlcw0UĆbouZkq|jȤ.k y{md|ljJ'+Lg sk8secdK7ʭyRS!-+ V6M *5˦^"Z7=@xNtFsei1Q=S1Ψ)dHu>q]ɏ"@-,WeEe-q}^M"Nk(\j9(}^L`xG ˸)ߑCkk?əM{>.y9C) ۮCwx6\B8&T[}2Wqzq.W v<=h, G;G\C, %H WBS|NvT$|[(,Jм4VH"Q9N֢"Ychaܣ !epfj|zTD q^Z,Q\fQ֥< F+ )]Jڄ9]ԫ7l!,l#/e0VC+hp\CC5^k|< RpNHz3='vEU*geT\~dj< .86Vw#3;=úu-!B^bBfF-0rD+/Ed@+^\[ye' a8M} nmzVsaܞrAXh]pAtr[us$p!FgED"?4u0CSZ)C'kCAr`jIe"\m,X0>.'N-s'+.)A-ƭ3Cg^f+ikX~΍^{ b/\p|Nt rN('_H6~5Ѯ'am)A b?W>?{.Hee XjZ'p@JfQ" ķ+KrS {VSUx2AAH$IBM'ꑑUSp !@1V:A|f$"ѥv81G-fF ¾2wc*5n)䃮Rf0Qr_9E*ǘRE(bjH Z,H\HD~<XDc;/rh~mOa/P2P"0[G{D;SN/D'9 Q\biLn"WS7kZ{WCh3|Ė 4҈tˇfYF> D¥;/\L@jb@lg$&y{%)᜝}eW\ƢXf3T Fća -E\ YIF-O3gɘZt=ϙOgݑ{_Pv A] HG[pw=qXm {5.H6{pE쬃'|s>%9*׵X*~MZ;/4ZΦXlT\@(L,q*Z# }a5g]ZuC  I3+j4ɎB$r> ԜC.U3i~NZD=)/_6%9FL|I+dm+ib<3  DV!-q;~iϙ^0:bcnV;ٱ@85/_=?YBcsȰ'jqɄJg.7X+R<5}3|9wN,@"ʍuAJZ, -9((2*fX~o ]xZ95ͯ@sj0C&^-f-*LQ/$LN:f*D,ăgTxJnU7V&VUhmL=+PJ?u fwʡhUzm/\'3_HpYi^϶\WEÏ  t]9M <>ٯG0si+A6=Ժnh稆 E;$()?)-֎ MIéFྮ! ^JCډzt^%E]6+]|vA O773<pn_l?,3lBM\`&sڳ\ Ԉ<`> g8gw7;$".4,&FyoĤU ؼ1IĨ?[|&C*}tlrnuRurA/kp,J$ksp)Gpga8np~yŃ83,IV!!i,FQ' ݼ- w8# VUSТ( %D*Yu@)9Ң ugͰdD&&KtFn:x#زcgRN<_B,U\0bYȎAV-GYSil(rj2~!})2~ohM֮_pƆ`^F ȗ3)†?afiw2]C4OyIĽBZme^mEf?7X"J0u)gA<>Y y+8Z@tss ,%Af4n5-~r1r= YJQ^yX#9bXo. "/W5b#y ~8r7qs0)#zkZ[C1Ґ4KG.R='NתU+F֩b}6wŹf R?ھh:Nȓ'dǒ_6f JݙC,fp5R Q_+Xh+*B-bQ!h!fö!)BEqɟ2`3ė(ԝBsFP(/ (+nV0Ta T|xʓD/+E ?G[|q;sU6,#%6h};B/Q5hjb;&!ʓ|i7`JcXFx8&Viq dK`'T e<|վTVb%AFIe[$ ky$Òuc04Z2tu vh $U\*m;}Z?k}4a XNtj莦T[ԆBlfl>bd$a0jX efBCK}A9蒧W|tH_@d1QP9jBeARevPO VD}e|A4K= q485>K{cehX2͏S CBmR,^:Fv~$ljkmZ5rnz^c0(C]w|^;Z L oiyLU=S+[l^!98n߶yIH2 P*rGܟ5l:m 籣dا0%$j#]_/n71h'@Q?VA"v5i\`2z]F|t h &>-o )t))jH**hH;v+IwYx>>PW1"˝5)^Ec翷&RH ݹ5'JP ׽ 5?˂6]B-FD&"m4'Jfɜ%qq:td#u A ;M]吴/yE!PR:RɁР#խx 'mvl ]c֦Jl1jh[h8q}*Ǝ#)eb{> Qt0Gp&MF˺dU*':*I"!),j<%',l\Zmu_,H~N8E|!M`ۓiZ}PqZSіf|`:9} Z%θ7f.{b4X}EWiZk|٠3C0kY-sZѦӶfA 3|O Vtdt r.m8U7- 5VRy(|‡sYSqx=e{J9;C]`ͦ+;{Ji3ya7\)TEo#x22. Z<c8hVD bH$J^xuԜ AWoFߏZj:گV_CdA"H0frZ4f-v*KIh;DD(!F cHe٢H(XGm)YH్l}g4W[)Y,Z> ㊒VL~l3>i1Ur67G(M`jjXK_؃ aњl[Z+a Ue.+9@_dDfrC~߃p+ 0i|?j&tEFbS<6WP!lܐ#cU,;<"e٦BMr[-lfDEŐB{a-rhEpt6¿:2;$aTpiT=QC`Y kUd=PZz,&@֯i{ 1)rDxC jZH\$RҬBG5l zOӹɠ;>4] 2/ f4XaʵGFOD RGSO{( 2ì<.(bdzNtfn1'ZO? Ъu Rkqy'A5 vR~pB}a"[43ȕrM'v, H:k!qy!;Ed6P^Z@?[8]@xZtYЍ#ͭ'n #pE]J_vu%ωRVXo ^13y8f2mo 8b_ ;Ҋ(s\CE'O\"}9NOhL>C0Na1TҿJh߳#Nl1(yPAt,bchG圱c9Ǚ V$O jj!I0r,9JR9k~L1Tʪ9} ڑ % aiݧjV#dk)Pݹ^ޏ,\>+ܶL~8(=xX"~`sY8Jn놼HHSâ)f'd%tMs3G5MpM7K7 9! X&Ad6;X*=2D?SEwJ'V1nW݅Ft6ne5s0^VV*+`+u5D&kڗɸ~5q`?zLi J 9i38|{:<zӉ/\ Nbmb%'Uw _/R&bjik `Yih;b%6[>x7hB*g/xPyl n=5M|'w0ɪ FL~]gqs,lLV5WcSgbx)/15#+2 19څ-M5'C>_"ҡKd2`*&2ާKpOtj.0]mXBIckZn]EBJ<}ޥm$SmB-SM1 j;11ZS{ {^tVA \^*ِA4%Z$(G5YbTSߞy[=KrWm@?TJvM lE \հG#FAL ji=WFlX SaYIFYhTdg|E/Q(BYڛe8pA-AO˺BR\ut4C=ߡ]/ӗ_epn?J \;N,ٙ0lE> Έm*#(EҍA A[~' r-7l<<㞡Ǫy6Wa&zĀLGm[wd].&Ӟ X=[~Z,  NNUf>}@F=si)c$xO2Y"XK%uk 54`Y' cVb4TJ;1{w<g%zIC .ge_>&$2RYۭDu44:=?p yrOiea]IAUx O]_~$h`+0;"I)Y";)|M{ E~Ζ_!f\uDR7B߶]Sx_il 6LC>E492gVmEѹVXZ%HPF[F1&ŎyGQ_VWwR(v_(R3l!55tj) 1^1 g]FҪlI3>ׂ>Ht oea?fuz`Vc&A\+CÕW˰F1Ƀջa֭gB`#jdp\vGO+-;R1Uy[,LsAX./Lr1Me]-Kbw=D[< !VnKhvXe5S9= `FI":E+m#4w#%3׍r&k ?׌dW/ilv@1[ϒlg4GJ$cJ$ovR-/}0#PܷŃ~ 2M2:D~e*뎤]*c m'kcJzM|v*+9D <6Fw f补b2̐[z PbYDjX~+e# 4t&*#^@PS^\M/ɳ{ G=DzŹ~ raJ7DWgjcg =ȷdޥI-Ēhq*%]{,-+xU|f0/Z 6Å,[zvĄP`cVHx 1jCB#G|tiݦ`Ϊb2t &mЄZ}#RL\$B3x۲oF(:b; QwVn!̚࢕nh9 hn]5f/o=]Jص%&/jqTf:9jNM}!:Mv,wXƢy/^=nbSWc2XA9 ˽x}'r$( @r,\涁6-@d2Q6<+chE-@|ɶwx!4оQbG9jeս6ϴ4XF̔n;NC4ȟ>Z˺.ybkXC&%32[+eDY9]=W.]"~駐&+Dn`,ϥ܁2>Ok<١ЎD4%sSũ#0\Є5 K<'B0fn42ܩ4\*um^ u,9½LEz.12u|Rȸg^ft阿k"`3W!!d`_6r]4cAQ`4Vz8CZ"sm'vkeqw|D1]=Ƒ?ݳ%|(2*ĚD {?\cJ%!*="7 =F{:}dmX6PY)-l1F /& jkl8mpymr(leEgk%J Q+nJNs>Ld=p8gq8eݽZo=6^7j-pY՝0рg^ ,g)vu'jJÈ̚Ûr#{%gʊP(Y)o7L^a;WhJQGH0V+P^ǗwW$ i i KVkT{@{fGX];d08,9dbbrP+3wn)|7n N%o5.OV+;#8TS"Ʊ.*|HiL""|UKBoK=Zg5p܌Q h7$a[fq-4 N8ȹYܼk1S]~x٢nY#0N#E"Uzḇ3e/ ۝QwvxJa3-o1O7%Tksw\t5P*(ͩ)WI)9ۊq iz.rED%1 5O_Xk w[)س{;+V9w]JTpEuO dK VҬ1+Q( ؑfw]\H}H["c60k m)S5PUkR)'7Sy;?Sh  KR,݂iJTtTu yeAX sn@" VB>IFp'Qp͋yi{2됪{m- m_Z9Y?MNַ26;"> bܦȇF.}/vO1Fqqg#Zei럊.&^}yxA<{G`•r"߲[Pj~Z>(F&WnO~Ł܇#6 @Ngmޘ[Hv Ai:`n3}&Լ  _中[K>jA@!DI;x |Qe5&u3Jx"(']( [ny2A5#JמZw!aC) `P<1q9? at΁/u5FmR/ʁ.B]e^Է%RI?ƓPÓ Յ p.C2Yo*>#B@}Sm`t~:Wcmc;C~͟ogx/-d$MIɷjoQ qU5[>^UUqNmWR m02wY{zz#_<-=D(nHrgL;k8%G2km OA+_xh+3D;*(-JėW,J:;t6ф6W ׻/2ɚ-bы 36/kze*3P&1۹?5[sV%|Z"lB^_Zum8]j[.r7i98T2}.ql%JJt.d`])3uScR6e8i;(FXG``\Cyq71 7hsB3wH#$B. -Hre~] Z ӏ)a]K/Ֆߚo`HM,rJp'4 oS8Sgv^|QP˰}F[{՘E. տbIjo+L@@8f)#eDRa!P{sx⺀<Åo1D&.-ՊfrFie>dwa̿7VɵLm3\w|)ҘӦtjyY.*Ȍƀp*<5_.!rl;Y ]0ݲЭ pti#śaCa[V$fnUsֈ W`coƻC )^jO\c=I? #BO 8swb\cY:Z0M^-`{[k[F tyc^C Mˆ6a>qg/-Ab}:'5$ E +(hE vy^i.&K^):gj3ʷLojͶM!X0mZlij#胨@J'H(1ƺQڲ){5!3'͢J ~/Yf '*[sW9-=fZ 393lٗz"Q)ktE|^gQo0=(^AN9"O_xɅ '>Д-g)'znIϬaae3<#qު$g͍=\$!襡) HBKB]lF3>ėicuBdc{(}l4Ȳlɉ |TL-hun܁) Sw=h8Irl 35n4ϱ5Te\CѮ5VT[i*fP *'VЉZ?ʋyTш0t%si&c %<?mT&y{b>nE##a;X!=&ZS˜Wcx떳]'t§5cȶXj2]pF]Gϰs2)~ f9@8R?󥥐`w6㮒myԏЙsIO+n[XFeY!+}~ēg "V HX"L@"sRIiGڸw/BE1ӍE*4 ݀8#ʡcS%=AkēoP ybFq3}Pymx/̺EBEgNdXƦ-ӆé<|TD#cXB,L#UO'8A{"h >D@"mN?%!UUaxH!u#^>Bw#vH)ݜÁ2 Q#" /hu]hP-3B7S>#('dx\3j+9w_0aqbȈ2:jad9b{7D^Yr >P.ԨfFҗި@uxQ[3!MpBv]82^HvyP mknhxcvԍ CjH b+"!`k8{::qLFYxi 7ԛw̫ ?Cx4X$~ieܟFZ-ҼL Gp' . 9}fjƭqt-1?k|Jcp" h@Ŭ|:lGxpxE;Q)snЯq_V-^ 6)<}ܢye8b"8YAu,;/iD% 4{4IΚWADLwprb+k!ͷbܝ'${I>>.?쿫퓝ښ ރBC,(l7PslD"6#S+B4QF,gЃmm/:~0; U=|ZE!H'm09'0i0q? 7 h o/8OLichw]ON w@GԷkϋ{W> )7hvv^z]$h+ˆ䟫rV(}4zoZxbe oj/_^G~8wϢV?$ =ϴ>$\k3M{[׷!aLqf*D7-+T]mU z\FYxfѲ :e1Fbys7Lҩ1gH+*?n8Tz0 ;]"Yc./Fٱ-EV u 4T2uCRmXko_J)aI+6oq4f!]SXmJ>sklJ H9H^ɾ^] Py:>V !&vvY\^;^Ծ>3r 9-CͰ6; m(i@3c o7Co/$TgxQcҫ ZKNޓA1D-$Hl{٪pRMedf9|SLy*JHo*V@ċYr}0`|m*MiY('HwS4/Q I x^bd#Hh4!"F v'W p='ga?WU' p{iǽLX[ P_D`PLlhmJ(,/Y5EM>E9r4VS^jP93UGjn挬Tn]V!adb+S>Z8d_8nΕfM(KR <u+\QHߓMVP!p#|2w"UxE0՜/$H$ SGf9VkL'$M/v4ˋ-Yn-PI3*>@ )?u_x*Á yƱCǽǂ$*=XO̊G  M0?%=,ܝ;*~21piY 2)i;j*i6P*2+2 _C}|я!`H$(yn(R!A#b·HJ1.{*_=iJ%26OsOP#e_2fOʇ NS P01Vc7όE?E8"u%0_ͭ:t< eM6[<^c<{JH O~xHWo?#{:BXPWR[毓JvBUgSE7+,x,PVT<֟M'wWL1LDŽ~N5kS95)V#K S#%O$K:871N6)b 'g{Un6\Tc(ѿ)7ECK4-[8K6pAQ{K߬_~5uk wƜæH]VJ}Kއy`95@̈́|6T5flBJg٨HYr9Ť#b%Ew @8ߔ?R!5dHmd9-Q8{d-dt z8k16c|nI/ @ i.o N"/|Ov>EUsARm<iAC~mNZlA1I)4V5ѳ\$pҝTG'Lm!ȹ?-Xi6!b٣-QM_HBVrM 3R|4w1;Ԉqy/i,rJ$ cE0$\5 0]iܬ<+OW:[6%n9^1NX&X@\;OG2,øߝ]]X~9۱Z#N Qu= xsِAqfA+0$X#.(YɺʗFs#ؖt-&ߢSp2w҄L->ӝIި)}#y‵Ե+8dLHgcܬcb޻*NĹsevö}3it*/E f ~.+UDJK:VTEC8UQ`ߤxs_Z;uG%-}GIs~x`j$YU{ܫwAsy5I>nMrUpXE bٿqϝ  _!&ȡ׾jqM)Ĩ\XϷ C8[| 3&fRFk3dg sYSJ|D~C4H0>_4dBQ6TMg`F_Kt] '9w$L>UM߉XN<5;hz*:i;TКgH,]G >˜b_Ws;AdDR$?u:>=ArAA}g4gH̦ N7r9myYRJ%-QΤ|Tx+ 4ÒETդxKl>u_=V)u/!P!J Է\G7!d0VȔQt# P˕%;HdQ'9oݷR%#}`X=K._X-34@3 YPiLu K#xYU M';((2J:3fee jqt2 p<3 XʹigE h^vFR9(C_%+{曹)6Amġ< SKFu/#Y?uNSĨTaVsМT޸`{\n*[T*~T\({I<,X^eP(5}\hHE{>3:! \lRlTGӶ؆KqdEN0wR&^R6>4Zc5y 9 )1h2`X~7DNʚp+IKu^XȦ&2nKHjRRt 2i8g ]H8ƒ ;HhY&`_X["(7iD@" U,K;^-z@×t5Y1Ha4E-"Pw(gpo( tR_z]J9;ٜіpVP fH웿x(dʮt`{)_zy|K6=J.oA ,+RJH11b͞q`.O;b.T,閽FBPD:))*sE=id/aXmΟX.XtsΡb" P7vؓnenKTMz9AeN1X)T(2k .xP{Қ/RGC]C"XJ"CMpU7_L'6}C=BUhW@ ڙhgl{t0%"³RNñLդG ߞc %6-_^^3lt]p>H'_[n&RY_(G*=2=4̭>k@3GAGk4% 0)kE aH}gmtyއ{I=|{ %9t6hH$U+GBz8Qmr1L$Z0&&Q?NrDS| `J-fPpH# gw@'<)gח*ڶj:cO }g9Éxx/&]3@bp.ӐiRI˽K+Xcpxq z jG φ+W#2jk*,uoq/f!уa=5Ymk?_Cj3N+Vփ\ip@R~NGڼ?}@ (^BJ7nj+4ҧ8S*UL@Ye/咼b@wN[ESau(/&z/tuEF՗YaKhb-KJe!/֥Mgk$iTY\(cf$"%5bB?!rGN&GK7 5Iˏ[/OQL,og  à6$sjt2<kMe}*5:)uۈD3<\'9QxǷ8ŏK~vgXIŇKNeqB{H UaFpБ8e:q11fg1s0s-gSkt|jнD^BQ$Rxu H% R\VzO 0?-P ʪѤ#CZL MpRGR+a QA\i}zwQL9Oˋ,(X-|:\Å U]ٺdMM)B (&CQG clrp ܧjPHX0fDeruu_P;gdG` :GKt@| W Qs{(lnFma)4 7l^M~~u䏶І qnh:bv0Z_r8ߘ6d#Q DIwٓGh{EaXB_{@v£vGLZ>ϴrcCJylVr(Lm_s<)QI˘уER@FtPq:rK)|~%7ycH""%s@츴M'991 3OJ n,$?a3.ϣtNdeIwRT^[&o}EG;^1!s)Un{)TVQ fy~¯oHmB].'UgHf/px5rWsKfʌe''3ާ@;30}GB\[mT0>tGISڿJp&*!.e#=/0.~`z~m6Bvqj*Lr< ŅhfbISˉ k~U9 GcK ^2YL.\wfHeT\HbbqJyy; )rLۍbKd %ncA|穯NB߶5Oʪ -Enyk.\;:K!T{D(ozH>.\"0r$FoiBZ_|967:.IWBˀܒNÄW^:x ̱0S,sDmh]'Rpwp˥(#XK%29A<}. uo\i٭ZEH3ѷy)1.w]fo-U\22?9 pG(1p#:CDm<YD rP ߂"}/05fDzQP̹UJsBQMMwWkڂ% C-LA.`AԊM OޖDO vK״GV% 3D̯h\2@g Ь/\'U xѼ?!$h@g7ki7Q&%5i.WK~ q]K]Zy ":?9D α`^=\(8$-&&FdGЕ Y6c6BS5찫 RKHx4i}viƔZ.1_të$p5ae"k3{xbi}=b =䌣2<.wNY6o̷= /J絡6$Nty8BfxZ#Wd ߕvԏ*4.r4U,fe*&+QiX9٘z_1M5ȁL hJzuc}dhA:_<P@nn%zΡtϷۓĊF t0k_\1ĚASo$~G"M^$`?P=+ iHVa=矟</`?z'Y$0#o~-I nۮ${uԙO ~! @1쵔G_RKܟ*Zy?D3&*ǜ^\h{'^q&{w|9^q*Z6m-u[xqv|ۉqiD5@I@nL`wICI񶢇%؇[H,Q3n f3gI\,fH˯sr+5/n{c 6(+Ѻ,4^|!#jlc^?  U\W)q|P<Ԝ`zDXRZFFI} IKe,D[D8쫧,l?l^ts7` БR]v?d@$lsF[X$0UD2]0EBMhT u!6)r)bO &.%>QUS8ɂkM/H\"ct+8j+w; `hw_0<@.^ƶ^ʋzsFa\U*?b?ptN6>Рb=?o mC ծZ3vy9IឯWw7kg"v[ _?|r_ZXqu^J׎c3W(u#κ+5vm݃1sf+|ý <Lf·F6 q~<@L^PĚi%,3o kF\~JWV[yۺ; o Kilthz2]dȁ Wq (y^{uC{ D\}C3N d) 9ML[Tu{6jy1*)}`w+P$hr 4j23K>d:Wլ TU[tHR$I+ݫ`DQleB` j&I-&_MPpYV5K 5w拆 -!\ \Ep]ZGF9 cЧY'e6Dz'|pم+d: jhpl}ښx5CekM480qNQ]T_^ ᬍo|$-W y56p~ DMm,NQG'< (Þ`k@"ZDoHA6Pw8K斮B:Va? {_ֆbqs ,@!} - ]72U3DYRAA8|d?&RݞILvvM-hV)YK,ΪХm-#$9rI֎2<*d15c3/i' ʝ5=V$bM+ Z&2\6ЬN;{oT, ǎ{ÅKIzX?Jo{a 4P(X4԰dgAĂkͼe/}3Q57hC%4Jnsi(ܼ쵢?BP4o\P#:3g )s+fILG33,?爭 2?yMdh*0!lz R0ޗ>NqQTOgb!%O6HF{ށaw!Z|=P%H8)9߽@jЩ`N2B~OZltSibV!<)C"4Pm8 (pt66) FQ6E{NdEay|X[ 34C 5iC6Omd O@{]U tHdofBq?]j=>YױbI0-ˬ-p۝VG j0VA 1 5L߽|Geta,o*ޕq1Up*kk嫧sX1Jw@w1gqjaU^>[Mc%)QMlu ~ΩH+l|\w`氒9#FjU%HP!6 lYTɖy#%)#Rv `Qgsh;ѭ4Vz`H@@:S-Sb$Y˳aYUְjo{߆^/yGN O'Sgŋ(@j@ ˛[I@YM"RԥDN1װ>iYq5Sx*`U`8x? P ZCʅ]7G6ty3jHbJBM9lȬO^PhNZ^LsK{Lkpu-!܂>y4T=\ߥnF֟sdjo0P1? Qv[;I,/Q{Ӽꔆ^ <~}~W,8ࣉÜ2Q xƃڞ. Bxg]b3{iTd.rrF^+8w%eY\2 3OZHUް3io?SB´ݫ-%"ͮrՓ{&yďS\ "_77"[[-HxSLg\#}МhO|A^_h`bDYUWUZ퉗>(h5hh|U\o6IzDUŕ&QdCg/qB5lwPI% R̿Ҟ8 &,qaz 2UDW${[3y±9F.-q bƴnоasEAWJbtƠ(}/:#XyӰrZ3EqT`t5%`h # 4E{`.L#1t#$On$Ay8j݉>&@wG0}f&iLUϻe} Dmk'^N Bng| ҄W6_d1OKDOOљ>'X xO<4U!M)hA* 5qɖ>2k@&HQ=7 w g*}o[UPx%{g!wnC+V &^h7}@><0 ~w'_T e.weaXk}dYFJqڛd +6l8-?6l_z87 Eq)x0+o@n"qCu>,e;1 >?}~hᎼu:H6ۡf`h1D߄z*2;u@ԊjAӛ'zl*t -C]E?.S<2"]X !h5F1\ٌH~gS<MHd7liT$+H=9.Yzty 6ٸhP{dVu\Tj|y; 3">HVeBqn5jcsC~v<ڱ =SA(s{۞%S/3Cې=__ rvELhh /84Ih^)CT8"0Hmj{RN.ӁcY)e~ɣҀ3Ʃ>ɵF*soap`=3rO*%T1{r*#_T2A\-)ʩ^b;y!Jr-x5d&zvA`2@F (!렚;r8rCt<Bw;N\Uz}sXSNSԴi n䥍Ĵ~suSFKaDqd0Q'm)i3f܀y2RC򞆏:][h<JF`0%Ҝ}7Rѷ͜xjP>ٹuf:䮮6/&B.BP:0pO]QRmKij6YK!+?.#CNF'$Rֽ 3}[YO3:# m‹dz382T}ԈMhbo#,3L歧 FزșI|+HDZ=@ycVf% >yhЪyp@G!b%- Qcgud(ϒ_87SȀ+^'Q#[_T8c#( /a!3<ٞ1X|ykgCiIz=(3 Ɗ#z[=;NyGӤG*D#Z֤rEWvхtA$0VhD4@ő1J2NʏouqXu5SLugz~SF1"1PrbRϜŖFã ei_ZC~ĽOËVV$t$>[Z~bW{np/*ƛ!o+ ^> dM.wT':3;9"xwa؏&5 +cBft3xZGOi(ƜIʬMn2[2z="ClpD% G$R\ƨY,F :":tcN &S"Qc!x#^rM:-g"lV".a+3|݉oӆ4u_BN)*f%PDJ߫Wa+!Ѳ2K 5)UPV&"˥5Nl0(#1ʀ؟Ҙt[pݥwYp;j ju; AZ& LArS ŚZpC_g[٧;޶ JɰdRl?BNxx3v7:z*!ING҇✭c~#UU{p2%z)@-ۯ&vwԓsJa AR->t0Z_X]c&||dm—(F}%Abbo2 Cs@2`$T̐@RD-dzd?Qz\xs_!B̄ {Hc9iss[Zʕxbm>M=e3V$¥_<(d|m=a:d^J頎7l" hF%JHpFGٳ%`q(ߏRk4<.sIld}L ndZS2?:";oӕ5u6utl f*av$-YiUa {صI\TIlʃN;aL)Oy:*Ѳz3Nh}=Dפ8 gӼ>?8Ø}.2.br_)=P\KR6oBfߗBœH6O 12&S䱄X@T@#CS(6g CwF+?xIXM|yې_h S{VԼ=Jmxo7+NcTVtkKMb@X_xiRX9x'~YAFF[$QJ[yؐN:JlӞ)b|:%rRrFo~ "Zay&0j+plƱ*7zd:A="6 [dXĀ ȿƥo(!l>9Ռ3-•gyp-/ Tj2)LdCNiTTYrDG@ fiLAuc&;dXŊo,n j<1x2RR:f[|8WP.7g۱)eB Bh9A%'b_~ 6Np=!Xɡu$s"0A$Ш9a}ԏc8Vn!r|e 'IݸQ1a05l\VycЁM*lyOk{28)s*(lOiݲ{L em#{Jt1(THׄ8Tq}?aD㽨ȀY,wZf=LWYT1JyelH:t+_ 2tmټ\P:$IuCZPp _kjq$7BI'y'|=2hS?į_O`ª83(H Ku쀉wVX*.l}^z}~ވ9{cXe>zh(7Esb{DR\_ds8k<ª5}YQ.K9瓼R}9>O;ȾѾnfXnm#F!D2u%,2lPxl1CBLzY pR)$;DN!"[?M_٭ DBϨMu'I]<(RyEHuK? UژDV)ۓ)x;xUƎva0Vm|KNIpwt?#LWdz @;*Byv$g*W!I JG>: oH;$-1}?.So2DJ,H0$L#|ıISڰQO)٦&Z/} _H^(ogΥWbt*-pY>Yٸd=WA=1g=K>ȜN8SVd^|, Drs.:]~(ZHnY\'f'@w2ކ+3rJ%sړ ['FTA?0< g} 82`BN;N|4^3f GE #L5] (gn 67]Zkc@S"kvc,ݹkԝŅNﭷd6VR-+aSPNR$.SNv pW=qvQ#oHwh*8r.Kl3MZ{i1Py .֑m˸g=r a G}5:͆`F@=] _.8BYGX|)@֫ 1!k2T#ğ!x~ 5/ ;' nב.}50J{M¹bYG")0mJhtX#YI AU%$GqiDmK#$b/jȮe;~[H.QX^mjTKn 3bZG}g/alYve,Sǻlכx7.;kV*1 y$5AB'/lWHۣ?Szy>>&~ RLGE]jj-ߣ3eTbL"`tV5~R,Hgxc9'6?s+6e,H짻E Ea8MjG'X (:kH4ܓ27@1%1:fH̜2Xr9zI \P/V/05Z4Ne93>?_ c%֎^sFoV@EԵ=2 Lyu%ʩ'v4C`S#Yס='Ø $M6 1cd]ms@8b/A<9#(1kЈu3&W:zǓ!si-^pdY&O.LNw~x \d:Ht.-3"~-Tл}nh45e "-\OUmn'Svb(нUH,GbXY $Ovٌ F8-r`=|%Q;6 Y6;_=+r$_8ceӒm!Pu7^B4(%577{!PRA^;LX;0iϓ%GC%[?3GXkY\Eǔ@!iC\!~+ܸh*% 1o|JjSk|[䑱h#'xHv!q[,G%_eӞ'> 2%2_ߘSN~>ETv ;WE-9iW'8V;#V,+ 3Ŝy0 lk  ~'9i:r)M{sيo_Mx$4lNW=#dFLC6ʚn\01J)H #̟.GB-̓ƏQο$ǛmGOHwj΀fL F4=a!/[ oTg Qnxem +Ka_}0c[Mdd<%27,XKiL&d:F]Tpc0V^4{p-M6~jNŒ@^:m s+ 6OU4ؘ luZIVw%;:<{ӊT+ L}7إ7' B͠Xö= kTPujra+|ygjl8{CbUeU  fDA À8&/=/)Ϛ%a pcfHɡpm}Z-l@{m\GX~_዆ErK^AiBݔKEQh+KS*Сc}39|oN*V&q7Y9!ngRT.Vo$fpּ$ -^[D- G`gUB/7}tr:B'q@꺱õ4WD'צZW:/RO A?q}di=Z}4Ao]i,^0HXͶwS5GI_"/۠N W(o fI+ cͨ+h.8;RңJE _hn$+IySĊZnnV Ȫ'i7_ǬylP5e!&(XmiuJ9 N⒡ -w= V%ĨRTqX/m\k8O*&=޽"xm?q| 8)m ̪7(eY`2Cǝ٫P-wO5O|]T>ˍV5N)4'1n)NA1E(!{+N:Q _-X6ZҬkAT9 pjxSHxd $}׈Qd8K=.1^! 1OR5^x.G1 (}6WN-v1K_Yl3-zA`^x'Np he6`Skqr|֯#Ci ? 6(0HĄ8&UnD9)qn[ӕ}AbkB"^WL(Ydk*y{P!Yh!.w.",QJ+dڡ4ARZMv{mDè~Nf/ \`ؑXO= yYYpg3L1nt'up'33I(Ꙣox_ ?]&)5Nߌl );$TI<^x>]!YkW>撟Y`ožڣ(_vk8sob(v}Rii7QslReJ:IuB(bX7)IgA]hI"md; !Jj+`څw¦pwF*W,{wCxp#;OAv0Fvn]#q:xQ.WM1y&7#6tVb! nMi ^/0ǏHP" eLп({F8EݫjP%ѡ ¥eITDMj(ཙlq:{)ƾuvu>!4N()KC;ퟞ a:xaڹ+!Z&ҧ!tʜ4ڴ\-\rmgT̖^`wJ D=ĻgZ|JDJqGv(%En:=vYg"8{p{\Bj>o# 8Lb.95ԷGs"_L46MDyC:IjL7 u6$ʱVoX{ }[׈0r ď eK뷒"n_+؎p6{r3[ \9yCR8xu0Na((42G~(Vka+MJ8ޠlؗFs_pik{7=(dF*6cqQ-R-)$ "3'kTzkIoNGkL`AB g*m$X2oIqaK~_Xլ֐&6tf^7"gV"&hWԇH\Rq :tb?@8*\]bݘgrZ~K{)7>y '(+̯S$,W_5>uB _ڿ)p*"*< k:u׺*`!hߎ)bi?" *Np2%~-m/L!9rɛ t`հI`_?.jonjT_\{ d/)S$b,5śz[C *SS<'`HK- aϔG&'7b `'WE*^ G&-FrB=hk,Zk/] K-AmxRYT7z6>=q`[O88hgⓌ-#hU0ҿsp@/+%mQj|Nѧky|{i;w.:2Na%'O0R@?R޳Q=1Nh4~AFҖ $c} -A̛ J{WKoܝvil? tӎuAqq?iJEpI=ydF.#8#RUa ?P%5@yfzdEߗ̯8gļ >^24"%f,>z[Y7DvyBj\$)Mh'D^apS9|f6l>A,Ƹ`HCKl9ܯl jYdpI*rds5͎'%؈#rsU鈯1u-[B}d[銜49Nv(Tfê)􊼊S/Zn#%HlRgʣaư*mVot3ft*3غ˫ԸE,%2{}@Jҍ/Zi?K@U%PXT(TF@cb E.@ˌ .LyzrZ9?t$@,Wc 9]$:Zձ*HlaaQةQ!6^ *H=Ug) cx-7}+S;3MV($g7);됉f >?Dz%gJ/h:_|ⰲW8rVI=A UuX 4H DAf]tՃ.Ʋ; @J#y;z8ӸnDˏXڈa8^AJwYvNa;;>}̶ nQ*)8LKZlME\mk#R4\,2T&o@YIgq^-7uF9OVwm[M#t^T[UWT]j{vʧ4KG1{r^qV@y a!H[~B~El. %`lCD&-<?{MI"D(^=r^2RK34]iżKja3|Ȓ j2*ΞMnnOKIU묉,U) C7o91~՟xFpdLY$ե z .+@td]@ѧPk| rJ9dውYɾ(tE XdeF]U6Ni6zӁPyX^y1K<`h@U6x}#P@eF2+<\w*}V ծ>8cx$Yąz[W _-\dQ=t?Nh4v?}Y!sʂ2c@"i԰(r>{ۏeqKI⩯Q06(u9E脵s0pA~t*-m6t7;7 *mf/diuoMjkxxO.(l'%#T͍X2\G:Txjk$X[' h(UN^,iŽ Q( yzP( @jh;-cK12`>bfJEK҃tDRa0[- CRYD'wQ:;k\AQ,G383x5Pݵ)%\yql˟p>s*Elц@3ҭ[0ht'80f;Ci9xH?Z3jɣ9#F}e fU[!%Lv/ H7AIJ;ʶ)]mN;no^3]m5mش:Ŵ.`ټ9 DUPsޚPeP[Gg(3&]v+ M!>@Siv532K 9hAOi|A +J;cCmp ͝!:Bԇ  IDq2&f1lI6r{::Ffau1MJRi`Wҝm$iP}y(Kr}r=Ge2AI޳'һ"{"߿,TqzW!x!1S/jl)'-zu៶& 1V-Umf_S#y O.5v鄧8zt`:D_ -ڴU9g{4 5KkZi$IU4&LexPJ%s[!_}lKף} yʉմ1qWI)c >Y ,KyPaD;0ۄ@$Ƞ~| c>Vxր}7| V;v~"gz:# XLe V4G`X qF ^mplrZA=ghsDC)H|7xlx8s'7zN;b d*y O;*aQ7)BLы CMZיW X1?l}V?Tuvhwr|x1dpZa44Ks @)/B_mCK1-?lo-˷1#_% <WTnְaaz;SBP_8Pwþ q{L(qb3B7(,z%YY~drL!O =qtü&w.\co*0qA7Wg--+UtG 6!ɾ2]E9JMA~B~~7ӽ-C oD2{@Fψ G^mu}|q#ItTf+ϸr n+5 XfNO+`/3ӂas(o$"+ ,RR|p~ Ϯ)VXkF짜JT)i;qﴣ-ʲ%{mmkdu(1ӗ%31g[JV8Hb^{6I^cJtl2bā%P3d5v܌#O@^b~Pw;#Ȭ! Iay')=Q X$(p0wMu 1+WD !iw0y1ڱ ^!r(鞔dˣ;PtO- X!uVA8Q9c|bޟ$ gǀ\YLLpK^+VT2go:~]CFypPi)䌿/d&z@.lt~1<lKM.)7Z Rz";U Ԥa!?+ʴ*\3 Rr0cb8sap|<)$'2Y支c,@lGDA6Փ@ơ (ʔ7)6p9E6x7<{|5 Su ݻUnِ7ݝP -qytyXm\kbB3C'm)'dWmw }!Mx<kƱ 'h'@<>:,DϬ WF%6ʖU3&|gqUEGeRyS$bw (`@V]Om#$7{+ϴOF'YՇzĤT;竰aHm{ft5 ⚹~Ÿ'GG,3_'#Ee(RiG(Cِ~ivk8a8 FCH(BYf![4w]^^h֘Pt18FDã$cJPʛ5d Dm)PbEu{tN*`Q[-;:ȝ;kt}I4pgI*Od1:CQ)#`z3JA }t(&na ][H2~D \dmޝI~05sHzoW_"TT!cƚ ArPuJ-Cz%n"f@ǻƑ:54a\ۮa M @*CqpO:Q\\C,@FWpA{(ޅ}ѻBL[Gۿ~8,\c*g z8|#J % ꧬɹV4J>VIcZz"yd:HPJ SA6cWTzA [3ɖE38Q|eA_j(\z[Q=o=O*6!? -'߅"cmO%(`QB1M(,0Ǡ4Joopx^$L -/ f5C'd N.ɸ@75UfYUXlMo,BIߦc5A|2e[xUd38fV~"TքU!*VaW(|{LL3Cu ۡvsÆPV"|!sYQmAv&32Pfd0do:dϵ1ْ6o[p*F];vY;U=2zPN| HZq=f@facrpb kPa 3X2jcu߃%F(.ŵ_\;Iox_֚>v%i}YN?^)!uA*.0^6H #eV:KWlAL*z´&g5=>O $p‡f{k2:3BT<ɂK%<J@.p"/BI聂fv<ASDWVSA)\ZЬՖ7 -"}}kE=:J_)U&܃^(.OCiAC 3p3@s5 H,rJQICM4LLoֆC Ҏ)z<4>Oa=·i%Ё/S{lFv$DXOڿ1fU|*ӥrZG~wDi7R;'N9 Hkמ9.hStȒcfP\'3:!1B5WOhڿ#p3h*!c'GC|Q23Z0Ÿۓ?AǢ'>Olj岞s2*~=XFx9IR3IbS׷O#I-1ޔ M~3PY#b1u3St#G:]'Nخ0́LK }oUOoti*y+u7\P빝8ѪɡF 1=;n 4P`"IG^=QBS{5mC<1=Y9z4kZʃ 1dhJ`F` CVx49 ķy7u]:Ss@ugQ>FwwY!PbPe֚5OqDCQCnTzxR8)NC+c@{Su HPZ:T!}C}a2 gW,[)C4t`ȕ6>J;zD({{͈#f/ >jJ(0ށ?al0.~]Vdvp ҨMx@oaZ>{nf*Rҙ G YGZ>(OvZZn7afJς_|dc,k ᭎qEW,uG+f'Hƨ1= _nKr c&jW:rd@=}[+'eN<:=@2qiQNTiU3ƺG&p WE~'[sknyU_<3{ǣ֬vteHSA \Tۖ,oR=I >刯0&Є_fɴ-n7ug>ʭr#6I'K(s,KYd߱ ^/iqAaܦwC;=eS[ga:Fj# WQyN{$ H4v2#C -(#wLG|x$ZL.S;]<ܦ,r:lJ4 >AHeӞQ8{-)u&}\ 3欱xp(v.y]A}O : sCp`7( O 36NHꅳT",hZVp}I-J# Z2e0Ogsna˂H'OWm66֩=&|SF_H3u){KYSu0 }fUrR|[{2{hNj̥'jr!xSu"Y h.16T^*RX8 B(7&W}~\,@K{`$((TGbaBh%Guҭm3 S0{-ektLX3khGT39~{vG+ kw;i4D?$4$䍎8!VqؙURLxfs/YhJ95Њ⤕wAmoSX,P<ƊݸH|թ>|86ڙ_c.Aee01umtz#\(V9͞p;%p~>3KK :bMUiQQ;m n^q~QTau|W*䀖ʳ.RL}d>$=v6UAC0=;{kڨ旰8@'@ᒡk*>L*w9>5 C{?KQi#O@i8}ra;|a8 }A$I X,gE' C1`$ZlQOmmM"?󄵗 MM9^ϧa fd2,eKf5N[#3;?;/8C%钶6U&QW3u BΈE9e%PbqSɏAyJ͚%ItjR'fVωL uBv6IJE\T5W JNN';~jPU2:3))쭦=AuɃf鉄ԇD|,,&5IOFOkYng  s,|e҅[&(O ٟPFMCI k XwUet+8 wEti_1 YT|5X(3ЩPIeFt^~|$ؙ/ؐTN|<}U+5M]N"En"7"C!3gIwec ۷*t ;wE(Ũ%݃}vѯ31Dv'A,8^2D3QfΈY  2NYǴP uJl #XW)_u3m@ ЙwYSGRZߚߓ| S VLKpf<8R/$0dz@5R\ٟ /. r]s6+w| #3K CfV|WJ,9B&n ײT(s)[dMPQ_ &K61 6hyM(3qۻE{#FqFgEɂ*ն+ׅYY5/M9(e^RD I`tSZsz&t5٧}RZ3ΧU7M]KݏKSx=q"ay#%ڰշJ.FecZLF^&Z.CA08b,b=#p;QaOc[뿓ɸ%ǒۇ_VwY37+~7)] /U׏˨%8=-.2x A2㇬Ai) RcCqȌ*]D)Fyqo׍;f rnǰskf[-ՋK VLmT-aC~+ DTaOuGb)gmz]r>EZtFp.GUg sIUaE~}GܠcG~VX=SNxɪsENzDj/OBSYO<{y^,=֝ &;H{붱Xq0 V1գ42ȍ==MI.Q[nMK, 1Id8檿$V$!0~~NI3j,8f OjᣨY cfЕOM(٘$cwTr(-QAS;`Oy85hgx` uh9^gq5P1;]K$9<0:*.gQ j1{x[.󤧂JL %M4s6[|Jos3@BFXbY6`Kn[pKM<6C˧)zsWuXa.uAfB5;QhIy~wYN׌Y_ҫMuqd UUfAHwLe@2x.P}DJ%bƝtrGbijTdeND ?kZvL4 &U˭A%~di V+dm]#/=$IޣAӺ@yvefȐkY6g Lwd9n_[ V,NEȩt٧qQ}0YcFeʨ zbxBDKcU'=6JKE|zg=kCXL5<\c"K͆&f9W!>EvFv03< [C!1@K(7]ƃlTETߒE G)h5_%֕/n~{~͟vmƝiAv>7M _^pazp:t8IXG7Dfs9Fp18CYE$ۅA:T{o{ X5Xg_왐Rۛl}4[ >8*= 'RBR:Vt!8!i$0qb藜9;eChB, ,1r}IJ& f#^- [Xjl؋f7_I}e~o(I-Bw2rq!!A?Gz] ւeEV|YTk|>Q%mʀQ 2i%.GQzJU$d-me깦œP';[K1ꝏ_ 0?M3ӕEwݾl@qQkH,xN6<*Lm^`ghIڦ;L_6K!CDg{h-vLLފV HII2@HCBGꋳKE6f~ ~7{g0,~:eiv8 -jZ=-UOS.%:򳆴ei &doӨDbB0R/;/# E8d GեLƒd+>F)3VS2fIywl002UA guwNXl^ 񗸵D]2*pG'у\D Pŭ5:$zSIm:p9$a[:$hyRŖw_3:X*$2Rx b w5hU~L)i*gJw> 9H #c*Os+[CalUP`/ǫ݋ۤb^vAn4xf=V}o0}I?|ez&Eg?$:"":"R2h}ӲԩiSy/n 6m*ͳ|t~驿6H1O;XVW(@[oO| Z&L(6A Y"ң-$9Ÿ-s =(k:6vC!/WE~ JMOʱVͫi?6JjacT0DzTٌ&:!%C7*R ~BY]V[[G>BiW1VmCUΙTe3;Ke jr08t#b@lS9>^[r-q #D:<+B(Hq̑Ji-_I>xO G"W4K'؍BjiZ2Y f¾]<Hēo:4xo?q) 6P3 y=)T$y-՗݅ACF ac4jtVCQ[Y5?E{%̊yF+~t#A tc;Xў:]^C;2TYXy ډ@Qwez pNn'܊!%[$)3j2f3YIqzj,TbqVPѓb 6weZ9RQ)fdv*SQs10WzjcU jUM9@2ή\znRCb=$H@qr_\;'Z2Y]F8;'co,sޡ.t~VK.zd Qd$A:yQEYl-(H5]7J5 ` ]]Oa;dJyp;@Da.r.41JW>_Y ۘTnzdtA<,T=L ? ˦.xK)^C*l$7F/[@{Rm4*`t`uE2I6CT`5ozܖ,x9aI;? SmJ-G->JMV1/5bnϊ2r+%Pf骊ޛ `Yz/y{g-{ M-{;cBYsV%i{J)vrYUbK$ dP.?O3K,sr}ҁičVGn;MH(*z0UW{ *T]4C ڡv]8_vvK%dmy}#,+2 \=fM@nT&Dp7qnXtS(Y}u]v,ttNM6nX/ <;Ih3rLv]CZ(yX8Go )nEi#vE^'VS` QEredjI&XG8%̷_ U ̥[np|_%4oe8  ܘXc,BDQ2]Z~˱-ʓ10nO6Ê;|=̃:(#hSqwq\pùDa "6 ࠯&]? hyu+я$&5_-n8g?hD+{a:iN`=&BUѿ.(^\{Cz NC ;hr52uC'H_Pأ<=O9r}o|0Ue2RY" ] X~ͰۮrU7ۯ`O߯xFI3y0N}/h,tO-Շkj\y64gr8Zb|2KQ=K}&m4lX.tUuw_P,cKdo@_ tvj"aZYhcIQ6A;|6%dC;Kf[BKw6HZylEZ PTΟIv>jgɬ"qz4^GL_KsA1PN\vv^خLb] `^v`=hkXLxyb6WiGL30_hFP7{9@6t}b0I|DeCy'$m.;[л2BlS_#\&M#A|:fGm{|ɚQ\S69맽#l@_j1׵B<ۅ Ah3~!|5KCG\5~q˙?>b6[*2fq )>a8'/|AG[ KʟYQɞQC-+> .Е<{+>Ɨy c{F"÷O)ԆE^ND14f3)vُaޣŚ-A[5h %hQ'kuZ9$cT~|'Ϙ)G S!8Ngʜ[2Ɂ"y?p3Kvg?լ8@h!cgIfTKMN掣ꬿaP^]Tu\ʣbiaH6ЏɪS7nd'gJ#;J+1&v trʅ5Fv-3/&i.> " tEk 9;a>c"W+/P'}詶b}'op`Z"F!FGؔbT^O?v=.:0U\V|X#@4Yv8 WrTk2•E%xh<DEin:Cȩ %F:9Rпe"7X`bLtXF^$Hcu.Uז>e'_u_5n=iZF^m%WMuF67 nj. {a_Cz4B|C;9(-G= sO׊N֯ЉҙB8ϥ?(-fiBQ-l b剈` sOFϱsf0+zglE("6Ǭb)/iyȢeђ|^eY\XA`A嬶 sY!<'8a=FH;CXNh w hkTltY$O7k];f*djdE]Kp݁C,:{z*j i'X;u$z<ʭc1{#IXНSDQQUh ի<8# BQ 'xב.qUC0,Wy83 tR UIʉ=|uNѻ>2ҾɌ@L[cwC!Sx`2<ТzՎ/[0q̜ .!K ?\]ki^R9h7+:iv+r=p Bo ?GY3C"pE{A<TK8M\X^_(g*N?NƁnƢ Pw>QO: o:֏9`H::$O*n~Y]4צaO_Bאfo 븸m{T[2@\H ay a-U(QVLS0V¨ CRZ yӁj\VfEdYmIOh#؃&`Pt>ڎ@VJJKapBk7tk): ЏRB٫$ g7d}k[?ߎT゛%e'MdÔX'y,KcoxN!,"jT VeV'@EV)k&N)ЧG8 6^,b8ZWue}DSb7eU" D_E騱k ?K+D40EKY3FN`Uo0zYQY ʅޅ@lZӐi]**@_=9gDɑ.9 ta:7FCش/ Sr8i/a}' CCoVZ)׸2,6Ԗ+_el #@.&+LA(CW::ӂjF9HIn1N̴ gcj[KBb`T 2/Cz՞&e_YA %sMtl0`~YbadhIu1f/ҍld@aN4h5 nvRK҂kHwˀ+,GF9p}6ձj3hXF)+F),tqR3}3ETr)QPk&Q'8EO QB;_hLԸ:v3kfl=f|D9, !:R4 zn엩 aV)ġDu&1C7†~pˡ>UM1S)>fLJY(G132r x³gB(;ؑUD\go$;'{sk@jR>['<bxMyh`vEXxyhMlu Y}U G1.[,%Wͣgml>^C`P15Tyqzny9D!#7=bJeBU;=5[sq ν&aiF..Ŭ <'g4]G{5{eKޟ=c&sG8ʜ'KHõb>146włZN̦>XhpNL:_M!oYQoyg~ocڣ|^ZzϽLf9%["GS]s ޤ#wC y%$eSM&0EڡCs m62>}={#g^ N $x9avpKfWʳv8pޟԶ czIԧzJD+lS%e싼l2D͔2Aj@>~AT֩4]!_"g<~>J %H m.񟩃JG#rL8 /(x^fWXrfpI@Kj(d`ۖ tlrax+U,5gNJ9Kތ6S\^@+|< #m o Yl%1+l =pWE%m L% p/L4I- pcWVN! 1d)ɲi@_= ]UjΒAz}> $ ؗZKaAN({t64ɲ*i$6lV˿)\ۯd׈ zĺg$"> IY|#V.-oczRbhEJ4KpI|D9څo2h09:0  5O_?'޾,2q6zr4k(DiX$,U}f/* oV][kg={4*0^6őNa`t-)idO*;AbNs޾uNb 1T2F ~-F\t+< {ʂ:hfxd2g]oY%Uma>70Pgs-)yAHFPmNtm9 KU8ǘK]ޔ`4: yR)Gń]j6AQ*aG+bڄ^%Z׫Rׂ0vY\yF*TBG;.M{˚ݻ9I 嘉&,B7yPKK}ßt}%h7{둞0/C5ߠ:O28z?K>@#|KBƒwЃ^ 1JH?3XjC9O{o1~lEGW HGmOt;UنƄ؟de߆ | (hMrO?Bz;ֳP7mt?_XNEuvhK| "i(aYpLsقr|4k]Ho 0f q|/0n"<{*u؂4_ Y ?Ѧ%qw6[!>YC'>θ*%ϭ009 %YaF L?iXפhBYX{{8xx-WwZF?F8O&}U:n=~=TmF =Ҡ?,ٞO[ $Յ]#1rر@}AC~݀'KXL-.AXdw+d?ԈJ7Fpiåo 8ܐ_YWs &{*zāƗ/Yjsl,!lZ,Uuh.Mc ċn:f+K ql*&j ^(O6,خ/+?dz> HnUϪl\DjJ+,…d(mA]#ӥ!!jtIN D8*q#OMե÷*mKZ1 g#? O+ DK\,VBSebge@j6Hh\;'*S\'Ӣb-5{%RGEa&p?Yq9N )谜ا? օ_j*]Dvbj) I{B0F͓dw1/<@oAU$}u@ NtuUzQ17QzGWGi_6=- P#-&Lf=<,B6% u`cim}3E1oTjtӞoHLA&̭ cak ^]¿9QF$;ܟ#+'ETLҦ&#ñ^J*l'H\#nW\tO}hm5VTjky24 8LAJJ}ଽDPBip@k yuX:R0_2b(95%ʱU=Xxޝ&XӼvBo%ӃdltqhƤu#~(O_?@5@TjJыt2; I6\.+$D-E+1D#kh5"M̖w$ V)jaݘ.Ab^w٘ 'o,Yl Bʐ6:]fOK=Lt?d~`4R;, {4\)$FdMU%u:?JFy }vl9.(WP>vJ3w.J'YuTjȗcluDX}Q ]hmxs?cb=T|;C`/e#kz(=XH1@ayD. Je* h-1e-`:R}PGSۈ/C`-6idTy^Vn]s҉+ 2Jb7gW E*B>x{(NKrpuغ\V*;qY}|S-qc#:Qa vZ4`! FFX?A`Naϴw*+0>rtIK:mn %2:ΒVoz%i5ŀ¯"UM dhG,i8/&(vuɸ cv69h\Q_2Ѽ#Gsɒgp!?ռ"Di$@ĥ_RߨWRf:ٞ^A#$sEHz #-GjUk=+l7. UAxe<?dë֏Wf]|F/i7*t3E1s|TC%:  W"Z'b*jW1ï <,Pcx/D$RxÛ'ܪd)ު/vLҍnXܷ(||Xlظ ;ō*σ1 @N[AmװI4B$= b#^$> ?*> G55Do(\37~YUN@hԻzBLǮKoY~7׹`؀ݓƃ',s'Ih>5AJGgIɆ_4 x4b l盍BUCtTԒإoyAeu0vШO%s(WoTR߸hؽ4{dk jd7+e־mQ3D<[^ToLy5 ԕ cg*$ )jDCT 11qֈdq1 E'ߙd9RX\ ާG AX=uOrj ʞU[E}K23rLiO6ZX$խ$_`g`EhbK* ]l9"pe|w͈yr|7Je\)Nqy|%ΈZчc\b4Z[k X{bFɹe%-Sw,~@:Mj PYVhid[|3%u6Ÿ0tPKY[uJ?K"LD+jK6fOWC{§0_s0'&V{PFia^̷p޹gEXx&A@/{SFEӆ Av$YB#T,54ku3GvRY}m"d$MJ,@K8{t%n{#!Z<mׅyW-tkaP1cDXbOAwi!} u{( nO\ek ӶVŊ,唠*{:Wvb i1Sfl L3 hFFS2dȌ3E Օo>+@ؾ^~)GmézVpBbbTY^, C̺~_I+[x n?:UG'kOj 2^ҡwG6uBT}x qw$HZ܅DOkyC B_?q7s@xBq^I@D*-0b4A~WcwXGIZk# HuABycaN[[+X4;lqcg2.PEN0nڅU"iHāg:9/2JE^pMg_0\7@ < $~^FBx{qh\O+hV>6YCOz+\Dh= H2Uq'od9{Kʆ :Y;.&ѫHh:Z[bR3j2ߌ 6@7kY.vaD0r3\/O?MU̇83@V*JÐ\Wn,s|VPZa4Ue(d~W溉r*M(̗oT,1cU.=m{:߇̥Ce3]F'6;F$vA%TPcD;Cl]# '׊^!Ecj6{ȶ'+06ztho憐(Jl.DF-ERӤ8fn*zuQ"Sq$pАu:"N7$ai 2.rڦ2)bL⣛t g9t@!BLT\c}eWzݝNr;k(Ww䰙8;^PBɓ,9UcrwGDUj3Q,RN_QԘu"-o~cL+6XjNt孇QVR\"Yc~۞±Q S3br&b{e;㑢t@JSoԊVKB -肼d""'0"yRVԚpN9JRM/:<6㇔NQʿZ٦1۔b`N˳]" 8՜3z2ۭ6{J%d(5P]vY@q`fd!1\MΪٯ2bCoUƧZص\G a<$'7㗢䚢SS6veQJg )5& ma}rg]lj.\૗uw 5៳^hWten/ko2} #j`A1¢Z":ad3U]m=Ď5Ye(Ub4 ݍsj$% 7s{S[/.*&qJWcAaEeOe~ /l|[:H v:t7V-CfV-@Q%~ "f-MEVNj Vj"ദ1y ˜pMTTƇ4Y&p'O'^䡛_E6u~cIMFE)Ѣ|z<7LRv4Q䝃)?>GЎvzB0{yUΞ\]'.@JCmJ w <7wDbc Ɵ˻&RRx4$K>Nu=B`㒄?|PD$lu!I08)65} Q́tC]o4 oHc4sˀL+tJTyu(>\ 1^JOHvU]#{?,wqq_$jd37OkSt e 灙.b5ȒY=$&тt梴F Yu[_f{CSB%^rT;~z:~׌m)c`'U% |)K_}U uic*bo_SG.~&J: ~=`[OkgqIOeEޡy C機;!E˕gl6MDfӰ ̑'DS B%GEN`0\E%"CfVcp \s֨[!/0X>)qzpxV0lCzJBٗw ]] ^*t+3I>0};Hxh҆^ҟxhQ-:Z<z wEԥS3R9Xl@#DTr&Ҝ+F_ql5 +4J"Im'օoՊ$Ed|e>0(3ɀSv8ǀR'{ H?S/nt0I9XTn2_3BԺE Uw9Q15< ⪳*BEݸ`b'?QOh1™@H/I4(&˪.`%ح hH\cS]] jxpmE` :^PDQ^JDVQCYKA8 >vLo(X?1pG)Gu0˯4#?Wcً)d%K{]ag{*C6cEXbGvRS*fr]tI-.%K!9C귅&,D}fnw SY;|P׿=Ap:~Yʍ$zDMN`>:>#]51̄0԰zxt3wߩZ qƣoOb wD~0ar+%OzLMT7a( 6YڄR\:#?Po?U?Qdց{媖.p'd-(|$ȚX'rT i FJJC͌z]Xie*RV0$@Ijx2 3uq&EnVGz;P:/65^?tbO/.uOtQMQ([ʸvZ,8ׄD֟T΄ڞ{t_GdNJd2' 75gGp@~c9v˰ɻ$0x|k:R3!w8^Oz܋:IAN֧^xr_؜!vJ'5T\DGoi`BX̠_s QK_LhȅKm~9|"+XA}Èp)T)r V$M=b1{ h2Yk6e:ž-v&7VBKXk}Sg=l-ynRVCbg?Z7vO[)[9+-qO\/Y_ TtC䩵9Z}/./2uE#Mu岪5a~U)\Ѥ:a*!%t~PZ9:'hC2h!UtJ뇢` ߻|a42laj1L'_ `E, ܼJ]Ch"Î[5E>)/o+oQ"UuuIf!X䅝F+u!g}>Ҝwogƌ\H8 :Qq8<tM@eS@P&,RbڱKp2B$x:^|5j+yhQqr򇐧}ٕǴt[uTB:$m юcZ$/JFTʬ"[Җ^(zEщ$t $MCԓ5ĀQwD,A~.QzZs>_܊hL:Ix}ɘy@wo2C\8Ei| = ;1,Mυϑ@`g86L]&w02>},cȺ!x363anIZ'%0,Bzt!.*yͻ'}s+S!9iBž̂xuC!o vUȂ=7ɶ*<ã+IpP6FojU,:`wAD5*M9"_2rC~ǀ:k׀IIԠgKK=a[uXCl|7)$AzBy^h-f^*-×u*ҞkV?Q]vI( J2T 1d -¿|p؏D^^zC\Ř[̻g\e]UԒu^d`ŻT@)s֔GŁ,EiIlЫ[g?l<[Dz:`EsCl!pejK jY[Fn%H]X`e%PFض yӮE9y{aoǚ ;RD{5m<;Y$d+(9AR^g Z/T JK^qM ]ڄ5 [d1i4uf~8Bk4V :Nxш>f#߼?Mw> ټypy[DP ]'D))'%:fN=I+GNRVDFTV &"YT)Bw[m1M o|h;DLw =7zS{ԺY$.2rm@oD^]&t: i0gG͆:Y9c /c*Έcz FҶ2wݤ$, yE>GMoG%u&ꛢC9<1j9S6Kw--9W)H2B=|\3`r  ~bw7+p _WNTY1y2}Jӏ'Iy"("uBaT&jy]^ja{,*& O^6DÅ؏O.OqՆ!P,hiiξR\3]ţA.O8o$ ZIMױwkQXmg}fQ wvqo },~oC˖7k|e :%A):0)杹->"pf9KK9=WW'K)# ;d7wybCpSB&|) >&(:Lb};WݳvtUS3Lp ͜()GINto'Y}frXh*- (Ojb1v48%&|bE%,l𗲹;г h¼WNvCTtWy Mf66Qft&Ewmܱ0j$5 䄠_ox ' Y@ Ap~y{U$F4}QVNw)I!)"Tsu-+5 聿 r5 $,()x&AAt`}EQ +rq,G'(LϜRꜜc(2i{\̨}A劇18Xc+ 4 o_QP #$ߕ ^PfDrE 0Gy~&p^u^m3Nd?/lejTQQa Ϫf:OByr @Xcv+|c}5l5J[QQsvdpwӠu.n$&(۟m``0vX|C9U/D%7C$a=nsM xmT'#z7%}Nhf  l oQ f 7r8Iz$MlI3:ؐ5qj2`׷cQ_KvI 'u A)Lq3@NQV}讦tZn\2ԏdǘA>z=9^W[y {aDdFԻŵwV$ Z-O[OFL :h4⫕]7 .ͫC!SI8XvU|p+P ZH/tBڼReŕݎAu2ptHVP7Д\9)R \kp-@E.ݿ;p0~09a`o'ѐOk|F[=Je5řԃ+kmN82}wcS v’0z2Ep?W<MI|ql0<)(F$D$Ozp'ܖum6hcm1tF|2e,r+o¡3d? 9>4Q5qo1Z9V>e,JRx[E]엫}.bxZD`dBЍ .tGց%U7 ynXJB_x նBFj?J$ۿ)#"ʁv O[D{_v4|hjbSk1re->HN_)(0zܵ sc1auTI`d(mn"۳]|=x#wrɴqF_QWGaU0..]e/["cMv^_'_ʎy& U;[䤓f2(5d]]:J[pDAͷ @}Ao: 2`ב=.|"*hfM'Sn޺ٯF Q:Sd!$Kv1ii~GMIJo?ʁ&y};BΘzCǾ{[Һ7K]/-p~,*h[w%Ŕ" T(NCT^Cff=ČEǪhm)˖빲lyK#EsX^Yg=*Fe )㢶Z|8oޒUc]H;e\R* Ȳj Qg@F}0`|eKL^KY? !]V Ѝ.T?muȆQ4~DR)vo*]ʇBڊM$#ec%ZtƴO?a%L56 jM>1GQW߉It^Rfr>}xA X'I鴢8A$ =b ֑]&rioG$1-WbGOΠsٟ>{y{O2m$~,z\W4Z}Ǒ|s}c,ӢQJq}bTz@+s,t)tD$)+aS6mUTuCt T1(t݆ʄ.q0ŔCr>~{y1lM;0J8\Dx-<#S{ OZbRC;S== 9>l}NѿX.&+H&:TvQ0RO2H>krIR!6W u!)>G9cP .(Jf.9@^: ,X5%hZ1Z"Z-!E<1iLm77̫!2f*nk)FA4f_'m&TJ+ br!:#'~4,sAwAkI0pYJyRzm'<,۲GbרO~+KDgfNf"-cHQf}#o[$"plIM:6"~q*5{8v^cFVxҬt8-gA ̃6 Uz tà!̫D>WЧU]|5ˍK@g9-Y,y5ϭUF΂ bĤ'^jcU WP\6!(EJD.cf(`8d8'l-b`CZ1#nq6&hV)Aj: _A3*~@T @N%Jm<4Pר9/Jov&TbHQ;[lփB-ܛUά#nX r0w{ݕ}qI.j)pG"IKe:c-T trh(s36.Ru!ʻ 6ij}ub(h+~)W?B*0PҦ] ~ xXO?C>h Ȼ h2H(,!|$:H&,%f>?Dٌ=٦xf[Qfqڳm#)6>HFK#Q牬S"Ady4;q]iѧ,Hᅨ#dPQDN `m&^`bR-dur)Fvn?g(x"nn ?2JYj' .ۣI) XVlP~yXy2f?k2go.Y5 Ί!*+ 52SDh0ci u܉ߘ+cA"I_y?̪{7d?iy~ 8p/wm]qssCHBZ~n׷䎶V/3qo7-_R@͵apoU> 5 b`Swl%<  cl~۞ ^—!%. =@'QOx:e irC LQB9%Uqo::fu ]-Qs O2Qe,b>"]zG>^qRrrM=_HU6)@|ނ&wulKoOQGRy{Uo/]@*A2o͏ 6y茿 AY%g@)aą Uoh&yD~lhlVkx[4>);ѻ쩋1Р5X*m Nu_nV($f芙NglQx^6%=U\Bk:S;ƠOm FWZt[SC=Pfڹ:ϽSQm,\ADrٞꎢL'p {Jw:|Z gPTa}&"LLum~!#F)o#y'gw.ĪA $ljEX"h#c Eu ySDә.JZYT\0}&ŋ)RTP>' m3!GC6A4\\D*5ncڛ_M] \Ķ+Vy= Tk[UeDR'ْ'5ׂC8\l!)L9l2R\x*ٍvkMwP̤f!%E0y>+ܷ޻0:7ժ 0[gHrCx:S:WrbЍ l40BH6 q2T޺mņ̎I߫5m TŔ]޲շ=RXH{ܟ j.| x7Y{vUz*z V4avJ! {ajsTBy)N xƧC1SL8n1`͵xĴdJ׺|+!]YCA(S6U@_]2RwNJa`~6!h{S "{>Fc!Ne)'IK-W ;SU'cN rpRWѷ)n{IبZ TTjY}ݕCPcw*W|^(_zKheډtodkULzz'QC?d+1?N`A?MT}j8S2ϛX#HayM[S>R۴`T8]w쐣QZVˇ';ƿ&1hN%0>&dO OW}UY=Y1IkC-٧-S^"1q"In7:nGpNR 9ϱZvf9pTCw$8Qށ5Ҹ+Mߌ v4Ag)Zlׅ&c˔0dDX׽ }Y)~譅ª5i >.V0y_ 6FuM]s'490ō=ʇ>=BaH;vnӣErR;@c9S0v_> i?-!؝BJxWVӭ\{vwSS|<|#@$D]iBc]wQO/m{.Hd\Jruod`X.tXz'_+70!oT=Ov6^mIّ`/BbKŏ~:A eEE ߂pda]CWxǒl+A_yoê+^Gf0ݽ%p18j.P{^2eEĝeax}RDXj6~d 3pךpD<_zSRź":ͩ7n|`lCRJ5*b \بA%Drdr0aĔr OQnθvWn裃U[ukv+W3,9GT[?T; 6d (Bpǵh:E.xDkfhm`z,Zgsl4>^ qg`\drYad[b>;^e{Cw/8;%i m ZO B$iFcsn&ߎڼ_cǮ7[^ر4%Ƙ ڽ7j& LlҶƙ)?4MY/NW#^#f\b#l2S)].\%p*?қbig̗giC5dSš\i_]52!+/u'$D`V*EwlC'Wbw[{ipPnRShX5 6HWT^j[`F%X 4B)ZMNI"?@@fq1 JRҰB );L*yA y86NIbxv@v!"~eJ02NT=yκ,H^hb_V'B]g*N]ȼK)9?I~Y1I$" J@0>u ͠ZQw [hlEo'U|)L۰?k tq+OhO!IEx&d;0k}PM9q0UmoL74/3pߖ^g⡴/\K\gCrM~/TwXix àZt.%|Smب~Ț۞P,> .)zXȔ4X{н3lSiZn , |GMFBVcso-ͱNE~,8,) 9KF#}՗.\> b beGOT~v39 Gr }p[l uGrSECi$}\V6.kl4 #uQrqo2'ۆtM,kojHV yS_1 h 6~Tw9wgG. Pi g-2 ׽c.bkPuvUa#XB9B{jntK"8۝#%!t xK!N%ʧ ClB|DwJV*=֔?d謬dzIc#ㇳ EBrF&n[䙅43dS@wi1n ˵JxĤFB3O/1˫ng,j5S! }e*3pS\eu `Gvʛ`sW$5y7iۭ"dPqԦ˕iX$eb`p#7s^ z͙a{&s;"7#C&]ͻ5`Nh-Y?Spݤ{f7^tN9aةFWYO#ϞR˘oR27r&inˇ~Zv(C}Oz|UYѵ2?Cpa ԍ`Ĺ'*:f)&T+^AO+G?aVؿZ) twPD\0Vb&#2Q/!|W> #sERkVB*<}E$b;<8zXۤ^EDNČ4|޹|޴:< /h\Ѥt*[hkvvqV0͠_?tબuȩ+.`߲nMe0kc5a`ŸSϠ'?gH-(pPoPJ s]<V VK41yD׳$V4hea0jBnu<š05*_[쾣ґ7OGEB΢L ֲzF;EP.mO[K柏hFQ3LaM A){A^7{\"Vu.U!4Juh5*h]&M²[8hMDNwnLrCIzrAX"1|i;knFVQ6F?#TBdB-]UxW+$㽚N~J̀>?'0< FRh\ZHsyR!R8%?qd_I)i\*0si1t W[%$]{>A] *eۋeV~F6+QQp @~& SPzVg#Un?]],1ۃ.-/9ԁp5V=,KFwCorn,S'Taۉ~pjY Y 1Bjq*́i/OR.F)#i,q>ӾR[JtJ89 c5('  N͎_C[,hr< 4sE {Z^[Ckӗt9~$2<*{wi0zY#f53 5 %.L)񃨩ݔ,CJ{cA-uNA#fe;;fvpt8suɱ&h|@3ql`nHX7%71Q p? =;IS}< o52 g:ژ׹㞿Πq D!K9PpbaTbljكiy،vSY=_DռmRtavi2zG  7tb[çzSl_2&ĿW@IJ2I Jć& jL?w eɳDy3 4 nNdS7 98r /3Vuif!`PF.M\eF?D b`ߊV'Ԕ'D?/ҭgspM*,)C6R*X;cXd%!B.!C {!2wMe6o+c_ CYEjE'SrHMͿSfY[5&?s1c3ċQ;;D{86S‡%y?bH8/}N9kx4)p`N ڐ3/ f mvwT&櫫HM>#f'ٛ !B څ[HJUԪc* *IwyL|1F_^;O1MPKt!br Q811dO/g6U]cZ urA C?\ /隈 7n5 >*x 4-!q&s D(9lX pI+VmRGA["j9?Z[. ј+A@rk:5H闢LH!s ]X"VR=_+.y- =j1P|mEG U{WۯBokIO4I6YZA_ƜWv@XW=aۍCk(_lf+(o>)~K1OAmz:JxY^Ȟ{=gɷN48>cB=CޓW\+H[IZus<'|g$ސ A440ų^" ~ כTuqY #j5cG1dJZtXSN T2ϸ{T,!lBCO;҅h.eR|eM?i#ut X @@$TB|&R-3n|MYg y!(P$ʤ;'cgATS*+EiFn|k .7i$ lڪ(t*mX!ɜ!pXo{8X-1E $EhX]!g0C#ov}Wkǭ=O4JG}"p2pu /99O"êW>v4!Ug!M L9I-MbݙIDvkh,ϑK+lӔE9cv򰞵8!Q뒝,!.t PeHi:U +CE\hZ=zt(odHN}S5ZUog2a 0hH8d 7Pq.9kĭ0%Ցpz܉0 ҷ6P[ڝq5٘1f>NHlr.P'&2K^$'+$R+:maՋn71ބ P 籚+ܻ-X?{)Gv)=}'F阽e 'ټl!AL{q?#4 ]#&e~^߽aq,L3&m俣8_N^#*P_#b^.PC no͚JlH0DX@(gx{?Ew>+2᳸\<;v5M{+UI6plCD–1WRh@›mljҖh$ệPh08U &s)1(j3)Kwr[HgXXFf=Z(-.qe+u=sK,zN.3Wfd!w<+^?)Pj;8B\ :h8d|)=ElI̜#ږ `ُ&,pMbGIqbTF_&][TGުķE&yB5I"SF6p;\~ic4-P3s 4H)s)bDa:}; hlf,6mBG?m`8/bIԠ֨n45_Gd4 nHb'@mFCyOB'"zQtY^xd~>fW62Nkiq{J:EQp_cp\`(ЮMPaq@OW,/Nk2wS}YU׭rfD:LKUw1b(X?Nxɒx)wDSoh",jÇBqQMmï@8ÎI9%/*w!M&WO ;NSt- I+(ut㮼Vt[ᮒ'|yU&>;/lsH0PiyZHSJWa7pJe63NҘDLQM鐲3qNbA~,'SMb(ˡ{9,%PBi3jW/]p -n|E\XckR}/gyn q>KU"D fiMICvz^'꼜ϡvJ帽lT B)t QVdV* -~t gY"١nQ1LOKlVop)3bU4DMQy*Do7W;1]?-0o5|]"oS) #=.;yooe>uřS]:Sj&i7<7wEdx!%M Ø d{b[}،0sD4Z(dƳhɉ)MZ>#dvpdx45ܺS92)4]<T4%߬ł2ЭRK0bdO̯N`[wN~ِlx W= 1%EOe!$k_-aRtanLr@] HgKm|܍N㒀9klnz)}%*Dm" y͢Wmol<{෮V:-zԁq ٢S&QUvȵ@T* rYjZI+ycPUZfjoB6ڭٙql|)Ãxv!AXiX܏5ޥ˝#{ $:H?q$qb'`'Kϑ99*󚜆x"M 8֛e,@2@I28Q4M}OAPkކϑVm0 aGÙwA*DtFߢ9#dSm& S$u6y+BU'z/K"%;k5bN|wci7i p}H*;?uNv7%YЈO~^SZU=b86s-hmTlIE8TZO뫗{},@O]FLؿlJ.I>i 2q\[_Aky z,!*wWW9?1Ĉ~.U8$b5~-uA3E}ĥpM# v>. H0\L$ܵ6dj2TU;errc'',Ƃb9 F ֩<3H+K7hUBշӴe=ia<\4RI#]Ϝ }HsVR@'yTxbV0n'lrc"̯ œq"\x`ZvȰ21ba1$>c S7[r;Ƹevq%L"yR:h);ձ 7 :'[2"9}C:O١8jO6ud -/towb-\{6Za2o-YӇ!X]NT@NCc?@hmU2O<@+oQ1RS]tm2sbPKA G@~7'ĉe'ޘ> edUH3Ao ??RaT.-P^%mzf-ИHZ@u8hBGZYZŁlC(.G7V|_'OnQkXƐ*x/,e+8BZ,Y0YѴY,\0s 2W=LY>EU^MchFzvf(;eA\ю8/v5H7tWɛw(w9a$f8G:"%Iu߂%ȉk ?y)Hqj FV?4`$ (>"alm{%q2CC[rUΖi&z,/"l[$I<{ӏ ^5 E  ΁ĚTǼe="%giP+5YtsT;]4WG"ouqx'*e %ӱϧ3(E$[%5o;@9T{0Qme4N`Ѩ$1ꭦRbΑm*cȊ<(Qb"l/ ̂U  )#~s][ |oaE[+ܞh> {aB?=ז5#A|~)wςfo1i">b̭@ *$<6% 6AC blr Af洵v&Ӳ3_aϷ dn9E>vSzh @hiW#UΟK` c/v e_0p$Ѫ3H+-S6T=o4>[+drU$w{7GyC-Iհ:Gw9&c0s$CB,2_f\Wji` ,ĽmL; 5{sx7 k:%SsK¨Rl&;<'KK<@{t;A#Ep &Necp Ƚy.G205Xzk?RV| (l2v)~bR UDZo:9k~Л0#),BlMTFmuoy艱ca<QsStk˴fLE*8*o܂+ENbNjLQvn@7ϥⶶ!]oIC҈OAu֜v&8Kh Ehz'Wlԗ|v:7Լ#FS-uiXS$4c-ӣyk]A(xx \&),^M t6g$JV04 I}ҵ7l;pN;V~(| .lB8.y!+P<'L+$z؛}~*.\TdV jڠ!A?3"]#9pߠFxiav@TQMj3BۍJ~Jp˸ :R0:8ܷEoiNݎkѪA*I( ٞ{FZcN,`Zފ`р0*3FV8/Z;gCj$~-_=o=)+1\7R[R)N43Dx93D](T%pr 9y$@w8Hw%Jy:oiUw`8aT>:j&r`-+kh6]S*/wiRuկC8D(`@V>7Z5Gq~IH}=ZɂܙY/_ (փlaG}Vyc`IB0l\aǎMP*\̎kt%dB8^OXUN dz 8H+r5tMR6@Zb<'ݍȽ|vi947xS.*jcP%PvapشG%Kg*%xV9Hmc?łCڭNO끖8NgG>?`V`m@=a^3W +oek ]y[ ?4YC䨉8H9B% e6@4 2Y qf 3U_%0CńH:sZ_]훴##r`篷^= )r;t<%ي< ;jHfQUz8ڇ/Mކʖvr;wC<]=z#Hz.R~VTź7-; Ukw|~BG:cR _cG34 @6SIA諸n+U&Z2p+R;0s"1>=NWyhFKIzK{Yit 5=Z-I.pʒg 9QٮlɎ}=b<{V4?JdS7IYc4g 0! >};9k?!z G[_h/G{&ʓ yZ%T.kBջS-s$l1U~"#Ҕ~n2/\VEhA|ntK <; TCE/B' +n0GO*#j1sa&ԞNTr5 ;ms~m{Z^oώχx5)̃Μ{!IE`/hPD$5^\>,v2#~19m5]WC|WY\ هBA=#օ3CW/;\]4̢6.nF/_J(롥'2x;&L?QW;PupoQOsܽ;{)}(W]cQ$5 2-XOXVUXz~ ji|rD&OOR6-k{ iر=νHebCT"tGk1FjϩvHΡff"̠JS269sfX砞QDsa@cnX3~D eg "h?1~-@XWnT@"?@uyg&dO߭;?@ebP n,M@yfx>= iwVC8;9aMMcC Ei*RLVi yr6|>KX$+b| Z+)):bNrY*8q #Ц ,]*y 0Tk$P\>%7X3x+ 9\f| zo됚aFf Jh*DkVSz:7jBG{y b&DS8Z]ŧ襘n]f=4 V}qcK<|M>XI';' jhZi ,VK 'ME.8ܮnZy&3L 0u\Ԡ] 6m?b dr+衤E0rIBoT3no缣:nBo=O:90l]zDXY d CU_-wnef[+9Y6B\N/3o,S;>}K*vvjD(&՜ aHf;{rIy&i%CMZ.|o<1riġrk9,NQS0F''Y@18Y⳥W,02~cQL;y{&h[kă39~jw}V4pIrE M= 1U%R^@Q_ a_K{1{6/ٚK2=ȍLr/F 5cZڅt%M q!JIf>@>OP\0axYK_ ʿ e*t'ק?i[Lunb"aZ;C 9X@ * <m3v"M:5\hHF DJާpp:b Cp\}j2391\?s'yˇzckޙ^段!q_kjW(; ? h$Y$K\Ic(C&=a$@/[H_~JY'q~kjf ƼE/CÇ:D33,[$" \%BS:#_x)Kq-[1VT rkyћ D!1ez֯U$xls8,JeurOBtW؜LVk? ^=VWPQՃ0'P!{;(Y֧r_ks)ʆɎJ)_vjܱ R||:ԘpAT[}|b @L!r, Aj˞䉋dYQNW@qIAoT'AYiN1ccChrD5B:eN7Yf=/mqYASoܹ;رWݜEs.?5 Vzԫh:{Ipo fa  a?hMxp]X],X(3tmurt&-Yc%XH7 ։H{J.:. "b[$ l"?nYFS.?KC\#ʓ8[,h d" b0f0A({g4EHf', ;Nj/48e6?}y˗rQ<Eގlv൶՜q5B}]+_ahR_=e/aSd2uT3c3Xƕ r:?zbHIhƩ ^j7,) &8B-*?U /hoszy=]ej)U 6</$;RAbri;=cدϺ!U53pȑ|4%9a恍JJ8f°Cx!npes:[؍F>[jޚc AT3hUV0'$A+ߜy~[D佒KÌ=O1"}vx)n v5'v7E%8P;M0 8. (k]Eq5sHh+cDB7#"q[K (=-DTf=xzϏSXנxCjAj~+ckJU[a#ˀN}s4 U5]ˌ{AP݋ns[c[UU7.v= ~G"p :,k-YBwp~nH%$#Op0w0d!RPHN ԛ&H&WV#J 0\ " }}3B/jprQtՐ>ej _ Z0 oKax!Wuz Jr&Χ~-°參 =;]  j/Ŏ磩̒KytR8щR~ɻw>mc'IGnibyHM S_LP3Zʿ=i`J(Iod}~ #5R&X8eu]|S~p/E~(;H!'°AgϹۅDOG;m1v hȮ 'udR}*w9Rń. @LyB7tAcmLFo۳Yq$$doM|zT.cnbsV f zc+Z+(95Zs/Z5'YNܦm4hw]{Iw' e.ĄHFH5-5wAdA3,/ES`^&B)a3^}oM&lCQݺmf5NYͪ$w'`vuW6Ih}? U j%.#]#E bT.֣u!H١3afsCO>ˮOt1ҋM/ ,t"(RShX .j[w kfx?]!!Iu?d'=q]'ѓ6agԂЗ1yi,# &K#j-#T@wÌoIxȮʙ(,Mu$;c4,)29D=f ! @Z<:?O/^i_Ǻ „-iЫHHtiTWA44mjw!zlȍ7'QUEGs@((mvʶlg7=ӃM2/QW:IU|ȫջ`))2&Hb늸 BvcUj:}nSuwtT> 2]E9#oQ5_5 LdyE4:ƴ 2.\2:dbD<;T>PSĶ. N=:/r}rKm%/n1b=7+a=[$pY4&Sޜl c!,}r~v^J#dIˤay 翍æK5TmՀ䊵Q3H?ѵTeڐhJlVOIiXPh5Wyӳcl>X”f@⡆)(!pv&6W HͲ\`ʟ3.i4jd'`V=#TGlz\(. )(蓫&C8ӴV_ ^ oY$ӈ w0jW2;ډ Ikb'5g6T/ŋR,WG1 )Ǿ0R]8ozh@o,_+Vh f*߬a%,sǽyeY:|C4#2nUHK8m .?@ 6: *-5rcz2W>:0ml;<\|:IO5pkIݶ.%f_ĵ^aB¦DWJ4ײ9*#nyPՂ+J}>eG~a$Z#ZXW(R=]L~fh)us+20#Vl. /K1Cm|Yb*7TH(y Bn@O<9i(VP},Dnuժ$&i0  k#bnrFdu$j REhU _`s"J]`QV <<n ӣ@_*ޏyڵi@D\0> :b̸|laY9ҁOP@7PZ'i!kcl3*z2xSVo'Ɏ}ČLxk9>Xm<j8Iתy}zI";Nϳ`"!4󿔏!c! - eߙ$c0)6αH|0 meEb^w֡AzoRP~`BaSYE\Q|?dԦP0C gWsuWeg7z۩O`:&&J)r;z4I[s ߃ZtY#Trq 1t3;Х|ksdK21IJخ;ZBEj50FF9lƒI4~l(/lB쯚_VdrkјAsLs(Bo_ ׭ F2o"/AGT$Qd 撶.c4 z1ZW-b|Z=.EQ6EՊo587쇑9meQ\e %NLOb0Wֶwl.1 mTb/.npDWMe}zXD9$1覊D*A[4 ֵ&fBr-2c|V6m"P1(~EhP1b['d7 Э͆2DC.ΗyEA1!pjgF{AgJ"ZA=۳`8Ț?+?Sb<(O dde[F!HVSgnUEkTh<̈NIXoSmeߗl2C&C83MDVu@YF;5ih <#:Ro!2X,b0͆*#Rha"9M$gDM8;KK90ץ0v/l sĦ5ޚ@V\EE<uUًS/ ºP׵:M}MlV8@t6&|4'C,B=V5.'Ķ&ν s5U%"vNi]OJ*-Th2^3_ja˯3)-0)˹;an>10!NjU%X.)Zdڏ=qBcnhseUJMaNhҮ?'PC40z\ϐYn]҉7p(D{ĠoT*{7Q=w@<MTNLC^=ve: .zy.Pg1@"yؤZE?g&nó\R8H]IEO=#31W #礻:1īGtIFFdJfwc_C$|y&\0GQ+yRt-s֎oփ}啔N@K~ rA),jo=]ots席Km~,-L>`=V?x;rZM1s\LP)H8d.s_r虻DADJHS#Ƭx=F2F]DZH@VRRsSU0U(M'lY|> xt+ @1$kT8M&Cd:+JtQ+iò$~u<.E [ё'@i渲r`TݘqWoƧ2f~!H'ezkoS~trf|%?p]LKݨ+4$9n|EiIR'S;~&->ޟkLrh4d^f UP Pդd`kŴ%~12=ᩧ{CM4V#?5BevmP:B ]OBmWm;T J vAM Y+\/ShGjF9Ucv徊Px f^Yco3bPLsE[1"zZ0K?a&+!3?!ixFEׁ=,9\ZTJPh' lg 8Vp#ћʁڡ8NVH#Nz::;:v{$4A6BF8i6:K_dEJ#$-: boaaDsj17M]>? բ@QF Qڶ_$kXI"i{>O$* d<d͝^tܴQ8QL6x5orkD`3OHx_Lh }ylG.(}R+JRY(o3Iz(hSҿoyPabVh1.A.VE/ ^әɥ}Stxm`u_$At$+ArQXsD6+zrE g cf*8!\kuq,R-*?/Y798 NhP^V=d?N4|go@7pxv|IP\kb-V<~nP9f7DV#g3. *dH94I"sYq`A{}#p-pťECWLћ0Gd  56&dO-iN2( <&b퐒Tl^5Z 1} {Ts.Pl왁"$A#fw%*T@?GAoCfSZ!Џa\Ȗt٪aΉOKd#{re9Y0%Q $"}aj]P)~|;g n)zgyi&Y:.T_ SI pB Z;F0JjO(,t)!8 xr-#W11_52Xw͹El!i&aS2XL;K\]IM +N/3x:Ti)AzTW+/‹*])iR1(7Ebڋ,ˋiYOώzD-~i3:/*>.ȸ*n,}r;O*5JAV9 Oz ?} 8'$z\mZȳ(^X)RV2j4e;om&-+58$_tl喃'h|û7z]Mɣ$Og IPZsbT˦*R)U&fL_d( $.|we;;"WG$#i];6ōYȰ$͈1PlxTFHKsiVҨ^9}̭'sqb{ Gj5 j)M"9{/d0#h1OgFkheҰў[R0TXp/D(/ Vknb7*?ʢ|KXaWF *=V6l3zE7[*>mӎtdTz[Ps~fC4 L!!s^t$y)(~a!g-W/e/h|W>q|iw*tbRnl<聛I-0YUIIY,_#EFxaR΁aV!|&W>nI9,Wz@ ?h{<0qQ߽(9֠بP|;R$y" ʲ\um֫wH j-/m[i$ן=qTJ+4!f^B0>ɛeZjA󝉫2_94m2p]%0 6(6Zr:E,H{lKZcKtVj (g?hASf:JwCm', "Ոџ}wŁag ]fbp#ǑZ%O $dT9 M/lK0􇪹;XwJo$,Bߜ}?W[=NFmlw8A1n\Joܫؕ#I63[8%Q %.{"h4d J{fI*~fٰ~e/'ŗr üwB.>邽qo=%C^Q79$L\b"K!G\AW!{PrD Ы@[圝 VwBlxuALMAYsz2?Ḧ́$LQ9UR(x/(>.L ;Yyf Oy7bST@B5k4blA8^/-ڵ˲S2c~e[qƙ,LI7Av6SN\٢ Ng +CLaX.AkY d,N>b_ԣ;Y~Jsӽ<˫%*˶T5ֈ8LڤgEGpl U5g; zZ\cC4<\cX/B H7E..A$vrs#F26-A!D/ī l/Y3U(`_~r_h;.K??( +9l:f|ϵ}}&fWlwkj'K(}!ժ@AlvH ׵s" ~bw;OvdK G4N06DDw> -ztY/aPYta.>!B V,0}:fj8k$R?;g5YܫnxA4"ްi-NGuHwkbO4j U;eV_@Kyd_6|ܣU{R.~鑌A} VBt%&#c!7c1AoI@1*ހdES쪾 gz2)%$nڞfȔIIx'ez}`Uol_&KwzT@pC#Ut$ ٸǜ0I k֩;xdX;Xσ(/BS ,Q^YrqߥAṞȷbHK(p~JOm~1?@OHR:E?J SQ7+'xߊŸT 5!I2޿hVȱ*t0[oJa\SdQ2CWHLjaKG-*Y&)zy?ȸB3#w60z'd뇪._+#i|$m EBp=&!ؒO9c/--HQ,\4g0e-s" LagM(q*3mYJnW `7WEt&_W/ɪ]PQꦰ_Ȅy-d+y)2Iz9mmg}fomVh?xB|CA;)%?o(L(>aLZG}7<[j龹 o,eݼ{+HqA 1B<8tsXEc$2## ߯Bp: 8́djB v%m{5BɊkF=S|3SÆƜut*$V{IlXC=Ρ2XC5ʘWp@oE"O5fL)udNRXUKR+,0 KA]t8,|d)ۥك@sqoF.ti:ܷ=9oy,"[&Qڿc,.w~JoVOS9g8.0CQ- +bݻѻ q qm*o[*ib FN(ehy(lfa_:6eގ9 59RXl@Zϑ|v- ٱiߴ'N)q1E^aA)v-oI@ 9];NQ YoZ/Fg,@ I&:S+)'كn!G;/wq!sI${a`1nv4O ƀӺ/P}y4Rߧ%HFd9xMwK5Vܙ39.f\Ɏ+)B)uTua 0CE:vV-)dհ^ꏒEޏ0j aL%w]K d|[79[ ح (/qultuXf#CUɲsĖYGzt&֏?xPn5Alʀ}h?R}CAE"w:Z:1g) x) "M1NxS|29Ѡr8-S+,HZ -3&Z)nsk6W ,1YNpH莛jqݰ) ./Og&>> ');sFn|DDMے$੠ѩ20UtJVc(}41Ct55mqjk2EpOr:Bu{hbV@8FpSwh}+D|9*:[uFZҚwR䖕?B{6CÊ nk!aÜSWb&쮾8/Ӏ3 o k PFHi͗qghӫRZBՏ[wG.Tp`J>7WWy8H:ہf}JP?qRXm,]EibRCG8Û &|  +Wij38ѕ`%Ή[;N ؓz\f0tFd//;RGbo6G͡ʫqLFS]z{C ]4U %rIQ1 B!n6''2j/h*46n2$}E`c$F*@ɚw@ n%TF_b0x&KB`V2&*޾94~6ד"~wr? prH )k育„,A&u[Xf]χ|'po(SIh}z GA!F)RYSj Dm 8=PNv*pִa@qbDfpL»ֳNuAvGum |~.Hv  co\flYg^bw >![U$H)%#'ἔwgZc@O\mFf߃wa AbZH4\ST'm {9ۥ2Cqff٣m(h1& k}3cTCQ5!/[W!gie1@ ZQ諒'y0wyH S@* N.%rC-+,LU/I.d\KwkF,HA s'?@:V8fLPwod}(ܦ37r:7+oܘk"Nn:Zj!]DMC%SH,*7< 1n؉YdxPd۔ @He=b>!=okLAvoN pLm@ 7gr8V=t)'.vhRty]I%i(Oe,gb|%5ilAWA:ʋƯ3?1k/#1AK< > o& lz59Fm50cEWDNYR'$ 4"sL#RV<3Jw&C3qz>r3= gl0at(s"2z 8MdlpT6L>qmS!6/`ɡ-o|-fϤ-ƌ0V A=d(۹c U_odvUĢʺd<︚R7*UŸF9Kl 72Z4*I56Cӥ!?;tg>_^3xgwUZZNSs3n5oXcٽ+j?(L.inZ)isnEKP4 3}ycg2fLܽ!ה&bV9Ԛk.,8JՖPWW30 id]y),,- χFn!;Vl0 fm5bȼ"cLsg{R..)iuAg)ءcm\x[+R*Yuhݛ܌)9H\ KOxHS:!sn.rVā7~WZ12C\av(*UiB#R},><[Yё0UTp[Nj1 >+h*wVoaJeK}5uEN&AӾ*Ky.WsISx5 *U4q1O #9Ip͚9dnFb1@r2ntK]=(gZP/ JcEP䤽4+SW|n ^5Ze}'H^$65Mm0 R<$0m8̈j PN^@9@;񎹢U`n xhs.N(1^}#2܏ L_Svy݌'𑈳{k=ؔtm=e='Ay\x9FPOr5H9,6Ah[H *Tx L8Qxbg>V?7t7>j>yR9br&q Gqg^pTUu__YYièo{ Uol2ɽ PM5Tv=ڕR9= k_KU5#}K7 OFskiQbSg'֘}Ԉnw<}i3smKXS텢ucf!DmN4tA`4<<UW6HOBC5Zvhe #ɔZ,!@E*V ot>-Yg|)ũHQt/ ==E~@@Pqu }쀔jwC}`#p\Bhh;$ >`>5nP♱`\fdyA<"À('|4Yu~Geokck}C8ʷ|3J"\;G,pUiXxIv$l~WAFNxCfrR{6KrlQ!H]u|QESZ&n V/-׺! W@,W!"g~?ΊbE1~2h_Uq K`;nڕ)B0 j$Wd|Pu&Ka67 f͞&X’9uG];*19XJS"Qln q.<}Ye6wTT\m#K]6҉܅:'L wMFdxV(N7 HM5"_H,%hU?]: {vhԵ'26D%2ޏT(ä6\H[MIbGgmm[RAJK6!&"ɽ4|IMBɝ~l7W}csA`UD߲)D':q$H6Z#{ˤ:${X`,R6AϓE:q_kº-d;Z骓֕?; /Z,$m hi:@z*OIk" wj`3Y._~v?הJ'zƲ!~䘄LYY{9^T[\!LNGpq㤎e|(9i$f?܂$ ϭ#ga r- ȢmWa,{, 'D?#ϻA_'rޏ8,"gh̙1ؓj !>5Z/زBϼD|$'/sXO}v?=(❤.Y4M=6U`-IK]RYݦ/cb6|}T;I"^R0lkE7hA_h>+!Cz?fl؏YG̺E_wcdk5BP[kړIuA;@+*a.WcuB NWƖ_G;!'zƗ- $1ng$(]HwC]@[gGJh0OIƅ2ͨf/YoACm90BjF 0suui!Kʪ 6PMJ{T'ȁ+"e}_30'KP-Al)!-Ր7nuqA?4%Bg qFb&dA3DJG T[bLܲL /,ywciDx\6紓(D;x:WogHU~+,pF^ hg=fBB2ZҰ,O%/!:)_HZ_G+{LZ`#$bY*<*~~aNpL|dI' ˗o˂Gì a٣.ٕwCT`3’i8d c9x8R7A!z菚Bxz,= T Wt)\4'z vp]_iGf8[hǻ%y;_٩rNn2<(v'  >_+!Y}콃o:qRqXX)lU+V"q'EJ>IsY0AyLǻf/ٿ|}muǞ}Opcߥ!ȓrD71R@wٖ|_%a}I:ΐ#C&Zٷ 8'_$gQF#w\Ġ ]ѯŨ &hDA!&f)e2 Qoި C  {&]`u$E9[n a{='Y d<ߨfbĈ1X ]/Ӏz;T Cf(4nf"5߹Ҙ -:xyO͜#w$FPGDt ] =^W(vkY¬= @UYLuI9whAaǐ”i,}: ^P~rSu~M{vnk80ดhfkkM[e?9dΰIŷl.G\ɸ&ovC|},7ش0Hݟ)6&SFD/[L&+>lN U|vZh."Mv,^DŨ!;VCw/V+7NʉU9QJo?gNZɒVJPy f2Xe]G\b7zP{1Z]S"ص_G<{E͉J߼funn9fٕڱ#Dŷ]-$ohP]ދĐ>JaUQI؆2 ~)!! ]c q<4ցj,F!X> N1K&FL~E:!WjgGg(!xYД~"ʆ8LmI!nWhe!7[W AdSo; *cCtp߯j*DJ}Cl톊E2[|&𙃪ldY W 6~<\ՆCf ήv.^ !-;@TUunbdʤ}re{U@u!ƌcvu5(a/t.fVm{9Zf2@"K5EopW.l%XW$?i91u\h^ | =Fc|'}<rtۭ}?Nkˢ Gw.Bi; @] %;VƜ]S;оCAZ6(`+\[b-#Ҟ_r[T^r a|@_q5:,[Bh07|:7\)m LbLqplOL&EUM8 º0V=dBriB=pSZ3W$]h3~G'iߙ{Q mbl3FL/7j;8NE7En /h/"4O' 1ûcuR KbHE(ẩBKO\Fub>ʥLi.d(~؅tdlHAؗ g7y~EcbfmD[%`6j8 FŪ~X w0G"h*x#Ȼ )Ob)ѯVAH5ȡ0|n2" \ '- p{W'~ ؁*lF $!9iQ+࿿Z1&5s9y!T_ Y. 'rՃϘ_Ll22ImKƼ$H\]%#b5m Oi(S=._Ʌ%~Jlb`oBor-km7M59ztȬݛm?iR$-BӋv^,0`zFT\x~`zulN$'w5R΋͌}x [#Sﰕ&D;❆8<<_ yfEZr`ox\ݸ+JQh1'Z> f2cqpV N%2{+w#e}%Aὲ]|RI!%S+w"zJկ٬9b'leɁG<{'C*e;. YTz  1D|Cvg靔R O?9*} #Q]'HQl@.v$]i"wP3-S,̇v>=L\.P_%/5dDWI+yš+guS"\g:E:"e俅 qzɣ, ןwf{K%`49k))[#嗴g-SeBrY6AdG 3/adB,|grc҈mHwuiB%O;'0IJmQ/uuqpo1ǙW#?N$NDc){>CVţibK) ޯ@ɁN%٨#悌q2n|%ꋘ~QrNU1UZݧȱpg1I_DMC@78Sȃ`ܙdeqO\I`~ j/Z_A2+`Fص@.k,TCr3eAi@[+dzL9kWH%y;N-M.طbP_>|9IWl`Us͉m._R=^DلqolD?+ |2)X83C%h'!RSmI`i2loŮE v?FibܘUuW$P>f4b,ZgGeED`ƫ4՘QtzƝ Th~Ě>?r)}A]쥺U8+;F7~XvnEñlvB:@Ju/KS/:`8 A3Q4qSk>@y^ 5r{[u6SAv5I+ma]v{+KsqsǮswqe ^#a⒣L ?jiч&Rt#:/DtS<Y(Z̀BHi,@P5;k}R+l,ӱmA_#Dj>9 Vm6lY>FZm(p]T~{ԱDǪL$g `k#3>x.Xj」Yb۳G=&jb73A57xkZҝYsPVtUB-{@:**7Oz%QBw$ jٖ CӸpsEJ9`%HGښ\KL)+)Khz+uv$ӕNrOl0^9*]72AŠ]G}֙o :Ȋ vZQ/iTS͒n,;v \WWuyM5OF:o3k*/W,i6e`hf3p酯~f|.t>IѥHO*1T79뗉oef d;;A~^w񋜍jtu}'o(Sap,<7im\#c<8<~CLz%s]J%\Ǐ22q)KI '^Hi &FcKcCkvF:>QsȢKɊ3Gpwm'GHnI6)b,|bqg໅w(Pӹzdh!mH>p ZIt."0k=ʽc@XU$16'ǯn&؄v"Vƹg22 ֔O֪1|p*-+qcZ܂3s**~8FG=h"0a4u_nH2*M(Lm c ZILyJϔF/g@6l!Dl {Ok#ofB2O.Eȉs,{M?Ѡ4pιO"un c5o1SC~95; y\A$o}>UrCmANE!A,ɡf·Pܣ-=U E\lM*0Җ#0:dU_&nIYeFK|fmNm}Pgxo'a[!yg=jϷTDYӝ,q{~+AcX [<숕,ƕKJ5$.j Fii*Bg'9c'#r)Ig 67/D) )d~nơd@6`26؄4)b0`%'(`~z͟, ob=ѣS E&9+%F.6ԖM%{Td Z;<|Uߊ(uW<,jl3kB vAjpτ\J~̅q~ww6[.5Wv$g Iy*!]#f:.:cᏉf6XhSx#52pR==KFa4z'fsQ'͆ 2.G,Z 3>zs9dW/F/낽hNؼAJcl50\nbAWR;}N[m2%svG0Y ]LBCx,2 Q'k*-[Bj]Y1:3{z& q7 iy8 c8_S -s8D_* ᩅ¿)W K 8v5WIٸ8tȌ&՘gh>*bsRAK[?3A0` ^;k*b[$$琉V.%@((shO.yg';BSc4ž9'T7 c/ȶ^V<ŢA}}YMˊմ m ʉ(s MQdYY܌^{Hbb +f ]=iw_8IB.i$I{X#\5T#O p\[gZ`ϻ3&TmMkAG1VC^R7ƒv>uSeb(~-HOM9}~C)=yQLobY 0^\ pUFfRiV8RHݒx(:MjbSf 1,;ԭ*s6Lr|MasqlCSKtd-/?/HXaAN+Z/%:LWAc ZgE/ Hpt0fxHX=5ΰZrK"a?ICMQzVd@kq6.zHK|&ZSwTv+H`SZTE'꫾N mig||B>_ym>vO 7_@6mX -]phBVZm/1>8SgNk1[b#)q܎A:Jj[57bŧc 7^δ](Wœ> ׷}kOTQJ^ B TmU\L4TN쨿 1ogY^Nmi!Pݔu]9;okL:Ma 23]s) 0T"xPNװI)ȈŦ^'O V1-"C !l 4m_"N٪}i2EڐW2&3 gՔ{2'Au@~G "6WS?6w)vDt" 7/`!w|4FY5ڪp-z,z޵xi S^T8O9K I\SMj,N L6qQKsP`t!PS&!/V!G:sR)ukmq?'yuaCiINg#cn 1F&UXiYH& U:l)r"n]$+j{^K֩\ )dz+ؕ ɐeHf'4|n/x=6 8Tk\ x "&a0ŏ1 `Z9> X-2We6 Հ=@;VmmG/PEo_50vqBw@' x7L͢/sp5dsQO{Yl.-~*ȖeoՆ!a7vN9=7q%sy&7[*2\F&_xThs@mtukdEK-fX\:w+['ײ2:}>/n XA4'<ݔt҂uBDB^i;C%Ѳugiy o^Tu&1& 缀 Oh\h'H{q^2$D*`v\#O3aE#KyF/!HZmkJ[,Ppd-&k3H_=yL ?R3T\Euޤ'߹c#s4XuU &׀/}x R? 9%~Wm( Q@>ns(b֝/f+ f]' >xRpˆzeXS}os!߸$k&7[[/e35Vϴi qԫm`k&>G6p?/4iWPfrPu)lRRTǘtom143E9E#'I[*c]~*/U#LlJPWɽk,;hW}vb5VHz=g4*k;e(1ȂSM%©uÅ$jv_lb=R}h씟w_CC߁f;Ku3M' vDZXP X\9M,D9È4]/?LjjY emkzi'!H; z F Y% t:Ir &lghBS0]CJE# `JCi P:DlE/y , r@k|lh6;BR!gWsmZH\Sƿ Ӏd$s\wdHS aQ;cpi]5((n{\-x_ O(c`^1>%{v4/[٥Ī)O_tDG$*KJ%ɇU&d:w-n4J^Zw ղ]|D}Ț̀eTW vnGŘ[y'Dby_1<ӣ`mn; R~':jo'-Rʼn?8EN@Vzf >0n! X1_$(Tf)/}4 4r6æt]6CPA59lQA(fh)'QъR#WĬ%xVr5ȵ !NFZ2&iͼ zt :(To̳6-J*o9pluO7Xxs C,̵^OJ/] TRl DČKQQ4cM$Oނx1!L84ZSfuĨjMVo)Aƚr` -zG&tʢkj$Otlam\6قH&o ǜV4FT" Ȣ `c'Bd;= P*0;<*PUbZa*$\pzf*Q*s_KwZB]+̈́/؄[Rf7^i2ROԴF!t^-А_sRYOY9:=ӱ+/$V5P,xe0Vyǟ[fAU\2;w$}͑:8*&dȡ u.J!UXɱ.ud[뎻fh@ƙCjC~B] b܊SyKkgGDb9*2әZ)\%'LLm*T|;߯xV>ESi7 -i+n4*n2,bK.5nd AaJuq ha,v/ck:8#L.ғ" H;ϗvԛ"j'L/=ߓ˃+q<, 6>ڸPoa'e@֏?A2: Veju e%1?Si5vLl'bP.tdW8?1H6?] y݃C` F]}:؋R䱔9lz:Wt q}cI^xSLS $4L=~-s9BL*r2Ӑ1l8=U }0-P̈́n<+7 R1'hK&o`+rZX`dJMKCr,3$HR@}a;ۉ3C/JnLGg1oIkϤ&rLlxVy6u.*g_E r 7S?6Vk[A޷y屭m qnX bd,164UF>NL5r r 4 ԴA !\2?'H78{|hl$Xlat<7_a@&ia ?0/z3~NZlWHb Q+QR7 *eWOJ9e R-\akA%EI :IinvyףOأrt!\ dWqusVavRƈJƵ,CrL8b裓{mFH!BiBu |/=<RYc ͉sOǟ0T&5S} upn23[Ng3 V5I*0l氫~M?8zOT:L}oMڼUbH*(9rJ5_LN[U++\]T\`4IJcK424 LM7.aZa91~)1$#4b-:\^Z_FS^+LR[dPAExb˙h~7Z z` TlmlˆAc}`lwr:)%k4мŏMh .hA{6!yVCZJ5kSdG^hDV/%/1νFoz:=)AbC<;(?N AB:ya֦`Z sB$u*'HBڒpX>3rM;tH\O@ܧ7l]3cv ]`Jf=ob<&<ڎ&E&9" zc%l{8gqb^p;ؼMNu mEEXO褐|/NVVWlQ!f%2;"i>ĩۇod#v ÅdMozw[DQJ3#ck5pdҩmAJիe9!+p.q_% |LwfTk\d;gzctgơ8]1+n%7@˓Zw Z|{'~6jHg[*fgkVAWBS| H{4RdnMyoyzY'; Kuq|]ުW3CVЃ {q1-noѴD (---v郴\4=~;lNaq^ ɍQ> ".Tc73,ezHt?|(J݈p(g-_F-SYުW>?t=p(ݾP㡻h*p!w\&SP -ӘD7V e5ݴszH崵aUdپSs9`wtN  SiCDhO"lOk1ΫY+^vЌ哸N85`™% 8 C&ڮ W9Z}TP4,BxPaR5U2=Y2ϳ$VBKLv%s=Fh)Ӻi ẍ5'뵷lvwP Nc8wYA9do`Æi o(=[9ƘJB q7㹱ʰ֝aF nr/ (<=n@Zr~K>ٚ .(;0*q1aS/!-ʿ F>%TDyÖ)NѾ܋Ѣ3vIyyW2ABB& ꓱ}Tiu wƶ9fCornr~g̒,d9!Lx=A]y_߂ۀ6wDB=Ԅеr*LCdɱrTw%[̽ &"XYlRR9xmMJ\1& ~;[I)N-03_^={vFK[yTSn+E/s 洰O̰$RF_LyJҙ +%FbO9  SX8/-@]Іr՜\NnQš3qԊEެj[Fvw _*g_UnOf7ML52E V h28)(̝,@Ce*tݮ>7<KKw#ܟm,̌$)i\2fKPF=\ ,cVg7ufqiDy1_L֝*^EU >-EzNɟn)ԬxCqUh6d ÍqA/$c@[=J)k4m(l ̳}@C9:dL;|`K@6q$?w.Um_O@T͖scɸ8쓦f[KRnH^t.ψOH?z-`Ef 3-(j8SQS -l!i;'W/MzrD+ό O\͆Q*_:^ DTZ"(cÅ-dfMĥ26WZy0as QN|VTSB7f 3|B l+߲SZG.3^}[PҖ֞䳖O̦,Fc .it/} &$YNH{ \ωh~?cɨw FN{Ⱦ94 V_?5IVf. ~Aښ 7)C 47Sc։a_RPT6Xajb*eyѯd ~ <[= W|| S)b]ܯ`t;zir無5˕H%UdFċ+M $r  $y3a`(﵃1dMtc׆vq*(L&b`0nVA;:,pGMBW+2\G= }0/#Gy%Rm"p}1HAGq$Mo1sT|fc}.R*\@ZubQELEa`nH VkVL./Kk4C > ⶖ9h̗yzC۳Ay] g ߩ*iՔE<*%.A>D |jgA?fBZSL"?X.(_sZfR]VMNmYaf;㢇YėTW(noG,%fDiZ ݤ xZĨe09@_(eT(4NQ)x7mlXK"q3GQMBkbt]Ղmxɮ-LY^]pЄs,?y^:C4vY] k{}\&V峵ڜf)jQU'gtW|dW|V>Eĺѯ*M_@<#(F ;dn8)mJ.H!@l=|WrIFyte,}LM!V0 XS?=zn9]ЬQ a"[1$Z)U=;aLx<_ 84>tQ`It!p?_kIٵy1;sbXK)U״=Dx/TW=>%^A}W5TԬuB#4j' sGp+6^HZܡjH\ʟY`-qs1S7@#V]$sӦb3s Cg!ZPO9 N7ܼ)^U%al 'wB8fd2'zz.$)ep֕K *ys$tY&8̤*Vӗ"i>U|H-a`?ۇ HY8 f71ù<?\JlV|O(^2zr<(NwZ/iv6Sw(Ѵ%U:9V-eݕAncm*R#DQFT>.\!=fu'#w[dh9_V(&yfE$Ӱm*h ȏ HYy8Czڷ/.Ѯ诶Q[ tPg{'$5p;\+ &).4[cR {g QϻZݝ"S z=7ܐAג%tAá*n<(H6oaҘ{Z7/$8n=7$cBSRFHZkF\OZ6L ɴJ K)4!o}]'haR$;/s Z TJ$Wȝ}9>DHEg@WD;w^ ctu/eUK"#=ѲMED3bnX]VI*+ط|RW#"+K,3DML Ύ? E7q#>GЬfy.*?LZױ'U:I Y'g[a,yaP|*9ÎerO;]X e0Qض}P$pf$ r _Ruml`O(̋ȲT84%<',o-/BSVsp&"D&Sa SBx';6*%Fٗr2bEí86~9V'~28_PHXS?;kbE9C͝UGN b1"r=&&z;P0o~҅Xsl*cK"r_rxԵZd8,;=0QO $e:KAe ?!pjBHT5 @Bu!$ ۆ߸u}+yT"5#G'Y93 8>h+28Iv7G TgrjSkJ :N'Hf8Bc^ ;IJ\enw{uQy=]~]Bi;yf,;|扝$1[re1V)|eZ|mbSØ d@x1KYg Y}=υn [F_v+WJ@1S =5x8!a~x X ⡳qZ}ݣl8˸1D$=}fOeP@&WBS} - L7x)mnQĩ}̓J^oJG(Q\>bZUڂE1p gąR8/}{-K:HJ j$S۸p2eK!THl/,ǹs  4!q2 k,-DK06ͣa.]20q$+ ; F)v) FP=x~N"j0OA<4xB8;s:ϩymN Ҩ32_VRpUu\|BCJJ%Bid/OLWh0|CEkzaoZ>bPдaA^O?}Ir Yl l4ϋY$ې17~"G7?}y(~p&UpFz2Ӓl+oT#ćR"/Pt+6Jf*~oE ۱#{|;$lT8"ZKbd#e<誇f7ǠZqύ[6݁ @/!RU t{*)>̂j귏6LYAB6ԅJpUDw"~Hbʔ9Rs<5bv(y_P-tkw@4j>Eߠ4wK$!GMU4#VKXG'>dOAU<,"mI`p-c`@~poN?9g>W)v93z$Usu~ [љrø[ (spP\<҇u6Y#؆."I4)BOcvz@ `D _wkJn)y߳ t2gw+IVu' 2o=1(?לʔC!wOAYSv$iWo+k*~d+{*&s~ C^czoVV7yH#-) J(GA ;a F^rO_IZ3e,~[:S6k>)`v(uvWHUCJ=ѠPZP^5'= ,>a;Si K TK%GowD`FT8UE8vpPG߹`"…-cGK-=M+EJ!OL$ai)M_u kw"Cz\IZvd%y (Z!$Zs~/#{Վ'{0Tqm$G#֧#ʫ[`su@SbK%[~KZqawoa}{!QIN>Oܬ[*w= U%)x7hb=%x4kW@nVxbȠtN@q ,ϱFObv&%:X]ʈer;dA8ap`Z&-uV.s&{(wT,g;\D!8W, 0BX|Sn:ʨFMS#RvrTL3-AqV|3t2m[I*fu057g [6䓂.b{j(0= ̍Ϝrg,bKscF lw: Ŏ>"V^F(f6(O&͇Jwd2^ajjcOX_}\2t4`˕oeXA^;&ymʗo>]a'" ^ $Jۀ"<}:B=QQЁa#kLp0ntDG/a|tx睊yFXz>7zЈ^Pk/y9[7Ѧ mUR$Lk -E[ݽ2hTZ? $B-kҕq -)<.K$j7z8n%3 AQhgBhPо^k%拋x_+9p0YV{1h=*)HbK=k12Ld G wsXsk^cVXG"G5 [F*A?xɤqϢ6}Rxb]j&0ڐ8S4)(OyHQI)Lo1O$R|b=b dE'o`Cz!/cLt _/7;aQpͪb/@*7u;I#h+hH8(oT2P{1+#%>szF@:L>Q,)"_Ϊꖃe0};,Θkpvmk}#:]I/Ll6rFSHTUf9+Jflρ}ekyBT,fjZ~(:ETzri<{\twoJқtEh{Wqx7]_H0_uM2cKrSWď ڛ{WK,tk7-Tt4Q8]Pu}7nz3c 5?sK Ƌ".`2Sەݟ;lMv#Uz܃Z qw9ص031SiK!z_3b8psxD}NBLZ6F5C`Z&sudwA4o|1tzZ(NsH` C7UxwkN&alhVavKS zF9`t!=%+.2S8WT](KۚVPpRj$x)z ,&ZanKUN>b^`a` :G`J&UԮGaVSüY=qۺZ_jz@"ܠѴ,X %yz[s<5v&K Zdn[\7vps3P&,0?CK喧}#p %b0Qk\@Bג2S[Z"6Pp$ ;kZ:"JW?2= ͼz >zoow5?%;3;qiPvQ<{ZXܕHo跑Cbx fJR]!jm]kVGи"p=LlVqQ)0w,|~(7^(tEGثIןVN>SrjkAȰtEikkriǚ]S/̦kfm&ZQ98( UZ5@T;"8YMS/ax&-ũ '_h΃n{ gS LoGu%Xy3b#ll[nk݌Wa܌W˜Ԇ3EDo!:QRزd>{^[YjI Tm!]_mu%Q}7j,%uԪ#Oj{  E} ;w=*%/Y4"?#fVޓSGwtENDƠZq}JFčÖG{q.R%I78UdcD-V|obC,D1u]}˂bf +3f[@g>PZuDU b MH}q`o~Fp5w+$oZÊ٩M1;cO1'BGPp&*v0-TZ+K'9N]M5qm1db*S=!=+.^޶|tUƅҳЍz&9w'S۠ւb\{ZP;*8r3o̢ 3HwS,QZ۾H-bAv5QU2RX6n}J cD$PЦiR9d*d*ں/]C< C t2yRL" )牀wt>#ou*/W]uSP3GWiEqֻۂ[*(#8hǎA&fuLc'{.>xO;##%[$ u V60j&6Π@=ό1!kT%yʏou ÏYTwm!LFK!y"7ac&zaL!C)#씼_'x`xvqaΟ@xx;'KAR%ef6%rvm踍m_w Sͤb#K|ږWK*ׇ,bT- QL2R |h$6/9Oqk:7n} c+*(lvf<ڃ2t">'r~f}ecYNV\j+\fUqWxU)//gj$"mmj,S_ W=#BL6Ѣld!I;V mWM'[<^즓2cQ-' yK[JGNŇ7{2D-UOIG.^&SA=OԽνY^[+lW@ Ȯ D OUr%5W3C2kᴠxПѪa`EZ:-\W@{6/N@ F:Dz~dq 0Y !E8j|A`}'f}_T$*3n elG|G AF_1Y#I gan'DAT/rJ]H-E;3;"rBiw8LrJNؘG+G,wV |zz;[b r<Fd-8FmH1ɾUvdR3^LϢI_[`U0ĭUo:A>Y CH2wo,+ @UaMڞDl G%(ž|sVd-R"56ϖ`]>6p2ʹ r+cHjX]=79z6$3)J&=Hc]!i8|OmɥaK۸ԈoO8ػ3T5ܽbHjq[]hY/n|9h%G6GE N-o𞾫-  mTONLIR6m,Qspw:{mP%6#veC$aыcjw.^luY=B{InU3ڀ{>_[w~ UOu.T.&,BTn?jMv/9/T9 S;Ha}fH ? 1n1h\[I"뜌.VO=*e:n_@?`$zR9 -έ-}",B$&Ճx7P/ O|xxW S!-;ޒkFG%{n;ዾ08q=ZNuv5\F';i{AhxSsTO݀uG~_/`v_f9h'Oj)X&5դ8/mh蔆rᝐ^IT`aY)Wqy$xiJ3w_uWFU!Ԝ[ 8̆|V#ӢF/vSe1ɷ7Wgyh 2JBX fP sZ [qxf+iOƬ뽭pSZbEd{:M!WNGFք`bFmr+*RiѬOnaH;f`S6dN7A6dW"+sv[ pћߗؤ- [jo"fWFkjd9"2Y2;+ K;~ԋ|ҌR(^t"v0{7;ze? gvcJtͽ4tIypތKZ {(ׇR(;.'c) ]F!*XUG8өuo62:(3ʑ#YSd<&}2⹧}ٖg?gM[fݱyfHbo0 y5^gn"Mi8+EW))+b ^ @ ]Gof0:q7m6WZQ'y{~}=>_&Lve'dyLV&0N R1uS< 8.LʌHΧ c#w#Qyu ־c!U]c2ATZdgH1|X \F;VSFbz[aVSB0BLF}.GM)|Ҁ/'К CQy$.^ 3 1bɻ(,?}el@=T_Nd*x(Gb9 L r |}0_j YL3S@ 7l?XAAWi0 43tn;U{Ѷ9^ Z{}'^/A$'Q]{E!yV-)=x_RTh,ib2 bHMna.әQ<&k<ސC+DQh|> 'B>g$9L\7/J2Agy]5Won!dlk\p e 4~OBY$==rCq_!e#SP,ٱ3%sݪU{lB ]Lmܤ9Ptkl̓@M<[BZu5HEqn6ЖLiW+1xiwљ%Vs.ɊB>44һ&f;7߭4VfhB 4főE'3&(/5A)`OWPKfFTS:RC=$Pz!TRRg|F]qj4' H!ܘXI4Z7P*V\I'EF?ۑzJOP*֯v$qxQ<=6|c6XӂNs%.%4ZP'G&~TIolxٴN:z?0ay4b߰euɳ]sqW+22qllc$,}!zR_ؔy;H@xa]a%`%d]hVшK LmW%⤯PG,Sʉ/QV.+ˎ]DKRI;a%h?֥JK$ʡdWiknR}KƬʡM‹!r ݿ&ty+KٲsmFlS]KǠرʑ"m-b %d;&C5߷~?!5tg w$ŏ-ٟ#}AX`䤔m!lIgL#uK\!)ьIi+p~nlAwtVe"wc7_{Y+&Jj&"Ƞ`1 @/RT+/JԖv)'Kҧ&>BXb T&8?LXkS)SMg {]7YӸ16JHD=ꚓ~?eș K~d#P]5^f_ީ[?aTtFSvFolu&Py.ՎQV5U;W7ݏ~}%җ+c]Xf`b`P˝ iQ$=y n(ױIi; zv! cg!%*&K^X8vt:-{Е3`EZ7Y_l4 Ps4;.mp sqQ&@ LL\㭚j6T6L i3n{%4.ķv8բ8׏Fq *`x0fpSb$:ݔX_[AF}'wf;%? {]1q9nIrΦKbF1gEvJNBKy%b_D9HIE_)/jD G'ijǯ w<{n-p'9d/p Y`y]iG~wu'^EYhk7pe M-+g3b,2_NBQƭGi>e? XV˳Oj4mR6i*&r01Δ2+1p}&_I0&9AX!=b P/<fX/P6"8 T&^0dSf+,-OM)O:for܀G1 gm/6,ܺ,om6B(g6c3x/_ Y!9eHl/T< __C$b: 9 0QVڍڄN/3""hV-{2' :+\@MmjKd= Ngmm;|PHg.Yi"*pkcT pߔJs#)I=Jd <۠hcӄ2)3_fS24?ؓRp{3SsTb$cvgNi Y&?r0pڌpa,ZP1HךftaYMɱu ~wرYeݻ0EN"${ts&B0.˶=bgSvzWaO:"z%qECa;xZӼ$|=J褂beGq]h pdk$!*<:BLr穘e˗'"[3_ m]2!sX5Q<}n@%,W2`Xn dp~m%E\:FHob%n9Gҋ8:oW|끂9c,֪3r¨40~$T@N%3pqW,7%_hg>ٛNS*|HQ,C;(l=^91&?lu3ҤE%ޚ%FIGEv*ѠrxL'&Yٗ|\={_623%xWQ"jn^~B?qߺC=kS* DM)9MU>dzr;{ zLX/~F Ծ%ӻ[՞4@e8Ǽz#QUsF4TV.Af Rd5Tu&mӄ7, /|c4J9^X ]0G G&rS5^f☤`|jGjcќXÃg" juŌ?g/,|o?AԶS▘vm54aJC_C!ёl6XT\J VS%§#rhf-AnۓG(؊:Fdxqs2GG^)v;S`'%cK|RrKs4w`~Xsή ƽsYd|mV iѺ9ΨdT3]孰Tߵ&: :< 3#ՒyWs&Gn0yHr{:@Gո?xݒSX& HB| o}%ƺP "10jJuyIІ($@,|K{OUS&oYHqLjߣ 25 @rYߞ$͖Qf}Az5QZ?nO\U;jC#CE(( j#dfhs>~gZݗ!9ʸ[ JpY*jDa-6ݦśh D:HF܁aΌF1@fygB4Vg+;ز1lBJf3_J$Jԗ>auvp{b7 ƒm+;ՆR;"y$5L' yTm N\% V[n-s ;.JXX'213G)mz=7?D܅sLZr9a N?HokGrR| #CT$]DyO $+b+OpNrz/{tIogYCY鏍ʺQF͹2c|LqND +2E3ԇȡ!빠|K`>N:kU=:?g2GxcƟ77e?v UNo\I.2MrBMz= Fb/ +7] <V@NMZJ 1>[vؠS ު{}a==$|896;-A"k[]OG`rB;C^hp,jd%ߖ˅xOr4-T a0= ;wA-Oq4nIvJeFn=8n^ S,#$zi~oHO  ڦj1m|٤6^i}urTUA,K|#7L{\;u!(3ǨVB2-f4NZ|RŅ!3XHe25ݠv CĚ r΀.ׁvs0=Fr`{,(rd\lL*vTۿv!8 elٴ1o)XT#m惪BnۨH)9}p[g\gPV-HK+UСw/,^6̦%:2OHy\[^tiaiꛂ? K7Kӝ+*DJX̀ ksL.k_~ Z>]c:':MyĘRtiG0@ H`V%x0L]*ML 1N u).&.N^?EvƦ\ÄFTg·^rʓs媳wv7\W8م z"ye׶BsjɎUIO)d-3ml()(cY%i&~\* q:X8e"?#lv@,{#_ć-Mm\"; zN&  Z/>7'G=%~ DZN^\^ԯط[P"*’A{HAنi]Q k`cY[|-£H].(Xv"J48 ',y[!؋̽7x7Q6`*=Y8݆@7oxzr*@u_}'[ݡQ6WYg^m,?٦J|˽8NdY1O:4WM)ekUf <l:ߛoY+y%yk\H~u>"'P]+EVsnxI"IL0,bl#+{8Z!tfCT! an*;zLQ:` quU.-3ZDHUV6'v+Ɩu7gbQ_0mt]LL4NҰknqBY^TrvE2K)&Jq_Oܽt!z[eOMFGKÙjS'iGZf[ܾR,p%iY .UܐN"R/J급FC-H]~qdPt֩,|v/>HBR[qng]LB3?;ױURTW3Tޟn]f53!˾x.XӰB.MSܤ Vn-#È%7kӡsxU ƤS8ڳԒ̌>tWu6]zJ1Vg $9\65ѷ* ,~=>o4Z.,'⠂o?-p,12\}3PݶKHT %JbS11 Nsn{rJʎTc{N& UC)e ᳖}tR88%|qZ$ACao3eƫᷰ0rD$ C Sc8! (v80}''uי:rfC-g۾F#s[I[dgV|]=\yoewFHXfH,I7RpG% É7dߏ6qIfضRI P%,7$/ B-M/˘-P)ܱE^0qZګs:;ƭ@Ӓ(N? l` FC 0VCl{L t@~{oO1A;;\.)O^G9tɠܸ !;.3%T~9R}L)LF%7:7Cm4J@F*XdJaDm+=8m_O]9SŎGH( 6=fРxh[hq3`tVoH]OHncFg@,Kk |03Ks\eS*/UzV̟߂ADER;.paI|#9uE<2:F^]a1AjrSk@5oX1%EEfgG*Nfԍ4- (yO 5;ZZ͹/>~t9bK0h~=-P0oUėw @ Gtdl6`Pw6 0hL:M5܁pqdsF#H Sq[c|]Ū Ѕ18Q +CbuEq2<WeN 6k HOGcH=A ٗ 4nW(x`۰NG]]VSAjP [74^ 5[4^A!n|u4++HvjX&v_"IUoĬ칪Q(Ph˅c6щsޛj`A}*} <B快Ǡl*SuU Ix@=a똟߈iO1ytrv3aȧǚmCXGY2JeFLr1FMj {P5wDwo3;E= ~@luVjc?!l6V(lGCuЇ`^05lE=&s1#o"Dz-<84ȦW*>Q4Wj6VeW:p%5}y_ȇZGR8 lې'%P 8{LcdžF> cX{[-T6lzUEZ):/#)Vw9Cnυ"~s 1`4?AveaieÒpTHE~ghcE6_O^4cHAiPf$r)BApHTVu~uDY`vY#aNF]O@6t]?&'> V?P3`M| Y -Hl(f\2S @\$?Tᔑ< ܚmGܚCcC_$gmPN&^yCViȷ-}UDB"vfyd@!ؖhj!1[%iP79_V7;5.bD @(L"ۇ/4Z!xGq8ej 0ƢHӄhA_UhcW kʱN#JCjAX42Rr_Ӯ@aTy=>Qp'?s Vo9CtOpiHeU#J#,TgyZx̍V*Ι0Kqwn>suf/󘩤Ŕ0%u4a&$)~B(пAj%4 NȖ'fHElӫ5 v+Qܔڈ'P6"wfaSvZJy0a v!LgB2L:S(ޮ,L FkFD[8Y]B~ SĀD6i;)90 Qup) \_HGxn]H3d1 uYP#32),013gn$?w Wpٷ,ñ(8Lw>iquz+B,ED>vv},Fm h!ǘ/JZrZ/f cQ%=&I'.4#oBӁWϪ=MyL5 oU^D.bӹ-E6 M7Np,xOJ?X2fBLLZ /OHƒ }8[[YaR.8$ =HN(%Wj?LklrGᵮlL7܌7T;#=0U,|B>NhS/dh-n  [N~58G]QX碓7v1_;C-.UOF`B,qв-r AwfJ)NIÚs1%8\gJ&3K)Acvh>"(LH8ϫ_H8w/mR[ٍޏVp2;≸&Q|o2y<_@K>fKo0:]2vaL9w :~Ccj݅vkK }% vn 6b!:Փ1t8M% " !6WRa}4V|CSEܱXb/82K#."vWe?;/~\re&}[cN6CJՐ\KAˌ֔RVe ha""KMbqk'/jZઆUVI?X)Jh_md ݙ 4"'g |2b^>UA>]AA %_bl,L1DuT ~UjiO+b!rB[Kܣ$idwK&TLy>Otg,/|tG ӄRo0ח$ˮ!n=}%Um{Az CL ˒ߏ iI E %fQu6</-YBm,͜um4 ^[4eKQLW#uN< @1pc *1nPnب(|^@Tn_w>1&Tui{`(_搛מ?d)~"f,(Գs^큑 u:HsMXUʷ)k P!K*֤6|M;.ۻ:h*OY6̔W ͱ'_ˌQvxK󀧈f@?Hwy(v M7rr"<(n܍a0pɫ$Ro = $\\cj Jvl&džf7.!Nj-r_KV*x{,].c)t1wrNϫEYL/6$ BA(-k"F` )ӣȝ <~|mϼWLVVxIj#jrwG,Z"jNKj%.&%s:A/FNӃ8&G1fQb-pH.)D~5 zV#b_cf =/\j{%6I0v1C.oK財vϚq=?UD9DRPȕ7B%Ok9;0bSC$ WF$X21ӽXneL9t)^I\DG);ٚDnJAn4'm Hd ML@Cy2 's{Z*q *ʁ-7勗n/e Rws9r*%6ds*CnUXdIVp y[,Pȸݙ/*" '䘚[F Fu^csͼ; N-=o2(}j$e"ov^r@28!V8ȰlKQ@YZMALDIquant/man/0000755000175000017500000000000012265250703014236 5ustar sebastiansebastianMALDIquant/man/estimateNoiseSuperSmoother-functions.Rd0000644000175000017500000000245612213060522024102 0ustar sebastiansebastian\name{.estimateNoiseSuperSmoother} \alias{.estimateNoiseSuperSmoother} \title{Estimates the noise by Friedman's Super Smoother.} \description{ This function estimates the noise of mass spectrometry data using Friedman's Super Smoother. It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}} should be used instead. } \usage{ .estimateNoiseSuperSmoother(x, y, \dots) } \arguments{ \item{x}{vector of x values} \item{y}{vector of y values} \item{\dots}{arguments to be passed to \code{\link[stats]{supsmu}}.} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}}, \code{\link[stats]{supsmu}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## transform intensities s <- transformIntensity(s, method="sqrt") ## remove baseline s <- removeBaseline(s) ## plot spectrum plot(s) ## estimate noise n <- estimateNoise(s, method="SuperSmoother") ## draw noise on the plot lines(n, col="red") } \keyword{internal} MALDIquant/man/filterPeaks-functions.Rd0000644000175000017500000001054112265240511021001 0ustar sebastiansebastian\name{filterPeaks} \alias{filterPeaks} \title{ Removes less frequent peaks. } \description{ This function removes infrequently occuring peaks in a list of \code{\linkS4class{MassPeaks}} objects. } \usage{ filterPeaks(l, minFrequency, minNumber, labels, mergeWhitelists=FALSE) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{minFrequency}{ \code{double}, remove all peaks which occur in less than \code{minFrequency*length(l)} \code{\linkS4class{MassPeaks}} objects. It is a relative threshold. } \item{minNumber}{ \code{double}, remove all peaks which occur in less than \code{minNumber} \code{\linkS4class{MassPeaks}} objects. It is an absolute threshold. } \item{labels}{ \code{factor}, (one for each \code{\linkS4class{MassPeaks}} object) to do groupwise filtering. The \emph{levels} of the factor \code{label} define the groups. If not specified a single group is assumed. } \item{mergeWhitelists}{ \code{logical}, if \code{FALSE} the filtering criteria are applied groupwise. If \code{TRUE} peaks that survive the filtering in one group (level of \code{labels}) these peaks are also kept in other groups even if their frequencies are below \code{minFrequency}. } } \details{ For \code{mergeWhitelists=FALSE} the filtering uses a separate peak whitelist for each group specified by \code{labels}, and is done independently in each group. For \code{mergeWhitelists=TRUE} the peak whitelists are combined, which means that peaks that occur frequently in at least one group are also kept in all other groups. If both \code{minFrequency} and \code{minNumber} arguments are specified the more stringent threshold is used. } \value{ Returns a \code{\link{list}} of filtered \code{\linkS4class{MassPeaks}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{intensityMatrix}}, \code{\linkS4class{MassPeaks}} } \examples{ ## load package library("MALDIquant") ## create four MassPeaks objects and add them to the list p <- list(createMassPeaks(mass=1:2, intensity=1:2), createMassPeaks(mass=1:3, intensity=1:3), createMassPeaks(mass=1:4, intensity=1:4), createMassPeaks(mass=1:5, intensity=1:5)) ## only keep peaks which occur in all MassPeaks objects filteredPeaks <- filterPeaks(p, minFrequency=1) ## compare result intensities <- intensityMatrix(filteredPeaks) ## peaks at mass 3,4,5 are removed all(dim(intensities) == c(4, 2)) # TRUE all(intensities[,1] == 1) # TRUE all(intensities[,2] == 2) # TRUE ## only keep peaks which occur in all MassPeaks objects in a group ## (e.g. useful for technical replicates) groups <- factor(c("a", "a", "b", "b"), levels=c("a", "b")) filteredPeaks <- filterPeaks(p, minFrequency=1, labels=groups) ## peaks at mass 3 were removed in group "a" filteredPeaks[groups == "a"] ## peaks at mass 5 were removed in group "b" filteredPeaks[groups == "b"] ## only keep peaks which occur at least twice in a group groups <- factor(c("a", "a", "b", "b", "b"), levels=c("a", "b")) filteredPeaks <- filterPeaks(c(p, p[[3]]), minNumber=2, labels=groups) ## peaks at mass 3 were removed in group "a" filteredPeaks[groups == "a"] ## peaks at mass 5 were removed in group "b" filteredPeaks[groups == "b"] ## apply different minFrequency arguments to each group groups <- factor(c("a", "a", "b", "b", "b"), levels=c("a", "b")) filteredPeaks <- filterPeaks(c(p, p[[3]]), minFrequency=c(1, 2/3), labels=groups) intensityMatrix(filteredPeaks) # 1 2 3 4 #[1,] 1 2 NA NA #[2,] 1 2 NA NA #[3,] 1 2 3 4 #[4,] 1 2 3 4 #[4,] 1 2 3 4 ## demonstrate the use of mergeWhitelists groups <- factor(c("a", "a", "b", "b"), levels=c("a", "b")) ## default behaviour filteredPeaks <- filterPeaks(p, minNumber=2, labels=groups) intensityMatrix(filteredPeaks) # 1 2 3 4 #[1,] 1 2 NA NA #[2,] 1 2 NA NA #[3,] 1 2 3 4 #[4,] 1 2 3 4 ## use mergeWhitelists=TRUE to keep peaks of group "a" that match all filtering ## criteria in group "b" ## (please note that mass == 3 is not removed in the second MassPeaks object) filteredPeaks <- filterPeaks(p, minNumber=2, labels=groups, mergeWhitelists=TRUE) intensityMatrix(filteredPeaks) # 1 2 3 4 #[1,] 1 2 NA NA #[2,] 1 2 3 NA #[3,] 1 2 3 4 #[4,] 1 2 3 4 } \keyword{methods} MALDIquant/man/labelPeaks-methods.Rd0000644000175000017500000000562412211651271020234 0ustar sebastiansebastian\name{labelPeaks-methods} \docType{methods} \alias{labelPeaks} \alias{labelPeaks,MassPeaks-method} \title{Draws peak labels to plot.} \description{ \code{\link[MALDIquant]{labelPeaks}} draws the corresponding mass values on top of the peaks stored in a \code{\linkS4class{MassPeaks}} object to a plot. } \usage{ \S4method{labelPeaks}{MassPeaks}(object, index, mass, labels, digits=3, underline=TRUE, verticalOffset=abs(diff(par("usr")[3:4]))*0.01, absoluteVerticalPos, adj=c(0.5, 0), cex=0.7, avoidOverlap=FALSE, arrowLength=0, arrowLwd=0.5, arrowCol=1, \dots) } \arguments{ \item{object}{\code{\linkS4class{MassPeaks}} object.} \item{index}{\code{integer}/\code{logical}, indices of peaks to label.} \item{mass}{\code{numeric}, mass of peaks to label.} \item{labels}{\code{character}, use \code{labels} instead of mass values as peak label.} \item{digits}{\code{integer}, number of decimal places.} \item{underline}{logical, underline peak values?} \item{verticalOffset}{\code{numeric}, move label vertically (relative to peak height).} \item{absoluteVerticalPos}{\code{numeric}, absolute \code{y} value for the label. If missing \code{verticalOffset} is used.} \item{adj}{\code{numeric}, adjust text to the left, center, right and top, center, bottom; see \code{\link[graphics]{text}}.} \item{cex}{\code{numeric}, font size, see \code{\link[graphics]{par}}.} \item{avoidOverlap}{\code{logical}, try to find label coordinates to avoid overlap.} \item{arrowLength, arrowLwd, arrowCol}{arrow parameters, possible vectors. \code{NA} values in \code{arrowCol} cause the arrow to be omitted, see \code{\link[graphics]{arrows}}.} \item{...}{arguments to be passed to \code{\link[graphics]{text}}.} } \author{Sebastian Gibb} \seealso{ \code{\linkS4class{MassPeaks}}, \code{\link[MALDIquant]{plot,AbstractMassObject,missing-method}} } \examples{ ## load package library("MALDIquant") ## create a MassPeaks object from scratch p <- createMassPeaks(mass=1:20, intensity=sample(x=100:10000, size=20), metaData=list(name="example")) ## plot peaks plot(p) ## label the first 5 peaks labelPeaks(p, index=1:5) ## label all peaks in mass range 15 to 20 labelPeaks(p, mass=15:20, underline=FALSE) ## label highest peaks (top 5) top5 <- intensity(p) \%in\% sort(intensity(p), decreasing=TRUE)[1:5] labelPeaks(p, index=top5, col="red") ## real example data("fiedler2009subset") ## a simplified preprocessing r <- removeBaseline(fiedler2009subset[[1]]) p <- detectPeaks(r) plot(p) ## label highest peaks (top 10) and avoid label overlap top10 <- sort(intensity(p), decreasing=TRUE, index.return=TRUE)$ix[1:10] labelPeaks(p, index=top10, avoidOverlap=TRUE, digits=1) ## use own labels and rotate by 90 degree plot(p) labelPeaks(p, index=top10, labels=paste("TOP", 1:10), underline=FALSE, srt=90, adj=c(0, 0.5), col=2) } \keyword{methods} \keyword{Graphics|hplot} MALDIquant/man/estimateNoise-methods.Rd0000644000175000017500000000270212213060522020767 0ustar sebastiansebastian\name{estimateNoise-methods} \docType{methods} \alias{estimateNoise} \alias{estimateNoise,MassSpectrum-method} \title{Estimates the noise of a MassSpectrum object.} \description{ This method estimates the noise of mass spectrometry data (represented by a \code{\linkS4class{MassSpectrum}} object).\cr } \usage{ \S4method{estimateNoise}{MassSpectrum}(object, method=c("MAD", "SuperSmoother"), \dots) } \arguments{ \item{object}{\code{\linkS4class{MassSpectrum}} object} \item{method}{a noise estimation function; see \code{\link[MALDIquant]{.estimateNoiseMad}}, \code{\link[MALDIquant]{.estimateNoiseSuperSmoother}}. } \item{\dots}{arguments to be passed to \code{method}.} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{.estimateNoiseMad}}, \code{\link[MALDIquant]{.estimateNoiseSuperSmoother}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## transform intensities s <- transformIntensity(s, method="sqrt") ## remove baseline s <- removeBaseline(s) ## plot spectrum plot(s) ## estimate noise n <- estimateNoise(s) ## draw noise on the plot lines(n, col="red") } \keyword{methods} MALDIquant/man/transformIntensity-methods.Rd0000644000175000017500000000250712213060522022103 0ustar sebastiansebastian\name{transformIntensity-methods} \docType{methods} \alias{transformIntensity} \alias{transformIntensity,AbstractMassObject-method} \alias{transformIntensity,list-method} \title{Transforms intensities of an AbstractMassObject object.} \description{ This method performs a transformation (e.g. sqrt-transformation) on the intensities of an \code{\linkS4class{AbstractMassObject}} object. } \usage{ \S4method{transformIntensity}{AbstractMassObject}(object, method=c("sqrt", "log", "log2", "log10"), fun, \dots) } \arguments{ \item{object}{\code{\linkS4class{AbstractMassObject}} object or a \code{list} of \code{\linkS4class{AbstractMassObject}} objects.} \item{method}{used transformation method.} \item{fun}{deprecated.} \item{\dots}{deprecated.} } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{AbstractMassObject}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## transform spectrum t <- transformIntensity(s, method="sqrt") ## plot spectrum par(mfrow=c(2, 1)) plot(s, main="raw spectrum") plot(t, main="transformed spectrum") par(mfrow=c(1, 1)) } \keyword{methods} MALDIquant/man/estimateNoiseMad-functions.Rd0000644000175000017500000000222212213060522021753 0ustar sebastiansebastian\name{.estimateNoiseMad} \alias{.estimateNoiseMad} \title{Estimates the noise by MAD.} \description{ This function estimates the noise of mass spectrometry data by calculating the median absolute deviation. It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}} should be used instead. } \usage{ .estimateNoiseMad(x, y) } \arguments{ \item{x}{vector of x values} \item{y}{vector of y values} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## transform intensities s <- transformIntensity(s, method="sqrt") ## remove baseline s <- removeBaseline(s) ## plot spectrum plot(s) ## estimate noise n <- estimateNoise(s, method="MAD") ## draw noise on the plot lines(n, col="red") } \keyword{internal} MALDIquant/man/fiedler2009subset.Rd0000644000175000017500000000471012207647127017710 0ustar sebastiansebastian\encoding{utf8} \name{fiedler2009subset} \docType{data} \alias{fiedler2009subset} \title{Example Mass Spectra (raw)} \description{ This dataset contains 16 example mass spectra. It is used to demonstrate the usage of \code{\link{MALDIquant-package}}. } \usage{fiedler2009subset} \format{ A list containing 16 \code{\link[MALDIquant]{MassSpectrum-class}} objects.} \details{ The dataset is a subset of data used in \emph{Fiedler et al 2009}. \cr It contains spectra of 8 different patients (each one has 2 technical replicates). \tabular{rlllll}{ list_index \tab laboratory \tab patient_id \tab sex \tab age \tab type \cr 1 \tab Leipzig \tab LC77 \tab male \tab 37 \tab control \cr 2 \tab Leipzig \tab LC77 \tab male \tab 37 \tab control \cr 3 \tab Leipzig \tab LC213 \tab female \tab 51 \tab control \cr 4 \tab Leipzig \tab LC213 \tab female \tab 51 \tab control \cr 5 \tab Leipzig \tab LT178 \tab male \tab 58 \tab cancer \cr 6 \tab Leipzig \tab LT178 \tab male \tab 58 \tab cancer \cr 7 \tab Leipzig \tab LT157 \tab male \tab 60 \tab cancer \cr 8 \tab Leipzig \tab LT157 \tab male \tab 60 \tab cancer \cr 9 \tab Heidelberg \tab HC49 \tab male \tab 43 \tab control \cr 10 \tab Heidelberg \tab HC49 \tab male \tab 43 \tab control \cr 11 \tab Heidelberg \tab HC54 \tab female \tab 71 \tab control \cr 12 \tab Heidelberg \tab HC54 \tab female \tab 71 \tab control \cr 13 \tab Heidelberg \tab HT151 \tab male \tab 53 \tab cancer \cr 14 \tab Heidelberg \tab HT151 \tab male \tab 53 \tab cancer \cr 15 \tab Heidelberg \tab HT429 \tab female \tab 58 \tab cancer \cr 16 \tab Heidelberg \tab HT429 \tab female \tab 58 \tab cancer \cr } } \references{ G.M. Fiedler, A.B. Leichtle, J. Kase, S. Baumann, U. Ceglarek, K. Felix, T. Conrad, H. Witzigmann, A. Weimann, C. Schütte, J. Hauss, M. Büchler and J. Thiery \cr \dQuote{Serum Peptidome Profiling Revealed Platelet Factor 4 as a Potential Discriminating Peptide Associated with Pancreatic Cancer} \cr Clinical Cancer Research, 11(15): 3812-3819, 2009 \cr ISSN 1557-3265; doi:10.1158/1078-0432.CCR-08-2701 \cr \url{http://clincancerres.aacrjournals.org/content/15/11/3812} } \seealso{ \code{\link[MALDIquant]{MassSpectrum-class}} } \keyword{datasets} MALDIquant/man/intensityMatrix-functions.Rd0000644000175000017500000000462312263537432021760 0ustar sebastiansebastian\name{intensityMatrix} \alias{intensityMatrix} \title{ Converts a list of MassPeaks objects into a matrix. } \description{ This function converts a \code{\link{list}} of \code{\linkS4class{MassPeaks}} objects into a \code{\link{matrix}}. } \usage{ intensityMatrix(peaks, spectra) } \arguments{ \item{peaks}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{spectra}{ \code{list}, list of \code{\linkS4class{MassSpectrum}} objects. If a peak is missing the corresponding intensity value of the spectrum is used. If \code{spectra} is missing \code{NA} is used instead. } } \details{ \code{peaks} have to be binned by \code{\link[MALDIquant]{binPeaks}} before calling \code{\link[MALDIquant]{intensityMatrix}}. } \value{ Returns a \code{\link{matrix}} containing intensities of all \code{\linkS4class{MassPeaks}} objects of \code{peaks} and interpolated intensity values for missing peaks if \code{spectra} was given or \code{NA} otherwise. \cr The \code{\link{matrix}} has \code{length(peaks)} rows (one row for each sample) and \code{length(unique(mass))} columns. The column names of the returned \code{\link{matrix}} store the mass values. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{binPeaks}}, \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## create example MassPeaks objects p <- list(createMassPeaks(mass=1:4, intensity=11:14, metaData=list(name="test mass peaks 1")), createMassPeaks(mass=2:5, intensity=22:25, metaData=list(name="test mass peaks 2"))) ## converts MassPeaks objects into a matrix intensityMatrix(p) ## realistic example ## load example data data("fiedler2009subset", package="MALDIquant") ## transform intensities s <- transformIntensity(fiedler2009subset, method="sqrt") ## smoothing spectrum s <- smoothIntensity(s, method="MovingAverage") ## remove baseline s <- removeBaseline(s) ## call peak detection p <- detectPeaks(s) ## bin peaks p <- binPeaks(p) ## convert MassPeaks objects into a matrix with missing intensity ## values intensityMatrix(p) ## convert MassPeaks and MassSpectrum objects into a matrix without ## missing intensity values intensityMatrix(p, s) } \keyword{methods} MALDIquant/man/MALDIquant-deprecated.Rd0000644000175000017500000000477012213071013020516 0ustar sebastiansebastian\name{MALDIquant-deprecated} \alias{MALDIquant-deprecated} %------ PLEASE: put \alias{.} here for EACH ! % since MALDIquant 1.7.4 \alias{totalIonCurrent,MassPeaks-method} % since MALDIquant 1.7.6 \alias{calibrate} \alias{calibrate,matrix-method} \alias{standardizeTotalIonCurrent} \alias{standardizeTotalIonCurrent,list-method} \alias{totalIonCurrent<-} \alias{totalIonCurrent<-,AbstractMassObject,numeric-method} % since MALDIquant 1.7.10 \alias{ltrim} \alias{rtrim} \alias{ltrim,AbstractMassObject,numeric-method} \alias{rtrim,AbstractMassObject,numeric-method} \alias{ltrim,list,numeric-method} \alias{rtrim,list,numeric-method} % since MALDIquant 1.7.12 \alias{mergeMassSpectra} \alias{movingAverage} \alias{savitzkyGolay} % since MALDIquant 1.7.13 \alias{isMassObject} \alias{isMassObjectList} %------ NOTE: ../R/deprecated.R must be synchronized with this! \title{Deprecated Functions/Methods in Package \pkg{MALDIquant}} \description{ These functions/methods are provided for compatibility with older versions \code{\link{MALDIquant}} only, and may be defunct as soon as the next release. } \details{ \describe{ \item{totalIonCurrent}{\code{signature(object = "MassPeaks")}: Accessor function for sum of all intensities (slot \code{intensity}).} \item{totalIonCurrent<-}{\code{signature(object = "AbstractMassObject", value = "numeric")} Set sum of slot \code{intensity} to \code{value}.} \item{calibrate}{\code{signature(x = "matrix")}: This function calibrates intensities of an intensity matrix created by \code{\link[MALDIquant]{intensityMatrix}}.} \item{standardizeTotalIonCurrent}{\code{signature(object = "list")}: This method sets the TIC (\emph{T}otal \emph{I}on \emph{C}urrent) of a list of \code{\linkS4class{AbstractMassObject}} objects to one.} \item{ltrim}{ \code{signature(object = "AbstractMassObject", minMass = "numeric")}: This method trims an \code{\linkS4class{AbstractMassObject}} on the left.} \item{rtrim}{ \code{signature(object = "AbstractMassObject", maxMass = "numeric")}: This method trims an \code{\linkS4class{AbstractMassObject}} on the right.} \item{mergeMassSpectra}{use \code{\link[MALDIquant]{averageMassSpectra}} instead.} \item{movingAverage}{use \code{\link[MALDIquant]{smoothIntensity}} instead.} \item{savitzkyGolay}{use \code{\link[MALDIquant]{smoothIntensity}} instead.} \item{isMassObject}{deprecated.} \item{isMassObjectList}{deprecated.} } } \seealso{ \code{\link{Deprecated}} } \keyword{internal} \keyword{misc} MALDIquant/man/createMassPeaks-functions.Rd0000644000175000017500000000235012211651271021602 0ustar sebastiansebastian\name{createMassPeaks} \alias{createMassPeaks} \title{ Creates a MassPeaks object. } \description{ This function creates a \code{\linkS4class{MassPeaks}} object. Normally it shouldn't called by the user. Try \code{\link[MALDIquant]{detectPeaks,MassSpectrum-method}} instead. } \usage{ createMassPeaks(mass, intensity, snr=as.double(rep(NA, length(intensity))), metaData=list()) } \arguments{ \item{mass}{ \code{vector}, mass or mass-to-charge ratio. } \item{intensity}{ \code{vector}, intensities for measured mass-to-charge ratios. } \item{snr}{ \code{vector}, signal-to-noise ratios for intensity values. } \item{metaData}{ \code{list}, some metadata to describe the peaks. } } \value{ Returns a \code{\linkS4class{MassPeaks}} object. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{detectPeaks,MassSpectrum-method}}, \code{\linkS4class{MassPeaks}} } \examples{ ## load package library("MALDIquant") ## create a MassPeaks object by default constructor s <- createMassPeaks(mass=1:100, intensity=rnorm(100)^2, metaData=list(name="example peaks")) ## show some details s } \keyword{methods} MALDIquant/man/binPeaks-functions.Rd0000644000175000017500000000552712213060522020267 0ustar sebastiansebastian\name{binPeaks} \alias{binPeaks} \title{ Align Peaks into discrete bins. } \description{ This function looks for similar peaks (mass) across \code{\linkS4class{MassPeaks}} objects and equalizes their mass. } \usage{ binPeaks(l, method=c("strict", "relaxed"), tolerance=0.002) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{method}{ bin creation rule. \code{"strict"} creates bins never containing two or more peaks of the sampe sample. \code{"relaxed"} allows multiple peaks of the same sample in one bin.} \item{tolerance}{ \code{double}, maximal deviation of a peak position (mass) to be considered as identical. } } \details{ The algorithm is based on the following workflow: \enumerate{ \item{Put all mass in a sorted vector.} \item{Calculate differences between each neighbor.} \item{Divide the mass vector at the largest gap (largest difference) and form a left and a right bin.} \item{Rerun step 3 for the left and/or the right bin if they don't fulfill the following criteria: \itemize{ \item{All peaks in a bin are near to the mean (\code{abs(mass-meanMass)/meanMass < tolerance}).} \item{\code{method == "strict"}: The bin doesn't contain two or more peaks of the same sample.} } } } \code{method == "strict"}: The new peak positions (mass value) are the mean mass of a bin. \cr \code{method == "relaxed"}: The new peak positions for the highest peaks of each sample in a bin are generated by the mean mass of this peaks. The lower peaks are not changed. } \value{ Returns a \code{\link{list}} of mass adjusted \code{\linkS4class{MassPeaks}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{intensityMatrix}}, \code{\linkS4class{MassPeaks}} } \examples{ ## load package library("MALDIquant") ## create two MassPeaks objects p <- list(createMassPeaks(mass=seq(100, 500, 100), intensity=1:5), createMassPeaks(mass=c(seq(100.2, 300.2, 100), 395), intensity=1:4)) ## only keep peaks which occur in all MassPeaks objects binnedPeaks <- binPeaks(p, tolerance=0.002) ## compare result iM1 <- intensityMatrix(p) iM2 <- intensityMatrix(binnedPeaks) all(dim(iM1) == c(2, 9)) # TRUE all(dim(iM2) == c(2, 6)) # TRUE show(iM2) ## increase tolerance binnedPeaks <- binPeaks(p, tolerance=0.1) iM3 <- intensityMatrix(binnedPeaks) all(dim(iM3) == c(2, 5)) # TRUE show(iM3) ## differences between "strict" and "relaxed" p <- c(createMassPeaks(mass=c(1, 1.01, 3), intensity=c(2, 1, 1)), createMassPeaks(mass=c(0.99, 3), intensity=rep(1, 2)), createMassPeaks(mass=c(1.02, 3), intensity=rep(1, 2))) intensityMatrix(binPeaks(p, method="strict", tolerance=0.05)) intensityMatrix(binPeaks(p, method="relaxed", tolerance=0.05)) } \keyword{methods} MALDIquant/man/averageMassSpectra-functions.Rd0000644000175000017500000000362112213060522022304 0ustar sebastiansebastian\name{averageMassSpectra} \alias{averageMassSpectra} \title{ Averages \code{\linkS4class{MassSpectrum}} objects. } \description{ This function averages \code{\linkS4class{MassSpectrum}} objects. } \usage{ averageMassSpectra(l, labels, method=c("mean", "median", "sum")) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassSpectrum}} objects. } \item{labels}{ \code{list}, list of \code{\link{factor}}s (one for each \code{\linkS4class{MassSpectrum}} object) to do groupwise averaging. } \item{method}{used aggregation function.} } \details{ The mass of the averaged \code{\linkS4class{MassSpectrum}} object will be the mass of the first non-empty \code{\linkS4class{MassSpectrum}} object (of each group). } \value{ Returns a single (no \code{labels} given) or a \code{\link{list}} (\code{labels} given) of averaged \code{\linkS4class{MassSpectrum}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{mergeMassPeaks}} } \examples{ ## load package library("MALDIquant") ## create four MassSpectrum objects and add them to a list s <- list(createMassSpectrum(mass=1:5, intensity=1:5), createMassSpectrum(mass=1:5, intensity=1:5), createMassSpectrum(mass=1:5, intensity=6:10), createMassSpectrum(mass=1:5, intensity=6:10)) ## average all four MassSpectrum objects into a single new one ## by sum their intensities ## (no labels, returns only one new MassSpectrum object) summedSpectra <- averageMassSpectra(s, method="sum") ## only average MassSpectrum objects in a group ## (e.g. useful for technical replicates) ## (two different labels, returns a list of two new MassPeaks objects) groups <- factor(c("a", "a", "b", "b"), levels=c("a", "b")) averagedSpectra <- averageMassSpectra(s, labels=groups, method="mean") } \keyword{methods} MALDIquant/man/smoothIntensity-methods.Rd0000644000175000017500000000335112211652226021405 0ustar sebastiansebastian\name{smoothIntensity-methods} \docType{methods} \alias{smoothIntensity} \alias{smoothIntensity,MassSpectrum-method} \alias{smoothIntensity,list-method} \title{Smoothes intensities of a MassSpectrum object.} \description{ This method smoothes the intensity values of a \code{\linkS4class{MassSpectrum}} object. } \usage{ \S4method{smoothIntensity}{MassSpectrum}(object, method=c("SavitzkyGolay", "MovingAverage"), halfWindowSize, \dots) } \arguments{ \item{object}{\code{\linkS4class{AbstractMassObject}} object or a \code{list} of \code{\linkS4class{AbstractMassObject}} objects.} \item{method}{used smoothing method; for \code{method="SavitzkyGolay"} see \code{\link[MALDIquant]{.savitzkyGolay}}, for \code{method="MovingAverage"} see \code{\link[MALDIquant]{.movingAverage}}.} \item{halfWindowSize}{half window size. The best size differs depending on the selected \code{method}; see \code{\link[MALDIquant]{.savitzkyGolay}} and \code{\link[MALDIquant]{.movingAverage}} for details.} \item{\dots}{arguments to be passed to \code{\link[MALDIquant]{.savitzkyGolay}} or \code{\link[MALDIquant]{.movingAverage}}.} } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{.savitzkyGolay}}, \code{\link[MALDIquant]{.movingAverage}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## smooth spectra s <- smoothIntensity(fiedler2009subset, method="MovingAverage", halfWindowSize=2) ## or s <- smoothIntensity(fiedler2009subset, method="SavitzkyGolay", halfWindowSize=10) } \keyword{methods} MALDIquant/man/alignSpectra-functions.Rd0000644000175000017500000000503312237162331021146 0ustar sebastiansebastian\name{alignSpectra} \alias{alignSpectra} \title{ Align MassSpectrum objects. } \description{ This function aligns a list of \code{\linkS4class{MassSpectrum}} objects (spectra alignment is also known as \emph{warping/phase correction}). \cr } \usage{ alignSpectra(spectra, halfWindowSize=20, noiseMethod="MAD", SNR=2, reference, tolerance=0.002, warpingMethod="lowess") } \arguments{ \item{spectra}{ \code{list}, list of \code{\linkS4class{MassSpectrum}} objects. } \item{halfWindowSize}{\code{numeric}, half window size; see \code{\link[MALDIquant]{detectPeaks}}. } \item{noiseMethod}{a noise estimation method; see \code{\link[MALDIquant]{detectPeaks}}. } \item{SNR}{single numeric value. \code{SNR} is an abbreviation for \emph{s}ignal-to-\emph{n}oise-\emph{r}atio; see \code{\link[MALDIquant]{detectPeaks}}. } \item{reference}{ \code{\linkS4class{MassPeaks}}, reference object to which the samples (\code{l}) should be aligned. If missing \code{\link[MALDIquant]{referencePeaks}} is used; see \code{\link[MALDIquant]{determineWarpingFunctions}}. } \item{tolerance}{ \code{double}, maximal deviation of a peak position (mass) to be considered as identical; see \code{\link[MALDIquant]{determineWarpingFunctions}}. } \item{warpingMethod}{ used basic warping function; see \code{\link[MALDIquant]{determineWarpingFunctions}}. } } \details{ \code{alignSpectra} is a wrapper function around \code{\link[MALDIquant]{detectPeaks}}, \code{\link[MALDIquant]{determineWarpingFunctions}} and \code{\link[MALDIquant]{warpMassSpectra}}. Please call these functions manually if you need finer control (e.g. plotting of warping functions). } \value{ Returns a \code{list} of aligned \code{\linkS4class{MassSpectrum}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{detectPeaks}}, \code{\link[MALDIquant]{determineWarpingFunctions}}, \code{\link[MALDIquant]{referencePeaks}}, \code{\link[MALDIquant]{warpMassSpectra}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## running typical workflow ## transform intensities spectra <- transformIntensity(fiedler2009subset, method="sqrt") ## smooth spectra spectra <- smoothIntensity(spectra, method="MovingAverage") ## baseline correction spectra <- removeBaseline(spectra) ## align spectra spectra <- alignSpectra(spectra) } \keyword{methods} MALDIquant/man/MALDIquant-package.Rd0000644000175000017500000000304412265250703020016 0ustar sebastiansebastian\name{MALDIquant-package} \alias{MALDIquant-package} \alias{MALDIquant} \docType{package} \title{ Quantitative Analysis of Mass Spectrometry Data } \description{ MALDIquant provides a complete analysis pipeline for MALDI-TOF and other 2-dimensional mass spectrometry data. Distinctive features include baseline subtraction methods such as TopHat or SNIP, peak alignment using warping functions, handling of replicated measurements as well as allowing spectra with different resolutions. For a first overview run \code{demo("MALDIquant")}. } \details{ \tabular{ll}{ Package: \tab MALDIquant\cr Version: \tab 1.9\cr Date: \tab 2014-01-14\cr License: \tab GPL (>= 3)\cr URL: \tab http://strimmerlab.org/software/maldiquant/\cr } Main classes: \itemize{ \item \code{\linkS4class{MassPeaks}}: Represents a peak list of a single spectrum. \item \code{\linkS4class{MassSpectrum}}: Represents a single spectrum. } The accompanying website (see below) provides example R scripts to illustrate the functionality of this package, too. } \author{ Sebastian Gibb Maintainer: Sebastian Gibb \email{mail@sebastiangibb.de} } \references{ S. Gibb and K. Strimmer. 2012. MALDIquant: a versatile R package for the analysis of mass spectrometry data. Bioinformatics 28: 2270-2271. \url{http://bioinformatics.oxfordjournals.org/content/28/17/2270.abstract} See website: \url{http://strimmerlab.org/software/maldiquant/} } \seealso{ \itemize{ \item Run demo files: \code{demo("MALDIquant")}. \item List all available manual pages: \code{library(help="MALDIquant")}. } } MALDIquant/man/referencePeaks-functions.Rd0000644000175000017500000000362112213060522021446 0ustar sebastiansebastian\name{referencePeaks} \alias{referencePeaks} \title{ Creates a reference \code{\linkS4class{MassPeaks}} object. } \description{ This function creates a reference \code{\linkS4class{MassPeaks}} object (also called \emph{Anchor Peaks}) from a list of \code{\linkS4class{MassPeaks}} objects.\cr Generally it is a combination of \code{\link[MALDIquant]{binPeaks}} and \code{\link[MALDIquant]{filterPeaks}} } \usage{ referencePeaks(l, method=c("strict", "relaxed"), minFrequency=0.9, tolerance=0.002) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{method}{ bin creation rule (see \code{\link[MALDIquant]{binPeaks}}). } \item{minFrequency}{ \code{double}, remove all peaks which occur in less than \code{minFrequency*length(l)} \code{\linkS4class{MassPeaks}} objects. } \item{tolerance}{ \code{double}, maximal deviation of a peak position (mass) to be considered as identical. } } \value{ Returns a new \code{\linkS4class{MassPeaks}} objects. \cr The \code{\link[MALDIquant]{intensity}} slot of the returned \code{\linkS4class{MassPeaks}} represents the frequency of this mass position in all samples. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{binPeaks}}, \code{\link[MALDIquant]{filterPeaks}}, \code{\linkS4class{MassPeaks}} } \examples{ ## load package library("MALDIquant") ## create four MassPeaks objects and add them to the list p<- list(createMassPeaks(mass=1:2, intensity=1:2), createMassPeaks(mass=1:3, intensity=1:3), createMassPeaks(mass=1:4, intensity=1:4), createMassPeaks(mass=1:5, intensity=1:5)) ## only use peaks which occur in all MassPeaks objects as reference peaks refPeaks <- referencePeaks(p, minFrequency=1) mass(refPeaks) # 1:2 intensity(refPeaks) # c(1, 1) } \keyword{methods} MALDIquant/man/plot-methods.Rd0000644000175000017500000000413512211651271017143 0ustar sebastiansebastian\name{plot-methods} \docType{methods} \alias{plot,AbstractMassObject,missing-method} \alias{plot,MassSpectrum,missing-method} \title{Plots an AbstractMassObject object.} \description{ This is an overloaded method to allow plotting of an \code{\linkS4class{AbstractMassObject}} object. } \usage{ \S4method{plot}{AbstractMassObject,missing}(x, col="black", xlab="mass", ylab="intensity", type=ifelse(isMassPeaks(x), "h", "l"), xlim=c(ifelse(length(x@mass), min(x@mass, na.rm=TRUE), 0), ifelse(length(x@mass), max(x@mass, na.rm=TRUE), 1)), ylim=c(0, ifelse(length(x@intensity), max(x@intensity, na.rm=TRUE), 1)), main=x@metaData$name, sub=x@metaData$file, cex.sub=0.75, col.sub="#808080", abline.col="#808080", \dots) } \arguments{ \item{x}{\code{\linkS4class{MassSpectrum}} object} \item{col}{line colour, see \code{\link[graphics]{par}}} \item{xlab}{title for the x-axis, see \code{\link[graphics]{title}}} \item{ylab}{title for the y-axis, see \code{\link[graphics]{title}}} \item{type}{type of plot: see \code{\link[graphics]{plot}}} \item{xlim}{the x limits (x1, x2) of the plot, see \code{\link[graphics]{plot.default}}} \item{ylim}{the y limits (y1, y2) of the plot, see \code{\link[graphics]{plot.default}}} \item{main}{title for the plot, see \code{\link[graphics]{title}}} \item{sub}{sub title for the plot, see \code{\link[graphics]{title}}} \item{cex.sub}{sub title font size, see \code{\link[graphics]{par}}} \item{col.sub}{sub title color, see \code{\link[graphics]{par}}} \item{abline.col}{colour for horizontal line at y=0} \item{\dots}{arguments to be passed to \code{\link[graphics]{plot}}} } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{AbstractMassObject}} } \examples{ ## load package library("MALDIquant") ## create a MassSpectrum object by default constructor s <- createMassSpectrum(mass=1:100, intensity=rnorm(100)^2, metaData=list(name="example")) ## show some details s ## plot spectrum plot(s) } \keyword{methods} \keyword{Graphics|hplot} MALDIquant/man/estimateBaselineSnip-functions.Rd0000644000175000017500000000542112211651271022641 0ustar sebastiansebastian\name{.estimateBaselineSnip} \alias{.estimateBaselineSnip} \title{Estimates the baseline by SNIP algorithm.} \description{ This function estimates the baseline of mass spectrometry data.\cr The baseline estimation is based on the Statistics-sensitive Non-linear Iterative Peak-clipping algorithm (SNIP) described in Ryan et al 1988.\cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} should be used instead. } \usage{ .estimateBaselineSnip(x, y, iterations=100, decreasing=TRUE) } \arguments{ \item{x}{vector of x values (only needed to return a two-column matrix)} \item{y}{vector of y values} \item{iterations}{half window size\cr The resulting window reaches from \code{mass[cur_index-iterations]} to \code{mass[cur_index+iterations]}.} \item{decreasing}{use a decreasing (if \code{FALSE} an increasing) clipping window.} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \details{ The algorithm based on the following equation: \deqn{y_i(k) = \min \{ y_i, \frac{(y_{i-k}+y_{i+k})}{2} \}}{y_i(k) = min \{ y_i, (y_{i-k}+y_{i+k})/2 \}} \code{decreasing}: In Morhac 2009 a decreasing clipping window is suggested to get a smoother baseline. For \code{decreasing == TRUE} (\code{decreasing == FALSE}) \emph{k}=\code{iterations} is decreased (increased) by one until zero (\code{iterations}) is reached. } \references{ C.G. Ryan, E. Clayton, W.L. Griffin, S.H. Sie, and D.R. Cousens. 1988. Snip, a statistics-sensitive background treatment for the quantitative analysis of pixe spectra in geoscience applications. Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms, 34(3): 396-402. M. Morhac. 2009. An algorithm for determination of peak regions and baseline elimination in spectroscopic data. Nuclear Instruments and Methods in Physics Research Section A: Accelerators, Spectrometers, Detectors and Associated Equipment, 600(2), 478-487. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## estimate baseline (try different parameters) b1 <- estimateBaseline(s, method="SNIP", iterations=75) b2 <- estimateBaseline(s, method="SNIP", iterations=150) ## draw baselines on the plot lines(b1, col=2) lines(b2, col=3) ## draw legend legend(x="topright", lwd=1, legend=paste0("iterations=", c(75, 150)), col=c(2, 3)) } \keyword{internal} MALDIquant/man/removeBaseline-methods.Rd0000644000175000017500000000335512213060522021123 0ustar sebastiansebastian\name{removeBaseline-methods} \docType{methods} \alias{removeBaseline} \alias{removeBaseline,MassSpectrum-method} \alias{removeBaseline,list-method} \title{Removes the baseline of a MassSpectrum object.} \description{ This method removes the baseline of mass spectrometry data (represented by a \code{\linkS4class{MassSpectrum}} object).\cr The intensity of the mass spectrometry data would be reduced by \code{baseline}. } \usage{ \S4method{removeBaseline}{MassSpectrum}(object, method=c("SNIP", "TopHat", "ConvexHull", "median"), fun, \dots) } \arguments{ \item{object}{\code{\linkS4class{MassSpectrum}} object or a \code{list} of \code{\linkS4class{MassSpectrum}} objects.} \item{method}{a baseline estimation function; see \code{\link[MALDIquant]{.estimateBaselineSnip}}, \code{\link[MALDIquant]{.estimateBaselineTopHat}}, \code{\link[MALDIquant]{.estimateBaselineConvexHull}}, \code{\link[MALDIquant]{.estimateBaselineMedian}}. } \item{fun}{deprecated.} \item{\dots}{arguments to be passed to \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}.} } \value{ Returns a modified \code{\linkS4class{MassSpectrum}} object with reduced intensities. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## subtract baseline b <- removeBaseline(s, method="SNIP") ## draw modified spectrum on the plot lines(b, col="blue") } \keyword{methods} MALDIquant/man/movingAverage-functions.Rd0000644000175000017500000000233512211653115021323 0ustar sebastiansebastian\name{.movingAverage} \alias{.movingAverage} \title{Moving Average Smoothing Filter} \description{This function runs a simple 2-side moving average.\cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}} should be used instead.} \usage{ .movingAverage(y, halfWindowSize=2) } \arguments{ \item{y}{intensity values} \item{halfWindowSize}{half window size. The resulting window reaches from \code{mass[currentIndex-halfWindowSize]} to \code{mass[currentIndex+halfWindowSize]} (window size is \code{2*halfWindowSize+1}).} } \value{ \code{double}, a smoothed intensity vector. } \examples{ ## load package library("MALDIquant") ## 9 point moving average MALDIquant:::.movingAverage(rep(1:5, times=2), halfWindowSize=4) # 2.778 2.778 2.778 2.778 2.778 3.222 3.222 3.222 3.222 3.222 ## load example data data("fiedler2009subset", package="MALDIquant") ## smooth spectra s <- smoothIntensity(fiedler2009subset, method="MovingAverage", halfWindowSize=2) } \seealso{ \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}}, \code{\link[MALDIquant]{.savitzkyGolay}}, \code{\linkS4class{MassSpectrum}} } \keyword{internal} MALDIquant/man/MassPeaks-class.Rd0000644000175000017500000000226312211651271017516 0ustar sebastiansebastian\name{MassPeaks-class} \Rdversion{1.1} \docType{class} \alias{MassPeaks} \alias{MassPeaks-class} \alias{snr} \alias{snr,MassPeaks-method} \title{Class "MassPeaks"} \description{ \code{\linkS4class{MassPeaks}} represents extracted peaks of a single spectrum of a MALDI-TOF mass spectrometry measurement. } \section{Objects from the Class}{ \code{\link[MALDIquant]{createMassPeaks}}: Creates a \code{\linkS4class{MassPeaks}} object. } \section{Extends}{ Class \code{\linkS4class{AbstractMassObject}}, directly. } \section{Slots}{ \describe{ \item{\code{snr}:}{\code{vector}, \emph{s}ignal-to-\emph{n}oise \emph{r}atio} } } \section{Methods}{ \describe{ \item{labelPeaks}{\code{signature(x = "MassPeaks")}: Draws peak labels to plot. See \code{\link{labelPeaks,MassPeaks-method}} for details.} } } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{createMassPeaks}}, \code{\link[MALDIquant]{detectPeaks,MassSpectrum-method}}, \code{\link[MALDIquant]{labelPeaks,MassPeaks-method}}, \code{\linkS4class{AbstractMassObject}} } %\examples{ %## load package %library("MALDIquant") %} \keyword{classes} MALDIquant/man/findEmptyMassObjects-functions.Rd0000644000175000017500000000363512211651271022633 0ustar sebastiansebastian\name{findEmptyMassObjects} \alias{findEmptyMassObjects} \alias{removeEmptyMassObjects} \title{ Finds or removes empty AbstractMassObject objects in a list. } \description{ These functions looks for empty \code{\linkS4class{AbstractMassObject}} objects in a \code{\link{list}}. } \usage{ findEmptyMassObjects(l) removeEmptyMassObjects(l) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{AbstractMassObject}} where empty objects should be found or removed. } } \value{ \code{findEmptyMassObjects}: Returns a \code{\link{vector}} of indices referring to empty \code{\linkS4class{AbstractMassObject}} objects. \code{removeEmptyMassObjects}: Returns a \code{\link{list}} of \code{\linkS4class{AbstractMassObject}} objects but without empty ones. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{isEmpty,AbstractMassObject-method}}, \code{\linkS4class{AbstractMassObject}} } \examples{ ## load package library("MALDIquant") ## create list peakList <- list() ## create two MassPeaks objects and add them to the list peakList[[1]] <- createMassPeaks(mass=1:100, intensity=1:100, metaData=list(name="example 1")) peakList[[2]] <- createMassPeaks(mass=1:100, intensity=1:100, metaData=list(name="example 2")) ## find empty objects (there should not be any one) findEmptyMassObjects(peakList) ## add an empty MassPeaks object to the list peakList[[3]] <- createMassPeaks(mass=double(), intensity=double(), metaData=list(name="empty MassPeaks object")) ## look for empty objects (isEmptyIdx == 3) (isEmptyIdx <- findEmptyMassObjects(peakList)) ## to remove all empty MassObjects from a list length(peakList) # 3 peakList <- removeEmptyMassObjects(peakList) length(peakList) # 2; WARNING: all indices could changed } \keyword{methods} MALDIquant/man/determineWarpingFunctions-functions.Rd0000644000175000017500000001102312213060522023714 0ustar sebastiansebastian\name{determineWarpingFunctions} \alias{determineWarpingFunctions} \title{ Determine warping functions of MassPeaks objects. } \description{ This function determines a warping function for a list of \code{\linkS4class{AbstractMassObject}} objects (warping is also known as \emph{phase correction/spectra alignment}). } \usage{ determineWarpingFunctions(l, reference, tolerance=0.002, method=c("lowess", "linear", "quadratic", "cubic"), plot=FALSE, plotInteractive=FALSE, \dots, warpingFunction ) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{reference}{ \code{\linkS4class{MassPeaks}}, reference object to which the samples (\code{l}) should be aligned. If missing \code{\link[MALDIquant]{referencePeaks}} is used. } \item{tolerance}{ \code{double}, maximal deviation of a peak position (mass) to be considered as identical. } \item{method}{ used basic warping function. } \item{plot}{ \code{logical}, if \code{TRUE} a warping plot is drawn for each sample. } \item{plotInteractive}{ \code{logical}, if \code{FALSE} a non-interactive device (e.g. \code{pdf}) is used for warping plots. } \item{\dots}{ arguments to be passed to \code{warpingFunction} } \item{warpingFunction}{deprecated.} } \details{ \code{warpingFunction}: \code{determineWarpingFunctions} estimates a warping function to overcome the difference between mass in \code{reference} and in the current sample. To calculate the differences each reference peak would match with the highest sample peak in the nearer neighborhood (defined by \code{mass of reference peak*tolerance}). \cr \code{plotInteractive}: If \code{plot} is \code{TRUE} a lot of output is created (each sample in \code{l} gets its own plot). That's why an non-interactive devices is recommended: \preformatted{ ## create a device pdf() ## calculate warping functions w <- determineWarpingFunctions(p, plot=TRUE) ## close device dev.off() } } \value{ Returns a \code{list} of individual warping functions. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{referencePeaks}}, \code{\link[MALDIquant]{warpMassPeaks}}, \code{\link[MALDIquant]{warpMassSpectra}}, \code{\linkS4class{MassPeaks}} } \examples{ ## load package library("MALDIquant") ## create a reference MassPeaks object r <- createMassPeaks(mass=1:5, intensity=1:5) ## create test samples p <- list(createMassPeaks(mass=((1:5)*1.01), intensity=1:5), createMassPeaks(mass=((1:5)*0.99), intensity=1:5)) ## create an interactive device with 2 rows par(mfrow=c(2, 1)) ## calculate warping function ## (using a linear function as basic warping function) ## and show warping plot w <- determineWarpingFunctions(p, tolerance=0.02, method="linear", plot=TRUE, plotInteractive=TRUE) par(mfrow=c(1, 1)) ## w contains the individual warping functions warpedPeaks <- warpMassPeaks(p, w) ## compare results all(mass(r) == mass(warpedPeaks[[1]])) # TRUE all(mass(r) == mass(warpedPeaks[[2]])) # TRUE ## realistic example ## load example data data("fiedler2009subset", package="MALDIquant") ## running typical workflow ## use only four spectra of the subset spectra <- fiedler2009subset[1:4] ## transform intensities spectra <- transformIntensity(spectra, method="sqrt") ## smooth spectra spectra <- smoothIntensity(spectra, method="MovingAverage") ## baseline correction spectra <- removeBaseline(spectra) ## detect peaks peaks <- detectPeaks(spectra) ## create an interactive device with 2 rows par(mfrow=c(4, 1)) ## calculate warping functions (using LOWESS based basic function [default]) w <- determineWarpingFunctions(peaks, plot=TRUE, plotInteractive=TRUE) par(mfrow=c(1, 1)) ## realistic example with user defined reference/calibration peaks ## use the workflow above for fiedler2009subset ## create reference peaks refPeaks <- createMassPeaks(mass=c(1207, 1264, 1351, 1466, 1616, 2769, 2932, 3191, 3262, 4091, 4209, 5904, 7762, 9285), intensity=rep(1, 14)) ## create an interactive device with 2 rows par(mfrow=c(4, 1)) ## calculate warping functions (using a quadratic function as basic function) w <- determineWarpingFunctions(peaks, reference=refPeaks, method="quadratic", plot=TRUE, plotInteractive=TRUE) par(mfrow=c(1, 1)) } \keyword{methods} MALDIquant/man/warp-functions.Rd0000644000175000017500000000301112211651271017473 0ustar sebastiansebastian\name{warpMassSpectra} \alias{warpMassSpectra} \alias{warpMassPeaks} \title{ Run warping functions on AbstractMassObject objects. } \description{ These functions run warping functions on \code{\linkS4class{AbstractMassObject}} objects (warping is also known as \emph{phase correction}). } \usage{ warpMassPeaks(l, w) warpMassSpectra(l, w) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} or \code{\linkS4class{MassSpectrum}} objects. } \item{w}{ a \code{list} of warping functions determined by \code{\link[MALDIquant]{determineWarpingFunctions}}. Has to be of the same length as \code{l}. } } \details{ The warping function \code{w} is called in the following way: \deqn{newMass = oldMass + w(oldMass)} } \value{ Returns a \code{list} of warped \code{\linkS4class{MassPeaks}} or \code{\linkS4class{MassSpectrum}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{determineWarpingFunctions}}, \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## create a MassPeaks object p <- createMassPeaks(mass=1:5, intensity=1:5) ## stupid warping function for demonstration ## (please use determineWarpingFunctions in real life applications) simpleWarp <- function(x) { return(1) } ## run warping function w <- warpMassPeaks(list(p), list(simpleWarp))[[1]] ## compare results all(mass(w) == mass(p)+1) # TRUE } \keyword{methods} MALDIquant/man/isMassObjectList-functions.Rd0000644000175000017500000000245512213060522021752 0ustar sebastiansebastian\name{isMassSpectrumList} \alias{isMassSpectrumList} \alias{isMassPeaksList} \title{ Tests a list of MassSpectrum or MassPeaks objects. } \description{ These functions test a \code{\link{list}} whether containing \code{\linkS4class{MassSpectrum}} or \code{\linkS4class{MassSpectrum}} objects. } \usage{ isMassSpectrumList(x) isMassPeaksList(x) } \arguments{ \item{x}{ object to be tested. } } \value{ Returns \code{\link{TRUE}} or \code{\link{FALSE}} depending on whether its argument is a \code{\link{list}} of \code{\linkS4class{MassSpectrum}} or \code{\linkS4class{MassPeaks}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}}, \code{\linkS4class{AbstractMassObject}} } \examples{ ## load package library("MALDIquant") ## create list p <- list() ## test list isMassPeaksList(p) # returns FALSE ## create two MassPeaks objects and add them to the list p <- createMassPeaks(mass=1:100, intensity=1:100, metaData=list(name="example 1")) p <- createMassPeaks(mass=1:100, intensity=1:100, metaData=list(name="example 2")) ## test list isMassPeaksList(p) # returns TRUE isMassSpectrumList(p) # returns FALSE } \keyword{methods} MALDIquant/man/mergeMassPeaks-functions.Rd0000644000175000017500000000370612213060522021437 0ustar sebastiansebastian\name{mergeMassPeaks} \alias{mergeMassPeaks} \title{ Merges \code{\linkS4class{MassPeaks}} objects. } \description{ This function merges \code{\linkS4class{MassPeaks}} objects. } \usage{ mergeMassPeaks(l, labels, method=c("mean", "median", "sum"), ignore.na=TRUE, fun, \dots) } \arguments{ \item{l}{ \code{list}, list of \code{\linkS4class{MassPeaks}} objects. } \item{labels}{ \code{list}, list of \code{\link{factor}}s (one for each \code{\linkS4class{MassPeaks}} object) to do groupwise merging. } \item{method}{used merge method.} \item{ignore.na}{Should \code{NA} (positions where a peak is missing) ignored (\code{ignore.na=TRUE}) or treated as zero (\code{ignore.na=FALSE})?} \item{fun}{deprecated.} \item{\dots}{deprecated.} } \value{ Returns a single (no \code{labels} given) or a \code{\link{list}} (\code{labels} given) of merged \code{\linkS4class{MassPeaks}} objects. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassPeaks}}, \code{\link[MALDIquant]{averageMassSpectra}} } \examples{ ## load package library("MALDIquant") ## create four MassPeaks objects and add them to the list p <- list(createMassPeaks(mass=1:2, intensity=1:2), createMassPeaks(mass=1:3, intensity=1:3), createMassPeaks(mass=1:4, intensity=1:4), createMassPeaks(mass=1:5, intensity=1:5)) ## merge all four MassPeaks objects into a single new one ## by sum their intensities ## (no labels, returns only one new MassPeaks object) mergedPeaks <- mergeMassPeaks(p, method="sum") ## only merge MassPeaks objects in a group ## (two different labels, returns a list of two new MassPeaks objects) groups <- factor(c("a", "a", "b", "b"), levels=c("a", "b")) mergedPeaks <- mergeMassPeaks(p, labels=groups, method="mean") ## the same, but treat NA as zero mergedPeaks <- mergeMassPeaks(p, labels=groups, method="mean", ignore.na=FALSE) } \keyword{methods} MALDIquant/man/AbstractMassObject-class.Rd0000644000175000017500000001144412237162331021350 0ustar sebastiansebastian\name{AbstractMassObject-class} \Rdversion{1.1} \docType{class} \alias{AbstractMassObject-class} \alias{[,AbstractMassObject,logical,missing-method} \alias{[,AbstractMassObject,numeric,missing-method} \alias{[,MassPeaks,logical,missing-method} \alias{[,MassPeaks,numeric,missing-method} \alias{as.matrix,AbstractMassObject-method} \alias{intensity} \alias{intensity<-} \alias{intensity,AbstractMassObject-method} \alias{intensity<-,AbstractMassObject,numeric-method} \alias{isEmpty} \alias{isEmpty,AbstractMassObject-method} \alias{length,AbstractMassObject-method} \alias{lines,AbstractMassObject-method} \alias{mass} \alias{mass<-} \alias{mass,AbstractMassObject-method} \alias{mass<-,AbstractMassObject,numeric-method} \alias{metaData} \alias{metaData<-} \alias{metaData,AbstractMassObject-method} \alias{metaData<-,AbstractMassObject-method} \alias{points,AbstractMassObject-method} \title{Class "AbstractMassObject"} \description{ \code{\linkS4class{AbstractMassObject}} is an abstract (means pure virtual) class. It is the parent class of \code{\linkS4class{MassSpectrum}} and \code{\linkS4class{MassPeaks}}. It shouldn't create or handle by the user because it is for internal use only. } \section{Derived classes}{ \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}} } \section{Slots}{ \describe{ \item{\code{mass}:}{\code{numeric}, mass or mass-to-charge ratio} \item{\code{intensity}:}{\code{numeric}, intensities for measured mass-to-charge ratios} \item{\code{metaData}:}{\code{list}, some metadata to describe the spectrum} } } \section{Methods}{ \describe{ \item{[}{\code{signature(x = "AbstractMassObject", i = "numeric")}: Extracts a range of an \code{\linkS4class{AbstractMassObject}} object and returns a new one.} \item{as.matrix}{\code{signature(x = "AbstractMassObject")}: Converts an \code{\linkS4class{AbstractMassObject}} object to a matrix with 2 columns (\code{mass}, \code{intensity}).} \item{intensity}{\code{signature(object = "AbstractMassObject")}: Accessor function for slot \code{intensity}.} \item{intensity<-}{\code{signature(object = "AbstractMassObject", value = "numeric")} Replacement function for slot \code{intensity}.} \item{isEmpty}{\code{signature(object = "AbstractMassObject")}: Returns \code{TRUE} if length of \code{intensity} is 0 or all \code{intensity} values are 0.} \item{length}{\code{signature(x = "AbstractMassObject")}: Returns length of slot \code{intensity}.} \item{lines}{\code{signature(x = "AbstractMassObject")}: Extented function for adding \code{AbstractMassObject} object as a line to a specific plot. See \code{\link{lines}} for details.} \item{mass}{\code{signature(object = "AbstractMassObject")}: Accessor function for slot \code{mass}.} \item{mass<-}{\code{signature(object = "AbstractMassObject", value = "numeric")} Replacement function for slot \code{mass}.} \item{metaData}{\code{signature(object = "AbstractMassObject")}: Accessor function for slot \code{metaData}.} \item{metaData<-}{\code{signature(object = "AbstractMassObject")}: Replacement function for slot \code{metaData}.} \item{plot}{\code{signature(x = "AbstractMassObject", y = "missing")}: Extented function for plotting an \code{AbstractMassObject} object. See \code{\link{plot,AbstractMassObject,missing-method}} for details.} \item{points}{\code{signature(x = "AbstractMassObject")}: Extented function for adding \code{\linkS4class{AbstractMassObject}} object as points to a specific plot. See \code{\link{points}} for details.} \item{trim}{\code{signature(object = "AbstractMassObject", range = "numeric")}: Trim an \code{AbstractMassObject} object. See \code{\link[MALDIquant]{trim,AbstractMassObject,numeric-method}} for details.} \item{transformIntensity}{\code{signature(object = "AbstractMassObject")}: Transforms the intensities of an \code{AbstractMassObject} object. See \code{\link[MALDIquant]{transformIntensity,AbstractMassObject-method}} for details.} } } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{plot,AbstractMassObject,missing-method}}, \code{\link[MALDIquant]{transformIntensity,AbstractMassObject-method}}, \code{\link[MALDIquant]{trim,AbstractMassObject,numeric-method}} } \examples{ ## load package library("MALDIquant") ## create example spectrum s <- createMassSpectrum(mass=1:10, intensity=11:20, metaData=list(name="Example Spectrum")) ## get intensity intensity(s) ## get mass mass(s) ## get metaData metaData(s) ## replace metaData metaData(s) <- list(name="Spectrum") ## trim spectrum trim(s, c(2, 9)) ## select a range s[3:6] } \keyword{classes} MALDIquant/man/estimateBaselineTopHat-functions.Rd0000644000175000017500000000366612211651271023140 0ustar sebastiansebastian\name{.estimateBaselineTopHat} \alias{.estimateBaselineTopHat} \title{Estimates the baseline by TopHat filter.} \description{ This function estimates the baseline of mass spectrometry data.\cr The baseline estimation is based on the TopHat filter. \cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} should be used instead. } \usage{ .estimateBaselineTopHat(x, y, halfWindowSize=100) } \arguments{ \item{x}{vector of x values (only needed to return a two-column matrix)} \item{y}{vector of y values} \item{halfWindowSize}{half size of the moving window for the TopHat filter. (The resulting window reaches from \code{mass[cur_index-halfWindowSize]} to \code{mass[cur_index+halfWindowSize]}.} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \references{ M. van Herk. 1992. A Fast Algorithm for Local Minimum and Maximum Filters on Rectangular and Octagonal Kernels. Pattern Recognition Letters 13.7: 517-521. J. Y. Gil and M. Werman. 1996. Computing 2-Dimensional Min, Median and Max Filters. IEEE Transactions: 504-507. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## estimate baseline (try different parameters) b1 <- estimateBaseline(s, method="TopHat", halfWindowSize=75) b2 <- estimateBaseline(s, method="TopHat", halfWindowSize=150) ## draw baselines on the plot lines(b1, col=2) lines(b2, col=3) ## draw legend legend(x="topright", lwd=1, legend=paste0("halfWindowSize=", c(75, 150)), col=c(2, 3)) } \keyword{internal} MALDIquant/man/createMassSpectrum-functions.Rd0000644000175000017500000000171712211651271022347 0ustar sebastiansebastian\name{createMassSpectrum} \alias{createMassSpectrum} \title{ Creates a MassSpectrum object. } \description{ This function creates a \code{\linkS4class{MassSpectrum}} object. } \usage{ createMassSpectrum(mass, intensity, metaData=list()) } \arguments{ \item{mass}{ \code{vector}, mass or mass-to-charge ratio } \item{intensity}{ \code{vector}, intensities for measured mass-to-charge ratios } \item{metaData}{ \code{list}, some metadata to describe the spectrum } } \value{ Returns a \code{\linkS4class{MassSpectrum}} object. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## create a MassSpectrum object by default constructor s <- createMassSpectrum(mass=1:100, intensity=rnorm(100)^2, metaData=list(name="example spectrum")) ## show some details s } \keyword{methods} MALDIquant/man/estimateBaseline-methods.Rd0000644000175000017500000000315512213060522021437 0ustar sebastiansebastian\name{estimateBaseline-methods} \docType{methods} \alias{estimateBaseline} \alias{estimateBaseline,MassSpectrum-method} \title{Estimates the baseline of a MassSpectrum object.} \description{ This method estimates the baseline of mass spectrometry data (represented by a \code{\linkS4class{MassSpectrum}} object).\cr } \usage{ \S4method{estimateBaseline}{MassSpectrum}(object, method=c("SNIP", "TopHat", "ConvexHull", "median"), \dots) } \arguments{ \item{object}{\code{\linkS4class{MassSpectrum}} object} \item{method}{a baseline estimation function; see \code{\link[MALDIquant]{.estimateBaselineSnip}}, \code{\link[MALDIquant]{.estimateBaselineTopHat}}, \code{\link[MALDIquant]{.estimateBaselineConvexHull}}, \code{\link[MALDIquant]{.estimateBaselineMedian}}. } \item{\dots}{arguments to be passed to \code{method}} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{.estimateBaselineSnip}}, \code{\link[MALDIquant]{.estimateBaselineTopHat}}, \code{\link[MALDIquant]{.estimateBaselineConvexHull}}, \code{\link[MALDIquant]{.estimateBaselineMedian}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## estimate baseline b <- estimateBaseline(s, method="SNIP") ## draw baseline on the plot lines(b, col="red") } \keyword{methods} MALDIquant/man/detectPeaks-methods.Rd0000644000175000017500000000446712213060522020424 0ustar sebastiansebastian\name{detectPeaks-methods} \docType{methods} \alias{detectPeaks} \alias{detectPeaks,MassSpectrum-method} \alias{detectPeaks,list-method} \title{Detects peaks in a MassSpectrum object.} \description{ This method looks for peaks in mass spectrometry data (represented by a \code{\linkS4class{MassSpectrum}} object).\cr A peak is a local maximum above a user defined noise threshold. } \usage{ \S4method{detectPeaks}{MassSpectrum}(object, halfWindowSize=20, method=c("MAD", "SuperSmoother"), SNR=2, fun, \dots) } \arguments{ \item{object}{\code{\linkS4class{MassSpectrum}} object or a \code{list} of \code{\linkS4class{MassSpectrum}} objects.} \item{halfWindowSize}{\code{numeric}, half window size. \cr The resulting window reaches from \code{mass[currentIndex-halfWindowSize]} to \code{mass[currentIndex+halfWindowSize]}. A local maximum have to be the highest one in the given window to be recognized as peak.} \item{method}{a noise estimation function; see \code{\link[MALDIquant]{.estimateNoiseMad}}, \code{\link[MALDIquant]{.estimateNoiseSuperSmoother}}. } \item{SNR}{single numeric value. \code{SNR} is an abbreviation for \emph{s}ignal-to-\emph{n}oise-\emph{r}atio. A local maximum has to be higher than \code{SNR*noise} to be recognize as peak.} \item{fun}{deprecated.} \item{\dots}{arguments to be passed to \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}}.} } \value{ Returns a \code{\linkS4class{MassPeaks}} object. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## transform intensities s <- transformIntensity(s, method="sqrt") ## smoothing spectrum s <- smoothIntensity(s, method="MovingAverage") ## remove baseline s <- removeBaseline(s) ## plot spectrum plot(s) ## call peak detection p <- detectPeaks(s) ## draw peaks on the plot points(p) ## label 10 highest peaks top10 <- intensity(p) \%in\% sort(intensity(p), decreasing=TRUE)[1:10] labelPeaks(p, index=top10) } \keyword{methods} MALDIquant/man/estimateBaselineConvexHull-functions.Rd0000644000175000017500000000231512211651271024016 0ustar sebastiansebastian\name{.estimateBaselineConvexHull} \alias{.estimateBaselineConvexHull} \title{Estimates the baseline by a Convex Hull.} \description{ This function estimates the baseline of mass spectrometry data.\cr The baseline estimation is based on creating a Convex Hull below the spectrum.\cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} should be used instead. } \usage{ .estimateBaselineConvexHull(x, y) } \arguments{ \item{x}{vector of x values} \item{y}{vector of y values} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## estimate baseline b <- estimateBaseline(s, method="ConvexHull") ## draw baseline on the plot lines(b, col="red") } \keyword{internal} MALDIquant/man/trim-methods.Rd0000644000175000017500000000311112211652226017132 0ustar sebastiansebastian\name{trim-methods} \docType{methods} \alias{trim} \alias{trim,AbstractMassObject,numeric-method} \alias{trim,list,numeric-method} \alias{trim,list,missing-method} \title{Trim an AbstractMassObject object.} \description{ These method trims an \code{\linkS4class{AbstractMassObject}} object. This is useful if some mass ranges should be excluded from further analysis. } \usage{ \S4method{trim}{AbstractMassObject,numeric}(object, range) \S4method{trim}{list,numeric}(object, range) \S4method{trim}{list,missing}(object) } \arguments{ \item{object}{\code{\linkS4class{AbstractMassObject}} object or a \code{list} of \code{\linkS4class{AbstractMassObject}} objects.} \item{range}{\code{numeric}, limits of trimming (left/minimal mass, right/maximal mass). If missing it is automatically determined (largest overlapping mass range) for a \code{list} of \code{\linkS4class{AbstractMassObject}}.} } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{AbstractMassObject}}, \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## select only one spectrum s <- fiedler2009subset[[1]] ## remove all mass lower 3000 trim(s, range=c(3000, Inf)) ## remove all mass higher 8000 trim(s, range=c(0, 8000)) ## remove all mass lower 3000 and higher 8000 trim(s, range=c(3000, 8000)) ## choose largest overlapping mass range for all spectra trim(fiedler2009subset) } \keyword{methods} MALDIquant/man/calibrateIntensity-methods.Rd0000644000175000017500000000502012213060522022007 0ustar sebastiansebastian\name{calibrateIntensity-methods} \docType{methods} \alias{calibrateIntensity} \alias{calibrateIntensity,MassSpectrum-method} \alias{calibrateIntensity,list-method} \title{Calibrates intensities of a MassSpectrum object.} \description{ This function calibrates (normalize) intensities of \code{\linkS4class{MassSpectrum}} objects. } \usage{ \S4method{calibrateIntensity}{MassSpectrum}(object, method=c("TIC", "PQN", "median"), \dots) } \arguments{ \item{object}{\code{\linkS4class{MassSpectrum}} object or a \code{list} of \code{\linkS4class{MassSpectrum}} objects.} \item{method}{the calibration method to be used. This should be one of \code{"TIC"}, \code{"PQN"} or \code{"median"}. See \sQuote{Details} section.} \item{\dots}{arguments to be passed to other functions (unneeded until now).} } \details{ A number of different calibration methods are provided: \describe{ \item{\code{"TIC"}:}{The TIC (\emph{T}otal \emph{I}on \emph{C}urrent) of a \code{\linkS4class{MassSpectrum}} object is set to one.} \item{\code{"PQN"}:}{The PQN (\emph{P}robabilistic \emph{Q}uotient \emph{N}ormalization) is described in \emph{Dieterle et al 2006}. \code{calibrateIntensity} uses the following algorithm: \enumerate{ \item{Calibrate all spectra using the \code{"TIC"} calibration.} \item{Calculate a median reference spectrum.} \item{Calculate the quotients of all intensities of the spectra with those of the reference spectrum.} \item{Calculate the median of these quotients for each spectrum.} \item{Divide all intensities of each spectrum by its median of quotients.} } } \item{\code{"Median"}:}{The median of intensities of a \code{\linkS4class{MassSpectrum}} object is set to one.} } } \value{ Returns a modified \code{\linkS4class{MassSpectrum}} object with calibrated intensities. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} F. Dieterle, A. Ross, G. Schlotterbeck, and Hans Senn. 2006. Probabilistic quotient normalization as robust method to account for dilution of complex biological mixtures. Application in 1H NMR metabonomics. Analytical Chemistry 78(13): 4281-4290. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## baseline correction b <- removeBaseline(fiedler2009subset) ## calibrate intensity values calibrateIntensity(b, method="TIC") } \keyword{methods} MALDIquant/man/MassSpectrum-class.Rd0000644000175000017500000000705512211652226020262 0ustar sebastiansebastian\name{MassSpectrum-class} \Rdversion{1.1} \docType{class} \alias{MassSpectrum} \alias{MassSpectrum-class} \alias{isRegular} \alias{isRegular,MassSpectrum-method} \alias{totalIonCurrent} \alias{totalIonCurrent,MassSpectrum-method} \title{Class "MassSpectrum"} \description{ \code{\linkS4class{MassSpectrum}} represents a single spectrum of a MALDI-TOF mass spectrometry measurement. It provides an easy framework for doing some preprocessing steps like peak detection, baseline correction and much more. \cr } \section{Objects from the Class}{ \code{\link[MALDIquant]{createMassSpectrum}}: Creates a \code{\linkS4class{MassSpectrum}} object. } \section{Extends}{ Class \code{\linkS4class{AbstractMassObject}}, directly. } \section{Methods}{ \describe{ \item{calibrateIntensity}{\code{signature(x = "MassSpectrum")}: Calibrates the intensity of a \code{\linkS4class{MassSpectrum}} object. See \code{\link[MALDIquant]{calibrateIntensity,MassSpectrum-method}} for details.} \item{detectPeaks}{\code{signature(x = "MassSpectrum")}: Look for local maxima and estimate noise to extract peaks out of a \code{\linkS4class{MassSpectrum}} object. See \code{\link[MALDIquant]{detectPeaks,MassSpectrum-method}} for details.} \item{estimateBaseline}{\code{signature(x = "MassSpectrum")}: Estimates the baseline of a \code{\linkS4class{MassSpectrum}} object. See \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} for details.} \item{estimateNoise}{\code{signature(x = "MassSpectrum")}: Estimates the noise of a \code{\linkS4class{MassSpectrum}} object. See \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}} for details.} \item{isRegular}{\code{signature(object = "MassSpectrum")}: Returns \code{FALSE} if the frequency of mass values with irregular intervals is greater than \code{threshold} (because \code{object} was measured in \emph{centroid} mode or some \code{intensity} values were filtered).} \item{removeBaseline}{\code{signature(x = "MassSpectrum")}: Estimates and removes the baseline of a \code{\linkS4class{MassSpectrum}} object. See \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} for details.} \item{smoothIntensity}{\code{signature(object = "MassSpectrum")}: Smoothes the intensities of an \code{MassSpectrum} object. See \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}} for details.} \item{totalIonCurrent}{\code{signature(object = "MassSpectrum")}: Accessor function for Total Ion Current (TIC, area under the curve).} } } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\link[MALDIquant]{createMassSpectrum}}, \code{\link[MALDIquant]{calibrateIntensity,MassSpectrum-method}}, \code{\link[MALDIquant]{detectPeaks,MassSpectrum-method}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{estimateNoise,MassSpectrum-method}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}}, \code{\linkS4class{AbstractMassObject}} } \examples{ ## load package library("MALDIquant") ## create a MassSpectrum object by default constructor s <- createMassSpectrum(mass=1:100, intensity=rnorm(100)^2, metaData=list(name="example")) ## show some details s ## plot spectrum plot(s) ## get TIC totalIonCurrent(s) ## modify intensity and metaData intensity(s)[1:50] <- 0 metaData(s) <- list(name="modified example") ## plot again plot(s) } \keyword{classes} MALDIquant/man/estimateBaselineMedian-functions.Rd0000644000175000017500000000267712213060522023132 0ustar sebastiansebastian\name{.estimateBaselineMedian} \alias{.estimateBaselineMedian} \title{Estimates the baseline by moving estimators.} \description{ This function estimates the baseline of mass spectrometry data.\cr The baseline estimation is based on median which is used in a moving window.\cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}} should be used instead. } \usage{ .estimateBaselineMedian(x, y, halfWindowSize=100) } \arguments{ \item{x}{vector of x values} \item{y}{vector of y values} \item{halfWindowSize}{half size of the moving window for the median (based on \code{\link{runmed}})\cr The resulting window reaches from \code{mass[cur_index-halfWindowSize]} to \code{mass[cur_index+halfWindowSize]}.} } \value{ Returns a two column matrix (first column: mass, second column: intensity) of the estimated baseline. } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassSpectrum}}, \code{\link[MALDIquant]{estimateBaseline,MassSpectrum-method}}, \code{\link[MALDIquant]{removeBaseline,MassSpectrum-method}} } \examples{ ## load package library("MALDIquant") ## load example data data("fiedler2009subset", package="MALDIquant") ## choose only the first mass spectrum s <- fiedler2009subset[[1]] ## plot spectrum plot(s) ## estimate baseline b <- estimateBaseline(s, method="median") ## draw baseline on the plot lines(b, col="red") } \keyword{internal} MALDIquant/man/savitzkyGolay-functions.Rd0000644000175000017500000000336212211653115021412 0ustar sebastiansebastian\name{.savitzkyGolay} \alias{.savitzkyGolay} \title{Savitzky-Golay Smoothing Filter} \description{This function applies a Savitzky-Golay filter.\cr It is hidden by \code{NAMESPACE} because it is a private function and \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}} should be used instead.} \usage{ .savitzkyGolay(y, halfWindowSize=10, polynomialOrder=3) } \arguments{ \item{y}{intensity values} \item{halfWindowSize}{half window size. The resulting window reaches from \code{mass[currentIndex-halfWindowSize]} to \code{mass[currentIndex+halfWindowSize]} (window size is \code{2*halfWindowSize+1}).} \item{polynomialOrder}{polynomial order of Savitzky-Golay Filter.} } \details{ \code{halfWindowSize}: Should be lower than \emph{FWHM} of peaks (full width at half maximum; please find details in Bromba and Ziegler 1981). } \value{ \code{double}, a smoothed intensity vector. } \references{ A. Savitzky and M. J. Golay. 1964. Smoothing and differentiation of data by simplified least squares procedures. Analytical chemistry, 36(8), 1627-1639. M. U. Bromba and H. Ziegler. 1981. Application hints for Savitzky-Golay digital smoothing filters. Analytical Chemistry, 53(11), 1583-1586. } \examples{ ## load package library("MALDIquant") ## 5 point savitzky-golay filter MALDIquant:::.savitzkyGolay(rep(1:5, times=2), halfWindowSize=2) # 1 2 3 4.43 3.71 2.29 1.57 3 4 5 ## load example data data("fiedler2009subset", package="MALDIquant") ## smooth spectra s <- smoothIntensity(fiedler2009subset, method="SavitzkyGolay", halfWindowSize=12) } \seealso{ \code{\link[MALDIquant]{smoothIntensity,MassSpectrum-method}}, \code{\link[MALDIquant]{.movingAverage}}, \code{\linkS4class{MassSpectrum}} } \keyword{internal} MALDIquant/man/isMassObject-functions.Rd0000644000175000017500000000206412213060522021112 0ustar sebastiansebastian\name{isMassSpectrum} \alias{isMassSpectrum} \alias{isMassPeaks} \title{ Tests for MassSpectrum or MassPeaks object. } \description{ These functions test for a \code{\linkS4class{MassSpectrum}} or \code{\linkS4class{MassPeaks}} object. } \usage{ isMassSpectrum(x) isMassPeaks(x) } \arguments{ \item{x}{ object to be tested. } } \value{ Returns \code{\link{TRUE}} or \code{\link{FALSE}} depending on whether its argument is an \code{\linkS4class{MassSpectrum}} or \code{\linkS4class{MassPeaks}} object. } \references{ See website: \url{http://strimmerlab.org/software/maldiquant/} } \author{ Sebastian Gibb } \seealso{ \code{\linkS4class{MassPeaks}}, \code{\linkS4class{MassSpectrum}}, \code{\linkS4class{AbstractMassObject}} } \examples{ ## load package library("MALDIquant") ## create a MassPeaks object peaks <- createMassPeaks(mass=1:100, intensity=1:100, metaData=list(name="example 1")) ## test isMassPeaks(peaks) # returns TRUE isMassSpectrum(peaks) # returns FALSE isMassPeaks(double()) # returns FALSE } \keyword{methods} MALDIquant/demo/0000755000175000017500000000000012263537432014414 5ustar sebastiansebastianMALDIquant/demo/peaks.R0000644000175000017500000000367312237162331015644 0ustar sebastiansebastian## This is a MALDIquant example file. It is released into public domain with the ## right to use it for any purpose but without any warranty. ## peaks demo ## load necessary packages library("MALDIquant") ## load example spectra data("fiedler2009subset", package="MALDIquant") ## choose only spectrum 1 s1 <- fiedler2009subset[[1]] ## preprocessing ## sqrt transform (for variance stabilization) s2 <- transformIntensity(s1, method="sqrt") ## 21 point Savitzky-Golay-Filter for smoothing spectra ## (maybe you have to adjust the halfWindowSize; ## you could use a simple moving average instead) ## see ?smoothIntensity, ?.savitzkyGolay, ?.movingAverage s3 <- smoothIntensity(s2, method="SavitzkyGolay", halfWindowSize=10) ## remove baseline ## (maybe you have to adjust iterations to your spectra; high resolution ## spectra need a much lower iteration number (halfWindowSize, for some other ## baseline estimation algorithms) ## see ?removeBaseline, ?estimateBaseline s4 <- removeBaseline(s3, method="SNIP", iterations=100) ## run peak detection ## (maybe you need to adjust halfWindowSize [decreasing it for high resolution ## spectra] and SNR [a higher value increase the True-Positive-Rate but decrease ## sensitivity]) ## see ?detectPeaks, ?estimateNoise p <- detectPeaks(s4, method="MAD", halfWindowSize=20, SNR=2) ## produce some plots par(mfrow=c(2,3)) xlim <- range(mass(s1)) # use same xlim on all plots for better comparison plot(s1, main="1: raw", sub="", xlim=xlim) plot(s2, main="2: variance stabilization", sub="", xlim=xlim) plot(s3, main="3: smoothing", sub="", xlim=xlim) plot(s4, main="4: baseline correction", sub="", xlim=xlim) plot(s4, main="5: peak detection", sub="", xlim=xlim) points(p) ## label top 20 peaks top20 <- intensity(p) %in% sort(intensity(p), decreasing=TRUE)[1:20] labelPeaks(p, index=top20, underline=TRUE) plot(p, main="6: peak plot", sub="", xlim=xlim) labelPeaks(p, index=top20, underline=TRUE) par(mfrow=c(1,1)) MALDIquant/demo/warping.R0000644000175000017500000000377712263537432016224 0ustar sebastiansebastian## This is a MALDIquant example file. It is released into public domain with the ## right to use it for any purpose but without any warranty. ## warping demo ## load necessary packages library("MALDIquant") ## load example spectra data("fiedler2009subset", package="MALDIquant") ## use only 4 spectra spectra <- fiedler2009subset[seq(1, 16, by=4)] ## some preprocessing ## sqrt transform (for variance stabilization) spectra <- transformIntensity(spectra, method="sqrt") ## 21 point Savitzky-Golay-Filter for smoothing spectra spectra <- smoothIntensity(spectra, method="SavitzkyGolay", halfWindowSize=10) ## remove baseline spectra <- removeBaseline(spectra, method="SNIP", iterations=100) ## calibrate intensity values by "Total Ion Current" spectra <- calibrateIntensity(spectra, method="TIC") ## run peak detection peaks <- detectPeaks(spectra, method="MAD", halfWindowSize=20, SNR=2) ## warping par(mfrow=c(2, 2)) warpingFunctions <- determineWarpingFunctions(peaks, tolerance=0.001, plot=TRUE, plotInteractive=TRUE) ## warp spectra warpedSpectra <- warpMassSpectra(spectra, warpingFunctions) ## warp peaks warpedPeaks <- warpMassPeaks(peaks, warpingFunctions) ## compare some regions in a plot par(mfrow=c(2, 2)) ## helper function to avoid double coding plotSpectra <- function(unwarped, warped, range) { plot(unwarped[[1]], main=paste0("unwarped spectra (mass ", paste0(range, collapse=":"), " Da)"), xlim=range, ylim=c(0, 2e-3), type="n") color <- rainbow(length(unwarped)) for (i in seq(along=unwarped)) { lines(unwarped[[i]], col=color[i]) } plot(unwarped[[1]], main=paste0("warped spectra (mass ", paste0(range, collapse=":"), " Da)"), xlim=range, ylim=c(0, 2e-3), type="n") for (i in seq(along=warped)) { lines(warped[[i]], col=color[i]) } } plotSpectra(spectra, warpedSpectra, c(4180, 4240)) plotSpectra(spectra, warpedSpectra, c(9200, 9400)) par(mfrow=c(1, 1)) MALDIquant/demo/00Index0000644000175000017500000000037012104230456015534 0ustar sebastiansebastianMALDIquant MALDIquant Demonstration baseline Demonstrate different baseline estimation methods. peaks Demonstrate peak detection. warping Demonstrate influence of warping. workflow Complete example workflow (no graphical output). MALDIquant/demo/MALDIquant.R0000644000175000017500000000062312160131333016421 0ustar sebastiansebastian## This is a MALDIquant example file. It is released into public domain with the ## right to use it for any purpose but without any warranty. ## all MALDIquant demos library("MALDIquant") demo("baseline", package="MALDIquant") demo("peaks", package="MALDIquant") demo("warping", package="MALDIquant") message("demo(\"workflow\") produces no graphical output") demo("workflow", package="MALDIquant") MALDIquant/demo/baseline.R0000644000175000017500000000151512213060522016305 0ustar sebastiansebastian## This is a MALDIquant example file. It is released into public domain with the ## right to use it for any purpose but without any warranty. ## baseline demo ## load necessary packages library("MALDIquant") ## load example spectra data("fiedler2009subset", package="MALDIquant") ## choose only spectrum 1 s <- fiedler2009subset[[1]] ## test different baseline estimation methods bSnip <- estimateBaseline(s, method="SNIP") plot(s, main="SNIP Baseline [default]") lines(bSnip, lwd=2, col=2) bTopHat <- estimateBaseline(s, method="TopHat") plot(s, main="TopHat Baseline") lines(bTopHat, lwd=2, col=2) bConvexHull <- estimateBaseline(s, method="ConvexHull") plot(s, main="ConvexHull Baseline") lines(bConvexHull, lwd=2, col=2) bMedian <- estimateBaseline(s, method="median") plot(s, main="Median Baseline") lines(bMedian, lwd=2, col=2) MALDIquant/demo/workflow.R0000644000175000017500000000730012263537432016411 0ustar sebastiansebastian## This is a MALDIquant example file. It is released into public domain with the ## right to use it for any purpose but without any warranty. ## workflow demo ## load necessary packages library("MALDIquant") ## load example spectra data("fiedler2009subset", package="MALDIquant") ## check raw data ## any empty spectra? (empty spectra are ignored in subsequent baseline ## correction/peak detection; you could find/remove them by calling ## findEmptyMassObjects/removeEmptyMassObjects) ## see ?isEmpty, ?findEmptyMassObjects, ?removeEmptyMassObjects any(sapply(fiedler2009subset, isEmpty)) # FALSE ## any spectra with irregular mass values/intervals? (spectra with ## missing/filtered mass values/irregular mass intervals may compromise ## subsequent baseline correction and peak detection.) any(!sapply(fiedler2009subset, isRegular)) # FALSE ## do length of spectra differ? (if they differ you have to adjust the ## corresponding halfWindowSize in subsequent baseline correction and peak ## detection.) any(length(fiedler2009subset[[1]]) != sapply(fiedler2009subset, length)) # FALSE ## preprocessing ## sqrt transform (for variance stabilization) spectra <- transformIntensity(fiedler2009subset, method="sqrt") ## 21 point Savitzky-Golay-Filter for smoothing spectra ## (maybe you have to adjust the halfWindowSize; ## you could use a simple moving average instead) ## see ?smoothIntensity, ?.savitzkyGolay, ?.movingAverage spectra <- smoothIntensity(spectra, method="SavitzkyGolay", halfWindowSize=10) ## remove baseline ## (maybe you have to adjust iterations to your spectra; high resolution ## spectra need a much lower iteration number (halfWindowSize, for some other ## baseline estimation algorithms) ## see ?removeBaseline, ?estimateBaseline spectra <- removeBaseline(spectra, method="SNIP", iterations=100) ## calibrate (normalize) intensities (different calibration methods available) ## see ?calibrateIntensity spectra <- calibrateIntensity(spectra, method="TIC") ## spectra alignment ## (the spectra alignment is peak based, maybe you need to adjust ## halfWindowSize, SNR, tolerance, warpingMethod) ## see ?alignSpectra spectra <- alignSpectra(spectra, halfWindowSize=20, SNR=2, tolerance=0.002, warpingMethod="lowess") ## average technical replicates ## 1. create factors for correct assignment ## (e.g. sample name is stored in metaData(x)$sampleName; maybe you have to ## adjust the metaData or use your own ID table for your data here) samples <- factor(sapply(spectra, function(x)metaData(x)$sampleName)) ## 2. average technical replicates ## see ?averageMassSpectra avgSpectra <- averageMassSpectra(spectra, labels=samples, method="mean") ## run peak detection ## (maybe you need to adjust halfWindowSize [decreasing it for high resolution ## spectra] and SNR [a higher value increase the True-Positive-Rate but decrease ## sensitivity]) ## see ?detectPeaks, ?estimateNoise peaks <- detectPeaks(avgSpectra, method="MAD", halfWindowSize=20, SNR=2) ## bin peaks ## (After alignment peak positions (mass) are similar but not identical. Binning ## is needed to make similar peak mass values identical.) ## see ?binPeaks peaks <- binPeaks(peaks, tolerance=0.002) ## prepare for statistical analysis ## 1. get cancer/control indices filenames <- sapply(peaks, function(x)metaData(x)$file[1]) cancer <- grepl(pattern="/tumor/", x=filenames) classes <- factor(ifelse(cancer, "cancer", "control"), levels=c("cancer", "control")) ## 2. export expression/training matrix ## (and fill missing peaks by interpolated values) ## see ?intensityMatrix training <- intensityMatrix(peaks, avgSpectra) ## 'training' and 'classes' could now used by any statistical tool e.g. sda MALDIquant/tests/0000755000175000017500000000000012255044416014626 5ustar sebastiansebastianMALDIquant/tests/test_all.R0000644000175000017500000000005712255044416016562 0ustar sebastiansebastianlibrary("testthat") test_package("MALDIquant") MALDIquant/src/0000755000175000017500000000000012265251233014251 5ustar sebastiansebastianMALDIquant/src/snip.c0000644000175000017500000000560312265251233015372 0ustar sebastiansebastian/* Copyright 2011-2013 Sebastian Gibb * * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ /* SNIP algorithm based on: * C.G. Ryan, E. Clayton, W.L. Griffin, S.H. Sie, and D.R. Cousens. * "Snip, a statistics-sensitive background treatment for the quantitative * analysis of pixe spectra in geoscience applications." * Nuclear Instruments and Methods in Physics Research Section B: * Beam Interactions with Materials and Atoms, 34(3):396-402, 1988. * ISSN 0168-583X. doi:10.1016/0168-583X(88)90063-8. * URL http://www.sciencedirect.com/science/article/B6TJN-46YSYTJ-30/2/e0d015ceb8ea8a7bc0702a857a19750b * * decreasing clipping window adapted from: * M. Morhac. 2009. * "An algorithm for determination of peak regions and baseline elimination in * spectroscopic data." * Nuclear Instruments and Methods in Physics Research Section A: * Accelerators, Spectrometers, Detectors and Associated Equipment, 600(2), 478-487. * ISSN 0168-9002. doi:10.1016/S0168-9002(97)01023-1. * URL http://www.sciencedirect.com/science/article/pii/S0168900297010231 */ #include "MALDIquant.h" #include #include /* y = array of double values * iterations = max iteration steps * decreasing = use a decreasing clipping window? */ SEXP C_snip(SEXP y, SEXP iterations, SEXP decreasing) { SEXP dup, output; R_xlen_t n, i, j, k; int d; double a, b; PROTECT(dup=duplicate(y)); PROTECT(y=coerceVector(dup, REALSXP)); n=XLENGTH(y); d=asInteger(decreasing); PROTECT(output=allocVector(REALSXP, n)); double* xo=REAL(output); double* xy=REAL(y); k=asInteger(iterations); /* code duplication to use faster ++i/--i instead of i+=step */ if (d) { for (i=k; i>0; --i) { for (j=i; j * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ #include "MALDIquant.h" #include #include #include static const R_CallMethodDef callMethods[] = { {"C_colMedians", (DL_FUNC) &C_colMedians, 2}, {"C_snip", (DL_FUNC) &C_snip, 3}, {"C_lowerConvexHull", (DL_FUNC) &C_lowerConvexHull, 2}, {"C_dilation", (DL_FUNC) &C_dilation, 2}, {"C_erosion", (DL_FUNC) &C_erosion, 2}, {"C_localMaxima", (DL_FUNC) &C_localMaxima, 2}, { NULL, NULL, 0 } /* mark last element */ }; void #ifdef HAVE_VISIBILITY_ATTRIBUTE __attribute__ ((visibility ("default"))) #endif R_init_MALDIquant(DllInfo *info) { /* no .C, .Fortran, or .External routines => NULL */ R_registerRoutines(info, NULL, callMethods, NULL, NULL); } MALDIquant/src/morphologicalFilters.c0000644000175000017500000001113412265251233020605 0ustar sebastiansebastian/* Copyright 2013 Sebastian Gibb * * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ #include "MALDIquant.h" #include #include /* Dilation/Erosion is based on the vHGW Algorithm * (needs only 3 comparison per element): * * M. van Herk. "A Fast Algorithm for Local Minimum and Maximum Filters on * Rectangular and Octagonal Kernels." * Pattern Recognition Letters 13.7 (1992): 517-521. * * J. Y. Gil and M. Werman. "Computing 2-Dimensional Min, Median and Max * Filters." IEEE Transactions (1996): 504-507. * * Gil and Kimmel (GK) decrease the number of comparisons to nearly 1.5: * * J. Y. Gil and R. Kimmel. "Efficient Dilation, Erosion, Opening, and Closing * Algorithms." Pattern Analysis and Machine Intelligence, * IEEE Transactions on 24.12 (2002): 1606-1617. * * The implementation of the GK algorithm is much more complex and needs pointer * arithmetic, "goto" or multiple for-loops (increasing number of comparision). * The speed improvement is marginal and does not matter for our purposes. */ /* y = input vector * s = half window size (half filter length) */ SEXP C_dilation(SEXP y, SEXP s) { SEXP f, g, h, output; R_xlen_t n, fn, k, q, i, r, j, gi, hi; PROTECT(y=coerceVector(y, REALSXP)); n=XLENGTH(y); q=asInteger(s); k=2*q+1; /* add q (== halfWindowSize) values left/right * increase n to make n%windowSize == 0 */ fn=n+2*q+(k-(n%k)); PROTECT(f=allocVector(REALSXP, fn)); PROTECT(g=allocVector(REALSXP, fn)); PROTECT(h=allocVector(REALSXP, fn)); PROTECT(output=allocVector(REALSXP, n)); double* xy=REAL(y); double* xf=REAL(f); double* xg=REAL(g); double* xh=REAL(h); double* xo=REAL(output); memcpy(xf+q, xy, n*sizeof(double)); /* init left extrema */ for (i=0; i xf[gi]) { xg[gi]=xf[gi]; } else { xg[gi]=xg[gi-1]; } if (xh[hi+1] > xf[hi]) { xh[hi]=xf[hi]; } else { xh[hi]=xh[hi+1]; } } } /* merging */ for (i=0, gi=k-1, hi=0; i xh[hi]) { xo[i]=xh[hi]; } else { xo[i]=xg[gi]; } } UNPROTECT(5); return(output); } MALDIquant/src/MALDIquant.h0000644000175000017500000000214512265251233016323 0ustar sebastiansebastian/* Copyright 2013 Sebastian Gibb * * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ #ifndef MALDIQUANT_H #define MALDIQUANT_H #include #include SEXP C_colMedians(SEXP x, SEXP na_rm); SEXP C_snip(SEXP y, SEXP iterations, SEXP decreasing); SEXP C_lowerConvexHull(SEXP x, SEXP y); SEXP C_dilation(SEXP y, SEXP s); SEXP C_erosion(SEXP y, SEXP s); SEXP C_localMaxima(SEXP y, SEXP s); #endif /* end of MALDIQUANT_H */ MALDIquant/src/lowerConvexHull.c0000644000175000017500000000476112265251233017565 0ustar sebastiansebastian/* Copyright 2011 Sebastian Gibb * * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ /* Lower Convex Hull Algorithm based on: * A. M. Andrew, "Another Efficient Algorithm for Convex Hulls in Two * Dimensions", Info. Proc. Letters 9, 216-219 (1979). * only calculate lower hull (we don't need the upper one) */ #include "MALDIquant.h" #include #include /* build cross product of 2 vectors and compare to zero * returns true for P2(x2, y2) left of P0->P1 */ double left(double x0, double y0, double x1, double y1, double x2, double y2) { return(((x1-x0)*(y2-y0) - (x2-x0)*(y1-y0)) > 0); } /* x = array of double values * y = array of double values * length = length of y * output = array of double values (new y values) */ SEXP C_lowerConvexHull(SEXP x, SEXP y) { SEXP output; /* TODO: replace by R_xlen_t in R 3.0.0 */ R_xlen_t n, i, j, k=0; int* nodes; double m, c; PROTECT(x=coerceVector(x, REALSXP)); PROTECT(y=coerceVector(y, REALSXP)); n=XLENGTH(x); PROTECT(output=allocVector(REALSXP, n)); /* TODO: replace by R_xlen_t in R 3.0.0 */ /* allocate vector - error handling is done by R */ nodes=(int*) Calloc((size_t) n, int); double* xx=REAL(x); double* xy=REAL(y); double* xo=REAL(output); /* find lower convex hull */ for (i=0; i 1 && !left(xx[nodes[k-2]], xy[nodes[k-2]], xx[nodes[k-1]], xy[nodes[k-1]], xx[i], xy[i])) { k-=1; } nodes[k]=i; k+=1; } /* build linear function y=mx+c to calculate values between nodes */ for (i=0; i * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ #include "MALDIquant.h" #include #include R_xlen_t windowMaxIdx(double* x, R_xlen_t start, R_xlen_t end) { R_xlen_t i, m=start; for (i=start+1; i<=end; ++i) { if (x[m] < x[i]) { m=i; } } return(m); } /* y = array of double values * s = half window size */ SEXP C_localMaxima(SEXP y, SEXP s) { SEXP output; R_xlen_t n, q, m, windowSize, i, l, mid; PROTECT(y=coerceVector(y, REALSXP)); n=XLENGTH(y); PROTECT(output=allocVector(LGLSXP, n)); double* xy=REAL(y); int* xo=LOGICAL(output); memset(xo, 0, n*sizeof(int)); q=asInteger(s); windowSize=q*2; m=windowMaxIdx(xy, 0, windowSize); xo[m]=m==q; /* i == rhs; l == lhs; mid == middle pos */ for (i=windowSize+1, l=i-windowSize, mid=(l+i)/2; i xy[m]) { m=i; } if (m == mid) { xo[m]=1; } } UNPROTECT(2); return(output); } MALDIquant/src/colMedians.c0000644000175000017500000000464012265251233016477 0ustar sebastiansebastian/* Copyright 2013 Sebastian Gibb * * * This file is part of MALDIquant for R and related languages. * * MALDIquant 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 3 of the License, or * (at your option) any later version. * * MALDIquant 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 MALDIquant. If not, see */ #include "MALDIquant.h" #include #include /* x = matrix of double values * na_rm = remove NA? * based on src/library/stats/R/median.R */ SEXP C_colMedians(SEXP x, SEXP na_rm) { SEXP dims, column, output; R_xlen_t ncol, nrow, ir, ic, icr, half; int narm, isEven; double v; PROTECT(x=coerceVector(x, REALSXP)); PROTECT(dims=getAttrib(x, R_DimSymbol)); /* TODO: Replace by R_xlen_t in R 3.0.0. * TODO: Maybe this will cause problems because we need Long Vector support. */ nrow=INTEGER(dims)[0]; ncol=INTEGER(dims)[1]; narm=asInteger(na_rm); PROTECT(output=allocVector(REALSXP, ncol)); PROTECT(column=allocVector(REALSXP, nrow)); double* xx=REAL(x); double* xo=REAL(output); double* xc=REAL(column); for (ic=0; ic 5, 2], 16:20) }) MALDIquant/inst/tests/test_mass-methods.R0000644000175000017500000000066412255044416021377 0ustar sebastiansebastiancontext("mass") s <- createMassSpectrum(mass=1:10, intensity=11:20) test_that("mass", { expect_identical(mass(s), 1:10) expect_identical(mass(s)[1:3], 1:3) }) test_that("mass<- throws errors", { expect_error(mass(s) <- LETTERS[1:10]) expect_error(mass(s) <- 1, "have to be equal") }) test_that("mass<-", { mass(s) <- 11:20 expect_equal(mass(s), 11:20) mass(s)[5:10] <- 5:10 expect_equal(mass(s), c(11:14, 5:10)) }) MALDIquant/inst/tests/test_as.matrix-functions.R0000644000175000017500000000255112263537432022710 0ustar sebastiansebastiancontext(".as.matrix") p <- list(createMassPeaks(mass=1:4, intensity=11:14), createMassPeaks(mass=2:5, intensity=22:25)) s <- list(createMassSpectrum(mass=1:5, intensity=11:15), createMassSpectrum(mass=1:5, intensity=21:25)) mp <- matrix(c(11:14, NA, NA, 22:25), byrow=T, ncol=5, nrow=2, dimnames=list(NULL, 1:5)) ms <- matrix(c(11:15, 21:25), byrow=T, ncol=5, nrow=2, dimnames=list(NULL, 1:5)) mb <- matrix(c(rep(1L, 4), 0L, 0L, rep(1L, 4)), byrow=T, ncol=5, nrow=2, dimnames=list(NULL, 1:5)) test_that(".as.matrix.MassObjectsList throws errors", { expect_error(MALDIquant:::.as.matrix.MassObjectList(p[[1]]), "no list of MALDIquant::AbstractMassObject objects") expect_error(MALDIquant:::.as.matrix.MassObjectList(list()), "no list of MALDIquant::AbstractMassObject objects") expect_error(MALDIquant:::.as.matrix.MassObjectList(list(p, mp)), "no list of MALDIquant::AbstractMassObject objects") }) test_that(".as.binary.matrix", { expect_error(MALDIquant:::.as.binary.matrix(p[[1]])) }) test_that(".as.matrix.MassObjectsList", { expect_identical(MALDIquant:::.as.matrix.MassObjectList(p), mp) expect_identical(MALDIquant:::.as.matrix.MassObjectList(s), ms) }) test_that(".as.binary.matrix", { expect_identical(MALDIquant:::.as.binary.matrix(mp), mb) }) MALDIquant/inst/tests/test_isMassObject-functions.R0000644000175000017500000000127512255044416023366 0ustar sebastiansebastiancontext("isMassObject") s <- createMassSpectrum(mass=1:10, intensity=1:10) p <- createMassPeaks(mass=1:10, intensity=1:10) test_that(".isMassObject", { expect_false(MALDIquant:::.isMassObject(double())) expect_false(MALDIquant:::.isMassObject(list())) expect_true(MALDIquant:::.isMassObject(s)) expect_true(MALDIquant:::.isMassObject(p)) }) test_that("isMassSpectrum", { expect_false(isMassSpectrum(double())) expect_false(isMassSpectrum(list())) expect_false(isMassSpectrum(p)) expect_true(isMassSpectrum(s)) }) test_that("isMassPeaks", { expect_false(isMassPeaks(double())) expect_false(isMassPeaks(list())) expect_false(isMassPeaks(s)) expect_true(isMassPeaks(p)) }) MALDIquant/inst/tests/test_mapply-functions.R0000644000175000017500000000036612255044416022302 0ustar sebastiansebastiancontext(".mapply") test_that(".mapply", { a <- setNames(1L:10L, LETTERS[1L:10L]) b <- 1L:2L f <- function(x, y)x+y expect_identical(MALDIquant:::.mapply(f, a, b), mapply(f, a, b, USE.NAMES=FALSE, SIMPLIFY=FALSE)) }) MALDIquant/inst/tests/test_findLocalMaximaLogical-methods.R0000644000175000017500000000333712255044416024757 0ustar sebastiansebastiancontext(".findLocalMaximaLogical") s <- createMassSpectrum(mass=1:5, intensity=c(1, 2, 1, 2, 1)) test_that(".findLocalMaximaLogical throws errors", { expect_error(MALDIquant:::.findLocalMaximaLogical(s, halfWindowSize=0), "too small") expect_error(MALDIquant:::.findLocalMaximaLogical(s, halfWindowSize=3), "too large") }) test_that(".findLocalMaxima(Logical) shows warnings", { expect_warning(MALDIquant:::.findLocalMaximaLogical( createMassSpectrum(mass=double(), intensity=double()), "empty")) expect_warning(MALDIquant:::.findLocalMaxima( createMassSpectrum(mass=double(), intensity=double()), "empty")) }) test_that(".findLocalMaximaLogical works with different window sizes", { expect_identical(suppressWarnings(MALDIquant:::.findLocalMaximaLogical( createMassSpectrum(mass=double(), intensity=double()), halfWindowSize=1)), logical()) expect_identical(MALDIquant:::.findLocalMaximaLogical(s, halfWindowSize=1), c(FALSE, TRUE, FALSE, TRUE, FALSE)) expect_identical(MALDIquant:::.findLocalMaximaLogical(s, halfWindowSize=2), c(FALSE, TRUE, FALSE, FALSE, FALSE)) }) test_that(".findLocalMaxima returns matrix", { m <- matrix(ncol=2, dimnames=list(list(), list("mass", "intensity"))) expect_equal(suppressWarnings(MALDIquant:::.findLocalMaxima( createMassSpectrum(mass=double(), intensity=double()), halfWindowSize=1)), m) m <- matrix(c(2, 2, 4, 2), ncol=2, byrow=TRUE, dimnames=list(list(), list("mass", "intensity"))) expect_identical(MALDIquant:::.findLocalMaxima(s, halfWindowSize=1), m) }) MALDIquant/inst/tests/test_findEmptyMassObjects-functions.R0000644000175000017500000000125212255044416025070 0ustar sebastiansebastiancontext("findEmptyMassObjects") s <- createMassSpectrum(mass=1:10, intensity=1:10) e <- createMassSpectrum(double(), double()) test_that("findEmptyMassObjects throws errors", { expect_error(findEmptyMassObjects(e), "no list of MALDIquant::AbstractMassObject objects") expect_error(findEmptyMassObjects(list()), "no list of MALDIquant::AbstractMassObject objects") }) test_that("findEmptyMassObjects", { expect_identical(findEmptyMassObjects(list(e, e)), 1L:2L) expect_identical(findEmptyMassObjects(list(s, s)), integer()) expect_identical(findEmptyMassObjects(list(s, e)), 2L) expect_identical(findEmptyMassObjects(list(e, s)), 1L) }) MALDIquant/inst/tests/test_grouper-functions.R0000644000175000017500000000457312255044416022467 0ustar sebastiansebastiancontext("grouper") test_that("grouperStrict", { expect_true(is.na(MALDIquant:::.grouperStrict(mass=c(1, 2), intensities=c(1, 2), samples=c(1, 1), tolerance=0.01))) expect_true(is.na(MALDIquant:::.grouperStrict(mass=c(1, 2, 2.1, 2.01), intensities=rep(1, 4), samples=1:4, tolerance=0.01))) expect_true(MALDIquant:::.grouperStrict(mass=c(2, 2.02, 2.01), intensities=rep(1, 3), samples=1:4, tolerance=0.01) == 2.01) }) test_that("grouperRelaxed", { expect_true(is.na(MALDIquant:::.grouperRelaxed(mass=c(1, 2, 2.1, 2.01), intensities=rep(1, 4), samples=1:4, tolerance=0.01))) expect_equal(MALDIquant:::.grouperRelaxed(mass=c(2.01, 2.03, 2.04, 2.01), intensities=c(2, 1, 1, 1), samples=c(1, 1, 2, 3), tolerance=0.1), c(2.02, 2.03, 2.02, 2.02)) expect_equal(MALDIquant:::.grouperRelaxed(mass=c(1.009, 1.01, 1, 1.03), intensities=c(2, 1, 1, 1), samples=c(1, 1, 2, 3), tolerance=0.1), c(1.013, 1.01, 1.013, 1.013)) }) test_that("grouperRelaxedHighestAtReference", { expect_identical(MALDIquant:::.grouperRelaxedHighestAtReference( mass=1:5, intensities=rep(1, 5), samples=2:6, tolerance=0.01), 0L) expect_true(is.na(MALDIquant:::.grouperRelaxedHighestAtReference( mass=1:5, intensities=rep(1, 5), samples=c(1, 1:4), tolerance=0.01))) expect_equal(MALDIquant:::.grouperRelaxedHighestAtReference( mass=c(2.01, 2.03, 2.04, 2.01), intensities=c(1, 2, 1, 1), samples=c(1, 2, 2, 3), tolerance=0.1), c(2.01, 2.01, 0, 2.01)) }) MALDIquant/inst/tests/test_range-functions.R0000644000175000017500000000101412255044416022063 0ustar sebastiansebastiancontext("range") test_that(".overlap", { l1 <- c(createMassSpectrum(1L:10L, 1L:10L), createMassSpectrum(5L:15L, 5L:15L)) l2 <- c(createMassSpectrum(1L:10L, 1L:10L), createMassSpectrum(15L:25L, 15L:25L)) expect_identical(MALDIquant:::.overlap(l1), c(5L, 10L)) expect_identical(MALDIquant:::.overlap(l2), c(0L, 0L)) }) test_that(".reorderRange", { expect_identical(MALDIquant:::.reorderRange(c(5L, 10L)), c(5L, 10L)) expect_identical(MALDIquant:::.reorderRange(c(10L, 5L)), c(5L, 10L)) }) MALDIquant/inst/tests/test_trim-methods.R0000644000175000017500000000125412255044416021403 0ustar sebastiansebastiancontext("trim") s <- createMassSpectrum(mass=1:10, intensity=11:20) test_that("trim throws errors", { expect_error(trim(s, range=1:10), "has to be a vector of length 2") expect_error(trim(s, range=1), "has to be a vector of length 2") expect_error(trim(c(s, createMassSpectrum(mass=21:30, intensity=1:10))), "No overlap") }) test_that("trim", { expect_equal(trim(s, c(2, 9)), createMassSpectrum(mass=2:9, intensity=12:19)) }) test_that("trim works with list of AbstractMassObject objects", { r <- createMassSpectrum(mass=2:9, intensity=12:19) expect_equal(trim(list(s, s), c(2, 9)), list(r, r)) expect_equal(trim(list(s, r)), list(r, r)) }) MALDIquant/inst/tests/test_estimateBaseline-methods.R0000644000175000017500000000737312255044416023716 0ustar sebastiansebastiancontext("estimateBaseline") i <- rep(10:1, 2) s <- createMassSpectrum(mass=1:20, intensity=i) m <- matrix(c(1:20, rep(NA, 20)), ncol=2, byrow=FALSE, dimnames=list(list(), list("x", "y"))) test_that("estimateBaseline throws errors", { expect_error(estimateBaseline(s, method="foobar"), ".*arg.* should be one of .*SNIP.*, .*ConvexHull.*, .*median.*") }) test_that("estimateBaseline shows warnings", { expect_warning(estimateBaseline( createMassSpectrum(mass=double(), intensity=double()), "empty")) }) test_that("estimateBaselineConvexHull", { m[, 2] <- c(10:1, rep(1, 10)) ## C implementation expect_identical(MALDIquant:::.estimateBaselineConvexHull(1:20, i), m) ## obsolete (slow) R implementation expect_identical(MALDIquant:::.lowerConvexHullR(1:20, i), m) ## user method colnames(m) <- c("mass", "intensity") expect_identical(estimateBaseline(s, method="ConvexHull"), m) }) test_that("estimateBaselineMedian", { m[, 2] <- c(10:4, rep(c(3, 8), each=3), 7:1) m1 <- m m1[, 2] <- c(10:3, rep(c(2, 9), each=2), 8:1) expect_identical(MALDIquant:::.estimateBaselineMedian(1:20, i, 1), m1) expect_identical(MALDIquant:::.estimateBaselineMedian(1:20, i, 2), m) ## user method colnames(m) <- c("mass", "intensity") expect_identical(estimateBaseline(s, method="median", halfWindowSize=2), m) ## halfWindowSize expect_error(MALDIquant:::.estimateBaselineMedian(1:20, i, 0), "too small") expect_error(MALDIquant:::.estimateBaselineMedian(1:20, i, 20), "too large") }) test_that("estimateBaselineSnip", { mlist <- list(decreasing=list(m=m, m100=m), increasing=list(m=m, m100=m)) mlist$decreasing$m[, 2] <- c(10:1, c(2.5, 4.0, 5.5), 7:1) mlist$decreasing$m100[, 2] <- c(10:1, rep(c(1.25, 1.5, 1.75, 1.375, 1), times=2)) mlist$increasing$m[, 2] <- c(10:1, 5:4, 5.5, 7:1) mlist$increasing$m100[, 2] <- c(10:1, 3.75, 3.375, 3:1, 2.5, 4:1) ## test default decreasing argument expect_identical(MALDIquant:::.estimateBaselineSnip(1:20, i, 2), mlist$decreasing$m) for (j in seq(along=mlist)) { d <- names(mlist)[j] == "decreasing" ## C implementation expect_identical(MALDIquant:::.estimateBaselineSnip(1:20, i, 2, decreasing=d), mlist[[j]]$m) expect_equal(MALDIquant:::.estimateBaselineSnip(1:20, i, decreasing=d), mlist[[j]]$m100) ## obsolete (slow) R implementation expect_identical(MALDIquant:::.snipR(1:20, i, 2, decreasing=d), mlist[[j]]$m) ## user method colnames(mlist[[j]]$m100) <- colnames(mlist[[j]]$m) <- c("mass", "intensity") expect_identical(estimateBaseline(s, method="SNIP", iterations=2, decreasing=d), mlist[[j]]$m) expect_identical(estimateBaseline(s, iterations=2, decreasing=d), mlist[[j]]$m) expect_equal(estimateBaseline(s, decreasing=d), mlist[[j]]$m100) } }) test_that("estimateBaselineTopHat", { m[, 2] <- c(rep(8, 3), 7:1, rep(6, 5), 5:1) m1 <- m m1[, 2] <- c(rep(9, 2), 8:1, rep(8, 3), 7:1) ## C implementation expect_identical(MALDIquant:::.estimateBaselineTopHat(1:20, i, 1), m1) expect_identical(MALDIquant:::.estimateBaselineTopHat(1:20, i, 2), m) ## obsolete (slow) R implementation expect_equal(MALDIquant:::.topHatR(1:20, i, 2), m) ## user method colnames(m) <- c("mass", "intensity") expect_identical(estimateBaseline(s, method="TopHat", halfWindowSize=2), m) ## halfWindowSize expect_error(MALDIquant:::.estimateBaselineTopHat(1:20, i, 0), "too small") expect_error(MALDIquant:::.estimateBaselineTopHat(1:20, i, 20), "too large") }) MALDIquant/inst/tests/test_totalIonCurrent-methods.R0000644000175000017500000000054712255044416023570 0ustar sebastiansebastiancontext("totalIonCurrent") s <- createMassSpectrum(mass=1:10, intensity=1:10) i <- createMassSpectrum(mass=1:2, intensity=rep.int(.Machine$integer.max, 2)) e <- createMassSpectrum(mass=1:10, intensity=rep(0, 10)) test_that("totalIonCurrent", { expect_equal(totalIonCurrent(s), 49.5) expect_equal(totalIonCurrent(i), as.double(.Machine$integer.max)) }) MALDIquant/inst/tests/test_doByLabel-functions.R0000644000175000017500000000471212255044416022634 0ustar sebastiansebastiancontext(".doByLabels") s <- createMassSpectrum(mass=1:5, intensity=1:5) test_that(".doByLabels throws errors", { expect_error(MALDIquant:::.doByLabels(l=list(x=1, y=1), labels=as.factor(c("a", "b")), FUN=sum), "no list of MALDIquant::AbstractMassObject objects") expect_error(MALDIquant:::.doByLabels(l=list(s, s), labels=as.factor("a"), FUN=sum), "For each item in .*l.* there must be a label in .*labels.*") expect_error(MALDIquant:::.doByLabels(l=list(s, s), labels=as.factor(c("a", "b")))) }) test_that(".doByLabels runs a function for group labels", { expect_identical(MALDIquant:::.doByLabels(l=list(s, s), FUN=function(x){ return(1) }), 1) expect_identical(unname(MALDIquant:::.doByLabels(l=list(s, s), labels=as.factor(c("a", "b")), FUN=function(x){ return(1) })), c(1, 1)) l <- list(s, s, s, s) l[[1]]@metaData$file <- 1 l[[2]]@metaData$file <- 2 l[[3]]@metaData$file <- 10 l[[4]]@metaData$file <- 11 ## preserve order m <- MALDIquant:::.doByLabels(l=l, ## error because of wrong alphabetical order ## always add levels #labels=as.factor(paste("s", c(1, 2, 10, 11))), labels=factor(paste("s", c(1, 2, 10, 11)), levels=paste("s", c(1, 2, 10, 11))), FUN=function(x){return(x)}) expect_equal(c(1:2, 10:11), unname(sapply(m, function(x)metaData(x)$file))) ## bug #19; order changes if length of output is smaller than input m <- MALDIquant:::.doByLabels(l=l, ## results in factor(c(2, 2, 1, 1), levels=2:1) labels=rep(2:1, each=2), FUN=function(x){return(x[[1]])}) expect_equal(c(1, 10), unname(sapply(m, function(x)metaData(x)$file))) ## respect order of factor m <- MALDIquant:::.doByLabels(l=l, ## results in factor(c(2, 2, 1, 1), levels=1:2) labels=factor(rep(2:1, each=2)), FUN=function(x){return(x[[1]])}) expect_equal(c(10, 1), unname(sapply(m, function(x)metaData(x)$file))) ## see https://github.com/sgibb/MALDIquant/issues/1 expect_equal(unname(MALDIquant:::.doByLabels(l, 1:4, function(x)x[[1]])), l) }) MALDIquant/inst/tests/test_isEmpty-methods.R0000644000175000017500000000133212255044416022057 0ustar sebastiansebastiancontext("isEmpty") s <- c(createMassSpectrum(mass=1:10, intensity=11:20), createMassSpectrum(mass=1:2, intensity=rep.int(.Machine$integer.max, 2))) e <- c(createMassSpectrum(mass=double(), intensity=double()), createMassSpectrum(mass=1:10, intensity=rep(0, 10)), createMassSpectrum(mass=1:10, intensity=as.double(rep(NA, 10)))) test_that("isEmpty", { for (i in seq(along=e)) { expect_true(isEmpty(e[[i]])) } for (i in seq(along=s)) { expect_false(isEmpty(s[[i]])) } }) test_that("isEmptyWarning", { expect_warning(MALDIquant:::.isEmptyWarning(e[[1]]), "empty") expect_true(suppressWarnings(MALDIquant:::.isEmptyWarning(e[[1]]))) expect_false(MALDIquant:::.isEmptyWarning(s[[1]])) }) MALDIquant/inst/tests/test_determineWarpingFunctions-functions.R0000644000175000017500000000223212255044416026167 0ustar sebastiansebastiancontext("determineWarpingFunctions") r <- createMassPeaks(mass=1:10, intensity=1:10) p <- createMassPeaks(mass=(1:10)+0.01, intensity=1:10) test_that("determineWarpingFunctions throws errors", { expect_error(determineWarpingFunctions(1:10), "no list of MALDIquant::MassPeaks objects") expect_error(determineWarpingFunctions(p, reference=createMassPeaks(double(), double())), "Reference MassPeaks object contains no peaks") expect_error(determineWarpingFunctions(createMassPeaks(mass=20, intensity=20), reference=r), "Could not match any peak in spectrum 1 to a reference peak") }) test_that("determineWarpingFunctions works with single MassPeaks object", { w <- determineWarpingFunctions(p, reference=r, method="linear") wp <- warpMassPeaks(list(p), w)[[1]] expect_equal(r, wp) }) test_that("determineWarpingFunctions works with list of MassPeaks objects", { w <- determineWarpingFunctions(list(p, p), reference=r, method="linear") wp <- warpMassPeaks(list(p, p), w) expect_equal(list(r, r), wp) }) MALDIquant/inst/tests/test_isMassObjectList-functions.R0000644000175000017500000000230112255044416024211 0ustar sebastiansebastiancontext("isMassObjectList") s <- createMassSpectrum(mass=1:10, intensity=1:10) p <- createMassPeaks(mass=1:10, intensity=1:10) test_that(".isMassObjectList", { expect_false(MALDIquant:::.isMassObjectList(double(2))) expect_false(MALDIquant:::.isMassObjectList(list())) expect_false(MALDIquant:::.isMassObjectList(s)) expect_false(MALDIquant:::.isMassObjectList(p)) expect_true(MALDIquant:::.isMassObjectList(list(s, s))) expect_true(MALDIquant:::.isMassObjectList(list(s, p))) expect_true(MALDIquant:::.isMassObjectList(list(p, p))) }) test_that("isMassSpectrumList", { expect_false(isMassSpectrumList(double(2))) expect_false(isMassSpectrumList(list())) expect_false(isMassSpectrumList(s)) expect_false(isMassSpectrumList(p)) expect_false(isMassSpectrumList(list(s, p))) expect_false(isMassSpectrumList(list(p, p))) expect_true(isMassSpectrumList(list(s, s))) }) test_that("isMassPeaksList", { expect_false(isMassPeaksList(double(2))) expect_false(isMassPeaksList(list())) expect_false(isMassPeaksList(s)) expect_false(isMassPeaksList(p)) expect_false(isMassPeaksList(list(s, s))) expect_false(isMassPeaksList(list(s, p))) expect_true(isMassPeaksList(list(p, p))) }) MALDIquant/inst/tests/test_which.closest-functions.R0000644000175000017500000000062312255044416023551 0ustar sebastiansebastiancontext(".which.closest") test_that(".which.closest", { expect_equal(MALDIquant:::.which.closest(1.001, 1:10), 1) expect_equal(MALDIquant:::.which.closest(1.4, 1:10), 1) expect_equal(MALDIquant:::.which.closest(9.8, 1:10), 10) expect_equal(MALDIquant:::.which.closest(11.1, 1:10), 10) expect_equal(MALDIquant:::.which.closest(c(0.5, 1.5, exp(1), pi), 1:10), c(1, 2, 3, 3)) }) MALDIquant/inst/tests/test_metaData-methods.R0000644000175000017500000000047012255044416022147 0ustar sebastiansebastiancontext("metaData") s <- createMassSpectrum(mass=1:10, intensity=11:20, metaData=list(name="test spectrum")) test_that("metaData", { expect_identical(metaData(s)$name, "test spectrum") }) test_that("metaData<-", { l <- list(a=1:3, b=letters[1:3]) metaData(s) <- l expect_identical(metaData(s), l) }) MALDIquant/inst/tests/test_show-methods.R0000644000175000017500000000342512255044416021412 0ustar sebastiansebastiancontext("show") test_that("show", { x <- createMassSpectrum(mass=1:10, intensity=11:20, metaData=list(name="example", file="example.mzML")) r <- c( "S4 class type : MassSpectrum", "Number of m/z values : 10 ", "Range of m/z values : 1 - 10 ", "Range of intensity values: 11 - 20 ", "Memory usage : 1.648 KiB ", "Name : example ", "File : example.mzML") expect_identical(capture.output(show(x))[-5], r[-5]) x <- createMassPeaks(mass=1:10, intensity=11:20, metaData=list(name="example", file="example.mzML")) r <- c( "S4 class type : MassPeaks", "Number of m/z values : 10 ", "Range of m/z values : 1 - 10 ", "Range of intensity values: 11 - 20 ", "Range of snr values : NA - NA ", "Memory usage : 1.844 KiB", "Name : example ", "File : example.mzML") expect_identical(capture.output(show(x))[-6], r[-6]) x <- createMassPeaks(mass=1:10, intensity=11:20, snr=1:10, metaData=list(name=c("example1", "example2"), file=c("example1.txt", "example2.txt"))) r <- c( "S4 class type : MassPeaks", "Number of m/z values : 10 ", "Range of m/z values : 1 - 10 ", "Range of intensity values: 11 - 20 ", "Range of snr values : 1 - 10 ", "Memory usage : 1.977 KiB", "Name1 : example1 ", "Name2 : example2 ", "File1 : example1.txt", "File2 : example2.txt") expect_identical(capture.output(show(x))[-6], r[-6]) }) MALDIquant/inst/tests/test_deprecated-functons.R0000644000175000017500000000153212255044416022723 0ustar sebastiansebastiancontext(".deprecated") test_that(".deprecated", { expect_error(.deprecated("0.1", "foobar", "foobar")) expect_message(.deprecated(packageVersion("MALDIquant"), "foobar", "foobar")) }) test_that(".deprecatedFunction", { expect_error(.deprecatedFunction("0.1", old="foobar", "\"foobar\" is deprecated.")) expect_error(.deprecatedFunction("0.1", old="foo", new="bar", "\"foo\" is deprecated.\nUse \"bar\" instead. See help(\"bar\").")) }) test_that(".deprecatedArgument", { foobar <- function(x, y) { .deprecatedArgument("0.1", old="x", new="y") } expect_error(foobar(1L, 1L), "Argument .*x.* is deprecated..*Use .*y.* instead. See help(.*foobar.*).") foobar <- function(x, y) { .deprecatedArgument("0.1", old="x") } expect_error(foobar(1L, 1L), "Argument \"x\" is deprecated.") }) MALDIquant/inst/tests/test_localMaxima-functions.R0000644000175000017500000000047412255044416023227 0ustar sebastiansebastiancontext(".localMaxima") y <- c(1, 1, 2, 1, 1, 3, 4) set.seed(1) b <- rnorm(5e4) test_that(".localMaxima", { expect_identical(MALDIquant:::.localMaxima(y, 1), c(T, F, T, F, F, F, T)) expect_identical(MALDIquant:::.localMaxima(b, 20), MALDIquant:::.localMaximaR(b, 20)) }) MALDIquant/inst/tests/test_approxfun-methods.R0000644000175000017500000000063512255044416022454 0ustar sebastiansebastiancontext("approxfun") test_that("approxfun", { s <- createMassSpectrum(mass=1:10, intensity=11:20) e <- createMassSpectrum(mass=double(), intensity=double()) p <- createMassPeaks(mass=1:10, intensity=11:20) expect_error(MALDIquant:::approxfun(p)) expect_equal(approxfun(s)(seq(0, 11, by=0.5)), c(NA, NA, seq(11, 20, by=0.5), NA, NA)) expect_equal(approxfun(e)(1:20), rep(NA, 20)) }) MALDIquant/inst/tests/test_length-methods.R0000644000175000017500000000037712255044416021716 0ustar sebastiansebastiancontext("length") test_that("length", { expect_identical(length(createMassSpectrum(mass=1:10, intensity=1:10)), 10L) expect_identical(length(createMassSpectrum(mass=double(), intensity=double())), 0L) }) MALDIquant/inst/tests/test_referencePeaks-functions.R0000644000175000017500000000343512265240511023715 0ustar sebastiansebastiancontext("referencePeaks") p <- c(createMassPeaks(mass=1:5, intensity=1:5), createMassPeaks(mass=1:4, intensity=1:4), createMassPeaks(mass=1:3, intensity=1:3), createMassPeaks(mass=1:2, intensity=1:2)) p2 <- c(createMassPeaks(mass=c(1, 1.001, 3), intensity=c(2, 1, 1)), createMassPeaks(mass=c(0.99, 3), intensity=rep(1, 2)), createMassPeaks(mass=c(1.02, 3), intensity=rep(1, 2))) test_that("referencePeaks throws errors", { expect_error(referencePeaks(list(a="a", b="b"), minFrequency=0.5), "no list of MALDIquant::MassPeaks objects") expect_error(referencePeaks(p[[1]], minFrequency=0.5), "no list of MALDIquant::MassPeaks objects") }) test_that("referencePeaks shows warnings", { expect_warning(referencePeaks(p, minFrequency=-1), " < 0 does not make sense! Using 0 instead") expect_warning(referencePeaks(p, minFrequency=10), "Empty peak whitelist for level") }) test_that("referencePeaks works with different frequencies", { expect_equal(referencePeaks(p, minFrequency=1), createMassPeaks(mass=1:2, intensity=rep(1, 2))) expect_equal(referencePeaks(p, minFrequency=0.5), createMassPeaks(mass=1:4, intensity=c(1, 1, 3/4, 0.5))) }) test_that("referencePeaks works with different methods", { expect_equal(referencePeaks(p2, minFrequency=1, tolerance=0.05), createMassPeaks(mass=3, intensity=1)) expect_equal(referencePeaks(p2, method="strict", minFrequency=1, tolerance=0.05), createMassPeaks(mass=3, intensity=1)) expect_equal(referencePeaks(p2, method="relaxed", minFrequency=1, tolerance=0.05), createMassPeaks(mass=c(1+1/300, 3), intensity=rep(1, 2))) }) MALDIquant/inst/tests/test_estimateNoise-methods.R0000644000175000017500000000232412255044416023240 0ustar sebastiansebastiancontext("estimateNoise-methods") i <- rep(10:1, 2) s <- createMassSpectrum(mass=1:20, intensity=i) m <- matrix(c(1:20, rep(NA, 20)), ncol=2, byrow=FALSE, dimnames=list(list(), list("mass", "intensity"))) test_that("estimateNoise throws errors", { expect_error(estimateNoise(s, method="foobar"), ".*arg.* should be one of .*MAD.*, .*SuperSmoother.*") }) test_that("estimateNoise shows warnings", { expect_warning(estimateNoise( createMassSpectrum(mass=double(), intensity=double())), "empty") expect_identical(suppressWarnings(estimateNoise( createMassSpectrum(mass=double(), intensity=double()))), 0L) }) test_that(".estimateNoiseMad", { m[, 2] <- stats::mad(i) expect_identical(unname(MALDIquant:::.estimateNoiseMad(1:20, i)), unname(m)) expect_identical(estimateNoise(s), m) expect_identical(estimateNoise(s, method="MAD"), m) }) test_that(".estimateNoiseSuperSmoother", { m[, 2] <- stats::supsmu(x=1:20, y=i)$y expect_identical(unname(MALDIquant:::.estimateNoiseSuperSmoother(1:20, i)), unname(m)) expect_identical(estimateNoise(s, method="SuperSmoother"), m) }) MALDIquant/inst/tests/test_removeEmptyMassObjects-functions.R0000644000175000017500000000131012255044416025440 0ustar sebastiansebastiancontext("removeEmptyMassObjects") s <- createMassSpectrum(mass=1:10, intensity=1:10) e <- createMassSpectrum(double(), double()) test_that("removeEmptyMassObjects throws errors", { expect_error(removeEmptyMassObjects(e), "no list of MALDIquant::AbstractMassObject objects") expect_error(removeEmptyMassObjects(list()), "no list of MALDIquant::AbstractMassObject objects") }) test_that("removeEmptyMassObjects", { expect_identical(removeEmptyMassObjects(list(e, e)), list()) expect_identical(removeEmptyMassObjects(list(s, s)), list(s, s)) expect_identical(removeEmptyMassObjects(list(s, e)), list(s)) expect_identical(removeEmptyMassObjects(list(e, s)), list(s)) }) MALDIquant/inst/tests/test_warp-functions.R0000644000175000017500000000322012255044416021741 0ustar sebastiansebastiancontext("warp") s <- createMassSpectrum(mass=1:10, intensity=1:10) p <- createMassPeaks(mass=1:10, intensity=1:10, snr=1:10) test_that("warpMassSpectra throws errors", { expect_error(warpMassSpectra(p, function(x)1), "no list of MALDIquant::MassSpectrum objects") expect_error(warpMassSpectra(s, function(x)1), "no list of MALDIquant::MassSpectrum objects") expect_error(warpMassSpectra(list(s), 1), "no list of functions") }) test_that("warpMassSpectra", { expect_equal(warpMassSpectra(list(s, s), list(function(x)1, function(x)x+1)), list(createMassSpectrum(mass=2:11, intensity=1:10), createMassSpectrum(mass=seq(3, 21, by=2), intensity=1:10))) }) test_that("warpMassPeaks throws errors", { expect_error(warpMassPeaks(p, function(x)1), "no list of MALDIquant::MassPeaks objects") expect_error(warpMassPeaks(s, function(x)1), "no list of MALDIquant::MassPeaks objects") expect_error(warpMassPeaks(list(p), 1), "no list of functions") }) test_that("warpMassPeaks", { expect_equal(warpMassPeaks(list(p, p), list(function(x)1, function(x)x+1)), list(createMassPeaks(mass=2:11, intensity=1:10, snr=1:10), createMassPeaks(mass=seq(3, 21, by=2), intensity=1:10, snr=1:10))) }) test_that(".warp", { expect_equal(MALDIquant:::.warp(list(s, s), list(function(x)1, function(x)x+1)), list(createMassSpectrum(mass=2:11, intensity=1:10), createMassSpectrum(mass=seq(3, 21, by=2), intensity=1:10))) }) MALDIquant/inst/tests/test_constructor-functions.R0000644000175000017500000000260412255044416023362 0ustar sebastiansebastiancontext("constructors") meta <- list(name="test", file="test_constructor-functions.R") test_that("a MassSpectrum object is constructed", { expect_error(createMassSpectrum(mass=1:5, intensity=1:10)) expect_error(createMassSpectrum(mass=1:10, intensity=1:5)) expect_error(createMassSpectrum(mass=1:10, intensity=1:10, metaData=1:10)) expect_error(createMassSpectrum(mass=LETTERS[1:5], intensity=1:5)) expect_error(createMassSpectrum(mass=1:5, intensity=LETTERS[1:5])) expect_equal(createMassSpectrum(mass=1:10, intensity=1:10), new("MassSpectrum", mass=1:10, intensity=1:10, metaData=list())) expect_equal(createMassSpectrum(1:10, 1:10, meta), new("MassSpectrum", mass=1:10, intensity=1:10, metaData=meta)) }) test_that("a MassPeaks object is constructed", { expect_error(createMassPeaks(mass=1:5, intensity=1:10)) expect_error(createMassPeaks(mass=1:10, intensity=1:5)) expect_error(createMassPeaks(mass=1:5, intensity=1:5, snr=1:2)) expect_error(createMassPeaks(mass=1:10, intensity=1:10, metaData=1:10)) expect_equal(createMassPeaks(mass=1:10, intensity=1:10), new("MassPeaks", mass=1:10, intensity=1:10, snr=as.double(rep(NA, 10)), metaData=list())) expect_equal(createMassPeaks(1:10, 1:10, snr=1:10, meta), new("MassPeaks", mass=1:10, intensity=1:10, snr=1:10, metaData=meta)) }) MALDIquant/inst/tests/test_colMedians-functions.R0000644000175000017500000000132012255044416023045 0ustar sebastiansebastiancontext(".colMedians") test_that(".colMedians throws errors", { expect_error(MALDIquant:::.colMedians(list())) expect_error(MALDIquant:::.colMedians(matrix(1:10), na.rm="foobar")) }) test_that(".colMedians", { colMedians <- function(x, na.rm=FALSE)apply(m, 2, median, na.rm=na.rm) set.seed(1234) ## even nrow m <- matrix(rnorm(1e5), ncol=1e2) expect_equal(MALDIquant:::.colMedians(m), colMedians(m)) ## odd nrow nr <- nrow(m) m <- m[1:(nr-1), ] expect_equal(MALDIquant:::.colMedians(m), colMedians(m)) ## NA na <- sample(1:length(m), size=1e2) m[na] <- NA expect_equal(MALDIquant:::.colMedians(m), colMedians(m)) expect_equal(MALDIquant:::.colMedians(m, TRUE), colMedians(m, TRUE)) }) MALDIquant/inst/tests/test_calibrateIntensity-methods.R0000644000175000017500000000345212255044416024267 0ustar sebastiansebastiancontext("calibrateIntensity") s <- list(createMassSpectrum(mass=1:5, intensity=1:5), createMassSpectrum(mass=1:5, intensity=2:6), createMassSpectrum(mass=1:5, intensity=3:7)) test_that("calibrateIntensity,MassSpectrum throws errors", { expect_error(calibrateIntensity(s[[1]], method="foobar"), ".*arg.* should be one of .*TIC.*, .*PQN.*, .*median.*") expect_error(calibrateIntensity(s[[1]], method="PQN"), ".*PQN.* is not supported for a single MassSpectrum object") }) test_that("calibrateIntensity,list throws errors", { expect_error(calibrateIntensity(list(1:10), method="TIC"), "no list of MALDIquant::MassSpectrum objects") expect_error(calibrateIntensity(s, method="foobar"), ".*arg.* should be one of .*TIC.*, .*PQN.*, .*median.*") }) test_that("calibrateIntensity works with TIC", { sTIC <- calibrateIntensity(s[[1]], method="TIC") expect_equal(totalIonCurrent(sTIC), 1) sTIC <- calibrateIntensity(s, method="TIC") expect_equal(unlist(lapply(sTIC, totalIonCurrent)), rep(1, 3)) }) test_that("calibrateIntensity works with median", { sMed <- calibrateIntensity(s[[1]], method="median") expect_equal(intensity(sMed), intensity(s[[1]])/median(intensity(s[[1]]))) sMed <- calibrateIntensity(s, method="median") expect_equal(lapply(sMed, intensity), lapply(s, function(x)intensity(x)/median(intensity(x)))) }) test_that("calibrateIntensity works with PQN", { sPQN <- calibrateIntensity(s, method="PQN") expect_equal(sPQN, calibrateIntensity(s, method="TIC")) m <- list(s[[1]], createMassSpectrum(1:5, rep(2, 5)), createMassSpectrum(1:5, c(4:6, 2:1))) mPQN <- calibrateIntensity(m, method="PQN") expect_equal(unlist(lapply(mPQN, totalIonCurrent)), c(1, 1, 0.96875)) }) MALDIquant/inst/tests/test_morphologicalFilter-functions.R0000644000175000017500000000110512255044416024775 0ustar sebastiansebastiancontext("morphological filters") x <- list(c(8, 6, 2, 4, 5, 7, 1, 10), c(15, 8, 4, 11, 10, 1, 13, 12, 6, 9, 5, 3, 2, 7, 14)) e <- list(c(rep(2:1, each=4)), c(rep(4, 3), rep(1, 5), 5, 3, rep(2, 5))) d <- list(c(rep(8, 3), rep(7, 2), rep(10, 3)), c(rep(15, 3), 11, rep(13, 5), 12, rep(9, 2), rep(14, 3))) test_that(".erosion", { for (i in seq(along=x)) { expect_equal(.erosion(x[[i]], halfWindowSize=2), e[[i]]) } }) test_that(".dilation", { for (i in seq(along=x)) { expect_equal(.dilation(x[[i]], halfWindowSize=2), d[[i]]) } }) MALDIquant/inst/tests/test_transformIntensity-methods.R0000644000175000017500000000354712255044416024361 0ustar sebastiansebastiancontext("transformIntensity") s <- createMassSpectrum(mass=1:10, intensity=(1:10)^2) test_that("transformIntensity shows warnings", { expect_warning(transformIntensity( createMassSpectrum(mass=double(), intensity=double()), method="sqrt"), "empty") }) test_that("transformIntensity", { expect_equal(intensity(transformIntensity(s, method="sqrt")), 1:10) expect_equal(intensity(transformIntensity(s, method="log")), log((1:10)^2)) }) test_that("transformIntensity works with list of MassSpectrum objects", { expect_error(transformIntensity(list(x=1, y=1)), "no list of MALDIquant::AbstractMassObject objects") expect_error(transformIntensity(list(s, createMassPeaks(1, 1)), "no list of MALDIquant::AbstractMassObject objects")) r <- createMassSpectrum(mass=1:10, intensity=1:10) expect_equal(transformIntensity(list(s, s), method="sqrt"), list(r, r)) }) test_that(".transformIntensity throws errors", { expect_error(.transformIntensity(s), "is missing") }) test_that(".transformIntensity", { expect_equal(intensity(.transformIntensity(s, sqrt)), 1:10) expect_equal(length(.transformIntensity(s, MALDIquant:::.movingAverage, halfWindowSize=2)), 10) expect_equal(length(.transformIntensity(s, function(x)as.double(filter(x, rep(1, 5)/5, sides=2)))), 6) }) test_that(".transformIntensity works with list of AbstractMassObject objects", { expect_error(.transformIntensity(list(x=1, y=1)), "no list of MALDIquant::AbstractMassObject objects") expect_error(.transformIntensity(list(s, createMassPeaks(1, 1)), "no list of MALDIquant::AbstractMassObject objects")) r <- createMassSpectrum(mass=1:10, intensity=1:10) expect_equal(.transformIntensity(list(s, s), fun=sqrt), list(r, r)) }) MALDIquant/inst/tests/test_merge-functions.R0000644000175000017500000000606112255044416022075 0ustar sebastiansebastiancontext("merge") s <- c(createMassSpectrum(mass=1:3, intensity=1:3, metaData=list(a=1, b=2)), createMassSpectrum(mass=1:3, intensity=4:6, metaData=list(a=1, b=3))) p <- c(createMassPeaks(mass=1:3, intensity=1:3, snr=1:3, metaData=list(a=1, b=2)), createMassPeaks(mass=1:3, intensity=4:6, snr=4:6, metaData=list(a=1, b=3))) pNA <- c(createMassPeaks(mass=1:3, intensity=1:3, snr=1:3, metaData=list(a=1, b=2)), createMassPeaks(mass=1:2, intensity=4:5, snr=4:5, metaData=list(a=1, b=3))) meanP <- createMassPeaks(mass=1:3, intensity=(2:4)+0.5, snr=(2:4)+0.5, metaData=list(a=1, b=2:3)) meanPNA <- createMassPeaks(mass=1:3, intensity=c(2.5, 3.5, 1.5), snr=c(2.5, 3.5, 1.5), metaData=list(a=1, b=2:3)) sumP <- createMassPeaks(mass=1:3, intensity=c(5, 7, 9), snr=c(5, 7, 9), metaData=list(a=1, b=2:3)) test_that("mergeMassPeaks", { expect_equal(unname(mergeMassPeaks(list(p[[1]], p[[1]], p[[2]], p[[2]]), labels=c(1:2, 1:2))), list(meanP, meanP)) expect_equal(unname(mergeMassPeaks(pNA[rep(1:2, each=2)], labels=rep(1:2, times=2), ignore.na=FALSE)), list(meanPNA, meanPNA)) expect_equal(unname(mergeMassPeaks(list(p[[1]], p[[1]], p[[2]], p[[2]]), labels=c(1:2, 1:2), method="sum")), list(sumP, sumP)) expect_equal(unname(mergeMassPeaks(pNA[rep(1:2, each=2)], method="median", ignore.na=FALSE)), createMassPeaks(mass=1:3, intensity=c(2.5, 3.5, 1.5), snr=c(2.5, 3.5, 1.5), metaData=list(a=1, b=rep(2:3, each=2)))) }) test_that("mergeMassPeaks throws errors", { expect_error(mergeMassPeaks(1:3), "no list of MALDIquant::MassPeaks objects") expect_error(mergeMassPeaks(list()), "no list of MALDIquant::MassPeaks objects") expect_error(mergeMassPeaks(s), "no list of MALDIquant::MassPeaks objects") }) test_that(".mergeMassPeaks", { expect_equal(MALDIquant:::.mergeMassPeaks(p), meanP) expect_equal(MALDIquant:::.mergeMassPeaks(p, fun=colSums), sumP) }) test_that(".mergeMetaData", { l <- list(a=list(numbers=1:3, lists=list(a=1, b=2), characters=c("a", "b")), b=list(numbers=1:3, lists=list(a=1, b=2), characters=c("b", "c"))) r <- list(numbers=1:3, lists=list(a=1, b=2), characters=c("a", "b", "b", "c")) expect_identical(MALDIquant:::.mergeMetaData(l), r) l <- list(a=list(numbers=1:2, lists=list(a=1, b=2, d=4), characters=c("a", "b", "c")), b=list(numbers=1:3, lists=list(a=1, b=2), characters=c("b", "c"))) r <- list(numbers=c(1:2, 1:3), lists=list(list(a=1, b=2, d=4), list(a=1, b=2)), characters=c("a", "b", "c", "b", "c")) expect_identical(MALDIquant:::.mergeMetaData(l), r) }) MALDIquant/inst/tests/test_intensity-methods.R0000644000175000017500000000076012255044416022457 0ustar sebastiansebastiancontext("intensity") s <- createMassSpectrum(mass=1:10, intensity=11:20) test_that("intensity", { expect_identical(intensity(s), 11:20) expect_identical(intensity(s)[1:3], 11:13) }) test_that("intensity<- throws errors", { expect_error(intensity(s) <- LETTERS[1:10]) expect_error(intensity(s) <- 1, "have to be equal") }) test_that("intensity<-", { intensity(s) <- 1:10 expect_equal(intensity(s), 1:10) intensity(s)[5:10] <- 15:20 expect_equal(intensity(s), c(1:4, 15:20)) }) MALDIquant/inst/tests/test_intensityMatrix-functions.R0000644000175000017500000000175712255044416024220 0ustar sebastiansebastiancontext("intensityMatrix") p <- list(createMassPeaks(mass=1:4, intensity=11:14), createMassPeaks(mass=2:5, intensity=22:25)) s <- list(createMassSpectrum(mass=1:5, intensity=11:15), createMassSpectrum(mass=1:5, intensity=21:25)) m <- matrix(c(11:14, NA, NA, 22:25), byrow=T, ncol=5, nrow=2, dimnames=list(NULL, 1:5)) e <- matrix(c(11:15, 21:25), byrow=T, ncol=5, nrow=2, dimnames=list(NULL, 1:5)) test_that("intensityMatrix throws errors", { expect_error(intensityMatrix(p[[1]]), "no list of MALDIquant::MassPeaks objects") expect_error(intensityMatrix(list()), "no list of MALDIquant::MassPeaks objects") expect_error(intensityMatrix(p, list()), "no list of MALDIquant::MassSpectrum objects") expect_error(intensityMatrix(p, s[1]), "Incompatible number of spectra") }) test_that("intensityMatrix", { expect_identical(intensityMatrix(p), m) expect_equal(intensityMatrix(p, s), e) }) MALDIquant/inst/tests/test_filterPeaks-functions.R0000644000175000017500000001164312265240511023244 0ustar sebastiansebastiancontext("filterPeaks") p <- createMassPeaks(mass=1:5, intensity=1:5) l <- list(p, p[1:4], p[1:3], p[1:2]) test_that("filterPeaks throws errors", { expect_error(filterPeaks(p), "no list of MALDIquant::MassPeaks") expect_error(filterPeaks(list()), "no list of MALDIquant::MassPeaks") expect_error(filterPeaks(l, minFrequency=NA, minNumber=NA), " has to be a meaningful number") expect_error(filterPeaks(l=l, labels=as.factor("a"), minFrequency=1), "For each item in .*l.* there must be a label in .*labels.*") }) test_that("filterPeaks shows warnings", { expect_warning(filterPeaks(l, minFrequency=2), "Empty peak whitelist for level") expect_warning(filterPeaks(l, minFrequency=-1), " < 0 does not make sense! Using 0 instead") expect_warning(filterPeaks(l, minNumber=10), "Empty peak whitelist for level") expect_warning(filterPeaks(l, minNumber=-1), " < 0 does not make sense! Using 0 instead") expect_warning(filterPeaks(l, minFrequency=2/3, minNumber=2), " arguments are given. Choosing the higher one.") expect_warning(filterPeaks(l, minNumber=2, labels=c(1, 2, 2, 2)), "Empty peak whitelist for level") }) test_that("filterPeaks", { expect_identical(filterPeaks(l, minFrequency=1), list(p[1:2], p[1:2], p[1:2], p[1:2])) expect_identical(filterPeaks(l, minFrequency=0.5), list(p[1:4], p[1:4], p[1:3], p[1:2])) expect_identical(filterPeaks(l, minFrequency=0), l) expect_identical(filterPeaks(l, minFrequency=1, labels=factor(rep(letters[1:2], each=2), levels=letters[1:2])), list(p[1:4], p[1:4], p[1:2], p[1:2])) ## test unused levels expect_identical(filterPeaks(l, minFrequency=1, labels=factor(rep(letters[1:2], each=2), levels=letters[1:5])), list(p[1:4], p[1:4], p[1:2], p[1:2])) ## test numbers expect_identical(filterPeaks(l, minFrequency=1, labels=rep(1:2, each=2)), list(p[1:4], p[1:4], p[1:2], p[1:2])) ## test case for #22 (unexpected results for different number of technical ## replicates because using of floor(minFrequency)) expect_identical(filterPeaks(list(p, p[1:4], p[1:3], p, p[1:4], p[1:3], p[1:2]), minFrequency=2/3, labels=c(rep(1, 3), rep(2, 4))), list(p[1:4], p[1:4], p[1:3], p[1:3], p[1:3], p[1:3], p[1:2])) ## use absolute threshold expect_identical(filterPeaks(list(p, p[1:4], p[1:3], p, p[1:4], p[1:3], p[1:2]), minNumber=2, labels=c(rep(1, 3), rep(2, 4))), list(p[1:4], p[1:4], p[1:3], p[1:4], p[1:4], p[1:3], p[1:2])) ## test case for #26 (minNumber > n removes all peaks) ## since MALDIquant 1.8.16 min{Frequency,minNumber} could be vectors so this ## is not needed any more and we could use min{Frequency,Number} as feature to ## remove all peaks (or avoid the generation of a whitelist if ## mergeWhitelists=TRUE) expect_equal(suppressWarnings(filterPeaks(list(p, p[1:4], p), minNumber=2, labels=c(1, 2, 2))), list(createMassPeaks(double(), double()), p[1:4], p[1:4])) }) test_that("filterPeaks mergeWhitelists argument works", { p2 <- list( createMassPeaks(1:5, 1:5), createMassPeaks(1:4, 1:4), createMassPeaks(4:9, 4:9), createMassPeaks(4:8, 4:8), createMassPeaks(1:5, 1:5), createMassPeaks(2:6, 2:6)) expect_identical(filterPeaks(p2, minFrequency=1, labels=rep(1:3, each=2), mergeWhitelists=FALSE), c(p2[[2]], p2[[2]], p2[[4]], p2[[4]], createMassPeaks(2:5, 2:5), createMassPeaks(2:5, 2:5))) expect_identical(filterPeaks(p2, minFrequency=1, labels=rep(1:3, each=2), mergeWhitelists=TRUE), c(p2[1:2], p2[[4]], p2[[4]], p2[5:6])) expect_identical(suppressWarnings(filterPeaks(p2, minFrequency=c(1, 1, 2), labels=rep(1:3, each=2), mergeWhitelists=TRUE)), c(p2[1:2], p2[[4]], p2[[4]], p2[5:6])) ## test with different numbers and frequencies expect_identical(suppressWarnings(filterPeaks(p2, minFrequency=c(1, NA, NA), minNumber=c(NA, 3, 1), labels=rep(1:3, each=2), mergeWhitelists=TRUE)), c(p2[1:2], createMassPeaks(4:6, 4:6), createMassPeaks(4:6, 4:6), p2[5:6])) }) MALDIquant/inst/tests/test_detectPeaks-methods.R0000644000175000017500000000116412255044416022664 0ustar sebastiansebastiancontext("detectPeaks") s <- createMassSpectrum(mass=1:5, intensity=c(1, 2, 1, 2, 1)) test_that("detectPeaks shows warnings", { expect_warning(detectPeaks(createMassSpectrum(mass=double(), intensity=double()), "empty")) }) test_that("detectPeaks works with list of MassSpectrum objects", { expect_error(detectPeaks(list(x=1, y=1)), "no list of MALDIquant::MassSpectrum objects") expect_error(detectPeaks(list(s, createMassPeaks(1, 1)), "no list of MALDIquant::MassSpectrum objects")) p <- createMassPeaks(c(2, 4), c(2, 2), c(Inf, Inf)) }) MALDIquant/inst/tests/test_removeBaseline-methods.R0000644000175000017500000000401312255044416023364 0ustar sebastiansebastiancontext("removeBaseline") s <- createMassSpectrum(mass=1:20, intensity=rep(10:1, 2)) test_that("removeBaseline throws errors", { expect_error(removeBaseline(s, method="foobar"), ".*arg.* should be one of .*SNIP.*, .*ConvexHull.*, .*median.*") }) test_that("removeBaseline shows warnings", { expect_warning(estimateBaseline( createMassSpectrum(mass=double(), intensity=double()), "empty")) }) test_that("removeBaseline works with ConvexHull", { expect_equal(removeBaseline(s, method="ConvexHull"), createMassSpectrum(mass=1:20, intensity=c(rep(0, 10), 9:0))) }) test_that("removeBaseline works with median", { ## halfWindowSize expect_error(removeBaseline(s, method="median", halfWindowSize=0), "too small") expect_error(removeBaseline(s, method="median"), "too large") expect_equal(removeBaseline(s, method="median", halfWindowSize=2), createMassSpectrum(mass=1:20, intensity=c(rep(0, 8), -1:-2, 2:1, rep(0, 8)))) }) test_that("removeBaseline works with SNIP", { expect_equal(removeBaseline(s, iterations=2), createMassSpectrum(mass=1:20, intensity=c(rep(0, 10), 7.5, 5, 2.5, rep(0, 7)))) expect_equal(removeBaseline(s, method="SNIP", iterations=2), createMassSpectrum(mass=1:20, intensity=c(rep(0, 10), 7.5, 5, 2.5, rep(0, 7)))) }) test_that("removeBaseline works with list of MassSpectrum objects", { expect_error(removeBaseline(list(x=1, y=1)), "no list of MALDIquant::MassSpectrum objects") expect_error(removeBaseline(list(s, createMassPeaks(1, 1)), "no list of MALDIquant::MassSpectrum objects")) r <- createMassSpectrum(mass=1:20, intensity=c(rep(0, 10), 7.5, 5, 2.5, rep(0, 7))) expect_equal(removeBaseline(list(s, s), iterations=2), list(r, r)) }) MALDIquant/inst/tests/test_unlist-functions.R0000644000175000017500000000035712255044416022316 0ustar sebastiansebastiancontext(".unlist") test_that(".unlist doesn't work recursive", { expect_identical(MALDIquant:::.unlist(list(a=list(a=1:3, b=4:6), b=list(c=7:9))), list(1:3, 4:6, 7:9)) }) MALDIquant/inst/tests/test_isRegular-methods.R0000644000175000017500000000100612255044416022360 0ustar sebastiansebastiancontext("isRegular") test_that("isRegular", { expect_false(isRegular(createMassSpectrum(double(), double()))) expect_false(isRegular(createMassSpectrum(double(1), double(1)))) expect_false(isRegular(createMassSpectrum(double(2), double(2)))) expect_true(isRegular(createMassSpectrum(double(3), double(3)))) expect_true(isRegular(createMassSpectrum(1:10, 1:10))) expect_false(isRegular(createMassSpectrum((1:10)[-8], 1:9))) expect_true(isRegular(createMassSpectrum((1:10)[-8], 1:9), threshold=0.15)) }) MALDIquant/R/0000755000175000017500000000000012265246071013667 5ustar sebastiansebastianMALDIquant/R/as.matrix-methods.R0000644000175000017500000000204512237174303017357 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="as.matrix", signature=signature(x="AbstractMassObject"), definition=function(x, index) { return(matrix(c(x@mass[index], x@intensity[index]), ncol=2L, byrow=FALSE, dimnames=list(NULL, c("mass", "intensity")))) }) MALDIquant/R/smoothIntensity-methods.R0000644000175000017500000000362012221110641020655 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="smoothIntensity", signature=signature(object="MassSpectrum"), definition=function(object, method=c("SavitzkyGolay", "MovingAverage"), halfWindowSize, ...) { ## empty spectrum? if (.isEmptyWarning(object)) { return(object) } method <- match.arg(method) switch(method, "SavitzkyGolay" = { fun <- .savitzkyGolay if (missing(halfWindowSize)) { halfWindowSize <- 10L } }, "MovingAverage" = { fun <- .movingAverage if (missing(halfWindowSize)) { halfWindowSize <- 2L } }, { stop("Unknown ", sQuote("method"), ".") } ) return(.transformIntensity(object, fun=fun, halfWindowSize=halfWindowSize, ...)) }) ## list setMethod(f="smoothIntensity", signature=signature(object="list"), definition=function(object, ...) { ## test arguments .stopIfNotIsMassSpectrumList(object) return(.mapply(smoothIntensity, object, ...)) }) MALDIquant/R/grouper-functions.R0000644000175000017500000001020012211651271017465 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## grouper functions called by .binPeaks ## .grouperStrict ## strict grouping function ## Don't allow peaks of one sample in the same bin. ## ## params: ## mass: double, sorted mass ## intensities: double, corresponding intensities ## samples: double, corresponding sample id numbers ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## ## returns: ## NA if further splitting is needed ## meanMass (double) if all criteria are matched ## .grouperStrict <- function(mass, intensities, samples, tolerance) { ## don't accept two or more peaks of the same sample if (anyDuplicated(samples)) { return(NA) } meanMass <- mean(mass) ## all peaks in range? if (any(abs(mass-meanMass)/meanMass > tolerance)) { return(NA) } return(meanMass) } ## .grouperRelaxed ## relaxed grouping function (more than one peak of one sample per bin possible) ## choose highest peak in range. ## ## params: ## mass: double, sorted mass ## intensities: double, corresponding intensities ## samples: double, corresponding sample id numbers ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## meanMass: double, mean of mass (new peak position) ## ## returns: ## NA if further splitting is needed ## meanMass (double) if all criteria are matched ## .grouperRelaxed <- function(mass, intensities, samples, tolerance) { meanMass <- mean(mass) ## all peaks in range? if (any(abs(mass-meanMass)/meanMass > tolerance)) { return(NA) } ## choose highest peak in duplicates if (anyDuplicated(samples)) { s <- sort(intensities, method="quick", decreasing=TRUE, index.return=TRUE) samples <- samples[s$ix] noDup <- !duplicated(samples) noDup[s$ix] <- noDup ## replace mass corresponding to highest intensity mass[noDup] <- mean(mass[noDup]) return(mass) } else { return(meanMass) } } ## .grouperRelaxedHighestAtReference ## relaxed grouping function (more than one peak of one sample per bin possible) ## Choose highest test sample peaks in range around a reference peak. ## ## params: ## mass: double, sorted mass ## intensities: double, corresponding intensities ## samples: double, corresponding sample id numbers (1==reference) ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## ## returns: ## NA if further splitting is needed ## meanMass (double) if all criteria are matched else 0 ## .grouperRelaxedHighestAtReference <- function(mass, intensities, samples, tolerance) { ## any reference peaks in current samples? ref <- samples == 1L nRef <- sum(ref) if (nRef == 0L) { ## no reference peak return(0L) } else if (nRef > 1L) { ## too many reference peaks => further splitting needed return(NA) } ## only one mass should left as reference mass meanMass <- mass[ref] ## all peaks in range? if (any(abs(mass-meanMass)/meanMass > tolerance)) { return(NA) } ## choose highest peak in duplicates if (anyDuplicated(samples)) { s <- sort(intensities, method="quick", decreasing=TRUE, index.return=TRUE) sSamples <- samples[s$ix] noDup <- !duplicated(sSamples) sMass <- double(length(sSamples)) sMass[noDup] <- meanMass mass[s$ix] <- sMass return(mass) } else { return(meanMass) } } MALDIquant/R/isValidHalfWindowSize-functions.R0000644000175000017500000000253312211651271022225 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .stopIfNotIsValidHalfWindowSize ## test for too small/large half window size ## ## params: ## halfWindowSize: half window size ## n: length of data ## ## returns: ## TRUE if valid ## .stopIfNotIsValidHalfWindowSize <- function(halfWindowSize, n) { parentCall <- deparse(sys.call(-1L)) if (halfWindowSize < 1L) { stop(parentCall, " : ", sQuote("halfWindowSize"), " is too small!", call.=FALSE) } windowSize <- halfWindowSize*2L+1L if (windowSize > n) { stop(parentCall, " : ", sQuote("halfWindowSize"), " is too large!", call.=FALSE) } return(TRUE) } MALDIquant/R/memoryUsage-functions.R0000644000175000017500000000216612211651271020313 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .memoryUsageStr.object_size ## pretty string of memory usage ## ## params: ## x: object_size ## ## returns: ## character ## .memoryUsageStr <- function(x) { os <- object.size(x) iec <- c("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB") l <- trunc(log(os)/log(1024L)) i <- pmin(l+1L, 9L) return(paste(round(os/(1024L^l), digits=3L), iec[i])) } MALDIquant/R/snr-methods.R0000644000175000017500000000163312207737163016263 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassPeaks setMethod(f="snr", signature=signature(object="MassPeaks"), definition=function(object) { return(object@snr) }) MALDIquant/R/constructor-functions.R0000644000175000017500000000331512264023334020401 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum ## createMassSpectrum ## default constructor: MassSpectrum class ## ## params: ## mass: vector, spectrum mass ## intensity: vector, spectrum intensities ## metaData: list, metadata ## ## returns: ## a MassSpectrum object ## createMassSpectrum <- function(mass, intensity, metaData=list()) { return(new(Class="MassSpectrum", mass=mass, intensity=intensity, metaData=metaData)) } ## end of MassSpectrum ## MassPeaks ## createMassPeaks ## default constructor: MassPeaks class ## ## params: ## mass: vector, spectrum mass ## intensity: vector, spectrum intensities ## metaData: list, metadata ## ## returns: ## a MassPeaks object ## createMassPeaks <- function(mass, intensity, snr=as.double(rep(NA, length(intensity))), metaData=list()) { return(new(Class="MassPeaks", mass=mass, intensity=intensity, snr=snr, metaData=metaData)) } ## end of MassPeaks MALDIquant/R/isMassObjectList-functions.R0000644000175000017500000000441512237172570021247 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see .isMassObjectList <- function(x) { if (!is.list(x)) { return(FALSE) } areMassObjects <- length(x) && all(unname(vapply(x, .isMassObject, logical(1L)))) return(areMassObjects) } .stopIfNotIsMassObjectList <- function(x) { if (!.isMassObjectList(x)) { parentCall <- deparse(sys.call(-1L)) stop(parentCall, " : ", sQuote(deparse(substitute(x))), " is no list of MALDIquant::AbstractMassObject objects!", call.=FALSE) return(FALSE) } return(TRUE) } isMassSpectrumList <- function(x) { if (!is.list(x)) { return(FALSE) } areMassSpectrumObjects <- length(x) && all(unname(vapply(x, isMassSpectrum, logical(1L)))) return(areMassSpectrumObjects) } .stopIfNotIsMassSpectrumList <- function(x) { if (!isMassSpectrumList(x)) { parentCall <- deparse(sys.call(-1L)) stop(parentCall, " : ", sQuote(deparse(substitute(x))), " is no list of MALDIquant::MassSpectrum objects!", call.=FALSE) return(FALSE) } return(TRUE) } isMassPeaksList <- function(x) { if (!is.list(x)) { return(FALSE) } areMassPeaksObjects <- length(x) && all(unname(vapply(x, isMassPeaks, logical(1L)))) return(areMassPeaksObjects) } .stopIfNotIsMassPeaksList <- function(x) { if (!isMassPeaksList(x)) { parentCall <- deparse(sys.call(-1L)) stop(parentCall, " : ", sQuote(deparse(substitute(x))), " is no list of MALDIquant::MassPeaks objects!", call.=FALSE) return(FALSE) } return(TRUE) } MALDIquant/R/determineWarpingFunctions-functions.R0000644000175000017500000001611312213060522023203 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## determineWarpingFunctions ## calculates warping functions for each MassPeaks object ## ## params: ## l: list, list of MassPeaks objects ## reference: MassPeaks, a reference MassPeaks object to which all other ## MassPeaks objects should be aligned ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## method: choose type of base warping function ## plot: logical, plots warping function ## ## returns: ## a list of warping functions ## determineWarpingFunctions <- function(l, reference, tolerance=0.002, method=c("lowess", "linear", "quadratic", "cubic"), plot=FALSE, plotInteractive=FALSE, ..., warpingFunction ## deprecated ) { ## test arguments if (!isMassPeaksList(l) && !isMassPeaks(l)) { stop(sQuote("l"), " is no list of MALDIquant::MassPeaks objects!") } if (!missing(warpingFunction)) { .deprecatedArgument("1.7.12", "warpingFunction", "method") warpingFunction <- match.fun(warpingFunction) } else { method <- match.arg(method) warpingFunction <- switch(method, "lowess" = { .warpingFunctionLowess }, "linear" = { .warpingFunctionLinear }, "quadratic" = { .warpingFunctionQuadratic }, "cubic" = { .warpingFunctionCubic }, { stop("Unknown ", sQuote("method"), ".") } ) } optArgs <- list(...) ## find reference peaks if (missing(reference)) { arguments <- list(l=l, tolerance=tolerance) argumentNames <- c("method", "minFrequency") arguments <- modifyList(arguments, optArgs[argumentNames]) optArgs[argumentNames] <- NULL reference <- do.call(referencePeaks, arguments) } if (isEmpty(reference)) { stop("Reference MassPeaks object contains no peaks!") } ## fetch plot.default arguments (debug plot) if (plot) { plotNames <- c("xlim", "ylim", "xlab", "ylab", "type", "lwd", "col", "col.sub", "cex.main", "cex.sub", "main", "sub") givenPlotArgs <- optArgs[plotNames] optArgs[plotNames] <- NULL } ## reference has to become sample no 1 tmpPeakList <- c(reference, l) ## same procedure as in binPeaks ## fetch all mass mass <- unname(.unlist(lapply(tmpPeakList, function(x)x@mass))) ## fetch all intensities intensities <- .unlist(lapply(tmpPeakList, function(x)x@intensity)) ## store original mass sample number/id samples <- .unlist(lapply(1L:length(tmpPeakList), function(x) { return(rep(x, length(tmpPeakList[[x]]))) })) ## sort values by mass s <- sort(mass, method="quick", index.return=TRUE) mass <- s$x intensities <- intensities[s$ix] samples <- samples[s$ix] ## run peak binning and use relaxed grouper which choose the highest test ## sample peaks binnedMass <- .binPeaks(mass=mass, intensities=intensities, samples=samples, tolerance=tolerance, grouper=.grouperRelaxedHighestAtReference) ## group mass/intensities by sample ids lIdx <- tapply(X=1L:length(binnedMass), INDEX=samples, FUN=function(x) { return(x) }) ## calculate differences binnedMass[binnedMass == 0L] <- NA d <- binnedMass-mass ## each function which determines a warping function uses these 3 arguments arguments <- list(x=NULL, d=NULL) if (length(optArgs)) { arguments <- c(arguments, optArgs) } ## determine warping functions warpingFunctions <- lapply(lIdx[-1L], function(i) { ## fetch changed mass == aligned peaks notNA <- !is.na(binnedMass[i]) arguments$x <- mass[i][notNA] ## original mass arguments$d <- d[i][notNA] ## difference to reference if (!length(arguments$x)) { stop("Could not match any peak in spectrum ", samples[i[1L]]-1L, " to a reference peak.") } w <- do.call(warpingFunction, arguments) return(w) }) ## clean misleading names (names == idx+1 because reference is idx == 1) names(warpingFunctions) <- NULL ## debug plot if (plot) { ## non interactive device (pdf, png, ...) available? isNonInteractivePlot <- dev.cur() != 1L && !dev.interactive() if (!isNonInteractivePlot && !plotInteractive) { warning(sQuote("plot"), " is ", sQuote("TRUE"), " but no non-interactive devices is available. ", "Using pdf() to create a default one.") pdf(paper="a4r", width=12) } else if (dev.cur() == 1 && plotInteractive) { warning(sQuote("plot"), " is ", sQuote("TRUE"), " but no interactive devices is available. ", "Using dev.new() to create a default one.") dev.new() } ## set default plot arguments plotArgsDefaults <- list(xlim=range(mass), ylim=range(d, na.rm=TRUE), xlab="mass", ylab="difference", type="p", lwd=1L, col=1L, cex.main=0.8, cex.sub=0.75, col.sub="#808080") plotArgs <- modifyList(plotArgsDefaults, givenPlotArgs) nReference <- length(reference) x <- plotArgs$xlim[1L]:plotArgs$xlim[2L] ## workaround to avoid error: ## Error in l[[i]] : this S4 class is not subsettable if (!is.list(l)) { l <- list(l) } for (i in seq(along=l)) { ## fetch changed mass == aligned peaks notNA <- !is.na(binnedMass[lIdx[[i+1L]]]) if (is.null(givenPlotArgs$main)) { plotArgs$main <- paste0("sample ", i, " vs reference\n", "(matched peaks: ", sum(notNA), "/", nReference, ")") } if (is.null(givenPlotArgs$sub)) { plotArgs$sub <- l[[i]]@metaData$file } ## plot reference vs sample plotArgs$x <- l[[i]]@mass[notNA] plotArgs$y <- d[lIdx[[i+1L]]][notNA] do.call(plot.default, plotArgs) ## draw warping function lines(x, warpingFunctions[[i]](x), lwd=plotArgs$lwd, col=plotArgs$col) } if (!isNonInteractivePlot && !plotInteractive) { dev.off() } } return(warpingFunctions) } MALDIquant/R/deprecated-functions.R0000644000175000017500000000507112213060522020107 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .deprecated ## mark a function as deprecated ## throw an error if current major version or minor is larger than major, or ## minor+1; if minor == minor+1L wrote warning; otherwise message ## ## params: ## version: last working version ## ...: arguments to be passed to stop, warning, message ## ## returns: ## nothing ## .deprecated <- function(version, ...) { current <- packageVersion("MALDIquant") version <- as.package_version(version) if (current$major > version$major || current$minor > version$minor + 1L) { stop(..., call.=FALSE) } else if (current$minor > version$minor) { warning(..., call.=FALSE) } else { message(...) } invisible() } ## .deprecatedFunction ## mark a function as deprecated and show default message ## ## params: ## version: last working version ## old: old function ## new: new function ## ## returns: ## nothing ## .deprecatedFunction <- function(version, old, new) { if (missing(old)) { old <- parentCall <- sys.call(-1L)[[1]] } msg <- paste0("\"", old , "\" is deprecated.") if (!missing(new)) { msg <- paste0(msg, "\nUse \"", new, "\" instead. See help(\"", new ,"\").") } return(.deprecated(version, msg)) } ## .deprecatedArgument ## mark an function as deprecated and show default message ## ## params: ## version: last working version ## old: old argument ## new: new argument ## help: help file ## ## returns: ## nothing ## .deprecatedArgument <- function(version, old, new, help) { msg <- paste0("Argument \"", old, "\" is deprecated.") if (!missing(new)) { if (missing(help)) { parentCall <- sys.call(-1L)[[1]] } else { parentCall <- call(help)[[1]] } msg <- paste0(msg, "\nUse \"", new, "\" instead. See help(\"", deparse(parentCall),"\").") } return(.deprecated(version, msg)) } MALDIquant/R/approxfun-methods.R0000644000175000017500000000232712211651271017472 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="approxfun", signature=signature(x="MassSpectrum"), definition=function(x, y=NULL, method="linear", yleft, yright, rule=1L, f=0L, ties=mean) { if (isEmpty(x)) { return(function(x) { return(rep(NA, length.out=length(x))) }) } else { return(approxfun(x=x@mass, y=x@intensity, method=method, yleft=yleft, yright=yright, rule=rule, f=f, ties=ties)) } }) MALDIquant/R/calculateLabelPositions-methods.R0000644000175000017500000001024412211651271022252 0ustar sebastiansebastian## Copyright 2012 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .calculateLabelPositions ## calculate label positions to avoid collisions ## ## params: ## x: original x coordinates for labels ## y: original y coordinates for labels ## peakLabels: peak labels ## adj: text alignment ?par("adj") ## cex: font size ?par("cex") ## maxSteps: max tries to avoid collisons ## ## returns: ## a matrix of coordinates ## setMethod(f=".calculateLabelPositions", signature=signature(object="MassPeaks"), definition=function(object, x, y, peakLabels, adj, cex, maxSteps=100L) { ## start with smallest peak i <- sort(y, index.return=TRUE, method="quick")$ix ## calculate label rectangles rects <- .textLabelRects(x[i], y[i], peakLabels[i], adj=adj, cex=cex) ## move rectangles around to avoid collisons for (j in seq(along=x)) { rects[j, ] <- .testLabelOverlap(object, rects, currentIndex=j, maxSteps=maxSteps) } ## undo sorting rects[i, ] <- rects return(list(x=rects[, "x"], y=rects[, "y"], xleft=rects[, "x0"], ybottom=rects[, "y0"], xright=rects[, "x1"], ytop=rects[, "y1"])) }) ## .testLabelOverlap ## try to avoid overlap/collisions ## ## params: ## rects: a matrix of coordinates (created by .textRects) ## currentIndex: which coordinates should moved around ## maxSteps: max tries to avoid collisons ## ## returns: ## a vector of coordinates ## setMethod(f=".testLabelOverlap", signature=signature(object="MassPeaks"), definition=function(object, rects, currentIndex, maxSteps) { r <- pi/180L*c(90, as.vector(rbind(seq(80L, 40L, by=-10L), seq(100L, 140L, by=10L)))) for (k in 0L:maxSteps) { ## move up cur <- rects[currentIndex, ] cur[c("y0", "y1", "y")] <- cur[c("y0", "y1", "y")] + k * cur[c("h")] isOverlapped <- .labelOverlap(object, cur, rects[1L:(currentIndex-1L), ]) if (isOverlapped) { for (l in r) { ## move in curve oldcur <- cur cur[c("y0", "y1", "y")] <- cur[c("y0", "y1", "y")] + sin(l) * cur[c("h")] cur[c("x0", "x1", "x")] <- cur[c("x0", "x1", "x")] + cos(l) * cur[c("w")] isOverlapped <- .labelOverlap(object, cur, rects[1L:(currentIndex-1L), ]) if (!isOverlapped) { ## success return(cur) } cur <- oldcur } } else { ## success return(cur) } } ## no success, return original pos return(rects[currentIndex, ]) }) ## .labelOverlap ## does current rect overlap any other one? ## ## params: ## cur: vector of coordinates (which should test agains 'rects') ## rects: a matrix of coordinates (created by .textRects) ## ## returns: ## TRUE/FALSE ## setMethod(f=".labelOverlap", signature=signature(object="MassPeaks"), definition=function(object, cur, rects) { x <- cur[c(1L, 3L)] y <- cur[c(2L, 4L)] rects <- matrix(rects, ncol=8L) ## peak overlap? peakOverlap <- any(x[1L] <= object@mass & x[2L] >= object@mass & y[1L] <= object@intensity) if (peakOverlap) { return(TRUE) } ## text overlap? textOverlap <- any(((x[1L] > rects[, 1L] & x[1L] < rects[, 3L]) | (x[2L] > rects[, 1L] & x[2L] < rects[, 3L]) | (x[1L] < rects[, 1L] & x[2L] > rects[, 3L])) & ((y[1L] > rects[, 2L] & y[1L] < rects[, 4L]) | (y[2L] > rects[, 2L] & y[2L] < rects[, 4L]) | (y[1L] < rects[, 2L] & y[2L] > rects[, 4L]))) return(textOverlap) }) MALDIquant/R/as.matrix-functions.R0000644000175000017500000000316512265240603017726 0ustar sebastiansebastian## Copyright 2013-2014 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .as.matrix.MassObjectList ## internal function to convert a list of AbstractMassObject objects into a ## matrix ## ## params: ## l: list of AbstractMassObject objects ## ## returns: ## a matrix .as.matrix.MassObjectList <- function(l) { .stopIfNotIsMassObjectList(l) mass <- sort(x=.unlist(lapply(l, function(x)x@mass)), method="quick") uniqueMass <- unique(mass) ## build matrix m <- do.call(rbind, lapply(l, function(x) { return(x@intensity[match(x=uniqueMass, table=x@mass, nomatch=NA)])})) ## set column names dimnames(m) <- list(NULL, c(uniqueMass)) return(m) } ## .as.binary.matrix ## internal function to convert a matrix with NA to a binary one ## ## params: ## m: matrix ## ## returns: ## a binary matrix .as.binary.matrix <- function(m) { stopifnot(is.matrix(m)) isNA <- which(is.na(m)) m[] <- 1L m[isNA] <- 0L return(m) } MALDIquant/R/estimateNoise-functions.R0000644000175000017500000000271712112111745020626 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## estimateNoiseMad ## estimate noise by calculating mad over intensity values ## ## params: ## x: vector of x values ## y: vector of y values ## ## returns: ## a matrix of the estimate noise (col1: mass; col2: intensity) ## .estimateNoiseMad <- function(x, y) { return(cbind(x, rep(stats::mad(y), times=length(x)))) } ## estimateNoiseSuperSmoother ## estimate noise by using Friedman's super smoother ## ## params: ## x: vector of x values ## y: vector of y values ## ...: further arguments to passed to supsmu ## ## returns: ## a matrix of the estimate noise (col1: mass; col2: intensity) ## .estimateNoiseSuperSmoother <- function(x, y, ...) { return(cbind(x, stats::supsmu(x=x, y=y, ...)$y)) } MALDIquant/R/removeBaseline-methods.R0000644000175000017500000000417312221110641020401 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="removeBaseline", signature=signature(object="MassSpectrum"), definition=function(object, method=c("SNIP", "TopHat", "ConvexHull", "median"), fun, ## deprecated ...) { ## empty spectrum? if (.isEmptyWarning(object)) { return(object) } ## try to use user-defined baseline estimation function if (!missing(fun)) { .deprecatedArgument("1.7.12", old="fun", new="method", help="removeBaseline") fun <- match.fun(fun) baseline <- fun(object@mass, object@intensity, ...) ## wrong baseline argument given? isBaselineMatrix <- is.matrix(baseline) && nrow(baseline) == length(object) && ncol(baseline) == 2 if (!isBaselineMatrix) { stop("The baseline is not a valid matrix!") } } else { ## estimate baseline baseline <- estimateBaseline(object=object, method=method, ...) } ## substract baseline object@intensity <- object@intensity - baseline[, 2L] return(object) }) ## list setMethod(f="removeBaseline", signature=signature(object="list"), definition=function(object, ...) { ## test arguments .stopIfNotIsMassSpectrumList(object) return(.mapply(removeBaseline, object, ...)) }) MALDIquant/R/mapply-functions.R0000644000175000017500000000207012221110641017302 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .mapply ## wrapper for mapply with different defaults ## ## params: ## see ?mapply ## ## returns: ## see ?mapply ## .mapply <- function(FUN, ..., MoreArgs=NULL, SIMPLIFY=FALSE, USE.NAMES=FALSE) { return(mapply(FUN=FUN, ..., MoreArgs=MoreArgs, SIMPLIFY=SIMPLIFY, USE.NAMES=USE.NAMES)) } MALDIquant/R/averageMassSpectra-functions.R0000644000175000017500000000532512213060522021571 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## averageMassSpectra ## averages MassSpectrum objects ## ## params: ## l: list of MassSpectrum objects ## labels: factor, labels for samples ## method: aggregation method ## ## returns: ## a new MassSpectrum object or a list of new MassSpectra objects ## averageMassSpectra <- function(l, labels, method=c("mean", "median", "sum")) { ## test parameters .stopIfNotIsMassSpectrumList(l) method <- match.arg(method) fun <- switch(method, "mean" = { colMeans }, "median" = { .colMedians }, "sum" = { colSums }, { stop("Unknown ", sQuote("method"), ".") } ) return(.doByLabels(l=l, labels=labels, FUN=.averageMassSpectra, fun=fun)) } ## .averageMassSpectra ## average MassSpectrum objects ## ## params: ## l: list of MassSpectrum objects ## fun: aggregation function ## ignore.na: ignore NA/set them to 0 ## ## returns: ## a new MassSpectrum object ## .averageMassSpectra <- function(l, fun=colMeans, mergeMetaData=TRUE) { fun <- match.fun(fun) ## merge metaData if (mergeMetaData) { metaData <- .mergeMetaData(lapply(l, function(x)x@metaData)) } else { metaData <- list() } ## use the first non empty spectrum as reference i <- which(!vapply(l, isEmpty, logical(1L)))[1L] if (!is.na(i)) { mass <- l[[i]]@mass } else { mass <- NA } ## interpolate not existing masses approxSpectra <- lapply(l, approxfun) ## get interpolated intensities intensityList <- lapply(approxSpectra, function(x)x(mass)) ## create a matrix which could merged m <- do.call(rbind, intensityList) ## merge intensities intensity <- fun(m, na.rm=TRUE) ## create an empty spectrum if all intensities are NaN if (is.nan(intensity[1L])) { intensity <- double() mass <- double() } return(createMassSpectrum(mass=mass, intensity=intensity, metaData=metaData)) } MALDIquant/R/textLabelRects-functions.R0000644000175000017500000000303612211651271020740 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .textLabelRects ## calculate label rectangles ## ## params: ## x: original x coordinates for labels ## y: original y coordinates for labels ## text: peak labels ## adj: text alignment ?par("adj") ## cex: font size ?par("cex") ## offset: offset ## ## returns: ## a matrix of coordinates ## .textLabelRects <- function(x, y, text, adj, cex, offset=c(0.0, 0.2)) { return(t(mapply(function(xc, yc, t) { w <- strwidth(t, cex=cex) h <- strheight(t, cex=cex) ## extra calculation of offsets to be independend of adj woffset <- w*offset[1L] hoffset <- h*offset[2L] return(c(x0=xc-w*adj[1L]-woffset, y0=yc-h*adj[2L]-hoffset, x1=xc+w*(1L-adj[1L])+woffset, y1=yc+h*(1L-adj[2L])+hoffset, x=xc, y=yc, w=w, h=h)) }, xc=x, yc=y, t=text))) } MALDIquant/R/labelPeaks-methods.R0000644000175000017500000000604612211651271017515 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see setMethod(f="labelPeaks", signature=signature(object="MassPeaks"), definition=function(object, index, mass, labels, digits=3L, underline=TRUE, ## verticalOffset ca. 0.01 of plot height verticalOffset=abs(diff(par("usr")[3L:4L]))*0.01, absoluteVerticalPos, adj=c(0.5, 0L), cex=0.7, avoidOverlap=FALSE, arrowLength=0L, arrowLwd=0.5, arrowCol=1L, ...) { ## index if (missing(index) && missing(mass)) { index <- 1L:length(object@mass) } else if (!missing(index) && is.logical(index)) { index <- which(index) } if (!missing(mass) && is.numeric(mass)) { massIdx <- .which.closest(mass, object@mass) if (missing(index)) { index <- massIdx } else { index <- c(index, massIdx) } ## remove duplicated indices index <- unique(index) } isValidIndex <- length(index) && length(index) <= length(object@mass) && (min(index) >= 1L && max(index) <= length(object@mass)) if (!isValidIndex) { stop("No valid ", sQuote("index"), " nor ", sQuote("mass"), " given.") } x <- object@mass[index] ## labels if (missing(labels)) { labels <- round(x=x, digits=digits) } else if (!missing(labels) && length(index) != length(labels)) { stop("Lenghts of ", sQuote("index"), "/", sQuote("mass"), " and ", sQuote("labels"), " have to be equal.") } if (underline) { labels <- as.expression(sapply(labels, function(x)substitute(underline(a), list(a=x)))) } if (missing(absoluteVerticalPos)) { y <- object@intensity[index]+verticalOffset } else { y <- absoluteVerticalPos } if (avoidOverlap) { ## inspired by Ian Fellows' wordcloud::wordlayout p <- .calculateLabelPositions(object, x, y, labels, adj=adj, cex=cex) ## create arrows from label to peak arrows(x0=p$x, y0=p$y, x1=x, y1=y, col=arrowCol, length=arrowLength, lwd=arrowLwd) ## no transparent background rect(xleft=p$xleft, ybottom=p$ybottom, xright=p$xright, ytop=p$ytop, col="white", border=NA, density=-1L) x <- p$x y <- p$y } text(x=x, y=y, labels=labels, adj=adj, cex=cex, ...) }) MALDIquant/R/show-functions.R0000644000175000017500000000215412211651271016773 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .prepareShowGroupName ## prepares a group name for show (appends numbers to name if needed) ## ## params: ## x: vector ## name: group name ## ## returns: ## .prepareShowGroupName <- function(x, name) { if (!is.null(x)) { n <- length(x) if (n > 1L) { name <- paste0(name, 1L:n) } } else { name <- NULL } return(name) } MALDIquant/R/removeEmptyMassObjects-functions.R0000644000175000017500000000226112211651271022464 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## removeEmptyMassObjects ## find and remove empty AbstractMassObject objects in a MassObjectsList ## ## params: ## l: list of AbstractMassObject objects ## ## returns: ## a list without empty objects ## removeEmptyMassObjects <- function(l) { .stopIfNotIsMassObjectList(l) ## find empty MassPeaks objects notEmpty <- !(1L:length(l) %in% findEmptyMassObjects(l)) ## exclude empty elements return(l[notEmpty]) } MALDIquant/R/isEmpty-methods.R0000644000175000017500000000266612211651271017110 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="isEmpty", signature=signature(x="AbstractMassObject"), definition=function(x) { return(length(x@intensity) == 0L || sum(as.double(x@intensity), na.rm=TRUE) == 0L) }) setMethod(f=".isEmptyWarning", signature=signature(x="AbstractMassObject"), definition=function(x) { if (isEmpty(x)) { msg <- paste0(class(x)[1L], " object") if (!is.null(x@metaData$file)) { msg <- paste0(msg, " (file: ", x@metaData$file, ")") } parentCall <- sys.call(-1L) warning("In ", deparse(parentCall), " : ", msg, " is empty!", call.=FALSE) return(TRUE) } return(FALSE) }) MALDIquant/R/totalIonCurrent-methods.R0000644000175000017500000000210312211651271020574 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="totalIonCurrent", signature=signature(object="MassSpectrum"), definition=function(object) { left <- as.double(head(object@intensity, -1L)) right <- as.double(tail(object@intensity, -1L)) return(as.double(sum((left+right)/2*diff(object@mass), na.rm=TRUE))) }) MALDIquant/R/smoothingFilters-functions.R0000644000175000017500000000744612211652226021365 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .movingAverage ## runs a simple 2-side moving average. ## ## params: ## y: double, intensity values ## halfWindowSize integer, half window size. ## ## returns: ## double ## .movingAverage <- function(y, halfWindowSize=2L) { .stopIfNotIsValidHalfWindowSize(halfWindowSize, n=length(y)) windowSize <- 2L*halfWindowSize+1L return(.filter(y, hws=halfWindowSize, coef=matrix(1L/windowSize, nrow=windowSize, ncol=windowSize))) } ## .savitzkyGolay ## runs a savitzky golay filter ## ## Savitzky, A., & Golay, M. J. (1964). Smoothing and differentiation of data ## by simplified least squares procedures. Analytical chemistry, 36(8), 1627-1639. ## ## params: ## y: double, intensity values ## halfWindowSize: integer, half window size. ## polynomialOrder: integer, polynomial order of sg-filter ## ## returns: ## double ## .savitzkyGolay <- function(y, halfWindowSize=10L, polynomialOrder=3L) { .stopIfNotIsValidHalfWindowSize(halfWindowSize, n=length(y)) windowSize <- 2L*halfWindowSize+1L if (windowSize < polynomialOrder) { stop("The window size has to be larger than the polynomial order.") } return(.filter(y, hws=halfWindowSize, coef=.savitzkyGolayCoefficients(m=halfWindowSize, k=polynomialOrder))) } ## .savitzkyGolayCoefficients ## ## Savitzky, A., & Golay, M. J. (1964). Smoothing and differentiation of data ## by simplified least squares procedures. Analytical chemistry, 36(8), 1627-1639. ## ## Implementation based on: ## Steinier, J., Termonia, Y., & Deltour, J. (1972). Comments on Smoothing and ## differentiation of data by simplified least square procedure. ## Analytical Chemistry, 44(11), 1906-1909. ## ## Implemention of left/right extrema based on: ## sgolay in signal 0.7-3/R/sgolay.R by Paul Kienzle ## modified by Sebastian Gibb ## ## params: ## m: integer, half window size ## k: integer, polynomial order (k == 0 = moving average) .savitzkyGolayCoefficients <- function(m, k=3L) { k <- 0L:k nm <- 2L*m+1L nk <- length(k) K <- matrix(k, nrow=nm, ncol=nk, byrow=TRUE) ## filter is applied to -m:m around current data point ## to avoid removing (NA) of left/right extrema ## lhs: 0:2*m ## rhs: (n-2m):n ## filter matrix contains 2*m+1 rows ## row 1:m == lhs coef ## row m+1 == typical sg coef ## row (n-m-1):n == rhs coef F <- matrix(double(), nrow=nm, ncol=nm) for (i in 1L:(m+1L)) { M <- matrix((1L:nm)-i, nrow=nm, ncol=nk, byrow=FALSE) X <- M^K T <- solve(t(X) %*% X) %*% t(X) F[i, ] <- T[1L, ] } ## rhs (row (n-m):n) are equal to reversed lhs F[(m+2L):nm, ] <- rev(F[1L:m, ]) return(F) } ## .filter ## remove time series attributes and NA at left/right extrema .filter <- function(x, hws, coef) { n <- length(x) w <- 2L*hws+1L y <- stats::filter(x=x, filter=coef[hws+1L, ], sides=2L) attributes(y) <- NULL ## fix left/right extrema y[1L:hws] <- head(coef, hws) %*% head(x, w) y[(n-hws+1L):n] <- tail(coef, hws) %*% tail(x, w) return(y) } MALDIquant/R/show-methods.R0000644000175000017500000000554212211651271016432 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="show", signature=signature(object="AbstractMassObject"), definition=function(object) { l <- .prepareShow(object) isFilename <- grepl(pattern="^File.*", x=l$groups) ## to avoid newlines in other values don't format filenames ## (they could be very long) l$values[!isFilename] <- format(l$values[!isFilename], justify="left") l$groups <- format(l$groups, justify="left") cat(paste0(l$groups, ": ", l$values, collapse="\n"), sep="\n") }) setMethod(f=".prepareShow", signature=signature(object="AbstractMassObject"), definition=function(object) { groups <- c("S4 class type", "Number of m/z values", "Range of m/z values", "Range of intensity values", "Memory usage") values <- class(object)[1L] if (isEmpty(object)) { values <- c(values, 0L, NA, NA) } else { values <- c(values, length(object@mass), paste0(round(range(object@mass), digits=3L), collapse=" - "), paste0(format(min(object@intensity), digits=4L, scientific=TRUE), " - ", format(max(object@intensity), digits=4L, scientific=TRUE))) } values <- c(values, .memoryUsageStr(object)) groups <- c(groups, .prepareShowGroupName(object@metaData$name, "Name")) values <- c(values, object@metaData$name) groups <- c(groups, .prepareShowGroupName(object@metaData$file, "File")) values <- c(values, object@metaData$file) return(list(groups=groups, values=values)) }) setMethod(f=".prepareShow", signature=signature(object="MassPeaks"), definition=function(object) { l <- callNextMethod(object) groups <- "Range of snr values" if (isEmpty(object)) { values <- NA } else { values <- paste0(round(range(object@snr), digits=3), collapse=" - ") } ## append snr info after intensity l$groups <- append(l$groups, groups, after=4L) l$values <- append(l$values, values, after=4L) return(list(groups=l$groups, values=l$values)) }) MALDIquant/R/warpingFunction-functions.R0000644000175000017500000000541712211651271021175 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## warpingFunction functions called by determineWarpingFunction ## ## requirements: ## A function with three arguments: x, difference, ... . ## This function has to return a function with only an argument (x) which does ## the warping. ## .warpingFunctionLowess ## lowess based determination of warping function [default] ## ## params: ## x: double, original mass ## d: double, corresponding difference to reference ## ...: additional arguments possible (see ?lowess for details) ## ## returns: ## function(x) ## .warpingFunctionLowess <- function(x, d, ...) { lo <- lowess(x=x, y=d, ...) return(approxfun(x=lo$x, y=lo$y, rule=2L)) } ## .warpingFunctionLinear ## 1st order polynomial based determination of warping function ## ## params: ## x: double, original mass ## d: double, corresponding difference to reference ## ...: additional arguments possible (see ?lm for details) ## ## returns: ## function(x) ## .warpingFunctionLinear <- function(x, d, ...) { l <- lm(y ~ x1, data=list(x1=x, y=d), ...) co <- coef(l) return(function(x) { return (co[1L]+x*co[2L]) }) } ## .warpingFunctionQuadratic ## 2nd order polynomial based determination of warping function ## ## params: ## x: double, original mass ## d: double, corresponding difference to reference ## ...: additional arguments possible (see ?lm for details) ## ## returns: ## function(x) ## .warpingFunctionQuadratic <- function(x, d, ...) { l <- lm(y ~ x1+x2, data=list(x1=x, x2=x*x, y=d), ...) co <- coef(l) return(function(x) { return (co[1L]+x*co[2L]+x*x*co[3L]) }) } ## .warpingFunctionCubic ## 3rd order polynomial based determination of warping function ## ## params: ## x: double, original mass ## d: double, corresponding difference to reference ## ...: additional arguments possible (see ?lm for details) ## ## returns: ## function(x) ## .warpingFunctionCubic <- function(x, d, ...) { l <- lm(y ~ x1+x2+x3, data=list(x1=x, x2=x*x, x3=x*x*x, y=d), ...) co <- coef(l) return(function(x) { return (co[1L]+x*co[2L]+x*x*co[3L]+x*x*x*co[4L]) }) } MALDIquant/R/onAttach.R0000644000175000017500000000204512211632774015554 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see .onAttach <- function(libname, pkgname) { packageStartupMessage("\nThis is MALDIquant version ", utils::packageVersion("MALDIquant"), "\n", "Quantitative Analysis of Mass Spectrometry Data\n", " See ", sQuote("?MALDIquant"), " for more information about this package.\n") } MALDIquant/R/length-methods.R0000644000175000017500000000165712207736161016745 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="length", signature=signature(x="AbstractMassObject"), definition=function(x) { return(length(x@intensity)) }) MALDIquant/R/filterPeaks-functions.R0000644000175000017500000001056212265240511020266 0ustar sebastiansebastian## Copyright 2012-2014 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## filterPeaks ## filter peaks which are not frequently represented in different samples ## ## params: ## l: list of MassPeaks objects ## minFrequency: double, minimal frequency of a peak to be not removed ## minNumber: double, minimal (absolute) number of peaks to be not removed ## labels: factor, labelwise filtering ## mergeWhitelists: logical, apply whitelists local (FALSE) or global (TRUE) ## ## returns: ## a list of adjusted MassPeaks objects ## filterPeaks <- function(l, minFrequency, minNumber, labels, mergeWhitelists=FALSE) { ## test arguments .stopIfNotIsMassPeaksList(l) ## labels if (missing(labels)) { labels <- rep_len(0L, length(l)) } ## drop unused levels and turn argument into factor if (is.factor(labels)) { labels <- droplevels(labels) } else { ## preserve order in labels labels <- factor(labels, levels=unique(labels)) } if (missing(minFrequency)) { minFrequency <- NA } if (missing(minNumber)) { minNumber <- NA } ll <- levels(labels) nl <- length(ll) if (length(labels) != length(l)) { stop("For each item in ", sQuote("l"), " there must be a label in ", sQuote("labels"), "!") } ## recycle arguments if needed minFrequency <- rep_len(minFrequency, nl) minNumber <- rep_len(minNumber, nl) mergeWhitelists <- mergeWhitelists[1] ## binary peak matrix (mask) m <- .as.binary.matrix(.as.matrix.MassObjectList(l)) ## whitelist w <- matrix(0L, nrow=nrow(m), ncol=ncol(m)) ## group indices by labels idx <- lapply(ll, function(x)which(labels == x)) ## collect whitelists for (i in seq(along=idx)) { wl <- .whitelist(m, idx[[i]], minFrequency=minFrequency[i], minNumber=minNumber[i]) if (sum(wl)) { if (mergeWhitelists) { ## R uses columnwise recycling w <- t(t(w) | wl) } else { ## R uses columnwise recycling w[idx[[i]], ] <- t(t(w[idx[[i]], , drop=FALSE]) | wl) } } else { warning("Empty peak whitelist for level ", sQuote(ll[i]), ".") } } ## apply whitelist w <- w & m ## turn matrix back into MassPeaks objects for (i in seq(along=l)) { j <- which(as.logical(m[i, ])) include <- which(w[i, j]) l[[i]]@mass <- l[[i]]@mass[include] l[[i]]@intensity <- l[[i]]@intensity[include] l[[i]]@snr <- l[[i]]@snr[include] } return(l) } ## .whitelist ## helper function to create whitelists for filtering ## ## params: ## m: matrix ## rows: index of rows which should filtered ## minFrequency: double, minimal frequency of a peak to be not removed ## minNumber: double, minimal (absolute) number of peaks to be not removed ## ## returns: ## a logical vector representing the whitelist ## .whitelist <- function(m, rows, minFrequency, minNumber) { ## test arguments if (is.na(minFrequency) && is.na(minNumber)) { stop(sQuote(minFrequency), " or ", sQuote(minNumber), " has to be a meaningful number!") } if (!is.na(minFrequency) && minFrequency < 0L) { minFrequency <- 0L warning(sQuote("minFrequency"), " < 0 does not make sense! Using 0 instead.") } if (!is.na(minNumber) && minNumber < 0L) { minNumber <- 0L warning(sQuote("minNumber"), " < 0 does not make sense! Using 0 instead.") } if (!is.na(minFrequency) && !is.na(minNumber)) { warning(sQuote("minFrequency"), " and ", sQuote("minNumber"), " arguments are given. Choosing the higher one.") } ## calculate minimal number of peaks minPeakNumber <- max(minFrequency*length(rows), minNumber, na.rm=TRUE) return(colSums(m[rows, , drop=FALSE]) >= minPeakNumber) } MALDIquant/R/AllGenerics.R0000644000175000017500000001334612211652226016203 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject if (is.null(getGeneric("as.matrix"))) { setGeneric("as.matrix", function(x, ...) standardGeneric("as.matrix")) } if (is.null(getGeneric("length"))) { setGeneric("length", function(x) standardGeneric("length")) } if (is.null(getGeneric("lines"))) { setGeneric("lines", function(x, ...) standardGeneric("lines")) } if (is.null(getGeneric("plot"))) { setGeneric("plot", function(x, y, ...) standardGeneric("plot")) } if (is.null(getGeneric("points"))) { setGeneric("points", function(x, ...) standardGeneric("points")) } if (is.null(getGeneric(".prepareShow"))) { setGeneric(".prepareShow", function(object) standardGeneric(".prepareShow")) } if (is.null(getGeneric("transformIntensity"))) { setGeneric("transformIntensity", function(object, ...) standardGeneric("transformIntensity")) } if (is.null(getGeneric(".transformIntensity"))) { setGeneric(".transformIntensity", function(object, ...) standardGeneric(".transformIntensity")) } if (is.null(getGeneric("trim"))) { setGeneric("trim", function(object, range) standardGeneric("trim")) } ## get/set slots if (is.null(getGeneric("mass"))) { setGeneric("mass", function(object) standardGeneric("mass")) } if (is.null(getGeneric("mass<-"))) { setGeneric("mass<-", function(object, value) standardGeneric("mass<-")) } if (is.null(getGeneric("intensity"))) { setGeneric("intensity", function(object) standardGeneric("intensity")) } if (is.null(getGeneric("intensity<-"))) { setGeneric("intensity<-", function(object, value) standardGeneric("intensity<-")) } if (is.null(getGeneric("isEmpty"))) { setGeneric("isEmpty", function(x) standardGeneric("isEmpty")) } if (is.null(getGeneric(".isEmptyWarning"))) { setGeneric(".isEmptyWarning", function(x) standardGeneric(".isEmptyWarning")) } if (is.null(getGeneric("metaData"))) { setGeneric("metaData", function(object) standardGeneric("metaData")) } if (is.null(getGeneric("metaData<-"))) { setGeneric("metaData<-", function(object, value) standardGeneric("metaData<-")) } ## end of AbstractMassObject ## MassSpectrum if (is.null(getGeneric("approxfun"))) { setGeneric("approxfun", function(x, y=NULL, method="linear", yleft, yright, rule=1, f=0, ties=mean) standardGeneric("approxfun")) } if (is.null(getGeneric("calibrateIntensity"))) { setGeneric("calibrateIntensity", function(object, ...) standardGeneric("calibrateIntensity")) } if (is.null(getGeneric("detectPeaks"))) { setGeneric("detectPeaks", function(object, ...) standardGeneric("detectPeaks")) } if (is.null(getGeneric("estimateBaseline"))) { setGeneric("estimateBaseline", function(object, method=c("SNIP", "ConvexHull", "Median"), ...) standardGeneric("estimateBaseline")) } if (is.null(getGeneric("estimateNoise"))) { setGeneric("estimateNoise", function(object, ...) standardGeneric("estimateNoise")) } if (is.null(getGeneric(".findLocalMaxima"))) { setGeneric(".findLocalMaxima", function(object, halfWindowSize=20L) standardGeneric(".findLocalMaxima")) } if (is.null(getGeneric(".findLocalMaximaLogical"))) { setGeneric(".findLocalMaximaLogical", function(object, halfWindowSize=20L) standardGeneric(".findLocalMaximaLogical")) } if (is.null(getGeneric("isRegular"))) { setGeneric("isRegular", function(object, ...) standardGeneric("isRegular")) } if (is.null(getGeneric("removeBaseline"))) { setGeneric("removeBaseline", function(object, ...) standardGeneric("removeBaseline")) } if (is.null(getGeneric("smoothIntensity"))) { setGeneric("smoothIntensity", function(object, ...) standardGeneric("smoothIntensity")) } if (is.null(getGeneric("totalIonCurrent"))) { setGeneric("totalIonCurrent", function(object) standardGeneric("totalIonCurrent")) } ## end of MassSpectrum ## MassPeaks if (is.null(getGeneric("labelPeaks"))) { setGeneric("labelPeaks", function(object, index, mass, labels, digits=3L, underline=TRUE, verticalOffset=abs(diff(par("usr")[3:4]))*0.0125, absoluteVerticalPos, adj=c(0.5, 0L), cex=0.7, avoidOverlap=FALSE, arrowLength=0L, arrowLwd=0.5, arrowCol=1, ...) standardGeneric("labelPeaks")) } if (is.null(getGeneric("snr"))) { setGeneric("snr", function(object) standardGeneric("snr")) } if (is.null(getGeneric(".calculateLabelPositions"))) { setGeneric(".calculateLabelPositions", function(object, ...) standardGeneric(".calculateLabelPositions")) } if (is.null(getGeneric(".testLabelOverlap"))) { setGeneric(".testLabelOverlap", function(object, ...) standardGeneric(".testLabelOverlap")) } if (is.null(getGeneric(".labelOverlap"))) { setGeneric(".labelOverlap", function(object, ...) standardGeneric(".labelOverlap")) } ## end of MassPeaks MALDIquant/R/unlist-functions.R0000644000175000017500000000167212211651271017335 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .unlist ## wrapper for unlist ## ## params: ## x: an R object ## ## returns: ## see also ?unlist ## .unlist <- function(x) { unlist(x, recursive=FALSE, use.names=FALSE) } MALDIquant/R/estimateBaseline-functions.R0000644000175000017500000001327012211651271021272 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## estimateBaselineConvexHull ## estimate baseline by creating a convex hull ## ## A. M. Andrew, "Another Efficient Algorithm for Convex Hulls in Two ## Dimensions", Info. Proc. Letters 9, 216-219 (1979). ## only calculate lower hull (we don't need the upper one) ## ## params: ## x: vector of x values ## y: vector of y values ## ## returns: ## a matrix of the estimate baseline (col1: mass; col2: intensity) ## ## C version .estimateBaselineConvexHull <- function(x, y) { return(cbind(x=x, y=.Call("C_lowerConvexHull", x, y))) } ## R only: obsolete because too slow .lowerConvexHullR <- function(x, y) { ## .left() ## build cross product of 2 vectors and compare to zero ## returns true for >= P2(x2, y2) left/on the line of P0->P1 .left <- function(x0, y0, x1, y1, x2, y2) { return(((x1-x0)*(y2-y0) - (x2-x0)*(y1-y0)) > 0) } # typically x values have to been sorted # our x values are already sorted index <- double(length(x)) k <- 1L for (i in seq(along=x)) { while (k > 2L && !.left(x[index[k-2L]], y[index[k-2L]], x[index[k-1L]], y[index[k-1L]], x[i], y[i])) { ## remove last point k <- k-1L } index[k] <- i k <- k+1L } index <- index[1L:(k-1L)] b <- matrix(.unlist(approx(x=x[index], y=y[index], xout=x, method="linear", rule=2L)), nrow=length(x), ncol=2L, dimnames=list(list(), list("x", "y"))) return(b) } ## estimateBaselineMedian ## estimate baseline by computing moving median ## ## params: ## x: vector of x values ## y: vector of y values ## halfWindowSize: size of local window ## ## returns: ## a matrix of the estimate baseline (col1: mass; col2: intensity) ## .estimateBaselineMedian <- function(x, y, halfWindowSize=100L) { .stopIfNotIsValidHalfWindowSize(halfWindowSize=halfWindowSize, n=length(x)) y <- runmed(y, k=2L*halfWindowSize+1L) return(cbind(x, y)) } ## estimateBaselineSnip ## estimate baseline by SNIP algorithm ## ## SNIP algorithm based on: ## C.G. Ryan, E. Clayton, W.L. Griffin, S.H. Sie, and D.R. Cousens. ## "Snip, a statistics-sensitive background treatment for the quantitative ## analysis of pixe spectra in geoscience applications." ## Nuclear Instruments and Methods in Physics Research Section B: ## Beam Interactions with Materials and Atoms, 34(3):396-402, 1988. ## ISSN 0168-583X. doi:10.1016/0168-583X(88)90063-8. ## URL http://www.sciencedirect.com/science/article/B6TJN-46YSYTJ-30/2/e0d015ceb8ea8a7bc0702a857a19750b ## ## decreasing clipping window adapted from: ## M. Morhac. 2009. ## "An algorithm for determination of peak regions and baseline elimination in ## spectroscopic data." ## Nuclear Instruments and Methods in Physics Research Section A: ## Accelerators, Spectrometers, Detectors and Associated Equipment, 600(2), 478-487. ## ISSN 0168-9002. doi:10.1016/S0168-9002(97)01023-1. ## URL http://www.sciencedirect.com/science/article/pii/S0168900297010231 ## ## params: ## x: vector of x values (only needed for create a matrix as return value) ## y: vector of y values ## iterations: number of iterations ## decreasing: use a decreasing clipping window ## ## returns: ## a matrix of the estimate baseline (col1: mass; col2: intensity) ## C version .estimateBaselineSnip <- function(x, y, iterations=100L, decreasing=TRUE) { return(cbind(x=x, y=.Call("C_snip", y, iterations, decreasing))) } ## R only: obsolete because too slow .snipR <- function(x, y, iterations=100L, decreasing=TRUE) { n <- length(y) if (decreasing) { s <- seq(from=iterations, to=1L) } else { s <- seq(from=1L, to=iterations) } for (i in s) { j <- (i+1L):(n-i) jl <- j-i ju <- j+i m <- (y[jl]+y[ju])/2L ## too slow #y[j] <- ifelse(y[j] > m, m, y[j]) ml <- y[j]>m y[j][ml] <- m[ml] } return(cbind(x, y)) } ## estimateBaselineTopHat ## estimate baseline by TopHat filter (erosion + dilation) ## ## params: ## x: vector of x values (only needed for create a matrix as return value) ## y: vector of y values ## halfWindowSize: size of local window ## ## returns: ## a matrix of the estimate baseline (col1: mass; col2: intensity) ## .estimateBaselineTopHat <- function(x, y, halfWindowSize=100L) { .stopIfNotIsValidHalfWindowSize(halfWindowSize=halfWindowSize, n=length(x)) e <- .erosion(y, halfWindowSize=halfWindowSize) y <- .dilation(e, halfWindowSize=halfWindowSize) return(cbind(x, y)) } ## R only: obsolete because too slow .topHatR <- function(x, y, halfWindowSize=100L) { .stopIfNotIsValidHalfWindowSize(halfWindowSize=halfWindowSize, n=length(x)) windowSize <- 2L*halfWindowSize+1L windows <- embed(c(rep(y[1L], halfWindowSize), y, rep(tail(y, 1L), halfWindowSize)), windowSize) e <- apply(windows, 1L, min) windows <- embed(c(rep(e[1L], halfWindowSize), e, rep(tail(e, 1L), halfWindowSize)), windowSize) y <- apply(windows, 1L, max) return(cbind(x, y)) } MALDIquant/R/detectPeaks-methods.R0000644000175000017500000000500712221110641017672 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="detectPeaks", signature=signature(object="MassSpectrum"), definition=function(object, halfWindowSize=20L, method=c("MAD", "SuperSmoother"), SNR=2L, fun, ## deprecated ...) { ## empty spectrum? if (.isEmptyWarning(object)) { return(createMassPeaks(mass=object@mass, intensity=object@intensity, metaData=object@metaData)) } ## try to use user-defined noise estimation function if (!missing(fun)) { .deprecatedArgument("1.7.12", old="fun", new="method", help="detectPeaks") fun <- match.fun(fun) noise <- fun(object@mass, object@intensity, ...) ## wrong noise argument given? isCorrectNoise <- is.matrix(noise) && (nrow(noise) == length(object) && ncol(noise) == 2) if (!isCorrectNoise) { stop("The noise argument is not valid.") } } else { ## estimate noise noise <- estimateNoise(object, method=method, ...) } ## find local maxima localMaxima <- .findLocalMaximaLogical(object, halfWindowSize=halfWindowSize) ## include only local maxima which are above the noise aboveNoise <- object@intensity > (SNR * noise[, 2L]) isPeak <- aboveNoise & localMaxima return(createMassPeaks(mass=object@mass[isPeak], intensity=object@intensity[isPeak], snr=object@intensity[isPeak]/noise[isPeak, 2L], metaData=object@metaData)) }) ## list setMethod(f="detectPeaks", signature=signature(object="list"), definition=function(object, ...) { ## test arguments .stopIfNotIsMassSpectrumList(object) return(.mapply(detectPeaks, object, ...)) }) MALDIquant/R/calibrateIntensity-methods.R0000644000175000017500000000410212244103531021273 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="calibrateIntensity", signature=signature(object="MassSpectrum"), definition=function(object, method=c("TIC", "PQN", "median"), ...) { method <- match.arg(method) object <- switch(method, "TIC" = { .transformIntensity(object, fun=.calibrateIntensitySimple, offset=0L, scaling=totalIonCurrent(object)) }, "PQN" = { stop(dQuote("PQN"), " is not supported for a single MassSpectrum object.") }, "median" = { .transformIntensity(object, fun=.calibrateIntensitySimple, offset=0L, scaling=median) }, { stop("Unknown ", sQuote("method"), ".") } ) return(object) }) ## list setMethod(f="calibrateIntensity", signature=signature(object="list"), definition=function(object, method=c("TIC", "PQN", "median"), ...) { ## test arguments .stopIfNotIsMassSpectrumList(object) method <- match.arg(method) object <- switch(method, "TIC" = , "median" = { lapply(object, calibrateIntensity, method=method, ...) }, "PQN" = { .calibrateProbabilisticQuotientNormalization(object) }, { stop("Unknown ", sQuote("method"), ".") } ) return(object) }) MALDIquant/R/morphologicalFilter-functions.R0000644000175000017500000000354512160131333022020 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## dilation ## calculates moving max (dilation filter) ## ## M. van Herk. "A Fast Algorithm for Local Minimum and Maximum Filters on ## Rectangular and Octagonal Kernels." ## Pattern Recognition Letters 13.7 (1992): 517-521. ## ## J. Y. Gil and M. Werman. "Computing 2-Dimensional Min, Median and Max ## Filters." IEEE Transactions (1996): 504-507. ## ## params: ## x: vector of x values ## halfWindowSize: size of local window ## ## returns: ## moving max ## .dilation <- function(x, halfWindowSize) { return(.Call("C_dilation", x, halfWindowSize)) } ## erosion ## calculates moving min (erosion filter) ## ## M. van Herk. "A Fast Algorithm for Local Minimum and Maximum Filters on ## Rectangular and Octagonal Kernels." ## Pattern Recognition Letters 13.7 (1992): 517-521. ## ## J. Y. Gil and M. Werman. "Computing 2-Dimensional Min, Median and Max ## Filters." IEEE Transactions (1996): 504-507. ## ## params: ## x: vector of x values ## halfWindowSize: size of local window ## ## returns: ## moving min ## .erosion <- function(x, halfWindowSize) { return(.Call("C_erosion", x, halfWindowSize)) } MALDIquant/R/AllClasses.R0000644000175000017500000000251712264023334016037 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## basic class for all spectra based information setClass("AbstractMassObject", slots=list(mass="numeric", intensity="numeric", metaData="list"), prototype=list(mass=numeric(), intensity=numeric(), metaData=list()), contains="VIRTUAL") ## represent a spectrum setClass("MassSpectrum", contains="AbstractMassObject") ## represent a peak list from a single spectrum setClass("MassPeaks", slots=list(snr="numeric"), prototype=list(snr=numeric()), contains="AbstractMassObject") MALDIquant/R/doByLabels-functions.R0000644000175000017500000000340612211651271020034 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .doByLabels ## run a specific function labelwise ## ## params: ## l: list of AbstractMassObject objects ## labels: factor, labels for samples ## fun: function ## ## returns: ## list of modified AbstractMassObject objects ## .doByLabels <- function(l, labels, FUN, ...) { ## test parameters .stopIfNotIsMassObjectList(l) FUN <- match.fun(FUN) if (!missing(labels)) { ## drop unused levels and turn argument into factor if (is.factor(labels)) { labels <- droplevels(labels) } else { ## preserve order in labels labels <- factor(labels, levels=unique(labels)) } if (length(labels) != length(l)) { stop("For each item in ", sQuote("l"), " there must be a label in ", sQuote("labels"), "!") } ## replace tapply by split to preserve order tmp <- lapply(split(unlist(l), labels), FUN=FUN, ...) k <- unlist(tmp) if (length(k) != length(tmp)) { k <- unsplit(tmp, labels) } } else { k <- FUN(l, ...) } return(k) } MALDIquant/R/isMassObject-functions.R0000644000175000017500000000176612213060522020404 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see .isMassObject <- function(x) { return(inherits(x=x, what="AbstractMassObject")) } isMassSpectrum <- function(x) { return(is(object=x, class2="MassSpectrum")) } isMassPeaks <- function(x) { return(is(object=x, class2="MassPeaks")) } MALDIquant/R/findEmptyMassObjects-functions.R0000644000175000017500000000217312211651271022111 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## findEmptyMassObjects ## find empty AbstractMassObject objects in a MassObjectsList ## ## params: ## l: list of AbstractMassObject objects ## ## returns: ## a vector of indices refer to empty AbstractMassObject objects ## findEmptyMassObjects <- function(l) { .stopIfNotIsMassObjectList(l) isEmpty <- vapply(l, isEmpty, logical(1L)) return(which(isEmpty)) } MALDIquant/R/localMaxima-functions.R0000644000175000017500000000332712211651271020245 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## local maxima function called by .findLocalMaxima ## ## This function looks for local maxima in a numeric vector. ## ## params: ## y: double, intensity ## halfWindowSize: numeric, half window size. ## ## returns: ## logical vector of local maxima ## ## C version .localMaxima <- function(y, halfWindowSize=1L) { y <- c(rep(0L, halfWindowSize), y, rep(0L, halfWindowSize)) n <- length(y) i <- (halfWindowSize+1L):(n-halfWindowSize) return(.Call("C_localMaxima", y, halfWindowSize)[i]) } ## R only: obsolete because too slow and too much memory usage .localMaximaR <- function(y, halfWindowSize=1L) { ## based on a posting of Brian Ripley on r-help mailinglist ## https://stat.ethz.ch/pipermail/r-help/2001-January/010704.html windowSize <- 2L*halfWindowSize+1L windows <- embed(c(rep(0L, halfWindowSize), y, rep(0L, halfWindowSize)), windowSize) localMaxima <- max.col(windows, "last") == halfWindowSize+1L return(localMaxima) } MALDIquant/R/alignSpectra-functions.R0000644000175000017500000000375512237162331020441 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## alignSpectra ## wrapper around detectPeaks, determineWarpingFunctions and warpMassSpectra ## ## params: ## spectra: list, list of MassSpectrum objects ## halfWindowSize: numeric, half window size. ## noiseMethod: character, noise estimation method ## SNR: double, signal-to-noise ratio ## reference: MassPeaks, a reference MassPeaks object to which all other ## MassPeaks objects should be aligned ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## warpingMethod: choose type of base warping function ## ## returns: ## a list of aligned MassSpectrum objects ## alignSpectra <- function(spectra, ## peak detection halfWindowSize=20, noiseMethod="MAD", SNR=2, ## warping reference, tolerance=0.002, warpingMethod="lowess") { ## test arguments .stopIfNotIsMassSpectrumList(spectra) peaks <- detectPeaks(spectra, halfWindowSize=halfWindowSize, method=noiseMethod, SNR=SNR) wf <- determineWarpingFunctions(peaks, reference=reference, tolerance=tolerance, method=warpingMethod) return(warpMassSpectra(spectra, wf)) } MALDIquant/R/intensity-methods.R0000644000175000017500000000263312112111745017473 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="intensity", signature=signature(object="AbstractMassObject"), definition=function(object) { return(object@intensity) }) ## AbstractMassObject setReplaceMethod(f="intensity", signature=signature(object="AbstractMassObject", value="numeric"), definition=function(object, value) { if (length(object@intensity) == length(value)) { object@intensity <- as.double(value) } else { stop("Lengths of intensity(", length(object@intensity), ") and value (", length(value), ") have to be equal.") } return(object) }) MALDIquant/R/referencePeaks-functions.R0000644000175000017500000000355612263537432020755 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## referencePeaks ## calculate reference peaks (a wrapper around filterPeaks and binPeaks) ## ## params: ## l: list of MassPeaks objects ## method: character, grouper to used (strict: don't allow multiple peaks of ## the same sample in the same bin, relaxed: allow them) ## minFrequency: double, minimal frequency of a peak to be not removed ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## ## returns: ## a new MassPeaks object ## referencePeaks <- function(l, method=c("strict", "relaxed"), minFrequency=0.9, tolerance=0.002) { .stopIfNotIsMassPeaksList(l) ## find reference peaks by binning and filtering referencePeaks <- filterPeaks(binPeaks(l, method=method, tolerance=tolerance), minFrequency=minFrequency) m <- .as.binary.matrix(.as.matrix.MassObjectList(referencePeaks)) ## set peak intensity to number of occurrence intensity <- unname(colMeans(m)) return(createMassPeaks(mass=as.double(colnames(m)), intensity=intensity)) } MALDIquant/R/warp-functions.R0000644000175000017500000000360212211651271016763 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## warpMassSpectra ## warp MassSpectrum objects ## ## params: ## l: list of MassSpectrum objects ## w: list of warping functions determined by determineWarpingFunctions ## ## returns: ## a list of warped MassSpectrum objects ## warpMassSpectra <- function(l, w) { ## test parameters .stopIfNotIsMassSpectrumList(l) .stopIfNotIsFunctionList(w) return(.warp(l, w)) } ## warpMassPeaks ## warp MassPeaks objects ## ## params: ## l: list of MassPeaks objects ## w: list of warping functions determined by determineWarpingFunctions ## ## returns: ## a list of warped MassPeaks objects ## warpMassPeaks <- function(l, w) { ## test parameters .stopIfNotIsMassPeaksList(l) .stopIfNotIsFunctionList(w) return(.warp(l, w)) } ## .warp ## .warp bstractMassObject objects ## ## params: ## l: list of AbstractMassObject objects ## w: list of warping functions determined by determineWarpingFunctions ## ## returns: ## a list of warped AbstractMassObject objects ## .warp <- function(l, w) { return(mapply(function(m, wf) { m@mass <- m@mass+wf(m@mass) return(m) }, m=l, wf=w, SIMPLIFY=FALSE)) } MALDIquant/R/estimateBaseline-methods.R0000644000175000017500000000341612213060522020721 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="estimateBaseline", signature=signature(object="MassSpectrum"), definition=function(object, method=c("SNIP", "TopHat", "ConvexHull", "median"), ...) { ## empty spectrum? if (.isEmptyWarning(object)) { return(NA) } method <- match.arg(method) b <- switch(method, "SNIP" = { .estimateBaselineSnip(object@mass, object@intensity, ...) }, "TopHat" = { .estimateBaselineTopHat(object@mass, object@intensity, ...) }, "ConvexHull" = { .estimateBaselineConvexHull(object@mass, object@intensity) }, "median" = { .estimateBaselineMedian(object@mass, object@intensity, ...) }, { stop("Unknown ", sQuote("method"), ".") } ) colnames(b) <- c("mass", "intensity") return(b) }) MALDIquant/R/transformIntensity-methods.R0000644000175000017500000000513512221107706021372 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="transformIntensity", signature=signature(object="AbstractMassObject"), definition=function(object, method=c("sqrt", "log", "log2", "log10"), fun, ... ## deprecated ) { ## empty spectrum? if (.isEmptyWarning(object)) { return(object) } if (!missing(fun)) { .deprecatedArgument("1.7.12", "fun", "method", help="transformIntensity") return(.transformIntensity(object, fun=fun, ...)) } method <- match.arg(method) fun <- switch(method, "sqrt" = { sqrt }, "log" = { log }, "log2" = { log2 }, "log10" = { log10 }, { stop("Unknown ", sQuote("method"), ".") } ) return(.transformIntensity(object, fun=fun)) }) ## AbstractMassObject setMethod(f=".transformIntensity", signature=signature(object="AbstractMassObject"), definition=function(object, fun, na.rm=TRUE, ...) { if (!isEmpty(object)) { fun <- match.fun(fun) object@intensity <- fun(object@intensity, ...) if (na.rm) { na <- is.na(object@intensity) object@intensity <- object@intensity[!na] object@mass <- object@mass[!na] } } return(object) }) ## list setMethod(f="transformIntensity", signature=signature(object="list"), definition=function(object, ...) { ## test arguments .stopIfNotIsMassObjectList(object) return(lapply(object, transformIntensity, ...)) }) ## list setMethod(f=".transformIntensity", signature=signature(object="list"), definition=function(object, ...) { ## test arguments .stopIfNotIsMassObjectList(object) return(lapply(object, .transformIntensity, ...)) }) MALDIquant/R/mass-methods.R0000644000175000017500000000250612207736367016431 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="mass", signature=signature(object="AbstractMassObject"), definition=function(object) { return(object@mass) }) ## AbstractMassObject setReplaceMethod(f="mass", signature=signature(object="AbstractMassObject", value="numeric"), definition=function(object, value) { if (length(object@mass) == length(value)) { object@mass <- as.double(value) } else { stop("Lengths of mass (", length(object@mass), ") and value (", length(value), ") have to be equal.") } return(object) }) MALDIquant/R/points-methods.R0000644000175000017500000000166412207736516017002 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassPeaks setMethod(f="points", signature=signature(x="AbstractMassObject"), definition=function(x, ...) { points(x=x@mass, y=x@intensity, ...) }) MALDIquant/R/trim-methods.R0000644000175000017500000000307412221107136016420 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod("trim", signature=signature(object="AbstractMassObject", range="numeric"), definition=function(object, range) { if (length(range) != 2L) { stop(sQuote("range"), " has to be a vector of length 2.") } range <- .reorderRange(range) return(object[range[1L] <= object@mass & object@mass <= range[2L]]) }) ## list setMethod("trim", signature=signature(object="list", range="numeric"), definition=function(object, range) { return(lapply(X=object, FUN=trim, range=range)) }) setMethod("trim", signature=signature(object="list", range="missing"), definition=function(object) { range <- .overlap(object) if (all(range == 0L)) { stop("No overlap found!") } return(lapply(X=object, FUN=trim, range=range)) }) MALDIquant/R/intensityMatrix-functions.R0000644000175000017500000000351612263537432021242 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## intensityMatrix ## converts a list of MassPeaks into an expression matrix ## ## params: ## peaks: list of MassPeaks objects ## spectra: list of MassSpectrum objects ## ## returns: ## a matrix ## intensityMatrix <- function(peaks, spectra) { ## deprecated for MassSpectrum objects if (isMassSpectrumList(peaks)) { .deprecated("1.8.4", "\"intensityMatrix\" is deprecated ", "for lists of MassSpectrum objects.") return(.intensityMatrixDeprecated(peaks)) } ## test arguments .stopIfNotIsMassPeaksList(peaks) m <- .as.matrix.MassObjectList(peaks) ## lookup corresponding intensity values in spectra for missing peaks if (!missing(spectra)) { .stopIfNotIsMassSpectrumList(spectra) if (length(peaks) != length(spectra)) { stop("Incompatible number of spectra!") } isNa <- is.na(m) uniqueMass <- as.double(colnames(m)) approxSpectra <- lapply(spectra, approxfun, yleft=0L, yright=0L) for (i in seq(along=approxSpectra)) { m[i, isNa[i, ]] <- approxSpectra[[i]](uniqueMass[isNa[i, ]]) } } return(m) } MALDIquant/R/binPeaks-functions.R0000644000175000017500000001322012265240603017545 0ustar sebastiansebastian## Copyright 2012-2014 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## binPeaks ## binning peaks by splitting at the largest gap ## This is a wrapper function around .binPeaks which prepares the peak list ## before and recreates a correct peak list after binning. ## ## params: ## l: list of MassPeaks objects ## method: character, grouper to used (strict: don't allow multiple peaks of ## the same sample in the same bin, relaxed: allow them) ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## ## returns: ## a list of adjusted MassPeaks objects ## binPeaks <- function(l, method=c("strict", "relaxed"), tolerance=0.002) { ## test arguments .stopIfNotIsMassPeaksList(l) method <- match.arg(method) ## fetch all mass mass <- unname(.unlist(lapply(l, function(x)x@mass))) ## fetch all intensities intensities <- .unlist(lapply(l, function(x)x@intensity)) ## fetch all snr snr <- .unlist(lapply(l, function(x)x@snr)) ## store original mass sample number/id samples <- .unlist(lapply(1L:length(l), function(x) { return(rep(x, length(l[[x]]))) })) ## sort values by mass s <- sort(mass, method="quick", index.return=TRUE) mass <- s$x intensities <- intensities[s$ix] snr <- snr[s$ix] samples <- samples[s$ix] ## select grouper grouper <- switch(method, "strict" = { .grouperStrict }, "relaxed" = { .grouperRelaxed }, { stop("Unknown ", sQuote("method"), ".") } ) ## binning mass <- .binPeaks(mass=mass, intensities=intensities, samples=samples, tolerance=tolerance, grouper=grouper) ## resort mass (order could change if "relaxed" is used) if (method == "relaxed") { s <- sort(mass, method="quick", index.return=TRUE) mass <- s$x intensities <- intensities[s$ix] snr <- snr[s$ix] samples <- samples[s$ix] } ## group mass/intensities/snr by sample ids lIdx <- tapply(X=1L:length(mass), INDEX=samples, FUN=function(x) { return(x) }) ## create adjusted peak list l <- .mapply(FUN=function(p, i) { p@mass <- mass[i] p@intensity <- intensities[i] p@snr <- snr[i] return(p) }, p=l, i=lIdx) return(l) } ## .binPeaks ## binning peaks by splitting at the largest gap ## ## params: ## mass: double, sorted mass ## intensities: double, corresponding intensities ## samples: double, corresponding sample id numbers ## tolerance: double, maximal deviation of a peak position to be ## considered as same peak ## grouper: grouping function ## ...: arguments passed to grouping function ## ## returns: ## vector (double) of modified mass ## .binPeaks <- function(mass, intensities, samples, tolerance, grouper=.grouperStrict, ...) { n <- length(mass) ## calculate difference d <- diff(mass) ## grouper function grouper <- match.fun(grouper) ## stack based implementation taken from ## caMassClass 1.9 R/msc.peaks.clust.R written by ## Jarek Tuszynski ## it is a lot of faster than recursion ## store boundaries in a stack nBoundaries <- max(20L, floor(3L*log(n))) boundary <- list(left=double(nBoundaries), right=double(nBoundaries)) currentBoundary <- 1L boundary$left[currentBoundary] <- 1L boundary$right[currentBoundary] <- n ## workhorse loop while (currentBoundary > 0L) { ## find largest gap left <- boundary$left[currentBoundary] right <- boundary$right[currentBoundary] currentBoundary <- currentBoundary-1L gaps <- d[left:(right-1L)] gapIdx <- which.max(gaps)+left-1L ## left side l <- grouper(mass=mass[left:gapIdx], intensities=intensities[left:gapIdx], samples=samples[left:gapIdx], tolerance=tolerance, ...) ## further splitting needed? if (is.na(l[1L])) { currentBoundary <- currentBoundary+1L boundary$left[currentBoundary] <- left boundary$right[currentBoundary] <- gapIdx } else { mass[left:gapIdx] <- l } ## right side r <- grouper(mass=mass[(gapIdx+1L):right], intensities=intensities[(gapIdx+1L):right], samples=samples[(gapIdx+1L):right], tolerance=tolerance, ...) ## further splitting needed? if (is.na(r[1L])) { currentBoundary <- currentBoundary+1L boundary$left[currentBoundary] <- gapIdx+1L boundary$right[currentBoundary] <- right } else { mass[(gapIdx+1L):right] <- r } ## stack size have to be increased? ## (should rarely happen because recursion deep is mostly < 20) if (currentBoundary == nBoundaries) { nBoundaries <- floor(nBoundaries*1.5) boundary$left <- c(boundary$left, double(nBoundaries-currentBoundary)) boundary$right <- c(boundary$right, double(nBoundaries-currentBoundary)) } } return(mass) } MALDIquant/R/range-functions.R0000644000175000017500000000313712211651271017111 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .overlap ## returns largest overlapping mass range of a list of AbstractMassObject ## objects. ## ## params: ## l: list of AbstractMassObject objects ## ## returns: ## double, minimal and maximal mass ## .overlap <- function(l) { ## test argument .stopIfNotIsMassObjectList(l) ## mass values are already sorted leftMass <- .unlist(lapply(l, function(x)x@mass[1L])) rightMass <- .unlist(lapply(l, function(x)x@mass[length(x@mass)])) if (length(rightMass)) { r <- c(max(leftMass, na.rm=TRUE), min(rightMass, na.rm=TRUE)) if (r[1L] < r[2L]) { return(r) } } ## no overlap return(c(0L, 0L)) } ## .reorderRange ## swap range values if needed ## ## params: ## x: range values ## ## returns: ## corrected range values ## .reorderRange <- function(x) { ## sort range if (x[1L] > x[2L]) { x <- x[2L:1L] } return(x) } MALDIquant/R/estimateNoise-methods.R0000644000175000017500000000270312213060522020252 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="estimateNoise", signature=signature(object="MassSpectrum"), definition=function(object, method=c("MAD", "SuperSmoother"), ...) { if (.isEmptyWarning(object)) { return(0L) } method <- match.arg(method) n <- switch(method, "MAD" = { .estimateNoiseMad(object@mass, object@intensity) }, "SuperSmoother" = { .estimateNoiseSuperSmoother(object@mass, object@intensity, ...) }, { stop("Unknown ", sQuote("method"), ".") } ) colnames(n) <- c("mass", "intensity") return(n) }) MALDIquant/R/isRegular-methods.R0000644000175000017500000000174612211174311017404 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f="isRegular", signature=signature(object="MassSpectrum"), definition=function(object, threshold=1e-3) { s <- .irregularScore(object@mass) <= threshold return(!is.na(s) & s) }) MALDIquant/R/Deprecated.R0000644000175000017500000002031412237162331016045 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## deprecated since MALDIquant 1.7.4 ## MassPeaks setMethod(f="totalIonCurrent", signature=signature(object="MassPeaks"), definition=function(object) { .deprecatedFunction("1.7.4") return(as.double(sum(as.double(object@intensity), na.rm=TRUE))) }) ## deprecated since MALDIquant 1.7.6 ## calibrate ## calibrate intensityMatrix ## ## params: ## x: a numeric matrix (generated by MALDIquant::intensityMatrix ## rows: samples; cols: features ## ## returns: ## a calibrated numeric matrix ## if (is.null(getGeneric("calibrate"))) { setGeneric("calibrate", function(x, ...) standardGeneric("calibrate")) } setMethod(f="calibrate", signature=signature(x="matrix"), definition=function(x, ...) { .deprecatedFunction("1.7.6", new="calibrateIntensity") ## create "reference" spectrum/peak list r <- apply(x, 2, median, na.rm=TRUE) ## estimate scale factor s <- apply(x, 1, function(y)median(y/r, na.rm=TRUE)) ## scale matrix x <- apply(x, 2, function(y)y/s) ## add scale attribute attr(x, "scale") <- s return(x) }) if (is.null(getGeneric("standardizeTotalIonCurrent"))) { setGeneric("standardizeTotalIonCurrent", function(object, value=1) standardGeneric("standardizeTotalIonCurrent")) } setMethod(f="standardizeTotalIonCurrent", signature=signature(object="list"), definition=function(object, value=1) { .deprecatedFunction("1.7.6", new="calibrateIntensity") ## test arguments .stopIfNotIsMassObjectList(object) return(lapply(object, "totalIonCurrent<-", value)) }) if (is.null(getGeneric("totalIonCurrent<-"))) { setGeneric("totalIonCurrent<-", function(object, value) standardGeneric("totalIonCurrent<-")) } ## AbstractMassObject setReplaceMethod(f="totalIonCurrent", signature=signature(object="AbstractMassObject", value="numeric"), definition=function(object, value) { .deprecatedFunction("1.7.6", new="calibrateIntensity") if (length(value) != 1) { stop("Length of ", sQuote("value"), " has to be one.") } tic <- totalIonCurrent(object) if (tic) { return(.transformIntensity(object, fun=function(x)x*value/tic)) } else { warning("Total Ion Current is zero! Is spectrum empty?") return(object) } }) ## deprecated since MALDIquant 1.7.10 if (is.null(getGeneric("ltrim"))) { setGeneric("ltrim", function(object, minMass) standardGeneric("ltrim")) } ## AbstractMassObject setMethod("ltrim", signature=signature(object="AbstractMassObject", minMass="numeric"), definition=function(object, minMass) { .deprecatedFunction("1.7.10", new="trim") return(trim(object, range=c(minMass, Inf))) }) ## list setMethod("ltrim", signature=signature(object="list", minMass="numeric"), definition=function(object, minMass) { return(lapply(object, ltrim, minMass=minMass)) }) if (is.null(getGeneric("rtrim"))) { setGeneric("rtrim", function(object, maxMass) standardGeneric("rtrim")) } ## AbstractMassObject setMethod("rtrim", signature=signature(object="AbstractMassObject", maxMass="numeric"), definition=function(object, maxMass) { .deprecatedFunction("1.7.10", new="trim") return(trim(object, range=c(-Inf, maxMass))) }) ## list setMethod("rtrim", signature=signature(object="list", maxMass="numeric"), definition=function(object, maxMass) { return(lapply(object, rtrim, maxMass=maxMass)) }) ## deprecated since MALDIquant 1.7.12 mergeMassSpectra <- function(l, labels, fun=mean, ...) { .deprecatedFunction("1.7.12", new="averageMassSpectra") ## test parameters .stopIfNotIsMassSpectrumList(l) return(.doByLabels(l=l, labels=labels, FUN=.mergeMassSpectra, fun=fun, ...)) } .mergeMassSpectra <- function(l, fun=mean, na.rm=TRUE, ...) { ## very simple score to find the "best" spectrum simpleScore <- function(x) {return(max(x@intensity)/mean(x@intensity))} ## merge metaData metaData <- .mergeMetaData(lapply(l, function(x)x@metaData)) ## look for empty MassSpectrum objects emptyIdx <- findEmptyMassObjects(l) nEmpty <- length(emptyIdx) n <- length(l) if (nEmpty) { l <- l[-emptyIdx] } ## calculate spectra scores maxScore <- which.max(vapply(l, simpleScore, double(1))) if (length(maxScore)) { ## use highest scored spectrum as reference mass <- l[[maxScore]]@mass } else { ## or nothing if all spectra are empty mass <- NA } ## interpolate not existing masses approxSpectra <- lapply(l, approxfun) ## get intensities if (nEmpty) { intensityList <- vector(mode="list", length=n) intensityList[emptyIdx] <- rep(NA, nEmpty) intensityList[-emptyIdx] <- lapply(approxSpectra, function(x)x(mass)) } else { intensityList <- lapply(approxSpectra, function(x)x(mass)) } ## create a matrix which could merged m <- do.call(rbind, intensityList) ## merge intensities intensity <- .merge(m, fun=fun, na.rm=na.rm, ...) ## create an empty spectrum if all intensities are NaN if (is.nan(intensity[1])) { intensity <- double() mass <- double() } return(createMassSpectrum(mass=mass, intensity=intensity, metaData=metaData)) } .merge <- function(m, fun, na.rm=TRUE, ...) { fun <- match.fun(fun) if (identical(fun, mean)) { m <- colMeans(m, na.rm=na.rm) } else if (identical(fun, sum)) { m <- colSums(m, na.rm=na.rm) } else { ## mean, median, sum etc. have their own na.rm argument but maybe some other ## curious merge function lacks na.rm ## [would cause the error: unused argument(s) (na.rm = T)] ## thats why we have to remove NA's for our own if (na.rm) { m <- apply(X=m, MARGIN=2, FUN=function(x){ return(fun(x[!is.na(x)], ...)) }) } else { m <- apply(X=m, MARGIN=2, FUN=fun, ...) } } return(m) } .mergeMassPeaksDeprecated <- function(l, fun=mean, na.rm=TRUE, ...) { ## create a matrix which could merged m <- intensityMatrix(l) mass <- as.double(colnames(m)) ## avoid named intensity/snr slot colnames(m) <- NULL ## merge intensities intensity <- .merge(m, fun=fun, na.rm=na.rm, ...) ## merge snr for (i in seq(along=l)) { m[i, !is.na(m[i, ]) ] <- l[[i]]@snr } snr <- .merge(m, fun=fun, ...) ## merge metaData metaData <- .mergeMetaData(lapply(l, function(x)x@metaData)) return(createMassPeaks(mass=mass, intensity=intensity, snr=snr, metaData=metaData)) } movingAverage <- function(y, halfWindowSize=2L) { .deprecatedFunction("1.7.12", new="smoothIntensity") return(.movingAverage(y, halfWindowSize)) } savitzkyGolay <- function(y, halfWindowSize=10L, polynomialOrder=3L) { .deprecatedFunction("1.7.12", new="smoothIntensity") return(.savitzkyGolay(y, halfWindowSize, polynomialOrder)) } ## deprecated since MALDIquant 1.7.13 isMassObject <- function(x) { .deprecatedFunction("1.7.13") return(.isMassObject(x)) } isMassObjectList <- function(x) { .deprecatedFunction("1.7.13") return(.isMassObjectList(x)) } ## deprecated since MALDIquant 1.8.4 ## intensityMatrix for MassSpectrum objects ## TODO: remove corresponding code in intensityMatrix .intensityMatrixDeprecated <- function(l) { mass <- sort(x=.unlist(lapply(l, function(x)x@mass)), method="quick") uniqueMass <- unique(mass) ## build matrix m <- do.call(rbind, lapply(l, function(x) { return(x@intensity[match(x=uniqueMass, table=x@mass, nomatch=NA)])})) ## set column names dimnames(m) <- list(NULL, c(uniqueMass)) return(m) } MALDIquant/R/metaData-methods.R0000644000175000017500000000223012207736463017175 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="metaData", signature=signature(object="AbstractMassObject"), definition=function(object) { return(object@metaData) }) ## AbstractMassObject setReplaceMethod(f="metaData", signature=signature(object="AbstractMassObject"), definition=function(object, value) { object@metaData <- value return(object) }) MALDIquant/R/subset-methods.R0000644000175000017500000000362412211651271016756 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="[", signature=signature(x="AbstractMassObject", i="numeric", j="missing"), definition=function(x, i, j, ..., drop=TRUE) { x@mass <- x@mass[i] x@intensity <- x@intensity[i] return(x) }) ## AbstractMassObject setMethod(f="[", signature=signature(x="AbstractMassObject", i="logical", j="missing"), definition=function(x, i, j, ..., drop=TRUE) { ## seems to be faster than evaluating the logical expression twice i <- which(i) x@mass <- x@mass[i] x@intensity <- x@intensity[i] return(x) }) setMethod(f="[", signature=signature(x="MassPeaks", i="numeric", j="missing"), definition=function(x, i, j, ..., drop=TRUE) { x@mass <- x@mass[i] x@intensity <- x@intensity[i] x@snr <- x@snr[i] return(x) }) ## AbstractMassObject setMethod(f="[", signature=signature(x="MassPeaks", i="logical", j="missing"), definition=function(x, i, j, ..., drop=TRUE) { ## seems to be faster than evaluating the logical expression twice i <- which(i) x@mass <- x@mass[i] x@intensity <- x@intensity[i] x@snr <- x@snr[i] return(x) }) MALDIquant/R/isFunctionList-functions.R0000644000175000017500000000232712211651271020772 0ustar sebastiansebastian## Copyright 2012-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see .isFunctionList <- function(x) { if (!is.list(x)) { return(FALSE) } areFunctions <- length(x) && all(.unlist(vapply(x, is.function, logical(1L)))) return(areFunctions) } .stopIfNotIsFunctionList <- function(x) { if (!.isFunctionList(x)) { parentCall <- deparse(sys.call(-1L)) stop(parentCall, " : ", sQuote(deparse(substitute(x))), " is no list of functions!", call.=FALSE) return(FALSE) } return(TRUE) } MALDIquant/R/calibrateIntensity-functions.R0000644000175000017500000000535012211652226021652 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .calibrateIntensitySimple ## calibrate intensity values by offset and scaling factor ## ## params: ## y: double, intensity values ## offset: double/function ## scaling: double/function ## ## returns: ## double, calibrated intensity values ## .calibrateIntensitySimple <- function(y, offset=0L, scaling=1L) { if (is.function(offset)) { offset <- offset(y) } if (is.function(scaling)) { scaling <- scaling(y) } return( (y-offset)/scaling ) } ## .calibrateProbabilisticQuotientNormalization ## calibrate intensity values by Probabilistic Quotient Normalization ## ## F. Dieterle, A. Ross, G. Schlotterbeck, and Hans Senn. ## "Probabilistic quotient normalization as robust method to account for ## dilution of complex biological mixtures. Application in 1H NMR ## metabonomics." ## Analytical Chemistry 78, no. 13 (2006): 4281-4290. ## ## 1. Perform an integral normalization (typically a constant ## integral of 100 is used). ## 2. Choose/calculate the reference spectrum (the best approach ## is the calculation of the median spectrum of control samples). ## 3. Calculate the quotients of all variables of interest of the test ## spectrum with those of the reference spectrum. ## 4. Calculate the median of these quotients. ## 5. Divide all variables of the test spectrum by this median. ## ## params: ## l: list of MassSpectrum objects ## ## returns: ## list of calibrated MassSpectrum objects ## .calibrateProbabilisticQuotientNormalization <- function(l) { ## 1. integral normalization (==TIC) l <- calibrateIntensity(l, method="TIC") ## 2. median reference spectrum reference <- .averageMassSpectra(l, fun=.colMedians, mergeMetaData=FALSE) return(lapply(l, function(x) { ## 3. quotient calculation q <- approxfun(x)(reference@mass)/reference@intensity ## 4. median m <- median(q, na.rm=TRUE) ## 5. divide by median x <- .transformIntensity(x, fun=.calibrateIntensitySimple, offset=0L, scaling=m) return(x) })) } MALDIquant/R/valid-methods.R0000644000175000017500000000275312207737253016564 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject .validAbstractMassObject <- function(object) { if (length(object@mass) != length(object@intensity)) { return(paste0("Lengths of mass (", length(object@mass), ") and intensity (", length(object@intensity), ") have to be equal.")) } return(TRUE) } setValidity("AbstractMassObject", method=.validAbstractMassObject) .validMassPeaks <- function(object) { if (length(object@intensity) != length(object@snr)) { return(paste0("Lengths of intensity (", length(object@intensity), ") and snr(", length(object@snr), ") have to be equal.")) } return(.validAbstractMassObject(object)) } setValidity("MassPeaks", method=.validMassPeaks) MALDIquant/R/irregular-functions.R0000644000175000017500000000176712211651271020020 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .irregularScore ## calculate frequency of irregular data ## ## params: ## x: double ## ## returns: ## double, frequency of irregular data ## .irregularScore <- function(x) { d <- diff(x) d <- d[-1L] < head(d, -1L) return(mean(d)) } MALDIquant/R/colMedians-functions.R0000644000175000017500000000162012211651271020066 0ustar sebastiansebastian## Copyright 2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see .colMedians <- function(x, na.rm=FALSE) { stopifnot(is.matrix(x)) stopifnot(is.logical(na.rm)) return(.Call("C_colMedians", x, na.rm)) } MALDIquant/R/merge-functions.R0000644000175000017500000000647112263537432017131 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## mergeMassPeaks ## merge MassPeaks objects ## ## params: ## l: list of MassPeaks objects ## labels: factor, labels for samples ## fun: merge function ## ## returns: ## a new MassPeaks object or a list of new MassPeaks objects ## mergeMassPeaks <- function(l, labels, method=c("mean", "median", "sum"), ignore.na=TRUE, fun, ... ## deprecated ) { ## test arguments .stopIfNotIsMassPeaksList(l) if (!missing(fun)) { .deprecatedArgument("1.7.12", "fun", "method") return(.doByLabels(l=l, labels=labels, FUN=.mergeMassPeaksDeprecated, fun=fun, ...)) } method <- match.arg(method) fun <- switch(method, "mean" = { colMeans }, "median" = { .colMedians }, "sum" = { colSums }, { stop("Unknown ", sQuote("method"), ".") } ) return(.doByLabels(l=l, labels=labels, FUN=.mergeMassPeaks, fun=fun, ignore.na=ignore.na)) } ## .mergeMassPeaks ## merge MassPeaks objects ## ## params: ## l: list of MassPeaks objects ## fun: merge function ## ## returns: ## a new MassPeaks object ## .mergeMassPeaks <- function(l, fun=colMeans, ignore.na=TRUE) { fun <- match.fun(fun) ## create a matrix which could merged m <- .as.matrix.MassObjectList(l) mass <- as.double(colnames(m)) ## avoid named intensity/snr slot colnames(m) <- NULL isNA <- is.na(m) if (!ignore.na) { m[isNA] <- 0L } ## merge intensities intensity <- fun(m, na.rm=TRUE) ## merge snr for (i in seq(along=l)) { m[i, !isNA[i, ]] <- l[[i]]@snr } snr <- fun(m, na.rm=TRUE) ## merge metaData metaData <- .mergeMetaData(lapply(l, function(x)x@metaData)) return(createMassPeaks(mass=mass, intensity=intensity, snr=snr, metaData=metaData)) } ## merge different metaData by equal list names ## ## params ## m: list of metaData ## ## returns: ## merged list ## .mergeMetaData <- function(m) { .flat <- function(x) {return(unname(unlist(x)))} nm <- names(m[[1L]]) names(nm) <- nm m <- lapply(nm, function(n) { cur <- m[[1L]][[n]] all <- lapply(m, function(x)x[[n]]) len <- lapply(all, function(x)length(x)) if (!all(length(cur) == len) || !all(.flat(cur) == .flat(all))) { if (!is.list(cur)) { all <- unlist(all) } return(unname(all)) } else { return(cur) } }) return(m) } MALDIquant/R/which.closest-functions.R0000644000175000017500000000242012211651271020564 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## .which.closest ## a relaxed version of which (returns the nearest index) ## ## params: ## x: numeric key value to look for ## vec: numeric, has to be sorted ## ## returns: ## a vector of indices ## .which.closest <- function(x, vec) { ## find left interval lIdx <- findInterval(x, vec, rightmost.closed=FALSE, all.inside=TRUE) rIdx <- lIdx+1L ## calculate differences for left and right lDiff <- abs(vec[lIdx]-x) rDiff <- abs(vec[rIdx]-x) return(ifelse(rDiff == pmin(lDiff, rDiff), rIdx, lIdx)) } MALDIquant/R/plot-methods.R0000644000175000017500000000425612237162331016433 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="plot", signature=signature(x="AbstractMassObject", y="missing"), definition=function(x, col="black", xlab="mass", ylab="intensity", type=ifelse(isMassPeaks(x), "h", "l"), xlim=c(ifelse(length(x@mass), min(x@mass, na.rm=TRUE), 0L), ifelse(length(x@mass), max(x@mass, na.rm=TRUE), 1L)), ylim=c(0, ifelse(length(x@intensity), max(x@intensity, na.rm=TRUE), 1L)), main=x@metaData$name, sub=x@metaData$file, cex.sub=0.75, col.sub="#808080", abline.col="#808080", ...) { if (all(sub == x@metaData$file) && length(x@metaData$file) > 1L) { sub <- paste0(ifelse(isMassSpectrum(x), "averaged spectrum", "merged peaks"), " composed of ", length(x@metaData$file), " ", ifelse(isMassSpectrum(x), "MassSpectrum", "MassPeaks"), " objects") } plot(x=x@mass, y=x@intensity, col=col, type=type, xlab=xlab, ylab=ylab, xlim=xlim, ylim=ylim, main=main, sub=sub, cex.sub=cex.sub, col.sub=col.sub, ...) abline(h=0L, col=abline.col) }) MALDIquant/R/lines-methods.R0000644000175000017500000000176012211651271016562 0ustar sebastiansebastian## Copyright 2011-2012 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## AbstractMassObject setMethod(f="lines", signature=signature(x="AbstractMassObject"), definition=function(x, type=ifelse(isMassPeaks(x), "h", "l"), ...) { lines(x=x@mass, y=x@intensity, type, ...); }); MALDIquant/R/findLocalMaxima-methods.R0000644000175000017500000000323012211651271020472 0ustar sebastiansebastian## Copyright 2011-2013 Sebastian Gibb ## ## ## This file is part of MALDIquant for R and related languages. ## ## MALDIquant 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 3 of the License, or ## (at your option) any later version. ## ## MALDIquant 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 MALDIquant. If not, see ## MassSpectrum setMethod(f=".findLocalMaxima", signature=signature(object="MassSpectrum"), definition=function(object, halfWindowSize=20L) { if (.isEmptyWarning(object)) { return(matrix(ncol=2L, dimnames=list(list(), list("mass", "intensity")))) } localMaxima <- .findLocalMaximaLogical(object, halfWindowSize=halfWindowSize) m <- cbind(object@mass, object@intensity)[localMaxima,] colnames(m) <- c("mass", "intensity") return(m) }) setMethod(f=".findLocalMaximaLogical", signature=signature(object="MassSpectrum"), definition=function(object, halfWindowSize=20L) { if (.isEmptyWarning(object)) { return(logical()) } .stopIfNotIsValidHalfWindowSize(halfWindowSize=halfWindowSize, n=length(object)) localMaxima <- .localMaxima(object@intensity, halfWindowSize=halfWindowSize) return(localMaxima) })