diff options
289 files changed, 7031 insertions, 4603 deletions
@@ -1408,6 +1408,7 @@ DOCUMENTATION doctitle="Scala Standard Library" docversion="${version.number}" docsourceurl="https://lampsvn.epfl.ch/trac/scala/browser/scala/branches/2.9.x/src/€{FILE_PATH}.scala#L1" + docUncompilable="${src.dir}/library-aux" sourcepath="${src.dir}" classpathref="pack.classpath"> <src> @@ -1418,16 +1419,12 @@ DOCUMENTATION </src> <include name="**/*.scala"/> <exclude name="reflect/Code.scala"/> - <exclude name="reflect/Manifest.scala"/> <exclude name="reflect/Print.scala"/> <exclude name="reflect/Symbol.scala"/> <exclude name="reflect/Tree.scala"/> <exclude name="reflect/Type.scala"/> - <exclude name="reflect/TypedCode.scala"/> - <exclude name="runtime/*Array.scala"/> <exclude name="runtime/*$.scala"/> <exclude name="runtime/ScalaRunTime.scala"/> - <exclude name="runtime/StreamCons.scala"/> <exclude name="runtime/StringAdd.scala"/> <exclude name="scala/swing/test/**"/> </scaladoc> diff --git a/lib/msil.jar.desired.sha1 b/lib/msil.jar.desired.sha1 index 17f033a68e..6a95abf8e6 100644 --- a/lib/msil.jar.desired.sha1 +++ b/lib/msil.jar.desired.sha1 @@ -1 +1 @@ -23d40035aaa9efd273ae4ad7ca1ed30282946d68 ?msil.jar +411bfee5f3b2b6bae5f6ac06f84b4f4624370492 ?msil.jar diff --git a/project/build/SVN.scala b/project/build/SVN.scala index 6a4f845cbc..6a64e727f9 100644 --- a/project/build/SVN.scala +++ b/project/build/SVN.scala @@ -6,7 +6,7 @@ import sbt._ */ class SVN(root: Path) { /** Location of tool which parses svn revision in git-svn repository. */ - val GitSvnRevTool = root / "tools" / "get-git-svn-rev" + val GitSvnRevTool = root / "tools" / "get-scala-revision" val GitSvnRegex = """^Revision:\s*(\d+).*""".r /** diff --git a/src/build/genprod.scala b/src/build/genprod.scala index d1c610d046..d587d0464d 100644 --- a/src/build/genprod.scala +++ b/src/build/genprod.scala @@ -15,7 +15,7 @@ * @author Burak Emir, Stephane Micheloud, Geoffrey Washburn, Paul Phillips * @version 1.1 */ -object genprod extends Application { +object genprod extends App { val MAX_ARITY = 22 def arities = (1 to MAX_ARITY).toList @@ -38,6 +38,7 @@ object genprod extends Application { def to = (1 to i).toList def s = if (i == 1) "" else "s" def className = name + i + def classAnnotation = "" def fileName = className + ".scala" def targs = to map ("T" + _) def vdefs = to map ("v" + _) @@ -72,7 +73,6 @@ package %s """.trim.format(genprodString, packageDef, imports) } - def args = arguments if (args.length != 1) { println("please give path of output directory") exit(-1) @@ -110,8 +110,9 @@ object FunctionZero extends Function(0) { } object FunctionOne extends Function(1) { + override def classAnnotation = "@annotation.implicitNotFound(msg = \"No implicit view available from ${T1} => ${R}.\")\n" override def contravariantSpecs = "@specialized(scala.Int, scala.Long, scala.Float, scala.Double) " - override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) " + override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) " override def descriptiveComment = functionNTemplate.format("succ", "anonfun1", """ @@ -183,7 +184,7 @@ class Function(val i: Int) extends Group("Function") with Arity { /** A function of {i} parameter{s}. * {descriptiveComment} */ -trait {className}{contraCoArgs} extends AnyRef {{ self => +{classAnnotation}trait {className}{contraCoArgs} extends AnyRef {{ self => /** Apply the body of this function to the argument{s}. * @return the result of function application. */ @@ -298,7 +299,7 @@ object TupleTwo extends Tuple(2) * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) @@ -406,7 +407,7 @@ object TupleThree extends Tuple(3) { * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2], diff --git a/src/build/pack.xml b/src/build/pack.xml index fa8dc4d935..123fd0b8fe 100644 --- a/src/build/pack.xml +++ b/src/build/pack.xml @@ -21,12 +21,21 @@ MAIN DISTRIBUTION PACKAGING </target> <target name="pack-archives.tar" depends="pack-archives.start"> - <tar destfile="${dists.dir}/archives/scala-${version.number}.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}" + compression="none" longfile="gnu"> <tarfileset dir="${dist.dir}" prefix="scala-${version.number}" includes="bin/**" mode="755"/> <tarfileset dir="${dist.dir}" prefix="scala-${version.number}" excludes="bin/**"/> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}" destfile="${dists.dir}/archives/scala-${version.number}.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.zip" depends="pack-archives.tar"> @@ -37,16 +46,25 @@ MAIN DISTRIBUTION PACKAGING </target> <target name="pack-devel-docs.tar" depends="pack-archives.zip"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs" + compression="none" longfile="gnu"> <tarfileset dir="${dist.dir}/doc/scala-devel-docs" prefix="scala-${version.number}-devel-docs"/> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}-devel-docs" destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-devel-docs"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}-devel-docs" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}-devel-docs.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.src" depends="pack-devel-docs.tar"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}-sources" + compression="none" longfile="gnu"> <tarfileset dir="${basedir}" prefix="scala-${version.number}-sources"> <exclude name="bin/**"/> <exclude name="build/**"/> @@ -60,7 +78,16 @@ MAIN DISTRIBUTION PACKAGING <include name="test/partest"/> </tarfileset> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-sources.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}-sources" destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-sources"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}-sources" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}-sources.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.done" depends="pack-archives.src"/> @@ -120,7 +147,8 @@ MAIN DISTRIBUTION SBAZ <binset dir="${basedir}/test" includes="clitest,diff/diff.*,diff/lib*.dll,partest,partest.bat"/> <miscset dir="${basedir}/test" - includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/**/*.test"/> + includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/specialized/*.txt,files/**/*.test" + excludes="files/presentation"/> <!-- <srcset dir="${dist.dir}/src" includes="scala-partest-src.jar"/> --> <libset dir="${dist.dir}/lib" includes="scala-partest.jar"/> <libset dir="${lib.dir}" includes="scalacheck.jar"/> @@ -262,41 +290,11 @@ MAIN DISTRIBUTION SBAZ <target name="pack-maven.done" depends="pack-maven.scripts"/> <!-- =========================================================================== -JAVA FOUR DISTRIBUTION PACKAGING -============================================================================ --> - - <target name="fourpack-archives.start"> - <mkdir dir="${dists.dir}/archives"/> - </target> - - <target name="fourpack-archives.tar" depends="fourpack-archives.start"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" - compression="gzip" longfile="gnu"> - <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4" - includes="bin/**" mode="755"/> - <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4" - excludes="bin/**"/> - </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" fileext=".md5"/> - </target> - - <target name="fourpack-archives.zip" depends="fourpack-archives.tar"> - <zip destfile="${dists.dir}/archives/scala-${version.number}-jvm4.zip"> - <zipfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"/> - </zip> - <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.zip" fileext=".md5"/> - </target> - - <target name="fourpack-archives.done" depends="fourpack-archives.zip"/> - -<!-- =========================================================================== MISCELLANEOUS ============================================================================ --> <target name="pack-all.done" depends="pack-archives.done, pack-sbaz.done, pack-maven.done"/> - <target name="fourpack-all.done" depends="fourpack-archives.done"/> - <!-- =========================================================================== MISCELLANEOUS ============================================================================ --> diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala index 727b8db0cc..419f60af21 100644 --- a/src/compiler/scala/tools/ant/Scaladoc.scala +++ b/src/compiler/scala/tools/ant/Scaladoc.scala @@ -112,6 +112,9 @@ class Scaladoc extends ScalaMatchingTask { /** Instruct the compiler to generate links to sources */ private var docsourceurl: Option[String] = None + /** Point scaladoc at uncompilable sources. */ + private var docUncompilable: Option[String] = None + /** Instruct the compiler to use additional parameters */ private var addParams: String = "" @@ -331,6 +334,10 @@ class Scaladoc extends ScalaMatchingTask { buildError("Unknown unchecked flag '" + input + "'") } + def setDocUncompilable(input: String) { + docUncompilable = Some(input) + } + /*============================================================================*\ ** Properties getters ** \*============================================================================*/ @@ -518,6 +525,8 @@ class Scaladoc extends ScalaMatchingTask { if (!doctitle.isEmpty) docSettings.doctitle.value = decodeEscapes(doctitle.get) if (!docversion.isEmpty) docSettings.docversion.value = decodeEscapes(docversion.get) if (!docsourceurl.isEmpty) docSettings.docsourceurl.value =decodeEscapes(docsourceurl.get) + if (!docUncompilable.isEmpty) docSettings.docUncompilable.value = decodeEscapes(docUncompilable.get) + docSettings.deprecation.value = deprecation docSettings.unchecked.value = unchecked if (!docgenerator.isEmpty) docSettings.docgenerator.value = docgenerator.get diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl index 3280796878..1976535333 100644 --- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl @@ -86,7 +86,7 @@ if $cygwin; then case "$TERM" in rxvt* | xterm*) stty -icanon min 1 -echo - CYGWIN_JLINE_TERMINAL="-Djline.terminal=jline.UnixTerminal" + CYGWIN_JLINE_TERMINAL="-Djline.terminal=scala.tools.jline.UnixTerminal" ;; esac fi diff --git a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl index a5fd17a7a9..21651831df 100644 --- a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl @@ -15,14 +15,6 @@ if "%OS%" NEQ "Windows_NT" ( @@setlocal
call :set_home
-set _ARGS=
-:loop
- rem Argument %1 may contain quotes so we use parentheses here
- if (%1)==() goto :looped
- set _ARGS=%_ARGS% %1
- shift
-goto loop
-:looped
rem We use the value of the JAVACMD environment variable if defined
set _JAVACMD=%JAVACMD%
@@ -47,8 +39,8 @@ if "%_TOOL_CLASSPATH%"=="" ( set _PROPS=-Dscala.home="%_SCALA_HOME%" -Denv.emacs="%EMACS%" @properties@
-rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
-"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
+rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
+"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
goto end
rem ##########################################################################
diff --git a/src/compiler/scala/tools/cmd/gen/AnyVals.scala b/src/compiler/scala/tools/cmd/gen/AnyVals.scala index f6f48359cd..a1280eec8e 100644 --- a/src/compiler/scala/tools/cmd/gen/AnyVals.scala +++ b/src/compiler/scala/tools/cmd/gen/AnyVals.scala @@ -6,9 +6,139 @@ package scala.tools.cmd package gen +/** Code generation of the AnyVal types and their companions. + */ +trait AnyValReps { + self: AnyVals => + + sealed abstract class AnyValNum(name: String) extends AnyValRep(name) { + def isCardinal: Boolean = isIntegerType(this) + def unaryOps = if (isCardinal) List("+", "-", "~") else List("+", "-") + def bitwiseOps = if (isCardinal) List("|", "&", "^") else Nil + def shiftOps = if (isCardinal) List("<<", ">>>", ">>") else Nil + def comparisonOps = List("==", "!=", "<", "<=", ">", ">=") + def otherOps = List("+", "-" ,"*", "/", "%") + + // Given two numeric value types S and T , the operation type of S and T is defined as follows: + // If both S and T are subrange types then the operation type of S and T is Int. + // Otherwise the operation type of S and T is the larger of the two types wrt ranking. + // Given two numeric values v and w the operation type of v and w is the operation type + // of their run-time types. + def opType(that: AnyValNum): AnyValNum = { + val rank = IndexedSeq(I, L, F, D) + (rank indexOf this, rank indexOf that) match { + case (-1, -1) => I + case (r1, r2) => rank apply (r1 max r2) + } + } + + def mkCoercions = numeric map (x => "def to%s: %s".format(x, x)) + def mkUnaryOps = unaryOps map (x => "def unary_%s : %s".format(x, this opType I)) + def mkStringOps = List("def +(x: String): String") + def mkShiftOps = ( + for (op <- shiftOps ; arg <- List(I, L)) yield + "def %s(x: %s): %s".format(op, arg, this opType I) + ) + + def clumps: List[List[String]] = { + val xs1 = List(mkCoercions, mkUnaryOps, mkStringOps, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "") + val xs2 = List( + mkBinOpsGroup(comparisonOps, numeric, _ => Z), + mkBinOpsGroup(bitwiseOps, cardinal, this opType _), + mkBinOpsGroup(otherOps, numeric, this opType _) + ) + xs1 ++ xs2 + } + def classLines = clumps.foldLeft(List[String]()) { + case (res, Nil) => res + case (res, lines) => + val xs = lines map { + case "" => "" + case s => interpolate(s) + " = " + stub + } + res ++ xs + } + def objectLines = { + val comp = if (isCardinal) cardinalCompanion else floatingCompanion + (comp + allCompanions).trim.lines map interpolate toList + } + + /** Makes a set of binary operations based on the given set of ops, args, and resultFn. + * + * @param ops list of function names e.g. List(">>", "%") + * @param args list of types which should appear as arguments + * @param resultFn function which calculates return type based on arg type + * @return list of function definitions + */ + def mkBinOpsGroup(ops: List[String], args: List[AnyValNum], resultFn: AnyValNum => AnyValRep): List[String] = ( + ops flatMap (op => + args.map(arg => "def %s(x: %s): %s".format(op, arg, resultFn(arg))) :+ "" + ) + ).toList + } + + sealed abstract class AnyValRep(val name: String) { + def classLines: List[String] + def objectLines: List[String] + + def lcname = name.toLowerCase + def boxedName = this match { + case U => "scala.runtime.BoxedUnit" + case C => "java.lang.Character" + case I => "java.lang.Integer" + case _ => "java.lang." + name + } + def zeroRep = this match { + case L => "0L" + case F => "0.0f" + case D => "0.0d" + case _ => "0" + } + + def indent(s: String) = if (s == "") "" else " " + s + def indentN(s: String) = s.lines map indent mkString "\n" + + def boxUnboxImpls = Map( + "@boxImpl@" -> "%s.valueOf(x)".format(boxedName), + "@unboxImpl@" -> "x.asInstanceOf[%s].%sValue()".format(boxedName, lcname), + "@unboxDoc@" -> "the %s resulting from calling %sValue() on `x`".format(name, lcname) + ) + def interpolations = Map( + "@name@" -> name, + "@boxed@" -> boxedName, + "@lcname@" -> lcname, + "@zero@" -> zeroRep + ) ++ boxUnboxImpls + + def interpolate(s: String): String = interpolations.foldLeft(s) { + case (str, (key, value)) => str.replaceAll(key, value) + } + def classDoc = interpolate(classDocTemplate) + def objectDoc = "" + def mkImports = "" + def mkClass = assemble("final class", "AnyVal", classLines) + "\n" + def mkObject = assemble("object", "AnyValCompanion", objectLines) + "\n" + def make() = List[String]( + headerTemplate, + mkImports, + classDoc, + mkClass, + objectDoc, + mkObject + ) mkString "" + + def assemble(what: String, parent: String, lines: List[String]): String = { + val decl = "%s %s extends %s ".format(what, name, parent) + val body = if (lines.isEmpty) "{ }\n\n" else lines map indent mkString ("{\n", "\n", "\n}\n") + + decl + body + } + override def toString = name + } +} + trait AnyValTemplates { - def timestampString = "" - def template = (""" + def headerTemplate = (""" /* __ *\ ** ________ ___ / / ___ Scala API ** ** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL ** @@ -20,60 +150,61 @@ trait AnyValTemplates { %s package scala -import java.{ lang => jl } - """.trim.format(timestampString) + "\n\n" - ) - - def booleanBody = """ -final class Boolean extends AnyVal { - def unary_! : Boolean = sys.error("stub") - - def ==(x: Boolean): Boolean = sys.error("stub") - def !=(x: Boolean): Boolean = sys.error("stub") - def ||(x: Boolean): Boolean = sys.error("stub") - def &&(x: Boolean): Boolean = sys.error("stub") - // Compiler won't build with these seemingly more accurate signatures - // def ||(x: => Boolean): Boolean = sys.error("stub") - // def &&(x: => Boolean): Boolean = sys.error("stub") - def |(x: Boolean): Boolean = sys.error("stub") - def &(x: Boolean): Boolean = sys.error("stub") - def ^(x: Boolean): Boolean = sys.error("stub") -} +""".trim.format(timestampString) + "\n\n") -object Boolean extends AnyValCompanion { - override def toString = "object scala.Boolean" - def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x) - def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue() -} - """.trim + def classDocTemplate = (""" +/** `@name@` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.@name@]] => [[scala.runtime.Rich@name@]] + * which provides useful non-primitive operations. + */ +""".trim + "\n") - def unitBody = """ -import runtime.BoxedUnit + def timestampString = "// DO NOT EDIT, CHANGES WILL BE LOST.\n" + def stub = """sys.error("stub")""" -final class Unit extends AnyVal { } + def allCompanions = """ +/** Transform a value type into a boxed reference type. + * + * @param x the @name@ to be boxed + * @return a @boxed@ offering `x` as its underlying value. + */ +def box(x: @name@): @boxed@ = @boxImpl@ + +/** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a @boxed@. + * + * @param x the @boxed@ to be unboxed. + * @throws ClassCastException if the argument is not a @boxed@ + * @return @unboxDoc@ + */ +def unbox(x: java.lang.Object): @name@ = @unboxImpl@ -object Unit extends AnyValCompanion { - override def toString = "object scala.Unit" - def box(x: Unit): BoxedUnit = BoxedUnit.UNIT - def unbox(x: jl.Object): Unit = () -} - """.trim +/** The String representation of the scala.@name@ companion object. + */ +override def toString = "object scala.@name@" +""" def cardinalCompanion = """ -final val MinValue = @type@.MIN_VALUE -final val MaxValue = @type@.MAX_VALUE +/** The smallest value representable as a @name@. + */ +final val MinValue = @boxed@.MIN_VALUE -def box(x: @name@): @type@ = @type@.valueOf(x) -def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value() -override def toString = "object scala.@name@" - """.trim.lines +/** The largest value representable as a @name@. + */ +final val MaxValue = @boxed@.MAX_VALUE +""" def floatingCompanion = """ -/** The smallest positive value greater than @zero@.*/ -final val MinPositiveValue = @type@.MIN_VALUE -final val NaN = @type@.NaN -final val PositiveInfinity = @type@.POSITIVE_INFINITY -final val NegativeInfinity = @type@.NEGATIVE_INFINITY +/** The smallest positive value greater than @zero@ which is + * representable as a @name@. + */ +final val MinPositiveValue = @boxed@.MIN_VALUE +final val NaN = @boxed@.NaN +final val PositiveInfinity = @boxed@.POSITIVE_INFINITY +final val NegativeInfinity = @boxed@.NEGATIVE_INFINITY @deprecated("use @name@.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -83,138 +214,67 @@ final val Epsilon = MinPositiveValue * is the smallest positive value representable by a @name@. In Scala that number * is called @name@.MinPositiveValue. */ -final val MinValue = -@type@.MAX_VALUE +final val MinValue = -@boxed@.MAX_VALUE /** The largest finite positive number representable as a @name@. */ -final val MaxValue = @type@.MAX_VALUE - -def box(x: @name@): @type@ = @type@.valueOf(x) -def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value() -override def toString = "object scala.@name@" - """.trim.lines +final val MaxValue = @boxed@.MAX_VALUE +""" } -class AnyVals extends AnyValTemplates { - val B = "Byte" - val S = "Short" - val C = "Char" - val I = "Int" - val L = "Long" - val F = "Float" - val D = "Double" - - lazy val cardinal = List(B, S, C, I, L) - lazy val floating = List(F, D) - lazy val numeric = cardinal ++ floating - - def javaType(primType: String) = "jl." + (primType match { - case C => "Character" - case I => "Integer" - case t => t - }) - - def make() = - (numeric zip (numeric map (name => new AnyValOps(name).make()))) ++ List( - ("Boolean", template + booleanBody), - ("Unit", template + unitBody) - ) - - class AnyValOps(name: String) { - val isCardinal = cardinal contains name - val restype = if ("LFD" contains name.head) name else I - val tpe = javaType(name) - val zero = name.head match { - case 'L' => "0L" - case 'F' => "0.0f" - case 'D' => "0.0d" - case _ => "0" - } - val interpolations = Map( - "@restype@" -> restype, - "@name@" -> name, - "@type@" -> tpe, - "@lcname@" -> name.toLowerCase, - "@zero@" -> zero - ) - - def mkCoercions = numeric map (x => "def to%s: %s".format(x, x)) - def mkUnaryOps = unaryops map (op => "def unary_%s : @restype@".format(op)) - def mkCommon = List( - "def +(x: String): String" - ) - def mkShiftOps = ( - for (op <- shiftops ; tpe <- List(I, L)) yield - "def %s(x: %s): @restype@".format(op, tpe) - ) - - def clumps: List[List[String]] = { - val xs1 = List(mkCoercions, mkUnaryOps, mkCommon, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "") - val xs2 = List( - mkBinOpsGroup(boolBinops, numeric, _ => "Boolean"), - mkBinOpsGroup(bitwiseops, cardinal, resultTypeForArg), - mkBinOpsGroup(otherBinops, numeric, resultTypeForArg) - ) - xs1 ++ xs2 - } - - def defImplementation = "sys.error(\"stub\")" - def indent(s: String) = if (s == "") "" else " " + s - def mkClass = { - val lines = clumps.foldLeft(List[String]()) { - case (res, Nil) => res - case (res, lines) => - val xs = lines map { - case "" => "" - case s => interpolate(s) + " = " + defImplementation - } - res ++ xs - } - assemble("final class", "AnyVal", lines) - } - def mkObject = assemble("object", "AnyValCompanion", companionBody map interpolate toList) - - def assemble(what: String, parent: String, lines: List[String]): String = ( - List(what, name, "extends", parent, "{").mkString(" ") +: - (lines map indent) :+ - "}" - ).mkString("\n", "\n", "\n") - - def make() = template + mkClass + "\n" + mkObject - - def interpolate(s: String): String = interpolations.foldLeft(s) { - case (str, (key, value)) => str.replaceAll(key, value) - } - - /** Makes a set of binary operations based on the given set of ops, args, and resultFn. - * - * @param ops list of function names e.g. List(">>", "%") - * @param args list of types which should appear as arguments - * @param resultFn function which calculates return type based on arg type - * @return list of function definitions - */ - def mkBinOpsGroup(ops: List[String], args: List[String], resultFn: String => String): List[String] = ( - ops flatMap { op => - args.map(arg => "def %s(x: %s): ".format(op, arg) + resultFn(arg)) :+ "" - } +class AnyVals extends AnyValReps with AnyValTemplates { + object B extends AnyValNum("Byte") + object S extends AnyValNum("Short") + object C extends AnyValNum("Char") + object I extends AnyValNum("Int") + object L extends AnyValNum("Long") + object F extends AnyValNum("Float") + object D extends AnyValNum("Double") + object Z extends AnyValRep("Boolean") { + def classLines = """ +def unary_! : Boolean = sys.error("stub") + +def ==(x: Boolean): Boolean = sys.error("stub") +def !=(x: Boolean): Boolean = sys.error("stub") +def ||(x: Boolean): Boolean = sys.error("stub") +def &&(x: Boolean): Boolean = sys.error("stub") +// Compiler won't build with these seemingly more accurate signatures +// def ||(x: => Boolean): Boolean = sys.error("stub") +// def &&(x: => Boolean): Boolean = sys.error("stub") +def |(x: Boolean): Boolean = sys.error("stub") +def &(x: Boolean): Boolean = sys.error("stub") +def ^(x: Boolean): Boolean = sys.error("stub") + """.trim.lines.toList + + def objectLines = interpolate(allCompanions).lines.toList + } + object U extends AnyValRep("Unit") { + override def classDoc = """ +/** Unit is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. There is + * only one value of type Unit: `()`. + */ +""" + def classLines = Nil + def objectLines = interpolate(allCompanions).lines.toList + + override def boxUnboxImpls = Map( + "@boxImpl@" -> "scala.runtime.BoxedUnit.UNIT", + "@unboxImpl@" -> "()", + "@unboxDoc@" -> "the Unit value ()" ) + } - def resultTypeForArg(arg: String): String = arg match { - case L if isCardinal => L - case F => if (name == D) D else F - case D => D - case _ => restype - } + def isSubrangeType = Set(B, S, C) + def isIntegerType = Set(B, S, C, I, L) + def isFloatingType = Set(F, D) + def isWideType = Set(L, D) - def unaryops = if (isCardinal) List("+", "-", "~") else List("+", "-") - def bitwiseops = if (isCardinal) List("|", "&", "^") else Nil - def shiftops = if (isCardinal) List("<<", ">>>", ">>") else Nil - def boolBinops = List("==", "!=", "<", "<=", ">", ">=") - def otherBinops = List("+", "-" ,"*", "/", "%") + def cardinal = numeric filter isIntegerType + def numeric = List(B, S, C, I, L, F, D) + def values = List(U, Z) ++ numeric - def companionBody = - if (isCardinal) cardinalCompanion - else floatingCompanion - } + def make() = values map (x => (x.name, x.make())) } -object AnyVals extends AnyVals { }
\ No newline at end of file +object AnyVals extends AnyVals { } + diff --git a/src/compiler/scala/tools/cmd/gen/Codegen.scala b/src/compiler/scala/tools/cmd/gen/Codegen.scala index d7801f2c08..1bb820455a 100644 --- a/src/compiler/scala/tools/cmd/gen/Codegen.scala +++ b/src/compiler/scala/tools/cmd/gen/Codegen.scala @@ -26,13 +26,7 @@ object Codegen { echo("Generating sources into " + out) if (anyvals || all) { - val av = new AnyVals { - override def timestampString = ( - "// DO NOT EDIT, CHANGES WILL BE LOST.\n" + ( - if (stamp) "// Generated by tools/codegen on " + new java.util.Date + "\n" else "" - ) - ) - } + val av = new AnyVals { } av.make() foreach { case (name, code ) => val file = out / (name + ".scala") toFile; diff --git a/src/compiler/scala/tools/nsc/CompileClient.scala b/src/compiler/scala/tools/nsc/CompileClient.scala index 9987eb0204..fd4f777890 100644 --- a/src/compiler/scala/tools/nsc/CompileClient.scala +++ b/src/compiler/scala/tools/nsc/CompileClient.scala @@ -16,18 +16,21 @@ import sys.SystemProperties.preferIPv4Stack class StandardCompileClient extends HasCompileSocket with CompileOutputCommon { lazy val compileSocket: CompileSocket = CompileSocket - val versionMsg = "Fast " + Properties.versionMsg - var verbose = false + val versionMsg = "Fast " + Properties.versionMsg + var verbose = false def process(args: Array[String]): Int = { - val fscArgs = args.toList - val settings = new FscSettings - val command = new CompilerCommand(fscArgs, settings) - verbose = settings.verbose.value - val shutdown = settings.shutdown.value - val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ ( - if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil - ) + // Trying to get out in front of the log messages in case we're + // going from verbose to not verbose. + verbose = (args contains "-verbose") + + val settings = new FscSettings(Console.println) + val command = new OfflineCompilerCommand(args.toList, settings) + val shutdown = settings.shutdown.value + val extraVmArgs = if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil + + val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ extraVmArgs + val fscArgs = args.toList ++ command.extraFscArgs if (settings.version.value) { Console println versionMsg @@ -35,7 +38,8 @@ class StandardCompileClient extends HasCompileSocket with CompileOutputCommon { } info(versionMsg) - info(fscArgs.mkString("[Given arguments: ", " ", "]")) + info(args.mkString("[Given arguments: ", " ", "]")) + info(fscArgs.mkString("[Transformed arguments: ", " ", "]")) info(vmArgs.mkString("[VM arguments: ", " ", "]")) val socket = diff --git a/src/compiler/scala/tools/nsc/CompileServer.scala b/src/compiler/scala/tools/nsc/CompileServer.scala index a34be6226b..866975b414 100644 --- a/src/compiler/scala/tools/nsc/CompileServer.scala +++ b/src/compiler/scala/tools/nsc/CompileServer.scala @@ -21,7 +21,9 @@ import settings.FscSettings */ class StandardCompileServer extends SocketServer { lazy val compileSocket: CompileSocket = CompileSocket + private var compiler: Global = null + private def clearCompiler() = compiler = null var reporter: ConsoleReporter = _ var shutdown = false @@ -58,7 +60,7 @@ class StandardCompileServer extends SocketServer { (totalMemory - freeMemory).toDouble / maxMemory.toDouble > MaxCharge } - protected def newOfflineCompilerCommand(arguments: List[String], settings: Settings) = + protected def newOfflineCompilerCommand(arguments: List[String], settings: FscSettings): OfflineCompilerCommand = new OfflineCompilerCommand(arguments, settings) /** Problematically, Settings are only considered equal if every setting @@ -69,7 +71,7 @@ class StandardCompileServer extends SocketServer { * and which do not interestingly influence compilation products. */ def unequalSettings(s1: Settings, s2: Settings): Set[Settings#Setting] = { - val ignoreSettings = Set("-d", "-encoding", "-verbose") + val ignoreSettings = Set("-d", "-encoding", "-currentDir") def trim (s: Settings): Set[Settings#Setting] = ( s.userSetSettings.toSet[Settings#Setting] filterNot (ss => ignoreSettings exists (ss respondsTo _)) ) @@ -80,7 +82,6 @@ class StandardCompileServer extends SocketServer { } def session() { - printMemoryStats() val password = compileSocket getPassword port val guessedPassword = in.readLine() val input = in.readLine() @@ -92,29 +93,34 @@ class StandardCompileServer extends SocketServer { if (input == null || password != guessedPassword) return - val args = input.split("\0", -1).toList - val settings = new FscSettings(fscError) - val command = newOfflineCompilerCommand(args, settings) + val args = input.split("\0", -1).toList + val newSettings = new FscSettings(fscError) + this.verbose = newSettings.verbose.value + val command = newOfflineCompilerCommand(args, newSettings) + + info("Settings after normalizing paths: " + newSettings) + printMemoryStats() // Update the idle timeout if given - if (!settings.idleMins.isDefault) { - val mins = settings.idleMins.value + if (!newSettings.idleMins.isDefault) { + val mins = newSettings.idleMins.value if (mins == 0) echo("Disabling idle timeout on compile server.") else echo("Setting idle timeout to " + mins + " minutes.") this.idleMinutes = mins } - if (settings.shutdown.value) { + if (newSettings.shutdown.value) { shutdown = true return out.println("[Compile server exited]") } - if (settings.reset.value) { - compiler = null - return out.println("[Compile server was reset]") + if (newSettings.reset.value) { + clearCompiler() + out.println("[Compile server was reset]") + if (command.files.isEmpty) + return } - this.verbose = settings.verbose.value - reporter = new ConsoleReporter(command.settings, in, out) { + reporter = new ConsoleReporter(newSettings, in, out) { // disable prompts, so that compile server cannot block override def displayPrompt = () } @@ -124,7 +130,7 @@ class StandardCompileServer extends SocketServer { info("[Compiler version: " + Properties.versionString + ".]") return false } - val unequal = unequalSettings(command.settings, compiler.settings) + val unequal = unequalSettings(newSettings, compiler.settings) if (unequal.nonEmpty) { info("[Replacing compiler with new instance because settings are unequal.]") info("[Asymmetric settings: " + unequal.mkString(", ") + "]") @@ -133,24 +139,26 @@ class StandardCompileServer extends SocketServer { } if (command.shouldStopWithInfo) - reporter.info(null, command.getInfoMessage(newGlobal(command.settings, reporter)), true) + reporter.info(null, command.getInfoMessage(newGlobal(newSettings, reporter)), true) else if (command.files.isEmpty) reporter.info(null, command.usageMsg, true) else { if (isCompilerReusable) { - compiler.settings = command.settings + info("[Reusing existing Global instance.]") + compiler.settings = newSettings compiler.reporter = reporter } else { - compiler = newGlobal(command.settings, reporter) + compiler = newGlobal(newSettings, reporter) } val c = compiler try new c.Run() compile command.files catch { case ex @ FatalError(msg) => reporter.error(null, "fatal error: " + msg) - compiler = null + clearCompiler() case ex => + warn("Compile server encountered fatal condition: " + ex) shutdown = true throw ex } @@ -158,7 +166,7 @@ class StandardCompileServer extends SocketServer { reporter.printSummary() if (isMemoryFullEnough) { info("Nulling out compiler due to memory utilization.") - compiler = null + clearCompiler() } } } diff --git a/src/compiler/scala/tools/nsc/CompileSocket.scala b/src/compiler/scala/tools/nsc/CompileSocket.scala index 1fd37eb70c..1e2a367176 100644 --- a/src/compiler/scala/tools/nsc/CompileSocket.scala +++ b/src/compiler/scala/tools/nsc/CompileSocket.scala @@ -54,7 +54,7 @@ class CompileSocket extends CompileOutputCommon { * by the port number. */ protected lazy val dirName = "scalac-compile-server-port" - protected lazy val cmdName = Properties.scalaCmd + protected def cmdName = Properties.scalaCmd /** The vm part of the command to start a new scala compile server */ protected val vmCommand = Properties.scalaHome match { diff --git a/src/compiler/scala/tools/nsc/CompilerCommand.scala b/src/compiler/scala/tools/nsc/CompilerCommand.scala index 1c0fd8b9de..c9791b929c 100644 --- a/src/compiler/scala/tools/nsc/CompilerCommand.scala +++ b/src/compiler/scala/tools/nsc/CompilerCommand.scala @@ -26,13 +26,6 @@ class CompilerCommand(arguments: List[String], val settings: Settings) { /** The name of the command */ def cmdName = "scalac" - private def helpSyntaxColumnWidth: Int = - (settings.visibleSettings map (_.helpSyntax.length)) max - - private def format(s: String): String = - if (s.length >= helpSyntaxColumnWidth) s - else s + (" " * (helpSyntaxColumnWidth - s.length)) - private def explainAdvanced = "\n" + """ |-- Notes on option parsing -- |Boolean settings are always false unless set. @@ -44,23 +37,47 @@ class CompilerCommand(arguments: List[String], val settings: Settings) { | example: -Xprint:expl,24-26 prints phases explicitouter, closelim, dce, jvm. | example: -Xprint:-4 prints only the phases up to typer. | - """.stripMargin.trim + "\n\n" + """.stripMargin.trim + "\n" - /** Creates a help message for a subset of options based on cond */ - def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = { - def helpStr(s: Setting) = format(s.helpSyntax) + " " + s.helpDescription + def shortUsage = "Usage: %s <options> <source files>" format cmdName + def createUsagePreface(shouldExplain: Boolean) = + if (shouldExplain) shortUsage + "\n" + explainAdvanced else "" - val usage = "Usage: %s <options> <source files>\n" format cmdName - val explain = if (shouldExplain) explainAdvanced else "" - val prefix = label + " options include:\n " + /** Creates a help message for a subset of options based on cond */ + def createUsageMsg(cond: Setting => Boolean): String = { + val baseList = (settings.visibleSettings filter cond).toList sortBy (_.name) + val width = baseList map (_.helpSyntax.length) max + def format(s: String) = ("%-" + width + "s") format s + def helpStr(s: Setting) = { + val str = format(s.helpSyntax) + " " + s.helpDescription + val suffix = s.deprecationMessage match { + case Some(msg) => "\n" + format("") + " deprecated: " + msg + case _ => "" + } + str + suffix + } + val debugs = baseList filter (_.isForDebug) + val deprecateds = baseList filter (_.isDeprecated) + val theRest = baseList filterNot (debugs.toSet ++ deprecateds) + + def sstring(msg: String, xs: List[Setting]) = + if (xs.isEmpty) None else Some(msg :: xs.map(helpStr) mkString "\n ") + + List( + sstring("", theRest), + sstring("\nAdditional debug settings:", debugs), + sstring("\nDeprecated settings:", deprecateds) + ).flatten mkString "\n" + } - // Separating out any debugging options from others for easier reading - val (debug, rest) = (settings.visibleSettings filter cond).toList sortBy (_.name) partition (_.isForDebug) + def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = { + val prefix = List( + Some(shortUsage), + Some(explainAdvanced) filter (_ => shouldExplain), + Some(label + " options include:") + ).flatten mkString "\n" - (rest map helpStr).mkString(usage + explain + prefix, "\n ", "\n") + ( - if (debug.isEmpty) "" - else (debug map helpStr).mkString("\nAdditional debug settings:\n ", "\n ", "\n") - ) + prefix + createUsageMsg(cond) } /** Messages explaining usage and options */ diff --git a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala index 86ab76b59c..27596dc899 100644 --- a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala +++ b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala @@ -20,8 +20,8 @@ extends CompilerCommand(args, settings) { this(args, str => Console.println("Error: " + str)) /** name of the associated compiler command */ - override val cmdName = "scala" - val compCmdName = "scalac" + override def cmdName = "scala" + def compCmdName = "scalac" // change CompilerCommand behavior override def shouldProcessArguments: Boolean = false @@ -53,10 +53,10 @@ extends CompilerCommand(args, settings) { Usage: @cmd@ <options> [<script|class|object|jar> <arguments>] or @cmd@ -help -All options to @compileCmd@ are also allowed. See @compileCmd@ -help. - """) +All options to @compileCmd@ (see @compileCmd@ -help) are also allowed. +""") - override def usageMsg = shortUsageMsg + "\n" + interpolate(""" + override def usageMsg = shortUsageMsg + interpolate(""" The first given argument other than options to @cmd@ designates what to run. Runnable targets are: diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 5fd5538660..2e2f9c1ad7 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -661,8 +661,21 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable /** To be initialized from firstPhase. */ private var terminalPhase: Phase = NoPhase - /** Whether compilation should stop at or skip the phase with given name. */ - protected def stopPhase(name: String) = settings.stop contains name + // Calculate where to stop based on settings -Ystop-before or -Ystop-after. + // Slightly complicated logic due to wanting -Ystop-before:parser to fail rather + // than mysteriously running to completion. + private lazy val stopPhaseSetting = { + val result = phaseDescriptors sliding 2 collectFirst { + case xs if xs exists (settings.stopBefore contains _.phaseName) => if (settings.stopBefore contains xs.head.phaseName) xs.head else xs.last + case xs if settings.stopAfter contains xs.head.phaseName => xs.last + } + if (result exists (_.phaseName == "parser")) + globalError("Cannot stop before parser phase.") + + result + } + // The phase to stop BEFORE running. + protected def stopPhase(name: String) = stopPhaseSetting exists (_.phaseName == name) protected def skipPhase(name: String) = settings.skip contains name /** As definitions.init requires phase != NoPhase, and calling phaseDescriptors.head @@ -792,6 +805,12 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable _unitbufSize += 1 // counting as they're added so size is cheap compiledFiles += unit.source.file.path } + private def checkDeprecatedSettings(unit: CompilationUnit) { + // issue warnings for any usage of deprecated settings + settings.userSetSettings filter (_.isDeprecated) foreach { s => + unit.deprecationWarning(NoPosition, s.name + " is deprecated: " + s.deprecationMessage.get) + } + } /* An iterator returning all the units being compiled in this run */ /* !!! Note: changing this to unitbuf.toList.iterator breaks a bunch @@ -868,17 +887,51 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable } } + def reportCompileErrors() { + if (reporter.hasErrors) { + for ((sym, file) <- symSource.iterator) { + sym.reset(new loaders.SourcefileLoader(file)) + if (sym.isTerm) + sym.moduleClass reset loaders.moduleClassLoader + } + } + else { + def warn(count: Int, what: String, option: Settings#BooleanSetting) = ( + if (option.isDefault && count > 0) + warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name)) + ) + warn(deprecationWarnings, "deprecation", settings.deprecation) + warn(uncheckedWarnings, "unchecked", settings.unchecked) + // todo: migrationWarnings + } + } + /** Compile list of source files */ def compileSources(_sources: List[SourceFile]) { - val depSources = dependencyAnalysis.calculateFiles(_sources.distinct) // bug #1268, scalac confused by duplicated filenames + val depSources = dependencyAnalysis calculateFiles _sources.distinct val sources = coreClassesFirst(depSources) - if (reporter.hasErrors) // there is a problem already, e.g. a plugin was passed a bad option + // there is a problem already, e.g. a plugin was passed a bad option + if (reporter.hasErrors) return - val startTime = currentTime - reporter.reset() - for (source <- sources) addUnit(new CompilationUnit(source)) + // nothing to compile, but we should still report use of deprecated options + if (sources.isEmpty) { + checkDeprecatedSettings(new CompilationUnit(new BatchSourceFile("<no file>", ""))) + reportCompileErrors() + return + } + val startTime = currentTime + reporter.reset(); + { + val first :: rest = sources + val unit = new CompilationUnit(first) + addUnit(unit) + checkDeprecatedSettings(unit) + + for (source <- rest) + addUnit(new CompilationUnit(source)) + } globalPhase = firstPhase if (opt.profileAll) { @@ -947,23 +1000,7 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable if (opt.noShow) showMembers() - if (reporter.hasErrors) { - for ((sym, file) <- symSource.iterator) { - sym.reset(new loaders.SourcefileLoader(file)) - if (sym.isTerm) - sym.moduleClass reset loaders.moduleClassLoader - } - } - else { - def warn(count: Int, what: String, option: Settings#BooleanSetting) = ( - if (option.isDefault && count > 0) - warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name)) - ) - warn(deprecationWarnings, "deprecation", settings.deprecation) - warn(uncheckedWarnings, "unchecked", settings.unchecked) - // todo: migrationWarnings - } - + reportCompileErrors() symSource.keys foreach (x => resetPackageClass(x.owner)) informTime("total", startTime) @@ -1077,13 +1114,15 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable * */ private def coreClassesFirst(files: List[SourceFile]) = { + val goLast = 4 def rank(f: SourceFile) = { - if (f.file.container.name != "scala") 3 + if (f.file.container.name != "scala") goLast else f.file.name match { case "ScalaObject.scala" => 1 case "LowPriorityImplicits.scala" => 2 case "StandardEmbeddings.scala" => 2 - case _ => 3 + case "Predef.scala" => 3 /* Predef.scala before Any.scala, etc. */ + case _ => goLast } } files sortBy rank diff --git a/src/compiler/scala/tools/nsc/MainGenericRunner.scala b/src/compiler/scala/tools/nsc/MainGenericRunner.scala index 7ead4cce4a..f2d4bacb35 100644 --- a/src/compiler/scala/tools/nsc/MainGenericRunner.scala +++ b/src/compiler/scala/tools/nsc/MainGenericRunner.scala @@ -19,7 +19,7 @@ import GenericRunnerCommand._ * sources for the code to run: pre-compiled code, a script file, * or interactive entry. */ -object MainGenericRunner { +class MainGenericRunner { def errorFn(ex: Throwable): Boolean = { ex.printStackTrace() false @@ -29,11 +29,6 @@ object MainGenericRunner { false } - def main(args: Array[String]) { - if (!process(args)) - sys.exit(1) - } - def process(args: Array[String]): Boolean = { val command = new GenericRunnerCommand(args.toList, (x: String) => errorFn(x)) import command.{ settings, howToRun, thingToRun } @@ -88,3 +83,10 @@ object MainGenericRunner { } } } + +object MainGenericRunner extends MainGenericRunner { + def main(args: Array[String]) { + if (!process(args)) + sys.exit(1) + } +} diff --git a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala index 786bcb1eb5..ad45651e23 100644 --- a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala +++ b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala @@ -5,10 +5,38 @@ package scala.tools.nsc +import settings.FscSettings +import io.Directory + /** A compiler command for the offline compiler. * * @author Martin Odersky and Lex Spoon */ -class OfflineCompilerCommand(arguments: List[String], settings: Settings) extends CompilerCommand(arguments, settings) { +class OfflineCompilerCommand(arguments: List[String], settings: FscSettings) extends CompilerCommand(arguments, settings) { + import settings.currentDir + def extraFscArgs = List(currentDir.name, currentDir.value) + + locally { + // if -current-dir is unset, we're on the client and need to obtain it. + if (currentDir.isDefault) { + // Prefer env variable PWD to system property user.dir because the former + // deals better with paths not rooted at / (filesystem mounts.) + val baseDirectory = System.getenv("PWD") match { + case null => Directory.Current getOrElse Directory("/") + case dir => Directory(dir) + } + currentDir.value = baseDirectory.path + } + else { + // Otherwise we're on the server and will use it to absolutize the paths. + settings.absolutize(currentDir.value) + } + } + override def cmdName = "fsc" + override def usageMsg = ( + createUsageMsg("where possible fsc", false, x => x.isStandard && settings.isFscSpecific(x.name)) + + "\n\nStandard scalac options also available:" + + createUsageMsg(x => x.isStandard && !settings.isFscSpecific(x.name)) + ) } diff --git a/src/compiler/scala/tools/nsc/ScalaDoc.scala b/src/compiler/scala/tools/nsc/ScalaDoc.scala index 61a3f343e7..a9330b053b 100644 --- a/src/compiler/scala/tools/nsc/ScalaDoc.scala +++ b/src/compiler/scala/tools/nsc/ScalaDoc.scala @@ -6,79 +6,71 @@ package scala.tools.nsc -import java.io.File - -import scala.tools.nsc.reporters.{Reporter, ConsoleReporter} -import scala.tools.nsc.util.FakePos //{Position} +import java.io.File.pathSeparator +import scala.tools.nsc.doc.DocFactory +import scala.tools.nsc.reporters.ConsoleReporter +import scala.tools.nsc.util.FakePos import Properties.msilLibPath -import File.pathSeparator /** The main class for scaladoc, a front-end for the Scala compiler * that generates documentation from source files. */ -object ScalaDoc { - - val versionMsg: String = - "Scaladoc " + - Properties.versionString + " -- " + - Properties.copyrightString - - var reporter: ConsoleReporter = _ - - private def scalacError(msg: String): Unit = { - reporter.error(FakePos("scalac"), msg + "\n scalac -help gives more information") - } - - def process(args: Array[String]): Unit = { - - val docSettings: doc.Settings = - new doc.Settings(scalacError) +class ScalaDoc { + val versionMsg = "Scaladoc %s -- %s".format(Properties.versionString, Properties.copyrightString) + def process(args: Array[String]): Boolean = { + var reporter: ConsoleReporter = null + val docSettings = new doc.Settings(msg => reporter.error(FakePos("scaladoc"), msg + "\n scaladoc -help gives more information")) reporter = new ConsoleReporter(docSettings) { - override def hasErrors = false // need to do this so that the Global instance doesn't trash all the symbols just because there was an error + // need to do this so that the Global instance doesn't trash all the + // symbols just because there was an error + override def hasErrors = false } - - val command = - new CompilerCommand(args.toList, docSettings) - - if (!reporter.hasErrors) { // No need to continue if reading the command generated errors - - if (docSettings.version.value) - reporter.info(null, versionMsg, true) - else if (docSettings.help.value) { - reporter.info(null, command.usageMsg, true) - } - else if (docSettings.Xhelp.value) - reporter.info(null, command.xusageMsg, true) - else if (docSettings.Yhelp.value) - reporter.info(null, command.yusageMsg, true) - else if (docSettings.showPlugins.value) - reporter.warning(null, "Plugins are not available when using Scaladoc") - else if (docSettings.showPhases.value) - reporter.warning(null, "Phases are restricted when using Scaladoc") - else try { - - if (docSettings.target.value == "msil") - msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x)) - - val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings) - docProcessor.document(command.files) - - } - catch { - case ex @ FatalError(msg) => - if (docSettings.debug.value) ex.printStackTrace(); - reporter.error(null, "fatal error: " + msg) - } - finally { - reporter.printSummary() - } + val command = new ScalaDoc.Command(args.toList, docSettings) + def hasFiles = command.files.nonEmpty || docSettings.uncompilableFiles.nonEmpty + + if (docSettings.version.value) + reporter.info(null, versionMsg, true) + else if (docSettings.Xhelp.value) + reporter.info(null, command.xusageMsg, true) + else if (docSettings.Yhelp.value) + reporter.info(null, command.yusageMsg, true) + else if (docSettings.showPlugins.value) + reporter.warning(null, "Plugins are not available when using Scaladoc") + else if (docSettings.showPhases.value) + reporter.warning(null, "Phases are restricted when using Scaladoc") + else if (docSettings.help.value || !hasFiles) + reporter.info(null, command.usageMsg, true) + else try { + if (docSettings.target.value == "msil") + msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x)) + + new DocFactory(reporter, docSettings) document command.files } + catch { + case ex @ FatalError(msg) => + if (docSettings.debug.value) ex.printStackTrace() + reporter.error(null, "fatal error: " + msg) + } + finally reporter.printSummary() + + // not much point in returning !reporter.hasErrors when it has + // been overridden with constant false. + true + } +} +object ScalaDoc extends ScalaDoc { + class Command(arguments: List[String], settings: doc.Settings) extends CompilerCommand(arguments, settings) { + override def cmdName = "scaladoc" + override def usageMsg = ( + createUsageMsg("where possible scaladoc", false, x => x.isStandard && settings.isScaladocSpecific(x.name)) + + "\n\nStandard scalac options also available:" + + createUsageMsg(x => x.isStandard && !settings.isScaladocSpecific(x.name)) + ) } - def main(args: Array[String]): Unit = { - process(args) - sys.exit(if (reporter.hasErrors) 1 else 0) + def main(args: Array[String]): Unit = sys exit { + if (process(args)) 0 else 1 } } diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala index d9a2c555e6..2e97a3d820 100755 --- a/src/compiler/scala/tools/nsc/ast/DocComments.scala +++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala @@ -7,6 +7,7 @@ package scala.tools.nsc package ast import symtab._ +import reporters.Reporter import util.{Position, NoPosition} import util.DocStrings._ import util.Chars._ @@ -18,6 +19,8 @@ import scala.collection.mutable.{HashMap, ListBuffer, StringBuilder} */ trait DocComments { self: SymbolTable => + def reporter: Reporter + /** The raw doc comment map */ val docComments = new HashMap[Symbol, DocComment] @@ -129,7 +132,6 @@ trait DocComments { self: SymbolTable => def expandWiki(str: String): String = (str /: wikiReplacements) { (str1, regexRepl) => regexRepl._1 replaceAllIn(str1, regexRepl._2) } - private def getDocComment(sym: Symbol): Option[DocComment] = mapFind(sym :: allInheritedOverriddenSymbols(sym))(docComments get _) @@ -155,13 +157,13 @@ trait DocComments { self: SymbolTable => def merge(src: String, dst: String, sym: Symbol, copyFirstPara: Boolean = false): String = { val srcSections = tagIndex(src) val dstSections = tagIndex(dst) - val srcParams = paramDocs(src, "@param", srcSections) - val dstParams = paramDocs(dst, "@param", dstSections) - val srcTParams = paramDocs(src, "@tparam", srcSections) - val dstTParams = paramDocs(dst, "@tparam", dstSections) - val out = new StringBuilder - var copied = 0 - var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _))) + val srcParams = paramDocs(src, "@param", srcSections) + val dstParams = paramDocs(dst, "@param", dstSections) + val srcTParams = paramDocs(src, "@tparam", srcSections) + val dstTParams = paramDocs(dst, "@tparam", dstSections) + val out = new StringBuilder + var copied = 0 + var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _))) if (copyFirstPara) { val eop = // end of comment body (first para), which is delimited by blank line, or tag, or end of comment @@ -176,10 +178,12 @@ trait DocComments { self: SymbolTable => if (end > tocopy) tocopy = end case None => srcSec match { - case Some((start1, end1)) => + case Some((start1, end1)) => { out append dst.substring(copied, tocopy).trim + out append "\n" copied = tocopy out append src.substring(start1, end1).trim + } case None => } } @@ -210,24 +214,18 @@ trait DocComments { self: SymbolTable => * @param owner The current owner in which variable definitions are searched. * @param site The class for which doc comments are generated */ - def lookupVariable(vble: String, site: Symbol): Option[String] = - if (site == NoSymbol) - None - else { - def lookInBaseClasses = mapFind(site.info.baseClasses)(defs(_).get(vble)) match { - case None => lookupVariable(vble, site.owner) - case someStr => someStr + def lookupVariable(vble: String, site: Symbol): Option[String] = site match { + case NoSymbol => None + case _ => + val searchList = + if (site.isModule) site :: site.info.baseClasses + else site.info.baseClasses + + searchList collectFirst { case x if defs(x) contains vble => defs(x)(vble) } match { + case Some(str) if str startsWith '$' => lookupVariable(str.tail, site) + case res => res orElse lookupVariable(vble, site.owner) } - if (site.isModule) - defs(site).get(vble) match { - case Some(str) => return Some(str) - case None => lookInBaseClasses - } - else lookInBaseClasses - } - - private var expandCount = 0 - private final val expandLimit = 10 + } /** Expand variable occurrences in string `str', until a fix point is reached or * a expandLimit is exceeded. @@ -237,49 +235,57 @@ trait DocComments { self: SymbolTable => * @param site The class for which doc comments are generated * @return Expanded string */ - protected def expandVariables(str: String, sym: Symbol, site: Symbol): String = - if (expandCount < expandLimit) { - try { - val out = new StringBuilder - var copied = 0 - var idx = 0 - while (idx < str.length) { - if ((str charAt idx) == '$') { - val vstart = idx - idx = skipVariable(str, idx + 1) - def replaceWith(repl: String) { - out append str.substring(copied, vstart) - out append repl - copied = idx - } - val vname = variableName(str.substring(vstart + 1, idx)) - if (vname == "super") { - superComment(sym) match { - case Some(sc) => - val superSections = tagIndex(sc) - replaceWith(sc.substring(3, startTag(sc, superSections))) - for (sec @ (start, end) <- superSections) - if (!isMovable(sc, sec)) out append sc.substring(start, end) - case None => + protected def expandVariables(initialStr: String, sym: Symbol, site: Symbol): String = { + val expandLimit = 10 + + def expandInternal(str: String, depth: Int): String = { + if (depth >= expandLimit) + throw new ExpansionLimitExceeded(str) + + val out = new StringBuilder + var copied, idx = 0 + // excluding variables written as \$foo so we can use them when + // necessary to document things like Symbol#decode + def isEscaped = idx > 0 && str.charAt(idx - 1) == '\\' + while (idx < str.length) { + if ((str charAt idx) != '$' || isEscaped) + idx += 1 + else { + val vstart = idx + idx = skipVariable(str, idx + 1) + def replaceWith(repl: String) { + out append str.substring(copied, vstart) + out append repl + copied = idx + } + variableName(str.substring(vstart + 1, idx)) match { + case "super" => + superComment(sym) foreach { sc => + val superSections = tagIndex(sc) + replaceWith(sc.substring(3, startTag(sc, superSections))) + for (sec @ (start, end) <- superSections) + if (!isMovable(sc, sec)) out append sc.substring(start, end) } - } else if (vname.length > 0) { + case "" => idx += 1 + case vname => lookupVariable(vname, site) match { case Some(replacement) => replaceWith(replacement) - case None => //println("no replacement for "+vname) // DEBUG + case None => reporter.warning(sym.pos, "Variable " + vname + " undefined in comment for " + sym) } - } else idx += 1 - } else idx += 1 - } - if (out.length == 0) str - else { - out append str.substring(copied) - expandVariables(out.toString, sym, site) + } } - } finally { - expandCount -= 1 } - } else throw new ExpansionLimitExceeded(str) + if (out.length == 0) str + else { + out append str.substring(copied) + expandInternal(out.toString, depth + 1) + } + } + // We suppressed expanding \$ throughout the recursion, and now we + // need to replace \$ with $ so it looks as intended. + expandInternal(initialStr, 0).replaceAllLiterally("""\$""", "$") + } // !!! todo: inherit from Comment? case class DocComment(raw: String, pos: Position = NoPosition) { @@ -290,31 +296,27 @@ trait DocComments { self: SymbolTable => * useCases: all usecase sections (as instances of class UseCase) */ lazy val (template, defines, useCases) = { - val sections = tagIndex(raw, idx => - startsWithTag(raw, idx, "@define") || startsWithTag(raw, idx, "@usecase")) - val (defines, usecases) = sections partition (startsWithTag(raw, _, "@define")) - val end = startTag(raw, sections) - /* - println("processing doc comment:") - println(raw) - println("===========>") - println(raw.substring(0, end)) - println("++++++++++++++++") - println(sections map { case (s, e) => raw.substring(s, e) }) - */ + val sections = tagIndex(raw) + + val defines = sections filter { startsWithTag(raw, _, "@define") } + val usecases = sections filter { startsWithTag(raw, _, "@usecase") } + + val end = startTag(raw, (defines ::: usecases).sort(_._1 < _._1)) + (if (end == raw.length - 2) raw else raw.substring(0, end) + "*/", defines map { case (start, end) => raw.substring(start, end) }, usecases map { case (start, end) => decomposeUseCase(start, end) }) } private def decomposeUseCase(start: Int, end: Int): UseCase = { - val codeStart = skipWhitespace(raw, start + "@usecase".length) - val codeEnd = skipToEol(raw, codeStart) - val code = raw.substring(codeStart, codeEnd) - val codePos = subPos(codeStart, codeEnd) + val codeStart = skipWhitespace(raw, start + "@usecase".length) + val codeEnd = skipToEol(raw, codeStart) + val code = raw.substring(codeStart, codeEnd) + val codePos = subPos(codeStart, codeEnd) val commentStart = skipLineLead(raw, codeEnd + 1) min end - val comment = "/** " + raw.substring(commentStart, end) + "*/" - val commentPos = subPos(commentStart, end) + val comment = "/** " + raw.substring(commentStart, end) + "*/" + val commentPos = subPos(commentStart, end) + UseCase(DocComment(comment, commentPos), code, codePos) } @@ -329,14 +331,11 @@ trait DocComments { self: SymbolTable => def defineVariables(sym: Symbol) { for (str <- defines) { val start = skipWhitespace(str, "@define".length) - var idx = skipVariable(str, start) - val vble = variableName(str.substring(start, idx)) - if (idx < str.length && isWhitespace(str charAt idx)) idx += 1 - var end = str.lastIndexOf('\n') - if (end == -1) end = str.length - defs(sym) += vble -> str.substring(idx, end) + var idx = skipVariable(str, start) + val vble = variableName(str.substring(start, idx)) + + defs(sym) += vble -> (str drop idx).trim.replaceAll("""\s+\*+$""", "") } - //if (defs(sym).nonEmpty) println("vars of "+sym+" = "+defs(sym)) // !!! } } @@ -372,18 +371,18 @@ trait DocComments { self: SymbolTable => } } val parts = getParts(0) - assert(parts.length > 0, "parts is empty '" + str + "' in site " + site) - val partnames = (parts.init map newTermName) ::: List(newTypeName(parts.last)) - val (start, rest) = - if (parts.head == "this") - (site.thisType, partnames.tail) - else if (parts.tail.nonEmpty && parts(1) == "this") - site.ownerChain.find(_.name.toString == parts.head) match { - case Some(clazz) => (clazz.thisType, partnames.drop(2)) - case None => (NoType, List()) + assert(parts.nonEmpty, "parts is empty '" + str + "' in site " + site) + val partnames = (parts.init map newTermName) :+ newTypeName(parts.last) + val (start, rest) = parts match { + case "this" :: _ => (site.thisType, partnames.tail) + case _ :: "this" :: _ => + site.ownerChain.find(_.name == partnames.head) match { + case Some(clazz) => (clazz.thisType, partnames drop 2) + case _ => (NoType, Nil) } - else + case _ => (getSite(partnames.head), partnames.tail) + } (start /: rest)(select(_, _, NoType)) } @@ -429,4 +428,4 @@ trait DocComments { self: SymbolTable => } class ExpansionLimitExceeded(str: String) extends Exception -}
\ No newline at end of file +} diff --git a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala index 436eb5fb90..bfd5b175a7 100644 --- a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala +++ b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala @@ -90,8 +90,6 @@ abstract class ScalaPrimitives { // Any operations final val IS = 80 // x.is[y] final val AS = 81 // x.as[y] - final val ISERASED = 85 // x.is$erased[y] - final val ASERASED = 86 // x.as$erased[y] final val HASH = 87 // x.## // AnyRef operations diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 64170482ce..249aefb10e 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -1153,7 +1153,7 @@ abstract class GenICode extends SubComponent { ctx.bb.emit(DROP(from)) ctx.bb.emit(CONSTANT(Constant(null))) } - else if (from == ThrowableReference) { + else if (from == ThrowableReference && !(ThrowableClass.tpe <:< to.toType)) { log("Inserted check-cast on throwable to " + to + " at " + pos) ctx.bb.emit(CHECK_CAST(to)) } diff --git a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala index 076a59ce46..a38916b8e4 100644 --- a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala +++ b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala @@ -15,6 +15,7 @@ import scala.tools.nsc.symtab._ import ch.epfl.lamp.compiler.msil.{Type => MsilType, _} import ch.epfl.lamp.compiler.msil.emit._ +import ch.epfl.lamp.compiler.msil.util.PECustomMod abstract class GenMSIL extends SubComponent { import global._ @@ -250,10 +251,33 @@ abstract class GenMSIL extends SubComponent { } } + /** + * Mutates `member` adding CLR attributes (if any) based on sym.annotations. + * Please notice that CLR custom modifiers are a different beast (see customModifiers below) + * and thus shouldn't be added by this method. + */ def addAttributes(member: ICustomAttributeSetter, annotations: List[AnnotationInfo]) { + val attributes = annotations.map(_.atp.typeSymbol).collect { + case definitions.TransientAttr => null // TODO this is just an example + } return // TODO: implement at some point } -/* + + /** + * What's a CLR custom modifier? Intro available as source comments in compiler.msil.CustomModifier. + * It's basically a marker associated with a location (think of FieldInfo, ParameterInfo, and PropertyInfo) + * and thus that marker (be it optional or required) becomes part of the signature of that location. + * Some annotations will become CLR attributes (see addAttributes above), others custom modifiers (this method). + */ + def customModifiers(annotations: List[AnnotationInfo]): Array[CustomModifier] = { + annotations.map(_.atp.typeSymbol).collect { + case definitions.VolatileAttr => new CustomModifier(true, CustomModifier.VolatileMarker) + } toArray + } + + + + /* if (settings.debug.value) log("creating annotations: " + annotations + " for member : " + member) for (annot@ AnnotationInfo(typ, annArgs, nvPairs) <- annotations ; @@ -810,6 +834,9 @@ abstract class GenMSIL extends SubComponent { fields(field) = fInfo fInfo } + if (fieldInfo.IsVolatile) { + mcode.Emit(OpCodes.Volatile) + } if (!fieldInfo.IsLiteral) { if (loadAddr) { mcode.Emit(if (isStatic) OpCodes.Ldsflda else OpCodes.Ldflda, fieldInfo) @@ -848,7 +875,7 @@ abstract class GenMSIL extends SubComponent { } else if (typ == clrTypes.FLOAT) { mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Float]) } else if (typ == clrTypes.DOUBLE) { - mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Double]) + mcode.Emit(OpCodes.Ldc_R8, value.asInstanceOf[Double]) } else { /* TODO one more case is described in Partition II, 16.2: bytearray(...) */ abort("Unknown type for static literal field: " + fieldInfo) @@ -1864,7 +1891,12 @@ abstract class GenMSIL extends SubComponent { log("Adding field: " + sym.fullName) var attributes = msilFieldFlags(sym) - val fBuilder = mtype.DefineField(msilName(sym), msilType(sym.tpe), attributes) + val fieldTypeWithCustomMods = + new PECustomMod(msilType(sym.tpe), + customModifiers(sym.annotations)) + val fBuilder = mtype.DefineField(msilName(sym), + fieldTypeWithCustomMods, + attributes) fields(sym) = fBuilder addAttributes(fBuilder, sym.annotations) } // all iclass.fields iterated over diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala index 3e8c9cfea7..b2a93873b0 100644 --- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala +++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala @@ -11,7 +11,7 @@ trait DependencyAnalysis extends SubComponent with Files { val phaseName = "dependencyAnalysis" - def off = settings.make.isDefault + def off = settings.make.isDefault || settings.make.value == "all" def shouldCheckClasspath = settings.make.value != "transitivenocp" def newPhase(prev: Phase) = new AnalysisPhase(prev) @@ -35,9 +35,9 @@ trait DependencyAnalysis extends SubComponent with Files { } lazy val maxDepth = settings.make.value match { - case "changed" => 0 - case "transitive" | "transitivenocp" => Int.MaxValue + case "changed" => 0 case "immediate" => 1 + case _ => Int.MaxValue } // todo: order insensible checking and, also checking timestamp? @@ -176,6 +176,7 @@ trait DependencyAnalysis extends SubComponent with Files { && (tree.symbol != NoSymbol) && (!tree.symbol.isPackage) && (!tree.symbol.isJavaDefined) + && (!tree.symbol.tpe.isError) && ((tree.symbol.sourceFile eq null) || (tree.symbol.sourceFile.path != file.path)) && (!tree.symbol.isClassConstructor)) { diff --git a/src/compiler/scala/tools/nsc/doc/DocFactory.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala index c8a6e279ff..71ee6dfcb8 100644 --- a/src/compiler/scala/tools/nsc/doc/DocFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/DocFactory.scala @@ -3,9 +3,11 @@ package scala.tools.nsc package doc +import scala.util.control.ControlThrowable import reporters.Reporter -import java.lang.ClassNotFoundException -import util.{Position, NoPosition} +import util.NoPosition +import io.{ File, Directory } +import DocParser.Parsed /** A documentation processor controls the process of generating Scala documentation, which is as follows. * @@ -25,7 +27,6 @@ import util.{Position, NoPosition} * * @author Gilles Dubochet */ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor => - /** The unique compiler instance used by this processor and constructed from its `settings`. */ object compiler extends Global(settings, reporter) with interactive.RangePositions { override protected def computeInternalPhases() { @@ -38,64 +39,89 @@ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor phasesSet += refchecks } override def forScaladoc = true - lazy val addSourceless = { - val sless = new SourcelessComments { val global = compiler } - docComments ++= sless.comments - } } /** Creates a scaladoc site for all symbols defined in this call's `files`, as well as those defined in `files` of * previous calls to the same processor. * @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */ def makeUniverse(files: List[String]): Option[Universe] = { - (new compiler.Run()) compile files - compiler.addSourceless assert(settings.docformat.value == "html") - if (!reporter.hasErrors) { - val modelFactory = (new model.ModelFactory(compiler, settings) with model.comment.CommentFactory with model.TreeFactory) - modelFactory.makeModel match { - case Some(madeModel) => - println("model contains " + modelFactory.templatesCount + " documentable templates") - Some(madeModel) - case None => - println("no documentable class found in compilation units") - None + new compiler.Run() compile files + if (reporter.hasErrors) + return None + + val extraTemplatesToDocument: Set[compiler.Symbol] = { + if (settings.docUncompilable.isDefault) Set() + else { + val uncompilable = new { + val global: compiler.type = compiler + val settings = processor.settings + } with Uncompilable { } + + compiler.docComments ++= uncompilable.comments + docdbg("" + uncompilable) + + uncompilable.templates } } - else None + + val modelFactory = ( + new { override val global: compiler.type = compiler } + with model.ModelFactory(compiler, settings) + with model.comment.CommentFactory + with model.TreeFactory { + override def templateShouldDocument(sym: compiler.Symbol) = + extraTemplatesToDocument(sym) || super.templateShouldDocument(sym) + } + ) + + modelFactory.makeModel match { + case Some(madeModel) => + println("model contains " + modelFactory.templatesCount + " documentable templates") + Some(madeModel) + case None => + println("no documentable class found in compilation units") + None + } + + } + + object NoCompilerRunException extends ControlThrowable { } + + val documentError: PartialFunction[Throwable, Unit] = { + case NoCompilerRunException => + reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false) + case _: ClassNotFoundException => + () } /** Generate document(s) for all `files` containing scaladoc documenataion. * @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */ def document(files: List[String]): Unit = { + def generate() = { + import doclet._ + val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet + val docletInstance = docletClass.newInstance().asInstanceOf[Generator] - class NoCompilerRunException extends Exception - - try { - val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet - val docletInstance = docletClass.newInstance().asInstanceOf[doclet.Generator] - if (docletInstance.isInstanceOf[doclet.Universer]) { - makeUniverse(files) match { - case Some(universe) => - docletClass.getMethod("setUniverse", classOf[Universe]).invoke(docletInstance, universe) - if (docletInstance.isInstanceOf[doclet.Indexer]) { - val index = model.IndexModelFactory.makeIndex(universe) - docletClass.getMethod("setIndex", classOf[Index]).invoke(docletInstance, index) - } - case None => - throw new NoCompilerRunException() - } + docletInstance match { + case universer: Universer => + val universe = makeUniverse(files) getOrElse { throw NoCompilerRunException } + universer setUniverse universe + + docletInstance match { + case indexer: Indexer => indexer setIndex model.IndexModelFactory.makeIndex(universe) + case _ => () + } + case _ => () } docletInstance.generate } - catch { - case e: ClassNotFoundException => - case e: NoCompilerRunException => - reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false) - } - - + try generate() + catch documentError + } + private[doc] def docdbg(msg: String) { + if (settings.Ydocdebug.value) + println(msg) } - } diff --git a/src/compiler/scala/tools/nsc/doc/DocParser.scala b/src/compiler/scala/tools/nsc/doc/DocParser.scala new file mode 100644 index 0000000000..1e45079c48 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/DocParser.scala @@ -0,0 +1,74 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools +package nsc +package doc + +import reporters._ +import util._ +import interactive.RangePositions +import DocParser.Parsed + +/** A very minimal global customized for extracting DocDefs. It stops + * right after parsing so it can read DocDefs from source code which would + * otherwise cause the compiler to go haywire. + */ +class DocParser(settings: nsc.Settings, reporter: Reporter) + extends Global(settings, reporter) + with RangePositions { + + def this(settings: Settings) = this(settings, new ConsoleReporter(settings)) + def this() = this(new Settings(Console println _)) + + // the usual global initialization + locally { new Run() } + + override def forScaladoc = true + override protected def computeInternalPhases() { + phasesSet += syntaxAnalyzer + } + + /** Returns a list of DocParser.Parseds, which hold the DocDefs found in the + * given code along with the surrounding trees. + */ + def docDefs(code: String) = { + def loop(enclosing: List[Tree], tree: Tree): List[Parsed] = tree match { + case x: PackageDef => x.stats flatMap (t => loop(enclosing :+ x, t)) + case x: DocDef => new Parsed(enclosing, x) :: loop(enclosing :+ x.definition, x.definition) + case x => x.children flatMap (t => loop(enclosing, t)) + } + loop(Nil, docUnit(code)) + } + + /** A compilation unit containing parsed source. + */ + def docUnit(code: String) = { + val unit = new CompilationUnit(new BatchSourceFile("<console>", code)) + val scanner = new syntaxAnalyzer.UnitParser(unit) + + scanner.compilationUnit() + } +} + +/** Since the DocParser's whole reason for existing involves trashing a + * global, it is designed to bottle up general Global#Tree types rather + * than path dependent ones. The recipient will have to deal. + */ +object DocParser { + type Tree = Global#Tree + type DefTree = Global#DefTree + type DocDef = Global#DocDef + type Name = Global#Name + + class Parsed(val enclosing: List[Tree], val docDef: DocDef) { + def nameChain: List[Name] = (enclosing :+ docDef.definition) collect { case x: DefTree => x.name } + def raw: String = docDef.comment.raw + + override def toString = ( + nameChain.init.map(x => if (x.isTypeName) x + "#" else x + ".").mkString + nameChain.last + ) + } +} diff --git a/src/compiler/scala/tools/nsc/doc/Settings.scala b/src/compiler/scala/tools/nsc/doc/Settings.scala index 054d16719b..292eca91e3 100644 --- a/src/compiler/scala/tools/nsc/doc/Settings.scala +++ b/src/compiler/scala/tools/nsc/doc/Settings.scala @@ -41,6 +41,17 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) { "" ) + val docUncompilable = StringSetting ( + "-doc-no-compile", + "path", + "A directory containing sources which should be parsed, no more (e.g. AnyRef.scala)", + "" + ) + lazy val uncompilableFiles = docUncompilable.value match { + case "" => Nil + case path => io.Directory(path).deepFiles filter (_ hasExtension "scala") toList + } + /** A setting that defines a URL to be concatenated with source locations and show a link to source files. * If needed the sourcepath option can be used to exclude undesired initial part of the link to sources */ val docsourceurl = StringSetting ( @@ -62,11 +73,14 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) { "scala.tools.nsc.doc.html.Doclet" ) - // TODO: add a new setting for whether or not to document sourceless entities (e.g., Any, Unit, etc) - // Somewhere slightly before r18708 scaladoc stopped building unless the // self-type check was suppressed. I hijacked the slotted-for-removal-anyway // suppress-vt-warnings option and renamed it for this purpose. noSelfCheck.value = true + // For improved help output. + def scaladocSpecific = Set[Settings#Setting]( + docformat, doctitle, docversion, docUncompilable, docsourceurl, docgenerator + ) + val isScaladocSpecific: String => Boolean = scaladocSpecific map (_.name) } diff --git a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala b/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala deleted file mode 100644 index 18f8070f14..0000000000 --- a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala +++ /dev/null @@ -1,249 +0,0 @@ -/* NSC -- new Scala compiler -- Copyright 2007-2011 LAMP/EPFL */ - -package scala.tools.nsc -package doc - -import scala.collection._ - -/** - * A class that provides comments for all symbols which pre-exist in Scala (Any, Nothing, ...) - * It also contains a HashSet of the given symbols - * The comments are to be added to a HashMap called comments, which resides in the Global.scala file - * @author Manohar Jonnalagedda, Stephane Micheloud, Sean McDirmid, Geoffrey Washburn - * @version 1.0 */ -abstract class SourcelessComments { - - val global: Global - - import global._ - import definitions._ - - lazy val comments = { - - val comment = mutable.HashMap.empty[Symbol, DocComment] - - comment(NothingClass) = new DocComment(""" - /** Class `Nothing` is - together with class [[scala.Null]] - at the bottom of Scala's type hierarchy. - * - * Type `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist ''no instances'' of - * this type. Even though type `Nothing` is empty, it is nevertheless useful as a type parameter. For instance, - * the Scala library defines a value [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists - * are covariant in Scala, this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any - * element of type `T`. */ - """) - - comment(NullClass) = new DocComment(""" - /** Class `Null` is - together with class [[scala.Nothing]] - at the bottom of the Scala type hierarchy. - * - * Type `Null` is a subtype of all reference types; its only instance is the `null` reference. Since `Null` is - * not a subtype of value types, `null` is not a member of any such type. For instance, it is not possible to - * assign `null` to a variable of type [[scala.Int]]. */ - """) - - /*******************************************************************/ - /* Documentation for Any */ - - comment(AnyClass) = new DocComment(""" - /** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala execution environment inherits - * directly or indirectly from this class. Class `Any` has two direct subclasses: [[scala.AnyRef]] and - * [[scala.AnyVal]]. */ - """) - - comment(Any_equals) = new DocComment(""" - /** This method is used to compare the receiver object (`this`) with the argument object (`arg0`) for equivalence. - * - * The default implementations of this method is an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence - * relation]: - * * It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`. - * * It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and - * only if `y.equals(x)` returns `true`. - * * It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and - * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`. - * - * If you override this method, you should verify that your implementation remains an equivalence relation. - * Additionally, when overriding this method it is often necessary to override `hashCode` to ensure that objects - * that are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]] - * (`o1.hashCode.equals(o2.hashCode)`). - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Any_==) = new DocComment(""" - /** `o == arg0` is the same as `o.equals(arg0)`. - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Any_!=) = new DocComment(""" - /** `o != arg0` is the same as `!(o == (arg0))`. - * - * @param arg0 the object to compare against this object for dis-equality. - * @return `false` if the receiver object is equivalent to the argument; `true` otherwise. */ - """) - - comment(Any_toString) = new DocComment(""" - /** Returns a string representation of the object. - * - * The default representation is platform dependent. - * - * @return a string representation of the object. */ - """) - - comment(Any_asInstanceOf) = new DocComment(""" - /** This method is used to cast the receiver object to be of type `T0`. - * - * Note that the success of a cast at runtime is modulo Scala's erasure semantics. Therefore the expression - * `1.asInstanceOf[String]` will throw a `ClassCastException` at runtime, while the expression - * `List(1).asInstanceOf[List[String]]` will not. In the latter example, because the type argument is erased as - * part of compilation it is not possible to check whether the contents of the list are of the requested typed. - * - * @throws ClassCastException if the receiver object is not an instance of erasure of type `T0`. - * @return the receiver object. */ - """) - - comment(Any_isInstanceOf) = new DocComment(""" - /** This method is used to test whether the dynamic type of the receiver object is `T0`. - * - * Note that the test result of the test is modulo Scala's erasure semantics. Therefore the expression - * `1.isInstanceOf[String]` will return `false`, while the expression `List(1).isInstanceOf[List[String]]` will - * return `true`. In the latter example, because the type argument is erased as part of compilation it is not - * possible to check whether the contents of the list are of the requested typed. - * - * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise. */ - """) - - comment(Any_hashCode) = new DocComment(""" - /** Returns a hash code value for the object. - * - * The default hashing algorithm is platform dependent. - * - * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet - * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`. - * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have - * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure - * to verify that the behavior is consistent with the `equals` method. - * - * @return the hash code value for the object. */ - """) - - /*******************************************************************/ - /* Documentation for AnyRef */ - - comment(AnyRefClass) = new DocComment(""" - /** Class `AnyRef` is the root class of all ''reference types''. */ - """) - - comment(Object_==) = new DocComment(""" - /** `o == arg0` is the same as `if (o eq null) arg0 eq null else o.equals(arg0)`. - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Object_ne) = new DocComment(""" - /** `o.ne(arg0)` is the same as `!(o.eq(arg0))`. - * - * @param arg0 the object to compare against this object for reference dis-equality. - * @return `false` if the argument is not a reference to the receiver object; `true` otherwise. */ - """) - - - comment(Object_finalize) = new DocComment(""" - /** This method is called by the garbage collector on the receiver object when garbage collection determines that - * there are no more references to the object. - * - * The details of when and if the `finalize` method are invoked, as well as the interaction between `finalize` - * and non-local returns and exceptions, are all platform dependent. */ - """) - - comment(Object_clone) = new DocComment(""" - /** This method creates and returns a copy of the receiver object. - * - * The default implementation of the `clone` method is platform dependent. - * - * @return a copy of the receiver object. */ - """) - - comment(Object_getClass) = new DocComment(""" - /** Returns a representation that corresponds to the dynamic class of the receiver object. - * - * The nature of the representation is platform dependent. - * - * @return a representation that corresponds to the dynamic class of the receiver object. */ - """) - - comment(Object_notify) = new DocComment(""" - /** Wakes up a single thread that is waiting on the receiver object's monitor. */ - """) - - comment(Object_notifyAll) = new DocComment(""" - /** Wakes up all threads that are waiting on the receiver object's monitor. */ - """) - - comment(Object_eq) = new DocComment(""" - /** This method is used to test whether the argument (`arg0`) is a reference to the - * receiver object (`this`). - * - * The `eq` method implements an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation] on - * non-null instances of `AnyRef`: - * * It is reflexive: for any non-null instance `x` of type `AnyRef`, `x.eq(x)` returns `true`. - * * It is symmetric: for any non-null instances `x` and `y` of type `AnyRef`, `x.eq(y)` returns `true` if and - * only if `y.eq(x)` returns `true`. - * * It is transitive: for any non-null instances `x`, `y`, and `z` of type `AnyRef` if `x.eq(y)` returns `true` - * and `y.eq(z)` returns `true`, then `x.eq(z)` returns `true`. - * - * Additionally, the `eq` method has three other properties. - * * It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of - * `x.eq(y)` consistently returns `true` or consistently returns `false`. - * * For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`. - * * `null.eq(null)` returns `true`. - * - * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is - * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they - * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`). - * - * @param arg0 the object to compare against this object for reference equality. - * @return `true` if the argument is a reference to the receiver object; `false` otherwise. */ - """) - - /*******************************************************************/ - - comment(AnyValClass) = new DocComment(""" - /** Class `AnyVal` is the root class of all ''value types''. - * - * `AnyVal` has a fixed number of subclasses, which describe values which are not implemented as objects in the - * underlying host system. - * - * Classes [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]], [[scala.Short]], - * and [[scala.Byte]] are together called ''numeric value types''. Classes [[scala.Byte]], [[scala.Short]], and - * [[scala.Char]] are called ''subrange types''. Subrange types, as well as [[scala.Int]] and [[scala.Long]] are - * called ''integer types'', whereas [[scala.Float]] and [[scala.Double]] are called ''floating point types''. */ - """) - - comment(BooleanClass) = new DocComment(""" - /** Class `Boolean` has only two values: `true` and `false`. */ - """) - - comment(UnitClass) = new DocComment(""" - /** Class `Unit` has only one value: `()`. */ - """) - - List(ByteClass, CharClass, DoubleClass, LongClass, FloatClass, IntClass, ShortClass) foreach { sym => - val maxValue = "MAX_" + sym.name.toString().toUpperCase() - val minValue = "MIN_" + sym.name.toString().toUpperCase() - comment(sym) = new DocComment(""" - /** Class `""" + sym.name + """` belongs to the value classes whose instances are not represented as objects by - * the underlying host system. There is an implicit conversion from instances of `""" + sym.name + """` to - * instances of [[scala.runtime.Rich""" + sym.name + """]] which provides useful non-primitive operations. - * All value classes inherit from class [[scala.AnyVal]]. - * - * Values `""" + maxValue + """` and `""" + minValue + """` are defined in object [[scala.Math]]. */ - """) - } - - comment - } - -} diff --git a/src/compiler/scala/tools/nsc/doc/Uncompilable.scala b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala new file mode 100644 index 0000000000..1f0c85361e --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala @@ -0,0 +1,48 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package doc + +/** Some glue between DocParser (which reads source files which can't be compiled) + * and the scaladoc model. + */ +trait Uncompilable { + val global: Global + val settings: Settings + + import global.{ reporter, inform, warning, newTypeName, newTermName, Symbol, Name, DocComment } + import global.definitions.RootClass + + private implicit def translateName(name: Global#Name) = + if (name.isTypeName) newTypeName("" + name) else newTermName("" + name) + + def docSymbol(p: DocParser.Parsed) = p.nameChain.foldLeft(RootClass: Symbol)(_.tpe member _) + def docDefs(code: String) = new DocParser(settings, reporter) docDefs code + def docPairs(code: String) = docDefs(code) map (p => (docSymbol(p), new DocComment(p.raw))) + + lazy val pairs = files flatMap { f => + val comments = docPairs(f.slurp()) + if (settings.verbose.value) + inform("Found %d doc comments in parse-only file %s: %s".format(comments.size, f, comments.map(_._1).mkString(", "))) + + comments + } + def files = settings.uncompilableFiles + def symbols = pairs map (_._1) + def templates = symbols filter (x => x.isClass || x.isTrait) toSet + def comments = { + if (settings.debug.value || settings.verbose.value) + inform("Found %d uncompilable files: %s".format(files.size, files mkString ", ")) + + if (pairs.isEmpty) + warning("no doc comments read from " + settings.docUncompilable.value) + + pairs + } + override def toString = pairs.size + " uncompilable symbols:\n" + ( + symbols map (x => " " + x.owner.fullName + " " + x.defString) mkString "\n" + ) +} diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala index a14bacb267..f6dc58617e 100644 --- a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala @@ -8,7 +8,6 @@ package doc package html import model._ - import java.io.{ File => JFile } import io.{ Streamable, Directory } import scala.collection._ @@ -17,7 +16,6 @@ import scala.collection._ * @author David Bernard * @author Gilles Dubochet */ class HtmlFactory(val universe: doc.Universe, index: doc.Index) { - /** The character encoding to be used for generated Scaladoc sites. This value is currently always UTF-8. */ def encoding: String = "UTF-8" @@ -50,6 +48,8 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) { copyResource("lib/index.css") copyResource("lib/ref-index.css") copyResource("lib/template.css") + copyResource("lib/arrow-down.png") + copyResource("lib/arrow-right.png") copyResource("lib/class.png") copyResource("lib/class_big.png") copyResource("lib/object.png") diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala index 19372d9e7c..cd733ced9a 100644 --- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala +++ b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala @@ -29,15 +29,18 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </xml:group> val valueMembers = - (tpl.methods ::: tpl.values ::: (tpl.templates filter { tpl => tpl.isObject || tpl.isPackage })) sortBy (_.name) + tpl.methods ++ tpl.values ++ tpl.templates.filter(x => x.isObject || x.isPackage) sorted + + val (absValueMembers, concValueMembers) = + valueMembers partition (_.isAbstract) val typeMembers = - (tpl.abstractTypes ::: tpl.aliasTypes ::: (tpl.templates filter { tpl => tpl.isTrait || tpl.isClass })) sortBy (_.name) + tpl.abstractTypes ++ tpl.aliasTypes ++ tpl.templates.filter(x => x.isTrait || x.isClass) sorted val constructors = (tpl match { - case cls: Class => cls.constructors + case cls: Class => (cls.constructors: List[MemberEntity]).sorted case _ => Nil - }) sortBy (_.name) + }) /* for body, there is a special case for AnyRef, otherwise AnyRef appears like a package/object * this problem should be fixed, this implementation is just a patch @@ -51,10 +54,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <p id="owner">{ templatesToHtml(tpl.inTemplate.toRoot.reverse.tail, xml.Text(".")) }</p> } - <div id="definition"> - <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/> - <h1>{ if (tpl.isRootPackage) "root package" else tpl.name }</h1> - </div> + { val templateName = if (tpl.isRootPackage) "root package" else tpl.name + val displayName = tpl.companion match { + case Some(companion) => + if (companion.visibility.isPublic && companion.inSource != None) + <a href={relativeLinkTo(companion)} title="go to companion">{ templateName }</a> + else templateName + case _ => + templateName + } + <div id="definition"> + <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/> + <h1>{ displayName }</h1> + </div> + } { signature(tpl, true) } { memberToCommentHtml(tpl, true) } @@ -82,17 +95,11 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <ol><li class="public in">Public</li><li class="all out">All</li></ol> </div> } - { - <div id="impl"> - <span class="filtertype">Impl.</span> - <ol><li class="concrete in">Concrete</li><li class="abstract in">Abstract</li></ol> - </div> - } </div> { if (constructors.isEmpty) NodeSeq.Empty else <div id="constructors" class="members"> - <h3>Instance constructors</h3> + <h3>Instance Constructors</h3> <ol>{ constructors map (memberToHtml(_)) }</ol> </div> } @@ -104,10 +111,17 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </div> } - { if (valueMembers.isEmpty) NodeSeq.Empty else + { if (absValueMembers.isEmpty) NodeSeq.Empty else + <div id="values" class="values members"> + <h3>Abstract Value Members</h3> + <ol>{ absValueMembers map (memberToHtml(_)) }</ol> + </div> + } + + { if (concValueMembers.isEmpty) NodeSeq.Empty else <div id="values" class="values members"> - <h3>Value Members</h3> - <ol>{ valueMembers map (memberToHtml(_)) }</ol> + <h3>{ if (absValueMembers.isEmpty) "Value Members" else "Concrete Value Members" }</h3> + <ol>{ concValueMembers map (memberToHtml(_)) }</ol> </div> } @@ -183,10 +197,6 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case dte: DocTemplateEntity if isSelf => // comment of class itself <xml:group> - { if (mbr.comment.isEmpty) NodeSeq.Empty - else - <div class="shortcomment cmt">{ commentToHtml(mbr.comment) }</div> - } <div id="comment" class="fullcomment">{ memberToCommentBodyHtml(mbr, isSelf = true) }</div> </xml:group> case dte: DocTemplateEntity if mbr.comment.isDefined => @@ -198,10 +208,15 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { if (commentBody.isEmpty) NodeSeq.Empty else { - <xml:group> - { memberToShortCommentHtml(mbr, isSelf) } - <div class="fullcomment">{ memberToUseCaseCommentHtml(mbr, isSelf) }{ memberToCommentBodyHtml(mbr, isSelf) }</div> - </xml:group> + val shortComment = memberToShortCommentHtml(mbr, isSelf) + val longComment = memberToUseCaseCommentHtml(mbr, isSelf) ++ memberToCommentBodyHtml(mbr, isSelf) + + val includedLongComment = if (shortComment.text.trim == longComment.text.trim) + NodeSeq.Empty + else + <div class="fullcomment">{ longComment }</div> + + shortComment ++ includedLongComment } } } @@ -225,32 +240,37 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <p class="comment cmt">{ inlineToHtml(mbr.comment.get.short) }</p> def memberToCommentBodyHtml(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = { - NodeSeq.Empty ++ - { if (mbr.comment.isEmpty) NodeSeq.Empty else - <div class="comment cmt">{ commentToHtml(mbr.comment) }</div> - } ++ - { val prs: List[ParameterEntity] = mbr match { + val memberComment = + if (mbr.comment.isEmpty) NodeSeq.Empty + else <div class="comment cmt">{ commentToHtml(mbr.comment) }</div> + + val paramComments = { + val prs: List[ParameterEntity] = mbr match { case cls: Class => cls.typeParams ::: cls.valueParams.flatten case trt: Trait => trt.typeParams case dfe: Def => dfe.typeParams ::: dfe.valueParams.flatten case ctr: Constructor => ctr.valueParams.flatten case _ => Nil } + def mbrCmt = mbr.comment.get + def paramCommentToHtml(prs: List[ParameterEntity]): NodeSeq = prs match { - case Nil => - NodeSeq.Empty + case Nil => NodeSeq.Empty + case (tp: TypeParam) :: rest => val paramEntry: NodeSeq = { <dt class="tparam">{ tp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.typeParams(tp.name)) }</dd> } paramEntry ++ paramCommentToHtml(rest) + case (vp: ValueParam) :: rest => val paramEntry: NodeSeq = { <dt class="param">{ vp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.valueParams(vp.name)) }</dd> } paramEntry ++ paramCommentToHtml(rest) } + if (mbr.comment.isEmpty) NodeSeq.Empty else { val cmtedPrs = prs filter { @@ -258,7 +278,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case vp: ValueParam => mbrCmt.valueParams isDefinedAt vp.name } if (cmtedPrs.isEmpty && mbrCmt.result.isEmpty) NodeSeq.Empty - else + else { <dl class="paramcmts block">{ paramCommentToHtml(cmtedPrs) ++ ( mbrCmt.result match { @@ -267,119 +287,141 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <dt>returns</dt><dd class="cmt">{ bodyToHtml(cmt) }</dd> }) }</dl> + } } - } ++ - { val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags - if (fvs.isEmpty || isReduced) NodeSeq.Empty else - <div class="block"> - attributes: { fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } } - </div> - } ++ - { tpl.companion match { - case Some(companion) if (isSelf && !isReduced) => - <div class="block"> - go to: <a href={relativeLinkTo(companion)}>companion</a> - </div> - case _ => - NodeSeq.Empty - } - } ++ - { val inDefTpls = mbr.inDefinitionTemplates - if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty else { - <div class="block"> - definition classes: { templatesToHtml(inDefTpls, xml.Text(" → ")) } - </div> - } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.linearizationTemplates.isEmpty && !isReduced) => - <div class="block"> - linear super types: { typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) } - </div> - case _ => NodeSeq.Empty - } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.subClasses.isEmpty && !isReduced) => - <div class="block"> - known subclasses: { templatesToHtml(dtpl.subClasses, xml.Text(", ")) } - </div> - case _ => NodeSeq.Empty + } + + // --- start attributes block vals + val attributes: Seq[scala.xml.Node] = { + val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags + if (fvs.isEmpty || isReduced) NodeSeq.Empty + else { + <dt>Attributes</dt> + <dd>{ fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }</dd> } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) => - <div class="block"> - self type: { typeToHtml(dtpl.selfType.get, hasLinks = true) } - </div> - case _ => NodeSeq.Empty + } + + val definitionClasses: Seq[scala.xml.Node] = { + val inDefTpls = mbr.inDefinitionTemplates + if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty + else { + <dt>Definition Classes</dt> + <dd>{ templatesToHtml(inDefTpls, xml.Text(" → ")) }</dd> } - } ++ - { if (!mbr.annotations.isEmpty) { - <div class="block"> - annotations: { + } + + val selfType: Seq[scala.xml.Node] = mbr match { + case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) => + <dt>Self Type</dt> + <dd>{ typeToHtml(dtpl.selfType.get, hasLinks = true) }</dd> + case _ => NodeSeq.Empty + } + + val annotations: Seq[scala.xml.Node] = + if (!mbr.annotations.isEmpty) { + <dt>Annotations</dt> + <dd>{ mbr.annotations.map { annot => <xml:group> <span class="name">@{ templateToHtml(annot.annotationClass) }</span>{ argumentsToHtml(annot.arguments) } </xml:group> } } - </div> - } - else NodeSeq.Empty - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) => - val (absFile, line) = dtpl.inSource.get - <div class="block"> - source: { <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> } - </div> - case _ => NodeSeq.Empty + </dd> + } else NodeSeq.Empty + + val sourceLink: Seq[scala.xml.Node] = mbr match { + case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) => + val (absFile, line) = dtpl.inSource.get + <dt>Source</dt> + <dd>{ <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> }</dd> + case _ => NodeSeq.Empty + } + + val deprecation: Seq[scala.xml.Node] = + if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty + else { + <dt>Deprecated</dt> + <dd class="cmt">{ bodyToHtml(mbr.deprecation.get) }</dd> } - } ++ - { if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty else - <div class="block"><ol>deprecated: - { <li class="cmt">{ bodyToHtml(mbr.deprecation.get) }</li> } - </ol></div> - } ++ - { mbr.comment match { - case Some(comment) => - <xml:group> - { if(!comment.example.isEmpty && !isReduced) - <div class="block">Example{ if (comment.example.length > 1) "s" else ""} : + + val mainComment: Seq[scala.xml.Node] = mbr.comment match { + case Some(comment) => + val example = + if(!comment.example.isEmpty && !isReduced) + <div class="block">Example{ if (comment.example.length > 1) "s" else ""} : <ol>{ - val exampleXml: List[scala.xml.NodeSeq] = - for(example <- comment.example ) yield - <li class="cmt">{ bodyToHtml(example) }</li> - exampleXml.reduceLeft(_ ++ Text(", ") ++ _) - }</ol> + val exampleXml: List[scala.xml.NodeSeq] = + for(example <- comment.example ) yield + <li class="cmt">{ bodyToHtml(example) }</li> + exampleXml.reduceLeft(_ ++ Text(", ") ++ _) + }</ol> </div> - else NodeSeq.Empty - } - { if(!comment.version.isEmpty && !isReduced) - <div class="block"><ol>version - { for(body <- comment.version.toList) yield <li class="cmt">{bodyToHtml(body)}</li> } - </ol></div> - else NodeSeq.Empty - } - { if(!comment.since.isEmpty && !isReduced) - <div class="block"><ol>since - { for(body <- comment.since.toList) yield <li class="cmt">{bodyToHtml(body)}</li> } - </ol></div> - else NodeSeq.Empty - } - { if(!comment.see.isEmpty && !isReduced) - <div class="block"><ol>see also: - { val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <li class="cmt">{bodyToHtml(see)}</li> ) - seeXml.reduceLeft(_ ++ Text(", ") ++ _) - } - </ol></div> - else NodeSeq.Empty - } - </xml:group> - case None => NodeSeq.Empty - } + else NodeSeq.Empty + + val version: Seq[scala.xml.Node] = + if(!comment.version.isEmpty && !isReduced) { + <dt>Version</dt> + <dd>{ for(body <- comment.version.toList) yield {bodyToHtml(body)} }</dd> + } else NodeSeq.Empty + + val sinceVersion: Seq[scala.xml.Node] = + if(!comment.since.isEmpty && !isReduced) { + <dt>Since</dt> + <dd>{ for(body <- comment.since.toList) yield {bodyToHtml(body)} }</dd> + } else NodeSeq.Empty + + val seeAlso: Seq[scala.xml.Node] = + if(!comment.see.isEmpty && !isReduced) { + <dt>See also</dt> + <dd>{ + val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <span class="cmt">{bodyToHtml(see)}</span> ) + seeXml.reduceLeft(_ ++ Text(", ") ++ _) + }</dd> + } else NodeSeq.Empty + + example ++ version ++ sinceVersion ++ seeAlso + + case None => NodeSeq.Empty + } + // end attributes block vals --- + + val attributesInfo = attributes ++ definitionClasses ++ selfType ++ annotations ++ sourceLink ++ deprecation ++ mainComment + val attributesBlock = + if (attributesInfo.isEmpty) + NodeSeq.Empty + else + <dl class="attributes block"> { attributesInfo }</dl> + + val linearization = mbr match { + case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.linearizationTemplates.nonEmpty => + <div class="toggleContainer"> + <div class="attributes block"> + <span class="link showElement">Linear Supertypes</span> + <span class="link hideElement">Linear Supertypes</span> + </div> + <div class="superTypes hiddenContent"> + <p>{ typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) }</p> + </div> + </div> + case _ => NodeSeq.Empty } + + val subclasses = mbr match { + case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.subClasses.nonEmpty => + <div class="toggleContainer"> + <div class="attributes block"> + <span class="link showElement">Known Subclasses</span> + <span class="link hideElement">Known Subclasses</span> + </div> + <div class="subClasses hiddenContent"> + <p>{ templatesToHtml(dtpl.subClasses.sortBy(_.name), xml.Text(", ")) }</p> + </div> + </div> + case _ => NodeSeq.Empty + } + + memberComment ++ paramComments ++ attributesBlock ++ linearization ++ subclasses } def kindToString(mbr: MemberEntity): String = { @@ -427,11 +469,16 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { /** name, tparams, params, result */ def signature(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = { - def inside(hasLinks: Boolean): NodeSeq = + def inside(hasLinks: Boolean, nameLink: String = ""): NodeSeq = <xml:group> <span class="kind">{ kindToString(mbr) }</span> <span class="symbol"> - <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span> + { + val nameHtml = <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span> + if (!nameLink.isEmpty) + <a href={nameLink}>{nameHtml}</a> + else nameHtml + } { def tparamsToHtml(mbr: Entity): NodeSeq = mbr match { case hk: HigherKinded => @@ -453,16 +500,14 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = { def param0(vl: ValueParam): NodeSeq = // notice the }{ in the next lines, they are necessary to avoid a undesired withspace in output - <span name={ vl.name }> - { Text(vl.name) } - { Text(": ") ++ typeToHtml(vl.resultType, hasLinks) } - { - vl.defaultValue match { - case Some(v) => Text(" = ") ++ treeToHtml(v) - case None => NodeSeq.Empty - } + <span name={ vl.name }>{ + Text(vl.name) + }{ Text(": ") ++ typeToHtml(vl.resultType, hasLinks) }{ + vl.defaultValue match { + case Some(v) => Text(" = ") ++ treeToHtml(v) + case None => NodeSeq.Empty } - </span> + }</span> def params0(vlss: List[ValueParam]): NodeSeq = vlss match { case Nil => NodeSeq.Empty @@ -482,21 +527,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case _ => NodeSeq.Empty } } - } - { if (isReduced) NodeSeq.Empty else { + }{ if (isReduced) NodeSeq.Empty else { mbr match { - case tpl: DocTemplateEntity if (!tpl.isPackage) => - tpl.parentType match { - case Some(st) => <span class="result"> extends { typeToHtml(st, hasLinks) }</span> - case None =>NodeSeq.Empty - } + case tpl: DocTemplateEntity if tpl.parentType.isDefined => + <span class="result"> extends { typeToHtml(tpl.parentType.get, hasLinks) }</span> + case tme: MemberEntity if (tme.isDef || tme.isVal || tme.isLazyVal || tme.isVar) => <span class="result">: { typeToHtml(tme.resultType, hasLinks) }</span> + case abt: AbstractType => val b2s = boundsToHtml(abt.hi, abt.lo, hasLinks) if (b2s != NodeSeq.Empty) <span class="result">{ b2s }</span> else NodeSeq.Empty + case alt: AliasType => <span class="result"> = { typeToHtml(alt.alias, hasLinks) }</span> case _ => NodeSeq.Empty @@ -506,7 +550,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </xml:group> mbr match { case dte: DocTemplateEntity if !isSelf => - <h4 class="signature"><a href={ relativeLinkTo(dte) }>{ inside(hasLinks = false) }</a></h4> + <h4 class="signature">{ inside(hasLinks = false, nameLink = relativeLinkTo(dte)) }</h4> case _ if isSelf => <h4 id="signature" class="signature">{ inside(hasLinks = true) }</h4> case _ => diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png Binary files differnew file mode 100644 index 0000000000..7229603ae5 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png Binary files differnew file mode 100644 index 0000000000..b2f2935dc9 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png Binary files differindex 25a8b4c185..97edbd49db 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png Binary files differindex 51e85957fe..1a00abb401 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css index aef3f341aa..7c05678313 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css @@ -20,6 +20,10 @@ h1 { display: none; } +.letters { + padding: 5px; +} + #library { display: none; } @@ -40,7 +44,7 @@ h1 { right: 0; left: 0; top: 0; - background-color: #B78E99; + background-color: #DADADA; } #textfilter { @@ -72,7 +76,7 @@ h1 { height: 16px; padding: 2px; font-weight: bold; - color: #993300; + color: darkblue; background-color: white; width: 100%; } @@ -104,12 +108,19 @@ h1 { } #kindfilter { - position: relative; - display: block; - padding: 5px; - background-color: #F0F8FF; + position: relative; + display: block; + padding: 5px; + background-color: #999; + text-align: center; } + +#kindfilter > a { + color: white; + text-decoration: underline; +} + #tpl { display: block; position: fixed; @@ -127,7 +138,7 @@ h1 { float: right; font-weight: normal; color: white; - padding: 1px 4px 1px 4px; + padding: 0 8px; } #tpl .packfocus { @@ -135,24 +146,34 @@ h1 { float: right; font-weight: normal; color: white; - padding: 1px 0.5em 1px 4px; +} + +#tpl .packages > ol { + /*margin-bottom: 5px;*/ +} + +#tpl .packages > ol > li { + margin-bottom: 1px; } #tpl .packages > li > h3 { display: block; - background-color: #2C475C; color: white; - padding: 1px 4px 1px 0.5em; font-weight: bold; display: block; } +#tpl ol > li.pack { + background-color: #2C475C; + padding: 3px 5px; +} + #tpl ol > li { display: block; } #tpl .templates > li { - padding-left: 0.5em; + padding-left: 5px; } #tpl ol > li .icon { @@ -168,7 +189,7 @@ h1 { } #tpl .templates span.tplLink { - padding-left: 8px; + padding-left: 5px; } #content { diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js index 212844c966..b06d5dc369 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js @@ -227,25 +227,28 @@ function configureTextFilter() { }); } -// Filters all focused templates and packages. This function should be made less-blocking. -// @param query The string of the query -function textFilter() { - scheduler.clear("filter"); +function compilePattern(query) { + var escaped = query.replace(/([\.\*\+\?\|\(\)\[\]\\])/g, '\\$1'); - $('#tpl').html(''); - - var query = $("#textfilter input").attr("value") || ''; - - var queryRegExp; if (query.toLowerCase() != query) { // Regexp that matches CamelCase subbits: "BiSe" is // "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ... - queryRegExp = new RegExp(query.replace(/([A-Z])/g,"[a-z]*$1")); + return new RegExp(escaped.replace(/([A-Z])/g,"[a-z]*$1")); } else { // if query is all lower case make a normal case insensitive search - queryRegExp = new RegExp(query, "i"); + return new RegExp(escaped, "i"); } +} +// Filters all focused templates and packages. This function should be made less-blocking. +// @param query The string of the query +function textFilter() { + scheduler.clear("filter"); + + $('#tpl').html(''); + + var query = $("#textfilter input").attr("value") || ''; + var queryRegExp = compilePattern(query); var index = 0; diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png Binary files differindex 886cd5c7c3..ad312793ea 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png Binary files differindex 0a483cacf5..d51c797047 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png Binary files differindex c3eef6ea51..6ea17ac320 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png Binary files differindex 5ab05cc6ac..529aa93188 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css index 687fe4634c..7957aebe8f 100755 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css @@ -16,13 +16,15 @@ a { } .entry { - + border-bottom: 1px solid lightgray; + padding: 5px 0 8px; } .name { - background-color:#E5E5E5; + /* background-color:#E5E5E5; */ } .occurrences { - margin-left:0.7em + margin-left: 1em; + margin-top: 5px; }
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css index 13ccadefe5..192a56f9bb 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css @@ -16,10 +16,6 @@ table, caption, tbody, tfoot, thead, tr, th, td { vertical-align: baseline; } -body { - line-height: 1.2; -} - table { border-collapse: separate; border-spacing: 0; } caption, th, td { text-align: left; font-weight: normal; } table, td, th { vertical-align: middle; } @@ -40,7 +36,7 @@ body { a[href] { text-decoration: underline; - color: #69481D; /* brown */ + color: #315479; } a[href]:hover { @@ -48,7 +44,7 @@ a[href]:hover { } #owner { - padding: 4px; + padding: 2px 10px 5px; font-size: 12pt; display: block; } @@ -58,16 +54,20 @@ a[href]:hover { } .value #owner { - background-color: #7996AC; + background-color: #7996AC; /* light steel gray */ } .type #owner { - background-color: #799F5A; + background-color: #699D84; /* lighter green */ +} + +#types ol li > p { + margin-top: 5px; } #definition { display: block; - padding: 6px; + padding: 5px 6px; } #definition > img { @@ -81,65 +81,111 @@ a[href]:hover { display: inline-block; } +#definition h1 > a { + color: white; + font-size: 24pt; +} + +#signature { + background-color: #EBEBEB; + font-size: 11.5pt; + margin-bottom: 10px; + padding: 8px; +} + #signature > span.kind { - font-size: 11pt; display: inline; float: left; text-align: left; width: auto; - padding-left: 6px; + position: static; } #signature > span.symbol { - font-size: 11pt; text-align: left; + display: inline; + padding-left: 0.7em; +} + +/* Linear super types and known subclasses */ +.hideElement, +.hiddenContent { + display: none; +} + +div.superTypes > h1 { + font-style: italic; + padding-top: 0.5em; +} + +.link { + text-decoration: underline; + cursor: pointer; + color: #315479; +} + +.toggleContainer p { + margin-top: 5px; +} + +.toggleContainer .showElement { + padding-left: 15px; + background: url("arrow-right.png") no-repeat 0 5px transparent; +} + +.toggleContainer .hideElement { + padding-left: 15px; + background: url("arrow-down.png") no-repeat 0 5px transparent; } .value #definition { - background-color: #2C475C; + background-color: #2C475C; /* blue */ } .type #definition { - background-color: #385E1A; + background-color: #316555; /* green */ } -#comment { - display:none; - padding-right: 8px; - padding-left: 8px; +#template { + margin-bottom: 50px; } -#template .values > h3 { +h3 { color: white; - padding: 4px; - background-color: #7996AC; + padding: 5px 10px; font-size: 12pt; font-weight: bold; } +dl.attributes > dt { + display: block; + float: left; + font-style: italic; +} + +dl.attributes > dd { + display: block; + padding-left: 10em; + margin-bottom: 5px; +} + +#template .values > h3 { + background-color: #315479; /* grayish blue */ +} + #template .types > h3 { - padding: 4px; - color: white; - font-weight: bold; - font-size: 12pt; - background-color: #799F5A; + background-color: #316555; /* green */ } #constructors > h3 { - padding: 4px; - color: white; - font-weight: bold; - font-size: 12pt; background-color: #333; } #template > div.parent > h3 { - color: white; - padding: 4px; + background-color: #3B3B3B; margin-top: 10px; - background-color: #47166D; + font-style: italic; font-size: 12pt; - font-weight: bold; } #template > div.parent > h3 * { @@ -155,6 +201,15 @@ div.members > ol { div.members > ol > li { display: block; + border-bottom: 1px solid gray; + padding: 5px 0 6px; + margin: 0 10px; + position: relative; +} + +div.members > ol > li:last-child { + border: 0; + padding: 5px 0 5px; } /* Member signatures */ @@ -169,18 +224,16 @@ div.members > ol > li { } .signature { - padding: 2px; font-family: monospace; font-size: 10pt; + line-height: 18px; clear: both; display: block; - background-color: #E5E5E5; } .signature .kind { + position: absolute; text-align: right; - float: left; - display: inline-block; width: 8em; } @@ -197,8 +250,8 @@ div.members > ol > li { } .signature .symbol { - display: inline; - padding-left: 0.7em; + display: block; + padding-left: 8.7em; } .signature .name { @@ -218,12 +271,22 @@ div.members > ol > li { font-style: italic; } +#template .signature.closed { + background: url("arrow-right.png") no-repeat 0 5px transparent; + cursor: pointer; +} + +#template .signature.opened { + background: url("arrow-down.png") no-repeat 0 5px transparent; + cursor: pointer; +} + #template .values .signature .name { - color: blue; + color: darkblue; } #template .types .signature .name { - color: green; + color: darkgreen; } /* Comments text formating */ @@ -231,54 +294,49 @@ div.members > ol > li { .cmt {} .cmt p { - margin-bottom: 0.9em; - margin-top: 0.9em; + margin: 0.7em 0; } -.cmt h3 { - margin-bottom: 1em; - margin-top: 1em; +.cmt p:first-child { + margin-top: 0; +} + +.cmt p:last-child { + margin-bottom: 0; +} + +.cmt h3, +.cmt h4, +.cmt h5, +.cmt h6 { + margin-bottom: 0.7em; + margin-top: 1.4em; display: block; text-align: left; font-weight: bold; - font-size: x-large; +} + +.cmt h3 { + font-size: 14pt; } .cmt h4 { - margin-bottom: 0.6em; - margin-top: 0.6em; - display: block; - text-align: left; - font-weight: bold; - font-size: large; + font-size: 13pt; } .cmt h5 { - margin-bottom: 0.4em; - margin-top: 0.4em; - display: block; - text-align: left; - font-weight: bold; + font-size: 12pt; } .cmt h6 { - margin-bottom: 0.4em; - margin-top: 0.4em; - display: block; - text-align: left; - font-style: italic; + font-size: 11pt; } .cmt pre { - padding: 0.4em; - border-color: #ddd; - border-style: solid; - border-width: 1px; - margin-left: 0; - margin-bottom: 0.4em; - margin-right: 0; - margin-top: 0.4em; + padding: 5px; + border: 1px solid #ddd; background-color: #eee; + margin: 5px 0; display: block; font-family: monospace; } @@ -286,7 +344,7 @@ div.members > ol > li { .cmt ul { display: block; list-style: circle; - padding-left:20px; + padding-left: 20px; } .cmt ol { @@ -315,7 +373,7 @@ div.members > ol > li { } .cmt li { - display:list-item; + display: list-item; } .cmt code { @@ -339,35 +397,32 @@ div.members > ol > li { p.comment { display: block; margin-left: 8.7em; + margin-top: 5px; } .shortcomment { display: block; - cursor: pointer; - margin: 4px 0px; - padding: 0 8px; + margin: 5px 10px; } div.fullcomment { - margin: 10px 0 10px 0; + margin: 5px 10px; } #template div.fullcomment { display:none; - margin: 6px 0 6px 8.7em; + margin: 5px 0 0 8.7em; } #template .shortcomment { - margin: 0 0 0 8.7em; - padding: 2px; + margin: 5px 0 0 8.7em; + padding: 0; } div.fullcomment .block { - padding: 2px 0 2px 0; - border-top: 1px solid gray; - border-bottom: 1px solid gray; - margin-top: 2px; - margin-bottom: 2px; + padding: 5px 0 0; + border-top: 1px solid #EBEBEB; + margin-top: 5px; } div.fullcomment div.block ol li p, @@ -375,10 +430,6 @@ div.fullcomment div.block ol li { display:inline } -div.fullcomment .block + .block { - border-top: none; -} - div.fullcomment .block > h5 { font-style: italic; font-weight: normal; @@ -386,39 +437,25 @@ div.fullcomment .block > h5 { } div.fullcomment .comment { - margin: 6px 0 6px 0; + margin: 5px 0 10px; +} + +div.fullcomment .comment:last-child { + margin-bottom: 0; } div.fullcomment dl.paramcmts > dt { display: block; float: left; font-weight: bold; - margin: 2px 4px 2px 0; } div.fullcomment dl.paramcmts > dd { display: block; padding-left: 80px; - border-top: 1px dashed gray; - border-bottom: 1px dashed gray; + margin-bottom: 5px; } -div.fullcomment dl.paramcmts > dt:first-child + dd { - border-top: none; -} - -div.fullcomment dl.paramcmts > dd:last-child { - border-bottom: none; -} - -div.fullcomment dl.paramcmts > dd + dt + dd { - border-top: none; -} - -div.fullcomment dl.paramcmts dd.cmt p { - margin-top: 2px; - margin-bottom: 2px; -} /* Members filter tool */ #textfilter { @@ -466,31 +503,43 @@ div.fullcomment dl.paramcmts dd.cmt p { } #mbrsel { - padding: 4px; - background-color: #B78E99; /* grayish pink */ + padding: 5px 10px; + background-color: #DADADA; /* light gray */ + font-size: 9.5pt; display: block; - margin-bottom: 10px; + margin-top: 1em; +/* margin-bottom: 1em; */ +} + +#mbrsel > div { + margin-bottom: 5px; +} + +#mbrsel > div:last-child { + margin-bottom: 0; } #mbrsel > div > span.filtertype { - padding: 4px; + padding: 3px 0; float: left; display: inline-block; - color: white; + color: #404040; width: 4.5em; } #mbrsel > div > ol { display: inline-block; - background-color: white; + /*background-color: white;*/ } #mbrsel > div > ol#linearization { - display: inline; + display: block; + margin-left: 4.5em; + margin-top: 5px; } #mbrsel > div > ol > li { - padding: 4px 8px 4px 8px; + padding: 3px 10px; background-color: white; display: inline-block; cursor: pointer; @@ -502,8 +551,8 @@ div.fullcomment dl.paramcmts dd.cmt p { } #mbrsel > div > ol > li.out { - color: #80384E; - background-color: #9E6A77; + color: #4B4B4B; + background-color: #999; } #mbrsel .hideall { diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js index ef98c13aaf..14a5613015 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js @@ -69,24 +69,6 @@ $(document).ready(function(){ filter(); }; }); - $("#impl > ol > li.concrete").click(function() { - if ($(this).hasClass("out")) { - $(this).removeClass("out").addClass("in"); - $("li[data-isabs='false']").show(); - } else { - $(this).removeClass("in").addClass("out"); - $("li[data-isabs='false']").hide(); - } - }); - $("#impl > ol > li.abstract").click(function() { - if ($(this).hasClass("out")) { - $(this).removeClass("out").addClass("in"); - $("li[data-isabs='true']").show(); - } else { - $(this).removeClass("in").addClass("out"); - $("li[data-isabs='true']").hide(); - } - }); $("#order > ol > li.alpha").click(function() { if ($(this).hasClass("out")) { $(this).removeClass("out").addClass("in"); @@ -119,44 +101,47 @@ $(document).ready(function(){ $(this.getTip()).html(this.getTrigger().attr("name")) } }); - var docAllSigs = $(".signature"); - function commentShowFct(fullComment){ + + /* Add toggle arrows */ + var docAllSigs = $("#template li").has(".fullcomment").find(".signature"); + + function commentToggleFct(signature){ + var parent = signature.parent(); + var shortComment = $(".shortcomment", parent); + var fullComment = $(".fullcomment", parent); var vis = $(":visible", fullComment); + signature.toggleClass("closed").toggleClass("opened"); if (vis.length > 0) { + shortComment.slideDown(100); fullComment.slideUp(100); } else { + shortComment.slideUp(100); fullComment.slideDown(100); } }; - var docShowSigs = docAllSigs.filter(function(){ - return $("+ div.fullcomment", $(this)).length > 0; - }); - docShowSigs.css("cursor", "pointer"); - docShowSigs.click(function(){ - commentShowFct($("+ div.fullcomment", $(this))); + docAllSigs.addClass("closed"); + docAllSigs.click(function() { + commentToggleFct($(this)); }); - function commentToggleFct(shortComment){ - var vis = $("~ div.fullcomment:visible", shortComment); - if (vis.length > 0) { - shortComment.slideDown(100); - vis.slideUp(100); - } - else { - var hid = $("~ div.fullcomment:hidden", shortComment); - hid.slideDown(100); - shortComment.slideUp(100); - } + + /* Linear super types and known subclasses */ + function toggleShowContentFct(outerElement){ + var content = $(".hiddenContent", outerElement); + var vis = $(":visible", content); + if (vis.length > 0) { + content.slideUp(100); + $(".showElement", outerElement).show(); + $(".hideElement", outerElement).hide(); + } + else { + content.slideDown(100); + $(".showElement", outerElement).hide(); + $(".hideElement", outerElement).show(); + } }; - var docToggleSigs = docAllSigs.filter(function(){ - return $("+ .shortcomment", $(this)).length > 0; - }); - docToggleSigs.css("cursor", "pointer"); - docToggleSigs.click(function(){ - commentToggleFct($("+ .shortcomment", $(this))); - }); - $(".shortcomment").click(function(){ - commentToggleFct($(this)); + $(".toggleContainer").click(function() { + toggleShowContentFct($(this)); }); }); diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png Binary files differindex b3871a01c4..fb961a2eda 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png Binary files differindex a44871309e..0159946d46 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai index b56fd1d3cd..3b5c47c9e3 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai @@ -1,7 +1,7 @@ %PDF-1.5
%âãÏÓ
-1 0 obj
<</Metadata 1054 0 R/Pages 2 0 R/OCProperties<</D<</RBGroups[]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]/OFF[15 0 R 27 0 R]/Order 970 0 R>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]>>/Type/Catalog>>
endobj
1054 0 obj
<</Subtype/XML/Length 44482/Type/Metadata>>stream
+1 0 obj
<</Metadata 1054 0 R/OCProperties<</D<</OFF[15 0 R 27 0 R]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]/Order 1314 0 R/RBGroups[]>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]>>/Pages 2 0 R/Type/Catalog>>
endobj
1054 0 obj
<</Length 44567/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> -<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 "> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -13,32 +13,33 @@ </dc:title> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xap="http://ns.adobe.com/xap/1.0/" - xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> - <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool> - <xap:CreateDate>2009-11-23T17:10:12+01:00</xap:CreateDate> - <xap:ModifyDate>2010-04-13T20:05:12+02:00</xap:ModifyDate> - <xap:MetadataDate>2010-04-13T20:05:12+02:00</xap:MetadataDate> - <xap:Thumbnails> + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xmp:CreatorTool>Adobe Illustrator CS3</xmp:CreatorTool> + <xmp:CreateDate>2009-11-23T17:10:12+01:00</xmp:CreateDate> + <xmp:ModifyDate>2011-04-04T19:44:30+02:00</xmp:ModifyDate> + <xmp:MetadataDate>2011-04-04T19:44:30+02:00</xmp:MetadataDate> + <xmp:Thumbnails> <rdf:Alt> <rdf:li rdf:parseType="Resource"> - <xapGImg:width>256</xapGImg:width> - <xapGImg:height>208</xapGImg:height> - <xapGImg:format>JPEG</xapGImg:format> - <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynba
/PLB5FuryZPMPpsVR5FjD2aSlP3nAujk022r1C5k6fka+ro1ZOl8kH+VVxocf5iarp3kyXn5TTTI
p9Sht3kmso9WaUKPRklHL4oVbcfap/kilmckwBl9V/YjH9W3J7DmE3OxV2KuxV2KuxV2KuxV2KpD
5s89eU/KUNvN5h1BLFbpylupWSV3KirFY4ld+K7ValBUeIycMcp8gxlIDmivLfmfQfMumDU9DvFv
bIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlA0UxkDyTTIJdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVU7m2t7q3ltrmJJ7eZTHNDIodHRhRlZWqCCOoOEGlU9P03TtNtEs9OtYbKzir6dtbx
rFEvIljxRAFFSSTiZE7lAFIjAl2KuxV2KuxV2KuxV2KuxV5v5w0LVrT8wW84pbT3emJ5euNNMVin
rXYuhMZY1SHhJX1PUorcSoI+OgpXIxyHDw9eJrkN78kX+Wumaw+s+ZfNepaY+ir5hktDaaZNw9dY
raAj1puBIV5WlPJCAykb45pChEG+FYDcnvZ7mO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuJAFT0xV5j58/Pryv5Zup9NtUbU9WhJR4YiPTRxx+3J0H7QIHxAj7NDXMrDpZT36NU8oD
zi6/5yR843N6k1rYQWtqtK2vL1OVDU1dkruNtszo9nCmg6gsv8tf85H6ZdziHXtPbTuVAs0LerGK
KftE8SOTUA2oOpbKcvZsgNt2cdSDzexW11b3VvHcW0qzQSqHilQhlZTuCCOoOa4iubkqmBXYq7FX
Yq7FXYq7FXYqwDzz+dXk/wApy/VZJDqGoUVvqlqVdgrgkFmrxX9k/ERUGormRi00ptcsgDzof85Q
aw5Xh5eh4j7ZNw9WHagCfD+OZo7Nvq0nU+TJfK3/ADkXoV/MINdtH0qR2/dzKfVgApQBn2ate/ED
7t68vZ047jdlHUA83rdtcwXMEdxbyLLBKoeORTUMrCoI+jNeRTkKmBXYq7FXYq7FXYq7FWHz/wB9
J/rH9ebAcmgrMKHYqn3l7/eaT/X/AIDMXPzbYck1yhm7FXYq7FXj3/OQv5mXflvSYtE0icR6pqis
ssqULwwinJga1RjWg271B2zL0uHiNlqyzp4J5D8ja95t1T6lpcXqSAc7i4kJEUSk/akeh6nt1Oba
WSOONycQRMjQe1Wf/OM5W3/0nXgtwR0ituSKfm0ilvuGY38q1yj9rZ+V82Geevyk17ypD9blZL7T
CQpvIQRwJ2AlQ1417GpHvXM7Ta2GXblJoy4TDfonH5IfmBc6PrUXlu/n/wBxF8zfVjIdoZiCeKkk
cVkP/DfMnMXtHSgjjHNt0+Xei+jc0bnOxV2KuxV2KuxV2KvLvz7/ADIl8peXY7LT246xq3JLd96R
xr/eSdKGlQAK9TuCKjMnTYuI+TVlnQeH/lv+U2uee7W91K2v4I3gm43BujIXd5BzL8lV6171zZT1
EcVAhx44zNllj/zj55wfVriyaW3itbbgDqDF/TkLIGpEvHk3HlQnYV75Z/KWMRB3vuY/lpEteavy
L8z6JpsmoRSQ6lbQKXuBByWRFG5bgw+JQOtDX2yzD2jjyHhOxYz08oi0R+SX5g3Wja1F5cvpS2k6
g/G1Lkn0Zz0Vd9lkO1Kfa+ZOUdo6UEcY5s9Pl3ovo7NG5zsVdirsVdirsVdirD5/76T/AFj+vNgO
TQVmFDsVT7y9/vNJ/r/wGYufm2w5MO178x9W0/zF5isYWshJodm9xp3l+RHOpauy2JuvUs29aOka
Sfu2CwSH4G6GmUM3n/mD86fN955Av3e503SHurLVzba7FJGyyva2kLRWtr9Sv7sW9873LlOU7ECL
lwqxVFUlv/M3nma91i2tNfuYJ5Lj6rcAz3Usscc2u2VpD61us0P1A+jcMLd4GVriLk5KvRgq9W8g
ah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fmpXd5+ampxXD
8/qIjtoTSlI+PqqtB4erTNtpQBEOJlO73z/nHbSbWz/LW0vYlHr6nNPNO/c+nK0CivgBF+OYmtkT
krubcA9LEfzU/NPzVov5jGy065MNhpXoc7QAcJzJGsz+ptU1WTj7UqN8ztJpITxWRuWjNmkJ7dHu
Gpafa6rpdzYXK87a8iaKRSP2XWlaHuM1MJmMgRzDmEWKfFjXs1hdw3kLcbi0lSaJga0eNgykEe4z
qswBjTqobF9r2DyPY27yNzkaJC7kAFmKipoKDf2zkzzdqFfAl2KuxV2KuxV2KvkH/nInWF1D8y54
0DJHZQpb8TQVdGYO+xPXYV8AM2uljUXEymy9R/5xZ/5R3Wf+YqP/AJN5X2hzHuZ6fkU5/OT80tc8
pahp+n6RFD6k8ZuZ5p1LgrzKKigFafZPI/KmOi0kcgJkjPmMTQZ75S15PMPlnT9Y9MR/XYQ8kXUK
4qrqK9QGBpmHmx8EzHub4S4hb5T/ADAtk0LzrqkNgfSFletJa8duFG9RAP8AV2zo8cuPECeoddIV
M0+vLB+djbvUnlEjVapbdQd6985g83ZBXwJdirsVdirsVdirD5/76T/WP682A5NBWYUOxVPvL3+8
0n+v/AZi5+bbDkmuUM3Yq7FXYq+T/wDnJnyydM88RavClLbVIQ0jcuR9dCQ1evEMKcfkadM2eknc
a7nGyjdn3/ONP5gabPoP+ErydYdQtJHk09HNPWhlJdlSvV0csSPA+xyrWYjfEGWGW1Mx83fk1onm
XzXBr9xcyQ09MX1oqKyz+lsvxE/DVQFOx2HbBh10scOEBZ4BKVpr+ZPnrTvKPly4uZZlGpTRsmnW
1RzeUigbj14ITVj9HUjKtNgOSVdOrPJPhD5S8q6VN5h81abpMUfrCedTMlVFYlPKQVYhalRQVO5o
M3mpy1ElwccLL7VtoFt7eKBSzLEiorMasQopUnxznCbdkqYFdirsVdirsVdir5Z/5yj8vz2nnCz1
tUAtb+3ERK1P72Ekkt2BYNsPYnNlpJemnGzDdmn/ADinJz8ua37Xcf8AybyGuNkMsA2LN/zJ/Kiy
87XFldNfNYXNopiZxGJQ8RPLjQslCDWhr36ZDS6w4gRV2nLh42SWkGjeU/LEULzC20vSbcK08p6K
g3Zj3Zj4dSdsx5GWSd9S2ACI9z5I1C4ufPHn91t0fnrN8xVEBZ0hZiSaLyJ9OIVNB2zfSkMeOu4O
ABxSfZVrE0NtDCzBmjRUZgKAlRSoG9M54uxVMCuxV2KuxV2KuxV8e63/AM5B+fLXWb+2jjsfTguZ
Y0rC5PFHKiv7z2zcRxCg4plugv8AoYz8wP8Afdh/yJf/AKqYfCCOIu/6GM/MD/fdh/yJf/qpj4QX
iL3v/nHrzzrXnDyzqV9qywrNb3voRiBCi8fSRtwWberZgauNSDdiNh6pmK2uxV2KuxVjnn7yPpnn
Py7No1/VAx9S3mABaOVQQrivhXt8ulRlmPIYGwxlGw+PPN3kDzd5Kv6ahbSpArVt9QjDek1GIU8x
9lqqdvpFRvm1x5RLk4koEIi0/Nz8w7e2FtH5hvhEBQBpmZgB2DNVh9+S8PH/ADQvFLvQFmvmvzbq
3pWqXWsanMQHdmaV9zxBkkc/CKnqxplhyxgO4MREkvp78l/ykTydZHU9RYS69eJSUgUWKM7+mtQG
/wBb9W22q1OoMzXRysePhen5itrsVdirsVdirsVdirHPP3kjTfOfl2bRr4lAx9SCYAFo5VB4uKjt
Xt8ulRlmPIYG2Mo2GF/kF5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26nIJUQwxxpjP/OQ
H5gea/KfnPTf0HqMlmJtPDSxgK8bETSCpjkDoT70y/SQjKJ4he7DLIg7PIdX8+fmB53uI7G7vLnV
JCax2cKBUqP2vShVE2H7RG2ZkRDHuBTSTKXN73+Sn5Nz+WOWteYI431mZAIodnFupo1FIPHlX7Rp
1Hw7Cra/U6nj2HJyMeOub2DMNudirsVdirsVdirsVfnj5l/5SPVf+Yy4/wCTrZvIcg4Z5pbkkOxV
9V/84jf8oVrP/bSP/JiPNbrfqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9dXedVVDYtCJUaIrsoW4
VuZcfLMNtYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWstwl2PShcr25MrHiFV11+
cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufzetLe90HSpG0Y6trUX1su
usINPW2af0Ymgu5IEkuZJt/TjSDchgSAAxVeiYqpz21vcJ6c8Sypv8LqGG4Knr7EjEFWNH8q/wAt
yat5a09m7s1ujEnxJIqT88s8afex4B3J1pOgaLo9utvpdlDZwrXikSBQOVKgeA26ZGUieaQAEfkU
uxV2KuxV2KuxV2KuxV2KrXiRxRhvQjkCQwB60YUI+jFWMeaPy08oeaNQtL7WbT6zPZjgnI1DJy5c
H5VPGtelOpy2GWURQYygCmeieUfLGhBho+mW9gH48vQjCVKggHbvv16nISmTzKREBNsil2KuxV2K
uxV2KuxV2Kvzx8y/8pHqv/MZcf8AJ1s3kOQcM80tySHYq+q/+cRv+UK1n/tpH/kxHmt1v1D3ORh5
PXdW8p6Rq2s2eqX6GdrO0vbAWjhHt5YNR9H11mjZW57WygCtKE1B7YbaxW4/JDyolxJLotxceXY5
b+PU5LXSodOjt2nggjggDQzWk6MkJiaWNSKCV3f7XHiqm8vkBpdWn1h/MGpnVTDJa2F5Sw5WUE80
c8scC/VODBzAi/v1kIXpSpxVKJvyS8sSWjWqX1/DFdW8lprPBreuoQzXUt5IlxygbhynuZWrb+kR
yoKACir0LFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Rta/wCc
afzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxzjKC/wChX/zV/wCWez/6SV/ph/NwR4Rd/wBC
v/mr/wAs9n/0kr/TH83BfCL3b8gPy+8x+SPLeo6frqRJcXN568QhkEg4ekibke6nMPU5BMghtxxI
D1DMdsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdiqGOpWIJBmUEbEYOINnhS7nfpOw/3+uPEF8KXc79J2H+/wBceIL4Uu5VhuIZlLRO
HANCR44gsZRI5qmFi7FXYq7FVO4uIbaB553EcMYLO56ADElXj/mv/nIzSrK+ks/L1oNV9MsjXRYp
ATQbo1KtRq9BQihDZh5NWI8t2mWYBiUH5+/mCzDnHZtEOoERDkf63Lj/AMLmKdfJq/MFnvlP8+NJ
1K5W01u2/Rc0jBYpg3OCpIFGc0K9SakUpmTi1sZGjs2Qzg83qasrKGU1U7gjM1vbxV2KuxV2KuxV
2KuxV2KuxVDahqmnadbtcX9zHbQIpZpJGCgKCATv4VGAkDmgljx/NP8ALsS+l+n7QtUCoeq7/wCU
Bx/HK/Hh3sfEj3p7pet6RqsIm028hu4jUB4XDg8aA0p4VGTjIHkyBBRuSS7FXYq7FXYq7FXYqxCb
++k/1j+vKC7SPJZil2Kp95f/AN5pP9f+AyyDh6nmE0ybjOxV2KuxV86/85E/mHcz6n/g/T5THbwg
NqbKWBdmoViIIX/WPWopQ9a4Opy9A0ZZdGDeQvIet+aLs22mQgrHQ3FzIeMUQPTk1D1psAK5gxxS
yGg44iZHZ6/af848KsI+s63SUjdY7eqg/NpKn7hmQOze+X2Nv5bzec+cfLMWga9c6N9ZF21sE5TB
PTqZEDgceT9mHfNfnx+HPhu3GyR4TT0T8j/PF08x8rahNzSJC+nO53CggGLkSNl/ZFD9AGbLQ5yf
SXKwZL2L2bNk5LsVdirsVdirsVdirsVYf+Z35hWHkvQHu3ZZNQmPp2VoGHN3YH4qUaiim7Hb5mim
rLk4QwnKg+ZpdQ82/mB5iiW7mN3fXktLa1DCOFCRQBFYhVoq0qdzTcnNXOcpyrq4spGRZtqH5Iax
onlu71nU7q3Q2qK4tYuUjHkyrRmIRR9rtXHJpJxiZErLEQLLEtMutR0m6S90u5e1uUIYPGdjxPIB
lPwsKitCMw4ZpRNhpjMh9Dflh+Y0Xmqye3vSkOs21BNCDT1AannGD1XbxqO/Ynd6bUDIPNzsWTiD
Osym12KuxV2KuxV2KsQm/vpP9Y/rygu0jyWYpdiqfeX/APeaT/X/AIDLIOHqeYea+bfJvnPWPzE1
680wB4v0dplnbtfP9UhFpPJdHUIrK9jtLqaKZhFGrcD9mSrbiLjNxkt8k6j+Zun+VLfT57W/sdW0
vy7bJ5a0OOzaSwu5ItKBBv7uS05QXC3ClTA00VGAX468iqivJHmL8z7rVrOHzRc6jb6axVtPmtNM
mZrmcyASW2pyTaVbm3jQUpKkEKlW/vGKk4qyD8n9Y/MjUk1N/OimKVRAUtZIJoWguCZPXjjdrKyh
khFE4enJPTesrchRV8yecLmafzzrkkztI4vrhObks3GOQotSdzRVGajLzLhzfVP5LaRa6f8Al5pj
wqPVvVa6uJAN2d2IFf8AVQBcz9LECA83IxCosA/Mv81fNlp5qu9L0m5+oWlgwi+BEZ5GoCzMzq3c
7AZg6nVTEyAaAaMuU3Qeb3+sX+q6jPqF/L615cENNLQLyIAHRQANh2Ga/JIyNnm40jZsorynqs2m
+cdJvYKGWKbZT0IZSpB+g5dpTUgWeI0X1rnQOxdirsVdirsVdirsVdir5L/P3zBc6p+ZFzYu1bbS
VW3hRWZl5Mod2ofssahWp/Lmt1Mrk42U7su/5x20Xy/d319e6giNqFi9s2mM0jIwZxLz4oGUP9le
oOR0cYmRJ5jkjCATu941uw0rUNLuLPVlVtPmAFwruY1oGBFXUqRuB3zY5IiQqXJyZAEbvnL8yNN0
LSfNclloiomniGJlVJGmXkwPL42Zz+OaLV44xnUeTr80QDslvkvWp9F85aXewtxDzpbzAsUVo5mC
HkR+yCQ30Y6SZjMLhlUn1bnQOxdirsVdirsVdirEJv76T/WP68oLtI8lmKXYqn3l/wD3mk/1/wCA
yyDh6nmE0ybjOxV2KuxV8afnB5cm8vfmDqMbBjBdyG7gkYglhL8TluOwPOpp4U2GazNCpFxZii9x
/wCcfvPmnan5Yh8uzzKmq6byWKJjRpYCxdWSvXhXiQOgAzI0uQVw9Q24pbUyPzd+UflnzLqR1KZ5
7S9kAE727Lxk4igLK6t8VABUYc2kjM3yKzwiRt4N+YWiWnljzXe6Ras7W1uIjC8pBcrJEr1YgKOr
Htmpz4eCZAcTJCpUi/yZ0WfXfP1rMIxJZ6WDc3RYEpuCqKSAdyTUV60zJ0eK5X3NmGO76lzbuY7F
XYq7FXYq7FXYq7FXxt+c1tJafmlrnOvGaZZo2IIqrop2r4NUfRmszj1Fxcg3TX8oJlbzxoi13+sr
/wAROY2EfvQ1wHqD6I/NdWb8vdZCgk+khoPASoTm01f92XKy/SXy8hCmpzQF16vo4a88yaVax15S
3cC1ALUHqAs1B/KN8vwR9QZ4xu+xs6B2LsVdirsVdirsVfB3mHz152j1/U44/MOppGl3OqIt5cAA
CRgAAH6DMUl6GEBQ2S//AB956/6mPVP+k24/5rwWy4B3O/x956/6mPVP+k24/wCa8bXgHc+mf+cW
tZ1jVfKGrTapfXF/MmoFEkuZXmZV9CM8QXLECpy/FydVrwBIe57RljguxV2KuxVhP5qflpY+eNFE
LMYdStAz2FwADRj1U1ps1PH9QpVlxcQYTjb5S1/yt5q8o6i0OpW0ls8LgR3SV9NmoGUpIO/EhqGj
DuBmunjIO7jmNI+D81fPsUaxr5gv+KigBuJDt8ya4OOfeUcR71fQfL/nrz7qfK1S4vXkYLcandM7
RoNh8czciaV6Cp9sY4pTKiBL6k/L38v9K8maKlja/vrt/ivL1gA8khpX/VXbZf1nfNnixCApyoxo
Mpyxk7FXYq7FXYq7FXYq7FXiv/ORH5bXOtWcXmXS0aXULJBFcW6hmaSGpPw7kVQ9FoK1PViBmLqM
d7hqyR6vAPKvmObQ9csNUjXm1jPHP6Z2DCNgxUn/ACgKZgDYg9zRyNvrvSvzT/LnWdNWca3ZQxzL
SW1vZY4JFqN0eOUrWnQ0qPfNoM0CObkiYL55/N3W9Dm87Xj6JLBLp4jhWJ7Xj6NViUMF4fDsfDNX
qIgzNcnFyAGWzNP+cf8AyDdXF+PN2pI0UUIppkTBlL81IM1QV2psOtQTUUKk5Wkw16i24odX0Bme
5DsVdirsVdirsVfnl5l/5SPVf+Yy4/5OtmIXo4fSEtxZOxV9V/8AOI//AChWs/8AbSP/ACYjy7Fy
dT2h9Q9zJvOHnTW/K/mu/vtUk1BdBis5pNEs7ZdPeyvLi00+a8nhnbhJqEcnGIslCqfD13obXASN
PPXnMeVZJ7jUryz8zWV/oU+qWlza6d6Bs9YvI7YRWht2uaQODJQySNMOO/GoxVO187+ZdT/Nafy1
EbzSNLk07UoLEzaZP8V5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WI
tNnuYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWNndoUuoEmQqUIdQ3wtTkN/GmAi1pjw/L
H8vg3IeX7ISf79EQElfHmPir71yHhR7mPAGSQ28EC8IY1iTb4UUKNhQbD2GWUyX4q7FXYq7FXYq7
FXYq7FXYq06JIjI6h0cFWVhUEHYgg4q8x8+fkF5U8zXM2o2rNpmpzVZ5IQPSdzTd0pT+Ykjck9co
yacS3a5YwWAn/nFXWhLRPMNuYf5zA4an+ryI/wCGyn8oe9h4TL/J3/OOPlnSLiO81m4bWLmJuSxu
oW3qCCpMZrXoQQxI3yyGmA5so4gHrkUUUSBIkCIKkKooKk1PTxJzJbV2KuxV2KuxV2KuxV+eXmX/
AJSPVf8AmMuP+TrZiF6OH0hLcWTsVfVf/OI//KFaz/20j/yYjy7FydT2h9Q9z2MeWvLg1eXWhpVm
NYuE9KfUhbxfWZI+IXg83H1GXioFCemWuApWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS
6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q
Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq+edT/5xI+u6ld3v+K/T+tTSTen+j+XH1GLUr9ZFaV8Mq8J2Me0KFcP2/sQ
3/Qnn/f3f9y7/s6weF5p/lH+j9v7Hf8AQnn/AH93/cu/7OsfC81/lH+j9v7Hqv5R/lh/yrzRbzTP
0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnE1GfxDdUzrJNDsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeE+eYtP1
78wPNVj5l1N/q2iWtnJ5d0WS7SxgmaWAPNKrOOLOjsd+prStBthZRxEg9OQaJiyWafkX5g1zXfIi
XWrtJM8VzLBaXc3IyTwIFIdnYn1CHZ05D+Wh3By3TSkYbs8RJG70LMhsdirsVdirsVdirsVdirsV
dirGPO3nyw8rCwt2tZ9R1fV5Gg0nTrYDlLKoH2nYhUQM6hm3IrWhocryZOH3ljKVLPJn5gWXmSe7
06a1k0rXtONL7SrgqzqK05xuu0kdduQA7dipMceYS25EIjO/eyrLmbsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVS3VfLHlrV5Ul1bSbLUZY14RyXdvFOyrWtFMisQK5EwB5hBAR1vb29tbx
W1tEkNvCixwwxqEREQUVVUUAAAoAMkAlUxV2KuxV2KuxV2KuxV2KuxV2KsB/NHyPruvXnl3XNBli
GqeW7prqO0uHaNJ0Yo7R+ooajMYFXfajGpGU5YE0R0YTiTuFD8vPIGq6f5p1jzlrf+i6jq6mOHSU
nN0tvFIUkkEk5Veb84wFC/Cq92r8McWKpGR5lEIUbei5kNjsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVf//Z</xapGImg:image> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>208</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynbe
YJ5YPIt1eTJ5h9NiqPIsYezSUp+84F0cmm21eoXMnT8jX1dGrJ0vkgvyquNDj/MTVdO8mS8/KaaZ
FPqUNu8k1lHqzShR6Mko5fFCrbj7VP8AJFJ5yTAGX1X9jHH9W3J7FmG3uxV2KuxV2KuxV2KuxV2K
pD5s89eU/KUNvN5h1FLFbpylupWSV3KirFY4ld+K7ValBUeIycMcpcgxlIDmivLfmfQfMumDU9Dv
FvbIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlE0UxkDuE0yCXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FVO5tre6t5ba5iSe3mUxzQyKHR0YUZWVqggjqDhBpVPT9N07TbRLLTrWGys4q+nb
W8axRLyJZuKIFUVJJOJJO5QBSIwJdirsVdirsVdirsVdirsVeb+cdC1a0/MF/OMdvNdaYnl24030
7FPXuxdCYyxqkPCSvqep8LcSoIPOgpXIxyHDw9eJrkDd+SL/AC10zWH1nzL5r1LTH0VfMMlobTTJ
uHrrFbQEetNwJ4vK0p5IQGUjfHNIUI3dLAbk97Pcx2x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxVxIAqemKvMfPn59+V/LN1Pptqjanq0JKPDER6aOOP25Og/aBA+IEfZoa5lYdLKe/Rq
nlAeb3X/ADkl5xub1JrWwgtbVaVteQk5UNTV2Su422zOj2cKcc6ksw8s/wDOSGmXc4h1/T207lQL
NC3qxiin7RPEjk1ANqDqWynL2dIDbdsjqQeb2K2ura6t47i2lWaCVQ8UqEMrKdwQR1BzXEU5KpgV
2KuxV2KuxV2KuxV2KsA88/nX5P8AKcv1WSQ6hqFFb6palXYK4JBZq8V/ZPxEVBqK5kYtNKbXPKA8
5H/OUOsOV4eXoOIPxk3D1YdqAJ8P45mjs2+rQdV5Mm8rf85GaDfzCDXrR9Kd2/dzKfVgApQBn2at
e/ED7t6svZ847jdlDUg83rdtcwXMEdxbyLLBKoeORTUMrCoI+jMAinJVMCuxV2KuxV2KuxV2KsOn
/vpP9Y/rzYDk45WYVdiqf+Xv95ZP9f8AgMxc/NthyTXKGbsVdirsVePf85C/mZd+W9Ii0TSJxHqm
qKyyypQyQwinJga1RmrQbd6g7ZlabDxGy05Z0HgfkPyNr3m3VPqWlxepIBzuLiQkRRKT9qR6Hqe3
U5tpZI443JxBEyNB7VZ/84ykW/8ApOvhbgjpFbckU/NpFLfcMx/5VrlH7W38p5sM89/lHr/lOH63
KyX2lkhTeQgjgTsBKhrxr2NSPeuZ2m1sMu3KTRlwyhv0Tj8j/wAwbnR9ai8tX8/+4i+ZvqxkO0Mx
BPFSSOKyH/hvmTmL2jpQRxjm26bLvRfR2aNznYq7FXYq7FXYq7FXlv5+fmRL5S8uR2Wntx1jVuSW
770jjX+8k6UNKgAV6ncEVGZOmxcR8mrLOg8P/Lf8ptc892t7qVtfwRvBNxuGujIXd5BzL8lV6171
zZT1EcVAhxo4zNlll/zj35wk1a4smlt4rS24A6gxf05CyB6RLx5tx5UJ2Fe+T/lHGIg733Mfy0iV
vmr8ivM+h6bJqEUkOpW0Cl7hYOSyIo6twYfEoHWhr7ZZh7QxzPCdixnp5RF80T+SP5hXWja1F5bv
pS+k6g/G1Lkn0Zz0Vd9lkO1Kfa+ZOU9oaUEcY5s9Pl3ovo/NG57sVdirsVdirsVdirDp/wC+k/1j
+vNgOTjlZhV2Kp/5e/3lk/1/4DMXPzbYcmHa9+Y+raf5i8xWMLWQk0Oze407y/IjnUtXZbE3XqWb
etHSNJP3bBYJD8DdDTKGbz/zB+dHnC88gag73GnaQ91Zav8AVteikjZZXtbSF4rW1+pX92Le+d7m
QpynYgRcuFSVRVJL7zN56mv9Zt7XX7mGeS5+qzAz3UskcU2t2NnCJrZZoRYH0p2Fu8BDXEXJyyvR
gq9X8gah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fupXd5+
ampxXD8/qIjtoTSlI+PqqtB4erT8c22lAEQ4eU7vfP8AnHbSbWz/AC0tL2JR6+pzTzTv3PpytAor
4ARfjmJrZE5K7m7APSxD81fzU81aL+YxstOuTDYaV6HO0AHCcyRrM/qbVNVk4+1KjfM3SaSE8Vkb
lozZpCe3R7jqen2uq6Xc2FyvO2vImikUj9l1pWh7jNTCRjIEcw5khYp8VNezWF3DeQtxuLSVJomB
rR42DKQR7jOqzAGNOphsX2zYPI9jbvI3ORokLuQAWYqKmgoN/bOUPN2wV8CXYq7FXYq7FXYq+QP+
citYXUfzMnjQMkdlClvxNBV0Zg77E9dhXwAza6WNRcTKbL1H/nFn/lHdZ/5io/8Ak3lXaHMe5lp+
RTn85PzT1zyjqGn6fpEUPqTxm5nmnUuCvMoqKAVp9k8j8qYdFpI5ATJc+YxIAZ75R19PMXlnT9Y9
MR/XYQ8kXUK4qrqK9QGBpmHmx8EzHuboS4gC+U/zAtk0LztqkNgfSFletJa8duFG9RAP9XbOixy4
8QJ6h10hwzNPr2wfnY271J5RI1WqW3UHevfOZPN2YV8CXYq7FXYq7FXYqw6f++k/1j+vNgOTjlZh
V2Kp/wCXv95ZP9f+AzFz822HJNcoZuxV2KuxV8n/APOTXlk6Z54i1eFKW2qQhpG5cj66Ehq9eIYU
4/I06ZstLO413OLmjuz3/nGj8wdNn0H/AAjeTrDqFpI8mno5p60MpLsqV6ujliR4H2OV6zEb4gyw
y2pmXm78mtD8y+a4NfuLmSGnpi+tFRWWf0tl+In4aqAp2Ow7YMOtljhwgJngEpWmv5lee9O8o+XL
i5lmUalNGyabbVHN5SKBuPXghNWP0dSMq02A5JV06s8uThD5Q8q6VN5h81abpMUfrCedTMlVFYkP
KQVYhalRQVO5oM3mpy1ElwMULL7XtoFt7eKBSzLEiorMasQopUnxznCbdmqYFdirsVdirsVdir5Z
/wCcpPL89p5ws9bVALW/txEStT+9hJJLdgWDbD2JzY6SXppxsw3Zp/zinJz8ua37Xcf/ACbyGuNk
JwDYs2/Mn8p7LztcWV0181hdWimJnEYlDxE8uNCyUINaGvfpkdLqziBFXbLLh42S2kGjeUvLEULz
C30vSbcK88p/ZQbs3+Ux8O52zHkZZJ31LYAIjyD5H1C4ufPHn+RbdH56zfMyogLOkLMSTReRPpxC
poO2b6Uhjx13B14HFJ9l2sTQ20MLMGaNFRmAoCVFKgb0zni7JUwK7FXYq7FXYq7FXx5rf/OQfny1
1m/to47H04LmaNKwuTxRyor+89s28cYoOIZG0H/0MZ+YH++7D/kS/wD1UyXhBHEXf9DGfmB/vuw/
5Ev/ANVMfCC8Re9/849eeda84eWdSvtWWFZre99CMQIUXj6SNuCzb1bMDVxqQb8RsPVMxW12KuxV
2Ksc8/8AkfTPOfl2bRr+qBj6lvMAC0cqghXFfCvb5dKjLMeQxNhjKNh8d+b/ACB5u8lX9NQtpUgV
62+oRhvSajEKeY+y1VO30io3zaY8olycSUCERafm7+YdvbC2j8w3wiAoA0zMwA7Bmqw+/J+Hj7gj
il3oCzXzX5u1b0rVLrWNTmIDuzNK+54gySOfhFT1Y0yZyxiO4MREkvp78l/ykTydZHU9RYS69eJS
UgUWKM7+mtQG/wBb9W22r1GoMzXRy8ePheoZitrsVdirsVdirsVdirHPP3kjTfOflybRr8lAx9SC
YAFo5VB4uKjtXt8ulRlmPIYm2Mo2GFfkD5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26jI
JUQwxRItjP8AzkB+YHmvyn5z039BajJZibTw0sYCyRsRNIKmOQOhPvTL9JCMoniF7sM0iDs8h1fz
5+YPne4jsbu8udUkJrHZQoFSo/a9KFUTYftEbZmREMe4FNBMpc3vn5J/k3P5Y5a15gjjfWZkAih2
cW6mjUUg8eVR8Rp1Hw7Cra/U6nj2HJycWKub2DMNudirsVdirsVdirsVfnh5m/5SPVf+Yy4/5Otm
7jyDhHmluSQ7FX1Z/wA4jf8AKFaz/wBtI/8AJiPNdrPqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9
dXedVVDYtCJUaIrsoW4VuZcfLMNuYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWst
wl2PShcr25MrHiFV11+cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufze
tLe80HSpH0Y6vrUX1ssNYQaets05hiaC7kgR7mSanwRpBuQwqAORVeiYqpz21vcJ6c8Sypv8LqGG
4Knr7EjEFWMn8q/y3Jq3lrT2buzW6MSfEkipPzyzxp97HgHcnekaBouj262+l2UNnCteKRIFA5Uq
B4DbpkZSJ5pAAR+RS7FXYq7FXYq7FXYq7FXYqteJHFGG9COQJDAHrRhQj6MVYx5o/LPyh5o1C0vt
ZtPrM9mOCcjUMnLlwflU8a16U6nLIZZRFBjKAKZ6J5R8saEGGj6Zb2Afjy9CMJUqCAdu+/XqcjKZ
PMpEQE2yKXYq7FXYq7FXYq7FXYq/PDzN/wApHqv/ADGXH/J1s3ceQcI80tySHYq+rP8AnEb/AJQr
Wf8AtpH/AJMR5rtZ9Q9zkYeT13VvKekatrNnql+hnaztL2wFo4R7eWDUfR9dZo2Vue1soArShNQe
2G3MVuPyQ8qJcSS6LcXHl2OW/j1OS10qHTo7dp4II4IA0M1pOjJCYmljUigld3+1x4qpvL5AaXVp
9YfzBqZ1UwyWtheUsOVlBPNHPLHAv1TgwcwIv79ZCF6UqcVSib8kvLElo1ql9fwxXVvJaazwa3rq
EM11LeSJccoG4cp7mVq2/pEcqCgAoq9CxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KvkXWv+cafzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxjiKC/6Ff8AzW/5
Z7P/AKSV/ph/NwR4Rd/0K/8Amt/yz2f/AEkr/TH83BfCL3f8gPy+8x+SPLWo6frqRJcXN59YiEMg
kHD0kTcj3U5h6nIJmw3Y4kDd6hmO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2
KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDHUrEEgzKCNiMHEGzwpdzv0nYf7/XHiC+DLud+k
7D/f648QXwZdyrDcQzKWicOAaEjxxBYyiRzVMLF2KuxV2KqdxcQ20DzzuI4YwWdz0AGKCaeQeav+
cjdJsbyWz8v2Y1Vo2Km7LlIDt1U0JajV6bEbhsBLg5tfGPLdiMH5+fmCzDlHZmIdQIiHI/1uXH/h
cjxOCe1JBn3lP8+NJ1K5W01u2/Rc0jBY5g3OCpIFGc049SakUphEnLwdpQmaOz1JWVlDKaqdwRkn
ZN4q7FXYq7FXYq7FXYq7FXYqhr/UtP0+3a4vriO2hQFmeRgoABAJ3+YwgWgyA5pEfzN8gCX0/wBO
2paoFVeq7/5QHH8cn4Uu5q/MY+8J1pus6TqcQm067iuojUB4nDA8aA9PCoyBiRzbIzEuRRmBk7FX
Yq7FXYq7FXYqxCf++k/1j+vKC7WPJZiydiqfeX/95pP9f+AyyHJwdV9QTTJuM7FXYq7FXzr/AM5E
/mHcz6n/AIP0+Qx28IDamylgXZqFYiCF/wBY9ailD1rEl1utzfwhg/kLyHrfmi7NtpkIKR0NxcyE
rFED05MAetNgBXBTq4YZ5ZVF69af848IsI+s63SWm6x2/wAIPzaSp+4YeFyx2P3y+x5z5x8sxaBr
1zo31kXbWwTlME9PeRA4HHk/Zh3yJdTqcPhZDG7p6J+R/ni6eZvK2oTc0iQvp0jncKCAYuRI2X9k
UP0AZKJdz2ZqjIcBezZJ3DsVdirsVdirsVdirsVYl+ZPn6x8naE125WS/mPp2dqGHN2IPxUo3wim
5O3zNFNmOHEWnNlEA+c3vfNXnzzBH9clN1e3clLe2DCOFCRQBFY8VoopU7mm5OZ8YCIt0+TJLJKu
pZte/k1qmj+X7nVtRuYENsqt9Wi5SMeTBaMxCgfa7VxhqIykAAjLopxgZSPJjOny3+mXK3mmXD21
whBDodjxNQGU/CwqOhGZMsYkN3Bx55QNgvdfy58/p5ltHt7wpDq9vT1YgacwannGD22+Y79idVnw
8B8nodJqhlHmzTKHMdirsVdirsVdirEJ/wC+k/1j+vKC7WPJZiydiqfeX/8AeaT/AF/4DLIcnB1X
1B5r5t8m+c9Y/MTXrzTAHi/R2mWdu18/1SEWk8l0dQisr2O0upopmEUatwP2ZKtuIuM3GS3yTqP5
m6f5Ut9Pntb+x1bS/LtsnlrQ47NpLC7ki0oEG/u5LTlBcLcKVMDTRUYBfjryKqL8k+Y/zPutXtIf
NFzqNtprFW0+a00ydjczmQB7XU5JtKt2t40FKSpBEpVv7xipOKp/+T+sfmRqSam/nRTFKogKWskE
0LQXBMnrxxu1lZQyQiicPTknpvWVuQoq+ZfOFxNP551ySZ2kcX1wnNyWbjHIUWpO5oqjIF0OfmX1
R+S+kWun/l5pjwqPVvVa6uJAN2d2IFf9VAFyQdnooCOMebAPzL/NXzZaearvS9JufqFpYMIvgRGe
RqAszM6t3OwGRJdbrNdkGQxiaAeb3+sX+q6jPqF/L613cENNLQLyIAHRQANh2GB1OWZmeI8yivKe
qy6b5x0m9gAMsU2ynoQylSD9BxDkaGRjkBfWuWPVuxV2KuxV2KuxV2KuxV8rfnpr1xqn5i3Fk7Vt
9KVbeFFYsvJlDu1D0Y1CtT+XM3BGg6nVzuXuZf8AkDo2h3N3eXl8im+s2t205mkZCGcS8+KhlD/Z
HUHJamRAAHJjoYxlIk8xVfa9u1ix02+02e01MK1jKAJwzmMUDAirKVI3A75hQkQbHN2uSMZRIlye
CefbHRdM8zPZ6OqrYiKNlCSNKOTA8viZnP45ttPOUo+rm83rcUIzqHJLfKurzaR5t0y8hbiHmSCY
FiqmOVgp5EdgSG+jHURuJXRZDHIH0zmnendirsVdirsVdirEJ/76T/WP68oLtY8lmLJ2Kp95f/3m
k/1/4DLIcnB1X1BNMm4zsVdirsVfGv5weXJvL35g6jGwYwXchu4JGIJYS/E5bjsDzqaeFNhkC6bU
46kXuH/OP3nzTtT8sQ+XZ5lTVdN5LFExo0sBYurJXrwrxIHQAZIOXosoMeE8wyPzd+UflnzLqR1K
d57S9cATvbsvGTiKAsrq3xUAFRiQuo0EMsuI2C8G/MLQ7Tyx5rvdItWdra3ERheUguVeJXqxAUdS
e2QIdHqtPwZDEckX+TOiz675+tZxGJLPSwbi5LAlNwVRSQDuSaivWmEOX2fhud9z6lybv3Yq7FXY
q7FXYq7FXYq+QvzgtpLT8zta514yzLKjEUqrop2r4Go+jM7EfSHUakesp1+U06v5w0da7+uD/wAK
cvyH92XEwD99H3vfPzNUnyJq4AqfTQ7eAlUnMDT/AFh3Gt/upPnBCFNTm4eZKppxa78waZaxk8pb
qFagFqD1BVqDwG+U5pekuTpoXMe99ZZp3p3Yq7FXYq7FXYq+DfMPnrztHr+pxx+YdTSNLudURby4
AAEjAAAP0GYpL0cIDhGyX/4+89f9THqn/Sbcf814LZcA7nf4+89f9THqn/Sbcf8ANeNrwDufTP8A
zizrOsar5Q1abVL64v5k1Aokl1K8zKvoRniC5YgVOXYuTqe0ABIe57TlrgOxV2KuxVhP5p/lrY+d
9FELMYdStAz2FwADRj1U1ps1PEfgKAhpz4RMeb5S1/yt5q8o6iYdStpLZ4XAjukr6bNQMpSQd+JD
UNGHcDIuoyYjE7o+D81fPsUaxrr9/wAVFBWeQ7fMknFHiZP5xV9B8v8Anrz7qfK2S4vXkYLcandM
7RoNh8czciaV6Cp9saWGCWQ976k/L3yBpXkzRUsbX99dv8V5esAHkkNK+PFdtl/Wd8kA7jDhEBQZ
ThbnYq7FXYq7FXYq7FXYq8b/AOcgfy6uNYtIvMemI0t/ZKIp7dQzNJDUn4dyKoei0FanqxAy/DOt
nD1WK9w8J8q+ZJtE1qx1JBzaznjm9M7BgjAlfpG2ZZ3FOtG0ge59X6X+Z35favp6zjWbOFJVpJbX
kscEi1G6skpWvhtUZgnHIHk7iOeEhzDwb81td0WXzhdto8sEtgEhWN7biYqiNQ3Hh8PXwzPwyIju
6fVQichMeTLfyI8j3dzfjzXqKNFDCKabGwYFy4IMtRx2psOtQTUUKk4+oy3s5ei09eovd8xHZuxV
2KuxV2KuxV+ePmX/AJSPVf8AmMuP+TrZiHm9LD6QluBk7FX1X/ziN/yhWs/9tI/8mI8vxcnUdo/W
Pcyfzh501vyv5rv77VJNQXQYrOaTRLO2XT3sry4tNPmvJ4Z24SahHJxiLJQqnw9d6G116Rr5685D
ytLPPqV5Z+ZbK/0KfVLO5tdO9A2esXkdsIrQ27XIELgyUMkjTDjvxqMVTtfO/mXU/wA1p/LURvNI
0uTTtSgsTNpk/wAV5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WItNn
uYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWVndoUuoEmQqUIdQ3wtTkN/GmKCAWPD8sfy+
Dcx5fshJ/v0RASV8eY+KvvXGmvwYdzJIbeCBeEMaxJt8KKFGwoNh7DFtpfirsVdirsVdirsVdirs
VdirTojoyOoZGBVlYVBB2IIOKvNfPH5E+V/MlzNqFsW03Upas8kIHpu5pu6Up4kkbknrlsMxDjZN
NGW/Vgp/5xf1kS0TX4DD/OYHDU/1eRH/AA2W/mPJo/JHvZZ5R/5x58uaTPHd6vcNq1zE1VjdQtvU
EFSY969CCGJG+QlnJ5NuPSRHPd6vHFHEgSNQiCpCqKCpNT08TlDl0uxV2KuxV2KuxV2Kvzx8y/8A
KR6r/wAxlx/ydbMQ83pYfSEtwMnYq+q/+cRv+UK1n/tpH/kxHl+Lk6jtH6x7nsg8teXBq8utDSrM
axcJ6U+pC3i+syR8QvB5uPqMvFQKE9MtdepWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS
6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q
Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq+eNT/5xH+vald3v+K/T+tTSTen+j+XH1GLUr9ZFaV8MqOLzdlHtGhXD9v7
EN/0J3/393/cu/7OsHhebL+Uv6P2/sd/0J3/AN/d/wBy7/s6x8LzX+Uv6P2/serflH+V/wDyrzRb
zTP0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnD1GfxDdUzrJOO7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXhPnm
HT9e/MDzVY+ZdTf6toltZyeXtEku0sYJmlg5TSBnHFnR2O/U1pWg2iXXZwJSkD05C6Zp+RfmDXNd
8iJdau0kzxXMsFpdzcjJPAgUh2difUIdnTkP5aHcHCG7RzlKHqehYXLdirsVdirsVdirsVdirsVd
irHfOHnax8tCxga2mv8AVNVkaDTNPtwOUsigfadiFRAzKGbcitaHfLMePi8gGjNnEKFWTyW+U/O1
pr011YTW0mm61Yn/AEzTZypdRWnONl2kSu3Knh4issuEwo84nqw0+qGQmPKQ5hkmUuU7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt1Xyx5a1eVJdW0my1CWNeEcl3bxTsq1rRTIrECuLGU
InmEdb29vbW8VtbRJDbwoscMMahEREFFVVFAAAKADFIFKmKXYq7FXYq7FXYq7FXYq7FXYqwf8yfJ
uta3d6DrOiSxDUvL1y1zHbTs0aTIxR2TmoahJhC77UJqcvw5AAQeri6nDKRjKPOKn5F8k6rZeZNV
82ayfq99qi+nDpaTG5W3ico7iSYqvNuaAKF+FR3NdpZs1xERyDDTabhmch2MunNnmYzmuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q==</xmpGImg:image> </rdf:li> </rdf:Alt> - </xap:Thumbnails> + </xmp:Thumbnails> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"> - <xapMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xapMM:DocumentID> - <xapMM:InstanceID>uuid:bce40ba9-528e-1a48-b1a0-2636e427f460</xapMM:InstanceID> - <xapMM:DerivedFrom rdf:parseType="Resource"> + <xmpMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:c9fc39ea-7338-234e-90fd-9c707322e008</xmpMM:InstanceID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> <stRef:instanceID>uuid:1052650b-0efc-4cb2-a32e-387095575b05</stRef:instanceID> <stRef:documentID>uuid:6120892493BFDB11914A8590D31508C8</stRef:documentID> - </xapMM:DerivedFrom> + </xmpMM:DerivedFrom> </rdf:Description> <rdf:Description rdf:about="" xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> @@ -46,517 +47,517 @@ <illustrator:StartupProfile>Print</illustrator:StartupProfile> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#" - xmlns:xapG="http://ns.adobe.com/xap/1.0/g/"> - <xapTPg:NPages>1</xapTPg:NPages> - <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency> - <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint> - <xapTPg:MaxPageSize rdf:parseType="Resource"> - <stDim:w>841.889771</stDim:w> - <stDim:h>595.275574</stDim:h> + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>841.889648</stDim:w> + <stDim:h>595.275391</stDim:h> <stDim:unit>Pixels</stDim:unit> - </xapTPg:MaxPageSize> - <xapTPg:Fonts> + </xmpTPg:MaxPageSize> + <xmpTPg:Fonts> <rdf:Bag> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>MyriadPro-Regular</stFnt:fontName> <stFnt:fontFamily>Myriad Pro</stFnt:fontFamily> <stFnt:fontFace>Regular</stFnt:fontFace> <stFnt:fontType>Open Type</stFnt:fontType> - <stFnt:versionString>Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032</stFnt:versionString> + <stFnt:versionString>Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895</stFnt:versionString> <stFnt:composite>False</stFnt:composite> <stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName> </rdf:li> </rdf:Bag> - </xapTPg:Fonts> - <xapTPg:PlateNames> + </xmpTPg:Fonts> + <xmpTPg:PlateNames> <rdf:Seq> <rdf:li>Cyan</rdf:li> <rdf:li>Magenta</rdf:li> <rdf:li>Yellow</rdf:li> <rdf:li>Black</rdf:li> </rdf:Seq> - </xapTPg:PlateNames> - <xapTPg:SwatchGroups> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Default Swatch Group</xapG:groupName> - <xapG:groupType>0</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>White</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>255</xapG:red> - <xapG:green>255</xapG:green> - <xapG:blue>255</xapG:blue> + <xmpG:swatchName>White</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>Black</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>35</xapG:red> - <xapG:green>31</xapG:green> - <xapG:blue>32</xapG:blue> + <xmpG:swatchName>Black</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>35</xmpG:red> + <xmpG:green>31</xmpG:green> + <xmpG:blue>32</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Red</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>28</xapG:green> - <xapG:blue>36</xapG:blue> + <xmpG:swatchName>CMYK Red</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>36</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Yellow</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>255</xapG:red> - <xapG:green>241</xapG:green> - <xapG:blue>0</xapG:blue> + <xmpG:swatchName>CMYK Yellow</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>241</xmpG:green> + <xmpG:blue>0</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Green</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>165</xapG:green> - <xapG:blue>81</xapG:blue> + <xmpG:swatchName>CMYK Green</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>165</xmpG:green> + <xmpG:blue>81</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Cyan</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>173</xapG:green> - <xapG:blue>238</xapG:blue> + <xmpG:swatchName>CMYK Cyan</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>173</xmpG:green> + <xmpG:blue>238</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Blue</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>46</xapG:red> - <xapG:green>49</xapG:green> - <xapG:blue>145</xapG:blue> + <xmpG:swatchName>CMYK Blue</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>145</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Magenta</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>235</xapG:red> - <xapG:green>0</xapG:green> - <xapG:blue>139</xapG:blue> + <xmpG:swatchName>CMYK Magenta</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>235</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>139</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=16 M=98 Y=92 K=7</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>194</xapG:red> - <xapG:green>39</xapG:green> - <xapG:blue>45</xapG:blue> + <xmpG:swatchName>C=16 M=98 Y=92 K=7</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>194</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>45</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=99 Y=97 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>32</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=0 M=99 Y=97 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>32</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=79 Y=96 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>240</xapG:red> - <xapG:green>92</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=0 M=79 Y=96 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>240</xmpG:red> + <xmpG:green>92</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=50 Y=98 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>246</xapG:red> - <xapG:green>146</xapG:green> - <xapG:blue>33</xapG:blue> + <xmpG:swatchName>C=0 M=50 Y=98 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>246</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>33</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=35 Y=87 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>250</xapG:red> - <xapG:green>175</xapG:green> - <xapG:blue>59</xapG:blue> + <xmpG:swatchName>C=0 M=35 Y=87 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>250</xmpG:red> + <xmpG:green>175</xmpG:green> + <xmpG:blue>59</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=5 M=0 Y=93 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>249</xapG:red> - <xapG:green>236</xapG:green> - <xapG:blue>35</xapG:blue> + <xmpG:swatchName>C=5 M=0 Y=93 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>249</xmpG:red> + <xmpG:green>236</xmpG:green> + <xmpG:blue>35</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=19 M=0 Y=98 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>216</xapG:red> - <xapG:green>223</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=19 M=0 Y=98 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>216</xmpG:red> + <xmpG:green>223</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=50 M=0 Y=99 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>139</xapG:red> - <xapG:green>197</xapG:green> - <xapG:blue>64</xapG:blue> + <xmpG:swatchName>C=50 M=0 Y=99 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>139</xmpG:red> + <xmpG:green>197</xmpG:green> + <xmpG:blue>64</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=74 M=0 Y=99 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>61</xapG:red> - <xapG:green>180</xapG:green> - <xapG:blue>74</xapG:blue> + <xmpG:swatchName>C=74 M=0 Y=99 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>61</xmpG:red> + <xmpG:green>180</xmpG:green> + <xmpG:blue>74</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=86 M=12 Y=100 K=9</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>146</xapG:green> - <xapG:blue>69</xapG:blue> + <xmpG:swatchName>C=86 M=12 Y=100 K=9</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>69</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=88 M=28 Y=95 K=32</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>104</xapG:green> - <xapG:blue>55</xapG:blue> + <xmpG:swatchName>C=88 M=28 Y=95 K=32</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>104</xmpG:green> + <xmpG:blue>55</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=76 M=0 Y=75 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>34</xapG:red> - <xapG:green>180</xapG:green> - <xapG:blue>115</xapG:blue> + <xmpG:swatchName>C=76 M=0 Y=75 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>34</xmpG:red> + <xmpG:green>180</xmpG:green> + <xmpG:blue>115</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=78 M=9 Y=46 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>3</xapG:red> - <xapG:green>168</xapG:green> - <xapG:blue>156</xapG:blue> + <xmpG:swatchName>C=78 M=9 Y=46 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>3</xmpG:red> + <xmpG:green>168</xmpG:green> + <xmpG:blue>156</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=70 M=15 Y=0 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>37</xapG:red> - <xapG:green>169</xapG:green> - <xapG:blue>224</xapG:blue> + <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>37</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>224</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=87 M=52 Y=0 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>16</xapG:red> - <xapG:green>114</xapG:green> - <xapG:blue>185</xapG:blue> + <xmpG:swatchName>C=87 M=52 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>16</xmpG:red> + <xmpG:green>114</xmpG:green> + <xmpG:blue>185</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=99 M=96 Y=4 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>46</xapG:red> - <xapG:green>55</xapG:green> - <xapG:blue>143</xapG:blue> + <xmpG:swatchName>C=99 M=96 Y=4 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>55</xmpG:green> + <xmpG:blue>143</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=100 M=100 Y=26 K=25</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>38</xapG:red> - <xapG:green>34</xapG:green> - <xapG:blue>97</xapG:blue> + <xmpG:swatchName>C=100 M=100 Y=26 K=25</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>38</xmpG:red> + <xmpG:green>34</xmpG:green> + <xmpG:blue>97</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=74 M=98 Y=1 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>103</xapG:red> - <xapG:green>48</xapG:green> - <xapG:blue>144</xapG:blue> + <xmpG:swatchName>C=74 M=98 Y=1 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>103</xmpG:red> + <xmpG:green>48</xmpG:green> + <xmpG:blue>144</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=49 M=99 Y=1 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>146</xapG:red> - <xapG:green>41</xapG:green> - <xapG:blue>141</xapG:blue> + <xmpG:swatchName>C=49 M=99 Y=1 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>146</xmpG:red> + <xmpG:green>41</xmpG:green> + <xmpG:blue>141</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=34 M=100 Y=37 K=11</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>157</xapG:red> - <xapG:green>30</xapG:green> - <xapG:blue>96</xapG:blue> + <xmpG:swatchName>C=34 M=100 Y=37 K=11</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>157</xmpG:red> + <xmpG:green>30</xmpG:green> + <xmpG:blue>96</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=12 M=100 Y=49 K=1</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>211</xapG:red> - <xapG:green>28</xapG:green> - <xapG:blue>92</xapG:blue> + <xmpG:swatchName>C=12 M=100 Y=49 K=1</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>211</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>92</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=96 Y=20 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>37</xapG:green> - <xapG:blue>122</xapG:blue> + <xmpG:swatchName>C=0 M=96 Y=20 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>37</xmpG:green> + <xmpG:blue>122</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=23 M=27 Y=40 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>198</xapG:red> - <xapG:green>178</xapG:green> - <xapG:blue>152</xapG:blue> + <xmpG:swatchName>C=23 M=27 Y=40 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>198</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>152</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=40 M=43 Y=52 K=7</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>152</xapG:red> - <xapG:green>133</xapG:green> - <xapG:blue>118</xapG:blue> + <xmpG:swatchName>C=40 M=43 Y=52 K=7</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>152</xmpG:red> + <xmpG:green>133</xmpG:green> + <xmpG:blue>118</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=50 M=53 Y=61 K=23</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>117</xapG:red> - <xapG:green>101</xapG:green> - <xapG:blue>88</xapG:blue> + <xmpG:swatchName>C=50 M=53 Y=61 K=23</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>101</xmpG:green> + <xmpG:blue>88</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=57 M=60 Y=64 K=42</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>85</xapG:red> - <xapG:green>72</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=57 M=60 Y=64 K=42</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>85</xmpG:red> + <xmpG:green>72</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=23 M=38 Y=63 K=1</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>197</xapG:red> - <xapG:green>156</xapG:green> - <xapG:blue>110</xapG:blue> + <xmpG:swatchName>C=23 M=38 Y=63 K=1</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>197</xmpG:red> + <xmpG:green>156</xmpG:green> + <xmpG:blue>110</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=32 M=49 Y=74 K=10</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>165</xapG:red> - <xapG:green>124</xapG:green> - <xapG:blue>82</xapG:blue> + <xmpG:swatchName>C=32 M=49 Y=74 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>165</xmpG:red> + <xmpG:green>124</xmpG:green> + <xmpG:blue>82</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=36 M=57 Y=84 K=23</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>139</xapG:red> - <xapG:green>99</xapG:green> - <xapG:blue>57</xapG:blue> + <xmpG:swatchName>C=36 M=57 Y=84 K=23</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>139</xmpG:red> + <xmpG:green>99</xmpG:green> + <xmpG:blue>57</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=39 M=64 Y=93 K=36</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>117</xapG:red> - <xapG:green>77</xapG:green> - <xapG:blue>36</xapG:blue> + <xmpG:swatchName>C=39 M=64 Y=93 K=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>77</xmpG:green> + <xmpG:blue>36</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=41 M=70 Y=96 K=49</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>97</xapG:red> - <xapG:green>57</xapG:green> - <xapG:blue>23</xapG:blue> + <xmpG:swatchName>C=41 M=70 Y=96 K=49</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>97</xmpG:red> + <xmpG:green>57</xmpG:green> + <xmpG:blue>23</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=47 M=73 Y=83 K=68</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>65</xapG:red> - <xapG:green>35</xapG:green> - <xapG:blue>18</xapG:blue> + <xmpG:swatchName>C=47 M=73 Y=83 K=68</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>65</xmpG:red> + <xmpG:green>35</xmpG:green> + <xmpG:blue>18</xmpG:blue> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Print Color Group</xapG:groupName> - <xapG:groupType>1</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Print Color Group</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=2 M=28 Y=72 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>246</xapG:red> - <xapG:green>187</xapG:green> - <xapG:blue>96</xapG:blue> + <xmpG:swatchName>C=2 M=28 Y=72 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>246</xmpG:red> + <xmpG:green>187</xmpG:green> + <xmpG:blue>96</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=5 M=70 Y=90 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>231</xapG:red> - <xapG:green>110</xapG:green> - <xapG:blue>52</xapG:blue> + <xmpG:swatchName>C=5 M=70 Y=90 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>231</xmpG:red> + <xmpG:green>110</xmpG:green> + <xmpG:blue>52</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=4 M=92 Y=77 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>229</xapG:red> - <xapG:green>59</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=4 M=92 Y=77 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>229</xmpG:red> + <xmpG:green>59</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=29 M=2 Y=92 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>191</xapG:red> - <xapG:green>210</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=29 M=2 Y=92 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>191</xmpG:red> + <xmpG:green>210</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=62 M=4 Y=93 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>109</xapG:red> - <xapG:green>182</xapG:green> - <xapG:blue>78</xapG:blue> + <xmpG:swatchName>C=62 M=4 Y=93 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>109</xmpG:red> + <xmpG:green>182</xmpG:green> + <xmpG:blue>78</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=30 M=2 Y=7 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>174</xapG:red> - <xapG:green>218</xapG:green> - <xapG:blue>230</xapG:blue> + <xmpG:swatchName>C=30 M=2 Y=7 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>174</xmpG:red> + <xmpG:green>218</xmpG:green> + <xmpG:blue>230</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=60 M=8 Y=5 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>85</xapG:red> - <xapG:green>185</xapG:green> - <xapG:blue>223</xapG:blue> + <xmpG:swatchName>C=60 M=8 Y=5 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>85</xmpG:red> + <xmpG:green>185</xmpG:green> + <xmpG:blue>223</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=78 M=4 Y=11 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>178</xapG:green> - <xapG:blue>215</xapG:blue> + <xmpG:swatchName>C=78 M=4 Y=11 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>215</xmpG:blue> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Grayscale</xapG:groupName> - <xapG:groupType>1</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Grayscale</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=100</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>255</xapG:gray> + <xmpG:swatchName>K=100</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>255</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=90</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>229</xapG:gray> + <xmpG:swatchName>K=90</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>229</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=80</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>203</xapG:gray> + <xmpG:swatchName>K=80</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>203</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=70</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>178</xapG:gray> + <xmpG:swatchName>K=70</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>178</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=60</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>152</xapG:gray> + <xmpG:swatchName>K=60</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>152</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=50</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>127</xapG:gray> + <xmpG:swatchName>K=50</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>127</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=40</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>101</xapG:gray> + <xmpG:swatchName>K=40</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>101</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=30</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>76</xapG:gray> + <xmpG:swatchName>K=30</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>76</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=20</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>50</xapG:gray> + <xmpG:swatchName>K=20</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>50</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=10</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>25</xapG:gray> + <xmpG:swatchName>K=10</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>25</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=5</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>12</xapG:gray> + <xmpG:swatchName>K=5</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>12</xmpG:gray> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> </rdf:Seq> - </xapTPg:SwatchGroups> + </xmpTPg:SwatchGroups> </rdf:Description> </rdf:RDF> </x:xmpmeta> @@ -581,38 +582,26 @@ -<?xpacket end="w"?>
endstream
endobj
2 0 obj
<</Count 1/Type/Pages/Kids[5 0 R]>>
endobj
15 0 obj
<</Intent 16 0 R/Usage 17 0 R/Name(Class)/Type/OCG>>
endobj
27 0 obj
<</Intent 28 0 R/Usage 29 0 R/Name(Package)/Type/OCG>>
endobj
37 0 obj
<</Intent 38 0 R/Usage 39 0 R/Name(Object)/Type/OCG>>
endobj
65 0 obj
<</Intent 66 0 R/Usage 67 0 R/Name(Class)/Type/OCG>>
endobj
78 0 obj
<</Intent 79 0 R/Usage 80 0 R/Name(Package)/Type/OCG>>
endobj
90 0 obj
<</Intent 91 0 R/Usage 92 0 R/Name(Object)/Type/OCG>>
endobj
116 0 obj
<</Intent 117 0 R/Usage 118 0 R/Name(Class)/Type/OCG>>
endobj
129 0 obj
<</Intent 130 0 R/Usage 131 0 R/Name(Package)/Type/OCG>>
endobj
141 0 obj
<</Intent 142 0 R/Usage 143 0 R/Name(Object)/Type/OCG>>
endobj
167 0 obj
<</Intent 168 0 R/Usage 169 0 R/Name(Class)/Type/OCG>>
endobj
180 0 obj
<</Intent 181 0 R/Usage 182 0 R/Name(Package)/Type/OCG>>
endobj
192 0 obj
<</Intent 193 0 R/Usage 194 0 R/Name(Object)/Type/OCG>>
endobj
218 0 obj
<</Intent 219 0 R/Usage 220 0 R/Name(Class)/Type/OCG>>
endobj
237 0 obj
<</Intent 238 0 R/Usage 239 0 R/Name(Package)/Type/OCG>>
endobj
255 0 obj
<</Intent 256 0 R/Usage 257 0 R/Name(Object)/Type/OCG>>
endobj
287 0 obj
<</Intent 288 0 R/Usage 289 0 R/Name(Class)/Type/OCG>>
endobj
306 0 obj
<</Intent 307 0 R/Usage 308 0 R/Name(Package)/Type/OCG>>
endobj
324 0 obj
<</Intent 325 0 R/Usage 326 0 R/Name(Object)/Type/OCG>>
endobj
356 0 obj
<</Intent 357 0 R/Usage 358 0 R/Name(Class)/Type/OCG>>
endobj
375 0 obj
<</Intent 376 0 R/Usage 377 0 R/Name(Package)/Type/OCG>>
endobj
393 0 obj
<</Intent 394 0 R/Usage 395 0 R/Name(Object)/Type/OCG>>
endobj
425 0 obj
<</Intent 426 0 R/Usage 427 0 R/Name(Class)/Type/OCG>>
endobj
444 0 obj
<</Intent 445 0 R/Usage 446 0 R/Name(Trait)/Type/OCG>>
endobj
462 0 obj
<</Intent 463 0 R/Usage 464 0 R/Name(Package)/Type/OCG>>
endobj
480 0 obj
<</Intent 481 0 R/Usage 482 0 R/Name(Object)/Type/OCG>>
endobj
515 0 obj
<</Intent 516 0 R/Usage 517 0 R/Name(Class)/Type/OCG>>
endobj
534 0 obj
<</Intent 535 0 R/Usage 536 0 R/Name(Trait)/Type/OCG>>
endobj
552 0 obj
<</Intent 553 0 R/Usage 554 0 R/Name(Package)/Type/OCG>>
endobj
570 0 obj
<</Intent 571 0 R/Usage 572 0 R/Name(Object)/Type/OCG>>
endobj
605 0 obj
<</Intent 606 0 R/Usage 607 0 R/Name(Class)/Type/OCG>>
endobj
624 0 obj
<</Intent 625 0 R/Usage 626 0 R/Name(Trait)/Type/OCG>>
endobj
642 0 obj
<</Intent 643 0 R/Usage 644 0 R/Name(Package)/Type/OCG>>
endobj
660 0 obj
<</Intent 661 0 R/Usage 662 0 R/Name(Object)/Type/OCG>>
endobj
695 0 obj
<</Intent 696 0 R/Usage 697 0 R/Name(Base)/Type/OCG>>
endobj
699 0 obj
<</Intent 700 0 R/Usage 701 0 R/Name(Class)/Type/OCG>>
endobj
718 0 obj
<</Intent 719 0 R/Usage 720 0 R/Name(Trait)/Type/OCG>>
endobj
735 0 obj
<</Intent 736 0 R/Usage 737 0 R/Name(Package)/Type/OCG>>
endobj
753 0 obj
<</Intent 754 0 R/Usage 755 0 R/Name(Object)/Type/OCG>>
endobj
785 0 obj
<</Intent 786 0 R/Usage 787 0 R/Name(Base)/Type/OCG>>
endobj
789 0 obj
<</Intent 790 0 R/Usage 791 0 R/Name(Class)/Type/OCG>>
endobj
808 0 obj
<</Intent 809 0 R/Usage 810 0 R/Name(Trait)/Type/OCG>>
endobj
825 0 obj
<</Intent 826 0 R/Usage 827 0 R/Name(Package)/Type/OCG>>
endobj
843 0 obj
<</Intent 844 0 R/Usage 845 0 R/Name(Object)/Type/OCG>>
endobj
878 0 obj
<</Intent 879 0 R/Usage 880 0 R/Name(Base)/Type/OCG>>
endobj
882 0 obj
<</Intent 883 0 R/Usage 884 0 R/Name(Class)/Type/OCG>>
endobj
901 0 obj
<</Intent 902 0 R/Usage 903 0 R/Name(Trait)/Type/OCG>>
endobj
918 0 obj
<</Intent 919 0 R/Usage 920 0 R/Name(Package)/Type/OCG>>
endobj
936 0 obj
<</Intent 937 0 R/Usage 938 0 R/Name(Object)/Type/OCG>>
endobj
971 0 obj
<</Intent 972 0 R/Usage 973 0 R/Name(Base)/Type/OCG>>
endobj
975 0 obj
<</Intent 976 0 R/Usage 977 0 R/Name(Class)/Type/OCG>>
endobj
994 0 obj
<</Intent 995 0 R/Usage 996 0 R/Name(Trait)/Type/OCG>>
endobj
1011 0 obj
<</Intent 1012 0 R/Usage 1013 0 R/Name(Package)/Type/OCG>>
endobj
1029 0 obj
<</Intent 1030 0 R/Usage 1031 0 R/Name(Object)/Type/OCG>>
endobj
1030 0 obj
[/View/Design]
endobj
1031 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
1012 0 obj
[/View/Design]
endobj
1013 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
995 0 obj
[/View/Design]
endobj
996 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
976 0 obj
[/View/Design]
endobj
977 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
972 0 obj
[/View/Design]
endobj
973 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
937 0 obj
[/View/Design]
endobj
938 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
919 0 obj
[/View/Design]
endobj
920 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
902 0 obj
[/View/Design]
endobj
903 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
883 0 obj
[/View/Design]
endobj
884 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
879 0 obj
[/View/Design]
endobj
880 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
844 0 obj
[/View/Design]
endobj
845 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
826 0 obj
[/View/Design]
endobj
827 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
809 0 obj
[/View/Design]
endobj
810 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
790 0 obj
[/View/Design]
endobj
791 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
786 0 obj
[/View/Design]
endobj
787 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
754 0 obj
[/View/Design]
endobj
755 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
736 0 obj
[/View/Design]
endobj
737 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
719 0 obj
[/View/Design]
endobj
720 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
700 0 obj
[/View/Design]
endobj
701 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
696 0 obj
[/View/Design]
endobj
697 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
661 0 obj
[/View/Design]
endobj
662 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
643 0 obj
[/View/Design]
endobj
644 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
625 0 obj
[/View/Design]
endobj
626 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
606 0 obj
[/View/Design]
endobj
607 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
571 0 obj
[/View/Design]
endobj
572 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
553 0 obj
[/View/Design]
endobj
554 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
535 0 obj
[/View/Design]
endobj
536 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
516 0 obj
[/View/Design]
endobj
517 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
481 0 obj
[/View/Design]
endobj
482 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
463 0 obj
[/View/Design]
endobj
464 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
445 0 obj
[/View/Design]
endobj
446 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
426 0 obj
[/View/Design]
endobj
427 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
394 0 obj
[/View/Design]
endobj
395 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
376 0 obj
[/View/Design]
endobj
377 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
357 0 obj
[/View/Design]
endobj
358 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
325 0 obj
[/View/Design]
endobj
326 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
307 0 obj
[/View/Design]
endobj
308 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
288 0 obj
[/View/Design]
endobj
289 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
256 0 obj
[/View/Design]
endobj
257 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
238 0 obj
[/View/Design]
endobj
239 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
219 0 obj
[/View/Design]
endobj
220 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
193 0 obj
[/View/Design]
endobj
194 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
181 0 obj
[/View/Design]
endobj
182 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
168 0 obj
[/View/Design]
endobj
169 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
142 0 obj
[/View/Design]
endobj
143 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
130 0 obj
[/View/Design]
endobj
131 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
117 0 obj
[/View/Design]
endobj
118 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
91 0 obj
[/View/Design]
endobj
92 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
79 0 obj
[/View/Design]
endobj
80 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
66 0 obj
[/View/Design]
endobj
67 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
38 0 obj
[/View/Design]
endobj
39 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
28 0 obj
[/View/Design]
endobj
29 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
16 0 obj
[/View/Design]
endobj
17 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
970 0 obj
[1029 0 R 1011 0 R 994 0 R 975 0 R 971 0 R]
endobj
5 0 obj
<</CropBox[321.5 204.775 334.5 217.775]/Parent 2 0 R/Contents 1048 0 R/BleedBox[0.0 0.0 841.89 595.276]/PieceInfo<</Illustrator 962 0 R>>/ArtBox[321.5 204.775 334.5 217.775]/MediaBox[0.0 0.0 841.89 595.276]/Thumb 1053 0 R/TrimBox[0.0 0.0 841.89 595.276]/Resources<</XObject<</Fm0 986 0 R/Fm1 993 0 R/Fm2 1003 0 R/Fm3 1010 0 R/Fm4 1020 0 R/Fm5 1028 0 R/Fm6 1038 0 R/Fm7 1045 0 R>>/ColorSpace<</CS0 982 0 R>>/Font<</T1_0 1046 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 971 0 R/MC1 975 0 R/MC2 994 0 R/MC3 1011 0 R/MC4 1029 0 R>>/ExtGState<</GS0 978 0 R>>>>/Type/Page/LastModified(D:20100413200510+02'00')>>
endobj
1048 0 obj
<</Length 1948/Filter/FlateDecode>>stream
-H‰ÌWËŽ5Ý÷Wx™,®Çå··L -ZÖíÿu¹ÄÐgIIy_±ã<¾+i,¼}pë:§Œ¿.ï öP—ÎØ5•æmØW±!¥´«{[°£ -ûYì$ÖC«je¹g±-´uÊG+ÒL„S×±[SãÒAðÞ¡°j}l6 -w" )lÞ |IsZ±ƒ¢66]#Ì -Piæñ6y†ÉK°
†Ý¢±ß -rHv”ËÆÐÄF’5nZ¦1’¤”u\•î˜ÄI&b,p]4MV˜˜˜cœuÔ“ ãP´ÞÀÀœF%÷Ì :HÜÁÙQë‰4¨ò> ÷G!æišeH„¾¶éZ
`Ãcõ -H¶CŸá’:P«Ûz쎾þ˜²må9cÄfwó§s@Èð~¾0‡æð_f²p.….7–ªdCõ¨¯¥^"'€ýù@Ó"¤2’L¯ü\BaËPp¯p]zòÐ&à‘¿—µLX‘¢EpÒïdüã„Àsômš»¥ì“¢Åxf†Íœ+ˆìÚ‹C?œÖ ŸU\ó†J³ôµŠ×scàÐ}„»½ÖÕGäl–²EÔ\8ÂKGì.%C´:¨wHº'¥øœ7Ê
”ŠL'é%Jq¸z”k¦dÇ5m^4ÄÅsª_›025úèL¹íÇtˤðEi}†‚oH+%Ç#·×@ïŠÆ•>".wbì˜w]NÈ`ͨiçÁ9ıgEÊÈ„C€f¼CΔÛNAÙ@ (K£Z Ú1‘šÚµcêq¤ð,°çG†3*ðÉWµGá -6&-Ñ£´Y픪ç6¨¬ÌœJCÆL™ì»”t¤ ÀRõÒ±ú…7QX¥Î”î)çȸÀÓ¡nÒ¡Áb”‘{;¦Œ#å¦6‹qâÁ©Ä'Ý¥ÑBÖfž2N”ÛN¬$Ý3¢1•ô´›¾.g -õ€´¼¯‘ÊÆ«ÛcöËUóñùË; ñÇRùÜ£`|²Âü‹»îx¼éÂKsuÄuϦ½pDýÔ)>l”›R„
gmÚ‰’‚vÒ·3…}({j\"ŠW O(ŽMä™r›((sMÆƱÅg)a´#¤°×:RJ¥8¶¶¼ÄÈ•Í-uÁ=¬ì˜º)”vkâ@Ñr}Wv¾;Fš—¬Ž”ÛD‰‰YºÉ"›ov\,w-f -eÀ!L<8“ØUoÎλvkºŠ]GîLxg‘‚bgv&›R;à2$ìx¶xÆ…˜N”Tg l3ûÝ#|XʪÕD^kE½ï‡V%ÅIe@ÛT7|]Δ›ÚKšŸx OòºKËGìò0ðD¸M\[±)‡ðz®Ðy¶Û¿ãër¦ô“´™ïÍ•¨î?;äŸj"Ëi.ªÞGMr¿qÑ)ióµþÓö_'X(ü¶L|¯øJ_¦LãGA,)}Á^ç¾+¾´ïʽ²|ºBz${E» ×íóO‚ø¢ -ÿ« -ù¬oH*UzE';«‹øhÐñ3žgÑn/µëRôÝ×ÜÀå pÄMùe#fP'Q¬ -8Éͯvù:¢—ÚÐÒó¹Ë&?`óø&Cw`„×}ëa¾Ù´i7¼6|F£†9¾5i#…
g¦ºx;.¾s7íÀM;ª(Ϥc*
Žr~g ê^±(
›xw‡‹ÃSß/ýi‚^Êo€æÉiškMŸ| uàtŽ´•DÓÌu»¤UŽÊ@Ž‹˜ÝÚ‘ï?P\æË¡#¾Wðj‚CÕ”s\Ñoè3«¡3¼¾ðW7¡Z³†¢ýEæðé|ý¸Êäm¶¢®Hg™UœRøÛå/ -8;Xnf&7>J<fDsP~>
endstream
endobj
978 0 obj
<</OPM 1/BM/Normal/CA 1.0/OP false/SMask/None/ca 1.0/AIS false/op false/Type/ExtGState/SA true>>
endobj
1046 0 obj
<</Subtype/Type1/FontDescriptor 1047 0 R/LastChar 102/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]/BaseFont/XAMDXC+MyriadPro-Regular/FirstChar 49/Encoding/WinAnsiEncoding/Type/Font>>
endobj
1047 0 obj
<</StemV 88/FontName/XAMDXC+MyriadPro-Regular/FontStretch/Normal/FontFile3 1050 0 R/FontWeight 400/Flags 32/Descent -250/FontBBox[-157 -250 1126 952]/Ascent 952/FontFamily(Myriad Pro)/CapHeight 674/XHeight 484/Type/FontDescriptor/ItalicAngle 0>>
endobj
1050 0 obj
<</Subtype/Type1C/Length 1212/Filter/FlateDecode>>stream
-H‰|SmPg¾#\N„¦-ñMìÝY-àH‘BR? -((ØH%t´sÚ LÔŠšv¦-„X~P¨"ZGT§„ŠZÔ"ÅX$ÊHüK;ô{ñÍŒ½Øÿý³»Ïûì³ûî;ïâXh†ãø¬‚ô¼Ì‚Œy;M^e2¾ŸÏm)+Ñ™‚$ÃËq~f(?;‚B ÇË—/s ¨}¾}yvè¹H,ÇžÎ0– -Ú-Ÿ[ØÄ„„„¸ U°¯2]o,âXõN³…Ûffs¶o2šJ&…Ódzé%%l~Pffó93g*jâÕñ¬JHØna3JEœ2%1þ¿«±3«cM܃PÍÄéY‹I§ç¶éL[Yãfö:-\®þdg)Ǧ°zn3†áX$ŽQ!Ø,ËaáÂ#`yX)Ö…ùñ|¼/duˆ3ä•H-Ú7UÓÃOöà‚×#ª å«üª@•¨BË`ÏĈE½A žˆ7¼Ža°˜¿D#D’#åü€·¦"¬ãÒ3`÷Óibé0z÷£ÃÙ@Ü jÅ’ßàÁŸñ£<èb-y©›€w`æ£Iˆ=Sý‰Ø´UFn}<h;á>qM>yruc›Ÿ–ŒRQâòì™RèYÃp{?èÃ?/ -²ž'ð±q$ºH"ÖÀ”E"بZ’`GÓ‰CÇ›;g9ÄÕ›Á CÛH‰u:‡ ù~ŸˆÏòÓº)Ö¡ÂÑÚî<#‡¨«'ÛE¦&Eµ¶ùP)]–MTt\¯‘Ãœ©ç õê®´3›´.ܼ»ºº’iƒÅØÅëô
BÂ]ü§GÐ"”Vøc©]e¶ïv0‹¾Ê(Ö¬¶jÕúh4C†–>A0 ƒiêDfhE%t•øàÏÐ-mÎ{“mŠ§Ž¾¨f9ëöÓ?·ºOõÊÇzÕññ¹iŒÄz“ïê<óxå0?\é“z žRRßbCášE²8o*̆·&ï1ªý5õ$í ¥÷îw»vE6–;Š"‘X‘5–zÔêÛú)ê”)Ú¾AóÛùž»Gé Ón‰LêÉ)Ð.¡í¼@ßíЬSmܤþ‚Ik.<= WÏu{h‰Û:Âc¿ãÂØ1)«©xV¾ cB§®{AÔ}ʺ÷Ó<D4˜×7®“£Ä÷†æ£Øç1=ðËá†F‹¬#úr~Ù0lˆìôAû„ÔÍÇø)ÔUMž-ÓžN—£é1±HigPÌãX½vþò1ºV,t&£âªS6÷ï%“Nj·moÕ^ZêÎ٥ѫäqŸŽýõâòý'ƒÝëÕŒÃj¯´Ê$ÿX‡aI?ÌíÇ;‚k\ÄA9eÿ¾ö@“̧%¢9JD¢hí‹…ù÷zè +û‰ÝÅœ5Wžô‘«{?u£þ¬×'ÿ»U¡¶1VXå-HÁ½D°4ŠWBØ-ö#yç‡Á?Úš¾ý¦‘n"ê¿,/‘}¶gk1S¤¯Ì[!³¬È -(…ŸéòØ€6¸`¡Ëí -XêÅüÊ:”[0º.ֵבô‘Y_xvkúDø„3â
~ÿ~.õ¯ -H‰œ–yTSwÇoÉž•°Ãc
[€°5la‘QIBHØADED„ª•2ÖmtFOE.®cÖ}êÒõ0êè8´×Ž8GNg¦Óïï÷9÷wïïÝß½÷ó - -V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó -€x¯Íú·¶Ò- -¨ê‡†¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r9‹\A&‘GÈ”ˆrQ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½ÄÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél
»—½‡}Ž}ŸCâ¸qâ9 -N'çÎ)Î].ÂuæJ¸rî -î÷wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â*6X[ݱF=3ë·YŸ±~dó ·‘ÛtÛ´¹iÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö -n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜IJlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§§|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßYÕ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø
Ú†žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝèþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMÅ›Î
nßLÝlÜ<9”úO -¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ
æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ -/CS0 cs 0.29 0.486 0.133 scn -1 i +<?xpacket end="w"?>
endstream
endobj
2 0 obj
<</Count 1/Kids[5 0 R]/Type/Pages>>
endobj
5 0 obj
<</ArtBox[154.5 205.274 523.59 501.023]/BleedBox[0.0 0.0 841.89 595.275]/Contents 1315 0 R/CropBox[0.0 0.0 841.89 595.275]/LastModified(D:20110404194430+02'00')/MediaBox[0.0 0.0 841.89 595.275]/Parent 2 0 R/PieceInfo<</Illustrator 1316 0 R>>/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/Font<</T1_0 1307 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 1308 0 R/MC1 1309 0 R/MC2 1310 0 R/MC3 1311 0 R/MC4 1312 0 R/MC5 1313 0 R>>/XObject<</Fm0 1319 0 R/Fm1 1320 0 R/Fm2 1321 0 R/Fm3 1322 0 R/Fm4 1323 0 R/Fm5 1324 0 R/Fm6 1325 0 R/Fm7 1326 0 R>>>>/Thumb 1327 0 R/TrimBox[0.0 0.0 841.89 595.275]/Type/Page>>
endobj
1315 0 obj
<</Filter/FlateDecode/Length 1961>>stream
+H‰ÌWÉŽ7½çWð(ŠÍ}¹ºå10€f ¨9†e·
£ÚÆŒþ˜÷"˜™ÌTÙ²Œ–*ù‚Œ`06þýhÞ>:óÕ›G³|ý?JòJzx|ïÌõ£q¶çŠßæÚø5¯¿,ß`úÇKªÎfº·S—ØlŒÑŒÏÿ~Xž‡!¸ÚƯŒ9ÚPóo0Ž=SZLŒ)T[“Q÷ò)Ý}bŒÛ”Â]Ưžgø§G|òß9ãÍÓóâ“ñIMvO»'óô²|xu}]^ýð}{N¯¿}ú'$\0›yz³¼ò)ä\^?ýLr±½ ùëç$Lòó)W.>ùD®¯Ÿ¾ ê›ÿbyîY,×’·›ËŠqÿ˜_dÉËÃ?^œyóëòNÝùøÇáŸyÿø¯%™·$G3Áã/’ÌõE,Áß‹Ï6•„o°9èÙ¶ÿ×咢Β’˾cÇy|WÒX:x•}pë:'Œ?-ï¡öP—îØ5õ=Øäqèм9ç]Ý‹·;1h°ŸÅNÞhÕ¬CîYm} +ÉzßM‚[×±¶åÎ¥ƒ‚žÂš
°Û*Š8€¦°eƒð&ÍiÆŠÚÔegÐ#„j77ˆ·9vL^¢í0„— û
@6gÃ6õÐ%ÇBŽÓ¥‚äˆñnk0‰ +]Ûe±a²±’E¤Cßa(pKÉ(•n=ö…ÉGJY¶òœ1âH*ºúóE:"lxÙÞ/Òñ‹Štü«Šô¡HÄs‘ˆ,~¥³|e[jG½-í…Tóþ ²@iB„×QAÂÉ-_*A¬ì*®ò®‹‚úrù²–ŒÒµŠÎëÌ€Ÿœ'ÜE_äqû¤—^ƒb3ÄÎUDxÓÂàР+TÃ>adm‰ôÓ™rÛ)Ž©WHáíŠR{‡‚oÌ+¥¤#·×@•~"®}bìXv]NÈ`ýhyçÁ9¼c«ŠôñŽšñN9Sn;
f%¢D)Få@åc2u±«bêq¤ð,°çÇ;Tà“ÿ®bÊlXz¦Gi³¦”&ç6Œ¨²Ì¼ÊCÆL™ì»Ô|¤ ÈRù^±ø…·R\¥Îõ”sŒd]äéPCé‡Øa1ÊÈÈ¿SÆ‘r›¥4ñàT>dÙ¥ÓB–6Ÿ2N”ÛN¬ìÕ3^b*Ëi7/|]Îêix_"•
™ÚcöËUròþEž=ÃQc©þ=n‡çQ0>[eþÀ½÷7<ÞË/ÏU- +ÚÌÐÏö§ìµq¡®\F= wl.Ï”ÛDA¹ë~lœzºK‰£E!…ýבR³ŠcËËÝØôRÜÉr@ÅÔåH¡´`Š—Ó]Ùïé^‹H8Rne +8;Z]!0oj-o&4Mq#BXZ(r-qRjZg"d;e'fX2?:$%:pb1G;i=ZP,(M5$Ct>Pr+OM%Sb3 +$Z$YM!!)e4pih!i-MB:^dR_nsi+[p*`^+#SD`bS0lt>(HO8LDNEmrh`0uV.i4u*`_ +<QuhYM+[,LK_;/1Bi3D]@_As80$4fVpZLHDB2T:(K_'G0h$g%6n.8p"/JA-b,c&qf +UbPa<\L=gX;:6"QDSB056Ip4P?@MB$feXFUaj4\dSiP/#U:<PVfi:Gt;qD1sE,nhI +B.M&9Cj3K\";_P6/u!Kf]tDfDELrplU'e?"h&JBb-edM:j$_i`M&(%OVm&WU5dR#= +[Sm2,zn4nE;!7($KU&~>
endstream
endobj
1328 0 obj
[/Indexed/DeviceRGB 255 1329 0 R]
endobj
1329 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
1319 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1330 0 R/Length 283/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1331 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn /GS0 gs q 1 0 0 1 183 308.2725 cm 0 0 m @@ -623,11 +612,11 @@ q 1 0 0 1 183 308.2725 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
993 0 obj
<</Subtype/Form/Length 244/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 988 0 R/Resources<</XObject<</Fm0 992 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1320 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1332 0 R/Length 296/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1333 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn /GS0 gs q 1 0 0 1 186.627 218.2744 cm 0 0 m @@ -638,11 +627,12 @@ q 1 0 0 1 186.627 218.2744 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1003 0 obj
<</Subtype/Form/Length 258/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 998 0 R/Resources<</XObject<</Fm0 1002 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1321 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1334 0 R/Length 287/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1335 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.243 0.533 0.643 scn /GS0 gs q 1 0 0 1 334.002 303.2773 cm 0 0 m @@ -653,11 +643,11 @@ q 1 0 0 1 334.002 303.2773 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1010 0 obj
<</Subtype/Form/Length 247/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1005 0 R/Resources<</XObject<</Fm0 1009 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1322 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1336 0 R/Length 298/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1337 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.212 0.624 0.78 scn /GS0 gs q 1 0 0 1 327.999 212.2715 cm 0 0 m @@ -668,11 +658,12 @@ q 1 0 0 1 327.999 212.2715 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1020 0 obj
<</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1015 0 R/Resources<</XObject<</Fm0 1019 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1323 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1338 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1339 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 323.6699 445.7744 cm 0 0 m @@ -683,11 +674,11 @@ q 1 0 0 1 323.6699 445.7744 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1028 0 obj
<</Subtype/Form/Length 241/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1023 0 R/Resources<</XObject<</Fm0 1027 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1324 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1340 0 R/Length 292/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1341 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 315.165 487.2754 cm 0 0 m @@ -698,11 +689,12 @@ q 1 0 0 1 315.165 487.2754 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1038 0 obj
<</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1033 0 R/Resources<</XObject<</Fm0 1037 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1325 0 obj
<</BBox[156.837 462.278 212.835 406.271]/Group 1342 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1343 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 184.8359 446.2783 cm 0 0 m @@ -713,11 +705,11 @@ q 1 0 0 1 184.8359 446.2783 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1045 0 obj
<</Subtype/Form/Length 240/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1040 0 R/Resources<</XObject<</Fm0 1044 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1326 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1344 0 R/Length 291/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1345 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 189.876 496.0234 cm 0 0 m @@ -728,9 +720,11 @@ q 1 0 0 1 189.876 496.0234 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1040 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1044 0 obj
<</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1041 0 R/Resources<</XObject<</Fm0 1043 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1344 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1345 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1346 0 R/Length 534/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1347 0 R>>>>/Subtype/Form>>stream
q 189.876 496.023 m 189.876 501.023 l @@ -745,13 +739,13 @@ q 190.883 495.569 190.426 496.026 189.876 496.023 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1041 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1043 0 obj
<</Subtype/Form/Length 11006/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1042 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1346 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1347 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1348 0 R/Length 11001/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn -1 i /GS0 gs q 1 0 0 1 189.876 496.0234 cm 0 0 m @@ -1155,7 +1149,16 @@ q 1 0 0 1 189.876 501.0112 cm 0.15 0.006 0.046 -0.044 0 0 c f Q -
endstream
endobj
1042 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1033 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1037 0 obj
<</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1034 0 R/Resources<</XObject<</Fm0 1036 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1348 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1318 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
1317 0 obj
[/ICCBased 1349 0 R]
endobj
1349 0 obj
<</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc
[€°5la‘QIBHØADED„ª•2ÖmtFOE.®cÖ}êÒõ0êè8´×Ž8GNg¦Óïï÷9÷wïïÝß½÷ó + +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó +€x¯Íú·¶Ò- +¨ê‡†¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r9‹\A&‘GÈ”ˆrQ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½ÄÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél
»—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â*6X[ݱF=3ë·YŸ±~dó ·‘ÛtÛ´¹iÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜IJlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§§|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßYÕ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø
Ú†žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝèþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMÅ›Î
nßLÝlÜ<9”úO +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ
æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ q 184.836 446.278 m 184.836 462.278 l @@ -1171,12 +1174,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1034 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1036 0 obj
<</Subtype/Form/Length 13533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1035 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1350 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1351 0 obj
<</BBox[156.837 462.278 212.835 406.271]/Group 1352 0 R/Length 13528/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn -1 i /GS0 gs q 1 0 0 1 184.8359 446.2783 cm 0 0 m @@ -1634,7 +1636,7 @@ q 1 0 0 1 184.8359 462.2749 cm 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1035 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1023 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1027 0 obj
<</Subtype/Form/Length 477/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1024 0 R/Resources<</XObject<</Fm0 1026 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1352 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1340 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1341 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1353 0 R/Length 529/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1354 0 R>>>>/Subtype/Form>>stream
q 315.165 487.275 m 315.165 492.275 l @@ -1649,13 +1651,13 @@ q 316.17 486.824 315.713 487.279 315.165 487.275 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1024 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1026 0 obj
<</Subtype/Form/Length 11079/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1025 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1353 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1354 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1355 0 R/Length 11074/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn -1 i /GS0 gs q 1 0 0 1 315.165 487.2754 cm 0 0 m @@ -2060,7 +2062,7 @@ q 1 0 0 1 315.165 492.2632 cm 0.15 0.006 0.046 -0.044 0 0 c f Q -
endstream
endobj
1025 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1015 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1019 0 obj
<</Subtype/Form/Length 473/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1016 0 R/Resources<</XObject<</Fm0 1018 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1355 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1338 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1339 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1356 0 R/Length 502/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1357 0 R>>>>/Subtype/Form>>stream
q 323.67 445.774 m 323.67 461.774 l @@ -2076,12 +2078,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1016 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1018 0 obj
<</Subtype/Form/Length 13391/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1017 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1356 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1357 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1358 0 R/Length 13386/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn -1 i /GS0 gs q 1 0 0 1 323.6699 445.7744 cm 0 0 m @@ -2536,7 +2537,7 @@ q 1 0 0 1 323.6699 461.771 cm 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1017 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1005 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1009 0 obj
<</Subtype/Form/Length 478/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1006 0 R/Resources<</XObject<</Fm0 1008 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
+
endstream
endobj
1358 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1336 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1337 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1359 0 R/Length 530/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1360 0 R>>>>/Subtype/Form>>stream
q 327.999 212.271 m 327.999 217.271 l @@ -2551,13 +2552,13 @@ q 329.006 211.817 328.549 212.274 327.999 212.271 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1006 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1008 0 obj
<</Subtype/Form/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1007 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.294 0.494 0.133 scn -1 i +
endstream
endobj
1359 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1360 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1361 0 R/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.216 0.631 0.792 scn /GS0 gs q 1 0 0 1 327.999 212.2715 cm 0 0 m @@ -2598,7 +2599,7 @@ q 1 0 0 1 327.999 213.1963 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.208 0.616 0.776 scn q 1 0 0 1 327.999 213.3379 cm 0 0 m -0.03 -0.092 -0.164 -0.17 -0.185 -0.265 c @@ -2619,7 +2620,7 @@ q 1 0 0 1 327.999 213.3379 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.204 0.604 0.757 scn q 1 0 0 1 327.999 213.4785 cm 0 0 m -0.294 -0.83 -1.296 -1.345 -1.079 -2.404 c @@ -2636,7 +2637,7 @@ q 1 0 0 1 327.999 213.4785 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.2 0.588 0.741 scn q 1 0 0 1 327.999 213.6182 cm 0 0 m -0.352 -0.866 -1.383 -1.428 -1.146 -2.558 c @@ -2652,7 +2653,7 @@ q 1 0 0 1 327.999 213.6182 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.196 0.573 0.722 scn q 1 0 0 1 327.999 213.7549 cm 0 0 m -0.193 -0.417 -0.585 -0.691 -0.795 -1.098 c @@ -2669,7 +2670,7 @@ q 1 0 0 1 327.999 213.7549 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.188 0.561 0.702 scn q 1 0 0 1 327.999 213.9082 cm 0 0 m -0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c @@ -2686,7 +2687,7 @@ q 1 0 0 1 327.999 213.9082 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.184 0.545 0.686 scn q 1 0 0 1 327.999 214.0996 cm 0 0 m -0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c @@ -2703,7 +2704,7 @@ q 1 0 0 1 327.999 214.0996 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.18 0.529 0.667 scn q 1 0 0 1 327.999 214.2871 cm 0 0 m -0.037 -0.069 -0.152 -0.104 -0.217 -0.147 c @@ -2720,7 +2721,7 @@ q 1 0 0 1 327.999 214.2871 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.176 0.518 0.651 scn q 1 0 0 1 327.999 214.4717 cm 0 0 m -0.176 -0.317 -0.542 -0.437 -0.748 -0.722 c @@ -2737,7 +2738,7 @@ q 1 0 0 1 327.999 214.4717 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.169 0.502 0.631 scn q 1 0 0 1 327.999 214.7031 cm 0 0 m -0.06 -0.133 -0.265 -0.211 -0.386 -0.291 c @@ -2754,7 +2755,7 @@ q 1 0 0 1 327.999 214.7031 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.165 0.486 0.612 scn q 1 0 0 1 327.999 214.9854 cm 0 0 m -0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c @@ -2771,7 +2772,7 @@ q 1 0 0 1 327.999 214.9854 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.161 0.475 0.596 scn q 1 0 0 1 327.999 215.2715 cm 0 0 m -0.045 -0.106 -0.21 -0.167 -0.302 -0.236 c @@ -2788,7 +2789,7 @@ q 1 0 0 1 327.999 215.2715 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.157 0.459 0.576 scn q 1 0 0 1 327.999 215.6543 cm 0 0 m -0.163 -0.361 -0.542 -0.515 -0.779 -0.805 c @@ -2806,7 +2807,7 @@ q 1 0 0 1 327.999 215.6543 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.149 0.443 0.561 scn q 1 0 0 1 327.999 216.0791 cm 0 0 m -0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c @@ -2822,7 +2823,7 @@ q 1 0 0 1 327.999 216.0791 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.145 0.431 0.541 scn q 1 0 0 1 327.999 216.5439 cm 0 0 m -0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c @@ -2837,7 +2838,7 @@ q 1 0 0 1 327.999 216.5439 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.141 0.416 0.522 scn q 1 0 0 1 327.999 216.9863 cm 0 0 m -0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c @@ -2852,7 +2853,7 @@ q 1 0 0 1 327.999 216.9863 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.137 0.4 0.506 scn q 1 0 0 1 327.999 217.2598 cm 0 0 m -0.043 -0.053 -0.154 -0.029 -0.221 -0.042 c @@ -2866,7 +2867,7 @@ q 1 0 0 1 327.999 217.2598 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.129 0.388 0.486 scn q 1 0 0 1 327.0938 217.1953 cm 0 0 m -1.738 -0.59 -1.75 -4.505 -1.75 -4.545 c @@ -2878,7 +2879,7 @@ q 1 0 0 1 327.0938 217.1953 cm 0.115 0.021 0.049 0.013 0 0 c f Q -0.173 0.29 0.078 scn +0.125 0.373 0.471 scn q 1 0 0 1 325.7642 216.7715 cm 0 0 m -1.064 -0.938 -0.813 -4.867 -0.541 -5.6 c @@ -2892,7 +2893,7 @@ q 1 0 0 1 325.7642 216.7715 cm 0.161 0.102 0.061 0.054 0 0 c f Q -0.302 0.506 0.137 scn +0.22 0.647 0.812 scn q 1 0 0 1 329.5791 211.4561 cm 0 0 m -0.095 0.068 -0.095 0.068 -0.519 0.587 c @@ -2903,7 +2904,7 @@ q 1 0 0 1 329.5791 211.4561 cm 0.153 -0.144 0.065 -0.047 0 0 c f Q -0.208 0.349 0.094 scn +0.149 0.443 0.561 scn q 1 0 0 1 330.5688 216.6631 cm 0 0 m -1.295 0.462 -2.254 -0.325 -2.57 -0.584 c @@ -2913,7 +2914,7 @@ q 1 0 0 1 330.5688 216.6631 cm 0.219 -0.095 0.096 -0.034 0 0 c f Q -0.306 0.518 0.141 scn +0.224 0.659 0.831 scn q 1 0 0 1 329.6191 211.708 cm 0 0 m -0.335 0.354 l @@ -2924,7 +2925,7 @@ q 1 0 0 1 329.6191 211.708 cm 0.106 -0.131 0.048 -0.039 0 0 c f Q -0.2 0.337 0.09 scn +0.145 0.431 0.541 scn q 1 0 0 1 329.7661 216.9941 cm 0 0 m -0.649 0.12 -1.161 -0.01 -1.767 -0.45 c @@ -2934,7 +2935,7 @@ q 1 0 0 1 329.7661 216.9941 cm 0.02 -0.005 0.009 -0.002 0 0 c f Q -0.314 0.525 0.145 scn +0.227 0.675 0.847 scn q 1 0 0 1 329.623 211.9746 cm 0 0 m -0.004 0.004 -0.533 0.572 -0.71 0.861 c @@ -2945,7 +2946,7 @@ q 1 0 0 1 329.623 211.9746 cm 0.052 -0.044 0.021 -0.021 0 0 c f Q -0.192 0.325 0.09 scn +0.141 0.416 0.522 scn q 1 0 0 1 328.9043 217.1943 cm 0 0 m -0.314 -0.006 -0.487 -0.009 -0.905 -0.208 c @@ -2954,7 +2955,7 @@ q 1 0 0 1 328.9043 217.1943 cm 0.157 -0.021 0.068 -0.004 0 0 c f Q -0.188 0.314 0.086 scn +0.137 0.4 0.506 scn q 1 0 0 1 327.999 217.2598 cm 0 0 m 0 0.012 l @@ -2962,7 +2963,7 @@ q 1 0 0 1 327.999 217.2598 cm 0.15 0.006 0.046 -0.045 0 0 c f Q -
endstream
endobj
1007 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
998 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1002 0 obj
<</Subtype/Form/Length 475/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 999 0 R/Resources<</XObject<</Fm0 1001 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
+
endstream
endobj
1361 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1334 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1335 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1362 0 R/Length 504/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1363 0 R>>>>/Subtype/Form>>stream
q 334.002 303.277 m 334.002 319.277 l @@ -2978,12 +2979,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
999 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1001 0 obj
<</Subtype/Form/Length 13469/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1000 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.306 0.518 0.141 scn -1 i +
endstream
endobj
1362 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1363 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1364 0 R/Length 13467/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.259 0.565 0.682 scn /GS0 gs q 1 0 0 1 334.002 303.2773 cm 0 0 m @@ -3022,7 +3022,7 @@ q 1 0 0 1 334.002 308.4409 cm 0 0 l f Q -0.302 0.506 0.137 scn +0.255 0.553 0.667 scn q 1 0 0 1 334.002 310.2881 cm 0 0 m -0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c @@ -3048,7 +3048,7 @@ q 1 0 0 1 334.002 310.2881 cm 0 0 l f Q -0.294 0.494 0.133 scn +0.247 0.541 0.651 scn q 1 0 0 1 334.002 311.4072 cm 0 0 m -0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c @@ -3073,7 +3073,7 @@ q 1 0 0 1 334.002 311.4072 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.243 0.529 0.639 scn q 1 0 0 1 334.002 312.3325 cm 0 0 m -0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c @@ -3093,7 +3093,7 @@ q 1 0 0 1 334.002 312.3325 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.235 0.518 0.624 scn q 1 0 0 1 334.002 313.1323 cm 0 0 m -0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c @@ -3110,7 +3110,7 @@ q 1 0 0 1 334.002 313.1323 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.231 0.506 0.608 scn q 1 0 0 1 334.002 313.833 cm 0 0 m -0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c @@ -3127,7 +3127,7 @@ q 1 0 0 1 334.002 313.833 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.227 0.494 0.592 scn q 1 0 0 1 334.002 314.499 cm 0 0 m -0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c @@ -3144,7 +3144,7 @@ q 1 0 0 1 334.002 314.499 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.22 0.478 0.576 scn q 1 0 0 1 334.002 315.1099 cm 0 0 m -0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c @@ -3161,7 +3161,7 @@ q 1 0 0 1 334.002 315.1099 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.216 0.467 0.565 scn q 1 0 0 1 334.002 315.6826 cm 0 0 m -0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c @@ -3178,7 +3178,7 @@ q 1 0 0 1 334.002 315.6826 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.208 0.455 0.549 scn q 1 0 0 1 334.002 316.2197 cm 0 0 m -0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c @@ -3195,7 +3195,7 @@ q 1 0 0 1 334.002 316.2197 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.204 0.443 0.533 scn q 1 0 0 1 334.002 316.7344 cm 0 0 m -0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c @@ -3212,7 +3212,7 @@ q 1 0 0 1 334.002 316.7344 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.196 0.431 0.518 scn q 1 0 0 1 334.002 317.207 cm 0 0 m -0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c @@ -3229,7 +3229,7 @@ q 1 0 0 1 334.002 317.207 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.192 0.42 0.506 scn q 1 0 0 1 334.002 317.647 cm 0 0 m -0.165 -0.201 -0.596 -0.119 -0.852 -0.169 c @@ -3246,7 +3246,7 @@ q 1 0 0 1 334.002 317.647 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.188 0.408 0.49 scn q 1 0 0 1 334.002 318.0581 cm 0 0 m -0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c @@ -3263,7 +3263,7 @@ q 1 0 0 1 334.002 318.0581 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.18 0.392 0.475 scn q 1 0 0 1 334.002 318.4131 cm 0 0 m -0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c @@ -3280,7 +3280,7 @@ q 1 0 0 1 334.002 318.4131 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.176 0.38 0.459 scn q 1 0 0 1 334.002 318.7388 cm 0 0 m -0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c @@ -3295,7 +3295,7 @@ q 1 0 0 1 334.002 318.7388 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.169 0.369 0.443 scn q 1 0 0 1 334.002 318.9941 cm 0 0 m -0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c @@ -3310,7 +3310,7 @@ q 1 0 0 1 334.002 318.9941 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.165 0.357 0.431 scn q 1 0 0 1 334.002 319.1851 cm 0 0 m -0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c @@ -3325,7 +3325,7 @@ q 1 0 0 1 334.002 319.1851 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.157 0.345 0.416 scn q 1 0 0 1 334.002 319.2739 cm 0 0 m -0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c @@ -3339,7 +3339,7 @@ q 1 0 0 1 334.002 319.2739 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.153 0.333 0.4 scn q 1 0 0 1 329.771 318.957 cm 0 0 m -22.534 -4.552 -23.533 -35.028 -6.33 -46.26 c @@ -3350,7 +3350,7 @@ q 1 0 0 1 329.771 318.957 cm 0.544 0.077 0.232 0.04 0 0 c f Q -0.173 0.29 0.078 scn +0.145 0.322 0.384 scn q 1 0 0 1 321.978 316.4971 cm 0 0 m -16.565 -9.063 -17.347 -40.195 9.314 -48.713 c @@ -3362,7 +3362,7 @@ q 1 0 0 1 321.978 316.4971 cm 1.31 0.61 0.543 0.297 0 0 c f Q -0.314 0.525 0.145 scn +0.267 0.58 0.698 scn q 1 0 0 1 349.9282 293.1025 cm 0 0 m -1.706 2.422 -2.871 5.191 -4.806 7.466 c @@ -3376,7 +3376,7 @@ q 1 0 0 1 349.9282 293.1025 cm 0.589 -1.328 0.314 -0.446 0 0 c f Q -0.322 0.537 0.145 scn +0.271 0.592 0.71 scn q 1 0 0 1 350.0625 295.5957 cm 0 0 m -1.97 2.883 -3.056 4.472 -4.87 6.595 c @@ -3393,7 +3393,7 @@ q 1 0 0 1 350.0625 295.5957 cm 0.33 -0.793 0.182 -0.267 0 0 c f Q -0.325 0.549 0.149 scn +0.278 0.604 0.725 scn q 1 0 0 1 349.1475 299.125 cm 0 0 m -0.737 0.235 -1.076 1.45 -1.576 2.04 c @@ -3406,7 +3406,7 @@ q 1 0 0 1 349.1475 299.125 cm 0.026 0.014 0.011 -0.003 0 0 c f Q -0.208 0.349 0.094 scn +0.176 0.38 0.459 scn q 1 0 0 1 346.0513 316.5498 cm 0 0 m -5.275 2.417 -9.403 2.407 -12.049 2.189 c @@ -3416,7 +3416,7 @@ q 1 0 0 1 346.0513 316.5498 cm 0.673 -0.334 0.292 -0.134 0 0 c f Q -0.2 0.337 0.09 scn +0.169 0.369 0.443 scn q 1 0 0 1 342.2651 318.0342 cm 0 0 m -3.078 0.794 -4.478 1.111 -8.263 0.96 c @@ -3425,7 +3425,7 @@ q 1 0 0 1 342.2651 318.0342 cm 0.981 -0.329 0.425 -0.126 0 0 c f Q -0.192 0.325 0.09 scn +0.165 0.357 0.431 scn q 1 0 0 1 338.2329 318.957 cm 0 0 m -2.557 0.263 -2.657 0.273 -4.231 0.228 c @@ -3434,14 +3434,14 @@ q 1 0 0 1 338.2329 318.957 cm 0.724 -0.122 0.312 -0.042 0 0 c f Q -0.188 0.314 0.086 scn +0.157 0.345 0.416 scn q 1 0 0 1 334.002 319.2739 cm 0 0 m 0.335 0.003 0.669 -0.002 1.001 -0.014 c 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1000 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
988 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
992 0 obj
<</Subtype/Form/Length 481/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 989 0 R/Resources<</XObject<</Fm0 991 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
+
endstream
endobj
1364 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1332 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1333 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1365 0 R/Length 533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1366 0 R>>>>/Subtype/Form>>stream
q 186.627 218.274 m 186.627 223.274 l @@ -3456,13 +3456,13 @@ q 187.622 217.829 187.171 218.277 186.627 218.274 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
989 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
991 0 obj
<</Subtype/Form/Length 11020/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 990 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.294 0.494 0.133 scn -1 i +
endstream
endobj
1365 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1366 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1367 0 R/Length 11024/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.176 0.529 0.353 scn /GS0 gs q 1 0 0 1 186.627 218.2744 cm 0 0 m @@ -3503,7 +3503,7 @@ q 1 0 0 1 186.627 219.1992 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.173 0.518 0.345 scn q 1 0 0 1 186.627 219.3418 cm 0 0 m -0.03 -0.093 -0.164 -0.171 -0.185 -0.266 c @@ -3524,7 +3524,7 @@ q 1 0 0 1 186.627 219.3418 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.169 0.506 0.337 scn q 1 0 0 1 186.627 219.4824 cm 0 0 m -0.295 -0.834 -1.295 -1.352 -1.079 -2.413 c @@ -3540,7 +3540,7 @@ q 1 0 0 1 186.627 219.4824 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.165 0.49 0.329 scn q 1 0 0 1 186.627 219.6211 cm 0 0 m -0.353 -0.868 -1.382 -1.434 -1.146 -2.564 c @@ -3556,7 +3556,7 @@ q 1 0 0 1 186.627 219.6211 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.161 0.478 0.322 scn q 1 0 0 1 186.627 219.7588 cm 0 0 m -0.193 -0.418 -0.584 -0.692 -0.794 -1.099 c @@ -3573,7 +3573,7 @@ q 1 0 0 1 186.627 219.7588 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.157 0.467 0.314 scn q 1 0 0 1 186.627 219.9111 cm 0 0 m -0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c @@ -3590,7 +3590,7 @@ q 1 0 0 1 186.627 219.9111 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.153 0.455 0.306 scn q 1 0 0 1 186.627 220.1025 cm 0 0 m -0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c @@ -3607,7 +3607,7 @@ q 1 0 0 1 186.627 220.1025 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.149 0.443 0.294 scn q 1 0 0 1 186.627 220.291 cm 0 0 m -0.037 -0.07 -0.152 -0.104 -0.217 -0.148 c @@ -3624,7 +3624,7 @@ q 1 0 0 1 186.627 220.291 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.145 0.431 0.286 scn q 1 0 0 1 186.627 220.4746 cm 0 0 m -0.175 -0.316 -0.542 -0.436 -0.748 -0.721 c @@ -3641,7 +3641,7 @@ q 1 0 0 1 186.627 220.4746 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.141 0.42 0.278 scn q 1 0 0 1 186.627 220.7061 cm 0 0 m -0.06 -0.132 -0.265 -0.211 -0.386 -0.291 c @@ -3658,7 +3658,7 @@ q 1 0 0 1 186.627 220.7061 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.137 0.408 0.271 scn q 1 0 0 1 186.627 220.9883 cm 0 0 m -0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c @@ -3675,7 +3675,7 @@ q 1 0 0 1 186.627 220.9883 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.133 0.396 0.263 scn q 1 0 0 1 186.627 221.2744 cm 0 0 m -0.045 -0.106 -0.21 -0.167 -0.303 -0.236 c @@ -3692,7 +3692,7 @@ q 1 0 0 1 186.627 221.2744 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.129 0.384 0.255 scn q 1 0 0 1 186.627 221.6582 cm 0 0 m -0.163 -0.362 -0.542 -0.515 -0.779 -0.805 c @@ -3710,7 +3710,7 @@ q 1 0 0 1 186.627 221.6582 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 186.627 222.082 cm 0 0 m -0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c @@ -3726,7 +3726,7 @@ q 1 0 0 1 186.627 222.082 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 186.627 222.5469 cm 0 0 m -0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c @@ -3741,7 +3741,7 @@ q 1 0 0 1 186.627 222.5469 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 186.627 222.9893 cm 0 0 m -0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c @@ -3756,7 +3756,7 @@ q 1 0 0 1 186.627 222.9893 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 186.627 223.2627 cm 0 0 m -0.043 -0.052 -0.154 -0.029 -0.221 -0.042 c @@ -3770,7 +3770,7 @@ q 1 0 0 1 186.627 223.2627 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.11 0.325 0.216 scn q 1 0 0 1 185.7217 223.1973 cm 0 0 m -1.735 -0.588 -1.748 -4.507 -1.748 -4.547 c @@ -3782,7 +3782,7 @@ q 1 0 0 1 185.7217 223.1973 cm 0.115 0.022 0.049 0.014 0 0 c f Q -0.173 0.29 0.078 scn +0.106 0.314 0.208 scn q 1 0 0 1 184.3926 222.7744 cm 0 0 m -1.065 -0.939 -0.813 -4.875 -0.541 -5.608 c @@ -3796,7 +3796,7 @@ q 1 0 0 1 184.3926 222.7744 cm 0.161 0.103 0.062 0.054 0 0 c f Q -0.302 0.506 0.137 scn +0.18 0.541 0.361 scn q 1 0 0 1 188.1982 217.4531 cm 0 0 m -0.089 0.064 -0.089 0.064 -0.518 0.595 c @@ -3807,7 +3807,7 @@ q 1 0 0 1 188.1982 217.4531 cm 0.153 -0.145 0.065 -0.047 0 0 c f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 189.1953 222.666 cm 0 0 m -1.292 0.462 -2.253 -0.325 -2.568 -0.584 c @@ -3817,7 +3817,7 @@ q 1 0 0 1 189.1953 222.666 cm 0.215 -0.093 0.095 -0.034 0 0 c f Q -0.306 0.518 0.141 scn +0.184 0.553 0.369 scn q 1 0 0 1 188.2393 217.709 cm 0 0 m -0.336 0.357 l @@ -3828,7 +3828,7 @@ q 1 0 0 1 188.2393 217.709 cm 0.105 -0.132 0.047 -0.039 0 0 c f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 188.3931 222.9971 cm 0 0 m -0.649 0.121 -1.161 -0.01 -1.766 -0.45 c @@ -3838,7 +3838,7 @@ q 1 0 0 1 188.3931 222.9971 cm 0.019 -0.004 0.008 -0.001 0 0 c f Q -0.314 0.525 0.145 scn +0.188 0.565 0.376 scn q 1 0 0 1 188.2437 217.9775 cm 0 0 m -0.004 0.005 -0.532 0.572 -0.709 0.863 c @@ -3849,7 +3849,7 @@ q 1 0 0 1 188.2437 217.9775 cm 0.049 -0.041 0.02 -0.02 0 0 c f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 187.5317 223.1973 cm 0 0 m -0.313 -0.006 -0.486 -0.009 -0.905 -0.208 c @@ -3858,7 +3858,7 @@ q 1 0 0 1 187.5317 223.1973 cm 0.157 -0.021 0.068 -0.004 0 0 c f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 186.627 223.2627 cm 0 0 m 0 0.012 l @@ -3866,7 +3866,7 @@ q 1 0 0 1 186.627 223.2627 cm 0.15 0.006 0.046 -0.045 0 0 c f Q -
endstream
endobj
990 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
979 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
985 0 obj
<</Subtype/Form/Length 450/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 980 0 R/Resources<</XObject<</Fm0 984 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
+
endstream
endobj
1367 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1330 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1331 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1368 0 R/Length 479/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1369 0 R>>>>/Subtype/Form>>stream
q 183 308.272 m 183 324.272 l @@ -3882,12 +3882,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
980 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
984 0 obj
<</Subtype/Form/Length 13394/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 981 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
-/CS0 cs 0.306 0.518 0.141 scn -1 i +
endstream
endobj
1368 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1369 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1370 0 R/Length 13398/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.184 0.553 0.369 scn /GS0 gs q 1 0 0 1 183 308.2725 cm 0 0 m @@ -3926,7 +3925,7 @@ q 1 0 0 1 183 313.436 cm 0 0 l f Q -0.302 0.506 0.137 scn +0.18 0.541 0.361 scn q 1 0 0 1 183 315.2832 cm 0 0 m -0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c @@ -3952,7 +3951,7 @@ q 1 0 0 1 183 315.2832 cm 0 0 l f Q -0.294 0.494 0.133 scn +0.176 0.529 0.353 scn q 1 0 0 1 183 316.4023 cm 0 0 m -0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c @@ -3977,7 +3976,7 @@ q 1 0 0 1 183 316.4023 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.173 0.518 0.345 scn q 1 0 0 1 183 317.3276 cm 0 0 m -0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c @@ -3997,7 +3996,7 @@ q 1 0 0 1 183 317.3276 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.169 0.506 0.337 scn q 1 0 0 1 183 318.1274 cm 0 0 m -0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c @@ -4014,7 +4013,7 @@ q 1 0 0 1 183 318.1274 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.165 0.49 0.329 scn q 1 0 0 1 183 318.8281 cm 0 0 m -0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c @@ -4031,7 +4030,7 @@ q 1 0 0 1 183 318.8281 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.161 0.478 0.322 scn q 1 0 0 1 183 319.4941 cm 0 0 m -0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c @@ -4048,7 +4047,7 @@ q 1 0 0 1 183 319.4941 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.157 0.467 0.314 scn q 1 0 0 1 183 320.105 cm 0 0 m -0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c @@ -4065,7 +4064,7 @@ q 1 0 0 1 183 320.105 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.153 0.455 0.306 scn q 1 0 0 1 183 320.6777 cm 0 0 m -0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c @@ -4082,7 +4081,7 @@ q 1 0 0 1 183 320.6777 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.149 0.443 0.294 scn q 1 0 0 1 183 321.2148 cm 0 0 m -0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c @@ -4099,7 +4098,7 @@ q 1 0 0 1 183 321.2148 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.145 0.431 0.286 scn q 1 0 0 1 183 321.7295 cm 0 0 m -0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c @@ -4116,7 +4115,7 @@ q 1 0 0 1 183 321.7295 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.141 0.42 0.278 scn q 1 0 0 1 183 322.2021 cm 0 0 m -0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c @@ -4133,7 +4132,7 @@ q 1 0 0 1 183 322.2021 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.137 0.408 0.271 scn q 1 0 0 1 183 322.6421 cm 0 0 m -0.165 -0.201 -0.596 -0.119 -0.851 -0.169 c @@ -4150,7 +4149,7 @@ q 1 0 0 1 183 322.6421 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.133 0.396 0.263 scn q 1 0 0 1 183 323.0532 cm 0 0 m -0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c @@ -4167,7 +4166,7 @@ q 1 0 0 1 183 323.0532 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.129 0.384 0.255 scn q 1 0 0 1 183 323.4082 cm 0 0 m -0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c @@ -4184,7 +4183,7 @@ q 1 0 0 1 183 323.4082 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 183 323.7339 cm 0 0 m -0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c @@ -4199,7 +4198,7 @@ q 1 0 0 1 183 323.7339 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 183 323.9893 cm 0 0 m -0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c @@ -4214,7 +4213,7 @@ q 1 0 0 1 183 323.9893 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 183 324.1802 cm 0 0 m -0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c @@ -4229,7 +4228,7 @@ q 1 0 0 1 183 324.1802 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 183 324.269 cm 0 0 m -0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c @@ -4243,7 +4242,7 @@ q 1 0 0 1 183 324.269 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.11 0.325 0.216 scn q 1 0 0 1 178.769 323.9521 cm 0 0 m -22.529 -4.551 -23.528 -35.026 -6.329 -46.258 c @@ -4254,7 +4253,7 @@ q 1 0 0 1 178.769 323.9521 cm 0.544 0.077 0.232 0.04 0 0 c f Q -0.173 0.29 0.078 scn +0.106 0.314 0.208 scn q 1 0 0 1 170.9761 321.4922 cm 0 0 m -16.563 -9.063 -17.344 -40.194 9.316 -48.713 c @@ -4266,7 +4265,7 @@ q 1 0 0 1 170.9761 321.4922 cm 1.31 0.61 0.543 0.297 0 0 c f Q -0.314 0.525 0.145 scn +0.188 0.565 0.376 scn q 1 0 0 1 198.9263 298.0972 cm 0 0 m -1.706 2.422 -2.871 5.192 -4.806 7.466 c @@ -4280,7 +4279,7 @@ q 1 0 0 1 198.9263 298.0972 cm 0.589 -1.328 0.314 -0.445 0 0 c f Q -0.322 0.537 0.145 scn +0.192 0.576 0.384 scn q 1 0 0 1 199.0605 300.5908 cm 0 0 m -1.97 2.883 -3.055 4.471 -4.87 6.595 c @@ -4297,7 +4296,7 @@ q 1 0 0 1 199.0605 300.5908 cm 0.33 -0.793 0.182 -0.267 0 0 c f Q -0.325 0.549 0.149 scn +0.196 0.588 0.392 scn q 1 0 0 1 198.1455 304.1201 cm 0 0 m -0.737 0.235 -1.076 1.45 -1.576 2.04 c @@ -4310,7 +4309,7 @@ q 1 0 0 1 198.1455 304.1201 cm 0.026 0.014 0.011 -0.003 0 0 c f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 195.0493 321.5449 cm 0 0 m -5.275 2.417 -9.403 2.407 -12.049 2.189 c @@ -4320,7 +4319,7 @@ q 1 0 0 1 195.0493 321.5449 cm 0.673 -0.334 0.292 -0.134 0 0 c f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 191.2632 323.0293 cm 0 0 m -3.078 0.794 -4.478 1.111 -8.263 0.96 c @@ -4329,7 +4328,7 @@ q 1 0 0 1 191.2632 323.0293 cm 0.981 -0.329 0.425 -0.126 0 0 c f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 187.231 323.9521 cm 0 0 m -2.557 0.263 -2.657 0.273 -4.231 0.228 c @@ -4338,636 +4337,656 @@ q 1 0 0 1 187.231 323.9521 cm 0.724 -0.122 0.312 -0.042 0 0 c f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 183 324.269 cm 0 0 m 0.335 0.003 0.669 -0.002 1.001 -0.014 c 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
981 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1051 0 obj
[/Indexed/DeviceRGB 255 1052 0 R]
endobj
1052 0 obj
<</Length 428/Filter[/ASCII85Decode/FlateDecode]>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 -VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< -PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
962 0 obj
<</Private 963 0 R/LastModified(D:20100413200510+02'00')>>
endobj
963 0 obj
<</RoundtripVersion 13/CreatorVersion 13/ContainerVersion 11/AIMetaData 964 0 R/AIPrivateData1 965 0 R/AIPrivateData2 966 0 R/AIPrivateData3 967 0 R/AIPrivateData4 968 0 R/NumBlock 4/RoundtripStreamType 1>>
endobj
964 0 obj
<</Length 974>>stream
-%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 13.0
%%AI8_CreatorVersion: 13.0.2
%%For: (Gilles Dubochet) ()
%%Title: (type_tags.ai)
%%CreationDate: 4/13/10 8:05 PM
%%BoundingBox: -227 -99 143 234
%%HiResBoundingBox: -226.5 -98.5 142.5908 233.748
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 9.0
%AI12_BuildNumber: 434
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: -59.5 -62.5 -46.5 -49.5
%AI3_TemplateBox: 40.5 29.5 40.5 29.5
%AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623
%AI3_DocumentPreview: None
%AI5_ArtSize: 841.8898 595.2756
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 5
%AI9_OpenToView: -285.3354 49.2085 4.4426 1589 965 18 0 0 470 360 0 0 1 1 1 0 1
%AI5_OpenViewLayers: 77777
%%PageOrigin:-399 227
%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
965 0 obj
<</Length 7512>>stream
-%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5908 233.748
%AI7_Thumbnail: 128 104 8
%%BeginData: 7364 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF
%53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59
%2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF
%FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E
%A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9
%7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9
%AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F292F062F7EFD23FFA85906
%28062F282F2829065384FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84
%28062F292F292F29542F30292FA8FD21FFA853062928FD042F542F30292F
%84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04FF
%A8280529282929535353292F292F292FA8FD1FFFA92F00280629062F292F
%292F292F292FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF7D
%FFA852275227277D27A8FFFFFF530628282F5AA9FD04FF7E302F302953FD
%1FFF7E06282FA984A82F7EA8A9847E2F302953FD1EFFA9AFA9AFA9AFA9AF
%A9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA8002806297E
%FD07FF7E30292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684FD
%1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF7D
%A8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282953FD0A
%FF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06FF
%A82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD04
%FF5A5AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8FD14
%FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFFFFA8
%2F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12FFA8
%28052828FFFFFFA82F292FA8FFFFFF2F2F2929A8FD1BFF842805280659FF
%FFFF8407292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8A9A8
%FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328282953FFFF
%FFA82F077EFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15FF53
%002806A8FFFFFFA92984FFFFFFA8072F0653A8FD1CFF7D00280659FD04FF
%532FA8FFFFFF7E29282FA8FD1BFFFD04532E5353532E535353287EFD13FF
%7D2828282FFD09FF532F28297DFD1DFF7E28282853FD0AFF53282953FD1C
%FF5300280006002800060028000053FD13FFA92828060653FD07FF532928
%2828FD1FFF28280053FD09FF7E062806A8FD1CFF2E050028000600280006
%00280053FD14FFA8062828282E7E84AFA87E292F282F06A8FD1FFFA80628
%53FFFFFFA8A9FFFFA87E282F067DFD1DFF53002806280528062805280606
%53FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF7E06
%2F28280628012EA8FD1DFF2E06002800280028002800280053FD04FFA8FF
%FFFFA8FFFFA8A8FFA8FD07FF7E06280628282806282828067EFD23FF5952
%FFFFFF7E28062828280053A8FD1EFF5300280528062805280628050653FF
%FFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A82828000600060028
%28A8FD24FFA8A8A9FFFF8400060028287DA8FD1FFF280600060028000600
%2800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E597D
%537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628052853FFFF
%FFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E060028002800
%28002800280059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF530028
%0628052806280528060653FD72FF2E05002800060028000600280053FD72
%FF5300280628052806280528060653FD72FF280000060006000600060006
%0053FD72FF7E2E532E5353532E5353532E537DFDFCFFFDFCFFFDFCFFFDFC
%FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CAA8CAA8CA
%A8CAA8CAA8FD74FFFD0DCAFD18FFA8A8587C5883A8FD53FFCACAA8CAA8CA
%A8CAA8CAA8CAA8CAFD17FF7C51262D2C2D2C5151A8FD52FFFD0DCAFD15FF
%A82D2C262D2C512C2D2C2D2C7CA8FD29FFA87D5258515858A8FD1EFFA8CA
%A8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D512D572D572D
%5757572C7CFD28FF7C51262D2C2D2C2D2D58A8FD1DFFCACACAFFCACACAFF
%FD05CAFFFFFFFD047DFD0DFF2D26262D2C2D2C5757582D572D572C7CFD25
%FFA82D2C262D2C2D2D572C572C2D7DFD1BFFA8CAA8CAA8CAA8CAA8CAA8CA
%A8FD04FFFD04527D7D7D275252A85252A8FFFF582C2C2D2C577CCFFD04FF
%FD04572CA8FD24FF2D2C2C51517C83FF57572D572D2D7DFD1BFFFD0DCAFF
%FFFF52A8522752FF525227A8A82752FFFFA82D042D2C2D83FD06FF572C57
%2D2D51FD23FF5126262D2CA8FFFFFF582C572C572C2D83FD19FFA8CAA8CA
%A8CAA8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFFA726
%2D2D2D83FD05FFCFAE2D5757572D57A8FD21FF832D2C2D2C57A8FFFFFF58
%57335757572C7CFD1AFFCAFFCACACAFFCACACAFFCACACAFD12FF5226262D
%2DFD04FF832C572D572C572D572CA7FD21FF58042D2C51A8FD06FF7C2C57
%2D572CA8FD18FFCACAA8CAA8CAA8CAA8CAA8CAA8CAFD12FF7D042D267CFF
%FFFFCF2C572C572D572D572D2D58FD21FF272D262D2DFD07FF58572D5733
%2D7CFD19FFFD0DCAFD12FF5226262C51FFFFFF832D2C2D2C572C572C572C
%7CFD20FFA82D262D2657A7FD04FFA8A7582C572C572C58FD18FFCAFFCACA
%CAFFCACACAFFCACACAFD13FF7D262D267CFD04FF572D2C572D572D572D2D
%83FD20FFA8262D2C512D57A8FFFFFF57572D572D572D2D58FD18FFA176A1
%76A176A176A176A1769AA1FD12FF7D2D262D2CFD05FF7C7D7C572C572C2D
%2CAEFD20FF832D262D2C512CA8FFFFFF572C572D572C572C58FD18FF4BFD
%0420442020204420202076FD13FF272D262C7CFD07FF2D572D512658FD22
%FF262D2C2D2C57A8FFFFFF57572D572D572D2D7CFD18FF76204B444B204B
%444B204B444476FD13FF7C042D262C7CFD06FF572C2D2C2C7DFD21FFA851
%042D262D2CA8FFFFFF582C512C572C2D0483FD18FF4B20204B2044204B20
%44204B2076FD13FFAE52262D262D518383A8A7832D512D2C58FD23FF7C2D
%262D2C2DA7FFFFFFAEA857572D572C51AEFD18FF76204B444B204B444B20
%4B444476FD07FFA8FD0CFFA72D042D262D042C262D042D262651FD24FFAE
%2626262D047DFD05FF582C2D2C2C58FD19FF4B44204B2045204B2045204B
%2076FFFFFF7D7DFF52A87D52FF7D52A852FF527DFFFFFFA852042C262D26
%2D262D262C52FD26FFA8042D262D2CAEFD04FF512D2C2D51FD1AFF76204B
%204B444B204B444B204476FFFFFF52A87D52A8FF52A8277DA87DA85252FD
%04FFA87D27260426042604517DFD28FF7D04262626047C7D7D582D26262D
%A8FD1AFF4B442044204B2044204B20442076FFFFFFA8275252527D52A852
%27FF52A85227FD07FFA77D587D58CFFD2BFFA82D26262D262C042C262D58
%FD1CFF76204B204B444B204B444B204576FFFFFF7DA8FF7DA8FF7DFFFFA8
%FFA8FFFFA8FD3AFF7C51042D042626587DFD1DFF4B442045204B2045204B
%20452076FD4DFFCFFFA8A8A8FD20FF76204B444B204B444B204B444476FD
%72FF4B20204B2044204B2044204B2076FD72FF76204B444B204B444B204B
%444476FD72FF5244204B444B204B444B204B2076FDFCFFFDFCFFFDFCFFFD
%FCFFFDFCFFFD2FFFA8512CA8FD7BFFA82D588304A8FD2EFFAEFD4CFF27FF
%832C58FD2CFFAE5151A7FD4BFF2D517C04A8FD2CFF047D7D2C83FD4AFFA8
%7D58A8FD2DFF2DA8CF047DFD7BFF26587D26A7FD7BFFAE5158A8FD7EFFAE
%FD42FFFF
%%EndData
endstream
endobj
966 0 obj
<</Length 65536>>stream
-%AI12_CompressedDataxœì½ë’$Çu ùùµ?dFš-ºÂãܵ5««³CF3š•ÁŠÝ°G}ú"‰óôëçò?žÕ€@Jfè$Øíž‘™áŸŸãá_Æ_ý¿ùò³«oÿðøÙôl¸8ýÕ_ݼ{|øðöݯ.´öâóW¯>¾ÿðNª~ñÛ_^”úªú¢«Ï÷¯ü…ÿõñÝû—oßüJŸz6Ö'ïeë_üõËW¯ß_Ü~üÃÛç|üðË‹_ü²>÷»—^=Ög?üéÛǯ><|óþÙÃË_ò®u7·êÓóe™.Ëp±ÿjX.~óëúüõÛo^¼|óÍõÛþÕÅgã¸]|vež.Æi®Ïÿ§—¿}|þ¢õÙR_¶×ÿ/óøl9†½¾zz¶Í{Ýâöíó¯ß|øÍ»·Ïß¿¿yûêí»÷¿º¸ùÓÛ‹_?|SŸy¸øï¯^½ý§‹ëWÏÿ>mrÿö͇úÒ_ÿéݡuûÏ~ûøÍÇWïÒKþæññÅã‹ï~áÕçËW÷/_=ÖcõúáÃÅ!Gõêó2~uýñå«óñõëAœå»]}>}¥Ÿî÷ïëǪŸPþ-ÕÛWŸ¿®5_>~øP¿t}i™ßþõuþFµR¿ø»úÖ/µ!ëQþ¿ôݾ{ûíë‡w_·ýl9äh£üÿ¬Gn®5öºß=¾þöUm=°óPŸåÕñ/Uý>~è§Z¹,ãÅgSÝÉ:mÛÅTŽgó¼Lõ;MϦuœl›Ö -ÿøòñŸ~uñ7oß<Úá¹z÷áË—ÿ«~á}.ÏöýØ/–cy6nËjÏÿöã«Çw¿óRŽ°Vv˜~ýöÅã«Úc/÷¯ôè裴ÿ·üîáÝ7jïyûêãíÈûàOÕfø/z”n±Ø|ñíã›ß½ý¯úI?÷åÙ4-óEýŽã°×ãQ¿á¸^”e?.Žµöº]ßlÞ†‹iå틾¹:ÙŸì·ÙäOmÅßÔvýâÝËo^¾ùÕgSíèµÃ[‹ÿõ»—/ZƒoãÅnÿ§_èÙžþ;øÏ>y=><¾ñãR;ÚͯSÇžýúËú¶wo^ܼ}-íñ^ιÚcÞÔÎôêí7ö\ü[Ÿ©›üöôw§é¸ü‡o?<¾¯ûzõX¿øå7ïþññ¢ŒûåÕ‹—ïê3ï/¯ÞÕ§/ož?¾¨\x¸¼{xþñÃãåß|¨½ýñò^vºü}lñ`/yн]><ù®v•¯_=þóåC{mÿ ;ÎÎuËÓå£mú˜6}ŒM_Úî_Úk^¦×¼Œ×¼ÑÝŸ.ßÚkßÚkߦ׾׾µòÑ^úÑ^ú±½ôtù1^ûâá›oß]¾¨ðññòy=Þ—ï?<¾{%ßâýãs醗øXùùáòÛ‡wr¾ýãeÝâõÛxUÒ;=™ëÞ^\>ûmÅË7üpYOîr:_Úgˆ·{öæí‡__^Ý]~ñþÕÃû?ž¢êÛJ÷×/ß|l/âï?=¾¹|ýñ¼úôäuüýöÝ‹¯ë®^¾y”¿~xÿüã+)ð‚‡ZïïþßË—|ñöŸÞ\>þóóW¯õŸµw½|þðªn[}]Ïè—ož~Œo>ÊøòúmN¾þÐJv$*¶_~+ßüý·Ï/¯¬1®¼³ù_w—o¥¼yQ?ÒåãkýK;r=ĺS -¶O-µz«|ñò_J‰ƒÇü¿Ç¿¾~÷`-z÷ñÝ[ý¤z¦ÄçÖ’îîtùõËú…½{Ôw¾ü¶¾ÏÛÒA´Ûyö‡‡÷ñµP_úáo?¾¯]äty•ºè]ú÷•õŒ»øpwvh>·úÏswý<^ô¹½è{Ñi|ï/ì¿·Wü>ïæ÷öÔi©÷ï_^¦!^?<'ý½Ž -éÐýòù§ÞàÏÇ;ÙsÆ›ÕðîÝcÛ^‹üýº¥žÙ/ß¿n½1ÕüFÈóüÕã—ª!Çëyo·_׬&6½{ó¯Þ~›>dÔÔ!ëâ¿=¼ûöûv-ÍT‰ù¢ž!z>·Ãøöõ·’÷]|ùLJoõã~øã½¾òËÐ_=¼©8×úØ¥à§ößʳIV;]„û}Ÿ}ö=L\.®ß¤§ÿZ°\ǹ_É®ß<êg°š‹òËÓ'ê*sÇ‹ë5àþ¿Oƒü)Ã4ÌÃ2¬Ã6ÃÕp=ÜwÃ})¥ò¼,e«ÇQ®Êu¹)·å~Æ2Žã4Îã2®ã>ãÕx=ÞŒ·ãíi¼ï§aªÙñ4O5_›öéjºžn¦ÛénºŸkú\SÑš¾Íë¼ÍÇ|5_Ï7óí|7ß/ÃR–q©iв.Û²×íj¹9-·ËÝ:¬e×i]ÖuÝÖ}=Ö«õz½Yo×»õ~¶²Û¼-ÛZ“ž};êãj»Þn¶Ûín»ß‡½ècܧ}>íó¾ìë^_·K.xµ_×ÇÍ~»ßí÷GýþG9ê7:¦£~¼c9ê{Õýí‡ü¹:®ëã渻ú¸¿ªGëtUÍU=WÓUý>WõS_Wõ\Õ}_Õm®äÏu}ÜÔÇíÕ]}Ü_Ý_ú¨õº¼ø»«Óu=(×Ëõz]¿ƒ|¸k}ÛkÝǵü¹©Ûú¸»¾¿¾¿©uS[æf¼©‡ùf–Çéÿim;zëZûîÑ·Úƃ¶òTÒÒk´5}§í-->¢É·®ÑÅ‹·ùâ¾OGjyiû!µ½¶þé;šIàz¹‘°Ü×>@/˜½œ÷„»“wéSí¹K\E—ÐNÝB;…÷‰Uû„õ -é7§Ú-´c|²k,Ú5¬s\iç¸ÑÎq×:‡÷IûFí'í»v -ë·Ú%¬CÐrëÚæ7µÿ¥¶í[—ö•Öµö]»óÙÛøä<~¢ieÚùûZúÖ[ºœjc·¦Þõ¿óÓ½oñÖæ´º¶»¶|m÷“7½5þyó; -´ý
Òä¿Ö¬'€‡«“v:„q‚.!bÒNA· cÐ5è§Ú=¤ƒXG¡«´ÎK¤Ã|OZÛþ„þB;,ñоU{ªôÕ9ú«õXé³ÇÉ;í9”æ³ÎzƒÏ¬½Tú¨QHú¦ôKé•Ûtœj‡”î(Ž g½OúÞmíw¥ö¸¥öµ£ö²ÛÚ»ŠŽ+›v%éF÷µûLµÃ쵓Ülwõ#Nûrªàп¯-;ÕvÜkËÝÖ“|¬'öZÏçë«ÛzõÌÝj£Þ\ßÕ¯3Ý,µ—\ÝÜÜÜÝXÛÞßßßÝßÞßÔ3ùêþ¨g«}v¹Ÿï§ûñ¾Üw÷www·w7w×u˜8jçÚ*Ö–»¹t¼+wÃíýíÝíííM¥ÿ•ôšSåÓv»Öse®'ßx[n‡›ûún·õ=¯ë;õý·zz,uT˜êQn†J‘»J“›J•«úI÷úy×ú©çÊ:®‡ -£» -¥›ú•®êÛë¹²Ö“r®+͆ã¾vÕÛÚm¯k>êØêáXj'Ÿj‡/ÇPχ;åæM=K®Nõ¸íõèõTšë¡ë 6TþÞÕÓ‚Wõ„Ø뙹ÖC>ë9[¶¡žÉwµ)nê¹}Uf¯Í³ÖFškSU”u¨\¸«wSÛðª¶ä^Ûs:׶kó}eÌmeÍum÷Cù³V͵7ŒµOÔN8ÝWTÝÖ^r-å¨çûVy¶Ô4Õ~T¦a¼¯½ê¶öëÚÇŽÚÓ¶JÅ¥ö»©ö¿2å¾öÇÛÚ+¯ËÕ¿EÛ¶e¯k¤òÓ´¬¶«4ëé§lWiÖÓm×ÖªÖ¨§Óª•;{Ù~lÛ~²uÿÍÏÛݾÿšóö{[ødMüÓµ0çí8skÛÎõÕõ»šÉ\Ô2\”aš/OõUª¹~*VŠg£\Ÿ»¾4ŽDë‡ehã'2´Q2´92´E"%5¶³Aòv¸×üL†ÉÑc»M‡ÊÝc÷ëúoå‹z`'ƒ¦›§z$dä”±s×ãcÞExãY”7i”'#jŽôöR¼w’Oƒ>yX‚7i{-.Z(#±ŒÅ׳å*·Êãޢ“†Žò°}-,J¸¸iȸkØhÿx -îyä—è7Ú®´X,ÚôŠs]ä$8ltöØŸ"玞G7JŸÃé³iΚ]iÖóÞÛ6“Sw=ÕïayZ}»zPzd ‘¡F›Iûl>è #ÃŽ
<2ôÈàs¥Ùç®CB2-z~ÙP4ž´×:"ɘ$£’ŒK22Éؤq¥„o’Õ!J)¦fíí£>.ƒYuÐ:é¸%#׎^2~É&c˜Œb›Žd«ž}vÎO:¦ÞmÛîu|“îö¤ÃÜ͵ý¹ÒáîÐ!o×aO¾U¿EÀYÁIBæRä¡3,’ZKàs¯Ãc}h_õ}ßøãÖwñ°d“+CL±Ø4É2áâßl‰Çê-{<Žx\ŃÏâNõ¿Ûô¸‹Ç=Û!%=ÆxLé1Ÿ´ í±¤Çš[÷Ø»Çqþ8i_ñ‡Ô'4Ÿž¨›¾c^†©ºÑSïõôStÅç`òäÜ•'Ò5‰Ö™—âóq2S.§<ãò½ó-ÝŒKš[[¼M
¯NÞ`·Ö.Þräí0ÛAµÃ'ï+ìFÏ79ïîå,Ô³Q˜!§ç|ªçé¢zÀZtRG¬I"5HÉøTÇ&
,ôµ˜hÖÁFb¡kZ–J €NŠŸ+&†úaê™XãŒÍ‰¼¤ì6¹Tóó˜^5/¿©ß×BŒ–‘Ë|‘ÄA0|{’pAcËÉ7n5/·‰-ÅNFOO8)N¾rÆ´Hy¢8KA¤Òì/;cS+[[_iójãjÓZÃ.Þ¨‡7¦5dÑ&œµå¶SÅïQYs]?ëmô½„k[Iˆs¿Ú7=)ßìS$ý,=u0½¦TßSÃ3´¹Ìlz®f·)$#›|²ŽéºíäAá³v>o—;°ž„9¤ZÈë;îœ07š©\ë¹}¥çø¡Y‹>Nž¾XA 1k01i@¡!…=dŠNƒ‹;Ÿš¸UÛˆrE¸±k³錟³¢hÒA»† !ˆ%A·ŠH0r³dפHÓ¢“gF‘ÉC£”§\{žd™’Å,–/YN¬‘‹'Mw'Í›,sºò×ÒÓ§so2ÎëCGüáúì±ûãÐÿ·i¹ú8é_s÷`Ïfòòü^ù©¦ÿŒ?ÿ{vh¼¶Œ«]‰ž%Ó:4À¸ÑéÈQÃ:AŸ¤RrVßi5iÒdés‘:'~ªç\û²©p;¿f’”læJ§%¹ä5ëÔ¤ôGGïtzÒÆPFÐë“ÌSž
žŒœ:j¦1“ñ2FK¿J!gçâ#¥“2R2J¶1ÒFH»kOçäLì<9<'> ÎÞÌÏâNúË -_V8¦E…ƒõ¾’°Žÿ'
n<,¸ö¶dõë¡1„]£[5²˜µ…íaë`ƈD$*©Éæ`Øb9Ì/‡¹ópÆÅø(ÏׄOÆÉ~½>{¤Ñ÷¤–úÇùŸ~l¿ïGþ³¨ <
Æ>®Ð5QýcyòHË)þ¹=yìùaK¿{Ùáw,:L8nº‹û‰ž|úúlÉa -GçXFq‘~ÇjC¥>¥‹öyÚ÷,¦è–¢µÅh¶¾ðæ”–X•fëÒVï(Ú!ôøÄòþ¼ÀÿJÇÖ›65í«ûóâ±óUý¾xìäSÕ?hõØw®öh.ÊICïZðáK>b2[¯g¤ í¼îÃW~œ|ñG7«×ºÛĶNmŸE?rÀý Çnâ‰}DÒ‡?n?ßEü9¿jÐ~gÇï£F¿yûêï.nß~à7@jÌñ´îb|VÆå¢<Ûš ÊEq)nr]z]êWü¨ÓWßêüCñ_ùÛ?iñ?×þÏZùOóů/þî/´þo[ÿò=±ã×µª«ÿ5þnZÓ€\•·{£ïóÅXð·ÿÖŸñk?zG/ÿôœ¾ýZžmò‰ëÆëR?Ük¯;¤fÙK¹ÐWÚ,˸ÎZž×UÊóZ»ÛsÛb=|=Ã:NòY¼¬¯Ý¦îKßeš6YêÑ’*YÖ,/™÷q–r=ƒVÝd²öáíâƶ™d{©+¶I
R¤X?Q±]ÔS®–åCø»Ý¤jÙ¦Q_2¯»–e¡„–í]êâËÔPh•ºš¼ìúšJ9)×fÖ/·”Aߦ+{€¡žÚëQþ´ÚAÛ')WHlR>ä'ky™7ŸÚª“ÕMG¥G-O5–ºX÷ú—UÊË2mZ.›l“¾bßyAÝÙÁ0Êñ˜êZ7-×Qζ˜êá]©+è¯ -Ô0K¿â!ãž³žÐ{íûV^´¼Õpƒm¬ÅêW¬¹¾f·CR75ö웂ÚEœ’ûhU
Kô%5¨Ðò4Z^ÖÝ€V{¯ls_ÿ[æz,=è¤nœ‚tR,c#]-5qëH'u£}bíÐK=Ö‘NÊe^3éjÕ¾ÎtR.K#”§¥'Ý"§å¤“—ŒK#–‡Žtº×‘®–
ÛN:-/=é¤N“NÊÇØH'ûœ§žtòç¡‘NZi¤«åÑɤ«uºtµ¼ÎS#Ý"'åÚ‘nY*PfH·È¯½tµ<GOºZ·G#]-ïãÖH·Ôèk(éjÕ(? éj¹¶#<¿=éjݤ„wÒÕò²tµ¼KOºZ·KnÙž
õxC:)n¥'Ôík#–kuµ\äËfÔIà -ÔÕ²\÷ ÔIyzÔÉ6ÇÐP—ö!¨“â´ô¨“º25Ôék¶†:-¯=ê´nj¨“ò26ÔÉ׫§`‡:9ÛÞP§íY꤇ìSºÚ‘]Wi¨«E™x Ôi¿+=ê¤on¥¡®–kÜÑPW˺mFôqÙÔ)[¶†:-ï=ê´îh¨Óófj¨S
ê„5ÇÑP§å½¡NÊûñu5Ϙ§£#T-먓ruR.SéPWë¦u˜uR†=PWË£…ë®Ö”cÛƒtR®í¤“òºéæÈɳË1ä´l
ÈiU™rR.(…œ”{ƒ€œd]ÇQrò‹î”qRÜ,"ÆÉ7Û¦#§GkÞƒqµ¼J•WëöÁê”qµ|Ô*7ËÙX»vb\š‰ßrµ¸X•qµ¸BãjÝQ³÷`ܼ?½(WËÓ4/äjÝâq–B®–õØ -é¤ìçNnÓC7éäDí„RÒm’· ƒt›æSn×¼µ‘n×¼uìH'sü»ÅFJº]òÖaÒíš·vA]ÅSí¤+¨;4q-:™ª?kºC×}
Ôš¸.
uÓ̵Vu™k-w™«<ž¹–¡Ï\ËÐg®µü$s-C—¹–Òe®R<Ï\¥.g®ZN™k)O3W©Ë™k-w™«”Ï3WÙ&g®iʺò4s-¥Ï\õ5)sÕòYæªu)s•rÎ\Kyš¹–¡Ï\¥=å«ÃºãiâºkÞZ@LÀ¯FGEÝþ4oÝ%-GN§Ë)H·ë–sG:ÛFÙ”t»¦cnš¶J9§€NΚilÝ®Yë˜A·kÖÚ"º]³Ö)@·kÖ:?¬õÔUx™tƒæs›¤$Ú¶-X7Hæ:ì}\§?s´·ÜuÔUÓnÜu0¬‚;Ç6®wƒ¦¯@Þ ùëñ`'=¾vÏ´4ŽŒ;©+rúÁ»ÁŽh à
Ò -»1ˆ7ØAlÈ“~9¬÷*óÉc·¥ÏdMd`J½A3Ùqì
šÊ–µãÞ ¹¬ìðÉ×UâFŒ§Ùléb<Éfç _é²YY^4YzÜB<If§Æ½Q“Ù¹e³’ÌÎ[ŸÍJ2kl´lVQiÙ¬$³ËY6+ÉlŠñFï×–ÍNšÌ–~ÊN“Yòdš³ö#?J:g'ɬ
RmÎN“ÙÒæì$™]–6g'¹Ñ´ösv’ˆZ²9;Ifž6g'ɬ•Ûœ&³S›³ÓücŒ9;Mfç~ÎN’ÙmisvÀƒ9;Mf§~ήOf'Íe[2;=Íe'Me÷„L˸µ¯ÆZŒ×å²ÛaÚ‚{Òí–áØ;òI眎Š¾A“Ùq
ö
šÍÚ<`ÀON·ŠÌA?9Ê<¬?á.P*E‰f +
endstream
endobj
1370 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1308 0 obj
<</Intent 1371 0 R/Name(Guides For Artboard)/Type/OCG/Usage 1372 0 R>>
endobj
1309 0 obj
<</Intent 1373 0 R/Name(Base)/Type/OCG/Usage 1374 0 R>>
endobj
1310 0 obj
<</Intent 1375 0 R/Name(Class)/Type/OCG/Usage 1376 0 R>>
endobj
1311 0 obj
<</Intent 1377 0 R/Name(Trait)/Type/OCG/Usage 1378 0 R>>
endobj
1312 0 obj
<</Intent 1379 0 R/Name(Package)/Type/OCG/Usage 1380 0 R>>
endobj
1313 0 obj
<</Intent 1381 0 R/Name(Object)/Type/OCG/Usage 1382 0 R>>
endobj
1381 0 obj
[/View/Design]
endobj
1382 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1379 0 obj
[/View/Design]
endobj
1380 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1377 0 obj
[/View/Design]
endobj
1378 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1375 0 obj
[/View/Design]
endobj
1376 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1373 0 obj
[/View/Design]
endobj
1374 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1371 0 obj
[/View/Design]
endobj
1372 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1307 0 obj
<</BaseFont/JEFNSX+MyriadPro-Regular/Encoding/WinAnsiEncoding/FirstChar 49/FontDescriptor 1383 0 R/LastChar 102/Subtype/Type1/Type/Font/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]>>
endobj
1383 0 obj
<</Ascent 952/CapHeight 674/CharSet(/one/two/four/five/six/eight/c/d/e/f)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 1384 0 R/FontName/JEFNSX+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>>
endobj
1384 0 obj
<</Filter/FlateDecode/Length 1244/Subtype/Type1C>>stream
+H‰|SmPWÝ%ìF*MÛÄe4¡»«µ#"b(‚¢8 +6cˆ3~u &jÑ’v¦ !:T,~à h2UÛ‚+h‘ÅÔ¢‚2ѱTíön|™i7ôOõÏ™{î™{Î}oÞñà ÇñYiéÕyKsö9Ne4,Û¤ßU^¢5D†Wàüü`><”B+ãåË—Ùô½·ßè ~&Å‚püÞãTC™0»k·™]‘˜@å,&D³q±±±³¨d×ë…zV½ßdÖï5±™¥Ec™Á¨5ëu1ìú’vÖÂÄõ&½±"Ðüw#–3±zμ[odµ‚¸‹æzk6juú½Zc1k(ÿ¡;ÿ'ŠåJYÁ‹Õ”r¦6M«-Õ-\³)E†òR³‘Ó›b–§«s÷—éÙU¬N¿ÃpLŠcT¶ + ®«¥=U“¨xsëÑ2¦<ƒ¨<×W9¢€…/ž‚lL{=¯i+*hÌS˜Ú¬˜6XM€”X† wbFñ¯'á¤àôERUå¶Ï÷1‰§îÑlž“µa[š'GÉÓÂÇ BAšô‰Ss9m m% +÷6ÂQŠ| WZœ' $ZFt|ò0”TJ]^83)sóK|ºd»Ê.¤(PHDŠ·3hÉt$„Üë½Øsšv²u Ä]ÒzÞê¾,çÇÅJuÐV}¨š–¹³ª4E*Ų‚±ßÿì¹?ýS×ÖÜfÆa±°È%X†aM?,êÇ]Á9!â¡‚ªm´7“{F+ÑÂxD¢á„¨Ñž–ÃtU?q°XgÉVÄ¥¸a®•±÷S7\cÏN)smŒ„>Bü $àã“"Hãã!d…œßùjàÎé–Ï>m¦›†ˆ†÷5+ +·T¼‡)ÒUå¼'7gdúã…Çéô½Ó„¶9a¹Óíô›H>«e×û
ÎïêÏÔ‹éã;Ò>9üwhÈà+Ss§êB_åçñoQÿ0 +%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 13.0
%%AI8_CreatorVersion: 15.0.0
%%For: (donna) ()
%%Title: (type_tags.ai)
%%CreationDate: 4/4/11 7:44 PM
%%Canvassize: 16383
%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5898 233.748
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 9.0
%AI12_BuildNumber: 399
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_TemplateBox: 40.5 29.5 40.5 29.5
%AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 6
%AI9_OpenToView: -239.25 83.5 4 1355 732 18 0 0 43 154 0 0 1 1 1 0 1
%AI5_OpenViewLayers: 777777
%%PageOrigin:-399 227
%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
1387 0 obj
<</Length 7484>>stream
+%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5898 233.748
%AI7_Thumbnail: 128 104 8
%%BeginData: 7336 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF
%53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59
%2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF
%FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E
%A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9
%7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9
%AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F072F062F7EFD23FFA85906
%06062F282F0629062F84FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84
%28062F282F292F29302F30292FA8FD21FFA8530629282F2F2F29302F2F29
%2F84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04
%FFA8280529282907532F53292F292F072FA8FD1FFFA92E00280629062F29
%2F292F292F072FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF
%7DFFA852275227277D27A8FFFFFF530628062F5AA9FD04FF7E302F300753
%FD1FFF7E05282FA984A82F7EA8A9845A2F302953FD1EFFA8AFA9AFA9AFA9
%AFA9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA800280628
%7DFD07FF7E2F292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684
%FD1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF
%7DA8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282853FD
%0AFF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06
%FFA82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD
%04FF595AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8AF
%FD13FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFF
%FFA82F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12
%FFA828052828FFFFFFA82F072FA8FFFFFF2F2F2829A8FD1BFF8428052806
%59FFFFFF8406292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8
%A984FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328062953
%FFFFFFA82F075AFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15
%FF53002806A8FFFFFFA82984FFFFFFA8062F0653A8FD1CFF7D00280659FD
%04FF532FA8FFFFFF7E29062FA8FD1BFFFD04532E5353532E535353287EFD
%13FF7D2828282FFD09FF532F28297DFD1DFF7E28062853FD0AFF53062953
%FD1CFF5300280006002800060028000053FD13FFA92828050653FD07FF53
%29282828FD1FFF28280053FD09FF7E062806A8FD1CFF2E05002800060028
%000600280053FD14FFA8052806282E7E84AFA87E292F282F06A8FD1FFFA8
%062853FFFFFFA8A9FFFFA87E282F067DFD1DFF5300280628052806280528
%060653FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF
%7E062F28280628012EA8FD1DFF2E05002800060028000600280053FD04FF
%A8FFFFFFA8FFFFA8A8FFA8FD07FF7E06280528282806282828057EFD23FF
%5952FFFFFF7E28062828280053A8FD1EFF53002805280628052806280506
%53FFFFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A8282800060006
%002828A8FD24FFA8A8A9FFFF8400060006287DA8FD1FFF28060006002800
%06002800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E
%597D537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628050653
%FFFFFFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E06000600
%280006002800060059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF53
%00280628052806280528060653FD72FF2E05002800060028000600280053
%FD72FF5300280628052806280528060653FD72FF28000006000500060005
%00060053FD72FF7E2E532E5352532E5352532E537DFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CACACA
%A8CACACAA8CAA8FD74FFFD0DCAFD18FFA8A859595883A8FD53FFCACAA8CA
%CACAA8CACACAA8CACACAFD17FF7D2E0B2E0B2E0B3434A8FD52FFFD0DCAFD
%15FFA82D0B052E0B340B340B340B59A8FD29FFA8845959535959A8FD1EFF
%A8CAA8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D342E3434
%34123434340B59FD28FF7D2F0C2F2F352F352F5AA8FD1DFFCACACACBCACA
%CACBFD05CAFFFFFFFD047DFD0DFF2D0B0B2E0B0C0BFD07340B59FD25FFA9
%2E2E0C2F0C352F352F352F357DFD1BFFA8CACACAA8CACACAA8CACACAA8FD
%04FFFD04527D7D7D275252A85252A8FFFF590B0B2E0B345FAFFD04FFFD04
%340BA8FD24FF2E2E2E35358484FF5A36355A35357EFD1BFFFD0DCAFFFFFF
%52A8522752FF525227A8A82752FFFFA82D052D0B2E84FD06FF340B34120C
%2EFD23FF522E2E2F0CA9FFFFFF5A2F3635362F3584FD19FFCACAA8CAA8CA
%A8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFF84052E0B
%2E83FD05FFAFAFFD04340C34AEFD21FF842E2E2F2F5AA9FFFFFF5A5A355A
%365A2F5AFD1AFFCACBCACACACBCACACACBCACACAFD12FF5805052D2DFD04
%FF830B342E340C3434340BA8FD21FF59052E2E35A8FD06FF5A2F5A35352E
%A8FD18FFCACAA8CACACAA8CACACAA8CACACAFD12FF7D052D0B59FFFFFFAF
%0C340BFD073459FD21FF2E2E2E3535FD07FF5A35355A353559FD19FFFD0D
%CAFD12FF5205050B34FFFFFF84340B340B340B340B340B59FD20FFA82E06
%2E0C3584FD04FFAF845A2F352F360D59FD18FFCAFFCACACAFFCACACAFFCA
%CACAFD13FF7D052D0B59FD04FF34340BFD05342E2E83FD20FFA9282E2E35
%2F35A8FFFFFF5935355A355A353559FD18FFA176A176A176A176A176A176
%9AA1FD12FF7D2D050B0BFD05FF595F59340C340B2E0BAFFD20FF842E062E
%2E352FA9FFFFFF5A2F352F352F352E59FD18FF4BFD042044202020442020
%2076FD13FF2D2D0B0B59FD07FF2E342E340B59FD22FF062E2E2F2F36A8FF
%FFFF59352F5A35362F2F59FD18FF76204B444B204B444B204B444476FD13
%FF7D042D050B59FD06FF340B2E0B0B7DFD21FFA82E052E0C2F2EAFFFFFFF
%5A0D352F352F2F0684FD18FF4B44204B2044204B2044204B2076FD13FFAF
%58052D052D2E8484A884832E342D0B58FD23FF7DFD042E35A8FFFFFFAFAF
%35352F352E59AFFD18FF76204B444B444B444B444B444476FD07FFA8FD0C
%FF842E042D052D050B050B052D050B2EFD24FFAF282E062E0684FD05FF59
%0C352E2E59FD19FF4B44204B2044204B2044204B2076FFFFFF7D7DFF52A8
%7D52FF7D52A852FF527DFFFFFFA858050B052D0B2D052E050B52FD26FFA8
%05FD042EAFFD04FF592F2E2E53FD1AFF76204B204B444B204B444B204476
%FFFFFF52A87D52A8FF52A8277DA87DA85252FD04FFA87D2D0B0405040505
%2E7DFD28FF7D052E062E06597D84592F060C2EA9FD1AFF4B442044204B20
%44204B20442076FFFFFFA8275252527D52A85227FF52A85227FD07FF847D
%597D59AFFD2BFFA82E2E062E062E062E062E59FD1CFF76204B444B444B44
%4B444B444476FFFFFF7DA8FF7DA8FF7DFFFFA8FFA8FFFFA8FD3AFF592E05
%2E062E065984FD1DFF4B442044204B2044204B20442076FD4FFFA8A8A8FD
%20FF76204B444B204B444B204B444476FD72FF4B44204B2044204B204420
%4B2076FD72FF76204B444B204B444B204B444476FD72FF5244204B444B20
%4B444B204B2076FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD2FFFA82E0BA8FD
%7BFFA82D58830BA8FD2EFFAFFD4CFF2DFF830B59FD2CFFAF353584FD4BFF
%2E2E5905A8FD2CFF067E840D84FD4AFFA87D59A8FD2DFF2FA8AF0C84FD7B
%FF0C59840C84FD7BFFAF3559A8FD7EFFAFFD42FFFF
%%EndData
endstream
endobj
1388 0 obj
<</Length 65536>>stream
+%AI12_CompressedDataxœì½ë’Éu ùùµ?dFš-QáqîÚ˜ÕUÃYQ¤±ÉÍÊÆÚŠ@u# +±ÖWõ8~ýîùÇøºRïÍãÛ§zÆøêckÙž¨~ý|óß<¼|¼¼²Î¸òÁæÝ]>Éy÷ª~¤ËÇ·ú—事u£4l›ÚjËmá«×¿-$vZìóÿÿúêýƒõèݧ÷OúIõH‰Ï-ÝÜéò«×õûð¨ï|ùM}Ÿ§W2@´¯ÛqöÛ‡ñµQ_úñwOŸ>Ô!rº¼JCô.ýûÊFÆ]|¸;Û5?³å?ËÃõgñ¢ŸÙ‹~a/úEÚßûöŠßØ+~“7ó{ê•ôT=I_¦µ#Þ>¼|/ã½r__öðR;¤íˆ>]þîÓ»¯ÞzûæáÓÇzÖSÃ?\¾|¨ë~}§,]þÓ—¿þPO í¼1}©˜º{÷òINò?½øòÙYõ3çÙ¿¿|þ²Ëç+ÌýÿÚU6ò6ýºF0§¿/kñcü¢lÓeÝWÿøéáMm¬—¯ß}U•HG ì}Ah
xêΗƩìEÄ +‚¯Þ¼zýÕW—õ‹¾ÕÓòå7ïŸ^}zY1ñºnñ£ +ÜáæþæîæöæææºÂà¸Ùëð^ë±3ßL7c=Û×÷×w×·×7õ3]ÕO¶×Ï·ÖO9×Ï:^—ÓõPOwõãLäŒrÔ¯³Õ/µÔ¯6Õ/X®†:`ïêð½©_úª~õ½î€µŽø¹Žþ± C=.îê"§À+ÙS{=€ÖºÛæz\õøê±vW¹›zô]Õcd¯»·îñº›çº³ÇºË‡J㻺ûoj'\Õ®ØëÓkí–yNõ¨/ë°Ü×Þº}v]{î¨ý·Õ^\j_NµGË2Ì÷u§ÝVª\×¾>joµß—Êœ©†e¦û +£»Š¤›SeÓU%{+k3s9c¥Ø0Þ×±t[GÔu=:¾¶J¼¥Ž¶é_×—ŸíÉÛýôÃöäõpŠžüúQºñô½úñ{õ¢uâééÅÚ‡táéû÷a=‹•q(÷ÿ›ôåyož¾çQù½{óô“Ñ›§?刴ެ}9_üÕ—×ïkr"E¨e¸(à K¾8ýÕ—iÉõ‡S±V<íú\¥5i‰Ï÷˘ÆÏdL£dLsdLrž#?"»©';Nwr›ô„G$&§="ëC#„kÏœêÐ;•ûˆËä\(gC9Jt&ñÚ•î³Ó<êÖÿîõl)Q›Ämõ¬yÒàm®;~Õ(Aœ„qÈ]i0'áÜö•üÿ²ô^Ò‹³žÜåÈg9i~&áÞìÿ¿¤Çª!à¦a ýÿ®á¡Aá•ÿÿ•ž°¯5³»>Å?ëC_L»nkÕ!µø»MúÞ:¸ä¡Ó7þ¸ŠÇîú•Oõ›/>ðì잺›|·Éã&WñØõ!»|Õ‡
ÍIòÚIûÇÒgõQ»O»ÑWñØÓ#b]³©”S‰?2nâq›áº{\é˜ã±?NŒùCwªBhQÍ’$^—`‚?>WAØ#ÜQêH$ +‚á¤aý¦,wš¶Xêr£ÌÐò§½‹æ6-ÒZ®[<£™4Â5ˆªCÿäé%8r\kØq¥e@Kv,ݱ”Ç’žQK‡zÀh@bé„%×'Ï‚,²LÈr¡)E)–ÝúÙãZwå¡rÓ½¼x\÷ýIc‹^,OºõèV" ÿo:{ŒÝcèšRÜ=
Oú×µçößU<d)Ù‰=rܸwÍ*w'/ßNî^Ö£¸·¤R_‹3û·ÖzúŽJkþÜJþïö¶éߧ®Ðèÿ2Þ*%ëvI®%¼FR%ÉÔáé“”…~VZ4ôÝzm±Bï¤Çœ—³õèšj/oÚçVƾӪ]xÚ£Z}ç¥ÆY‹»–o멳œê æ2ƒœ4ë S;UÊQv¥§H;=NZ€Üô +²Ïíáô¹XÛNä$S$RG¤PK$OÀw^â{Vä;}kÏ+}Ÿ)ô}g©ïäµ¾ï¬Ü~G©ïY±ïôýj·ß¿Øwú\µ¯+Õ½½âð¢cöy–Tã©ÿX÷±ž&eöò2ƒ<uåXËÅx^çû6wýA6nó±Õg•ÂKýGÝÒº–¼©£"·Û´VTÿ1mu‘ljž^Ó~±•SÝùíþ°›ÕO:Û¢ßp\ö¢3¼ëYkÚó7ÿ¦òÕG™ü=Úwׯ<Õåu,å½øÃlP?Ý:ó®ëîÃ2É7ê+·)omâ{n²Ùì6/Ú!ã P/Rÿ@ÛûSŠ½¿ªÿzxÓOy¾ì¢üezÌ_¦ÇüezÌ_¦ÇüezÌ_¦Ç|çÿ2=æ/Ócþ2=æÙ)™óï§/ÿ·›ó]Ó_þØÔ™qÆ4~&cûŒéúÙƒ¢ôu*S÷íÏ?§S*[QñÎíÏ=wý--ßàùg:ßìg +U»4;ùɹH.&'è—fõZú•Ÿ©Û$3fêT3?kG,çn‹Å-âl2×põÙg]E|˜§m°êkå°1ëg¯»¢+S×<Š†ë?ê‡)e·òk*–þ³jøR³VyÑzZµ>ʼVt-«nð–}—÷šëÙHß«¦´Ç(5áy}1¬ÛÜ×ê¸Mþ)‘ÉoÞ½{xûøêâkÂ}±Éç–vÑÉwžÉŸ={ô…}(q}|[û[bšÓgâ‘ÏÅSß7¥WœÎöÊ_E¯DLˆÄ%ÃSDå‡Ð£ÄôÐ+Ÿ*U¥I™q·ÝœÒÔP9ì·aK|½úq-G4¡õóAåØe6赨'=JW?B‰¨í˜´i Sšz«ôµ†Ò6Ùj²¤Èg|^—ãäStŸš[ê@´É¶ëmÎÄæ“
œýÆöQÙ.tïgk^Å<Í6KSâ +fÙeF?$ÕŽ¸Tº9öXfϞƳ™CmÖÐOüòI˜:7`õy˜ÌÁœbîå`³.õ”vë«‚Xe]¢±]ûœk–µïOÚý³ÿÿä!UðŠ†zð
ÿ»G?ô…:~<Tè#ˆgñE}\Ÿ=RÔrÒlýãüOÝ÷ÓY4Už‡[cé$¹þ±<{¤HïÿÜž=öü°©ªß>õ[&£v—¤ò4½"qÒBõ³©¨i"êìIÉžfÜ|~ªÎA=¥d#Ͻ9Ÿ—˜g&湉mv¢Í;½9¥I§%¦)ÚDÅÕŠÝ?zÙ©£)Mç¸5Ãõ6›péfâf¨‰q£áÐ÷˜Nøó~îÚ¼Ÿ“†hß6õÇ'ÿÄE)¿„óò ŸtòëLb*Ðuš$Ãâî,úúA‚’<Ê! +ûW‡s}öƒl¯?åç)Ú/3ùO™Ôhí—Ooþááâöé#?oRcµçË.Æe\.Ê‹ýXg!ÍMf!¬Ký¦Ÿ´ÌuõÖ³ŠÿNÑßýA›ÿ©þó¿×…ÿt1_üüâïÿÛpñJ—ÿݯê_¾%6ü¶.êßêob‰¿›.é?@^”×{§ïó‹ý¬¿{øÿû£~å;qðØ>Ô·þÃúÑÖòbÛäMÊ‹µÆYúÙdÙ!K–½”}Å¡=·Œë¬m™ÇSÛó:/mõð©/ë8ÉkÖÊ(}Í0è:u[ú.Ó´°ÊR)Y4ʨíygi×CnÕUië0ß.nl)¤é²b«õ©M¦¼¬Å6Q•MŽ•‰w4Ê¢E~ÜQÚóºk»3Ö¶w©[ˆ/3Oã*Ëj<ºëk*"¥]û]¿ÜR}›zNÚc•ëQ{fZm§í“´+G6iò뙵½Ì›¿OíñÉ–MÇQ×_Le¨_c¯ßxY¥½È$i—U¶I_±o‹¼à˜äQÙSý@ë¦ízŠ´5¦º{×C–•aÔ×#ô5síÕÚ^ëþ§ûl²Ÿë”eˆò’íXô»ÍuKûXVÝÄRp[g~!s{õûNòæõ,5êk6³Œú|™&Ö©ëë¢ÉËK¶¡h{߬YÏ…º—¥ç|m™´7˲èV·Y;s,•ŒÒ”ï*íze•]~ÇS:S"iÐ¥ÃÙµ½nÚ®£®³lºŽ\v½HÛ¨g4m>ì¶iŽOVc=Vkfd¯™õ55¯²·ê·ã·±Î>zÔ~·Vì@›ë Ò¯3.EÍuˆ=0ÍKÝN+³¼OíÎú}¤]ÏS‡‰žî¥}åƒfÙ}Í\tÔÔììÐMŒÒEõï¡pµ]C‹±
Í]ߦ~ñI^Sê9RÚöêatÈŒ2i—}åKËòq9Aê!0ë½×±oíEÛ[UXÇz¬~ÅèkvÛ%uUcϾÙ.¨CÄ )¦.ª1¾¤F$Úž†CÛ˺Ðêè•uîëË\€¥,§ 4ËØHWÛC͉;ÒɲÑ>±è¥rz†tÒ.óšIWíëÜH'í²4ÒI{ZzÒ-rX®A:yɸ4Òi{èH§[ÝéjÛ°í¤ÓöÒ“N–é¾sÒIûéd›óÔ“N¾à<4ÒéN+tµ=:ù‚tuY…n#]m×ÒH·ÈA¹v¤[– +”Ò-òÃÁC#]mÏãÑ“®.[‡£‘®¶÷qk¤[Vý‰èLººh”_™†tµ]û¿‘NžßžtuÙ¤„wÒÕö²tµ½KOººl?– ݲ½êþ†tÒÜJO:Y¶¯tÚ–ßÏvÔÕv‘/›Q'ËW ®¶åc NÚÃУNÖ9††º´
A4§¥G,+SC¾fk¨ÓöÚ£N—M
uÒ^Ɔ:ùzõìP';rÛê´?KCŒ}êQWÒ¡Sp
uµ)5@Ž»Ò£NÆæVêj»Æ
uµëfÔÉ—õA²ek¨ÓöÞ£N—
uzÜL
uÊ¢¡C°æ8ê´½7ÔI{?ž£®&&ótt¤“E˺ê¤]Ï:i—©t¨«Ë¦u˜uÒ†=PWÛ£Eô®.)’¢@:i×þ
ÒI{ÝŽtó +ääÙårÚ¶ätQ™rÒ.(…œ´{ƒ€œ¤iÇQrò‹î”qÒÜ,"ÆÉ7Û¦#§{kÞƒqµ½Jš•W—íƒ-SÆÕöQOTÁ¸YŽÆ:´ãê¢éøÍ W›«UW›5;ÆÕeGMýƒqó^wè°ãj{šæ¥ƒ\]¶xœ¥«mÝ7@®¶×q\;ÈÕe›³S!WÛõܾäfùŒûÞA®.ǽQ®¶ëª”«ÍzÚØ;ÊɲÑ裔“v±¡”“¶|ÝL9YVä Ü,?Uo‘–RNÚÓ´u”“e£ÅJ¹´
¡œ4WxPNßÚr ¥œ´7ƒ©RÎÖÙ:Êé2=”rú6v)ådeí('{²Ôñ +Ômš¸.ê¶.qÝ$o5l)é6Í[K&lTHé6¡¶'²B:iû±¤Ût×MA:9ÐG; ”t›äF ݦyë¤Û5om¤Û5o;ÒI·ØHI·KÞ:lAº]óÖ.¨«xªƒtu‡&®%P'¥úð¨;$qÝ×@Ý¡‰ëÒP7<Ë\ë¢.sí.s•çÏ3×2ô™kú̵Ï3×2t™k)]æ*ÍóÌU–åÌUÛ)s-åyæ*ËræZÛ]æ*íóÌUÖÉ™kÚ†²®<Ï\Ké3W}MÊ\µ}–¹ê²”¹J;g®¥<Ï\eGæÌUúS¾:¬;ž'®»æÔI~5:*êöçyë.ñh9‚tZ.?¦ Ý®kÎéäÜ6ZȦ¤Û5mƒtûó´U‘s +è䨙ÆÑíšµŽt»f-¢Û5kt»fó3ÐÉäP¡—I7hÞ:·"Ý qжmÁºA2×aïãºAR׽它¤®º{œvƒä®ƒaÜ <¶qm¼4}5 šÖ6 ->w -^^½ûpûRïoûðîO¿ªU¿Ðºö¡_^\~ùAnãzñ‹ëë«çÏ?¾þíÛzÛÒ_^üŸòÂÿ7½BïÞ§÷ü”û÷ÉýSýEWßù¢Ïoí%ÿWý¯þï÷'VŠ—¶R¼þC–†¯¿øåÅßþ·£¿8}r]ôÙBs9KÏf&¥*ÏLꉼ¦uÒÇÓ™I¡Ò:¤uÒr kHë¤ó™IÅÅ––Iý̤”Ïg&í´;6ËžVHOf&µ*ÍL*³Ò̤2îlfR8§c++¤nfRŠç3“òÍò̤43©;›™”×æ™Éúw73)<:›™Tµ™Iùž‰årÎg&åHå™I!Iž™Ô¶8›™”&Î3“ÚÄifRϧ³™I9éòÌäVú™I9ãÏg&139)&*Ì#ŠöœÏLJ]ž™T>¥™IEØṲ̀Ôí¥E±‚½<3)åó™I©Ë3“º1¢X)žÏLê[o-Š•rž™´mú™IK0×·I3“rDÎi®ìL3“²¿<3)_ëlfRŽF¢¹¼<3©ïlfR;gš™”rž™”6;Ÿ™Ô¶N3“Ú_JZ"}<™Ôº©Q<aÆ–HOf&VifRËifRÊyfòÁ¯Z‚ÿPzËÒ‘E»D /ZGø@"ÒâóÚ…íЧø\C1èË:ÏK -Ðk×)vÁ¬èã2Í¥]`+l슓è5úì²wÐësÚ‚§’*Î)N=eÉqú8l¶
aúzø)O˜¾.ÃÙĄ࢞œKÓw÷#L¯§‚å)JŸêøµí)J_†á°‹'Déëæó9J_6‹}m¶&çÊÆ£WN÷󰫤},ªõ(}/‡Q<GéÇa3¥Å&^ ÒÁG«¤¯Å†eÑùɆ£ëäØYŒî“/„è벧«ê5gœmj7‡èûla¼‡è3S·¢¯Ã1Ÿ‡è,x DW̶]¿j¡/Ó¶¦ -NDÔµ8v²iD.éQ¸FÔR7»ÃaþiDØZ.sc€5˜¨|Ûµ”K75¢mSRK„‚„ÔúËÐ4¤–rí{Ì -»?-MC4N•“f9Fe‰ï²Fe-ò8÷Ûú‰Që<”À¨ÄÇÛÜsTNÔ4ŽÊнO£²ÍÊ£rÚsƒ©èÛGc©ÍGm,•ºak,¢¥¢oïcÏRÑ·í7– -K–©ÁTôíµô0-LåÍcƒieÈbõ
¦5D˜ÝW˜Š¾½SÕ·µƒ©úÛë0•ïå¤TšÊ¹=¸Måpí~¸ô´¨áR TŽÿæ/„oýˆ tÕå]S T{°¡5Pªö¶MA©ž=GTO¸}ìHªòövIÕÞn U3{.HÕÞ>ö -:-{šâ ÓªeÒéÛÌGNôaìH'GÒƒ^%6ç´é¤‡LËÒ‘NzÒbXRÒÍ0×I§=oÚ:ÒiïœFH'EÛ«‚Núó¶LèDÚ>æ1@§h9– -d¤“×X~c¤+-ctRµ´”Ußfn)«Jê=çê܆–±jc£”sÒA6ÏÜáœt¤ciëtØzy8§ýnê3Ví›–-KŸ‘â1·”u’ßÈXú”Uºød -:%ËÑrÖÉ—úgÐiÍ(è´¼Œ:EQÏ9Ými9«–‡–³ªç]žä¬“.ÈÝ:Î_' -éÇÜqNä`Q’rN›³]Þ¨ÅRæþú†t¤É˜d˜ƒ·`N:žMr6ÌùOš‚9é -«æjçY,_n˜“¥vÂ0'`Ù·†9)[¾Ü0W¼¹À\ñÜ Ì¿@™9§XÆ9‘ºmrÞ8W<Aî97꺄5snäFsRÖlÝ@§"¥Š:ñ³Eœ1ÐIi²ÀK@'J³_½ÐÌÓ:èD…Þ×–¹ÊóÃÚg®bSO[Ë\MùžtZ.}æªûm‰«JÜ6éª SKÜ&ntR§äwЩ9>µK¹òÑŠ…w:ùÆ¥´Äu´…Ñ:‘\ç£O\U„=æ -:±¶!²œ<bm{ k{[æ*Öö¼M:q¹>èFÑh™«jÚ6# Szìçè¤niñœÇ–¹š]ÝaNìr´ÄUÊÇ8椼•þ -„Ô¥%®±Çœ”‡µO\õ-Òž¯±GA§åK\µjn‰+®8 SGýèW9óÑWmN£”’NzÈb—$‚tÒ“¶¹%®£28@§oìóV霳ýê¯v¿ð蜓î|Ì}Þª?L0MÁ9ËÞòV-¡ƒszš4ÌiÑ®{(æDgáÜèë¦ÀÜ8ÅõqÅÜ8ùXßc®,âvkU¤JÃXÇœ”5U·ïjBw†œÔLÖ‚›j–ºß!'E›Æ‰ó¼Í턔ǥT‘ò¼ô+UÄÖ¶*âTø¶I?Eœ–‡~µŠîÖ.'(ãÔð¶ËFÊ8Õ¹íœ ÆIݶ¶Õ*&ŽÁ8)/Üãä:;•qÅÍƉ˺ïýr•¢“‹[0N¼Ù%嬢Ù[¿\Et\q`aœÛÆ/E\‘Y¿^
âj¡—2®–u医”91N|lòrƉ¿=ím¹Š<ïÌÆÒZÎ*ºöî±› ®–+¾ú«E¦2–¶ZEåk[y¢ˆ+$ q…g\!qƉò<Z~Sûzo«UŠäVe
ÈI¹øe* 'uÃÐV«Ä>rRž×~µŠ¾÷<äô5~mŽmºÕ*Z5µÕ**OmµŠ|=qƒ3äÄØÞ÷¶ZEÛsrÒE»~+ò‹žs[®RàSN»ÞØ/W‘î¹ÛJí62>5ÌÕò0Mýréå‹]DPÌ)X¶¶\EË–,æôL±LV9g¤Ù‚sJ¢¡_®¢ûÚr)ûl圖‡'ËUô·'·.œÓ™ÍiÎÉŽz (œ‹òØû¼UnŸ²Ûijt!ÏH'á~y*P‡À
êÄÞ^사¢N~ÁsÒ@œ“kK[7Y9;7ÔIy0Dêd·{iW[夆vå;£NÅñcÔ‰Ÿ=n-oÝdÙóÒçrò[@²²¶Ù9\÷µ¿àª“‹KË[õg)§¶2OÎÈ͸¨“u…óØ.DrtZÞ*?Xz}4w°lÚQ'Ž–†:Yq^ò…ñ±·±åâkÃdEÝà‹z2êL=k¬“ÅéëÒX7´ÁºÁ®ÖÉŸMëŠÏ5fÖ©ÝòV-—–·–âSž™ub_ï-oC{+Kc]-/ÃÒ³N~5khykìÖéÊâuòÖ–êä%-œ³-º¼U«¦–·ª:>µ¼µøOsu¤«rÜ[Þ*Í9m~N~qÚzÒÕžä÷=PÐ _·Ò”HÇ+{Ÿ·Êìx±ù8é42™î<UÐÕþ¼ùª™ - „C!É„C!pômç -I& -‰ƒÄ¹A’ ‡Aá0H I&ö„à q$™q$0.íC‡A’‡AâŒC q$™qn€8‡A’‡AâŒC q$™q$0Æ!dÆ! -Q³DŽ³4o¢f‰Ô[»ËŸ®9Ú]þ¤é&š[!º®dowù“²ßoDÍ]Š´÷wù“ºc˜/Ò>67@Vëxrõx™h•¾9í.Òu§£ÝåOºö2ÆP³DW0í.rRIØY"K“äÞ½¾š%ºÖèXC-™»’«%²ðFË;ª%R·´[’ÈüÆ<j–Èb&Y¾Ó~8–[[ªY"å²·»üÉZžµÝ“HÍ]ß3a–ÈBª Ó¤hYíFßƬ~Cý‰4WK¤¼¯í.B¡Z}«Œ<ök n–HyÛ]þfÓü0K:ŒºYF], ŒºXÒaÔÅ’À¨‹%QK2GÝ+ ŽºWu¯¤ã¨‹%ÀÔ¼’`©{%™¥®•K]+ –ºVÒ±Ôµ’`©k%S×J:˜ºV0u$`ê^IS÷J¦î• -®sÂa”dÂa”8áJ BI&B „C(q%‰qø$@ŸÈá“dÈ!”8äðI€>I¢: ”C'rè$™rè$PF@9t’Œ9t0‡NçðI2èðI > ¤Ã'I¤sÄA‡Mè°I2è°IâK¸MèÜ&ÉœÃ&sØ$p›$s›Îa“À9l’:l@‡Nâ Ã&ɤs›Ða“ - C!É C!t($€‡$ƒ‡Ðá -üF*×2…4"ðŸ’5"Ëà]ïPkd°…õ¼Åb×eu±Úˆ”[¯ÚH-ïËKµ¹7™Ï!k”äœÝ#A½×Ì«52IÇ°FäÛj÷YPkdÚÏnù`u8/Úåúø:OaHY.JjìÚHÝîÈÅmYM7"eY¿í›è¸$uî|¨7"e•(ÜÑ‹ì.&¸6"UûPB‘+yø È·Y0\‘o<.sh#ò™üA‘ç‡P@Ô‘ªÍ ±Fä ®f‘¨62ùÒßFµi½{¡k#µ¬kÐF¤7gtåCšs_ÆÐF¤Éýf#ªLjOÄ66í7¸ÛŽ62Èey#2Ì7ŸÃ¼‰íý³lv©}ÚcýQG ¯ØDµ¹XxŒM‘ëvÛÑ´91÷¸ï‰i#EV½OM©G\pŽ6R¬±¼˜6"×·§ä™„9š7RŒòÑ=gÝÏ2'm¤Ø’¹ÐFÒÝÉB‘…ÃÑ´‘â¿ð6âA¹ocÚHý†Øhª[ÚHÉÞ˜¯ªuzÛ7¼yͱ4oDŽÚ_ÂIE£X#ŽQ¤‘ŒQ¤Ç(ÎÅÉE£H#pi$si˜º5K±F2K] –º6,um¤c©k#ÁR×F€©[#LÝ ˜º50uk¤ƒ©[#S·F€)ÖH†)Ú0Ŧx#™¦x#ÐT½PŠ7’PŠ6JÑF@)ÚHF)Ú(um’¢$’b@R·F -=£ÜìÖHÆÜìÖ˜›Ýs³[#t³[#nvkÒÍndÒͦ -ÏåæðÜ-‰9<wKº9<—KbÏå’˜Ãs¹¤›Ãs¹„´ÖÝ’ˆöÜ-é¢=wK"Ús·$¢=wK2 -9ì ‡>åÐG -å°G ö”Ãù¤öH¥ö”ÃrØ#•rØ#P{ÊaÊ!@9ä(‡<R)‡="Ê!@9ä‘J9ä(‡<åG*åG ò”C©”CrÈ#P{¤R{¤”¸¶œ' ‡=ÂrâGD9¼‘¤œ¼‘å¶lv!}œ‚žCNÞÈ‹ròF’r[’8(ÞÈròFrGrG^“8’“8ää¼ 'o$)'o$)'o¤RNÊGRNÚHRNÚÈ‹rÒF’rk*hÒÈ‹r’F’r²F’rmuP’r²F’r²F’rn¼'k$'mÆ¡TÆ¡ˆqX#0k¤2kÆa -9¬ ‡5ä°F*ä°F€Ú“6R‡5ã°F`ÖÈ7Œ“5òbœ¬‘d\X#‰8Y#/ÄÉIÄÉIÄÉ©ˆ“4’ˆ“4’ˆ“4òBœ¬'i$'iä…8I#‰¸F’p’F^„“4’„“4’„“4ò"œ¤‘$œ¤‘$\Ë<îºÈƒg'—œk·Fqa@8 #®/zm¡*xþh%¾„Ãqø"qø" _Äá‹TÆá‹À8„‡0R‡0ãFÄ8|‘Ê8|‡/ãðE -ãP=`ºŒC©ŒCqeJd¹îâ$‹@8l‡-R ‡-á°E ¶He¶Œ“.’ˆ“.òBœtkW‘ -·E^ˆ“-’ˆ“-’ˆ“-òBœl‘Dœl‘Dœl‘âd‹$⤋$⤋TÆÉIÆÉIƵì¿×e‹TÆuÙ"0®Ër}Ï6bB®Ër]¶ë²E -äºd ×%‹ -¹Žâ"ÈuÉ"@®K©ë’E€àr]¶H…\—-’ÛÊr]¶H‹"¢\—'åº<‘J¹~ÐèÂñðô! ×å‰TÈuy"@®ŸIbwº<‘ -¹.OÈu‰"@Q¤BQÈ!Šrx"ròD`žŒ“'R‡ââÐD@šHEšˆ+ûˆå@\©ŒCrX"@K¤BKÈa‰ -9, ×¥‰@¹.M¤R®KåzX"@®Ë©ë²D€\KÆuY"•q]–Œë²D`\—%R×Ãq]šˆë{®”SL1O q}ÏypG\—%ò‰8,‘Š8,‡%â©€ÃpX" -8ì -IÌ…’”k«’”“’”“’”“ò¢œ¬(‡åÐB*åÆ2¡çH+Èa…TÈa… -ùd\Z!ri…@¹´BÀ\Z!•si… -¿´A :ôK¤à/m -bÿõ:óî‚X̾ȸ Ï¿ýkƒbÿ~Zû¸ Ö£<â ¢/p‡òü{³®1Â¥;VŒA±Žëùä.ƒ<ÿ~nx–Ë Þ×
‰Åò¬Iëþ׬ó|Hø…» Ö“±N.ˆõb¤Î¸b=”×RE
[º Öñ÷%úä‚ØpÃÜ !Äb6))#Ä~b(ŒÆôÿ"ù¸ÄÞÓñ1‡íL#ÄG:ÞBˆ—ô–BˆéÓîM!ÄÎf"*H±~™~…bÿ¶a„û·=jþ !v•ìž „ØU´9-Œï/®ß¸b±!kÄf´íæX§#Äî]?Öê$#º¦þ£„Ø¿µŠˆ+!öŒ<·–ßøXŸÅ\Zg·µ‹ï”Bšå-ÿŽ/Wû<Ÿm¬¥Fìñíù›è2—Ÿ˜boÀñlŠb¯™5lpBì5œ[.h⯤õÎ-!'¤ÍXINˆuæo9!ÞáçÆ¥Û…ÖÛq)ÄD¬C’Ïçáû9cÕwBìŸ[¼lî„ظʱÖr'Äbϧ'3è8"Íÿí>¢~CÁ‹fã78!öokúà„Ø8¯ë%…XÌZ‹H!öï+öñ,*çYÿÿÁ © •’ •He„¼@*#JIJy‘TFH’TFH’TFÈ‹¤2B§¡„$M¥„¼h*%$i*%$i*%äES)!IS)!àTFȧ2B§2B§2B^8•’8•N1B*NÑBÀ)^<Å©<Å§î… -RÔ@ŠHQC -H1C -èÐE -ç0FàƜé¤Ãt2Ft2F^ “1’ ƒ¸€NÊÈtRF -;`‡A’°“ARa'$a·-,;ì$¼`'$i'$i·)‹¤’¤’¤’íd$íd$íd¼h'ý#i'…$i'…äE;)$I;öíB"yÁNIÂ.$’d]ËNËY~a™Çɺ–s¾Á:9$/ÖÉ!u8$°‡¤²n¬U¦…C"uH$uH$B ¨Ã!©¨Ã!u8$ ‡¤¢‡Ôá€:’Š:I$‰Ò!‘|.’‚ºTH`]*$‚]$•viw)À»H*ðÒ xi€¼4H*óÒ z©€½TH*÷PHà^*$€/’J¾TH@_*$bIe_$À/
è—IÅI¶õdd[OÉ«'$Ûz‹mÑØ“GòjìÉ#É.mx$Ù£•GR{´Z׈4’ìÐJ#yuhC#Éþ¬4’º“Fòº“F’CwÒHrèNÉkèNIÝ©wÃÈ<’×È$¹“H’#wI^#wIräŽ}0r'•ä5t'•$ÇäØT’:v'“$Çîd’äØL’×ØL’ìÐÊ$É–žL’WKO&I¶ô¤’dKO*IÅ*‰ð—& üK“¤0MˆIÓ$©L“b’ÀÀ4I*S%ƒ©’ÀÁTI>@øß²I²…?ôRI¶˜»M•Äè»—d³yf’‡K²Å8jÊ$ÖÀ¹ï”I¶×OB&Ùl$e¤Lbyëg8>Fmó§˜$óçøh`’L¨9Ž4Iž#Û2]V&És$Od™$Ï‘øÍÃ$yþ½š$Ó“›:&‰Íï×ZVÄ:N6©Ÿ¸Jbø6Ó$±ùèk;Ó$«7´ø_÷•"Ém™ås‰$÷Ïñañf°D’'fgŒHbŸIËÅ@$±ÏäsdüÄnwëV ’ÜŽ«%’X€Å…0I¬_aiK˜$öRù 2I†5SÇÁoîR§yp¥I2|¥§–&ÉÐ÷À#“Ä®’¥üa’_骧Ibáí|›$Ã×áêi’ŒŸã%Ç$™¶àX_¿¡ÿÞZÄM’é“*gš$öôæ’,2I,kÇÀ´öqx÷“ÄÒmìãÌß±aVëXû“dúÊZ^ä¹ó£¬{â&ÉóøZ2â-ó,³4IìͼO~CdÖ|?—HòÜÉË®ˆD’fw+×— ‘ÄÙýX"‰µ·k‰$-(ŸÏçᦺ]¤Ib
‹ý\&IYc,M{ç¹L’MUû1I¶põ›0I¶Ÿe‡…H²Yù\"ÉVe2åIÙëЯ%’Ø6ZmÄSž÷ñGXñéŸo’T¢’ -RL@ºö Å$© Å$¤˜$€“¤€4M4M“¤p4M’àhŠ$âhŠ$¤)’¤)’ -R‰$p“Žb’TŽÊ$£˜$`“¤b“DE$£I¶—H" E$¢ˆ$M“¤0.U1.U1.]’¸tIÄ8É$"\Ê$…pÈ$2 €C&IÀa’ -8L -êÒ$ Ô¥H"Ö¥H²½„²IĺIĺI>X—&Ia]ª$b]ª$b]º$…ué’ˆu)“ˆu)“Ö¥L"Ö!“À:d’d& ¬Ã$u˜$•u˜$°“Öa’TÖa’À:LX‡JRY‡J"Öa’À:L’Â:DX'‘Ô!’TÔ!’À:D’dD’ë$’$ëB$IÔI$y±N&I²nƒÊb]˜$/ÔÉ$IÔÉ$IÔÉ$y¡N&I¢N&I¢N&Éu2I’u2I’u2I^¬“’¬“I’¬“IòbL’d]îC¬“IòbL’dL’d]Ë.K²“Öa’Àº0I*é0ID:D‘.E’BºIDºIDºI -éR$éÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B"ÉöÒÉnõý…M‘D¤K‘ä“t˜$•t¨$®Ñ[Ðá’TÐá’ -9L ‡Iä0I*ä0I & ”Ã$©˜Ãs˜$`“¤b“Ì}æ0I*æ0IÀ& ˜Ã$)˜K“D˜K“D˜K“¤`.M’À\Š$Â\Š$s)’s)’ˆs)’Î¥H²¥w&‰@—&I]š$]š$]š$ti’éR$éR$)¤K‘D¤K‘D¤K‘äƒti’Ò¥J"Ò¥J"Ò¥KRX—.‰X—2‰X—2I]Ê$‚2 °C&IØÉ$v˜$À“¤Â“Øa’ -;L`‡IìPI*ìPI;L`‡IR`‡HìI€"I…" °“HìI*ìI€"IÂN"Év2Iv\ìd’¼`'“$i'“$i·1eQh'“$i'“$i'“äE;™$I;™$I;™$/ÚÉIÚÉ$IÚÉ$yÑN&IÒ.÷!Ú…Iò‚L’„]˜$ɺ–=–d& ¬Ã$u˜$•u˜$ÁºIĺI -ëI„ºI„ºI -êR$êÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B]Š$uˆ$"]Š$"]Š$¤[&IAÝRIĺ¥’vË%)´[.‰p·dñnÉ$xK&ñR&y)“$óÒ$zi’€½4I*÷0Ià^š$€/M’J¾4I@_š$°•¤²/UÁ/Mè—&IÁ"I¶õ$’d[O"É«'‘$ÛzÉ65ö$’¼{I²K"Iöh…£W6L’ìÐÊ$ÉL’W‡6L’ìÏÊ$É¡;™$¯¡;™$9t'“$‡îd’¼†îd’äÐ]toräN&ÉkäNHŽÜÉ$É‘;™$¯‘;™$9r—ûÐÈL’×ÐL’»“I’cw2IêØ& cw˜$ŒÝa’Ô±;LuhIhé!’Ô–" -=DZzˆ$)’Ë$ÿ–IR -ër±.×8ër“º\ãD¬Ë5NÄ:9Y¨Ë5N„:™)I:©)/ÐINIÎa§$çÐS^œÃOÙÒLIΡ¦TΡ¦$çpSuÈ)/Ôa§$êÐSuø)uè)‰:ü”d•ê0Tu¹Ø‰XÇb'u¹Ø‰P—‹u¹ØIA].T"Ôåb'Áº\ë¤À.×:ìÖ.v¹ÖI†Š`‡ ìT*ìd¨À:X‡¡Ra‡¡ìPT€ŠJ…Š -°CQv(*v(*¢† -´ÃP©´ÃPw*àC¥âCÜIQv(*w(*àEÜ¡¨|âE¥âEÜ¡¨€;•Š;áCàa¨Tàa¨@<ˆ‡¡R‰‡¤ñ\J¹W;—;)ÈËåN„¼\îDÈËåN -òr¹!/—;òr½“ż\îDÌCRIèa©¼¨‡§’ØCTIìaª¼°'UeKI%©‡¥R©‡¥’ÔCSIêÉSyAQ%¡‡©’ÐCU)ÐÃTI衪$ôpU^ÔCVIêåº'¢^®{R°Çº'¢^®{"êåº'…z¹f‰¨—ëžõrÙ“B½\öDÔ[»êå²'…zÈ*¢® -ÔÃU©ÔCV{È*`Y¥bYìa«€=l•Š=l°‡ö°U*ö°U„=É*PY¥RYê!«@=d•J=d¨‡ö°U*ö°UÀ¶ -ØÃVùĶJŶ -ØÃV{Ø*{Ø*² -ØCV©ØCV{È*`Y¥b_칟â“(½\ù¤`/W>öråa/W>)ØË•O„½\ùDØË¥Oöråa_%±‡°òÂÊJbOÎJRiåE=¬•-}•…= +/ìm´ÉÀ^+‹zRVÞØ“³²°·%¢…½°V*õ$,êÉZYÔ“¶ò¦ž¼•E=–@z,R©Ç(`%PÀK Tì±| Øc aP*öXìå.„=V@©Ø“·ö¤$ö]š‚=y+‰=y+‰=÷V^Г·’Г¸ôW*ôW€â -ÐC\©ÐC\ôðV ÞJ¥Þ -ÔÃ[zx+•zx+PqêI\©ÐC\zˆ+@qåèI\yAOâJB/Ä•džÄ•ó$®À<y+É<y+/æÉ[IæÉ[IæÉ[y1OêJ2Ïfâ¼$æ±Je‹ À<-‚òX¥"EP@‹ €<VA)Èc'ue!OîÊy²Wò¤¯,æ…¿òFž–-Õ•DîJEîJ"y%™‡½òbúJ2%™‡ÀR ‡¿’ÐC`Ièa°¼ ‡Â’ÐËÕP½\
¥@/WCôr5A/WC)ÐË•L½\
% —‹¡èåb(‚ÞÚE@ÅP -ó¤°y, ƒ¥"…ä¡°€<– -= '‡%™'‡åÅ<9,É<Ñ7™'‡åÅ<9,0O -K2O -Ë‹yRX’yRX’yRX^Ì“Â’Ì“Ã’Ì“Ãò‚ž–„ž–„^£ý†K…ÐÃaz8,•z8,¢ -ÔCa©ÔCaz(,P…¥R‹ê¹µâs¹A½\¥PõP½\EÔËõP -õr=Q/×CõrA”E½\EÔÃbIꡱ¼¨‡È’ÔÃdIꡲ¼°‡Ë²¥Å’ØCc©Ø“Æ’ÔÃcIê!²¼¨‡É’ÔCeIêá²ê¡²$õpY’zÈ,/êa³$õraQ/F)ÔcaA/FôX¥0/5óra”`^®‹R˜—뢈ykÁ¼\¥@›EÔCfzÈ,•zØ,P›êa³Têa³@=t°‡ÎR±‡Îö¤³@=t–J=tQO6ÐÃf©ÐÃfzØ,@›¥BO6ÌCgyè,•yè,0桳|2¥2桳À¼ÐY*ñÐYD<lˆ'›¥›àa³ -< -ð.„––¼Ë¥Q -ïri/—Fðri”¼\EÀË¥Q¼\e/—FðZx-/àá´$ðZxX-/ࡵl-É;Œ–Ê;Œ–JK§å<¤–VK¥ -ñ[z.«¤Ù¸ ^K%bÄClxˆ-•xˆ-³âa¶Tâa¶@<̇ÙR‘‡Ù"ä!¶À<Ä–Ê<ʇØó[*ó[€fÐÃl©ÐÃlz˜-@³åz˜-z˜-@³èa¶Tìa¶{ˆ-`±¥r±î!¶À=Ä–Ê=¹-pÏÒ•#[!¸—«¤îå*)â^®’"îå*)…{¹JŠ¸—«¤ˆ{¹LÊâ^®’"îá¶$÷[^ÜCoIîá·$÷\^ÜÃpÙp[’{È-•{È-É=ì–Å=é-oîÉoYÜÛÒâž—Ê= .|2\ø¶œë(à“ã²ÀÇr)€åR*øX.ð±\ -àc¹” ->–:|,—"ð±ZJ«¥ -^šO·IËJŸÞ9ø±ÏhÀþìÓèœvœc4Gàì±JýQsßgilNgžY—ß“êŸËás*
méé²Q€Ëç±Î©·ÿÙæy!½žšÊå§ïï
&I»b-øãÌÅJöË:‰ö§W:Z·ÞWÔˆç
Ê sH‹Ø´žÏŒy’Ó3èX5p·ÛrµqsѾÄ}b‹ö\ö‡‹æùvWÊE³|{G¹h»È-/šePìÇ|]´]hä¢í&!Åô¥_4›h÷ÜßrÑ,3ሹ:?”=dG.Únïãq¿.š=D–çÍEÛïH;ä¢í—žrÑ<½ÀÒuÑžS=Öö‹æëðÝÍ9ûýÖf^4Ûž1çì·×¿ýï‹æÏìŒbãv–¯í˜•ÝÓz|åî-*O7iš—7^Q†¨³ÀÍû©<¢Mq_6¥¨n“³,WÙkš>??¹,§àyw}ÙNo{ØrÏ^§b›¤¥“ûð>G2¬¢¡sô©Ößõ_ãÜ®Õú˜§ÿm›H¸áª.‰·>| -üÁñ–ê®|uK -jÑ -ê£Hg^6o!ùÒßë²YÉZå\6o!Ù§Y—í³a-¤#\7o"y±·¸nÞDšíuݺš›\7o#YΣ®›µ‘ÆëªýÛßîeöïÿðoþãïÿ—§?÷wO—"ì¯ú~ø7ÿ·ý—ÿåOÿÓßÿçÿƒýü‹¿øýïÿê׿ùëû¿üaûñOžÿÿïÿñ‡¿þçÕÛú~_Ë{Z?ýizy&Ò±[¾9ÿú„›‹ËölgøëGØîøó²}ýØÉo„s'¿÷ÃûŸ°6Ò<\8½³åÃßô¾îk»#ol¿»=OÃéøæBËÓûæh¬½À±‡ñ:GÑóýiÌXGï{§d;ùúÃßÚ0:Z’oïC -¿6ñ×Ãݤì–ÔëÁS!w#d#¢_ôçæÈKõ´ã(Ì=ÏcöqŒÚ VìÂÎã»GõKîåmDÿæœp¸ñ9ö°• ‰à4¡>Žm^(Ú`ã®=wˆû¢ø(gìÀÄ
ý1oBû‘ÙÈÕwàKÚ°×·õòç~%¼u®Õ‹‰ ¯ü¢àÓ®SP÷È‚›®¥…ç¦CóÅrµW]ImûÝ#СÍn˜Ú…ÓÅ¡=áqp•‡µ"ý.ÍæÓS¾â>OÃ×½³éå×gnQ×Þ÷NѼ@·~ù^‡Íƒgþ±¸§Y§:‚ËÒ¥,¸G®‹]‡Ý¡£°µd´•€#8×Pk¯6ú‹vpî±'éDpZp -*â6PDì@øó‹âϦbwîÑR|´Ç¼,^’&~ßÝ«b-‹e¿Ê<’g -^[þ>šn>®›Ã²Ž¶‚ÏÑÓ> æyzÆS<â0lN$žæ¯È>yÄL± %]Ì|÷/] -j~]NËFãí^OÐf³Ñvó"u/5BëÊg°-(wþ°²},fù<ÅטÁ¡nà<F3ž·‡y®¿ÅߚȴÑ6>Ç-x˜Oœ—uúªèiúÃz¸,hƒlºOÛq(æ3ÄË}Fͨ›øUáûäZáBßÅå"yœ€•¯‰˜UˆÔÅ‚Zö_éÆ>/ÒW…¯›÷c¬Ýî÷ÌÜq(xíù¸Y£•ýÆ2ymÿ‰½Žµ×1[î Ö'ô‹k…î,øl‘íØ!îÜ:ŸØòRSÃÂ'™#>´ÖMòªz¶OvzmÁóíÎ߃¨l{?+ŸCï¼;_Ï^o^„{È£a¿µçžë
oO7¡
lSËì`¼àž(óU6“g¾µ¶åQö©}mxò·žÒ:1·HãñØŽ]ÛzÒy¼Öà‹ +ôôZsì íG†u¼o¯¹‚ñ†ŒÐìòÞ¶ƒ?¶íùp´íø8‚+jDÆ’1ö$^·úÌ>)ÍSÛݯŒ^p¼ùÖ‚8¹ŠÃ¾œjEyjÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°ÏªÊÅ{g¶A^/ÅFCÞ³ð~Ñï}¸Tg;âºØWQ!ÑÜe¾÷e/àšü)ÓI"øtýtýéVð¸ÚS;°‚¦Ë•UöÛ@Éqí -ncêþ÷9öüµOÏ ±ñEôÒ‰]Ç¿ßw€{xê}l8Ô€ôhÛ¸×ÇviÓ›3E|»®í¼ß?÷Ç‹ðŒ?opÚÁÞõ-°öck<&›ëë´ÙÆ|Öâ½z>&OSH—äiÔEÐܶÃÚ‡^¬kz{q[|ål@4.@¿ n½q -Ç¢<}þó‡:J±×èz?ÍÃìsÙ
ôOäó5›¾ï=>§3æTãïoqÎÁø¹Ú)§•XoÏ®ËrŽÉ?õ¤ÏŸ{èÒr•ùèÆ//{«-íÝŒ`H¿~¤w¼fÜvéâûd%†²MÆÛ{Zª‡´õ8‚ÃËãN”VÒa…59Uÿî~U+ÅËÀ¬7 ‚.^¨™NpGOϨ(ßsÒÔ³Êà -f§Ýcñ{«n\‘1¯«7HÁ+{Â#ºEñ{k~ò`n»þÔwƒê~êro{î VÙõ“ñ5·ê&ç9yØ769“v–˜;8£Ñ¥[~©épœÙ„}¶ÎöÏ![#¶6ÉSÁy'‡tgyf<#.þ\¯Ô‰Á‹n•²3;£ƒd-`+6Ím¤ð„½F±.ï—ËŸ_ø.2<rÏÑRðé,Ú/¾c¾²ÓR*ã¯íÙb^ß
sys¨DMK³/sTk2Râa½«ÉlMþ|Å÷“ÞÁ™ïBÞ]ŸÃšùÞD{“·¯©`c|ÒSÄù9_ó;ª*Øî^. ‚ìnÖqˆÞÍ}•]YàÑzòùç•Ï·ë«ßÞV¯Í3Ê~ò>×£¸)ò°ç>D‹¨ën£Â¼e¦ -¢¾Ÿº~‚¶³ëaóó.6û·eX-œaßUþ·ð³#_9ÃþNŒ_?A{³/ª=ñKdï€ —J«Eê¬U/:vO¿~¾Ng;^º,oËg{ýgºö]e\ý¬|ʯ¾eŒYÇÕlè’ª¯X4•Ÿà®µZº¯„bÚ'Ø£ï÷γÔl—3~Ã>%çõ@÷w?ÄéÆâöáz¿0—µz"è“~L·=ˆt'$.âÃ._IëÅ
øö´þÒ¯Øò˜vsÔìü
ï>“è—ÊÊSØ@§Önݱú\ÔðOoƒú¼V_ôóÃRüçw'Ò«~QîógÍ„ÝÏ‹Î6}:4Q6Â7õU&lC›î·Å«ìP½fÒýÞWÄöÝòtqý6¼õ ‡úí¹þÑž8«cjSLc›ËèM®Ñ†K -Çlk¢¢MÀøeŠ÷s‹BÂþ©>ƒo¼(ð45\<‰'чP‡5 -öÙ¸PÖf·ûç“Áû¼õlzÿÕùà%2¿=Õ?ÚÃæ鶆_»Uè‘«èƒØöfÛZƦ¾}d0^ü3ÆÓr>xgÁY\ÎHËÃsðO¾¡ìµ8_Ï]òóõò›vÁ4%åA»³àŒîÂð i»Ë~}Æyø¶6†bCqÅÍ=õ3°|{‹õ&–{àE¨¿ˆ}¶š…w×"üî…1ÈþýøÄÚõu%›¿M·¿ÜÏ3Ó"‰Ù¿i»-]òõ8}ÓԸܞï»}Vg!ûNm6XfÃño n×iúþÔúâaOð>£³ã7ÆÔØÁØbf5¾ã>=òmØ”wɳö¬a+š¼ñM;h팂øþ€ºvm¶ãô#°·¹Œhžñ2uœâS÷´L$3;z|«ïXcÆ÷êÅoÿò‡ë½™¦&Ç7x7.NñÉÇg~§v·—íðËhj¨Ÿ„ãòïºÿ…¸4Ý°æA¿\ÛyEëőÛÍQŸnX¿s¶øÚ
ð8õ šX.òn1Ðáï§zA¼îÄðÔµç";xmþ¢_º½qÁL/þù8¶#ÎÀdzþR_;·Vý¼Ä\<¶£ù‹;´ÃïDJÝÉR²®ëº{<Œ>7ùÝ'Ô3½MèÓÐÏî[¨C޳ϟM´?a3‡{´5{TE‚öŸ§?yëÙ
¶e·¬Ä‰_^ËK¾¯BvàE™Â·'û³¿‡ƒkAù.öàl&#ñ¦¶(Yh=Ðíy ·Ë‘{Ù·üšú]Ñ̺¶CÕ—`ó¯Íþœù%h‘2ça/1÷›Œ¾W¯ ÷—ºož çÛú"’ÑøÑõ½,âr†ùTÔÆ¥9}1ÁøâÆrÍÖ,°¼v=dÞ½´mýÀìt(±ï—ÑgÈü2žV¤Ò>gžƒeIïqmÖZ -¿û¼~ïÙŽGþ›7Áùï¾5ß}¿~ã]üÞ{ûÝ7ü»Wö·îÂwï×çý'žož—¿Ô¶^5×u‹‹h};}.¯—ÍßWñ¾£ÌÓ/zŒtÁ•û®m=™Ù[dúf~ç+ôO|±¾ùº1zñí—ð{ßÌßø¾~ÿ[üݯöo|á¿Ûøn»á7Úßm|§åòýoÈo}o¾ûeúö+öå7¿x¿õuÜb…ßï°²ôœ'A|U&u¢º?ôÖÇ>Ý+‹°Oø+âÉ‹±OCòçë¹<ç÷¿ _þï~(&ÿÜÞÎ ÝJzäë+bO—×ZãºßDâW¿ÿá_1¦{©ûn -´“oƒ¬WSƱFÉl€ÓûòØZ³›O?F7u,¼ê£#À‚ÖqóŒzB_>Nå -´q†÷æ·~ž11Ç^thd¼ªçíý‚14b -&Çèάó
¾Q·väÄÃ6c\"bsœïØYÏ‹_ÛLzÿfKwb3vÚmâç%¼Æ,¸ïb›e0èïœ'l<!Èžƒ">µOm[¾#nj ÞÑZà -ò~Úl1™ióöyº‡&·=cÞq—ðtöóïå
g§]"bÜñÓž -&⶘d]Ûž[°92V>C¦ñç_áKO§ËZ‘îqÅØ_cM+"òó™6íz\ü)o -xp¿ïob^Œ5Ÿa>úÜ©?Yúó“ÇÍ¿h>fži ¬ÝÑAzGLVçé+<£%AŸó—ˆ¯¼!Ì[úÖ/þ\½ö¯½‚§ÄtëYEÉ8µo -Ò™9è’ZðÞ²áu…]ý~}¯Hy‹Ã±Ù®¶À'ÁH|…궧i‚b…׌ g‘® }Îzo[ƒ;ÙWlóg•éüû”¾‚gÜ¥±Xƒ[»ËœÜÑÛÆš#¨ï³"æek3ÆÏÏ=’£ê–G¤ßØ.Á„UhzL<-üey†²•FଅäY„~úÙÛÜf°VO„w|ïQžëŸœ—î‡'eþY(Ç¡Käèý)^öCà}Ü™ä‹Rƶ÷¤3?ŸV¾nRð©k/c¿h@rúÈrÝÒçøt1ük)V[~#ºf]¼+¨Wq&ùmì¥mºD]ÇT‚J¤¤/IX–ñÇöx%šå~]ôe]iR²ÇʉseÅùzE{Ös±*xARÝ5ÚÕ,a¸YSm³Ao†‰FÜ–í6€Fh|ݸ¬=^û•†U—Êäa+Q¬mcôקç>¾
6Þ³W¸uÆ©¼¶m¤ÍÁÉzû`¹®1Xý±ž6k±ÛàîgðÊÒ+L'Ýöºûƒe]†c{x0›Æ]%þ=LÓÐêsé´6e| ì ÂuDÁD“¡Q†kvÆ.>Æm~§ýø¯u!c†Õž;»ï¿Ý»ô€y‚çäö>/w+A^ÏÌo{Ǻãñ]9s‘àˆÔnv°Â^ ‡`<ËVñνڋ¼é®™$<Iqzê<ëÅsnûÑ?‚±dÁzBW8&=hk9•ÉúÍüSÁvÚ_Ûº´5Ì ¥®Ždù‘o¹Õ³Œ£íÊ7Ú¡E†ì9s kžjqxId˜Ï¨g0GÇz ¥l;ÃŒæÁPb -Þ1…ÂøÔ -Ó‰yGÚù|žL1|{í -ÜK›aÇ¥ÕœØ+è¸y -ŠðÓòIGmæ~]|#°|q ‡Rl,ŒcÔÊ°î9 ú*œ[/Á ô7ªnk_•>u -²ú‚¯m§®·¯Ü”NÓà“‚Ÿ§ðÚvo›¶½s:bÅ|žˆß—0×°Eý{'¢·?ƒcйYa0Ö š¯û¡Xâv3f æcè3hÛŽ“ ^ï·½ƒ6^Ýh£¾Âä!”§`wIÁkrZû®Ry8¬öSÛßG[¯ë -ö2q°¢eÔyke„±_ -ZŽR ò"<ŸÛö±íÕ5ã -2Þ4V¶½4íG0âÙ~Ë)ÔðT·lwËN–^Nñ[9óq–`6û~~lk
%ŸÏðGk'æ°åV0ÛQ9¸²-WöÈÂ+è5c?ï‚
£vòyî±ëíb¤æìëA¬a
|x%ŒMoÓd–¸“oâšR³†œîMÙÖ*nO½]P”àSü4äV8*#zpêö¨1ùôÒ!ì`…7nB‹zA1—}fóRv@Äø¹¬¦µ¥uLcdÒ†•ãP‚GTO¡?±Â¾šÝOµon}ºó¦¿zÅx)Á.ÜúøØÖÆ{6Œ-ƒ½Ju7£Ñc4e‹®_îjO·<ã™
‹Ì¾)Ê ²<X9ÀlxC/ ÏVûjÜl{íldΘ|\A^0/3þÞöRÆj÷*ä»b^ã`äTÛý^<²ÕÈ4‰íî2…gmô~õÌ<‰Á§²lëEÊ=èƒÕï`ÿYk½ÃQ8Qœ¾š¾”‰ùon†ÚvÕnõž¡áýª÷ÆËÄ'T㘙òæóÓ¼ù5è//žÂmËɪeâv”þÐص÷Ïè€ÝŸQØtÅgy®´÷°Ô‹µÕ¼òáðêpq^Gv¯øc–«¡é½ÝkÏätÛüضÓ<ÜT®é3x÷ú„0S?¶×Ù5pâÃrß½Ükipq|®îWÂçPkŽÁöèó¾‚=Û}×ꡯ™¦²mc¸¿õš&çÕücœ¥1¹a;èn³Bíµ¡NÁ~ «ßœ‚Û¿ú‹?<UùøHUþ×ÿ¬tek³ûÇÙf§l.À=¹SuxWøë;Ü”Îñõ½“߯üþT
_3仪_t{ ü™ÈzšÈ?»cÖ9´rÀZš™ì±“yáidô¶½Õwÿx<©–üïùòþ|IJ¿ž—<NoèÑߨJÛF«b»öÈgò gË~ñ‘Àá³7¶Ý‰FÁva-ùxÉ¥ žðY<4 ¸]w´¿GL´ú3ålóäÚC;ÊÒ÷3¾¢N‰‡Ÿ£½_Wg3_ª]^e"¸«“3¢vjìwFN–.BÈOPS~¾àùÅz$‚5M—äÎ;oðÙµ×ÒA†m >†¸6«˜¨¬’Áø×Eðõ <èëóÆlQª×Ã|Óį -3Ú:£t¸[浌¨˜aAµ‡<èác¿Ox»t`>4;˜Ñ@µàáâœØ:±K/Ä#ã…Òžà‘#¾2{ìôŒõ ýP·¨–¦N`Ðð÷àÎAéÓã¿Ï³ëù{¯ù®G¶ñûkÆ離zÐ+æEÐƽc—¬ÿ[^OÕƒ^»Õ·Ý¥çXùÚ#Æ·f|FÙÁhyÚŬLн3ÍÓµ‹[æCœ®ö£¦ñÇø([Ø'ÅñŽmíWýʦŒþŽyµÜ'8"+J'|ñ$ÕI¥TA,ìÄ1noA[tT»ðj¼ö·¼ï¹Ûëý×b·²×E‹àžtf+¨FÓ„v~>:Ü-LFûcsã·SOÍŒŠ?º“§Î×D¤¼Å«;l™âsrb¡³bƒ‚š…³°ìÄÑFF¿ïsãŠGs؃ãæcÌÂ*ö`Ûîq -$Ú{³kS
9Ú½Î8-³²¾ñ{Õ›×Ùê9¼#•O8Öu¹c©{ý¥–¿×”éê'XÐê´ó·ô~¤sé;=öÜQ_”ùªð8'_˜"Ù¬‘±óÄjг¯cþ“ØíŒÜ -ÛAv4N}\Me™ÜœSy&‚Žm/Ï\ìÀÆÞ³=Ý™Þh;Ÿ«òæYÆYr’Ät›Úi]ôñ¿³íWÂù43·æn$øÔ(·ÏY—xØïjyòa°c¸èTÜ* m*ý“̔଎0;‚ü^‘…áG/ä±~ï*im¹Zpl´³ÕôµàRt@¼^Sc@á–ódÁýÈO›î¹åŽï4|N¾6æ0£ßmAe¬ûƒSAmM¾FK¾õ=Õ^'ÃÁ$ý[0[ÐÜA$gÔ'Ôv0ò0ó°:°Îq¹æÙ½Œis¿Nä.
DV€eYnÙöÛgËß_ù¡XGSêúú6ê/í4ȳéÝÖp]x_‰f3odѯonìÈv~¹„kØÀCþØL2zŪåº5‘ØrdÐÛsy¶×óXržMNÉÁ€)¹Ù„V¯7mR_ëñžS'¶ÆË“x‡s§^É©Øѧڙ,Ȫ0ŸWdØ-“l“lw-³¦~‘I+1HÑcåØ눥?õó[[ΓC -c^_¼go#›ƒ±v»¸óÓ6–Õ_ͶªBã™ŸÏ Èë:¢7CÕXÁ¹ñ¬–ÿìäUæf¬ü£SUÍ›6½GL[Tl[
6„>·*%:6fÁ¼«@‹º[,7[É@M•tãVKÝk™s«Þnü¼Gڜͨ‘kŒÒnŒ /öÆHF¾\ͼ¬0•›úIɲ¾fö_n£OøèCϻذàNsú\ÝåÕf²¥}öôÐoöX7v÷õ‰Iè51Å6Ío%‰)O0êç»Á{æPL"ºïѺϿõUÑòdØ×>–նÚ2Ö,H¯YË2ô#ò’Ôžæíîªýg7"iªDT~eØ„WÛ¯¾©OP()jù®ya}b8vpÆ -rù¥Ä‚U¾ayÌê¼ó^’J[ƘÅçnÕö¶s8SûÓÓÙ7Æã]m½r”iP9ß,ªIóŠŽ¿º:ø¬“àä%Øòl¯Áƒ4TÄ0¬k]««5¹½mœxŽ3á‚SléËuÇ~ï4즪F†G‘ñ'M…·A;Ø/ZˆŒt
2ªi‘Õ¾¢LjXä™F¨õ*8v fª_„GQ3þ MÄCoÕ <ô™--ír4\vazÊäëα°Þ²9VºË¯ð5Á¨–в[³oåÍõÖW…™ž,/éŒi6uVûÝCÿ9rïn2ë‰ìw¿rznUÍcÖU³É-;crÒÖúò›?·cÝi†
nuä}ø‰ßSŸ`f -ংãÑ©îOÚËG´Bh¾ùŽ[äð¾7/8—mËÔl·9¨XrÉ”SööF¦Þë£èpgç6KæíÛÎÛEjf+,8² ³+{T¤Îð¶k{ñjî|~ëçJCí[Ö̳¹-Ë0=HÓ趕gâöUOcï!“yðÖê¡Ê¤g©‰ßëHh -'qf×Ê?¦hÏýª^m}ðNÅ4>`¿ÏÙ -Ûmv -¯`:y -z.n¨jÁ³k.ÏvÛøÐú üW…ÏRûr¨„•ëD9òÈb¹ã>jn+ÑÞÿÒ±‘–ëŸ%íÑ4äHêÿ3þfm¢L¬X»Pƒª8‡/”÷ú‚ÛŸï³´Zô·Ÿ?³ÌCê´IÑ÷´[~¤¶<§™1×9õL -Ì3PW0'Ö„ˆ]™sË †qæåbþGÍìC`{lQÈŽkdxäùQ
Æ4骘ݾsg{N0X8g-S¿|+…AÃGË•BG£ÊV+%R[É#[Å,îlAyRBìÀ -öæìý8¨Q×=kºVï÷Ì~!)R¶-å.f–]4·:góAÞµ^Œ¢øš™HžŸé©Ú &’¯1ûûD9__5jÕZΆ̛Š -½å'N%˜ì -¯çÐN2œ)É2€,8ŽÌ¡¿²¢÷¼ñéæ‘áK¶gRÕñ=1“¨ôcµŒÓS«ÃGòÒÏ`ìÅv›¹SJÇõêÂ9¨¦[/~c“xö2;©=µûÞ?.cº~¨ÊJÂÈÑ*c:Í -\‡ÂŽàD²[«G+ár0Ts¬"P#—¼Zn8çú}Ú$>y¡§ã¤*õ}Ôù†õ±Æ¬JôMv;…ý|nRÈ}ôƒ'Oñ\#«‰I¸ü±åŒ5–°’†Üîræ@ñÇÈ«8îôËFªÿÆÝ‚Öׯ)?7Vm+ÏÈó–å>l#3V}ÛtY"Å‚ï-ÕØR1¯Ö$ 'Urk¬/°õ}S8(O¼Áž#fÎߣ—[K]bÔÚÆbb
æÓ}ÆØiW›éä#lÒ™›ÿ -â:pÚøVõ›WÑ»Ú_ùJ¼³ûéVÜ
ÆQSá‡OÍÑ)×áèÙtæ`#xN®g1Ò<'º >Öûh¹ƒ¹úÚw–•Î(ëižðÏ—œøš]UÞÆܯž–¸={éë"d왶¹×7¹5[ü2¯®¾B6² ¯ð&h#§álDiew,÷öÓˆº -qïh·åOÄôµªŠq9ÙÃJ"±¡¯ûTåG–‡?µF[^CFÔzþ±\ÅŲXÐÓ|zæ§T<ádj14º³_åÙFáe=GdÛ€m»8¯L|²!_úÜkèjOÍ>ê7ãÅ*¦í{=WIfwô3-hK┾gNøÝTŒõÄÖœ”dó–zLZŽÌ8¹³.ŽÍªÐå½j -Ÿ6“©SÈ8«Ázgq×7+©]Q¯AºŠŠá^LÒZ]ÆnsìÌæ”O®ã¡ÕúQZz6O½ñŠ¸øÎô5™KkÍJ¸³ã®U£|X÷$‚®ð®EK,Ý q -x5wÌ[~U˜â‘w”€#8´_ú½Ç{sÎÉr&Ô¨»£ô“'m¬÷&«˜¶”Ôî5ÁñD{V5ÏJÜøVÉV£ñÖ{G¾*©,þfÆn5£àÝb€Õ{<Šè^‹P5ûÎ)BšPz¼NÙ¤cpGDì`dßäŽ -N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½U…ÍOG[¥1îUJÖò.ó&Ð>h=kšÝtî¼ÂïA¶Ú’DîÈÍøªð!óúÊ -än«´Áí=©ˆùÝYã8~?òã¼V²î›§Èg0~òtíóØ󂳞¼¸µE^”Ö'c]Áû¾ykÓžYyèZó'Ïngw=›–t/Y厎hìÀSå¡Š%ÝŸ\¦„-˜·ðÌô7ÛïÉ~Y¼g;Óaº#Ï3‚×Î?s ¼ØÕ*Œüü“ªrþë -ȽwÖì o‰8è˜é\Ý) ÞZŒ3vJËÙwƒÆv\wÔÒ9¤rÓ%ð ÔÞk‰^Çâ¾TêUs³V4CÙ!íÊڶ̱zK×J·0-ÜÁÀƒƒå?ÔˆòŒ„é–G`e%O¾´6ñ•ðA}yŸÿ ÌB;תÑq>ˆáxµN],Í›‹ÚÐ ¶’(žâæa5c¬,L¬[ï7G'¬4Ž,‰kiÛu1+ÖÔUýÉkë00u1kux´˜½_[}T¬æCwZÏ—Õ'R*ú[k-Ý«0·…™1Íúwªýeβ%{ÊàAWá¬S)y±ý–‹²ÍÝù£-w -A¬D_¨ÑÍ¿²RRBõrP¾=Õô²Ú¢WfFD%|¦1¢uÿÍädšOc¶œdµ¬Dì=ëokF÷ÎõÕ·‹dÂ-S4ŽôÕ}êôbzNÆ$µŠË·gÀ©uº~dÏ÷+á›é˜<ˆ^ò#ra¯Î(„˜_«"íÇ~¿ênåRøÈä¯ -ߙλêNß'©Cn0EpF™Sòå°pf§â`ùœÓWä¹}{ -eñ2sfÚV¾¤ß—ï•;wavÆýªð9S¥°šà*à#_¿¿“Ø»éþöÒ¢í¿*ÚÓãô:™ƒFÉ„‹aË^TXßíÅIJVkó^KŸ;Æß= -6ÕÃ\ÖX‹0ÜY lkµÿ˜ºËd¥¬€½ÂywNÙß¹„ö+¸¯µQWøZK=ß™ò -Ò÷¿Jíu›ÎóþØöŠ…Ç¢7ußÁµNV tÜY/ëðĵY`gmëT2/Ø–9eW;òßu͈kÑòãS|d{1W¬V,¯¹ -²-¯ÈÌ|ïÒÊM—H¿–ïlgtÀ~Òœ\®UÅ,KU0àÔÚóÛž•3ö,+_Ô0Kõ3º³¥ZDã¶í£a>¬±tÛîÉhVøl±×ºE+\Ö-”À¯kÍÌ©ëy’³¥\i±–µnQ Öu‹Jx¯Éh{o*«œ%£½ô\
Æ)ŸX¾·l»i«g KÕ°Ý«¤ùHxܽŸ4yØU¦<W
4ï rŽ -m–à/ÙWJ”mm±SW‡¿ÏºŽõ -lOYîáIRe.¼4J—²|‘OÖϪÛZE|¼ÉðôæEì †s®ósÝ¤Ï w{ò2L®§Oj2ÈlÇ®êÝ+˜ßT½eÛ¦Äk‚ýªë• «…¥ +™´¤M]ÅÈ¥mß?¶µÂ}ñT•‰v+[Dybdß~µ(ʶg$MÇa];Ë°†÷^> &¨p_u5"HÁ›ÙL”zäKÆ·sí`g1v/˜O¶Rz¼ ½’ÅóSk³&vXô§YFuc™Ù×#¬W>´/I?H-¾£NˆM¦ìm% jqQŸc9YËéid5‰WðyùášßÀb«d-C4ü%ø‹™Tè©n{Z«ªëÒ©³‚×Ïk‘¬=bò*^Ù-Æs’•Öóðu.ÿÛV7 -‹œÝäªF–yå -ƒ#Êà/ù|g[¥¹lkåDO†ÒZ1«œ‘ëøx‘לº˜ÑÜßð|<Wп™Ÿ3ºÛȬÿÍeSýÇŠ¨çºåjg–²nYÕË=¬]Áµž—QK•W÷\lØ -Ž{®•Œ^ëy™£×Xœ‚5ºl¢AKeµj|}‹o¶í”|(ëyàk=¯W8]£Î.m[+atÖán×$ë¤åB•WËe7t´e=¯,ëy•èZÏËTÎCÁÌ'ê¹ °‚_ècæBÚ“Õ³‹êCË–Š3«¥•M¯´æ6êú$÷±VÏT×۳˖§Õ¬Jù Ûò¶m~óñî>ÍóYÚà*â2³±%=~¿¢t±eÏ'‰]Y¦=ßB›~É‹l
V
^k¥f˻Ԇ¼YÈou*}*3v0rêøÌ™_+@ Ô¹–ožåboO_y®&ˆ2¤±|Àé¼õ™…ö˜ÝcHá<âì‘Á¦²f»?Z¿ãvíS›âŸ˜:?BGèÙŠ.Ao^p·WÙ`_£y׫Áܽ¯PÌŠ)äZ'ëÇ•mŸ;¨ ¶Ú+è¯ñv aº––ñ+è•þá›mwµÍ»ŠLG+¸¯ º¿ýg²UÖ²íFBõ `…FÉ:CÿýFÞ·2f™½Ö¯l׶ö|=û\„voí#x—%ÙJøȬÍX=»Å‡Ì[á^‚€dw«nk¢m,еGë;xÆbð´kW˜Þä~2_h®\¨ˆ¿1HªÈ²e«¡ôô”Ãl™fxcµ¦N¦íŠÏ†þRÌZÖÉJ ÜãsMš–Ðe¡¢s}jÐ=ü˜d8—èÉJ×V“¡2µ`#Ä{©êd¹g ÆÇÍ&¤·ö¼ÊÝ+á;³õwÉ.Ñr£kÙñ·æÝÓJdeÛ‹2dvùd‚” éι¸ó -·,ãÕ¼«²m¼U‹Ž«s°òŠ+U¶Ý~f¡Â}ærË„\£àòÌUÃ%;7-¦¢ g«Eûð\U&Îͦà-œK7•:nd…¼ƒö˜¶<öõI€÷N5!Ö{‰¤òa süµí¥BÁ¤|b *M(?m -g–÷¬ÈgåK]ÄDµ·ÛûþØ{×åºnkMô ôü㪤ª©àÌí_¶r9û”r9qÒ®®.MQ6;馨8ÞO0.ßÀ\sQÖºÈâ"½vÊÞô˜˜X -‘¿: -x5Œ%ʼoü¢°î”@ò„ÀC 2Á(r}ײŒC˜S̹ÒF&ì•@;oªØä|£dµ¹s„ðdµæcPÍÀʆ¯I=>¶$K@(´‚óæOrÙfÄsf*÷´€³:¹—Äb~·rR¡sæ{r‚Ò-D€=k5tÐôp9s^QdsD0e¯9±™®a >ÀÚJ48
h¨lXõSaeÞµ,„\ãj²§Ÿh«ÂÉl#i<Ä‹ÅþÒb@Ø@’×H›Ö'ÇuÐTfAb¤æ¹ñiåV[i+0ÊLW'„°tãQ‘˜”²3Yƒ_9¼}BPšŽš3òŒx®TW×ÛŠcuÑ«”màD ô:Dع2„àJÎöÁ `J3¢tPÈôm)qå3˜ß@ilu‘7TsA"†TÜ`¥ÿ5ß{åí¦Ìv¥m“X>éU…@‡ln„8ÕÓg7ºˆüÀ)h:€*Ó:C'*—\–E[)ç?j4,<Öx´„ˆ@]ZFÒÒK¢±”±÷—X#2vº¨©ö›ltýðAý® Éë^¡Àæ-qüYÚÖj¿3¢FúãHƒÜ¤ªt*.£ù9Çg%Ôlß$<‹|Δ2÷›§¦h"&ZbùS…¾k·iIÖOÕ¼æšrp&ˆól³Y`%
ÕXVhTÆŸM‘ ñÛT²Ÿ®¥EË¢êÚý´Ž½JVƒ–/o@ÄKfˆÙªÁ{Í¥Õ·bÍ^aëxG鱟ç -5”L§’_VˆÒAóÉjÛ$&µÕ5˜½œfä*©§BŒÕÁ@áue5ÂDÆjÞ\ -ûðQ9 -‘sÑÁ ;-&;û±b%È]¬[C‰ÒÕqaÑ–.«ª+«@]s"‰®ú:ˆ|ß+ƆÕÿ k_ƒÞ$Ž'Έò~EÝÕ¶š·FD¨ÆQmE+ -œ&«ÒHN ƒÙ}4®™ì³ Ò •«^_q˜‚Z9ùIb˜Íœâ}mï'N÷k…ü6ª45ÌËØ)I²³ ‰ÊbÁ>ª(‡³u%ÿ•1GQ$E!”å×beõ‹¶W8)ãòë«ÄÔø9™w±³Ád\éÂU—Œˆ -f?UÙ´ïp´;‹åOv --õ}Û̃µBF>M¬jtRE€‚ðCó3"¼%ùnmxÈ÷èäË‚XWý½ Ûm•ù0 8‚F„:]ô2m)ë¢T0`¢ -"ˆ -Š©Ã¡b¹D5.t…8‘ç_ÈÌ*’,§h.=ÖhØ3#«ÿ]ûl-¬)Ö^M„JÄzj®Æ¼mS[ -ƒjã©!¥ -‚²6ˆ8-0ÖÍÚz1Q¡Wˆ\ž
2ʼkÐ4ÓàÙ[!rÁi€’džk;™4œ8p½Ìˆx_qxæm"Y(üËêÄ¢<ˆ`ûšà=kkŽ¬m蜛32e,44)–7'¤¨P¢qÁC_m[+l8ÛÁQ¢¶Í—/©ÛØË…åÑÊ.€½u>…™ùbÖ6BZeõXÄ0K‰š‘ý(ðíõ@æBõðR€€ÚƒË Of†Ô¶”]P~,IJê -±oÝQ‹B«oq%²ŠjMâ’É/Ga4H»Ðê[ÔmP7š“êªaùQ6ŠDFƒ+¢â,ÎÛÖÙ ƒ¢JöB‰áV@ÆY¶å°-¥É¢â— %“'€‰ -Ä!K°’¨ÅÂEY`Cy:-Kù$*FM`Z!rPl‰ƒèõ•ƒNƆroCf§D—‚úvÖbÎf˜Ê’˜¥~ïª5™ãþ½·R®dEb`k4®
÷5(TäœÁÀêhÄUSà¼me"³…¢®×2аf½f+r;#©å´A¥ýÝlaLKL¦¢ØÐ{¼Iœ3
%(t³Z€+Ä~]b -‰Í -€f”½‘<2=óÔ㜈´¤Æ¼-
©"yéóâ´ôùy8#cž‘’æÄáŒô÷µ½—xï°Ö•Pþf>¯„Òéóˆ¨<µºZQôÈe[µvÌ¿Áœ8û^ƒ<û¶i–ðd»`Ø+VvÌÐÝf»+[mØ•}âbÏ‚<¶·IA³càfp¯v`a -×\!ƒÃRµ»
À‹i¬÷ðí{0oëÕ•ËB…fŒY¬Œ¥oe&WÚ¢Z©b4œrÑà!È5¥‡ÒõžÉ3 -IKoúÁŠÊ‰´¡,ÚšÔ?mWˆC^!Çy•ë¢½B¸^ù©!ˆ{ƒðž í³S;ÄûA\Qfä¡6P\*»CÁ ŒÓdÆSF(?U çm“ºú¥î˜äIN¸7˜ˆ)hYñyÛ¡:%¥¢9lj®“-"2Ò"jæÎXŸ‹(É7'ªö‡šâ`Q3’sÚã4#ÚI’í9këL¬™iµ3â\ž‘‡¶L¢RWª>à,D‡ËÚ"œÓ¢Ç¼`hÀ^‹‚ -YM1Þaw9ª|« ‚‰8ÌÌÛVÛÚavš«¿$Ž)¬'…›,Âi± -¢ÅDDw1ø4#Ú" -ï[m‹•M‚³$²0²ü -Ià„X2cfÏZ!2`:dýd -ouqÀœ)š+‡‘PõÛÌÚK6ª1 -²t0'#=Æ)ª²bg\!›ä -öK²Ÿ”6ŒŸúCrùÌì¡ä*u–#íH,Ë0»*w˜µÈŽ¼>'#©…6SXšˆÉÖ¦›unN&»X…½ÅÚF@ŃŒØåÂ2#J`¿ó¶#AúV‰sûý Ó•§Åõ¨W«TŸ€›«=ÃàšñþÑÖr¦ãšÄ¹gÝ$èÊ4¤pžSÌù)hÍl$}×¼%C(¡ŽŽ:¹WˆlùDƒÌÕq´WœÑ¢–„cèÎÀ„ê8No4Â'bV—ø -‘§Š%üšû¸2c½h½aZh¾¥ƒL%ÁÛ¢m‚¸æHì :ÁÃFy„>YÄ>'¾«sŒÖ@¿–í#J‰Y[’XÔž¦Å7ÑÏeÃ9"©¥'̤#~Å¡Jaó’b4o›Q‰gæ¦]!—î -î_Ëo˜;ŠÝPëçNeÎôt¨×®hb;Ê'ÂU=#Î}+d¸ÀG¯C÷âÌ8Tª6-Í’væ-yYQt\=Ê3¢*Còþ ‹Íít–LÁL´|qjIÜ̬ZÅ<k›Ä&פ®üÈ2.ùˆ]8Èà+D…D¿$y’JÃï—Az´ÄPµŽ¥VgµœˆÅf YÛ@øS-uFl’
‰@žÆ¶ÌÂUƱÚâòpØÚfQ5˜™çÁ53òÄ¡›Y!XFÈ]niJv€JZ³0 ÇBÅAðRËEÔØ¢ÏV¨ˆABÞ™{…*±äëAMë9‰”•ê%©›ŠžDÔ½a»ø›y Òq-€ª‹V:n¤ÉfLUg°+BÔQû²Y…±È)C䜌rËi-s›¾§¥‚šV -Ù.s¦×‰ZÜ+´ë)2e”QÖJ^7iÙGƒô£*ÆA4¼`6òQoyÌ~|C0÷ñ˜ÓÊÍEE¢¤æò¼Åèè…-ÊG‚!ä<ØìŠ+«¸4b®fHꄨR+åщ’È=·±Ï‰³¬Q3dÞ+ÌmÑ8 b -j»Ÿ·¥DÌËÔƒ¤î¾y¦T€,:²`ï¯J–TŒQÕ«4K¦m õqgmg§‚jÕ´ šgéõŠÝT8ÞÜG\M71òOÃœ8,¼ñ¾¶÷§qiz^X±Â#Ý„JšD¨'À(¢ja|JìÒ4‘@Á~QK6à0pù€zÕ(”£+M^o¸}FK*Ñ‘ -´‹Ü iVëuND‰Éà*¢ÜaÍØdvžjüÉŒ6ÒŒ<†Ov).V$ ÊpeE‚¥ç–ò5_ä()Ë2f¢ü ÛÌê–¬ìT…¡ éL£õÀ½YÇáôäW1—w.s> -èæ˵â—ÛÃLö…Na„`šI’2³mîΞ5Ük -8ô+óêòî/g—Ò¶ßyv{y÷Ý›‹»Í·Þ/öî|<ºòöfâùÉ}È?^Ü~{A+ùˆ„ mYÇSü?ß -ÍæÂíÍ!³•×·7o6?9ÜøÓËéï°o4msÛ¤´þäó¹½`pÓI½zuywù¯ÍÕ©ñ¸®7Ÿ×ùù»7ï>÷0ŸÙì•È׺¾8Û8ýåüìêü7¯6ŸÛxáÓ§Öm,[̾~þO<…M?àê[¤’œ]_¾9{°Ò°µÝi;Øfwþd‚a6ŸÉc³~ƒaÄÜ»Åa9ôcÿd‚a6ŸÉc1è<ý`˜ÍëÊ=¾h˜#†ä_LËŸ#æy|8Ìù“ ‡Ù|&ån=†ÃÃaå2ú„Ãø_J8Ì<ÿÐoâ'³ùL›Aèq†Ãl±³ýŒ<™p˜ÍgòX$¼C‡9hÿÏã‰æÙâÈmË<è>ƪ[Ä¿ÂÏö~¾j"à#ü|x üE¿øϯËÕG¾ÞÎòµ‘@ôx®¨Íe¤jÑ“,~¬“säh[p´òKæhOþÈÑŽíÈÑœ£ý"Ú‘¡:C» zägG~¶ ?; -hG~vägG~öøùÙÜ©óõv^ø'ÆÖ6žü/ȇw<6››úK>6OþxlŽÇæ/—ÿ¾¸úËÕÙ_o—xˆQ, ô©ëK¸“¼qô¤õ¯[PÎÞxLœïöâÍ͇Êk½B¿y)ŽÃ/öòÔÊŠøÿyp'>÷»“þÏçýïþÿ?ïNžZÈö±†ŠÌë‘ÕPyû=UQÙtv©†Ê†·õG/ ò‰§yyýêâõåõåæ.Ë~R/Îî~»Åu0{ãàÄŠõ¡¿ÙlüÀ#õ·™Ëc‰Õ?,—luvœìèU:øDó›7ßß¼íéŸß}à°?>Öð¡-õ¸f/ðåCØØLøÏÍÏÍ?âØl>‘„Í'Âü°ñD>0åùDüAOäžÁùDÒ#áÈãòÜR/xLWçÏ_7ðSÛŽo/ï¾{sq·¹¬ó‹½C‹c§{L -ظþÛ1#ÿ“¡5_ý¸yø×°É6ŸÈxé|"ÿ>ppèÜìæõë·wt$n/^mŧwæmtüÿÌ3ýe( -šÕÑ$þØLâÇ/=>‹¸;<“øQÝÛ…[¾£Â÷‘ÏÌQá;*|G…ï¨ð=¬Â·±€rTøµÂ÷TãÒŽ*ßcTù6®ÃñøT¾§vÔøŽßQã;j|Go›Â -OEçÛf&®õå'§õm1£G¤õý››WßÞžmÎc*ߣVùž$"ÆV9âž¿ó+^l¬þ+^|r†p,ãùS9V¼ØóRFˆ'Á›õ;–½¾ê‚¬€,ÿÇ7WgçÿüüDH7ߟ_Þýø[áÞÞýxµ¹[[úDßm -1ae‡²®ÿv{výöõ(‡³ßwj]PÛ1ßä1XCdjŸD=ÚC~áöŽœûâêê¨ëìy±šÛà~|+ø§Ï¾øOï¾þÝõ+ƒ"R&Ê׺¹þKï‚Ë”œ -ùË‹o/¯çžýé{íƒ}õã›on®Øvqòååí«_?s'_ôþñów³ÿ¹“ßöþüÌ=¯‘þïÄ=w1‡)ÑSsq’h›çEÿãy‹SðåägÏFPÎ?~ìÿñÿö?þO'ýp’Nþxò¿þ·;yE¿÷×g§Íçéy(S>i!¸ç©ôŽÞ¹Ð´Fäö<6ßN¨m~bNóóäƒ'bjÏkp•ˆ½+úëœ:HéyÌ™úMþy!SÛþšŸR$byžRLtÏs©Ôk -Ï‹÷Q:ˆþ9¿ÝŸ¶:qÃø¼¤ªDo=¶”õ×'?Múrz>Ejš\Ð÷£µõ¹bà9Õç)¸Y¥Òücykå¦ý¯©éô³öÙú: ÅM¡éËíyk -Ù»þMˆØ»Ï>1ѧjJô¾‚æ^žWÏ«ßÉaòúë-5þø¼¶”&!E7}»>o5Ò:õ5ìëÈ¿Ô—,õ‘¶LLLŒ}BbmÕÛøk(ôS¡/TÍMÛ¶Zx£ôo× -»Ô÷AɼMr_çvòâþ=õòÙ뾑cqµñþõSqþèÿ½lcZ-Úå-'ú`îùDÍ<ígÚ¡oÿ¾½OZ¾Œ}šŸ—Ì;ªÀÙ¥>ç]hC6&UÿÜ……˜sÑ¥ªýuÇK&?Ñú‡J1I—-;þz½aè[ˆ¡Ÿ‡¬»¼†>J^@ß×L>T‰tbé}deIhÑ?O±ïb~?Çþ[üUÜô<Ò¬dQ«‹4Uמ— ‡„{/ï÷¯¥ïÇÐ?Šc2}žªç©Ny’Õ/Eöiÿf½"“ -µ/¿ß×Ò§Àäú<dùýàe…xQª}ß ašd«ðúKý?Šì Ðû•ú¬ôôõ³ïôÚ7ÈY¡_Æ°Õ{Û©HÛÔÙ‹üX’µ)¤’ôPTc4?çôÕ¨#hÔŒ^åý>™I~©¯¯Í–[ /Á”„Õôãäs÷_¡êYï[R7F™¼Î [èÃ4a•¹3"ú¾B‘GÕ÷p›˜'b¿xöûÎê?ûšþq'¥÷/tºˆÅMÉÒýH÷ì>U—‰Ý÷ÅêÇçä_ô·¤ó2MA"1ç7ú ÏËy M ›¤ŒUëçÒŪ‡¤óü¬<"Zaî¢v6SäÛõsTo©Ú:oKʦ0U='à}f§ÒEì—¹ï¤V*wQú%1q´}p*ºzZÒó“ûò¢‹Ü7«Üº7ñI®Ÿ>»R‚œ lfú1HÑ5ë¢óÉåAÿÂY>k?9{ùT5¶¨›9§ ó¥ŒèËÑrÉŨ'¶ó„~ó6Ž¤¦N²b“·ÐÙ -̈eçšt»»É79D̆弴–ô`”>Bë"÷Iþ†Óå¯M¿r*Îa¥kÄ©ÚÇèCoÅGy@GÏG®Ìa¹_ï•™¤<ÙAJÓl%C±u@ë¾ë›°bÁzÇõ~‹×}RKµµHõ¹Ë
<I~î[-7e´ñFa©]–¨³½ý¢wñUÿçïýŸéäW¿>ùÇÿ 1êû¹,µ…tßáÙûèì}pö>6{š}Ì^fïã²÷aÙû¨ì}Pö>&2u‚U‰-ï½h“U@Ô³ÑÅœ>r¥Ò½ûRÉ9åAcäÕ>H"ÔƒçäJÌ"“¿9F•+»¸¬—89í¥ŸN£úìôž|Ö«¶æI;ˆAÞú½°Q¤~ÀTŠìÂFáåP•TMA;qAöné{¶Lºò.{„©m“Qôªˆ‚ôcÑc)H”»w:´¾)ŠJhýTuI†ÖÉ] -JöXæõÖºÎ] ñ¾é.ä&o@2–.¿’ÌþÒ´VŠ:¹Ÿé]#ݳUA«‰¡z!F:€/T ÅW!³4Íý’ޖݤ;\^×úZb’˜l€^Qä‹ÜYwÚ‰%:]£»jðRÉ}4^ÛÖX´ƒÉ5ý ʸ;×s¥éÖŒ¹ÿõBå·~ÚZSazÔ§jP½Ë†
Ï"<^/1¨Ò<y¿Òô´O×U<Õ”û'ÀÎix¿s…\ðå£èu˜BÀ–VE™ZvÞ¯D—£j[N´f&çxCvŵ¨[7¸âU(MU{e¡ÒɪA;è=Úö^uëöëm‚T['í o}]Á\{[ÑÍâóI8<)<Þ©¾ú¿õ˜4%nŠE—€N~¬~Y4¹c:±ËÄGôýTµa%-ï_u)ã:,‹•õÞêD‚ö§ «Lú>«Y/U-¿¼ô›Ùž ÄÎu0ÙœjBe2=8êÞ;°¦]õ…¶=^ ´è±¬¯vÑŸòN.¿¾ÖY.¿¾ÖX«~cT¶³2©.,|ÐgÑ«Ÿ¾kÅÎr©â»Æ~ÔµSº%±1œ w@;^Š>¶2©^MwKHtas—BÖ…ímïsbé -ÉüQ*#HtëƒáO^tÙä¡4ÑE(Èj -b°yñ>~(d¶09çõNå:bN)XmDª"YÍÎ\$ÁMV±‹
“KÆ7«>ú‘P1Ø·it$² -P¾TSWF¥Û.Wta*ŠÑ¢*Ã}°7[µBQi%zˆ0‘äBé ˆÅƒÉʼní‚D#µ‘QnJJœ¦¢æ¤0e]pÒloÙ>îœô§ú¦*~i}vÁLŵPc²×¯*ïò‰¼Ö…Á(B†‹^MS‹ï[Ê9±01&Š¨zw'B‚ -®_Qòbµ™1’ŠtÅ¿T²«A‡`Ô.qö¯¨ö3çD -ëMû¶Ó)ô“@,^>?Ùt]ß=³°k®ØuACÌ‚B,Aºð¦6tá
ãêr0®¢¶¬¶:lðNìŸB‰mRA4Ø2ö–
œ#°]OÅk–@dÉ»°ÈG¬o3ÚòÁú)T:m¸X¼š”œhdbý4ô“ÓÀRŠìÏ)•(!5«’†˜Kµ'éÌÈ„™!øÞU”³OvÕ4©«69x]T`NÈÚHȺ¿‰šrjìb´Š -D®pÐ^*Ù{Q -«Yç -)Ó"±Tž–¦ÊÞêïñ…ªà.ye©}õ¡ dú^v"kBì"‹vá¢N¢³¤¡Ua#«ÞÇÅPˆU5•E)Ú6ãbèk•Ø5h -;¤†úfnmþ¾ìCR#…Çõßj•Ío¤øb˜‚Ú$]Êa*ØIÈ]Qu©O¬a’«‰ïf"ÒOÀ‰c±k“ûŽÐnIG‚È€[¡/b›‚U¡/“¼ÒØ:/ãÄúåIqs¸îœÈž¾ Ÿ—á'‘úæ¯Pc‰œ˜svr¿Ë<¶§ˆ<t5GlÙ\Øz×i¬uà̸‰ª¾È†”ãˆá;3Udzbá4x_dU¶¨Ã¤Ö—³ðNôapï® øI‰Õ‰rWh÷zíw\îÌ¢“HðDœxw±ÿ:ŽÊ-mf*0î°NÌrš=Ë«P°Ðúñk5Úû]€Wïçd -ú}4/Ê1Ó‚7=:O,Ýt2³!v}K‰]Gí¼‘ nÖæ wn6ñ@drò¿T²â½ã•‘ÅÕIdµ±4%†(¡£‡©%myH“jæðjY8eµ·Éî&1UŸ²ÚÛ÷¯Ê¨¤‰”Ë–µÙ— û€•á¬äiªÞÈ]óÐ_#˹PÉÂÎ
n,wEלÕÐÑÇ[Š:è›9ûfàSìHßÂÚöº¾ÄÐ[V"é—è ‹E*ÁG5½w%»xq˜““AÄ“NŒŽÛØ¥ƒ&jŠ’E('-½É§ìû¾x¨î½%¶-E˜@Kg[$ðªm»€%“'†%²ëMõRÜåý¾¯sÚÎQºT#ÚJßö“žllªeé3„ÙFä(–{²qFÝ_ì±.0C·œ¡×¢×8®6§UØLÄ#¶ëp[€!ôŸèÌKUA7U¨Î¬ÊeÓ—A; ·JÀELžÑ‡û2Ê$Â+é“WÇZÈJtª’3·trß·EÈ•Ô—J®©öÜ{€¿æ)‚hŽÿ -ôÿÆÈfA§^<^ªµƒ
™Tm›y3‘ç -ýf±4± „Åc¨¹ld2mñ—JÕ‹Œ.m‚wV˜,Î3!vÑ
A}‡fŠj…ÉY5í"û]ÛªNÞ[J¨¡½÷»ÜÉ*ö Âé5AÌ‹ªyèKbhèL`‚ìÇKÀwÃK%×uqÙX Û™õp195óï9Q
Hv²š¬V®¦™HõRÉ1W„†`3‰@ã=Xz©gªsA•Ÿ\kˆìrÍk‡˜Þç²P—Ⱥ!þ
Ȇ˜œŠ¹Øt)dU>’éáD„}ýÿkÆ•°²8ó€-…—÷·&ÌߟÁMýÓýê‹W7ß\œ|q{÷çë¿œÝ}wòåí»·ßüíææê×ìÏîðyö™K.ºà|gÝ®¹ø{·ú^žt¾Þ9Mù]gSy\ømp9=û¬t1¾üιgŸ}ý›þS+Ñ´Ÿ}=#y0_ó.^}Mã¡ÐÈϾþ¼ÿ3<ûØ_=+æˆß-lQ/ðØÔBBÅ¥ªµ³ßÌ2ù‰YrÑŒ\lGæ÷ nãCW;|»ÄdM¤—p4£Ÿ²ÉѬ2cs"ožë‰ì—%ßÝ}û:ôðuy0+QíšÑÂÔ:‘],fdA™É¾‰Ö@çQäó>€LbçîÄ,6ItÀÁQLžÝZ±°Ú⊹֣…ä91„ËûæwÅ" -¸µ+F@§®ñåDDºµáÅîŒÛVñ*h[‰-èÄ)Y@eI²,$ŒÅ1 -i€ÖØ6‹*G¦ÒwÐ@öé½öú4áãÍ+ˆ‰G
Í<ù: -¬8™ÕlìþÆç -#GŒøv;±†¤L]6Ò‡tF÷#…4¼Tr‹p'Á©Ö‰SˆèW>Z˜9žÌ.NTµ PSØûYCàžHÏ×ÌLHšDÓù±cê -ÄÄOZÒt -æ'Æ’*‚ä¦ Ü¬¶J6‚Š SÕŒoÃû¤hÅRy:úk¸oÈÃ#<¢Á:U)€Ãi¯ÃŠÄä™^ª¸È¶Eé5ƒ%:oê<(iJ7,+§qY8—Õ?ìʼÛÑZý’ìá(
]¨3¦sÔi±ù^‡)¥¸ºˆïëTyr›û]hWf¬8e'–¢6†®£T-¹XƒÈXƒšðÃ6.%6óy„¦Ùb"ùU¢KXm$+aÏ:Ô<€Çʲs+ÛTìóÍaFŽû}ŒX›¦^MÖ”˜àô9ï‹ïgd]Ü +¾t +^^½ÿxûZošüðþ?‹~ôÿüøâò‹rSà‹é½õþ£r·D¹×î/þOy‘õu ¥×^__½|ùéí¯ž>ê
sý…WߺµŸÝÚKþ¯ú_ýßoNL&/m2yý‡Ì_/~ôã‹¿û/'&Mûï?eÎôÙ<u9‚Ϫ–²(W-õ _ÓêãyÕRˆµiµ\ÞÒêã¼j©(ÙÒ꣯ZJû¼ji‡äá Zö4{úxVµÔE©j©<KUKåßYÕR¨ç]fO]ÕRšçUKùf¹j©{+U-ogUKym®ZÖ¿»ª¥°ê¬j©¨jUKùž‰ó²Î«–²§rÕR(“«–ÚgUKéâ\µÔ.NUK=ÖΪ–r@æªåVúª¥Ðà¼j)`‰ªå¤© W¸t^µ”e¹j©ìJUKÅÛYÕR–í¥E¸‚Ä\µ”öyÕR–媥ncŒWšçUK}ëE¸ÒÎUK[§¯Zê²z}›Tµ”=rNzåjªZÊörÕR¾ÖYÕRöF"½ì¼\µÔwVµÔÁ™ª–ÒÎUKé³óª¥öuªZêx)iúôñ¼j©Ë¦Fø„›>}<«Z*¬RÕRÛ©j)í\µüŸG÷ë–î?ÙeÊÉ¢Ã¥ì— +´£Á} iq}ÞÖ-)®×bÌý²Îó’û:¬Š]hký¸Lsi¦D?[»Rå}»\ÞûúœönÄ÷£¤˜sŠïGOur|?›Cx¿ŽÂûuÎ +‚’zà.9¼ß-^ˆð¾&–[¤è~ªç¶mOÑý2‡]t!º_7¯7äè~Ù,f¶úmMê•›-¶¯ïë·ã¤Ø~,öè~/‡>G÷Ça•îÇb[‚ûcð3Yî×b§líqåsl¯Eµ³ØÞ‹6„ö벧«ñ5ל$œCû}¶ðßCû™’¯‡öëpÌç¡=%íÁ-²×¯ÚGöË´)°_-·n½%Á}`¿V‹õÀ¾^ÃÐÀ^ÌÓã,°—¡TR`_nlØ×uöý,°_ÆÑ<ì—ÙC"ì=YèC{O-´K™§ÚoS™ÏCû:&ÖÛï«W€µ|[Gzy}hoi{‹ìq±sªGöõt&…>²—ÔÒ +¬Öžd~“‡Úbß^í\L䪱¶|r„ä`[–v&¶2ïøB‡Á¶´‡#>–N¨ËÖÂY ¶Åøš- Ö`[”¯éˆonÁ¶ŒÞ2¶`[bLKM,Ø–¸,-ž±eÛlûË‚m¦˜l×#g#v¶h»XÁ—p[N^iZ]ȶˆ´,Ühc·‹m*Âm9¯öÁ¶È¤GiÁ6óg¶ëñU ¶ë²Ý®–X°-¯ñ+.l×våil×ç¦ÁBK" ˧m¯a·ÈY¢m韗£Ñ¶´×eŽh[úNj¤-Ú6oöèZ¢mísŸB$ѶšŸs¬£Ñ¶,ÓS:Û¨cm™[¸½Êô‘®´p[qòÏ"á¶ß9Ö1½pÙ»h[Ž€ÅjÄm¯zEþˆh[Ë-ÖÑh».Ó=ÑvmדþB´½º¦“£mY¶Ú°Ñp[6±ÙQ¡á¶È£2…(‡Û«ª;m×æ<ÚÁ¦Ñ¶:¨kDèm˲éØí(óV#úÖv™¬ÃDܦˆ¶¥}X*ªÑ¶`h›úp[–I(H¸¯±ìMÃmi×±GEù_ŒÝïMÓ”Få YŽ†Q™¼¬Q™Ã<Î=FÅû¶qbGÔ:%0*ññ6÷•u+£rêÞ§ÆQ™ÄfíÆQ9ì¹ÁT´ï£±Tšæ±6–ʲak,¢¥¢}ïcÏRѾí7– +K–©ÁT´ïµô0-Le—ÍcƒieÈbËLkˆ0»W¯0í{9¦ª}kSõ¾×=`*ßËI©4•c{p‰šÊîÚ}wéaQÃ¥@©ìÿÍw^ˆâúAéªÓ¦@©Ž`Ck Toÿš‚R=zŽ ©pûØ‘T¥ïí’ªõÝ@ªF÷\:ªõ}ìR,p@ªîµí” +¼É6†e¼IÛ~t"è&_p™JÐMw×pö(ÛD¦ÝÚÄ·]–=Ð&ž·kÚDãÕ‘êhÕ{·ÀPѶø|±Œ¶e‰°NÑ&j°@¥›¨ÞeÚÝÄäÖ#Ôé&¦7–cF¬npƒnËç$¥›˜ÞúŽ·Ú–I>™nuQ=ílA7ñšåªxS{îè&‹d®4tÓ¶¥J7Q¥G;uÝdÙZJÐMÌîi:oÒ–Læ›ÚßÖ™zÇ6œo˜ß™oúÞ–XéÞSmÛ²&å›sd¾é¢5ð¦ïâG˜àM]÷aïø¦Æ¼Å^Ê7íMc“òMFȱŽßDô.öszì/³tø¦#ož:¾éà´ÌQMý«,k +áT®,kG8Ѻ7ëÄM
Í©€…qbB¯v†Æɲb‘¿BNn‹)ôx‘ön퀜HØÅΞ +9µ®÷–kÛØ”›} +”“¶^‰wʩȽÍåT·P)§ú¼åÔP· .0'ßÇ驘Ó}65Ή;Y@ V¾¤éVk†N:ut-‰Ò©Ê»èD÷vˆ)èÄ÷ÞËÖN|oºtbë¹ÂA'¾÷2%Ήì½Í[pNdï}X‚s³NÈ)çDöž—58'²÷èa›pNåÙ€ +:m{šâ ÓEˤӷ™ ºìÃØ‘Nö¤½J:íÎiÒÉ™–¥#Œ¤Å°¤¤›a®“NGÞ´u¤ÓÑ9Nš¶UŒçm™:Љì}Ìc€NÑr,:=&,
Ðé2Ë‘tÚ¶í*é”EãØ‘N·[¶ ¶‡-H‡T~F:»·9“n’¹»sËV'Ÿÿë¤SAÓ‚Ä ,+ûî¤óÙkrB:¡×>[øé'ªÝ[ËV¥=n}¶*ª÷²·lU¥kù”tÚûtU·kŽ’nÒ9r[NÚ«å+A:•»·–®š0>éTS·ø.H§vûØÒÕÉçHC:1a·¡OWÕ µeJ:±n§%@§ŽîÞg«êòZF«¤Ý{[¶:Ë0#a#ݘ‘N.:
t2ÅÓbs÷UƒtC#²’®>¿ŸNft.-]×{å5ºúfûÖç«âzïkËWÕm¶*€®x3ƒNk+-aÕöØVõ§íDÖHW—ÍCKXgùLSi¤“.KO:±OÇ–²Æ6 ]‘ù¸}ʪïm)‘N^cù‘®´ŒÒÉ¢¥¥¬ú6sKYUnï9Wwä6´ŒU;Ó¥œ“²yæçd KËX§ÃæÙÃ9wSŸ±êØ´lYÆŒ4¹¥¬“ü¶ÆÒ§¬2Ä'+(è”,GËY'W2èt™U
tÚ^Æ +«æêàY,_n˜“©vÂ0'`Ù·†9i[¾Ü0W¼»À\ñÜ Ì¿@™9§_Æ9‘Á8oœ+ž ÷œu^š97òäÎ9ik¶n SÓÅ +´Ç k”yЉ£+ó2éDå,¹UÒþ3znÔ2Ý;Ò‰ð½7Љ|ì-qß{KØÞ~9GA'¶7D–ƒGloCtb{¯sË\Åöž·)@'Ž2×' +ãÄÝ÷~ºJÑââŒßvI9«è¹ÇÖOWWÜY'¦·ñKW¤êâ׫A\]F襌«m9ãÄâ.eNŒ[K^Î8ñ¾§½MW‘çyÁ¸""[ËYEóÞ=vÄÕvÅW¢H)ci³UTÚ¶™'Š¸Bò‘W¨°8ã + Œ3NTéÑòÓ€œZÛ{›R$·*k@NÚÅ/S9Y6m¶JlÃ!'íyíg«è{Ïc@N_ãWÑæX§›¢‹¦6[E¥ó©ÍV‘¯'Nq†œ˜ÞûÞf«hŽc@N†Èa×rE~ tnÓU +¼uÊéÐûé*2<w›)£ÃFÊéSÃ\mÓÔOW‘Q¾ØEÅœ‚ekÓU´mÉr`NËd•sFš-8§$úé*º¡MW‘¶_ÀVÎi{x6]E³rëÂ9lNspN~¨ÔEáœØ—ÇÞçâ~{Én?ÓE>#ÂýòT ñÔ‰õ½ØYEüª‚ç¤:9&×–¶n2svn¨“ö`ˆ +ÔÉf÷Ò®¶ÊA;í:ªxF +çǨ¯{ÜZ޺ɴç¥Ï[å඀:ÙeemÕ9c÷µ¿àªÅÅ¥åús–S›™'GäfÜ +ÔɼÂyl"Ù;-o•:=Ž>š;˜6í¨“ ÇNKCÌ8/ùB„xÜÛØòVñ¼a²¢nðI=u¦¬5Öé=O–ƺ¡]¨Ö
þ3°Nj|V0Ö¯5fÖ©>ÝòVm—–·–â%ÏÌ:±¶÷–·ŠÙ½•¥±®¶—aéY'¿¶5´¼5¶ëtfq:ykË‚uò’ÎÙ]Þª‹¦–·ªr>µ¼µøOzu¤«;rÜ[Þ*Ý9>'?¢8m=éêHòû%(脯[iJdà•½Ï[¥:^¬'ƒFŠéÎS]ϛϚ Ðír)ÎVQÐ Y¶]pÝÍTî@§¿\ÚWEÍÒ@'(<³tu™Ï!SÎízM¥]pÝõl?Ÿs.|ºÐA ÎÈž½r°%$³Nu%& «rL‘¼†’q§2ÈaÄVÞ…ðBÉÄæÉÜÿešÚÅ×°A2õÐA ^è `/t̽ÁÌÙ6Í$tȇ’É×tG_ÓAœ}MIð„8„8$Çyø Äylè!„ä@!„dÖ…rY„–˺B*‹B*‹’SY×AÈdÑA(Ù¡ƒä’:%;=¬Z&‹Ò•ì܉’ç5TìÜé*v/ì§ +©„gø*6Ym'FǨÞúÆgG¤’E³Ò¥g—Jê29_"•ÈÜÆb? ¢c¥½L!èiKçHš¢R‰´U±p©DçC®½V"Ëvsru¦ƒÌÚñimhäïë¨V¢ÓÈJ D^£¿žåZ‰<?l¡n¨V¢{i«Dvâf–‰Z%²£×¶ŠZ%ÒrBÀ*Ñ qc «DÚ2c…uÄщtö³dj•HŸ»ŸV‰N½,±ŽVe,éUµmhd„U"íµéj•,òÛƒcH%2\XÅnä"cøzsžù«DŽ+¬v±JäØ”k¾ŽZ%:¹r©D&8î&#ÍÅç&Ná"©TbwÍ™C*‘-øï¨T"Ó7åÃsÖûûì³ý˜‚Z%2ë“ßdYìþ?[i?á V‰ÌhÔ0Ý’˜9êV‰Ì,ݬÃdÞR‰¼drAD¤yº‰e6sJ'š#ªR‰¾Æn™|¥@[¶«¤C©k%R×J¥î•t(u¯$PêfI ÔÕ’Ž¥®–K]- –ºZ’YêfI +¾š%HÝ,¤.–HM,é8êbIpÔŒ਋%çÅ,É”C-r¨%P·$S·Ê™]ãÐK2ã\/qè% ½$!»Äa—À8·K2â°K@v ˆÃ.ɈÃ.qØ% Îí’L8ìçv‰Îå’Ì7—KÀr xC.ÉxC.oÈ%à
¹$ã
¹¼!—@8ä’L8ô‡^áÐK2áÐK cĹ^’ ‡^â„Ã.qn—dÂa—@8ì‡]’ ‡á°K@vIfv ŒKÛPÆa—dÆa—8ãK`rIfœÛ% »Äa—dÆa—8ãK`rIfr ŒC.qÈ%™qÈ%@»Èa—dÈa—@9ì’4´:’)‡]â”s¹È!—dÊ!—@9ä(‡\rN9ì’L9ô(‡^åðK2åðK † œC1ÉœC1t(&€Å$ÃÐa˜ +ž›']Ï‘¨à¹y<7Oº +ž›'QÁkÛ° +ž›'] ÏÍjx.žD
ÏÅ“®†çæIÔðÜ<‰ž›']
ÏÍÒZO"Úsñ¤‹ö\<‰hÏÅ“ˆö\<É +öuÔ:ÑyHÇÚÉ|Ø-”\;‘I9ÒY>T;‘eK»•‰lÁoè£Ö‰Lt’©ý18íg¹]¦Z'Ò.{»s ÌóYÛ½ŒÔ:ѹ?óÖ‰L²š°PŠ¶ÕŠôu¬Ãê7ÔŸVsíDÚûÚî(ª‹o`•‘Ç~eÁioc»s Âlšÿ
¬“£n€Q—N£.tué$0êÒI`Ô¥“ÌQwN‚£îœGÝ9é8êÒ 05ç$XêÎIf©+'ÁRWN‚¥®œt,uå$XêÊIÀÔ•“¦®œL]9 ˜ºsÒÁÔ“€©;'Àç$ÁåÄaŠqM1N2M1Nâ×¼Å8¥'¥' ã”bœd”bœ€R7Næö/jœd’bœ@RWN¤'¤'€ãbœdâ‹ +r˜%@³$C³È¥mln€ˆX’!‡Xä0K€fI†f Ã,r˜%r˜%@µÈ¡–dÈ•V"Èa–@9Ì’L9Ì(‡Yæ0K2æ0KÀf ˜Ã,ɘÃ,s¨%pµ$q³Îa–À9Ì’sÎa–dÎa–8çKàbI&b ¤C,tˆ% ux% ¯Ôá•dÔ¹Xâ¨Ã+ux% uh% Ô¡•dÔ¡•€:´P‡V’Q‡VêÐJ@^IF^ ¨Ã+ux% uh%Ž:·J@VIFV ¨Ã* Ô¹UÒ¡Î’@ÝИ¬¨s«¤C[%Á:·J‚uC»P¬s«$XçZ ¬s«¤c[%Á:·J‚un•t¬s#$XçVI°Î’Žun•ëÚ66ó?ÊÙŒ¤’@Y%AºÒ’• [%A:·J‚tn•t¤s«Ò¡•@:´’L:×JtX%€«$ƒ«Ða• +ÖÝ)‘ß2Ó§DÚ2·ÛWÑs–,sDi«`áN‰^€wiÁ•Y´%”¹Ê'AJ‰|›kÁ•ùÆã2‡R"¯‘ÂJ‰<?„¢F‰,ÚÜŸ£Dvâj†‰*%“O‹ñuT)‘¾Ð;"ºRRÛ:o¥DÚqÃG×A¤;÷e¥DºÜoR¢JɤfE¬c%ÁÁx”’A.ymÍ)‘ ¹æ”HÜïŸe³ËðÓëèAJèÅ*ª”È…ÄclJ‰\ÓÛŽ¦”ȹÇýRL))2#~jJIÝã‚z”’båcÀ”¹ö=%§¤HæhNI±3@ÏY·³ÌI))6.”’tdzPJdÁp4¥¤øPJ<`÷uL)©ßSM•’b“C))Ù)óySu™ÞJ§D^s,Í)‘½öoa”$Œ"”€QŒÇ(BIÆ(B‰cŸŒâ“dŽ"”ÀQ„8ŠP’9ŠPLÝ(¥%™¥®”K]) –ºRÒ±Ô•’`©+%ÀÔ’¦n”LÝ( ˜ºQÒÁÔ’€©%À£$Ã¥˜â”@Sœ’LSœhªN (Å)I(E)¥(% ¥$£¥”ºRIQJI1J ©%€¥$ƒ¥¢” +:wJ2é\) Ò
d#)%è\) йR s¥$ƒÎ’ +§D®5íksJj[0®« •ÈNÚ&•;{„TRln›¯cR‰\.k“JŠ…g!•Œ6Ó„uT*!•HŸÛ=HL*©ï/µ(_G‹‚²Lø¶
Ý>RImk¼ÁûhñµŽÏ±9%2x§XEßFO[¬"R‰ +ž‹'QÁkÛ° +ž‹'] ÏÅjxîD
Ͻ“®†çâIÔð\<‰ž‹']
ÏÅÒZ÷N"Ús喇öÜ;‰hϽ“ˆöÜ;É +ñDŠ;Û_DÅ“q2{ñ¤¶kâ¿…y2Ng·‹°ex3º®_q5Ü<{éd¬h\vœ)™ÊÝ pN´ÌÊ]<Ü9Ñʬù"êœhÙUwN´šë·‡Â9‘Ò«D¹8'ãdI!ΉÖYñÜ9‘/[»3¤y(H'ZËZC½v¥<F:‘¸áœÈ>^Ú*êœH?èÝÝ9©mf8'ÒÞš×±[…W+b('ÒÛ~UNd4¬í#Zg7æÛ6ìö"*œÈ˜[Ö9ÞEµi~¡¬Â8‘Q«7ƒñÉÉZAœÚ:bœÈÈ?¦5Œ9ž6“nÔ8‘crn2Œ'R¬œ†-”“Q湘ª4ÛÓÚU>T9‘UŽ=Œ“Ñ'}bœÔ¶Â?†å¬›ÑU1NÆÕŽ6Œ“1ÝíãDJ¦3aœHmZo
àÆIm«éëXw-6½åD^#£ åDžéÌfR „$àÂ8‘—¿«‰LÆRÍÿ÷1éêÆI Ô“@¨'BÝ8 „ºquã$3Ô…“`¨'ÁPN:†ºqHM8 ŽºpÒqÔ…“à¨'ÁQN:Žºpuá$@êÂIRN¤.œHÝ8é@êÆI€Ô@Šq2ö²‰ƒ×’âšd’âš@RuMÀ(®IÆ(® Å5£¸&£¸&`Ôe(Šl’)ŠlE]6qˆâšdˆâš +9Ô Wö¡’"C9P@±Èa– +9Ì(‡Yå0K*å0K j ”C-©”C-å0K fI¥f ”“Yä0K*ä0K€f Ã,©Ã,r¨%Pµ¤P³Êa–@9Ì’OÊa–TÊa–@9Ì(‡YR)‡Yå0K fI¡b ”C,rˆ%•r˜%¢b ”C,©”C,rˆ%P±¤R±Ê!–@9Ä’J9Ä(‡Xå0K*å0KÊÒØ–ä0K(Q.©D”Ã)IÊÉ)yQnËfBÈ)è9ä䔼('§$)·%‰ƒrᔼ '§$!'©$!'©ä9I% 9I%@NNÉrrJ’rrJ’rrJ*夃$夔$夔¼('¥$)·ö¡EM(yQNBIRNFIR®JRNFIRNFIRÎ’ãd”$㤔À8”’Ê8”1£Æa”TÆa”À8Œ ‡QR!‡Qä0J€FI…F C)rRJ +ã0J`F ŒÃ(ù†q2J^Œ“Q’Œ£$'£ä…8%‰8%‰8%qJqJqJ^ˆ“Qâ$”$â$”¼'¡$BINBÉ‹pJ’pJ’pJ^„“P’„“P’„k™ã]‹CxærÉÇv£$F „“Láú¢×ƒç–VÂá’@8\‡KR‡KâpI@.Ie. ŒC&qÈ$•qÈ$0™DŒÃ%©ŒÃ%q¸$0—¤0
Æ¡’À8T’Ê8TWö¡$—ë~!N" „Ã$p˜$•p˜$“Âa’TÆa’À8©$‰8©$/ÄI%q°v-`á&Éq2Iq2Iq2I^ˆ“I’ˆ“I’ˆ“IòBœL’DœT’DœT’Ê8™$É8™$ɸ–}âãºL’ʸ.“Æu™$@®ïÙFLÈu™$@®Ë$r]&I\—HäºD ×%’TÈu™$‚\—HäºD’ +¹" ŒëI€\—HR!×Ñ_¹.‘Èu‰$r]" \@®Ë$©ë2Ir[™$@®Ë$éo‰D”ërH \—CR)×]øžZ互 +¹.‡Èõ3IìïN—CR!×å +âÐ?@ + ˆC!©ˆC!qeQFÄ’Ê8 ‡Aä0H*ä0H€ à ©Ã r] + ”ëRH*åºQ®‡A互 +¹.ƒÈõ0H`\—AR×eÀ¸.ƒÆu$•q=×¥€¸¾g…b‘yrˆë{΃;⺒OÄaTÄa€8I €Ã p2H +ßHà |C ©|“A"¼!€7’Š7ø†@ßH*ßHà |C ©|C o$ð
ƒ¤ò
ƒ¾aÀ7’þ–GÄ7¹#à
w¤â
w¾áŽÀ7Ü‘Ê7Üø†;ßpG*ß䎀7äð†<Rñ†<ÞG„7Ü‘Š7Üø†;ßpG +àÐ> +8Ä +9Œ ‡2äPF +ädŒÀ8Œ‡1òɸ4F*äÒriŒ€¹4F*çÒtiŒ@º4F +êRu)Œ +#•y)Œ +#`/…¸—ÆHÆH¶ïdŒdûNÆí;É"´ï +Õ¼'WäÕÀ“+’ØpE²ÿ*WäÕÕt_åŠd÷U®È«û®Hö^%‹äd‘×d‘¢“,Â\‘×\‘¢Sw†:¹"u„NšGŽÐIÉ:©"¯:©"9B·öá¥CBy
ÑIÉ1:™"9F'Sä5F'S$ÇèdŠäL‘×L‘ì¾JÉÖT‘WëNª;™"Ùº“)RÁ‡)øÒ|iŠTô¥)û0E`_š"~iŠ@?Tè—ªHÁ_š" +ò–E|(¥·”EìHŸ6qÊ"v6‰A²ˆõÙ¬¢²ˆýÛ†4Eìßö¨ùo$‹ØU²{‚,bWÑæ»°E¼/¹~㶈ņŒ›í¶›c"l»wýXUMFt[è"öoUq]Äž‘çÖò´˜Ëîìã¶6óÂH³¼Á£åßñ¸ÏóÙÆ*QboÏßDwºüÄ|{ŽgS|{ͬу/b¯áܲŠ¿’Ös·dU|‘6£®’|ëèßÈ/òE|0 žFlªÓãˆ
–Xg%ŸÏÃ÷sFµ÷EìŸ[¼lî‹Ø˜Ë±j¹/b±ç³”¾ˆ'tü‘æÿvQ¿a¡Œfc;ø"öoká‹Ø8¯ë%ŒXÌZ’#öï+ +y†•ó¬ÿÿà‹TJIJ¤²E^ •-H%‹$H%‹¼H*[$I*[$I*[äERÙ"‰ÓÐE’¦ÒE^4•.’4•.’4•.ò¢©t‘¤©tp*[ä…SÙ"‰SÙ"‰SÙ"/œÊIœÊ§Ø"§(#àgžâŒTžâŒÀSwF€)ÎH)Ê0E¦(#¦(#ÀTÊ,E©,E¥RF@)ÎHE)Î(Å¥8#¥( TÒ$•4RAŠ4Hs)ÚH)Ú E¤h#¤X#€kÊ©Å£X#pk¤‚k¢$H¥¼@Ú•5’•5òâhX#‰QY#‰QY#/ŒÊIŒÊIŒ†5ò¢¨´‘¤¨´‘¤¨´‘ŠbÆ!À8¤1g¤2gDŒe¡ŒTÂÉp8# +7Ìà†9ß0G +ßGàâ|C©|;פ€ó
qÀI©|Coˆ# +Úµôƒç.'çd‘$èÂ"yqN*Ir®'ÃbÁz¹$•s¸$p—Ðá’С’ +:é$pΡ“Îa“À9l8‡MRI‡Méd“$èd“¼@'›$Aqt’褓 +êJ@B ¨C(©¨C(u% ¡¤¢¡Ô!”€:Œ’Š:%£ÒÉ(© Ct(%€¥¤‚¥Ðå>:¤’J:¤P‡TêJ +êpJ@N ¨Ã)©¨Ã)u8%°§¤²§ÖI*uH%uH%BœH‡SRI‡SépJ NI%œ@‡SèpJ*èJ +éK b‰H‡WRY‡W"Ö¡•À:´’ +;¼`‡WìðJ*ìä• +ÿ,»J–ˆe2¼zVOËÄ:ÉÛù¶L†×öêi™ŒŸ +R,@ºö Å2© Å2¤X&€Ë¤€4-4-ˤp4-“àhJ&âhJ&¤)™¤)™ +RI&pËŽb™TŽÊ2£X&`ˤbËDE2£’L¶—d’ E2¢H&Mˤ0.51.51.=“¸ôLÄ8‰&"\Š&…pˆ&¢ €C4IÀa™ +8, +áR2áR2áR2)„KÉDˆKËDˆKˤ .-1.-1.-“¸´L‚qH&B\J&…q)™ˆq)™ˆq)™|0.-“¸ÔLĸÔLĸôL +ãÒ3ãR4åR4)”KÑD˜C4sˆ&‰9,0‡eæ°L*ç°Là– œÃ2©œÃ2sX&pͤ‚ÍD Ã2tX&uH&°ÉÖ!™TÖI2uH& ɤ¢ÉÔ!™€:I&•tX&ËÒa™TÒa™@:,H‡eRQ‡eê°L@–Ie,P‡eê°L*ê0D@– ¨Ã2©¨Ã2uk:,“Š:,P‡eê°L +êÒ2ëÒ2ëÒ2)¬KË$X—’‰X—’Ia]J&b]J&b]J&…u)™ˆuX&B]Z&ui™ui™ui™Ô¥e¨KÉD¬KÉd{Éf!™ˆu)™ˆu)™|°.-“ºÔLĺÔLĺôL +ëÒ3ëR4ëR4)¬KÑD¬C4uˆ&É:,X‡eë°L*ë°L`– ¬Ã2©¬Ã2uX&°Í¤²ÍD¬Ã2uX&…uH&°N’ ¨C2©¨C2uH&É:I&/ÖI2IÖ…d’¨“dòb,“dݕź°L^¨“e’¨“e’¨“eòB,“D,“D,“êd™$ëd™$ëd™¼X'C$Y'Ë$Y'ËäÅ:Y&ɺ܇X'ËäÅ:Y&É:Y&ɺ–]–d– ¬Ã2ua™TÒa™ˆtH&"]J&…t)™ˆt)™ˆt)™Ò¥d"Ò¥e"Ô¥eRP—–‰P—–‰P—–IA]Z&º”L„:$“í¥šÝêû›’‰H—’É'é°L*éÐL ]£· Ã3© Ã3tˆ&€Ñ¤‚ÑÐI4IÐI4Y “e’ “e’ “eò,“]X&É9Y&/ÎÉ2IÎÉ2IÎI3yqNš œ“e’œ“eR9'É$9'É$A’É‹s’L’s†çL*çLà’ C2© Ã2tX&€Ë¤’ËÒa™@:,“J:,H‡eé°L*é°L – ¤Ã2©¤ÃtX&ˤ’ËÒ}éd™TÐÉ2sX&pˤp.-q.-q.-“Bº´L‚tH&€É¤‚ÉÐ!™ +:$@‡eè°L*è°L +;,`‡eì°L*ì°L€– °C3©°C3ì°L€–I’ °C2vH&vH&ÀN’ °C2©°C2vH& ;I&/ØÉ2IØmpY°“eò‚,“¤,“¤ÝÆ”E¡,“¤,“¤,“íd™$íd™$íd™¼h'C$i'Ë$i'ËäE;Y&I»Ü‡h–Év²Lva™$ëZöX’uX&°ËÖa™TÖa™ëR2ëR2)¬C2êR2êR2)¨KÉD¨KËD¨Kˤ .-¡.-¡.-“‚º´Lu)™u)™Ô!™ˆt)™ˆt)™|nY&uK3ë–f"Ø-ϤÐny&ÂÝMÄ»%šà-ÑDÄKÑä¥h’ÌKËê¥eöÒ2©ÜÃ2{i™ +'Ï1Œ;tG%!«ÃÛ¸{âSh=, +—Ož-võüg²Oìj
ïÅt-ÞoÏî«È‰ü(Šœ<ß„ß«ÈÉóý ˆÛVm¦¯ñô¤--µ,ròó©ú%QãÄÆ2f[ŒºB&I”1 B“Ÿí“°í°AÍöC>é–3·'ÝFç÷ud—¿_G¦”}bßUï½È>±æÙRŒ‰õø,åºR?±Ê`6"ýd÷–Nƒ>ö¡Ÿì.©Ÿì¦ÿ´w“=J²aŸØÜŠ¹}bãüû™/Û'»¥©¥mb¿Ù</
û¤»™/CÔs´¿vÍBœh5¡ŸX.¸=_ +¢€` +¢€` +¢TSSS¥0˜‚(0XªÊb°\•7ƒe«,KWI㫼Œ°²¥ª’ÆU©ÆUI»¬’ÆVy]% Œ¯’FX)ÆWIKXI +ê²HŠP—ER„º,’RP—N„º,’¬Ë)vY#E°[»Øe”;ìÁyØ!¯TØÉ^uØ+°{¥Â{Ø¡¯ +;ô`‡¾ìÐW*ìÐWD;ìh‡½Ri‡½î°WÀöJÅö +¸“¾íÐW*îÐWÀú +¸C_ùÄúJÅú +¸C_wè+wè+Âö +ÀÃ^©ÀÃ^xØ+{¥â¹°r¯v–I)ÈË2)B^–Iò²LJA^–Iò²LŠ—uRó²LŠ˜‡À’ÐÃ`yQ‡%±‡Ä’ØÃbyaOË–KRƒ¥Rƒ%©‡Â’Ô“Ãò‚KB‹%¡‡ÆR ‡Å’ÐCcIèá±¼¨‡È’ÔËz)¢^ÖK)Ø£^Š¨—õRD½¬—R¨—µND½¬—ÔËr)…zY.EÔ[»êe¹”B=DQêá±Tê!²€=D°‡ÈR±‡Èö0YÀ&KÅ&ØÃd{˜,{˜,žD¨‡ÈR©‡ÈõY "K¥"ÔÃd{˜,{˜,`“ìa²|b“¥b“ìa²€=L–Š=La‘ì!²Tì!²€=D°‡ÈR±‡ËöÜ]ñ –À^VL)ØËŠ)Â^VLö²bJÁ^VLö²bŠ°—%Sö²bŠ°‡Ë’ØCfya%±'Ÿ%©‡Ðò¢FË–.Ëžd–ö6Úd`/l–E=é,oìÉgYØÛÑÂ^-•zZõd´,êIiySONË¢¥S ¥S*õ(ö(ö(R±GÙ°GéaÊ){TN{¹aÊ){rZÀž”–Ä^£KS°'§%±'§%±çNËzrZz’Z€RK…RÐCjzH-zH-‚NÔÃi©ÔÃiz8-P§¥R§ê!µ@=I-zH-@©è!µ|=I-/èIjIè…Ô’Ì“Ôòbž¤˜'§%™'§åÅ<9-É<9-É<9-/æIkIæÙ,÷ƒÄ<Š§TæQ<æ©x +È£xJEÅS@ÅS@ÕS +ò(žò¤µ,äÉky#OfËBžÔ–żp[Þȓܲ¥Ö’ÈÃk©ÈÃkIä!¶$ó0[^ÌCmIæá¶$ó[ +ôp[zÈ- =ì–ôÐ[zYEEÐË**zYEEÐË**‚^VQ)ÐË +(‚^VQ èe•½,¢"è]ô(¢R˜'½EÈÃnyØ-yè- ½ä¡·Tè¡· +ﲤŠ€—%U¼,©R€—%U¼,©"àeM•¼,©"à!»$ð°]^ÀÃwIà!¼$ð0^^ÀCyÙ]’wØ.•wØ. <t—¾Ëx/ <Œ—ÊKžŒ—äÊKòçåÅ;¤—ä]ÖVﲶJá]ÖV𲶊€—µU +ñ².ÊZA?<Ž ^–V)ÄËÒ*"ÞÚE/K«â!½ô,Ǥٸ ÎK%ÒÄCzxH/•xH/ëâa½Tâa½@<¬‡õR‘‡õ"ä!½À<¤—Ê<¤˜‡ôó^*ó^€ÖÐÃz©ÐÃzzX/@ëåzX/zX/@ëèa½Tìa½{H/`é¥réî!½À=¤—Ê=y/pÏR™#[!¸—ÕU +÷²ºŠ¸—ÕUĽ¬®R¸—ÕUĽ¬®"îey•Å½¬®"îá½$÷_^ÜC}Iîá¾$÷_^ÜÃ~Ùð^’{ˆ/•{ˆ/É=Ì—Å=©/oîÉ}YÜÛÒâžì—Ê=É/|²_ø¶œë(à“ÿ²ÀG™ÀG™• +>ʬ +³ÎŠ¸ê¬«ÎJa 0!¢‚«ÎŠ(˜…VWa0
˜ä`*0/"Á¬ ,˜Õ +âÁä(Ÿ<˜×(ŸD˜å““£|a^£|a²¿+&[2a^?™0Ùú“ “?™0•ƒ˜0â`Š0€0E˜JÂa@¡‹01•,L¦Âðy´„‹C´`* Ó‚…iÁ +vì1ˆw¶0Ùž¿ã·õ9ÖiRÔóï§A›‹Þ[v˜ÿéCëäožMáÎó O.™ÿÀE™Ã/™aØIÙs¢köü·Yy\3olÖf9òšÙĉqͺ%lïçëšukxXÖ‰®Y·7ú9®Y·¶ÌsÇê5ë6{l×Q×ÌÆ-E–kf3&—Ý«rÍl,ÝÆß¹f67c‹Äê’Ùþ>çë’õ›rͺ
Ž3¯Y·‘Ì>êE{þr·¤ž³®´.še +ök¼.š=±f—y*±ÕN܃¯§½;±4¥%^šq·9KË[ŸÞ}ø±ÏhâþìÓ,vœc4GàtCËFecÅ~ŸÇ±YŸyæªþžvÿ\ï +S‰j{hQ—\>ÓuN½ýÏ6Ï髱١\~ú~ðÞ¤2´+ªÌg–:Ù/ëFÚŸ>\úhÝúg=’'ž70+ƒÎ!qbS5 3)§çØQp·ÛrµqsѾÄ}ê‹ö\ö‡‹ævWÊE³Œ{G¹h»ûË-/šåXìÇ|]´]hä¢í¦)ŧ_4›Š÷ìàrÑ,wáˆÙ<?”=tH.Únïãq¿.š=D– ÎEÛïHLä¢í—žrÑ<Á†uÑžS=*ûEó +÷ÁEsÎ>G¿µ™ÍF¿gÌJûíõoÿû¢ù3;ã‚ØÈžet;fåÿ´_¹{‹u«›DÎËF$¯XĨSžÈfµ¸¢M‚_6IYݦoY6³¯ˆúü`\ü䲬ƒçÝõ‚ Þö°bÏ^/c›9¤”ûð>G2¬¢Áu1ôVGìÿ¾Æ¹]«õ1OÿÛ6ÕpÃU]o}ø$ùƒ‡cú.…uKjÑ +K‰Æ’¢>Îtæeó’_—ÍZHÖbç²yÉ>ͺlŸîl!=áºyÉ—Š‹ëæM¤Ù^׫¹Éuó6’eEêºYi¼®Ú¿ýí~Øiÿþ÷ÿæ?üþzz|÷tú~ú)ÂÞ=«ÿá‡óÙñ_þô?þýúßÙÏ¿ø‹ßÿþ¯~ý›¿þ±ÿ˶ÿäùÿîøûçÿ¾úcßïy_짣?M/ÏU:vKÔ·Qé_ŸpsµÙžíýÛ^¶¯;ùpîä÷~xÿã>Æ•ˆ¯ûiúøÿ°Ñ_,cŸgx¨ûÝ}€ìyNïæ7W^žÞÙ7GcíŽ=Œ×ÑX8–LߟÆÌf¹Æß9%ÛÉ×þÖþƒÑÑR”|{tø•°©Áî6d`·´_ž +¹!3ý¢?7G^ª§Gavz³tDІ½bvß=ª_òp/o#ú0+…Ãϱ‡m“NëDZíÏeAŽÜµçnCu_´˜Ú¡?æMh?2Ûúî|‰Cöú¶^þܯ„·Î²Õf"èuc|Úu +êYpÓµ´ðÜth^†W{Õ•Ô¶ß=Úì–£©]ØH^ÚWyX+ÒïÒl>á+îó4|Ý;›^~}æ«âû^ãÏ)šè¶ñ1ßë°™²ãÌ?×á4/UGpYB•÷Ȇñàƒá¡ë°;t¶–¬‚Vc8‚síàµöjƒ¤¿hÇà{O÷§§ "îEÄ„?ß¹(þl*vç- H{ÌËâÚÄï»»¤qUì½·Xö«Ì4yv àµåï£éáãº9,ëh+¸ñ=á“`ž§çDÅ#þ +<MÇ¡˜O!<.÷‹JEØ´Á¯ +ß'÷ÐV=ô]\nšÇ Øú6³å%u± –…ýWº±Ï‹ôUáëæýk·û=³w +^{>nÖfe¿Q#0¯í?±×±ö:fËDqC¿¸¶JžŸ-²;Ä[ç[^jiXøä#sÄwÖzI¾,„ží“^[kð|»ó÷ *ãÞÍÊçлï¾×³×›ámãAØomëÉ麆AÃÛóQhÛÜ3;Ø/¸gÒ|ÕÍä™omy”}î_žü§´NÌ5Óx<¶c׶ž•ï‡µ÷"莽}1:vÐö#Ã:Þ·‚×\ÁxCFxxyoÛÁÛö|8Úv|ÁLÆ’1ö$^·ºÌ>kÍSÛ]ÀŒNp¼ùÖ‚8¹ŠÃ¾œjDyîÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°Ï–‹÷ÎRpƒ¼¾VíxOÓûE¿÷ÑRíˆëb_E…Ds#” MÜ—½€kò§Ì7‰àÓóÓµö§[Áã"hOaì`{^¯¦Ë•-ý·’ãÚÜÆÔýïsìùkŸbã‹èk+vÿ~ßîá¹ù±áPÒ£mã^Û¥MoÎHñíº¶ónküÜ“ /Â3þ¼Áeh{×·ÀÚñ˜lz¬¯Ó&óY‹÷êù˜<M!]’§QA“ß6kz±®=ä‹#Øâ+gãù£qúMpëS€8åéó/˜?Ô±{ž÷Ó<Ì.—Ý@ÿD>_³ÉáûÞãs:cJ5þþWàœÑŒŸ«rÚ:ëíÙuYΑ£ ù§‚ô¹ós]ªu™nüøò5sµ¥½›+ØôŽ×Ì‚ÛÎ!]|Ÿl
¢l“ñöž–KÄ!m=Žàðµu'J+é°•79Uÿî~U+Å׉Yo@ÝÌP3%>œà,Ž ŸžQQ8¾ç¤©gË+˜}vÅïmiäŠüˆù2²zƒ¼²#<¢[¿·æ'æ¶ëO}7¨Þ§.÷¶ç¢D¯Ÿìˆ¯¹-rž“‡-pc3ig™{±ƒ3]ºå—šÇ™MØgëlÿÒ9bk³@œwrHÇp–gÆSæâÏõJ»è¶´Aöegt¬l+Usé<a_àX‡÷ËíPF/|¹çh)ølíß±‚_Ùi9—ñ×öl1¯ï†É¾9R¢¦¥é™9¨5(ñ°ÞÆÕd¶&¾âûIïàÌw!ï®OaÍ|o¢½¿†IÛ×T°1<é9äüœ¯ùË*Øî^. ‚ìnÖqˆÞÍ¿•ÝiàÑzòéç•Ï·û«ßÞV¯ÍSÎ~ò>×£¸(ò°§>D‹¨ënãʼeæq
î©®Ü^ |L:“ã ¾œZÄ|-«nq±<šîø5ó°Zéúü°¶K3ªµê#Ý}!yëMŠÓÝ®ÒCôž¹ïw³UÉr\óÒÙ>Ñ=ÇV/[µÕ‚>_›…tM,®Ëììö´¶3}´ÁlÃfÃ:]âïífWŒfiŒâ=-X(~Ï–…wzhÞgˆ½¶˜hŽpP}Óâq\£\?·!¸/úùÓø¾8Ùh«Xðܹ
w´‰6[ö“!´Ëš±ƒ-’$ôxÅÌœÑ>Œmc +îyãiþΨöߪK²µ´YÓëWÂùéó~‚‚2ûÚd?ý“]¾—ݲÓ=;jfs +búëáåw?Ä©zÖî°¶¢/èÅÇ懵ÝljÃò.þð–âŒËgWÕ~äWê´iëïÖ²~>8lÚRÏ«%WÚ<žŸ€+G:ËÆo\¬/ú½•©Šëâ.Vœëv3~ï™iþ´Í-úN“çí߬gf³I~±xÚžcñªSæ‚}v#.—µÙí.údð>o=™ÞuFøšßžêü¨yVþk·V€äêùേ½¡Â¶Öf±)oŒ×ýŒqtœÚYpDò–óÑÒoãØ}ñ'ßPZ[œ§§,ùyúºœv¡4åA³³àŒnÂð‰h»»~õ|¦yø¶6vbCq¥MJõ3ð×Ò‚=Ƈ%øòÔ_„<+œfáÝ…É¿{eŒ°ÿGy`í†zMÊæ¯ÔŸµçבÂìŸ5?ú'hÍÆq賦Våö|jÝý³uâ)±OÕfce6Jïâð–ávm‘¤ï{‚÷}¿?&†ÄÆ«ñ ÷Ù‘'h£¦¼Jž³gM«†vòÚ7í µ3Ì÷çÓµÔh´§¸MeDûðŒwiŒXç)¾vOÓÇDó8³£ÇçúŽ4¾W_÷/ˆ°^›iêr|†wƒã¤|xæwjpû²~Mõ“P!/ÿ´û_ˆKÓmôkÀµW´¹Z¹Ýué†u;g‹OÝ°ñŽSÏ£‰çÂïãþú˜‘ª÷Ä×¥ž¸fŽ_›¿è—îo\1ó>ŽíˆSðñ¬¿Ô·ÎµV?†vñªŽæïïP†ß ”º“#¤e?\×y÷x}jò»O¨ç5zsÐg¡ŸÝ·‡¼Efß>›gÂ=ª¥Ùåí±jú´ÿ<ýɾšÝ`+ËeK ø嵬ôçã*âÜÞ"Û|Ñf‡ðíéÄÛCѵ˜d{n63Žx][¬hhýÏíy·Ë{Ùwüšú]Ñк¶AÕw`ó/žÍýœùh‘/ça_8î„7}¯¾ÀÜ_ê®yœoëõ'£á£Ë{Y2Äå$ó‰¨+szÂøêF¥Áf%
ô<Ú3æÝJÛÖÌN÷ˆøý*úü˜_ÅÓÖ°´™g`YÆ{\Ú£µÔ›&ÚÚm8̈×ay%ßÁœ1fk‰ÄŠÑ„öÛ´Yx'#¾€~Ç]&v +A5mçˆqüh-ºv¸‚q +3²Ê_ÛîS½ù×5¨A_lœ¾cü8‚û<t½"7þÔ}kªã²DWvà™#f"ÊÜラ‚}Îã› »´ì`…}õ¬÷»bb&‚ÏÓ¹—`ì@¹÷¶þÙÒ•uí?¯·ˆ¨½E–¿§v¸m"ž_çí<ÁM>ŽÐ}"Ì
?u¿<}ƒþãÊ–-jæqËþcóa7N÷YcÚçzöúV˶yàq•à/š…{ðÚö¹³> dAæpJð.’W¸1„e™ƒÓgѶ+ŸûS:,9¯Yù¹í¥ëuEGO]-ý©/ÚÛ$Öx²Ÿ®¥ƒyPßÏí%ÿŽ5«_[ÞQÄÄc›^Î;Öznïð¡Þmh65ÚºqœGÜB¹€þ佶åïpK9:DfLBj7§&lþWq´^‚'\·½#çÎ÷écÑñ EGÕÿM‰Ç®hrx8²K<³ìñA± -ű‚ìÀ‡?·É¢+$¿C¾dhþ˜4„÷VýÎQfÓb^éë3x[n6?'lÒq½·í›r’ýòÑÔWûõtA?·QˆwX–\(B¯ /à<s+ÜÔ€>41ì“x1ÿáÁ½ùu²%6ŽãÎèùMŽ)„WÐÆ'¶}çWØ«Fp÷Á¼ˆž–HÐZ¼]ÓFé=F²Ÿ‚gôxÐKR¼ƒšMâtW˜V‰¯Väl±!崙m‹ÙM›ÆÏÓ=|„¹í‘+ó~ˆ»Ä€ K±Ÿ|/o8;ír㎘U0·Å¬ëÚöÜ‚Í‘¾ò2‰?ÿ +_z:Ýߊ+Æ#èkª¢ÈÏ[¤kØ<ìqñ§¼)àÁý¾¿‰ù®ùûûXÒçNýÉÒŸŸ<nž#þE;8Ç~êÑÌ3
”µ;:HïàˆÙë<}…g´$#èstþñ•7„yKßzÉ_€ë±×Þ¶/Šày2ÝzVÑG2N훂tfº¤¼·lx]á[¿_ß+²àâpb*©yMÇ'ÁH|…궧™ƒb…¯;AO,]A>ú>¶õÞ¶wR±2ØæÏZÚó3ìsü +žq—Æb`
ní.GprGoŽ ¾CÊÒŠ˜/u›1~~î‘)U·<"Çv &lͶ¡ÇÄ3ÅQ*™'-ûQi8ÎZHžXè ŸÎmkõDxÇ÷剰þÉyé~xžæO‘œrºDŽÞŸ"f?ÞÙÇéA^È2¶½'ùù´òu“‚O]#zûE£“ÓG™ë–> Á§ãˆ±`Ë»ÚòÑ5ã]A½Š3Éoc/mÓ%ê:¦Tn%}I½Œ?¶Ç+Ñ,!ì¢/ë–“²?V‚œ[,Î×+ÚVÆÖÅ’ên¬±¯f9Äýc˜Èšj›€3L4â¶lGH±q +r]cäúc[=mÖb·‘ÞÏà•¤W˜Nºíu÷˺Çö%ð`6»Êx˜¦¡Ø¥ÓÚ”lðt$°ƒ×sO†F®Ù»øC´)Ÿöã¿Ö…ŒYW{îì¾ÿJtWìÒjä9ž“Ûû¼Üym<Yÿ½íµÊã»ræ0"ÁÙÞì`…}É‚ñ,Ûz‰wîÕ^ÌàM?xpM. àÉ“ÓSç‰0ž†ÛþŒ2ë ]á˜)ô Õ*õ›+ø%¦‡íþ´!¾¶uik˜YAËcÉò#ßr[á2Žv¶+ßh_-ÒeÏ™YóT‹Ã—QÖù,{st¬Rʶ3tÉh%+¬àó)ŒO0˜wpä ÏíyðȼÓÉ·×®À±´‚p\ZM½‚>€› ðÐÚ~Z×—kÊ9÷ëâÓå‹K8”}cÑc<£V†uO ÕWáÜz æ +%|‡'ûSŒ¤ç'Ôç#¸_}” Cñ¾Vã{ÛM3|Neˆñ˜-®Ò +Gp¡šfñ+xŠð{Í8‚§×«¡ƒ~ÇÇÂzTzCät½Vù{Û=ÖbŠ ¯iÉ#1°j5®öÞãžCU¶TJWOÏE½èn0$Xƒ{Tèøû÷"‚ÛÍ°œ—àŒ¿4}B%ƒÀ½ÝçǶæØü1_
ƃŒü(˜7lïŸÛnŒ°ÛƒÞ+hýÓ¾nᦉ‘¦£Ý®;ŽUAv@_ðµíÔõöj/Lé4
>)øy +¯m÷¶iÛ;§#VÌç‰ø} s
[¬ˆïDô¶ñgp:7+lÆTóZ!Šå n7b–`>†>ƒö±íè1™à+ +o3LõØ+³À÷ZµÏæNºÛ>¼IzⶓaDs)¯Êº[çI°tFÂV„wÖF&.ÐÙÇÖv„íÄ{0¢Íd-1Fã¶hÙù\×ÕfËà ¸åd†ÖÁòp_è1 е@LLŽC¾ÑÅCd«˜FãQ¦Ñµ^tñ57o¾ï `õ7붖êÇ Ãë%Øc˜5v°Â{ +–S¨á©nÙîÒ¤½œâ·ÎÇY‚Ùìûù±5”|>Ãl˜ÃªÐ`¶£spe[®ì‘„WÐW‘ý¼6ŒÚÉç¹Ç®·‹‘šW°¯±†5ðá‹clz»˜&³Ä|×”š5ätoʶ¶÷ÔÛÅ +`ùpø‚qq^Gv¯øc–«¡é½ÝW5ž%Èè8¶ù±m§y¸i§ÏàyÜë¶ÂLýØ^g×À‰Ë}÷ps¬¥ÁÅñ¹º_ ŸC9{,Ø£Ïû +öl÷]«‡¾fšÊ¶áþÖkšœ¯ïã,É
ÛAot›5j¬
u +öKXýæìÜþÕ_üá‰ËÇGâò¿þg%/[›Ý?Î6;esîÎZšw…¿¾ÃMé_ß;ùðÚÉïÿHëãk†|ׂÝ^&r‰MäŸøÞ1ëZ9`Žf&{ìd^xYýƒíA_ ê»<žT3Úukk/cé×ó’âéã
=ºõÕŶѪخ=ò™<èÙ²_|G$°EøìmwÆF¢Q°]¨L>^²ÅêPOø,šÜ®;Úß#&Zý‚™Ór¶yrmŽ¡åìû_±t‰‡Ÿ£½_Wg3‰ª]^—f"¸«“3b9ÕØ,]„0ž ¦ü¼HúÅz$‚5M—äÎ;oðÙµ/+¥‚Û@}qm¶ˆ¢²JãC\Á+xÐkúÆl±z¯‡ù¦‰…_f´uÆbâl™×2b
ª=äA_#>öû„·KæCñƒ
T>,êÁÉëQŒ!_;í 92áÕÜc§gÔöCÝbYà07uƒ†¿wJŸÿ}œ]×Èßû*ðzd¿¿fü~j!Aú"z´qïØÁ%…Çÿ–/±êA_ÎÕ·ÝåêØŠ¶GŒoÍøŒ²ƒÑò´)ŠÙÊA÷Î4O×.n™q¶ºÚwŒšÆã£la_K)Žwlk¿êW6-ÊÁXZÂß1_@÷ ŽÈŠÒ _<IuR)Åûšb·· *Õ.|Y5^ûÎ[Þ÷Üíõþk±[©Žë¢EpO:³T£iB»?îÖÆ¥C˜7¸zjf,ÿ£;yê|ÍJÊÑZ¼ºÃJŸ“µ˜ +jÎÂ>²Gý¼Ï+ÍaŽ›wŒI0kÛv0—shSåé[ð8aÇœg°ÒZ¬`[<5Ãü̶³¦>4›ÌüãÕ‰ùζ7žƒ€ý°œ±—«;ðt¹aúˆXðàÕÑtÖ–:Ÿgd‚h9Œç}sa38›w7/ÁÝ&|=>š³qP^©QW€§h\ñ¨Ç^#‚‹“Q6ÃâñS=®ÜÁ9›mãá¶uŽüÚ„/d[údu\×Ô´-[ë™-µsY,E‡“ŠÏ¥…ÎÎÃrgl±{Þë×û$iG“«œë}û†üŽuL±ƒôj´m;ï‹û¿Ó¶w#™I+>™ÓØú‘ìPL£t¶áqðΘ-×nó÷t)_ŸQ¿ žrËæ¶óÎÛdàO¾€VñG š<¶ÒÄMŽÓ®Y&‹Þ;à“O4¨\ÂiKwŽ½ 0v`/“&F-ø´³¹]‘c`Ác{}¿ØsÖu™Ñ‚õ?7OíBcþÇæäÊD¿Ò÷{g‹Õ÷ÛxdùÞÏžèÕ<²Õ>”{¥œúا¡éÅv"èSCâƒ.í“”qiòõž]^fÜÜëжʳòK
?ÛA§%æ2iìÀ²£ó«¦*öŒ½ÛG_ÛÞyÏNI·{æÑÌÈÜc¿>È©ËxX)om«z6›¾«k{ÄZ‚ëÀ"È:i> «ØóŒòùj4-|ï\™È!±àú´+wÚwºçtÝ›SŽ\„ÏØö$ßßw°ìãÎàuæÖ#î°UX#“jŽElh6c’þhÁ«sË=—ÝzM ÷Ñtì æý/AîíÑFîàjpâTÛ¬ǽ)è#?ùÒg¾ô¢‚7·Æ†|·ƒÓ-ØÛÅaÅ7e">ÇSp¹ƒã˜º4sMzÚiÎÝœ‚‰ \C>›Rq¶®÷æ&]Ôk&Œà?µç{sËó¡›ß”ß +šÔSƒã•·iáãæc£1-ßVݸ™A6Þ„Ñh¿O¯è«ð‚î†Î{Õº)&©5¾!žY–[íQSx;A/_A_SVW–Ɖçúñâ]G`àæ
QŽïuò†\‡F&-ì5gc¿J·3ù0a]»m¥ÉãI¶Þ#·°“(m&&rÒºÖLŽà~“ KÍ昱¹‡½Æ«±_E)+6ŠVÌóxb·.cßtð÷ÎåÓB#Í“By€nšK–oi7P(ž¬:uôQ +*‚×ø†›~LÉØ<øÅMcÑ· /lg¯õÙ=ŒÅ0éõûNÎþÐ8£ï 6šF¾7EÏ •D³ðà[æ7É[·ì`t€ì…]¿Þ§2¥*µé¡ã®W!‚[¼1¾%—vTŽõEЋÝƃ}j9LÛ©
ö±ƒ#¸£^Í'\ÊõÛö¸©ïÛ°J³ò|„|.]›=Šµ¯»£à}äÙÞcí`Nå°w‰×Û‘ù#"¨7Ž')vpdŸhƲ˜?ùâ#rºúFOË‚G¾qw&ùœ/8^…‰n÷8øcºà¹902v`‹‘ÂïsEpËæïœe‰ó$jÝKý~òI¹”/ù{¾x±è„}ÔV7a›¹ƒýbc(¡Ì”Âs¯ìŽ °éC•/Þ)£3¯¶;íåŽ)¸³¥¯_ÁX1ÑÞ›]›jÈÑîìuƨòÊúJÄïµ½ÎVÏá©|±®‹MK|莖¿×”éê'XЖnçoéýHçÒwzì¹_W}Qæ«Âãœ|=bŠd³FÆΫAÿ;Œ
øOb·3rôAÐÃ9KÛÆ[£<£³k0w½62Žëu +7V×;c=3ý¬)¨£µüÄ©ÆòD‘;Y›“e׶çkw²%ßùëï—ÍÜML#¥{›fœúª+¾*|ìhV>ªÁ>»5RoÁlN¯•(lÙÑ8õq5•ersNåU˜:¶½<s±{Ïötgz£í|®Ê›ggÉIÓmnh§tÑÇÿζ_ çÓÌÜš»‘àS£Ü<7f\âa¿«åɇÁŽá¢SqkUiûS9àèŸdv lguÌ€Ùä÷Š,?‚|!õ{WIkËÕ‚c£¦¯×Ò â‹75n9OÜü´éž[îøNÃçäkãa¾3úÝTƺ?¸1ÔÖtáëa´ä‹QßSíu2LÒ¿³uà +Š*Sž¥&.|¯#A¢<ÛA¹„míÀëë~O² +¯;×ÙùýÓXá +¦“§ g¥Cq¡<10»æòl·ÊUø¼ µWH%¬ÔX'Ê‘GsÈ÷Qsk]‰öþ—Ž´\ÿ,i¦!o|@RÿŸñ7kebÅö-Æ“Ø)ׄ/¸ýù>K«E{ðùó1Ë<¤Nk}_€vËÔ–ç4³£3æ:§žƒ `ûÐ’h¤¹XÖÖ§/ã
ß¼HÔö\‹ñ‡¾X¯7À‚ù®djŠ›ªÙ[ä«lºôäœZ.ú°™.ê•£gnëËs"ÐzÍóúå1]úâþõl%615>o†Nž°Ü†k¼v ƹƒm2ä}ª$ç<s +ì÷¯!}ðc-µ4C‡a«é€Š/Ì]ÚTQ +bæÕÕWÈFô¾Ã„aÀMcä4œ
ƒ(ìŽÚo?XW!îãí¶âÉ1½„5C1.'{XI$6ôuŸZù‘šñ§ +¶å5dDçË*.–Å‚žæÓ3?Å â 'S[ˆ¡Ñý*Ï6^ÖsDV±
ض‹óÊÄ'òըϽ†®öôÐì£~3^¬Å´}¯çZ’™†ÇýLZ}¼“e§ï™~7+ÆzbkN–dó–zLZŽÌ8¹s]›!ÕB—÷ZSø´™LBæÀÙ¬w.îº3ãfKêFWÔ× ]‹Ã½˜¤µuu»Í±3›S>¹Ž‡ª/ô£<4´ôlžzãqñék2—VÍJ¸s5Æ]…žcù8°îI]á]EK,Ý q +x5wÌ[~U˜Å#ïXŽàÐ~éô3ìÌ9'Ë™P£îŽVÐOž´±Þ›\Å´¥¤v¯ Ž'ÚsUó\‰{c×V²Õh¼u'$ÁÞ‘¯J*‹¿™±[Í(x·˜ z§Q±º¯ÆÅX5ûÎ)BšPz¼NêBÒ1¸# "v0²orÇ +N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½ +›žŽ¶–Ƹ×R²–w™7öA빦ÙMçÎW˜ã=ÈVC[’ȹ_>d^_™ +Å’îO.SÂÌ[xfú›í÷d¿ïÙÎt˜îÈóŒàµóÁÏ_ìj-Œüü“Uåü1Öœ™¿v—ò$Û‘Âé½\[Ј‰ójÖQå·jÛÊk¤„ˆ|Û"Ìq +¼Íòe%óFÁy2²ÝM%î#™gWáŸüE¿§ÖÅ™fš×á£ÎWÀrÆ¥7¾¦?;¸.¶ÍÂÒgfI_±ô¬ëÚëÈã;̬‡²íüYqŸ±UÇÉ^€°£Êy_r«¼"P¤`R_lfò8·º¦Ø
cÁ9󻱑5¾|´µ¬¦%¾gîÆΩûi*ì$Xk;‚¾ƒ}«rÊÚV+'ø—RcœYBýUôa+ȾV!#¿ªúZ†÷ÞJŒŸk¬li4Ðz)óæܳºÐ +N4\¶ò»}T*K^½ ²ä¿×¶,9°jèÙPèÎxÀª¡gIË“aÔÐóµ¡IѤ†ž-þÛîúDØ8}T’ʪŠ¶ 8YHÇÙiùü~’ø>#Árwe)û‹t4³W9ÎEÃ{ð9jµ Uìç]Qô^-5a·Šý” òùá3Ì‚³>I3vPfÁ&~˜Ù«$ë”mm%@&ò2uik9°W8àÎ ü;j¿‚ûª”ºÂ×*ü|gvÈ+ÈHÀUVb·É1ïm¯(C}ËXeñ\U³Jx€¤ãΕñrUž(W›KìÔÓ¶.Æ ƒm™avÑ#ÿ]+FäXó‰–Åæ#[Y¿Z±¼æZžmmyEžæ{—¶8ÑTpiõ«˜g;£;ö“fè²råX–.«`À©JôÛž•Aö,u0j˜‚C«š¦õl‰ÑÔmû¨Á_˜kÒ`Ûý"5ÍV#>ÛGìUÅh…K£Á‚øµ2ÑÌl˜ZÅÈSö(G̶–€¥Ò-«ŠQ Ö*F%¼×Ô´½7-²œHûBt5§`|¢˜oÙvÓ¨VÏU',‘Tƒx¯ÎGÊÁ{dòý¤©Ä®E˳†è ±O›p@ë¶6¥ÅbèØ.+f«ápWt‹Vÿûd·,€iý¥h þ’=Ç DÙÖ*ŽºZý%xÖªÖ+<²=e™ˆ')–Y†i”fù"ŸTÓªÛÚúø9x“á3èÍ‹ØA
g9®ó³ŠÒgÐ;Ay&óÓ§8dîc×ZÞ+˜ßTù½eÛ¦4k‚ýªUJšF¡F)H"S˜Ô½©5LXÚöýc[[Æ/žªU§h·EŒh#¯šFöíW‹¢l{F +uÖµS$€ŠÞ{ù€š† eüzTÙˆ Ëß´ÈmŠ D$/ ßεƒÒì¾|r<ÙJðñåé•:žŸZ›C±Ã¢wM5"Ë<¿®a½ò!!øõƒDã;V
±©•½tT•õ—“ÊNOkõˆ µ%^Áçå_„#<j¶¥-Ö6V”hø;Kð
9iÙ§ºíiª®KCÞÎ +^?¯’Y+zÄTV¼²[ŒîÚºVªîáU‘.Üj…áKžÝd®FŠ¾r +·\BÆ×rð®Ê¶±ü}Ô0:®ÌÁÊ+®TÙvû™²…ûÌâË„þoöÞu¹ŽÛZ}½ÿ¸*©ZT +Wq‰™K§ª2¡f»XN%ÇbÐ Â $ä¯ÁŽØ)+‘nB|¸f„2t² Ÿ¤o¦ž-¡°ˆñD(¼íª¯;m£KJ,È$ æÎâ”ÓÌ +(¬°hÍ!jU= +\”ªñ’©)žJ„ELË:,ÚJ"5
3X
…é¢@ERbÇÕF ž/B™Ôj:œUáô–M6 ^Å("W§¯k´ì€Ýo +ý¨D|œ"&y[¨ÎDXÓ™*'k~-ý¾fSq•¯†±H„ûÆÿX€…emˆÉ8£Èõ]ò2*aJ1wæ¬Sx´Ú‡cÁ~ —àK%«ž£‡G«C?Õ¬¤øŒHÊòù“%Y‚EL@`œ7ï’㨯0!žë¤cÞÓàÎêò^³yáfä¨ÞCçÌåÁ[ˆ +kè êQsæÊ¢¨çÀ°=#rÒ=:2]Ê@ƒ€í•hp!ÐPÙÌêÂÂJÀkɹÔÕ€O?[ÐVE•É¶Òèˆg‹Ý¦…‚°$瑶lQŽk¤©ƒ¤I<t#âÓÊ7k›0ØL'‹°¬ãQ˜T²3Yc9ô}DP¡ªš³õŒx®WvÛŠ›uÑ«”tà@ðuˆ·!2òhKÀ;•£íƒhÀ'Dé “!rX´¥¤v–Ö`Œ¥²
FÞ4RIIRƒÅgÀh.x'ÊÛUYï¬m•8?éUEB‡Lo´¼8ÕÚg§º( +q(æ +¯+«ñ&2VóíRˆ”pñ!Jü!ŸaõÞ͈œ÷ˆ:Ùi¡ÙÉe+‡@ÎcÝJ”¨Æs‹¶tY]YñšIÕ×Aäû^ñ7¬6]û'Q=Ä(ïÔäš·Õœ6"jµ5ŽqË*XÁà4‘•FŠÈqªÌ +¤1Ïd
”õ‚ø܈Ý0TóÉÔh†á8ìk»Ÿ8îÖŒü«8VÌËô) ²³* ‰ÊbÁZªˆ“u%o–1GX$µ!äå×b‹eñ‹¶e8*ãÒìsâQ~Jæ],ÄäE0é—ŽpE&#"¦ÝD‹†rèýç‡`Fäâê°™v2?TáÐŽlT·Áä§ +:à+ìÄNâü£BK‹ïÄ:ñgÍÈȵŠš T +^Ô¸m#b¥lñ¬í ßM+ÕÜ$kM>m˜+ÛæÅTMŽ68ÛÅЬF„µQn¸E[WF¿Ó+ˆeºÛÉÙ" + +êp(Êœ¨Å¨ÐÈ£Õ눚!y4Z¯=jôk'b9뀴Wk[-7ºWö«ÀÂÚrÎàÈi¨ˆìߘQ롘+5rªAÝi£‚§HÓ":<Å»&m§D+S9%ö0Ê)Õkö§ÝŠ’ÈílGéP•ˆ%ÈÙ +Ç -§: *‚âÕNˆŸS¥äIEK04NÇ1(oiK#¢òb´æYË8©žV‘);%rÜ/Þy²T֩׊ãB‹ÓíÊYM¸©‘³N‰j_"*uŸØ”Xc˜ìb#£²<Ýê£dé¤^Y0’™çWý´í0>o”‰s¢›tÐÉd0„›‹“$4F†o•öäp8¿jgm5ó£<mNÔòËØ…Jö£ 2"-¶ËÞ\O:°àò¢m +-ÊÞ’ë×…‰.RQ¢ _S~¢ÌF¾P1©ézÈ%1N㢂l¸`‰3¢ï{eJ¶H}2âê¾5µiJœ¨a0§#¤' ™™&A`ëDœë&m½˜F„¨iÑ3"—nCŒðBÍ4xöfD.FmPrŸ@wtG“†#‡±ç ï+FÏ´C\c`YX”;l_Ó½'mÍ À±¥î]„ssB¦ü… +ã¦Èrçˆ$ +A4Ž#Xéó¶¥ ¼Á6³<H·yö%‘{c¹°<ZÙ°·N§01_LÚV^}(b˜$HMȾÿöÀ s¡zxE@ +®Ëì”ö’QûÎÚÂB̹
c^“Ôö[“9À{+ó*!W$Ö°Cãºñx¿“Q/ˆ’CÅQAÎ,¬ŽFœ›§mc/!™,0uFdÌ_tÐÉ@Êšôš¬ +ƒõƒ
»NGI±ñâ:;UwYRÍk@q—N$®ÇÆŒ°3ÊåˆyŠÁAËÔˆ´ÀÆ´-
‰#iéóâ¸ôù¹;#‡4!ÿ(1L‰Ýé÷µÝKÜ;¬AEÙÎ+¢¬útT¥š¯Ö zä²Z;¦ß`Jœ|¯Nž|Û8I²]Ðí³Óu·ÉîJV7v¶A\ìYûö6)hrÜ +Ö£ +#©`éM?˜ ¡œVò¢IýÑvFìbðŒ<L+`gíÂõ짺 î
Þ{"´ONmï;q¦ +LÈ]m ¸Uv»‚Aù§ÑŒ5¦ŒP¶ªEOÛFuõK1É“œpo0SÐ’ãÓ¶]uŠX%D=rŽÓ^G[Dä§
¨§;a}n@¹¾)Qµ?tÐÉÐ;‹šè”œá>Œ¢$Ùž“¶ÎÄš‰V;!N5à ¹kË!*U¦ÀβYA´xر¬- 9Éa𘂷t
ØkÁP!«)Æ;ì.§•E•oe¤C0‡™yÛ¼f§™ûKbŸÂŒ<*]gNK(—TýW‰`¨\Ó`ÖÖ)ÀÝAÄàã„h‹(¼oÞ+;fIdadù¢@7±œÆÄž5#2˜:èdýd +¯eqÀœ)š³ÃH¨úm&m³%„tÕ„8êt0%#YÆe)±2³3ΈÝ&9#Ã~Iö“\»ñSH.Ÿ‰=”\¥Îe¤‰e fW墖ܑקd¤¸Ðf +K1ÙÚt³NÍÉd+°·XÛΨ”›\˜'Dé +sÛ`1µÝOÛR¢æeêNR“ß<S*Àt=°`ï¯J–TšQÕ«8I´¦m Õr'm'§‚*•¸ šgéë™ÝT8^î#ÎÓMŒü£Ä0%vï°¯í~â8!.Mϳe+SÐÓM¨ÀÉ +åèJ“×+nŸÞ’ +v$D@:Ÿ‡Ièö„ìM‚2OÚ–EnÐ8©ü:%¢àdpQî°fl2D;O5þdB›iBîÃ'|»8,V$ Êp¶"Á’õ{Kùš.ò )ËÒ&¢ü ÛLª˜ÌvªBTt¦QŽzà^.ÈýpzòócÌÅžó”À®A_ó¶¨ÛÕÉœhLgFƒšõ +VÆ ·_:ÛcÔÜ´`‘=;mÂL'Ä)ã=•…´-ÂG‹¤"¨g
ÌP¢t0¢²ã¤m°ÂUd‚öZN§µX¼|Ý)#ÝÁ‡I¶aÖ0Áa"-‡iM:¨@¹n¾<Q9ž1»=¬ÁÄaŸéz¦™ôG):[§îì QÃí± wˆ;†=/êb¶Ê5Þ°ª”ˆ’-ÚÚR‰>«5,IÄiLÀ„<áò¤Ò# ÷7ô„ÙÝá
úuÚÖÈäFÚ=Lçï*³‘ˆøåŸn®ÿr{y}wyýÍ驹úÆôÁ“?½¢'ÞÉ£/þó¿¿¼jÝ<ùýyòïO~ó?>ÿÓÍ‹‹ö篾fâ¯O~óÅ]ë㛓_}ÿòêº=;¥ÿ¡B¿>ù·'ûŸþëìê
?ö'¿ùë»ùû^ñ³ß|v{{öÃòG/þöæö«7W×ç?ÃOÚŸŸ{yõâö⚟ÿöòüîòæúìv9>éá7¿¾<o”Þ¯î¦ù‘lÄáÑF<iÔöÊíåWoî.^S³öÀzœÌêöâõ›«»ÌkS3Âèçsº~óòÏçwgÿ¢f÷šWØÔ¤¦ÃŸOìõÝåÝù·»¼º÷Ì®o¾àw65ÁÙ4æ3üêìõÅïo/þûM;<?ÜsŽ”$¹©ù-&ño?Öøß<ðÙÍËW7¯/ï6É/¯ïùI¾¸ys{~ñ‡Û³Wß^žoêÛ\^/·Üåõ;ŽÿvÙ}>››W·gw7·÷œÒ»¾èÏ<¡>úwšoÝo/.¿ùö¾÷œwî“MF¿Ø¹/ÞÁ$~õÙ|ùÙÕ«oϾô›š
üßöHœm„w÷½Ùn¾ú¿çwŸß¼¹~Ñ}~óý¦f8›Ï|ªïh¿Ö¶µ¿_ÎãÞ×ó¶æñÃrß]¾¸{‡|´]Æ ƒÿQnù›ß^|}òéQÛû©´½¯oÏš¸~õ§›Ë×G}ï½Ð÷â¦&uÔ÷ªïmKš9ª{Guï¨îÕ½
©{ÛºàŽêÞû§&Õ½-2†÷XÝûÃٛׯ/Ï®?¿zósüøƒoŒ×w/~{ñ¯Ë3zú^ªó õ}%_h;3Û¯õ=P:å‹qSÓÙôÊŸ¿þúõÅÝÏ‹ûÞÛ:2/vn‡÷½®76‘ëúA'þ†7Öçعß{ðÿâÕÅù›«³Û礴Ñÿì—ö_n.¯ïž«*µ9®ó?÷ܧ`{6µþgšpš¶6•ÕšÂ©ßÜgy·ùn…\ùÃÕ}= WzÎOÏo®nnÿý»oÅ0¸õÑÉ,¬Ôon¿>;¿øâüìÞÝV¼Î|‹É)~vsýúîìúÞ&¥mMpgû'ù»ï_Ý\_Ü’Û:¼»³8@$¢ÎþüæòÐÏ+mÚ[ò±o¯-Né÷ÏvÍ«è=bÿÞKA†=_ç¾c€Ýø‰¼Ãb³Õ‰Ä‰Ü—mlkíp]˜W—w9»|—hú~ݘfØÄ6å€Cï̳ÛË»o_^ÜmìC¼;ÿxqûÍÏqoîùUú×-ÞØ÷>µ5–?X™ú0¾Æ&ï…{|‹Cã'‰Š}8 &êó‹]\}ñíÙ‹›ï6Ÿso?@ØØ÷YïØÚLÚÚ¹yC†þxsûêÛ›«›o~Øäõâ¾¢ã¦öÃ.˹={qùæ¾q˜þ鶒å1øTËm}Ÿ:Øé +dàC®Ü÷VßÖÓ¡ÏçsöâÅåÝå¿î+FÞ^°qfSóêS˜Oíüìêü7/î;µ«Ë닳mE€÷,>Úùù›—oÞípž˜s¯7öÍ&3XÌ
Mÿă¿_‚ʽ+}ýÜÓœOæ±+QÜ_[ÚÖ±ÇùðZmÛº+¯VÛ¶>Õ¡ +ѶԻ¨@Û½Ïþù¶Ê!Á0uS390fcßås†ùIõÂC¬½çs$³±Ù<R0ÌÆjG£a>4ÌÅU÷ÒÆnÙ:æ|cÞ‘ƒÂa¶%‹ÃaŽá0=f*›dàëÂa6&÷Ãa6õ9S6fg{äpÿ±„Ãlì;Ê»·um=æ'”¼·¥Úý?ïͧ:”l‹Ÿ+©ö3GÂ}(…Ü6¶“?Òrzó'¤_a‹Õ.EyÜh–¶šá³››«Ï·8|y½OLBÚÖ6\_´qkê°¢~c³9mü©@ZRl[öˆý%Á>ÈbóQ5uVœwÉ¿åùr[X$„#Gû9ZÞÔ†8r´#G{ GÛÖ>r´_œ£mëŠ;r´·Míâöæ]¹uCû-ÈQB;ò³£„väg?ÛÖö}_ùÙÖ#IVÄ_l˳¿Œ¿øÎËô¹Õ9›Í›²©±µc³Õy?͇QIëöâåÍ»ÊÒl ’Öƒâšý‰ÿ4¸ŸÚÿº“öϧíïöÿŸ¶'›šê[C™?ò²a~c5öÔ
;V¨úP+T½~E5ª65³c…ª{–e`Aà¯ïº)~éòTsfÿêâìî·÷f—×/.¾¾¼¾Ü˜—k23÷ã«Íáš?FöǶ…Ç«þµµõAƒ—>€<»yùêæõå6Õª‡%a&~óŽWÞ¯¶¹£sHªø–ý,a9:ZÞõE·êeyÂ?ßá…Þh%
{¾Îÿ|Ç +ò(î=Š¸·©q”ö>riïƒ +ÿ|G¦m’ÝÔ§ aÏ×ùŸïÝ6*âÑ°y‡§«_$îLä¾lcÙáZº8¯.ïþrvù.Yüýº5·Â¹îÞÜ¢Qüð;óìöòîÛ—[«höQß»rÖßãÔÇ»sk[ëxw¾s:äÚÜ® +}¼:§Wç¤q}€Í#®ÙïýWÙ0+=Ü3÷€¯y¬DôSÔƒ+ým›EuøïšÚÇPhó%h0R} +£‡8U6ÎŽ¡|¬ í7úh¢ö”ùm+Ïþ@î·Y®¾î¦¥”¿Ýž]¿þú(ñùû7×çÝâI~€•íîì«Ý„ûŒl<Êÿ|ˆ¥-œlËÍ0›Áà +®µ]ö‡ã.Ûä.{ZNÜɶæuÐ>ûü¸Ï¶¹Ïü{ÌÎ~z5õíöÿýåí¶¾ü¬¦~´ö±Th[m³GèðÄÆm¦í!ÇÓâ7ÌŒ+¦q5£æ/üÙÕÕ¦Våžõ¼2CJÃw9 +ùó‹o.¯§žüé•öÁ¾øáåW7W옾8ùüòöůŸ¸“ÏÚ?ÿøîÉ›ÉÝÉoÛ?~➖Ǧ¥?ueÈ…þð®ä\‰Òþ3p”ßÓ<V7Œí:ŒÁç“œ=é€ÿø¡ýËÿÛþø¿ôÝI<ùãÉÿþ?îäýê_ŸœVŸÆ§!餆àžÆÜ:zIäLÿR+‘ëÓ¡úzBmÓÓ0¤ØˆCz}ðDŒµ
Ó"¶®è¯sê ƧCJÔoôOK ‰Ú¶×ü"æ§1–‰îiÊ…záiö~ÿ”ßnOk¹áð4Ç¢Do=Ö˜ô×G?Žúr|:Ô8º ïÖÖ§ +bÏ©<ÁM:È…æ?ä§C)Ü´ý5V~Ò>k['¡¸1T}¹>µ!{×¾ [÷É"FúTU‰ÞCÀÜóÓâyõ9Œ^½ÆÊ¿5<-5%†QHƒ³¾]žÖ2Ð:µ5lëÈ¿Ô–,¶ÿ%"m™!2qhë!–Ú¶Æ_B¦Ÿ +m¡JªÚ¶–Ì¥}»šùÛŶrâm’Ú:דgû÷Ôó'_·íÚêµnÛî
®ÆÈ»}²0ÙÏO3-Ú@»9Eúnîéèü˜=mkÚ—áiÛ잺¦ULØ®éiN¼±Ú8\–½‘ËSÞ¬öeeRñí·Ë Ä”²®Xi¯;^±0ò4ˆÖ¾W¢tY“ã؆¶ã‰Ú±HºÙKh£äuôméä{åö•~ßYNYÚæDôOãÐ63¿Ÿ†ö[üqÜøt YÉÚZ“F¬Os³B½—÷ÛGÓ÷‡Ð¾c2}¥¢ÇªŒi”³l×öéZY&J[~¿¥ÉåiHòûÁË +ñ¢%ú¶!Â8ÊŽáõ—Ú¿dÙH¡õ+;´Yé!l,À;éµýn#Cç>÷`Ç·¶c–¶±qù±(k!Sˆ9êÙ(Æo› +ÎéI*ƒŽ 6žPz•÷ÛdFù¥¶B¾T[Bl¶cŽÓ¸@ÏÝ~µ„¢G¾mIÝyô:ƒhÜ¡
;Ð\„c¦ÆGˆèÛ +
<ª¶‡ëȬ{øÙ“ß7¾ÿÉ—ô;ù+ýïÓÒ>mÿÖGûŽôGp¼?—ˆÖ–̵©üã³ö®üD¦ƒ%ç’8õK}ÐFéåTÐV’ûÚ¹ÆG†¢G¥] +Nc¡;ıØÇhC¯Ùò€ØŽž’T˜Ïr¿Þ+K‰i´ãÇÉJ†lë€ÖmïWa@ĈõÂkýf¯û¤äbkËS—*8“2€Ô¶ZªÊnGâÂX›`Q&{ûYëâ‹öÏßÛ?ãɯ~}òÿ"ÉêÕT¼z€H´ïð|t>8›ƒÍ¡Gæ sðq9ø°|T>(“?™†ÁÚŪFÄ0Újņ1è i"O¿Ré~®äS„Ð1vò¼õø9¹“ˆé/A5›¬—atÚK;£FmŠ§^Æ£Ozí–4jCã·ûcÏl±3•(Û±°Qx9ÚAeJcÐN\œÛÎÍ£®¿K^ecj[eƒ"b!ýØà±$Öím¬ÒZ;[M’¡5r‡‚’=–y·µ®sn¼¯º¹ÉKƒŒ¥É²$Æ?7…ˆõ¤Fn'»Bý‚îÜÆ° è¡x!tŸ©V²/BfÉšû%U.¹Q÷¹¿¦ÖÈâ$±Ú +4Ý +Ye–ÁCH:”²X?˜œØ1H@RcÙéƨÄqÌja +cÒ'-7ò–mãNQªÝhªîçÐgÏTheˆöºóE¥^^8‘Úš 0@< É
^Íã +…˜ƒtáMyh"ÆÕ¤a\)DIÍwØàØ>…ë¨âh°el-+8G`SŸ +Ù,È’7‘‘XÛf´!䃵S:ªŒZq%°x5*9Ò"ÈÄÚih+&§¥ÙŸc̃0„!«¥•ô„È\‚,?QgFVÝ‚o]
röÉÔG5h•*¯‰ +Ì Y' I÷7QcÊBš0"@Û‰‡ài[ˆ¼Ò.æäøŒ6"8elr“OÚ²Æéºh¾žŒ†²G‰«†1 +ÑGedÔ«Á +QoÅÜN]b–ìÕ$'o¿‹I¯´³*òFi0ð. ýHU¦,F'²n;Œ ü¨)–CT EÛ’aÙëÁUÕzUs-©«[ilÈE݈cy¡é»íŽ¬ºcŠ°z2´ºA·F aɈ\àC )<W²÷¢³ÔeR©Eb)$<U,M‘½ÕÞ!â3UÄ]ôÊRÛêCHô¼ìDÖ,„ØDíÂ
:‰Æ’â +)³XUñ>.†L¬ªª,šI©Ð¶ C[»A‰MÖðwzfàf‰5 ƒ” 7QÄ&)èÍÉèbYˆŽ˜\™¤÷„Q¯1–»”( +.1ø\1³vÄBqeVmêÚÛ(„˜ÆÄœíõ£J®IY)N 7n„S<œ|e@ãÉfsf9AˆC‚Æ3¦ +pIú
¼7S¼óƒ. _†˜W» 0)—"bÍ#>¢îNk]l¶å£5/¹q=Û1ÁC¥Éê>¡î³vÁŽ*Ý1£Wý‰G|ð2J¦+Ý–•jâ3ë"0[;ÛßM…‚FºÎ
›˜Üô«ªg׫®Ò]Œ–l¶\íGýìÕ–M’HV€}„j'©±FÓª¸-î0•}“ѳLÖø"âq?Ú½æ²1¤ÁÇ„;0è>ŸŽ{•±ó4&„8&Hí@èº4þçÒ»˜"yÔX$¥{K,–íååÚ¡ÄݬÚ&GHCP÷ˆX‚J.ƒC4®Ì¯|9¥û¯¯j-l{§Â-Ë¶é ˆÇAXª^—…¸«×ó1;¤†úfªuú¾ìCR#…ǵߪ…p¤øbƒZ&]”𣛢êR›XÂ(WßÍD¤Ÿ€Od Ž-ĦŒBl;B»% "n…¶ˆuJT
„¾LôJc뾌˜'ÅÍáºs"{ú*|^¶†E2h›¿@%rdÎÙÈí.óØž"òÐÕ<`˦Ì6¼FcgÆl[õY6¤ÏÁ‰hо3Pq<+vŽ÷•˜U¶(ݤ֖3óNô¡sï¦ øQ‰Å‰r—i÷zí·_îÌ¢£HðDyw±ý:ŽÊ-mf*0®±FLrš=Ë«P°ÐÚñ«e°÷› +DoamÛ]_‹kh-‹‘ôKtÐÄ"•à5À7%;{qž“«AÄ“FF¶´KUÔ%‹PNZz•OÙö}öPÝ[Kl[ +:–Î2¶HàEÛ6K.&OKd)Öÿªê%¤¸Ëûm_æ´£4©F´•¶íG$<ÙØTJÒg“;ŒÈƒØïÉÆ9èþbïu†º¦}¼d½Æq…°9Àv`"±]‡Û¡ýDc^ª +º±@ufýS.›¶Ú9W.bò7ˆ>Ü–1xxRF^Io½:b8îBF§*y6sK#·}›…\H
y®äR«jÏøûK- …ý?ƒ1²YЩ/‡çjí AC¦ÁUÛ&ÞLä¿B¿I,Mlañj.›™L[ü¹Rõ"#ƒKáã‚&‰MˆMtCP[Àn…µÂ¤¤šv–ý®mU'o-%새ÐÞÛ]îdÛáú!æ
ªyè‹bhhL`„ìÇNª¢KÀwÃs%—2èâ²±@¶3ëábrªæås¢ìd74Y\‰‘ê¹’‡T&‚Í$ +Ï÷·&ÌߟÀYýãýê³7_]œ|v{÷çë¿œÝ}{òùí›×ßžüíææê×ìÕnðyò‰‹npÁyòÞU7üÞÍÿãåIãëÓäß5&1ægÁ…ß—â“Orãóïœ{òÉ—¿i?5‹§üäË;̓ù’‡pñâKÅL~òå§íŸÉàÙÓþâI6wü!ñŒzUí!$Z¼TªÚ<Û
+ù,‘Ϙu"7˜©‹Éü¾#ñM£~è¢cço“›,Ɖ´sôc2išUDfoN¤Îs=—íÊä¼mbçƒÁ&&%ªus°ÀµFdG¢Y\f²¯¢;Щ)½M ` +“šs°rí4~nô ~3¹`xÅÂ7™MÖÒZzͧœDvb´xŠnƒ#rE”Dl™cD¤u`—JÊŒíÞ;c¿0æóBÀ–ÎçJÎb'àŸ+F-± ™tBkl›EÕ¥FSùŒ;¨ ûôÞw~ññ¦¿Ä°Ä‹£æ‡j¾}€|g“÷) +vÄŠ
6v{ã‚»€,ø™rH{*&ì©q˜ì¿€ ‡âì7rF(ËšBŒÉt1Â6#3[BÐk̈Â.±Î8ì
úb"â‰X ×…¡¨>t›<}ɱŸnxÒ“i’¼2à$(ø¦Ñ,´¡Y¼NÌìÀ²¦§s°U¬ÉéþâðòþqFDk„GlQXÐqô°õóX°iÚ?úu4œ6R1¦Uaµd—9I:#Á6ÊÝí4uùÕŒ™Ä +‚m¾)LÈ„?X›ª¡_U²Ú”á'ô)öo‹ï'd]Ü +¼Ÿ.f]–ÇmÄq]*CUœv–¡„ˆ0×"Íè·ë·ký†™t njn9ö*è–b»–Œí›B°{Cʈ88a]²Ò³ZÌO7瀸X««³Ó׶Oìîv¾ê¸8¬ñ9È1ke¾Ù®¾R¬QñEügz×g§³ˆê«!¢&çÐA‚ÔÙÈl~Ó¶“Qp8½UÞ¡0„±eC‰6C$Ó4ºU‘IìC·CuΑ’vŒ¬šUeU‰£×¶ip˜G- +‘üâÖ'‡ÎëÚø5yÜ>ljƒ|†ˆ«"Ç䳌ɹTò„ŒEoWs'Ck-ƵHòK虯nsSF¿ÎÛ ®Cæ´`½ªQ–dÄ$QÎ$ç‹äå\Q‚ô¨%tšLlÛâÒ Cêa5$'â¤è@•= åV‹Ž%é9$]«úóêÐ~À!pXͧÔA5
`:¬,)íD6?2IÚÑAÒÆWf”Èr'aº'5÷U,ÑkÛ`*c6ìSFä¦!,¯zdœ›ÎEBùue¼9鈜{'"¬ˆ¬a!ýÊÃëÍæ шCÑü^Jä +©'ƒ©¤£˜˜·ÀøEl¹s‘b:9tbbN!xcn»1Ñ6vÖ[m +V q¸Ì¶‘ÍœMßùµg6Œêr¤¨¾†¡ñb4›M¯
m“iÛ5`dkgWv-‹!þH˜Å2.ð̘LÓ-ê¤ã—FÆç`¸çû[w^…˽mg."c,ƒ1H6ÁkÛœa ÙRCZ¥Ä‡ÇØ=ƒ-3‡
ÛàœGkâÉüc£)OI\)Œ]¬ ™h‘ø ¸•Lx#ò€dºä'þ©R+7¨œMD:à8˜YG]œn"drкé‘4Ñ; +#ž ‡~¯–®@Vj´‡ï—Aþ5äîtœkï6[$b1©i†ë®öªc¾Å’ȹÛlC˜xà\¬ÞzÕ`NîÀ™§&#Çhâÿnä# +s½µ×µ«3Û:‰NH½ŒRÓ“zb¿>T.N‡·, +! +Ý‹íXÚ"ážnªê“ønI÷nØy½W"IFÊ88ij +Šm˜ýÎìV.¸¥&Ö³d…4ùÒ&÷3Å´‚•“!9#›€ž0Fd“×Øycä’âI%–`Z`G‰#Nž³‹$‡›wfׄ#êWy‰ö´xÓz…Ÿ‰½ÝûlC€|ÊfO½x:%â*bOÈQãO’ÔÈb» çª=[ÏM{ +}Vc€šLj³´G«óœLúñˆÔŸ˜Õ£«Á’4¡ùÉlž…ªÔ²¢ÖŒOÃÐ…Ãâµm/‡Ád(PÌÌŒl"n;òXôv¢Q¬$;‡9C7dÓ?~®I«(Œâc—E¹þŽ¶NˆLÑPn&FWQ·¹m+Ö¤©†•S?Q§š=™Âš±2%ÚæŸýÄÛ•´˜ 褩M4 +?>]HùlT蜺ûì°û‰½cè\ÉtΤ)ð,¡Z!
š&¾¨ANqRùA¼(eãÆ~m5·/Ås:ãPL_ÊJ~Ì¡{45xžõ‡ÜÇ›2¶TI˜gœˆÎCìSíPM{ð¡„jF ++Öë’)6£E”UÚúõØÐ9`m“›qïø€ƒCÆÓ$š2Y/“"ú©ºîç¸hn‹îƒna¦bñZ·dœÈ6f7âÌP#›…D€.ùÍìj=–za}zidoäú#¶*ó1$‹+¤ËÑ|s)ðùþÖŸ{àp{7á?Uay©ä„ú'òï̆«ê5Vð/n6ˆ%ªJµ6‚ìZÈ’—/ÄêQõ¢ùé\;`ÙªJp¥òªÌ§¯S¼ÌO„È—z•€ˆ–Ucß‹œbÚW±¢
%Šì^%ì*#Ï|1ýó¶‡ÏéÒdõ¶CáwÙ³ÖxðÎÕF¡ÜÖ]ÜgÅ¥í}×Üz^¿êŸ|ùúýIÇ]½\ßëGó‘D„j"qƒµÕÚñL¶ô*
ˆñEËñÜíW@œÞ²±ÃzW–ã,cþ£%u²•ŠøVTå#Z®÷מõa¨©§HÅHFµ°"˯ßmÙPI”1Šè¤×™),§<ß×´÷0ÊIiì}Ê“'S ˆlAeˆ)äªfZÖ€"F„M%K}+½´OÓ2ºÄ!g›¨+³l\¤µêÞ‹÷`XaéXY0-w"b¯¸p#†Ly‘Øë¡o„ÑLÀˆlQC\ÙÈZ“©˜-™ˆñY¬¤j„Æj¶þ(È +ýÈZ¿jÍ)½nd«ð;Û¶Zêa¶1¢„àhãa2äPm¿L¶ëÉB¶ø£99ÇIk‡hA3dÆŠ†öW‚•k“Z7È×*Û¡D¨ëˆ£6 ÄbÙžíßöº
-öqGŒœpú¸Â˜mú€ó4Œ#ÆÀJ ±m+B2ë\°’¡š³¤D‡0Fƒ‹Ìä',Ø·f&í…«h¡8t› +ÂúCOÝ tÖÐ6Ù*I!QrA%8DðªïO‰Æ–œ6£UÞn2³ö9i ×& +6, Bz˜É‰ŠÅEþN–ªE¥ |uôÕ-á +ƒ”æšv rƽ[“±¯v~PR«Z§UŠàp’Jì<
5’(*|ßYU/$Épu!KF!‹ +°Šîý¥uGLoê))løÁLÊØûˆÕ^“EL–hq$ÔÉ8![•6‰‘³dÓ‹É®Ò!öEF‘æÅ<°O&}j¯&®m"c,XV¿û>…ˆÕãï£ù–&j´ä„"•1~|L&¢[„v©"kƒÅQÇ~Õ¡0a/i7A@<ž˴“<|TA¤¶—;‹{X‹j.f}‰"9‡ÉçÕÒ;YüEFv0ÎCöð&óÊD” +ŠbÇÅ[Uÿ’&›Ì[º]®ýÊ=¶¥hÁg§³ÉDyÒØbc›Ñ4³¤Äš ‹ŒÃéò8]vÁ3YDµj=`?8˱,]ã‚ûƒ’{]6µ‘¦ˆÄ‰f£Ï=Ù.\=R‚…@°þ¹(ê‡8Y›N1‹žšÌ²Œ%zŽr¶¥°("ȵ`§rHP-‘UTB#ÇJ™äSP±3÷yêœ-fŸ[;”íqXƒØ4{'z;gä_šÿmú—Õ”ZŒ¢‘Ñ6žDn4ò8L¨ëžlWª4BDÆüˆ¬m»ó8 +ØjÐNyý ØNëbp§¼~t§t±¼SÞ?¾³Xàù–}ö¼=øZ|Âx¡pÈS +×C{b1 +¸ÄÌkÆTd +ÏÕz(S˜ +iu=䩈Ì{@O»r¾€=Ń%ð©Ð‚>…Ö~ +pÿ»o¬ê—F«~ù8ñªË‰hœé'_öHÓÓc +®Çd¶Ó´De¶ëq™M#Z"3ÛƒÕØÌó,Й©ÆgF;Í&=Êš<X¢4¿Å9µTîÁj¶s´æ±ë¡³=˜Í]¶\ 6¿å£~þ1½Ýó™å¦ÞèèÇô=ÎWÑpéþ`/mô%Àô[zšŸØ˜éþ`4m–PÓ]§^6=Ðàt×·WCN/ížrÌàéþ`=ý–7æx€º?X@PÛ¶Õïü`jt°Cm]DmŠæŠÚ,Á¨íÁâÇÔÞõ€Ô¦•/!©Í4¸”Ú8ì–Úlƒ«©m£.¡©'Æ3`ß=œÚnÜ%<µ=X
PÝ{X@T›ùg5Hµéj˜jû\uTm¶ŸõPÕèâ +»›ÎVa›à±„Ã6yb5 6z8 +î`ø!JZ»YuÑId£5ªMa ÐPù +n$MXåð w(wBRªíá$Ïž|½Ÿí¹“ßüÇõ]»¥Úsr~óòÕÍ›ë'¯¿={uqòòæÅÅ„å½yò«¿Ü\ýóìä·7w'M¹»¸m‘X¼7fOÿýßÄ(fÔÀÕ]Ãÿ9yõDïë‘ +6ƈÅ*‚lcå¼s1¸$[ó‘ø§œR2½°V=†Éç¡"ä1IývbQ^EzG°8R +9«I!©SîfÄ0À8e«Ý$ÎĨÁ$8ÛXíÇ)»iÀŽÛ,Þ;"cw@⊘±x{WSïÄÌV4 Ve#AWã²Kí(ž?ùý[n4:ì¥ñá{]hÿýd½ú”Ë‚Ë}À£Äåù³¦d™b –Œ†2MlÌVæ'Dª2L¹Ù²2dõØÁö^ŒÙ‘”#«2BŒ´¦¬‹Òjx\I9‹°£±°J–©Ü²„Â×ß–
hƒûjà#'· þDIFŒRü”qª´<^‰M¿ßŠüÅôܘŒ~pµ¨Ÿ*”/«at2(±"äj× A9±û!;‘ÕO¹rÙ~Ôºâº<‚¡Zæ aôr]*eQ.%+æ5>-¸é²®l£2#€–pO“ìW`$ +[²a¤–ž÷¥õ™¯ÅN+ú—$ŸíÙ“/ƒSíí—Hpy*C£€u4I)t„®(>7êxûðìrR´€jŽkÙ¶$o¾‹µr&™ýS**>ÖäÆ8ºì=.£~ºA¦ÄV³¹Ò‰ÇAw„\\D}L`A¯HFtVšŽVâ%JM +Ùh´“4ŒÅW± +¶ÁuK/AÄJ–ÛX$ž7•#[Û´ÇÒùW5¦V%þW4-•ðª:¨ÏmvÄ|߯„:B¢°™Éœ°÷TÈ Ù}d·§kh†K•ZmrRý¶s¬5í“, Š^8‰€àÆ%{õ Šè’¨÷#Î-k¥ë¸¹¨õ€Î‰pâÁ¡ ,ù89ߤ1²FôÂÜDåð¥×†ëÑ–ˆÇÂ×®eW“rÂòzÒƒÑE}|¤r¨P—-¹—tPÕ†IcÊe1 +œßœÙ*ƒ$'™7¢·%'(«ìgµ"–Vh2tXjüºÊYyÎ%DxJm㯷YUp@ƒh߶ö„VªÞçÅ›Ü µë*1Ýc<C6Îçbû…lb6L#J<Ÿ2x‹‡Ü6k)IBaSгZ‰9Š¬Lƒ"ý@n~}¶Mº íŠm¼ +m㤬JEÊo2æ-8Ë}€Öù#óg©¯u·•-Á™6&I.aS3ÉáâNfcK…Ç¥Á,8¥‹åƒrN²~ø¬Ë— \`S p“©ód S藺€ÝRù¶a/‰Gö†û" q/qÉhÖŸ“ˆ.áXÀqŽPÁ¸€ (@ìeÀ‰b4q„+ÊJ ÛØ‹–&)¶ÎDv™ +Óõ¢"‰¯žAˆé±ÜöE°rè‹HÙª’¯Í!¹ª˜U±ÈTý>y øŒâ«²/4Ð\Õð’ŸsV³%™Ù!‰¯×Žˆœ<,ú¢ýд|Eõ‚I¬îäsØÒî°X"^K¯ÄÉ´@ a»²e1DË‹¥êÑÙAçeˆ€,¢Ò½$†.sljÉUp÷FK÷òz…ýðDºPã$áO¹´vÊ&ýú_è×V!À«R1d©£‡±¢åEŠhË° +HQÖ5ˆ _!v(zèìi0S4œ
ƒ +Qù¨åîc«½1£ #œÃ™!î¶è-Vi°µ¦¡â†)(ßKèƒÄ‡ÑÁ0¯´<š9ÍW§üAÍa*§ýsB¥÷ZÄÿ_jbW;lt†,ª?Æd[^À’xHêͺ_h£ËÜ&õ|† M²_ôšæêy¦@Üç:‚QdS’ÁÇ4U„ +í8ÙG µP|2{'P%ŒÚ÷tú²p¯QÀä 9ˆÑ„«¥L–ˆ4AD
Q!À_aÞKQkéÀ£<Šã0ÇQOlOê“ÕèsðL®Î˜Ä8>Šm¨o:D
7…SÅï$V"Ç^?í?Ýf‰\mZ¤M3ï§
™$æœôüáÜUe¨$¥ªþçTÁ¡Á¯ÿ †.Ý)€ÓAÂú˜¶‰3{ª
Åg‘Ø{/DøW„5:$Õ±'çÞ©vÁUÂHÖ‘•UüEöå 2RŒ…N:XQøìÆòÅ1F*דÔûÏ9+à+êh’ú®>öÆ/ƒ¨'Þ‰‚æ?T|r§µCN°bF-zMǯ”Ô=vÊѱ<©%UÏ<‰c½ªNÛˆžƒàôª6ßv=Œé»Ë¿Þæy˜|ã]ã±T™‡V"%öóŽC)S¹ª{rù:7(@‰2åSâ0šD´"¥KÔQ_PÁRî)%Ì^5š/Dìx2÷Je+B÷{\+m‰pó‡ŽÁ‰—8«Œ:¸ +u>½i4ƒ™" ˆ[õµÃ’C©?Ÿäj€#i”ˆq¯e0å¤k”6É>*¨æbÙC^Ø’poѬÎPtR†@ìBÔä Yx)³öLõEµ¸£…~R’"žü}Q¹‹ˆ©ýÅc +±ñÑz:Ò +“Sø»&å–ÉîþÁL{äÇÒDÝ‘œªçåAÖÀIø±gô¿Ç\^…Cæßã°—zqˆ¼Åw=†a±„TëTÖ°|7ÝÌ·I\¶|ôZBŸ¢6Òà;Úf«€Qëm ÒÿR‘4-6ÛI}Én +›ˆÒb°ºìcÎ:3P +Aá%Mê-ºkX勵¸Ÿxû_{;NÝ<4h¤Æ_/¾¹|}wËþí‡Wj! +»
÷ý«›Û»ÞÄüæó››«y›ë³¯®.þðæòÅÅëÉÁøìêæÍ‹Yì¢X§\r8ô ÉLT%x"=Ù#IOôẖ8£ÚÖ¢iŽ]Üwè÷Å’ÍW +î0ÖòºnpZ±”î.tJ18Zl˜ì;œÈÈj…×ðýĹfHûž“ Ý] +ã4~LÁþI4VžZMf"¨ÂÁ‹¼/°Ð$H¡ô”KR=š:pÀÿô ÌDÎVèω^KÃ&hxãUÿc"É•$XI Xʤ’Û¨`Œ°ŽF/a™D¤ø@–%†AÌ<…‘´b +L’# k ^ ú~‡d 0Y²_ *ãŒÑýψÚüûô#ÅŒ†„‘&Ì&©Å Çõí§ +²ï²ÂË' –pÂ^ +¶!È0åÀ«¢nõmв&6S$Ù‚dPÐÿÅ=ˆAÀqm>¾$ªz‰X¤rlëµJUVî€ÀÈȲD É;B+I-Aj1;ºä»'±øÒA„+Q‘éú(Au%Se“Y'y]s–9«óê)RæèX™•&·£M"2uÖØ4î€ÔIô¥Ø'M*dr%e¾<é$FH¡€7Rùýdu£ªB}ÓQ®(É`š¬÷:N½àLŠ-"-ý\=ßVlºWhV7Ô4‹´—ØÛ¦ØÁUÔ:Gd'E JGÄ#ŽÄ+òŲç)¯}^—ÐÆQ̦ Q…F§o'ÊÏK!(¹1%;¥ƒÀI¤èœÄ²X +(E'¦1Å7¥x‰_%^!¦D +/‰ðø5¾¡UPÉqìnù¦A KfÛ¸È~t·¬²¬Æ ¾ÃºLÎı|QÁ[ë +ùQoÚmâ{!ó@’©èÉAѵÈä;±ÇoPE‰|[#3xþKãV‚½KŒ¨VPæu™”mOÂ@´®Ä5+téL™Mãd²¨¡#Æ°öD-É<+HRééÚeX]zz<U/2•p%6Úâñp8¡œ”A†¥UºÝò4¬¶0F¢Sl[O#÷ɬ–ån$vY³~†ˆ‘+¯éêEzì*¥83®öÈÉDU~ŒÒRX âqë"ÒÊr@[˜¦Àí1‰!?Uñ’=‰“^ÉhW
¡ˆn1*¯-ˆGæ&}wò¿©ŽmÛú¬ÿœr¸Ç‹‰n1Q}FÂÁO4ȇ=0M¦Q,N/iª>EÐÄcEÇ¢ ‚ŠeÍIÀ
]3lû§ÌqÛ"õ’·TQ©Hé>mDò‚¸©XôH ŒãJîÆÞ½!j)ŽUÁ«ŽE4r£g"Œë•Jû%kؾ£[Yý©à2Ijñå{H~YU^ך,Q!+D™ñR#™ŒNô‚hcy̹£³j1ÄÑÂXtœ$ö³ÏV;H£G¬CUÕî1©C½UMÇÉ@î!·Û‹‘€bØûBNUS¼ª¹Þ霊¤á(]LŒÃy˜CÕb¦,Â"Äþ¹§¢áPž†×î +DÖ ½)‡QÃíÙë%#Фo¾%3‹Ë—¶ŠÆlRuœ/]4´ŸñÓe +—[C½1:à—“”E.ªTÌ,ÆW>z
ÈTylLjãæRòcQ5H]\,ûêM@š”†¿Òñ–¢÷dN(ež©ƒšì–»îO1j¥§]¬*×@ß0ªêî¥R
ë6™w!ÁLAidV)ö’žä(
`©j/;eÑ$g1è +$k¡ý¦+¿•‰fæ‘þ"R8]µA9a“‹8Œ…{–ýO%±¦H6ÑðtT•§ +<˜($døq7Cå$ÝÃåAÛBe©Ó¥?ÕÍÊ9¡úóTaBò ++,ëÔ“æ–,®UiXÙqY4O^Ï°â“NÉ<ࢠ+ï0…#5F}´å³n¡NZ2¢êÛþ6JgÓOÅ «¼UÉÈ,—Í?JU›!‹
I6@±b7À¾¬…
Iý €Å¬‚¤D<n¨Ðø0ì(†gJfŽ7 {³BÖ;á€E.
ߢÙ"ƒÅ‰ÌÅ,©r"‘¸Áp§‰Z8oZ.«ERñXeûR‚\%¤¢P#…ØÉg"iŸeyÑxŠF§°
›OѨ["*Ê{”¸Ô„ÜGðPàµ`Ï‹Ny†’L*€öÊe¸“„t"f³À*Ê~j
o!5Žogž®Æò°Ìe +é1›ºDe¸@ 9>á…åºE¢¹£N9¤^pÈH±aÍH.!†.'½ŒÌ©¤èqX™]šî»Â°Œ`4ªÑ‰t£ìkåÖ¶^¨Â +˜ZÕA>kœðÑÕB$NãtCB† Wgh)¹Wó ïØ{ëÆúÃíÙë׋o±Ç}YÄ‘Å( N“Æ2ï5Zd½Ã’HÛ’l/‰ûä¦Q[»¯b¢“›Q½7«1%dkѾ|s³c€c
¸Ö'EïU„ÙsÆȼ‚ëÆAÌ¡Äј F'7‚2i÷ì‡âEõ"[Y‡Ì>1œj4•±H\|‚†Âê’˜€Á™é'¶ö{N7ðSŠHDÙäƒ%Ѷ†Ð}ÁÓ“Ù؈¸¤šhhSÕD.g¼I?•M3$tà4}—‹#h;OXš%>’¥/Å÷6ªSÔñÄ«Ÿ´0 býN¤1±ÔÇ¢ž„Ñ–À¼YqJÄoî¤èc±°L
ñZÓð”C"]F0¡#®A}Ö¨5'’C‰ÅÃD¦“° àÅÃN #ƒ. - ´nÛÑí4³DX:`+æ¯ó*iÐo™ÿÀ›†¾ï-ñ°¯®õSf§“¬§Øçmli
·7;FklÛfJøð ÂjÄä†Á°ŸuýµE“#]?Øj‚ò"v(×xñ¾¯d‰K¢½¤©¦t,v>ç(±‚1pK³x§mÉÄ<ÔzlQJ|‡^ì·¤\;qª‹%w‘99—Dþ
}»2œ v*"'1ÿ›í<%Df’lè'ð‹ÉÄÀ.¹ ‹jýöû„Ñmlø:¼2è¥4W©›Ç¾-j]i£ŽÖ‘|È -ûZž…i£†ÏÌÆî}±!@>eS§^<ƒ’p±wä¤1'Yª`±_«ª=[ÌM{ -cVS€šL^i³®'›óƒœMúñˆÅŸ™Ò“«µ’5eÈl˜…ºÔ²¡šŒÏ1á°zm; -^0 -33#›ˆÛ<½Ÿh”#)Âa)Ð
ÙÜŸëÒ*JŸø4dQ®°£3¢Q4d›‰ÉBTTàãmnÛÆÊ1i2aãäNÔ¹ifC¦ðe¬LM¶ùgd?óp•m&:ijMÂOR>§€î¾rØýÌÞW23k’;K¨V*Fƒ£‰/j`SšÕv ŠÕ¸i\Õ£MÂíK1œQgªéK¥@ÉO%/¦É³þPÆxsÁ -2íL3Ñ9VÈþ)ÑÆfÚƒ#TsNX©°^cȦØTŒ‘UIjë×cCs´€³ÍvnÁ½ãJ -L—hêl½LVHèwÅH5tçMœã²<º,¢ž·…™ŠÅkÝ’i&݈ۘs?l>†ä·bWñÓëÓ#{#·Ÿ°U™_![,!]ŽæWX•_Þßú—çØÇÒM‡7ûOVÞ(9£¶Æ‰ü73à&ay ü‹›E±A5©Ä¦1Ñ.„"9÷Bl-*žÎµ–ªš„R*Ç¡ª{ú:EÇüøLˆ|7 -rÈÓ?ï»çc¸Xº|Þw%¼,÷¬2|pQøv•F›¬µ´ÝtµçÝ×û³¯ß~DïÑq?/×÷ú#øÃHþAuŽ©Áªjáw&[•úÃÈ’ål®w†Ÿf¡µlÚ°ÞU]¥Ð7KÜXýÑšÙJ%|%ªZˆµ¿þk/Æ0Ô°S¥¤
£Yàå˯·Æl¨DÊ%t2êÆT–J^Þ×tô#ÂnržF1¢Äx6uÈ6†¨±(3ÓŠ†41!0*[B[¥zª’Ñí,Â9ØDÕh˜eãdäfUÓ^Œx„»ÂäJÊÂe¹]Å…1dÊvÄ.c PfâEd‹â’ÆFÖKÕ,ÇDÔ˜Îj%*øS#`05³ì'E‡ÕúUÛM•øt#[Þ•m«¥V6F’ mgCÍöËl±V,d‹0Z%—4kíh¦áH¶i¬h(`|5XùÕ6«]ƒŒ¬*˜Jôˆ«N8j%ûöâþm¯ÛТÛ4Äȧ+†Ù¦8Oqš0ŽAìHˆ}[¡°‘Ùâ‚• -V®¡ÓÁ|qF¼Ž|FõkÁÊf%Œ¢†@TQÙñzØqD”Ш°"ÍÉÂÍ«Uã^‰šSD¶2!T•—`2>زõ:Ív vZàhýÖ8.ÙÉú]W+äá «=¹ÿ°ç€ž‘š’‹ú_¨%Ž>³*ûdήõù5xÆ:«öÌ£ -£Ì(Ôë=AÑÅΘ ÒÁ>¨ ÒÃ^¸ Ø*{ ƒJ{aƒÊ±Ùô'8è龡0(a„‚ÏîŽ*‚Í^8¡ÒÅ^H¡ÐvÆ -E»£…J{á…Âf²†ŠKÌP¦ï‡Š®×pC!7ïŽ*=ì…ŠEÝ=_v
?Tì… -‘|wQ#k(¢`({àˆÂ’¸’(.°]±Dåý½ÐDQ\h<Qéb/DQ™È=˜¢x°ª(Ìk¸¢°gïŽ,*=܃-Š{ ‹Ž.vÆE{ ŒB'ÛcìŒ2:ÔÈqFÑÅÒ(·Ö¨éÌ»£¢‹5¼Q|¿=GÑÅsÔ軣Žâ\íŒ;*ì…< -¸;ö(˜×ú¨<ØÞªÝHad܃N·=PH¥‹}pHG;#‘Âd»†EŠ îŽF*=ìƒGŠï´")öÛ8O{ ’‚S®á’âÁȤvöÀ&…º¾;:)zØŸZý¥Ðë×0Jñ`
¥ÔìŽS -iuw¤R™ïÁ*Êù–x¥Bß±Zû˜¥èbÔRéb/ÜRØvG.•öÁ.…‘a
½n•=ðKMÅÜÁt¸˜¦¢Ÿï…bŠáá˜âÁH¦ÒÅ=X¦°Èìf -µ{‰g -úˆ¦f/ÚÓšÿ¨¦¶#—¸¦x°²©œ—{°Mñ`‰n -ú¾)Nާ濹åÔ,qNíÁîH§ÃUvÚéÐHx§ïy~¨Õ €ÍÿkÓÔ¯÷Jýúã„¥.'¢á¤Ÿ}=JO¡ÇÐ…_bè‚ïgçúæú¤k'´_,õ:D0軃Ã.¼;L0.¹=€‚í"Ú*]ì,=ìŒÝ·`0±d0äè=@ƒïßn¸ÛtðG¾ûXC|oHÓná>pá{¤5rÀð{ºš…ÔÜ3l–@ÃÖÝjx<ØlxeDKÀa{°3ä0zØtxŒpxØèKèáû_x¹ÒÙ -µõ¼;"µu±3&µ &»£RÙfg\êaiÞ™ÚF±Ä¦¶Ktê!¬íŒO=6ÇÎÕ¶9–Õc×ìŒRmçe‰SmvGªÆq^ê¶aW´jã»ãU[ÄjÐ÷À¬F{ VÛ(–¸Õx°†\=ìŒ]mf¤ÝÑ«ÑÅ~µ=ØÁz˜Ëv°6Ác‰bmòÄÎ8Öèa$k3°.±¬ñ`
ÍÚ,ñ¬íÁîˆÖHÖ0íÁΨÖfb^âZÛó@¶6ÚÛvF·6#ÐßÚèK„k{°Ä¸† ->zZà•7vFGkØàødkèàö`‰nvG·}²Ä·¾—(áö`‰>¬"…}‰n–háÆ—xá÷<(iåÝ1Ã×íŽþÞƒ¢v‰n–ØávHvFŸß?],ľ;†8ºXC·»ãˆcíÖÄǃ–8ìŽ&>XÒ®xâ¶ûvG‡cWLqÈÝQÅÑÃθâ&P-‘ÅÇØvÄ¢Ú]ÜzÞ_Üú^"ŒÛƒ%Ƹ=X¢ŒÛhvÇ·.–Hãö`‰5>F³Š6>¾Æo|Lx8n`‰Üi–¨ãö`WÜqë`‰<n2ø®Øãc7¯¢¹ìŒ?>ôƒ¹=ÀÁš¦ù%º -ù˜ÍÎ8ä6¸%ùì¬b‘ÛƒÝÑÈm¯-ñÈǃ"¹íóÝ1É‹ÝQÉM¼Yâ’»"“›¹;6ùCèä&â.ñÉǃBùLr²¼íiåÁ¥ÜìŽSn²Ö©Ü,±ÊÇ´r»½wÇ+"ı܄Žfù /PË!á–Ú~F°v¹u±D/7Io‰_nvG07IoanôQ̇p¹À1·K$s›ÎîXæèb
ÍÜìŽgn²üÑÜìŽinß~‰j¾Ü‡môdsÛÒ;b›3´@7ǃ%¾¹Ñ—çö`‰q>,PÎßcÇX5r¬a´óŸ°cÎæù‡e§%îùÑ1²î9c?dŒŸúÓ˹-ytÜkþÞbnÿÙÿéÝ׿»~õÕo¾¹¹ÒÿþòâÛËk¥üêË«w'¿¿ºùáâö×ÏÈ\ÏÆúwýdJ¦ü9O±%d4n -IPŠíMU%Ù‘ƒ }ÿãìy]¶~~væ€[€Ó÷V\ì8¨DF-¢|R6´¼!rljSã@/n¨Ò&alé[ýVøïÔ6kê€þ€Î±è÷>ûæþ•þÕ)á?Lý\þz²/¿üâüüÝ›¿ÞÜQÛÙ û»}•¾´<¤fùR(‚…R¾#¥!Ó2Eï++ä+Äêþä‡>t7E„jU*(Òì]kšÖ:?,Œ›(¬‡v{ôšÐ{JùöZß¹kHlÈ}A+BU%F»ë÷Y@DňXÕîDÏ©ÒM'æ¾âA&m%25zÍ%bA¯TV¢0}…‘i¤3œÓë~Ràr¢:•O ÉÉ“Ñ3úü<ZµS±ŽÐÏsYçS©tJaü6€2cÐÚÍ‘D^„—¼²–4{†>MZ‚2Rò,HÙINjï5Y5¡4I„bÿý&@šè@êsF7À}Ò¤>*!¤¦)äÑùçbpÊQñ©¼E„à¨G¯ET‰ÿ8Š–¢P\$€"lV0p•F¤ú%ý -n"PLX™äð w¨OB¼Qê‡ÝÃI^<{}?¿s'¿ùÏë»~õ;ääüæÍ÷7ï®_¼ýîìû‹“77¯.f¼îݳ_ýåæêŸg'¿½¹;é’ÆÝÅmg…Äܽ±yúßÿò &1“®Éþ÷É÷Ïô>žØa@à`Œ0¬"fd*gŽ‹A%ÛšOÄ?å”’i…µæ)Ì>}±OYêóHò*’5‚E…R -
ý$¼HÎW:ÕYdQ'u·èì69e”s ‚52.VÃgƒýî¬PFF;I#R|_Ü0Úz«¤§MUâØyS92+°yzªƒa5ãbMwE©Ra®©¯ùü£ÍŽ¸ã• -Zh®Ã<<†d;{©¶_È\ À<¡ó)㪰<Èm‹Ö}$€4e#•˜£ˆÅ4(RäªwP][Ðl R¤ØŒÇÐä²rÐlY.ä”
]MáMZ"Nnz«€·¾ÏŸ½ýHÛ;&HGt5$µX¡ÙeÔAIi\à€Ì -UɃ‚mi]`‚!8
®DLdÙ[®¨ Ð7>Éý"U©•É|˜·üþ,wó'æÏb_ë†;?)[ŽÁ46eÉ -a« -c&Éáâf»J™„ÇåhÆš:ä𨜓¾èòå(1lD`6ÍlqªÞý²Â8¬‘;šyU¢$NžØ—í«$¯½Á½¢zNⱄIU9AÍâ¢ä0Ì.Ð&„É$®ø*ajÓ(*š¥:Ùá)|Ö‹$Rº2u†Ft£âqß -Á²=È/Re–Jn5ÔªòÕDÓ'ȧ$Ú{ö@ðÅQe+h¾a«ªY!g+笾J6£BF'8ÑWtBß¡iùQê!XÁç°‘+ø`µ¤+‚Ÿ–^‰yi1BZe»aHZ7öHU’³[ŽHL -+Ž˜6‚“Ò麙 âš!=Z™soÐìue“¬†JtR‚îäAW‘¯t°‰¬])Ú<ú~èn´\EœÄŽ$þ•ÑÄߌȬ˜€û@C¡'û(£n‰ÏfÍ$ó¨Aû‘ú¹x -÷š¤˜¿$É™°®”ÉQ€ ˆ¨&¿+Â{):-x”2q¤8é©‘ÍáIcRÃ}¾„ÉqÀÙ˜G7±½õGcÒànÃ98U4Mb%6ìõ#ÐþclÂÕnE -4ó~ÚP‘éògÎIßÈOÇ]S†J‚©ª|Nu:üújÖçÒšÿ$(/ÂpMœÙS'>‹ÄØ7!ò¾¢žÑñ AŽý48÷N -®èE⬬¢!²§UŒRÒrR»ª‚Yw–/n/ÒÚ¸>;˜¤ÞÎYÝÔPç’4võw~©¨õÞ‰Næ>¹Ó‹‚Ú -!W5»‰¥¦ãWkþ8åhQŒM*7I…2OXE¯ªÆv¢ç6½ê„Í÷]SùºÀò¯÷9<¶ÉÕ@G -›àØø-¶ñþg?èbµ«žãŒ)=·&®ïçY„)Ò¬Dçôõ%åfBÉ hVؤ‰Ê|b“WêNÆÞÇ5Ð6‘ˆ4¯qãœøl‰±^¨ƒ€‡æúrAq†»L#àÒH¤pÊï-Dƒ6ª„e’'X9ÍÎgE«wpZÓ*Å"ýdê`œ,(0\±2x7“bÄJXˆšE¢Ú¸_ KD‚O‡¾Ê6ØùƒzBw´ÆZj[™©‰êª KÉ¡Þλ=ªð ¨vd‘ÔVKW¿È.£›AÇq~~˜´¼À_'&máL¨ÂéMm‰fo$ l1¿¬– -ñù,—ÜC“Dx{-R)g[£ªIÚQÑ´TËöñˆ„x‹>u†k“Df¢`d]ÂK´ªª€-Ó³”ØäZDôH¼¯ —±V/‹¶™úoMrüd0®‰ªR(eAy6•wÅêÔ'Ô†O=i–Æ!¿¯*CTú…:Ä\Y$劕!ÍõÜ5¤pøó¼ -̲?úXaàJ”¡#BIxÞ´|"d@eqMé ACAYéU]⾘’˜l×v"‡Ÿ~Dæ18¯PÂoà”$2Mûb´n‰Xu&ÅkI‡:6¸~²ÚRæE{hQ"‚d¡ÐR«t7¡J˜ŠìÉz9Ò -I‚$J:ÈÀ.&펾RÁ”`ìL^B)‰H‘},5Ä(¦žÂDþV1óe‰Þ—5P§~}Àú1—,Ù&PŠ”1>ˆèážgkþ} -ב¢B1#£‹Y*7±qÇ1|ÿ©Š¼¸¢½ò èðŸ°Óí² -"BH^,.4 -±S¶
7QnļÉ1ëR€†ä½”ßobmå³ÈWÔ©úw%ûËÁ[¾ -·'ûé’ìkŽîm£F,ÒvÇ -YrÌr^¤´&Ç3³r}Êá«ü¥ØŸU)"ÏÕÄ žÿÒ@” ë婵Ì'Y"”²IXˆV¤•˜d1 ý¨°á›Ì-ìÖ”¨%_ŽHê;]¼,«Ã® --çY‚Zä&")‚5°BÜIlÁÄ0[ÑÃ`-réu½¼J¯Ñ.S -㺋œÔäÇ(¥„E"·.",Gè°5)c -l¯ž²˜és¯ÙŽ8!•?‰ÖÕŠÆ“ñöêÈŽÜÅŸNþ—¼{ý¬ùœräÇ‹E‰n0Qz&ŸN4^‡=+]žQ<N -éÒŒj=UÄžD¿ˆI8Å~æ$v†®¶éÓçå˜k‘xÉ5[›(S¤ZŸˆ&"Ù<\Tìv¤‰ÆO%·„O*³OIëÃpÔi^Õƒ$R‘›D.9\oSÚ(Ecí]Èê&@©$9<©Y—¯ ùy¤f4áux]¥$E=ÆK™b²`8QyE=²ÙÈŠÎJ¸3SÕù;ɶgW - w'†¦Z]b7!?;¡ºzS -u"aµ°S…|¥¦s5ó¨Ó!ÃQŽ—X€Ë$肪 -:D?Y¬éBˆâsÏE¹¡ä -¯Ñ×:Ä„|ʦq}¢.P%/‰¬ðÅ’ÚSžÚN"î_—¨’(â´È¨¥ -‹fY1"0„’DÌ •©„I#åÙ™%#ÐLl¾|%ŠË÷µJÅl7uœÄ\5*ŸaËe -Ê
Qõ§œ/¼¶í¶É´´?EõjXI›¤¶ˆ¨;î%ŠìlÒ:RéKb¨Ó$4ÎC… -c)ñÉkh¥ +×I(ý@ˆÈmr,q>\Fx€êîIR +rm’õfª6T4ÏK>~£ÛÉf2Ì\ƒÈƒ¨ëJÇmû³a>F +¥Z"Vr‹{ã\°,ë|$mŒ¸v*Ç9GZkh9ÐÕºÀF63m«L!ù +N“?ÀMîÕ§63žÔrT¦mU2möÕÃÄ¥aíʽQtD–Œí؃) +Q¸‚’òjØ݃#ðÐ@@&Oò·ËÂLäQÌÈ»|ÊE«d!vØÍ]©þDøW7fxèûÄú›«.°ˆ.Ý,#œtBSŠœGÉ’ ÐØÄx-Úñyâg1!ªÛfÙ¥xÙwlÞ?[9˜
òPãvSÄõ +Ý€FUpY®ñòš+¹ù>¤þ˜.£Æ +ŒSÍÛP»î(§00¹ÛJXÝhøºJ×VžëøµíÕÚX2ÂyŠ^UqÎÑfA5qõêÛ(/h<· ‡ÈfK4?WÕí +¼3µËÔØÖØ-ÄWFY—6ü챚ÚfYu¬zQ¢Y?4V ìEeðPO•¢Øu[kÝ7Öª‚L8;Â!ÄÛn’â'›ŸD£å<Q!¢( ç8òÔpTaçÒË’é×X†ß+zhØmvã +Iº«0»|7 +â’‹¶]›"²CÊë§nÎM&·´mÝ&¶)” +܈ƢÊ!ÖS˜UÍõŒÊ±*`D@t/voÌç“ÈÂ0Ùâ\—¸Q`ÇßÄf%Å9‘Ýa¤íÞŽ¨$3èx…j|¤QOKv££0|YÖžU/b*ó²"ðÎª× ©C£¥±ÏÉ:æ`šÜ¼Js9 ‡´ËgGãb“…§Çœ}&ÔÙ"Ÿ´c*'Síëp2II WÈq¿'N•¯¾K ‚ +ñ.kÇQÒ¥®:o™¢BëñöCíqŸ9 X7@–:“UµÕAŽ5øh¼Ð^m,ÅBjKX¶Û–ˬaÄòEsÂ(^ž§@)¯@.”âG Ž:@Ia;pÇÄÎŽFWãr)0ƺý€ÇÊÈÝÃi¿âXQÍh¢¨•ªKæÐ
Vq@rc{±¹u˜ƒ®N@¥¶ª1,ElPó°´%‡—ZËxs-ö-܃Wîºxðã +0ä}»cÅHì0ЩÜ⨠+(êÔø¤ôvÙ\ßØ’¾ãþ ›‘Ú +jt9Î>9è(ŽZIÍn±Å•DSà^,
N÷_ÌÕì+ãð+Ý{)Kh”ÇœD9Áñ¼ŽF“þà"¦Œ`õßF¥6&fŽ%k†6ùã¨Àè@‚±€¹ŸDKvK|heC2åû˜Á:›€x^\Ý'zRɪ›ÈŒæDEÑ-DKpGÅéÏ¢/݉j>ÐJõÍDÍh®É¸°,àhnî$÷l_ÒEõ²;1”“ÿÉ%ûÉI2>â\·’(šê.údoìÍã×NÉW/Éše€Ì3ATǪºa–p·É…(»=Ý®±s/$éÂ0-’ +?¥q‹ÔòóaXm·uŒH 7`{Ǿ³’ã}=ÀîïhÂ6Ymº¦ +%¥±¯OqZ£.d^©œM¶³€²`5!cðúh‰™¯aÔ°Ò1(óÂk +ZÌP5ȹzï˜9·mkÚ|q„†’s#HMŠ!I5ü©HFâŒnÉ›¤–YÚ‘«j·øç¸o4œµö° lçU©-G%„½6óF*»ÍOõ a
ô¶Du¼+ÖÀ*Þ +>—ÎDa²4Öd<ÉZñdëéQemá?~r¥Í…;Bô^£—¨’JŽª³*à°ëˆÄçf2ÞQC‘ØÍ¢´C²z/h^‹sØsl¶ÒºC+ªöÕ¼ŠF@…….Œ†µcôÆ…Ãkœi¯áÜ_r$e
?šs±Á U"½É|úž°ô)/SôìÁe:Ý _BŸµt&1ÁtpêÌQhäu7c¬¥¡Y붣ùŽ}ÐTãÞ,¼ +Ï«qÊ%¨uÛЫMÁ8û¡æ$Øc +aóÄÒ%»è8ÆZ,r$)DÎ V5sÑ#EQ{TÓ“"ï7¥0î4O¥UÁªüx=qjš'š›|Ñ™õ™j^•þPµ–R·(O´-E·HÛ¿ƒOG3<ý|T
Ê(Çj`èø”)¥– +ôP?**ž\%ã÷'RÕ9²ÚÏS†2 +Å[® @×n‘6ÖΟY•Ñ=we±pn‹
í1êi¨É€$»r,[¶=|ŽÂe'TA·-B¯¡'³ÆÊ‚:¹¤oRbSÉípˆ5Z×À¯"ˆ]YÒçULi5®¼·ùOÉÝÝA,nw}vórÃVZ$¹Û„^4Ž
+E +Ì&;xæWÉo‚y±Åê؉ð›V) +>Œ\>”ˆ,ž@øŒŠÁ1ñ}Ä( ç¾DB™<†ßp?Í%æeUBŽ¼F]02¬ãi´.²öµIO•·¡h콡;
!uXóöˆpr[g†ƒïÒ;Áy`iòêZˆE ´¦ÌwÅ\B¦7t¯÷"Ï\ß_CV ç½t-Xy)ZÁf+ĬJaplrð² .C•‚Lá +$cÖåò0ÃϤ>ïÅôü¸/êTªµÈ*ë§ÓbCLÄ!ȇvZ’Tˆß† +šôFpGfjŠûÁÿ(Ñ&‡‹¯¡ù|¥@”¿ß…ÙT§³MÑ)ÜfþŲ¸ÔçuÇ‚S ]ë#ƒdd,“"'Æ—§Éå©ÆúÂ&Šô‹Nr™p³2žœ'_»M¦¤¦¯ˆ¸‰KÕZïdëØëj'uZ†´2®Êì´5$Ä‚’cíÈ8¬„ðŒïUàbŒá6u°DòØÿê¡ŒƒÉw7×ý©H‹«„Ƨ$Ÿ¢›Òa`U³%\û/ÃrŠã½aŸç†^ëSĺJÜ—^P¹jiæv49š6„¢vH +uR"I¼=$§q¢€’ý2dîÕíd$Æ»Á·¢nWóHãzµÄ>»L«ƒL è“Bo J}öîÒ”±Õ”³×Êà«æ¬K@Øn‹¤<z*eÏ*>UԡЇ;5¥4Á‡À†-qBÍGó*'¤+‹¡WU7À©ˆ„\Ý‚¨n“AÞá¼ºß Ž\¬BÇhL©<†TQBò‡† )°VML'ë©„¢™m{Šî>Ò÷Ò3E˜[d[ƒ¤Ÿ¬‚|5¤}+n.e<™XøY?Hô¬(e‘á3㪸F‹(Y§…ë\ê*Ê(ô‰¯3h¼GF'£yV!
™pc£?YýI&ôÔAö‚¦ˆ–ÐâzÚr¾Ï's^)Rm€H¡ŒH`ì¯Æ.h–†a*G%ý…bRŠZe.Š·Š·&hs@ˆñKqÖØw/<
±p +Á8Î +Ž4 Õd/ÑÏÖã]æÀLÒˆ•i'ô†I?iæŸrQOC´”7„¦0ùÐö²£ÏEhpbÕ¶÷VJs€p"]MãJÛHkÔ†˜5Ê)eúÁ6™)ìØ頂 +û¦•â +¿0(èzå(ûKq²{‹µ„¼ÃLxÍ-9üÊ8ÒÞ\¢¢hp$Œx‘ÝA…ȆBUaœËxÅi£XÄG¨æÈ…±Y tb¹úÞZÂì%î8š³]´*æ´›˜z˜®L4»®
gªœ Aö›"|£ã¶8F§6H5G4uA{‰h«Ö`4Ë%(Ä+O:Ù‘ +SÐý˜R‰CÍ|9hÅéþÔ³¿ÏüT4Ú᮹†0Y“W¤lgØEŽQCÒ3yüØ–“,$k’Ë ¥¿A3¶´ä|ä,"b+bº£fuü–k]µ(¨œ51Še&£·êNÍê:ÌŠ?䪖_‡‡v4?kn{èsúZÈfæÒâ‰@Î‒âå0áRí5daX,!,ø_‹}ÐÌa ’ÜìͱÁ]ëÇB기YԩÓª}£Õµ¨U +½£yš"៦½»¨Ê”šglÎz”Àô9›§~pòÌ£„/ï½Æ•‘‡ÍÓð‘ïÍÉ]óEŒ‘ééòÈ@XŠ´Omð"\F~\‡åLs®5Xvs]ýI24ŽW¼6‡¢io»Ñ|œ+#ôê”ZNÙ…—aE¥¬ËJdÏ'v©.¥ŸÌ*,æ8B§ rƒ¨
`O}2‘d›Fç×QôÄŠÕ˜8A"'iÅC¨Úšl4¿C”¢™$È4RŸ]Y93M¸—ºpØi¢wÇscxÂs`€YÊ;mñí–¸£`¨Œ‰Li÷O° ~ý°Ù +¼Ï€·(w¶4$¸r“êÖ'R#OáŠi—œ¨¥¨Hø"%/‹;&øUv¸:¨ƒqg„BŽ¥®S°B0œß"
Èü“‚á‘Ç©Cå.g?Œ5^DŠ¯„DÏÍâ4Rà°MD¦Žl~õKXJQW×Yf¹9ØÈÒ8&ð>ÒÒ«ÅdÅ
N"]&AÅ÷{œ@5qFo±mH—OëØÐÓ**oä[ó^bùÞx0 ·!üRĉE˘Yw¦heu#s¼šÚ& ›‹ +>Ââ”!«&g€ùRR¥›Í®¹–¶öhv¦{Î!Të¶G{N)me]š\ö®ñTÓ…jGÝhܶ¨S"S2†Ú]¢Ð},$ðÔKÜxkð/,Fûôƒ˜†Qˆè€à"¶\1”‹¬¼™µÝ¨ëbô¨{ïÙ7$;!*›…Ë)CØ»QÍÞôAG¦m¥$ÖMúÔÍ¥´„\èd×ÍiŠO¯9Z[ÐftÇŠG³ýmœµæ>Gö6:ÓË'ÊÒ +¨‚6 +hÄ“‹§Õ\
Ç@s[Ý]Ùhnk<·T4›„R†Ú©ð÷fʲQ™qŸæx3Ë<bÞŒJG”x¤¥•(nkH)ªQz{VVd÷6N%…úp'b•ŒŸ8q®xí‘+(f1#Á +Xzà9:y³³ƒz=i}@{²'o;¯¦3.s±šÛrà¿M=Û울' +˜]$e‘®œŠówIÎ,Fì
¾Íó)º‡šá( Òš³ë™‚;¥¤’¡3 $ÉÎgf[ë(â
šM›lòS‘ö"'>¬eöJb|¶¥æX]³f4K i~¥9Xh6ëÈÐý$«B>dsBn_°—UtÎÂ×AŠÞ¤äíñUÉ*Cª:OSœFpu%J +CóÀžXú!µðûÿôþÇÏ®¿¼8ùøæöÓ«ÏÎn¿>ùäæõ«¯OþåúúŤKÜ^Ư?{ïïRÛÇvŒihIõçéø?YI›y²íâŸMÛÉ4=ÙÖüO·íÐÞû» D
?Kéa‡]ýœƒù-‡pñì·Ïº÷8³é¬Oé¬é¬é¬é¬é¬é¬é¬ÿ6è¬ù^Þ,¢«ë«“>µ‡-Ÿþ›*i}~ñìäç/®ÿãâ掜ÖÃ}ùæÔ߸ZXæ©ÒO¤¿/Ýl]m*IN
ñ2b…áÿeT™Ð4Q‹‹Xë9; +ãª& +Ä\tàSƒ£ë€84ƒº¢Ø
tœ)@Yö ï*4‡J¦´•©-G#…KçÍŒ#e©È§—(ÈÂñˆ=›[ÄڧŵèA4ÅRB¿É¤NYÕIãâ~;w|V„…Ç +¯Â34ÀÏW•J&Þ/¶[ZÿUñŸÚÂÌU¿¬&#†d0ëÜ9‰¥Âô +qºÿ£tÁz€³Q$²…*”À°È†@M²NÀ©£¤~¦HnözÿÖæWµÝU¨ÂÒòw•Û
^‹[!^ì¦Ëž¼÷óm›ž*©Å„#ž“jÂÜ8¸5ùÞñœ}UÍÝl,F·Ûä”'Ö½„ã³"åçŽÀÏ$ËAg;2K3±JÍ–ÛJ¢/–EÖ¶ÙX•=9*âWƒe~!F®òðÅÀ6ÐÀªÄ§‹³€6Bd‘¬ŸT¦Ôr±ndlI–0iŸvýÔ“‡gìé‘ëþÚ_ëI!øŒ{éTKÏX+mº¤ï¶×6ûèɼµ$.É°ÓæcÙúÍ &—å©JþÈ ’CCX«Ãì¸|Gd¨W&:`ý’2IåÀü’Û&%3 °ÀOAŽv
1ÌÉ”^|2ÕEÑÏ™˜õÁ&óŸ«ÀX +#—¾çÈïÌØñ´žRœÒµÊ š +ÁDc$NyÎ:W9û½xk©š½óm#É%ЙŒÃŠômÍ!c—‹-R¬°ÐØÄ©¾!<;
§€NÌå"gƱXÌ]²jÌ‚(d7#ME ¶Ÿ;QU
1w-„ËÈnh/Îó¨Î\|‘´þt‰9ì* E?È +BòlŒ6ŒŠmºz剋• –;ÍÍ]Ô÷çFƒL5„ÄÐìö8áPèKfv%ocÖ{Æ :Ûe]£ˆøˆéÚâ³.b¢>'Ø'Sç6%¨I8BÕʃµìa-ÁYþÀ#øÙvÚ˜E4{Úá˪,‡¨1Ñ®¬šÆav+ÌìIW8U`[˜äM¥Â(ïLâH¹?‚Ø®)N¢ìJ–K_‹Êâ^
Ó†NDcÁ +XÖâF¯³<É`:7¾)ém §* +PšwJåý€œ'2º ‰áÇXÒ*A†Ô‡*k`Þq?ÕñÚc¤“€±©Vd€8.¶²Å„i-¨8‹'Z©´ +à —ë¼M¤ëµè{êz‡9Ïcr`•zh.¨Ðä$8²aM–¦ÉžzàÊÚW/jbkÎ[²Ù×19 +Q ¨3ŽéSÑ*Y½of爆É5hâÉpðõÕ—;0íÈ®qŒº“Ÿ£~e—÷°²÷¹ßA¤7vê"¤ÚRðæÍ;é‹Ó¸Ð¦Io÷u¼_^k$õA¤‘ïwaY•ÓÍrêXdªìÇm³¶¸·šÝ£`sÃ2fÊQ¬2+q§AäAÞ”E};Îr +‡D²/-Åyl1à tW#@wÙ„ë“«L3%O‚· +F^‡ÙO#JP£¤›ö`4‹Ì +€AÐXr˦û,£šˆ˜ì³¬í9Q'Úqvç5¬aïËl”·¦}\IîAuBeR°Ò›œÉtºÜA‹ùÀzx T®:…xW„„ë®uJïÈë£óN¶r0*t;Ï"½ +ü#Q:öcàƒúñ©í4;
´–|Ôp¡Õ +wÏS7;Þ‡Ê/˜ÜÑìX×”t;F³áµt
UŽÀ.ätç]=
—µEäÆFôwµÛ‹ùÖð +XL½ +‘Á@ï˜ëÍ]Úñ—4ÉX)›å{j5y-û>ßöãZëØÎ,RÄå'å‘ÊJ¾%¢·ºÃ+^uÑDÜVH¥Bp®±®¢°Û´£‹ÞêÖ80t¥'Ü2•Hæ^ÆñL:bþ/ +a#&]HЧ +Øêvªª@ B +#Gšg2ûÉöû6SÕ(r× +vœa +Šç·³\â +D5Ütœ²’ò»BÖ€/ˆt•¥ªÃÿÒûcÁâ +nûJõ¿%ò„~xH
Úï@UîT›;ÍeT`"¾uš‚ ŒüÈ%èf`“ÔF•Š8@#¡§<iE‰¬i±ôþèƒæ(ùh¬%²aÛí"#¤"q/Ø7!)V1¬ðQÒ›§t
T4ûp¢eÛí9‰emM€<xNRuB#á1Q…%¶ +î'¦V0ÀqP«n1m~T}yݹ[mÏ5¬qäÝ©"=$€¨iÝXŸx:æ9è£X=I¤*ç0²\*‹ü‡Gpá™]ÄìѪF¹Åþ:îžÍ°ÀÓÉç¸e6ÛuF>;«àß&R ¦õ0ç¿nŽz + +T:ˆÍ%V“vmœ²~êšöR
g£@…|í¬kbSä‰&—~pýèòñÙ[–Ëjj<{‹«#VI!‰¹?f]Æ1521LØ´O“²9^º$PÄÒR\æ›÷i“k2 +zÅéC…_¸Ìfz ûµûòA¹\*˜Äp#DLGU…x®qÑ€Ž»Çû²™ŽT/…Ñhü‹÷²ÄÝ?}ë…ræ÷Á4#@õÞ:Ë|š•=ccø§½÷~Ø·¹ª$>‹3]7ÁA¯{£ßß[£sïsåúñï»1–YŒõè³û³¶aÍ?ÿ9áí8 TbŽ—ǸÂå½æÔk„$…½Lº5öEçƒ#Ç+¡£ÏÎf˜8êõ°‘#ˆ'Û›ÍzÐi˜Éƒ´àöè³ûcíÞ™˜šjA;NÙÒG$9Z'%v´×¨ýÉF+ê1¬J¯l4Æ哲¬ÝƒÏn^8>ŽzÝ5€øþÞwÇÞçàÚ:üýyW,>ëÁgŸ5:½ûü1/-.Õb9™Ëˆ"û¼HÊÇEI34PyŠ¸Ï›¸’&’MŽïO1/¢‘ãçC„i…Æ$æE•[<¯\¨†Ÿe¨Òƒê4Áá—aÌ#.˶ärŒLÉÔü[ó°×ïÌ +OÎ7ÓÝGÿ¡Î(™îžÀá@8èe„ú—æc:.C:éºvëˆÁñ¦ð7GðÄs|?¢ó8\ÚÎ~ +~j¥Õ…¸ÎA:dÊfžÐµ|˜C +‚:µ:Ë2âBžCÄ/N™-J¾ÆhÌ8Ÿ.KPU"3•Ön®ÌsІÅ>SL'ÀÏB}¼Üüj˜ìx™2ˆß¶øÊ:Ýoy ã…1"³b¦Ý°Æ•9·1bƒ9_ÌÍ:®tI
¦YâWhBˆÆÌÀÎàýKmÖÍJÁ@UÖ°‘›G¬S6ØË9¨1ç>ëÖA +÷¸å}ËÌãj›ŠŠ0êTWÞóؘâ¨"÷Sª”ýAÃ×Ä +¤UWKËSpKu‚Ó•é'üÔvâr´:ŸÅ# –Ï)ƒ0{b›îb¤ºœ@ŠÛUìfµîù¢¾¹8Pž;¯:ìõ^Þ,?³¬õ{™^¿º¸½½¸WaJ“ ž´‚–¶Ô0ç°Ô#›½Í …¥sÅPa:O(±‡Éô榽Fq1ÈàÒæ#ݤH¸ˆÚj¾O+ZøjÒd–u·jKD»r rªº¬<Hyªý ]ÑM@Q¯û°iâiq€µQ¿ª¢$R:VE +Xš‡µ2Ò$g¹³ø‘žòÞYð(⫈”±yƒS²î™wL!Ù¡ó¸ðÀäÄîD*Q@GÍ]ƒFXŒ@¾=¶@SlHçQ&„¸«¶§Ä)“ ª£5à—8j¤av(æ¥!;ÜÆýŽ·ÀJR©9èÖ¾&Ö’ù>íÞÉë^NR½Ï9Vç— O? +Î@a¢ˆ×ú~'ˆÇ2êbc £&wói½à¢Oÿ†¹©Î‹™™/mnÏÞ4}ÈÈ5j¤Nâ=x]£"D'} +ðWóº¨{ÖÚ^q ›wب›*V¸Òe€*æ@^28žy̦.ðâ’ZU%P^(Kiä +[5Lâ©Lþ=&ŠtΫnL+SæãÝ€‘GÑ|‘NOóÕ“9ƒï¼®C>²'ÕO.“˜C«T†ã¥Â~éc*Ðö³êO 4ó¶®ôÛª`•ŠŽÔ9 +s]žð±„¶/Q(’Ôvªrb—"Õ¤ÂI%(%E â©HÉ×d=ª ¾œ–ÄO0©BB +‘Mm +„Zˆ@¾é?e9·79†–½—^ìÝ;QRQ„óP]l¿ æÄKkȪ²¡…î‰Á@0ý–¼ë´p$^Ò”¦‰»ÔÅ™"Fl¢F¼zj¦Æ +”8Œº4IOÆG[«ysâvOŽ\Åér±Žû,‘jL]D=¼"½«%ï6ë%×}uˆ%œ,é«øÂ/Ó*ñ>dÙ–ÉÍÖ8m¸?=i!úQ&¼bd`Õ©Ö0œÄp«§ÈÒŸ&¸]àóý•ÝY%$§SYÓ¢\Ú¥¯ë±ŒÚ ý +9Áuê\èÀôPÈžZŒ!TdP&Sy·aAµƒKs¸@£¯p¨}Ø#œä9±jÄF©Z]Cƒ…³q… <ÉL(ˆ»O˜êÚY]!’IÆ!`²f”Ä/nS2®z¤Q•-¾%*冫žÄó¬Ç(ƒ?ÍÆþ”£ãëºö#XeµRb}Õ‰^ÜœTâÃÝ +«Hü³X'u‰o—<O˾›"T¬ÞuaŸœH^ÒïÙF,•J—º0Çå%SXr¬sê‚À˜œØ¼;—X·eðµU¦HTÇš©YjöÞö£–õšaÙ +,š*O¥ÐÐ:ñ.òc-µËªçk(Š§+_̛ͯ(˜q `¶„
¹6Où^––]¶ëNäeå g^uQû»vÝO¸ ”raQ—šJb—}+Ö~pŽª +‘̃\«Ú ^AVï;â¸äàÚÈCM~KŠQGҧ̈́g'R—⻋šìjTŠfœ¬ùEu”eW=,ºGeœôSIùIœJ—NCk±?qÎÃ|¿Œ¯&¸Ý,±Ù[ˆÊuÕ²N(,½öˆQo úTËËP2m!QAz°¤(¢h ’CöÀ0žQ•€+pyH^¯¹RJ“–& Ãix³$Ú".kŸÍáha*N¤ôHss¿ôl¸ž'7$zíRÊc¯QZ‚JwU·UáÕx¶Œ,a³
÷:']s´FE5ïÃ0-$Ý Ë‚âjñ6ÇlöÌ<Ø¥7—íÇílšíiÁ‘”X=ÄÊë +’ÂU!‰m+Gƒç9!¨ž«Âfòá̼̌jèç$Aq¹9RûwLMwFÅ>Ò&"žhÔQgnŒÙ§5Y× ÙHÈÏ–l¼R@ài‰N'‡e…“¼ãþ¸š¨øî\r”eå‹ïav”Š1¤#¡:ËX.âU;¯XoÁTòkËb
—÷í:ÁÈ%H´É$Œà¾§þ Åo‰ž!ˆÉ[µ{ã_úWë”Ì +KŸ’ÒÅ÷}
?2#^ÀÿLNM€":9A5‡Ž+¨bʺÚ'‰d!ÖªrOõ‚ÏA1C#)*ºÜí³„‘š7ó,ò‰d‰ÞË>:&ßkÚË]¹1)³&H™ÃÙG“B×D; +Œ;öÄt°C/ãìYÂoœ¾[C}ÌËNf¡-~gùŒ{²°æ«ù^GD‡XjQ‚ÂœË .'kH$-i_`K“Ž°²•¹‹‰G–,x×Æ:Úp0e(Mì»áH¹ù
ŒÀee€°IwkC´ež”Œ8J*<*—]ƒŽIB%Ë4°©uÐf€ôd +³ +AW³Ì˜}á%§c§”¸éüaÇ¥)Ý)¶+Q$È$’—`Þ¹‰‡OÄEŸvó(Rø0qÁ™ÇL
×Ådš×ì+R<y)JÝVóÍõƒšeýAÄæ +õæ´VX×ÔGfg—(¢¥íË"åî® +JÔ‘˜_I¶ˆ¿Ã«¹élÉ0‡¢o#!Á}\Š¡ßÖu›pŽË5ÚJæ—¨Ò‚ùÂÊ +lò‚çuv„E7uB'7"öPb·8ô“@Ç\ªs£VIxRJRéIG} +1šŠ–Èü§ç Ýe ` +@ +LhB²B‘w"wˆ +K8;=—æ<€&
¥LÚì +ì“y¬_ç˜ ÈO¼>7z©ûa0EÊdIRÀÔ1•Bòs±NŠžXaÜœÍÒ¾{èrn”\¿—·_ª +Û£>Û*ÍpÔ
‹]°?DÛ*†^þ;E*àd©@¿&̓QCKñâCj¿ýcÊö”ªÑ³U FpÓç Àºg’·Ã\YëXu¼&ȺîödBÞŽGØ80Ì€o”Öáv.DqvÀà§ó4‚úH”ßQ:¹Æ"¢9h +ºÆÆUìaÎíÏÓàð\ÌÇÄn¹&OuY‘>¿"wLCr_‘Ol¬„>W¯^ÕrÿºÖ€lL…ÕÖ‘-4?È.§DÒ¼H@å<¢FbPÕºSœpJJ€ÅÉÊ#sš·_ØK=ÖÿÇË +TÈqI$¹P¬@ŠI+XN‹ƒ½fi䩆Èù¬³¦ùÏs
ùéP0”¾+õ³nÒ‚>•:¨„—½²FëjH-uøt3HŒWõj
Á)´`’ЯqŒO&$ÄõAþTÝ.NœÉ0—3Bk5¢ò]ÉÅ´H:ŠÛ£ÒV¸šN“/Ñ3ª/ñÈý8öøŠzÀš®v¨>gõÈšm.Q²Ug(ý16ã[ŒbæŒê +W ÕqÕ3¯î‚?K`*¬JRƒS!ÀGíRÒŠ-{fõÒ1Êp
›”¸Dy!iÐÊ|FS +Ý#¹>töŒ·#ÍGVùRLýPÖ2è>fù[[.Àók%ž"ŽðˆƒàÓÌÆ_úξ#8Üw'¡‡ …kÉX”ÙQJ˜G‰ ‹j·fª8ø°¬ÜU+JÚeÎbÿ$úb +þ39‚
N7·®„¢Wå +vÁFpøÉRŸ¥Øx±—næýÈôjÐ#yÖ¥¶XFì"";‰ð^ù¡Ò«)Š<„Ƨ©¥›Ýû§½I3àÊr,´ð)IУÓLŠC‡²™d›"ƒê Ë;AÒÓØçæû dЛ9ŠÓ*^£èjqÁq¢]ÈijyÄyéòúÐÛ¨”òÑÆ"~(Ú%ÖÇ0ÌÒÖˆÓ0±¡ÏIßäÉâ!ǘ‡Ý3¬•WÂ3…µ™£’I¡ãöA‰”"õX¢¿ÓkZèE-™>GP`ñYK@0+Úm5Á³-† \3ÿd*®n+?ƒ‚V¸J\„Js+ê‡4Å!yÇÝC E¢¯#ð"#òD’1[B3-QÞ‰o?'Û(\꿵qc%jÐ2[¼P.»†ù&}^çÔæ¡j]„i„j´¢8Ò6ÏßÜŒP§ÍæìŶ•ÒHûÍŠ•Cà<Þ«d]ÊУFz]ãZCÍ
·ló£†z'«x×å‹xÒ0t¥„[ BcAKÈäl—Å Ëœ±4îsD³+› àœ½ÄqV·¹²ÛúnXeUŸF%‹«5(å•u·‹Ž£ Âà! ñ¹xbɹ ËÜ:¢Âg£R¶…rJêá’Řòa…Q ÂHÀDš8‚K +kgÕ¥“Hz.aùW–ÂWcö‡Æƒfá_HW¬Ì®óÕ:O*BÃPF–‡ÑÚ@2_&[z†Í=3ß'@’vEgžQH?¬¡ÚÌ$°š&Þ[¯xw{Úà"g³ +fÕ:©r~ÉÉäBMìåo)°àt ¶f—,\qP®%˜³35yy¯=œžmQi}hK¢‘¤x´ê £"y…°£’üôÛèdeä²²ŠQÕ,0s‰´Àëi¸ÆïžG˜â6.K>ë÷lµQ OâMã”I‡vq)oÏ)ŽÚ™+£ÛaÎô,öàN¾ižï[ºpA7cÅ'%Ž™$ÿm< †æz¬ehƤÏ"Ü×ÃlÜ£x:šÊbª/B<Ž4¬%òN8W
f]ËÁB˜!äÈn)Ž#K&iᯕUÊòÚƒ +ÜBîqxpŬfø“F0LU„÷Ö“ˆ÷‡WØâä +´ÁZœ»g„Gð/Ò#2åí iϺÐÁÕÎÀ*™c0ÍÚó€.]Ìž>{æží±…†ÇV©¶PÆj‹âÙÔ@Ó±x_Ù’¦tf<ÔØ9òT²—A@÷»ØžD‘¯¡DEÁ²>`ãEÎÁR‡Ç—o˜´/ŠcÂ9Ÿ¸¨¡Á˜…ÇБl0ˆ²‘¸3*Vj!ùÙ: +Ûä +P»/Tô€Sœ%ôx44òÚ7½Ð ¯k„Tí©=hÁÉ Sb0vÝK¡‡Å¬z(´xg‘Žø(^ø2dÈ»1è¤så¢/Fºk¤* +±HÀð›0wF9)C~$ ¸Ê{F½h¤Z×Q=°¸Hÿj}Š°®Ü +Ä9Þܲ‡zvlÊÔCï›ÚÅ3g$)Í9DñÃÅÓqpêÚïZèÄ¡¨fîÁóo'¶Î;£±·4NãöÅ\ÆR+¦<!HÁ%R{4¿té;æx õªíèK?ñD÷ovYMH:™HOa¢‹†º`±ëw¢ +è)a°†C]Cƒ +ù}E|S#˺©XŸ5Ž±Îfõ¥lzÐöÕZ« ¤©’,‹ÊÄc,&•t* Té…Ä–¯cI4cØ$ŒR{ŸUÖöø-³~¬Î2D5-%Ê5j“P®%Ã7·7hqƒïgro†\wÙ,0wÛ†ÞéèVË<çæ!lÜu +±hjÞ,=.y”¾‚±Ä[Ž'‚±ÕE›AT²ø-y§pPllÌr/»Mº?±Ná1cr-±êÒƒv %&©Ì.šF 5•úâæ\°Ô +‘]œdלgîxFÒ–½ˆz1^ìhd\ňsZÂÜVŸ1\䜗thjÅaÄÒÌ" Ý͵Ðk˜º,8SY(|!KÞƒ¸©ƒ%ÁÏ"aïÖý]Vè8V<QD¥Ç1eá´löfaS«ÈŸzÒŪÆÕ¯eÚëWÅ”}NZq`”¡ÑAÙ$„퀕"Ž³“‘á9œØ¤æý +:ÉF +ј$š1H·(õ«ãÜ̧ˆ±—d.€YzïDk¹fr»¼4°Ž;*qdÌñuݵ›ÈZÜ9”Æ°DF¡Õm²&b•dœBûÄfZ™¡Qƒ²º=mäHB¶×²ÐÄÝÈtªÑTZí&´@tF9ƒuÅ2 +4¶¾Ãÿ`X +å”÷¼Ï¸-ðÚÎìXåÆ“ám&Ôæ0€žVÞJH+m–›ʚ
4Àµ¸Ó/ýÔ¢¯à8Šx·F-JŠ—V@ó†žMÙ¥–mC3AÆ”«,59Ôøœ‚%ULÔ:9ðØPžÀõ!õà +옶`«g4Ÿ¥ô¶¥X–±LfYr™©Ô<Ê:ùÔxË%HdÔåÚ;($žTƒYƒ.qÎÌ }Ç©Ë÷¤!±ÊDŽI²B¹Šä 6ƒÄ:Q¶É>n-½!Z§²ÝØY/K[û¹á¨rH×x>pPסˆµØ–"ªVþ,³•Ë) +oã½wëÔÎ5öû\·ñðX3-”µµRÀ±»-šIòÆ«å{OȪ¿l/î‹Û?¼¸xõÞGÿ|uýWü—Í°yÿã+D.>úå6ú“¿ï£7£ç›‹øëGO®/_bßþüù‹mîðùmñ=¿:ÑÔúGý‘?ò÷}é‹Û³óßß/½Á/}röêùùáÏÜ\ÿþâO~¥ðŸ_|zãÏnzÛD\ß~~qŽEðÔÇ<'ß*«¸£GºŠ¶)?úéÅïNþá体÷úAœèNø³'ÿðÞÉGŸÝÜ>ð0Ÿ¼¸¸zö§ÿOŽœßÿÞßG¼ÿ[ü'ÆþäúêÙëç·ß2îÃ/þ¯/ô-& +_ßçéÓ÷Àé•fï››>Qž2Èór¨¾Yá€èæ”;2Õã.øõÙ·«oÞ_&ùx™Œ±`ηGød;ŸNÞÿÕ«‹Ÿ}sqõé³gƒkçO<†ÎíúÓ“ŸýîwÛù÷²?ƒÿþO/^¼~u{sv{}óáÙË—Ûa¦CsûÜ…µ÷úøè_žß¾øÎÏoüçíÍëg'ÿãä“‹o.^D~úüÕËgпâû6®Ï/¶ëãý}é§/o¿þàáåµ+¸®ERª®šé·ZB¯¾>{vñäúÅõ
~¾ôØ—z'/_¡½NcÄ7ß\¿øæâ㫯ôº¶#òŸ®n·Ž^ßüîì|?³ögô_>¾üòùviâoíîß~Ëö°·úÓo.n^9LžÝxõúòé󯾾}u´ÜŸ_}óüÕóm¼ÿxqÍOOãðþ×¾rô
>ó/Î^F?ì<žë?Ÿ¿úÅõ³‹Ã?m¿»]ˆñ…|wðÿøâúÕ+S?ྞœ½ääÅñgïô}Áuv¿¼¹xuq³Ý/¯ÇóêW/Ïn[óQ“ïÓßýîÕÅG²8¥{M9ßë2×ûMåþßo*÷¿˜øÔ_ßþæ~çéþ×î7¥~/ß{ÂRîþÞ¯ï?_ºû™ÿïƒïÚé§ÈNÇ7^`iýôù
¿†ôêÝ?üúh\lÝÞúÅÕ«ç·8úmþé³ëWœ”Ó|·9~ Þýß<Ø˯uŽêßï¿ýZV«Ï ¯ÖÑÌݳjÛžý§«£¿¼<»9»|µÏÒ?]=¿}~öâù/ž
ç|;NoÎ>Û6òËŠ‡;üÆy°Ï°Ðoÿù‚óñëŸ< o}òÛOÿ¿ÛÁõïУ~OÉ®¥J¥ +òsyÜ\šþ(OLøRÄ +‡yÙVq;^Äù;|¸±9?»¹~y}×ñâp¦?~öï›azi)ìƒ_½|õ|³·Å}Øúd[…Û"9q}þûÿxþêMÄ7w´þ’>ÓŸëÿ™ÞÎç¸ëÇÝù¸›§TÈ•Ñû¼‚ñ&—šÈt§bm')eÂAümÇ\~<áO¸wî„›O¸õ WÚÊð×\'òå4ƒmûø„[¨'‘ê·äé[O¸í“ýñ{<äÞ¹Cî Xx<äþF¹²lîìã9÷v)¾?ïüR{?žSò±ºóGC(?ð"û[„!üÛbÿßúå„œSz'¼åÇ#ò¿ß*û[<"aÆMu…층38å j·H^p&„@2¤QÊ딑ZHÇ¢’Ç¢’G Ö#Pë¨õÔzjý®Ê;ó~tUþû²¿UWe^ÖNÁ“<ÍAó´L™Õ%ešÐlø81U$¾É£oòè›<ú&¾É£oòè›<ú&?¨oò˜i~ôM}“GßäÑ7y¬p'|“Ç +÷GçäÑ9ytN“¯sòÓ³W__àA`7¿Êß0¼ñ¿Àoú +´X7è¸Ïcä[¿å ãžÐñrÜqáëßVm³eÞ¦æˆÎg×Ï—Þ÷üÞñÖÅo~²MŶW瓃)Y[ÊåxÀzO3nûÖ-‡[zÍkžsónñ<”¥
w‰í³X–âh~7ÛÌýNÃ6“d.¶mÉîÖeiÇÌÌ9æ·ìkSë~׃~çVkÓÚoëvÝܽl(Ã.,¤KrÇs{¨ãÇ"çlîXE\¹uó;¼ÆÙ©»Z°¶ñ›Ÿä”¶ÎÖ8¶óŸçMmrqÖeæ³—)M8ia«b±r¸›?z\¶wWß:¬%ž{jE,Q©´lרå£u$<÷ÁYð“yòcÏýp>·»€ßIÛâéxmÚ¶«ß“9aaª't‹?MjqÇ26X;Ü`ÛÎá•û²&«›hïã÷¿”ÛÊâãéê~± +æ´ô±ú·Ë€{ÎX…x7Ëä‡÷ºhr}0ÞE'Q×9v°úy|烧ßÎÔE®Ô²¹â|éeª~þÜx“ï§`œ³ýðhkœà‡×mŽ–®iˆƒ%oÁ›fŠ‰ÌAkVošÚÆ4Tœ„9Ç¡U*n1>ífe4=?L¬¡Ï&H=|MÛnNöçv/|ºµ/}ÁXJjK=ÒåÇj,Üv¸^S¼ÿr¸®JZ>e.‰ÚÒ´.Gìçöäua°ãÍ$Ú΄#>ìy3½,ÙNÄÎû¥çºêäžÖL;ÊÝlÿ†]ÓÖð+÷3è7ØûU¾-†Î“i›Íà´:_Û–ùqÔø‰ÚîÞ=OX
¥Æµ0M‰~ëF³<ñ—ÚvS¦VcG,ÞcPúÅÞðò&ì²VÆ,gߺ›13sÈ55ZVÛ%Y¦£[fŠó¬ÞºœåŠ1ÕƒuQËvuðÃ˪iÞÍæÍ°¡A6ìË÷yÕ|{cÉ5쌃ÎcoL‹&”çõv¢Åó¬>îÈ»yOö¡kêKci‡ó¼7+G=ÕíšÐ±¶Ü†½&žÌû+—à±þ“Šý¼Í²
†:ÅêÈeR×ë:)EÙVÉVm<§¼Ž“2ÂvéðÞŽŒ_àt·IÖâÖܶ[æžË¬Ž–¼j5³Û«áÀgI‡rÃú˜±îzZØõ'_™òôùÕÅÙÍfó˜’ÿ4.åÏ»¯cÀ g/Þ¼ÛûŸÿö!–ï9ÄòfCü®nïݾÿξ¹x…ãíÅÍÕGè¿ÿzÐÛ¿¼¼û
vòÙõ‹ßŸüôúö{utÿ[º^ߧC~ÂJºm¼×¯_"ºöÙW8зƒŽsÙì®”y[‚Ó‘ç<,üy\ćP [l.G†ø[$m‰kýžço‹ÙÅòÇËf>ôÞ.ÎŽyÀQPÂã‹nßNÉŽO<ïú$e]äʧ²Ùz4ŶWw,b=Åõ°Ä°3¢âðJñá<L›Ï £iÙ,2yæ›mzäIû'.ù<.zÅz8² K«ZUs+ + À9íá;ˆÊõÀtÆóç|`3¾¿m¼?¼:?CˆN‹ùä«÷ÞÇÅ1¼6ô<©uÓ†URÔ¸Œ;†cPã¼[ðÉÕ8
MÿÞfküFÛúý7ê0É~£{úà7Æ·öýë²i?ûdÄ×"Œ¶Ö#nïýò¥bsüKDçž>u{‹<€Œ¸{·*é8–~”P¿ûcïßþ{`”9éO_üáòËëèæÿB$íõÅÉ'Ïožm¿úäÅõküÿÏ·ý|æÅÍþÀø·m¼z…\¿Â´|à~·‘öúí£óLýôúü51~zv{†’¸øwVÃ…š·Ù€í§¶•çbØ“¹øÏÛ“Ÿ={~{öåó®¡Ü>ÜBuý~qqûúåÉÓ³«¯^Ÿ}uqòÙõË×/ý… õzñø“³«oÎ^}ñüúÔftngn|j=9»¹ýòúìæÙÉ9ùrò%Bcêð[?¦¿—ƒ¿ßÞœ]½zyvsquþ‡“¯nž?;y5~2í½ž¼<{yq³ýñòõ‹ƒrÀÍkGBáÛF•OnT…ùŸüŠAG~vÛR´}ôÓ×·/_ßž|~öj»â¬sòùÅ«ë¯÷‘ä~ô_\¼úú;¾‘ŽÞê³xQÏ·OÝ^œ°æÜ`©oýðﯮϽ
î+]²øèûÿú‹‹gÏ__üà¿Ý˜yhuüünñ«mžU‡z‚‚:½»$c‘m³ws0il{öòù‡wF}öâù«±8\–ùòúöΧ. fg£ÔáåÙ3¿ÁÀ O>~}{=&öâ
ßí¾6¿sóŸ<X0ýúO¹M®jYÿïx=ŬÿyùâjûÀ)þÏÕ˜Õ‡ÿþÍÙîêþùö/ã¥||³]I:2ŽFpyq{öl;YÞ~ +?ï°
˜œsŽÆäœsN‹œÎœ™ß³’mpÀ6fÁ©;÷ +°Ü-µZ¤Vó¬Çñ,CRG¿ÛdMÖßø˜£ø_rÁ²àß¼X$‰=öËâ¯ÿcð²]OÿŸPÄ@ª‡Ûy:ÁC†ÿÊ1±»¼¢®{zÑO§×i²¹4 ¿¯—U=å—C2Ú=ÖÙpþË7’¿_Äærÿgço¾áüEæä¼’Ça5y<^׿lDÝŠ¸£š®À6ÌÍ×ây½$ʵŠðáäþKFö<€‰¦ŠéÿrEû=mó¥Î3¢„l§3îKž×³aŠWòN³—m!ï°šÞ&·‡Éx[™oÛcD«,°Òt»>þ™ ùß?çù¼@uÜMÇoXoœ‰Hñ? +‡ó€i¼ŸRóî`g¨Èd¢òmƒ¡r体bݹ_+øçðŸùùôNDŠóÂáv…鈮óÿ^Ù¬¹‰¦Kð"¸9èí¥¹ZOW¥óa±ÞΩ»Ü`5-a8LZ_׬.o[Øôø5™ïݼ±õ{àj² Vo“ËüŠÀà+0PÉìðóлÉ|ÆÚ“8`Èê|›_±Ã4w˜Ž·ÐпÏùVï£-¼ðœÆ˜-™k0¦±R²Äê4YL†$ÆoÛí=ÀÙ ïÏOï°ÌŒÓÛœpwÿ"¦Îd 'ýBiýßù,-ò6U ˆ5Ï[3½æÍ?‡‰é—<ƒnpÌJnS‚ÅÇÛíýšÛy›O[‰otžÃ»Iç°Ëgqì—Íú8ëw#“\ú© 9cÌþÇîÜyÎ&éýâð‡fVL´K”ªà>=¬Üþg¼Ÿ‘»)OQ}æ¼ÃWŠIÁ +ûSmô,¹ÀË”vä;dDÛÜ å\Œ)çØ¡¢Ôú®=ÄU°M•%žšÅ¡DŽS¹Â”ÈÛ¬ýAdÓ€A=ÛŸhú‰xì9!šH˜çÓKïœxE"½Én‹’›ÕDÚD«OˆM +ÿS'¯¾ &O·é?2ž*Ï€4 +9¤³~HüÞ?gÀ0ÕÙøy³¾·•ûàì‡àIºB÷ÖMpK¬\
{콂ɚŒµ;•heVÅf…öGcZžz,´ &T‡–.ë¹F±ofˆœÚ냕h¨EÀg.cø3ÕæÝ–7<€§‹.WvÚˆ¯ƒ)Ÿ>‘ÏY#§ðÔOäð‚Ë®¼MÿùǼÉd}èzvSÚg|Ѫ!²¯—³«uïz!6¿„݉ÎE|…Ÿ9»Ð;Ü»®µÎéMÞŸ¾¤Š‰‰Åp‹fÛŠ˜É}Ìè-w±ô,–¡±mdkmèÄí6_öèyš¶ê7Þ>\òr`΢ղÒǶE2j=õ‘¸zõMrlaìÙ±X>âN)9—ÿ<ü¢ÐZˆÂ<Ý!òYêA°¦ðì9Ž áÌöSNÍ•V×—#ÚBë„è|^Áãļ‚ÔŠÕôá7®9x,ÿ¸šÆ>rÑ.=ð‘ò6¢B䪾Q°¢´é'êKW,:ï«}–$¢ o»ˆ6Q= º¬ß„èËòbhˆ±—øAL£1/×AIJ+•ëÅ=G슫±ßê.Ä© +d—A1@ÜÖáñDòvÄ‹;Rˆ¯Žÿt +f ªšn$Ê‘p#¸D"{«‰ùtï*†HBuV"xéAR豇¤‹G’5Þ¢HnŒ‘BX¯EJ*W)O¢k¤šÎ;º¥UG·9Ò:Hg\,½VÝÊÛ2ª9
ȤQ©"³ÖQ‰,f¡²:Œ¯ÈFeI!;_û„Š¦$rš6OÈÕ`KÉ‘ôø&Wcy¹*¦PÉ5«V]®‡-rãÉ-ù±_n·æw2Tîüñeäž‚Z#÷ûö=yH=È#çöI_Uªr|uÈÓýôVžë¥Šòâ,ïW¶å½¼~mÔäm€Ó‹nåòaÊ';€yáOÛäë: +•#¼Rhד¦ÂXu¥V{Û£pªìz…g7¾(#ÿB©ütX!ST¤ª\‘kn‚ŠR¯ìPÔ~‚FE[¡U+úÞ£\1.ÏŠù²ºSüز?2T±¯ÄWŠ‹*ºTÊ‹á…Rmˆ/•úAr¥´ø³?J'Rß)½½áIÊe³ª•){Ô¨Ìë›NeÅp *›&_RÙ37JʱOÑU.òÙ•r3ºÜ”ÇkÒ„"þ[P†¢ªV!‡êoêj-Œ÷¨ëÕ£‚*„Æ,‹*š\•Wh>Ô¢U·)‚¶å×:ØnNèìgíB†£z\Lw*d6v¨Ô›YYeRíŽ*‡[îWùJÖ®*²Žjd¨*éjdUùÖf¯ª©AU§œœ¨Æ–µCµœ;»ª=Ö4©nFmSº4jãÜÜR;}“Ú_ö÷Ô±ìÁ¡N«3u© +«›kÍQ=¸òê…«Wïré¡úº‰„üS‡‚ˆÆ´ð¶4.¯Ë§ þx®šîoiò@*jjûªJÓ맚Yæ˜Ólc—æËʵêØ|ª5Çõ%;—iËI›<amÉ´™i[™xS;: Yí:TX´§Ç©C±“^gRu:W;éÂ)ÇF—²+纲ê0Öµó¸K=ÝfÝïꮇaW¯Õ.ûz›ç0ÔûSò‰Yú‚Ûê›ùÖY?–_PýOÞcÒ_å·5h†Š˜Á†§†€ñÐ5$.øÚPœ^†v¿d7LGö„a7Ù4ò}mc4¢!½Ñí3FÑ©iÌncÃÙ³G½fÞ¸1UVÆÛ²c1écݼɥšlM‘Õ`1eš¦©‘(Mãl=eÚfö[³<c˜•ÊÄì™)œæø-50}W»¹SÏÌ€æSi0±h4Ñ€Å^Wl,aç·d®%…¥±Äš–IÙî´ì^+šÖäd¨ÕZКÁªveM-ykýà¶Y'ÖøÁºO•6ô´ŽÚlAµÞ:$¶¶l|жµt¦¤
‚nÛ)§PÛµXuow9´#{Ü9ªÛKîXÆÞ÷*#öŸÜÒã7‹ê0_ãzG0àV92m½ÜÑÒ)¯Žy[yq\ìÊ‹S¿Ñ]Þ¦[îLÆ㨳n.jSãÒâ<tn—N»<ÖQÊ…ÇÌUWRº&[ÍÖuò¶Un]Ïár{µ3è³ä Ûr7B¶{v>èÜ—Ô-ùbÓH¥Žžl<æðtBþ‚güxňÍk›gKÞ˜ªqô–«€w4W‚õî |ºu»ìóárȬpÒמ¯Ž¾u-ˆÉP¿2»=øñ$îÇ0õÅ_Ãú9ÿ¬™Qû¯cK3`Ñ(œHüg(¦éÀØÓÓN‹Î(h·ãÁn¦
Æ«ipØPfƒÇŒÓ2$³çP›ôC…¬.vò`öCÇõQ6ã›p¨pÇ\)<Æ
Xø|{#æbÒ‰ºíêHUƒ"‘ÙnsŒ"ƒþ&jw×ÑĬ½Œ6—ÍEôG=^ÅÔÍOÌ[¾íbÙ£åÄ’ŠØñ<ÕËи© ³Ç£¶\(^½^3ñÅ$ÙÀ”Ûs,S4™°~sÅŽ£|5aV…Ö‰˜G§MÔ{H4±ÖíÚ¸ºùsÁýæ•/Ì7u|R¼^’ˆOL:žA2- +QW¢[h:…Â.Ðʦ<î/b‹Ø•ßÅSb£.ÙVcE)îÝJÃëàZFú‹[Ùƒäå¢WƒÊÐòBïÒV4æ’¥¶ÿ¸+
9\ÙꙪy®ªW“æʤ:(j5DÞÓ×<µp VòiŠµåu1©ë¦
E=ÖÍúêj¤\?×ü›†s´6ò«P¾±P%~šÚXÕ!C›Ñå¢ÞìxPyó¼%Z®Tÿ§UÔküå&?mëGJwë×'í~×æé ãõ¢ã[åšÁwèìÚ\׺¸èºYûrÐ
&¡ž68EzqtÝéõ&ÇPé›T2´ï/ø&ýz¹šëj[÷À1v)E¤³¬ÝºúÐT¯'†iÕ=œ¶Vú‘Ö‘¾â{ëf4è^§cezÒ‡#æ¸)UÇ·t©<ñWJ¥IcÖ(MκIeê)\2tZ½X»ÓC6=ž¹ËŸYyj9Ïv®vîÈXœóR°›oãþÊž:MÅfë¶Ø,"ö¥ÝfO/‹UÕp¹¹•½¼÷¯Jæ]cµÝœÏkGOë_—ë¾îz_ÈëóÇUš¦ª=ýîç¸L7^Õv¶i`Q÷æòso‰²gÛ¾Yç;ykÚEÕÝn`Ã3{µÆ«Þ'ÔÖÞ~j¶·ézȤìÍÃj +m–¢âXªGǃÉÈГgržšé±üŒØMósÄÔoœ‡:wò¢EÞÿ/ôð{mŒó(äèŒÈcoÙ{¹ç\Žãý}Ånu0NÄð +‹å‚ý`KƒEñLºHÀp¼D.Y›Y†Fü9ä|o”¹Æ–©r.pÌ«À
+M1“I½|B•›µ>7†£>w'yÅ~ú1GÇh +répJº®¦«¼‡t +Å6Z—‘bÍÆ,g±öyÌ<¨pDß9C,.ø`@@!šÈPËDžvŸõ!<@} +4Y²yÜ‘Àlm[°nË¢…^)8Í`À?û)ˆ™|tÀ+ÆœÐ(–yt OwÀª V`£¹ƒø͉İ!Ajè©;\×Ï4ZÃ~ôØÂœ=%Æcµ2æšÔË6Ek«é5ZRNóÑšÍføïmxgÖI´FáÛƒD$ײØt°¡y¶¦sê>aí¶¨&f=رVRø›äAÈ241´ê1G+ƒGÎçUÝáË7ÃÄyœë³LžÎ ¼.)ÙgÒýN'rb!(`xéƒ7
Žm1KÆé’–5 'äš"þÚUe®·gRrf’A÷ûÄ·ÎüäØÉ´Žrét«xç¸FuÔÆW®J'1±tØü|6X€úò?:B’ãAŒ\2:ÌX nG8\©Y–þqɵON¨§zÚe£ÅA,ÇÅšÌðøl×&„'Ï$c[W°IÃv]s@…¦jŠ §2ôb^Ä’tP•D„Ʋð5Ͻ嶛‚O†kò(Ÿx½z¿£À¡ˆ?}9,âëËÚ¥¥±[²ié=*ÿܧڕ\ÑBöÊ냙NæŽtÙrÌž¢9]ò:œí¢ÕQ3¯ƒœ°P§\ÑZþ°Œ4jé1žð”[24 ·$zr†CÁ†«\¾˜ó›71ÝœTwÄÙŽIÁ¬êªs@<ÕÑÊö¨c¶+S@ü©îÊJgŠfÛÕ=0ˆi~>ŒÔܪb<wªYY*C§ÂQõ€¥*8>Ô"+b@æîç`I9'œ§ÔìÃç–¦a¼J4yHjÓ b¹ vK©]vâ)Å[—gphlRòٔ$œZâ)ËR·'›×ò4¶ÍXLp®ºôút{Âk#Ò˜˜Ý¥T¾bêQ» +Q&lZå nMÆsø)XÜ´Ì'¾°Õ ‰‡¿ƒ‡ýÙ’ø
~A¡'^$¾ºª9[>
o?Äáo1T4`ÄÝN#V±
;Çl +&9`Ø)HüÍO +–9ëF| +h¹Ý•ÙvÎHÛG”[ÝöiP€“)`ÿ/y.Ý#–Fm˜DP¶‡FÀP+ªã+};n^‡‚>j®Øtbù"Àö&œv„cÎA)E µ+`ð Gò<ÅœŒŽ9ªÉçô(¥¶À³ í¶õÏè¨w3ÏÆÁ€fz|4y±dÛ½ +<±¿l¨wç¡f?`Pš»÷4—‰•K0–ö®@9ø·6-ª
ÓÎîhf?¨,îÍmR²ä²“#í#sc¶ÎÌK|ÕC|úPr8¼sVßfДmòz`Ú—ôšõÁHË ¶±úÁ#`ñÍv[T"Híí +aÃ.F«ÉÙ˜—àÙ©#^bˆjn¶9d¹ñ +UŒOßK~®S"ùLÏä51‰é42Ô—×Û»ÑZM…°˜%œ~€ÍQQ*Š-r¤¾í 0HJÇ£}`"FÒ- Ç0CÍùˆ’½õn¢‰ZÔí,½ŽQl³6Š`]%qo¨=Ì3à…ÕáM$:6áµ½EÅbÛ¨¯™˜£-¯§‚=‡ZÒH)3EcêA,›t¸‰sݹ"¨
3ÄÙG°~í +à"t¼4ŸÕƒpm»tfÛÖi0[˜a³×Àܳ +áÃhåd¬ÔÇî)põ…öðf¶ØD·F½¹Ñ9€G·{9åð˜}¸•ç+ÄÍ=,›
˜ISÍV®ñ„u¡Á}ÑŠü>¡M
ü5³+ˆGC1ztbéñ}’?ےЦ_²Ô„eÓò8–ì0ÜJm<b¹Áœï'8¢3X[‡ïxm`åØG`†=°vFK:—îš{pß»Š ìÝ7Š~\“ÞE½«^Ac¥|G \šóeÄë8èµH™Aàm`{xQwU‚ÿ©HÀhÒòbTI,îF ûóSl¢M¬žÐ\&}(H¬\bY.†1`áÛ‚Xª¹˜M»¨ñ‚°ª33è2g£‡UQÇôœÄV*ÁöwO”ñÁ÷.± +[ +e1“˜Ò€É.Ü52!>Îꮺç1Ç-<ài3|r¢ÉNãÔ”ØÆ~~J,=+_±ŒFƒÃmÐ4¹oÝŽw„i”¸ªÒÈsæ¬ñgã5ÇgÁRfìY1ƒ|gˆ–uC !§;+SgnWKº›pÖ5` Lk¾Â`rÃGÛò˜ý±™Þa²Rpcˆ¸ÎI: –M(‡–[¨Ž +×5{
âÃÉ̲–`6.:·o ¯Âý =w^ìÚ½ŽqÔ¡V¼ÖfÖõ$/Wxl +^ûF<¢ž×Ø›q.b¡æjŽW€ÏLv<µ^bR‹6±¥SµæH¯‡àºË¬‡–&å5% b.d(±_u'<ZŠ}ùËíÀ
º\'«·‚Mãã
¦[›§î€=1OtéÄ#<I4©‚_Å¡nß±w“„Ø"(Vê¸k£”ÇnQb[²,µÃ÷Ñ<П5mlã)…q \õV›Ñ7HiH-ËcN-nrlæÖiI=¯)(*S´«G+‡ÜÈ:i7L—Ò8¦ä†~øû.ÛŽÎĺ··tlÒšWÀj¥’íáqDÈÈÇò ücr¨8ap#®pË©00}Â@DgO1¢K÷訬¹B~ +¸ê¥™¬ÔºGà7—+,ƒ,,ÌVWã´ˆ*Gsnö£ñ
¦•t–{lqèë‰Ðoüšõ1Œ×’7ÓqÍv´zöá +GŸá{u§T—QºüÏï³èø²õ@¯%Þo‡miƒ-Éâ +ðº¯ý•:=Q”Ûõ=ÛšÿÆ
˜ÁäûÃtu>ìæØá¯=yC¹àõ? +v/½ÇˆKQh0$¶=˜³èÝaA£__þÜö›=à?“dŽ˜ž×Ç·u}…¼6êï‚èm2Üx¿‘íksnþ}Í óRÔ.¦ïõ%®õí¸ì8˜‘»É.ÎúpáKâ|z¡ÄD¯ç☠5FU¸×âqèë1>'PíÅ¥PÂ5;¾Îk«Ûn²¯·RÆ +é&ľ¡$÷“t@Ín/WÓôp»OâýŠ–ô~ó–TdÜÍâ†éÔˆd×U„ Èz‹ðîÖû31dæ/¼YcúsäÖ‡³Å¬ÏëôáÕÕ?Ù²ÏþxP~|"øíáÚ5†-¼ÉMJQ Ž±…¥z<µéƒ× +ÑÚSAÄhVWd(¢mˆ¶Ðñ"†Õ<-Lˆþæ«"†|CŒ–¼Íb¶5z'×–Û%:‡máâ(dyìWǵë™ÄqEú©%5œÇeèù +N¢†c!Éz/!O*Ð4ᇎ£‘8÷:¬ƒ·kx0œZuQ÷žÂbW–õq£®ðå\BÃ%d²ç¼J¸§Àm”»œÏþK
1¤-fG•Ý³‹¿6lƒÃFe™©¬æ"
öÜ·\ +åþ¬
+ m,ø¢P¥‘Y–´I$ ²f†5^¤É”&H^['TH/Nì9mNîÝB9ˆVû<«š¶½»µjRÇቕr–…´¤Vs:»á‘FJs2‰vxî¯ö5¤‘±Ë+¼HáQEiJ†*í¬¤Q¬æ~¤å¸6tRîr|Hõþ/D#óÂf%]¸)ò#u´ÛÜk)ð"•ãK·²²³ùÊPÞïãcu)ÐÍ>B:¶$
£?Ò¤%ªžkÜm©åøª0„)¤m£†CàpÁ¤È›èmpÒNÀ’s©ŽƒT†^ä©ùÁUm +/Òª_mDšWí>¤Pò;ºFKu¨•óõ"Ϧæ…nG«áEÚPï—‚H««òhB •¡Ïcí&-ì1À4gGëx$äGzÌÈù™Ñ6†IùU€ÀÝ¢¥ÎbüHó¡ÄpPî÷y‘ö‹›4ê—ç±þ´3\ +RH¯a=g¤HoÜÕ’Hcmkš-
çK=„ +ó:8Ñé$Oœo#“‘%nÏrJ£%<¤.ôsºüHíŽ R D~¬{Œ9VÂÓD +UÞT錉ÔQ>2§«2ÎT*”°þHíòBëÿ1Òä–…TÛ&¼W&Zƒ6A¤„õ/€øƒÀúÐHÁXXcí"¾8„‘Bë_©…öÿŠ¬Ä$†4§DJØ4R¸öYh¡MQcÍêÜ{GO|¢&BïÌvRÚ
n»=sí´t)NƒD«ø²sEñ%-b`̽(%-Ÿ–îH³ƒÔ©04!üv¦„‹ªá¬xóZá3ÐBGͬF9ëP&‘þ~è¨
5ˆ7¥ü!zò&»\ãÄl§E…>”@©?†üB@˜ÀwÛô.x$q¢O@ìÅÌ«9†>þT˜33+>cK’9ÜQ&LÅ”@—ë%ðƒ +´7Ý:¤ÝN‰cÆJ*67ÐaKƉ¢ÄÈM¶—Äש7Íé³KÛ°nÞ`S‡-Œ8'HHËþ-–}Etø‡ê<éÌóŒOŽO†Ò#$þÎà}þªò×ó§xŒOGñß¡ñZ!–ôù;üIz‰%̪‹ýà‚ dRØýN,¿ñ-΢ùŠ¥‘IÎJöNïSž—îÀ¸éPœü1åm±Ž7#Nw™0±Ø¢Gû,z ¶è±ŠÙ+ÖMôÒg&]fPEŠ~Ú
àm$wôÇ0(ÚY÷ü´kA±-´*‰xïÐÚò÷‡ÆÔbÄàìáF-ÿŠÔɬŠÚMàí¦çŒŠ©Å£š—L*jöŸÄh`iÞŸ„¼Ü¹ƒ¶eÈäó‘V:צÉp´Ž•êÑ2ÎÿKÂX„µôê Þ9‡ÁÉDP‡˜U*0>PÝ»<ºçu7Æ¥®;ñUtåXÞº‰Î¥Âj¨[
ðOWÏؤxb 5‰,ßtŠ1'þJ¢ŸyŒï!Ÿy£X~t‰Ñ/b,×$oÏBÉÉEhËüZ7?YaÏSB{|yýó”Ì’¯¬0©¢gã¹ÈPAÅ$Áf¤k¦{TK2ôùMBš¤Þ·žøÖþ,É–Ó<ÄÊhÅ+Ò¥k8#¨+‹ª?RL:Ð%aƒî>u2TÚ/_Ô°xeó³fpŠoÌ_²´£A‘œü°ê^B¿Àª”ŒPÞí×}‡—ÖwbÞ$Óªû˜bÃó)Æ–hoöëÈŽÃŒÜç'ÇõºüÒ:fí¿€þ¤øœA!ƒ–WAÛbòBŽ1lþUy
Ë¿¶*c“ò=G™Ü}šÉÜ2ÉÑ´žøûÔiËUR‡mÉ¥NèòPË/Ãü†aŠ#x×Ëëi +]Ä]<NG(N~îÊ) ©#Ûòw4y±ì!}d½€ŠZ¦`èºû†ONnJ²=ÎöØú—‰‰ÐŸÒço j +û¼%ðyžbãð·O7`ïúe¡> ‹!‰–Y¬óâ•o1“ø÷Ä, +¢°÷øÄ€‰ŸÃ’6>"Ö÷*sNòø8‘«çõ"èæ÷»$ùø"r%Ö%¾”98–·’æ$Éšç(}¶ç½ªë[GAÈóc¼‡AÞ‰›Á>ŽWµ +ñ¡É$&»±OB¾$8Ìù§c2ÙMhÛ†í%½JvöOÅ7Ò2!z„åš¾rCœlV¦°4`ì#XÖ盉íô*óQšÌão9½Äªr{'vá#”o¥˜¹oy‰Y‡¯}{@,¾½ì‡=ö:{8ÜxŽœ0 x·Î{hö;VIA³K0Œa)qóÀ^š]’óøn¯ÎÀ¿‘Ç7y•ÿ¢`„SÓ„“`ÄMéç3ðêàJ!Ô©_Š¦ðü½</ùÁ,ÉŽ`òΟÔ<>ÏùUNŒ3°O§C`_Ë=Ó;B™)ï +ñÒ)Æ°~H±—i¢ÒIK´_QŒøµÅZm#û SŠs°ž'“Kš-ûó}v³K½Â·Ï—〠+”Çs#¨`×ïóáX§¡î憎ǽw”̈ûv>ÜË[¾’ÇÚ±’pÔòwùp\_Lh[f²}žYÜ×ÎDPì3‘B¶¥”3‘ƒ¤3‘¯ÖþecÿÔˆ$>ÏF'à^;D8RòH¡öç™\O'DÎÀ¿–h0¹N8 ö|Þ™QËFàijú¤{:ñ¬>½˜Î"Œö´Ÿ,C:ùˆUøt`¢×ÊðÉ1ÁeØ>J]†"Ö8¤÷{þ"/£}ç6`Î{ËG ÀùJ"$f–¦Å^¾Xà6-¡cÖÏW¿¼
•æÜÖ¨5<Ç°`ò™øÅN/êGFªUþÛ"Œ1],ü«ŒÔ±|(!‰TbFêX>‘2x‘ê÷•ŒÔÞé;©Î72Ra¾Øç©Ê72R!i×@s\b¾s}ľ4õíCFZ#5ûìeØúxrRáøåØ·Sáˆóü¢'z¾‘ +Ç;/_O…û}Ü’M1qßý
¿òƒT8æDD2Üÿ$Ž'ªð?H…ãIôÏÚb†!S0ïOK|Z žU•r#<Û‹›^¸ERzAPNIE dLøf»7m˜§K†ßÝ\`d£·%náˆÝÎD9ŸÊ£±¼NnææÕõ¯Ãá*‡{t”G=ÐëV3ðá£æ€(q*®’ÛÆxˆ)f·îUFx-TJDÌW5üx-ìneñN≦\µL<fšÆã1s!¨ïêݲ»LEœØ¹X|YgÐK¢r”ºÂygž²¯Äd/v²›ZÌ3ƒÏ¤Î•
¡;G»%–ì63"µàµ˜X†Z\çÇBHG"H“F/)7˧¿0¢pÜd7Gk•{T&䤀É5bÉnV)»Ÿ'”açR(N®[O(Ù+–u¶Ï°;Ôj‚HU¹ùj&„t.^¯ÜFš(t“‚äUîíþ¡Ò2;ÃŽ˜U°`©QŸ(>÷IlççkGFX-½œ$ˆm‰lG©Îœ‹Ç-ܽ¤~ÛrªXìX‘[¶«ß“caí•T‡ï¤ö¼>¡Êš×±:Ièc_L¤S¯§¾:çAz¯ß¬$ÇWv„çN Ñ%±JroEẘä#’/²!‰;!ß8×÷ªˆœè¹>éüô¢ˆœàøøê¾½*6"u|¯k
H&ú«:#œ»Ô>¨'}½$çÂ…ˆ»J-@'éýM6Ýïâ0ïfÓñù÷Zœß˦“x?̇Ùt|1Aîzù<›Ž/—î·™ÂÙt|±xþ“öŸdÓ±ÈBYÞûÇ>ʦãõâ†_dÓýR#¿™MÇ·OóЕ_˦ãË¥cúûßɦãË¥“x¶çl:¾Xû½û÷²éøf—ˆô~5›ŽÏ¸ažýN6_.ÀmódÓ=wi¥¶”~›MÇgœÊÐogÓñÍÏi¨³é¸ ^ÖþU6mùÝl:éû$›ŽŠ»'þ¥lº_Qìíl:Ñ«¯eÓñçV;›Ž +ÝIÛ<:f¿pÏ•=\·ŠO¢ô<‹ì׎(³´Éýë\0´ V* +îòÀu/ϾâO˜FgѼ¤D:)'še¯3…qHÎ/XDŽ¾qˆRG0ôÇædi¶ +€zy~Lòi( +Uí¾ÁÂk›$±SoÀùÂ-$œO«U“Pî‹ï†Ã÷ΪÖ%$2¼µÃ«Õó,Æ„DIø+ÜÝó+…jÜýbò®ømÝê÷*܉e>~°ïŒFU¸ûJ¥¼—ùDÒ*å}šOô¨”÷ù2©pÇÎK’’ò› +wbõ^a»÷+ÜI½Õf?}žXÛ;ÑfŽ÷*9± +¥»¢í%áõ‘‚±Èñ£]p¬–¤¢SDªNOLK¡:lZé#“‹&pÉic e§¦]Ôn]GÐÎÉrÔjÂÝ-R + Ì9ÇJÃssÿ˜äÍJH] +ÔQÀFt–›7AšTº„‘&ËŠR¢î›'ÅJä"ˆÕÌ6„‘&uœu² UÂç†Ç'* ó¦šÙ³/Ðη¶cæWZF:_TD½ïpMÐjŒ¹íàÍ*ÚÃVžq‘8ñCÑI<6 ˆêÔ»A¬*f¯NJÐÍ +té)¹_IöçyTŸå“^‘í“¢|Œ±ü‹ò=Eþ'Eù^UdûNQ>2gDÜ@ù¼(Ÿå± +¿^”ï¹>òÿ¢(Ÿp}äoå“T¿ò“¢|̨ì”K°S‰^¥Wõûün¨Ì7X×OÒÝP×õcíwC Õõ{ïœÒoëú‰WõûÕÝP<uýÄ£Büžøûuýø™Oôn¨_Ôõ{ÍÉߨë'~2ä¹ú°®ß«L®/tE«úÉзº‚uýćƉ]üº®«#OUý~Q„·®Ÿø€øN¨þ¦®o:¢ØæÒ #9S–÷.è_Ôõ¿ùë±'þa]?QE'´Øêú‰‡…ߺJ¤®Ÿ¸«Ë{ +úuýøÒ$é¥÷Y=¾/伿U×O +Œó£®Ÿø†ŠL2œOß¹©¿ëÇcj2ªú1«3X>¨ëÇY†vU?Ö]o§§Xuý^æ½~¥®ŸxU¿'X×OüÀ5##õ£º~tþ/rî¹úu]?qìêú‰¬µËÆþ¥z|:q(’ëñ½(''¹ßGuýPx—Ï»ÙOuýDò^ž¶¿[×OÜ’‡7|£®Ÿo<ï$þ.K‚9ßI|µ_ÕõßofŸ"ø}]?6µ¹Þâoëñ½wHC¸ß–Ï£ªßçõø¤$1½º½áù¬Æ{¥ø¸©ŸÕõc¶Ÿªú‘CŸ×õ{¤J‰Õý¸®Ÿ¸™#Àco×õ¯ê÷ñMT]¿c}ëúIÈ{ýB]?ñª~o×ãûU.GZ>×õû}2<£ªËGuýžCÉ̪~B·œ½[×OüxG‹ýº®ŸøA'NLé×uýxæ…QÕOü^8éuý~·dSìýœ'¿òƒº~´àâ«ê÷ëÓƒœº~¢Á¨ +hÆûÉJËUˆÏäó5‰˜/3?îUlJ‰fÄ> +‹=æ±{üóv_¹ðblëQxÞÆ£`# Œ»'L×…mWÌ|ðdèï!Ö-4DW=è‹Gë*ÿ(¾rgÑZtß„:Àk‹uuŠµÝ¬M;mï³Q³ÓŒ
¬ãcŒú$g ¸>Ö5íÀo’íaðCK~ËFâ y•àixr8Ö±§ ’iÛú·@~ÚG.Ý9êö >÷Ŷ]daK0_r.1§65‹ ’%¾F|…[t•ûWÌݧt'<p¯eœŸM®êËëí]âEbV}…¥_®¼ýd$Tf,ÏÑ`»Ä6˜z „(†«´=ЇÎ/òÞûp[Z<a=»#§>>–¡.…¯UML
c´–¹é)²¹l·ø1ÎpÍA'ÙDÌè÷ûòú;ôÏ‹=¾§îF¹[sñh(æBN,=Õ_,¾†|¿`4ú‡-¬Ùö6>Ë—Ãñ¼©«ÇGša`Y./Èc˜z,="ñUwz]ö+ÁoœÅêu®cÅë J?uŸ”k´z3©b©švDÐNç>êBò-@ÀºKo \3wµLÎèÕZ`Ú75€NÕ²Pš`ýu[A²—m{
+Ùy*™›…ˆÙ:Câ¨d4õt6Írl*:¾Óés>íÜUúÄ +Wä~¥WAÕ§ßÖL_›ÐŸp@À?²ëéJõݳ}ì=Nd§ü—çë]îWo´Ä\Eþjë÷Šµ›p +÷_–NT¨±IhÀmÉ*qO~äé7@Ürj$ +Î$µñM N¡,O½xººóW} NªP×~2"L+@J"ƒûõ0ê>3/Ї#ƒ÷Ž×ñµc3¢ÕGõ’ ÖdçÁÚ˜™õôõQ•mÀlwŒ[à>2?D)s
+…*™ŠÑ¨ NÌлÕÞ;õcÕó\ºDqàxèb~ý™»™DÍ9‚̯ƒH˜…Qnæ-{ókNïg~¸ƒÌ¯Ë`ˆñ˜F^æ׺ÆÇä1kr`bîx€ùõècÂŽ96ðÎÃ̯®\„ù5\‰2W%P(³+“¥ÞÇüz´2;2Uº™™ƒÌŽL]ñ¡N›ú•mkšc?1ÕQpß°…)»µ_sYýÊÕ%I¢ß½ }5F˜î÷UIe„Iþ0ß`˜ÈÄŠR=‚H`+'‹y|òÜ#ðÐ(…ôŒd$B\9á';íÉ<ãKÑ×Äé®$CC<V³RÞÃÀŒ–íTùfpûѳ& Û¢Uz,Ö´Ú¹[Ã<²ÇòП°Y
¾¢—q¿eŒŠ¹°áØF‡$
`xr±J#/–ÙqxSíÜˈL<dW!7³&E#¹—T¡<E@e^—r KÖg5C²iîAüÆéÎ#ðÚ^Ä}r|‹µ¶Ö$ô«zi}´þóþTÄ‹mÌ¡Û=>F’ŸC“Š1@ºÞ”åyu؆3oÒ®ô¡.ójáÙFþ™ûÞ‘êX”Ýéðå«
N6%¥öÊ1"°Õ´¡½íÆùÐÖ’£ãPx:¬Éø2jÓîjux¾Á äAÝOL"a1'BÓ
ÛF…r^ãꤴd69ƒ\ÉûŠ”†v$¶7«YTvë*[lÎÍ +ã¶Ûo>2صÃp?ADÆ|ÑÚÈ¢®G
ûÊ*:-¶PŒ–iGùi13ß=¤¤sßÐ-åÇ·ºçLJî8$yùÏ°ÉH.}ªSEH Ùs>â¹m¸CB¬M¦'|p©P·Á…&¶ƒUïv ñÚ!37g„»›Bº®-µ=»û~˜t“ ¥@¨mسNNìúÀhûθ(ãtèd(J‡&«‰
§ü¼T¸Ec|~€Ù +ôwÃÍ0L‹Åb7§«ãÖM`„¯k±ûÑRÄŸm-Ý +-H~{,8¥Èc +g”flk*¢ÆÓn8Íèˆ:¬KB6 +‡ ˜&c°ô¦µ‰
ñéÎø¶þÕ—y„7|RaCÈz‚™kŸÜ©™äÒZøÜFìÙ0œþg|Nz• +c|ÕM¨¨@$ëÓXœF!Ím³
ÓHÚš\éÜŽ´ˆìp@E' ñÍ#WÃNÄó^]÷öÞ.´žMkD +Xh>0ȵ2ßOp]’<¤kј:¬)ñæÌëP¬Jh™:FÔ‚…ÝÏC]j‡’?a5X»)2 +ìûÝ=¬êÐ2- +°j½6›âuÙ«GдeßAÄ2n¿hÚQ8~ãö‹¦-ãt׸ÕSÁ˜Iâw¦Ž=Ò¸BÚT–lü{œ¬ø’iKÜö0ní1†qûEÓV† +·_4mÉóÉ]š…ŽLDÈHÚº,ÓÖK#Pà¦mÂ6Ò¶|À?¦Ý37q–iKM˜—¬o ÛB¶tþ#Œ[ +—¿øÃÅ/î¹—^ÿ*|òí¹Ë×îþ õߟݿt!ÿé÷o}ÿàÊÝ_îó÷Kç¿ü‹ë?\L“+ü{éü?þp6~ûû÷fÌØ +Øï=kÈþ•§ دüt!û§ +Ø›wôéCöO°™üs!ûÿß›{MÌ‚MÁoμÿã[÷ß½û«Ûw7¯î½¾wæìï¯Ý½yïÒý[·>¼õ¿/Ü;øñ»[wn^Ûœ9ûÁù+Wšìèƒ{7om˜Õ‘?¯+%W13ã£ìbšcç.|ÙÿüØ_ûË}òæÊjf0øT¼üÇNŸyI,nßxáÄ-ÿ—^ýú›ðë%
+.fù!7õÉ—_¼pëþ¹/¾òÎÕ¿_øË•>Øqâå;_\ü᧗é={9¿†Ö&_ÿãÜç
Ô¿¼õ§Wå׃ӺovÃÐdÃñ‡N½ñׄ×øO}AÞå÷Ú™^=õÖ[}û…Wþö»¿ÂUñWüáO/œ>o¾ðê;_~áå^¼„ýñŠnÛ¡ïÒõIš|ïÞ°0è"{õ«¯ÞÔ'ü·¿SŠ ü»‡°Ïè>…SÜ~úæÖË没öÒØK—_±__;‰É¸|Úlelf»…ìÞ‡c«_YéIkºã›õÔJ[½Á›|eõ‡¿?ÿÇñ‡ó§×»S,kºrf½m_ÿêìøû~Q¯ÌÁòç?¾¼ÒÆVßüçó¯®Îÿ¿ûÏWö!_ÅöŸ¯P¿Ÿ=øæGùÃûž¿Æ?]{A~}ïåÞ×™V+c—¨ +¿¼Ha¿Æ˜ÒÕ&‚â]YÚ÷Þ=£ÄÎsÿð{ùõšW&'çÌ{ÿˆS{Ô‹”ÒÆ?øäê¢C~>¾…ˆÿTfì™oüᵯî¾tíÒÓ7+:²9Nvø'–³4]Á]žðîùåŽGÝOýÊO|ÇaªóŽ§ÞnëíÏ—ÞzéÖ‡¤ä
ÚçÇ~8
?ßÐe tºsýÅ¡²ÝH+ç +^_¼«¬McÓ~qíŒÁþ‹¹×¾eWÏ¿/þÞìW‚¬Õ7=ÀŸÃ‹×¿?÷Þ….½ðòþ§Î÷w¾'ïòâþᇡ«½ö¶HÚß_O¾ùÆç/üë}䪃ýë»o40¹Ëõ·¾?õ¡h²gï}ýîËv¼•¿Q¦>üáâ©k¾¾tòàŸûCø“»ôò©W÷Ï}{òý»çî¼uçÃó·¿)g.\¹ò÷/½ðêÉ—&Û0‹²pñÑ'N_T·•_ù +y™o|ñéG_¿õÑ—×.‘*i,JÇŃüù©GüõÆT>-7?•ÃæíW¹ˆ0 +ìä ¼öÙ»÷à)“óÜ©;÷Ñ–«\>wÑíx8S`zÙÌÿü’*gÛK”mC|ïží—¿}e˜ùÿz€½³äöïÞûÃ<Kñ¿ÿc)& +s:¥Zâžu1ù÷ß¼©†þT*å9ZûÌc‚ñ»ol5Äù?Uãÿè,êË,Úv~&CÿaüúëÃ7 +—?~¢î@ÁìY:¦_^dòßÛE7~€/Yâéä’%>Y_/©Žvë›[¯˜GåÊ£hVÒK᥷^øÌâÉ毒~Ç}pæöÇ÷Õ¦»ýêk¯0
2þþõ‹oU¡šöRF·-Åp¸Õ×÷™ Åß#S×ß<Ïýy¢ð[le“»Å<Üï˜üw8³dÞ5
‚»ÞÌ@ü¿Ï‡àÀë2AW¼¿~ñî͵ÿïÄ ùàÖÿÇùú¹[_ݾ{õÆO·îïùþÇÉü&oBΛÚùÛdŒ^ýbï䟼}óփͥ{÷7gï?üâÞû7Om®ÞÝ;qýŒü~áöÁÃÛ÷îÞ¸ÿÓæ5}üÎÕkW.l^ÛØç®Ëç®/Ÿ{}sRžÒaD.;…`Äuyòë{nsVþûñ¿÷œ=üò“üò¶üðý{ãÝæÍ?>s››¸ðý½Ó!´Mî›ïöNûŸ®êO§=~Â_—ŸøדwOm^þÙç{Ý?æqå¦eß—’7¾W}„ÕïW׿Ǫñ¨ßyýS>ZxÜ£µºcÄË~Ƴ…««hí‘ö‘§|¾ø¸ç«÷Þ„õñr_ý~uùÝý}\¿û»]ÿ”–÷h²û%ÈNˆi?ðá|Kë‘««‘àÇÈøÔá‘ñ©§|ÈüXè9·ßjÞœNqßž±®®®òXðñ‘Cö‘§|¾ò¸ç“õû>\*ó·«ã·æJúÍ®|ʪ\ÝäĉâWùÃéB,~àŸžò{Ûã¾76¿‰"|¾ÛKE¦»õÂ_¯.¿ž¥î‡ª…Ë
èžò©úcžêê9=äTà)púôÏœ‰‚
«sáÜ·žè Ð^òûÍÙïå§w÷ܾ1ú²qûÁ'ùY~ðÞù$ÿ:ù¿(¶ßsii®¶´úáã>CÒöÒ€µ(N¾ÛË^$r¿_¿<õU½|ç×yõ—òرÖÚð(ÝõØž)D_›ü{ëÏcå»Ï§õËòܼãiŸ–‡Á/W=Ùö7ÏOéCx<^Ç”¹Z]ÏÙüa™³T/¶éá¡yyýu>ˆïm¿áx°/?ô»]þåW*Êl`bñ`0È!y®ÝœŸ²ëm™žù!ð—'±«»¶õÅ[ŸÅs½HÀé6gÀ’ +¢zÊSËä5‹}¾DàŠ…EìØœÄ:QžG?÷«˜Ù›èäÑeƒèæìNÔÈP¡Ãr‚ä¥ñS(ûÍËdëH: ¦>Vû¾Q C„Uˆò^¥pkå·AíÃ;Äý./¤ßVåc²urØ-›QS =eˆ³™–‹S i{/þôô‚åàËÁ3 –ƒ§,G½è˜„ÿ‘}(ÛÆb95<Jí>BƒŽ
B^;5Jrò¾Êk(à‹¼nŠfÝÈ£";R¦¿g~eßOð{[ìMGj”¿áIœ- ŒõV#à«Ã›;ÌhLxQsÔÏå(G|‚€ñ¹ øÀ˜ \ø¶ŸR¯qð¥ŒMÕ’‹«=bâkªLé²õ²[Ó°ž"/E¶Æœ‚JÖS6Fªìq/
“#ö¡¼_3?“cú-NäR†ë¢#D0òb@V}(Z¸lÁu’Ǹ£C±ÀU'’+„®»)TÑÂe$;újEvÈ“ã÷f’£î‹uˆÛ¸à0U®hb¤F +ëîÇ4ÆÇŽ’'½Ñ±~Ñ1 Ct”œélI¹R@T9oèÇy«±Òx*©zO¢êᚨJß”*ïMt@Ä—@Ìpo7!dIqÁdBuX!ºK‰ÈŠ·¢ŒÃ@J…€–ÇÈ6;ÁÛ]š‹²k +^Òw‹!S3´ùñ.²³)\)ãª(FºÌ€˜6B8aNÊøœh.M^ ø}y<g•¹N‰2(E|¬ò¢Ú!€3 Ôyl o +ZQ—R{D½lŸ†ç9rbyQ›ö@K+žB¢¦àÕÏ(3¸åa¡¸Øò°èÍ!£åH +F€˜è‚¨¤hÝ—ÅÌɹy¡ +Ze$¦RuWzÙ%‘Š‰¬g^N‘¹¥äÈrÈUbº‰Î¢Ÿ“i©òžÉ8ž¸U£èQ`ë‚mðe7Bm¢^FD³¢ö«š +¶¼Ø¹²9ÞÜ• +Ú"
@È«¤âò·^Ô&a@?ÓwJoê>”ˆ¢RÓ¹¨ž¾Ë…-Gö¸aËaøB¨r|ɘ(6Šü"§0r0å·ËɈ‘$šÖ@¾< +´êh@“jUUŽ’
jkDð)b¿éHH‘^y¡0ð‰˜àÙù1ˆý,_‹ÙŒÝT"Ñ$suNeZ™‹íìå!årBŠð1ÈF ±êº‹fàyðˆv3àÉ'–u¨™Ê“jCñû3¦qY5þŽ<W/j“`ðŒ>Óx. P9¦ð¤^ÖËÓ™¬®Y‰Œ¦™ðláˆð¬ø’¼9"œœÎpCqHP¥±2æÈ‚øôX% +sÞðé«lb|‰§Ð+òL.Á§ˆÅªø”é¡ôäaoø¤5$ëÒJ÷Ÿ4WÝðvi«&ÇG‰ÇálßzQ›„ÏØÕÎE‘ÔµîšÆa¸`€§jE·+$ß„É·ìP3§øÌ•K]ñÙ¯*¡wŸ^—Æ[i—ˆØ¢ÎÌfºNXÊS(‹G`$T‹ºxxQ…—¨&} ³R|2FÃk’œD§œU@x:å;Sz‹€“ã‹j„TÄi?b‹@g£*Js^Á)ª +/f =FƒÂ;‰r³•’e,A']äŠß&»èôÃ…oî|ßÌ›{Ý;ùöMUÙ~'<43xŠqÒ‹½žž²áœE…mE²U¢.RǧNOpŠ.0À™ÁÙbK›y\Ö,—C}õ¢6 œôºg{—dYÑ<»Âs(}6¨é>á ;4,ðÌÐ0³ò%ž ¸ËIsi°#°6àߘ?)ÃÄÏi¨¨*cJ?‡£XNÅJV†÷6‡UÃîIæ¿©Ò)ò09Ò/¸ŠtC0»ÌÀY;Ît±ê{Íðø"f™ÅBG¼ì!9®GT½4e !ôäÔ\êOGX“Ÿp’|yÂN(N™í°§|¬ûÅ&ç,.kFÙ{À¹õ¢œ„NY%ër@Ñob}ð‡¸ì@§FðãåMZ3AàJ®ü`àD\ºE¤Á–äu¹6¥MƒÈ +“RFâB@¤N'…$à +ŽüœA‘L R&,¾NGW>{c±ÀJƒ)ÀoNb³’!ècµÐ$c‹‚ñl$J¹ÝaÉ”I:³Á¨†-]¼!ƒG ôEO_$ ¨zñ 2aI&€ ‡‹ÿM"ª—¼ +ebA'¢R¡ÚåœU'ËBCKäHИ]8;p”Þº)”)’Å ~ª3Ÿt4´ôócÆ^'¦J†÷l˜òÕ'µy5T—”Ý@VŒ–žNïKJŒ6¨Œ•Ù®Õ®(ƒÃÇ`õu|ŒÄA°‹ÊóŽð9R&¢mÈgÚ”±‚±F´é ‡çöQÕL"!¤D¢·Y³r
fÄg9 +•$‹QŸ]oŽ~ä¡1"Lpñ©=–ª~¸’ +sQf|(út‘‚ø—•Ÿ(G@q$H>(h~²<~¿-œ¾Ü‘&!ç…F½ª7ýsfîT0^ÁÿíðaOî,XV¿ÚÜGYw?ü(Åë«TLA`Öù¨mø¿½ú]0–5XÆNÓæw§ñ`(…yãI¶#3Xˆ;#Í3âä'ÝNcò=Y +PÐU«k©Œ@Ìrýù1YÁ(¯*cÝi(îòªI9jºŸúqMÒ¼"ÐäÉ•Öà!rþ|àU–TÕgjŒÊ+_£bŠ"#÷–Œ%0–Õªàñ7SFj’ÃÜòÀzÂ)½ªD<NÂôP,H*oNŸ2`óä<Ô˜ß@ »ÞM¡‘+Ÿ7‡]Á$Ë™”yÞ³J<™ñD&¤K¾ü)he€<RXÌñ¢`ò2à0¶g`"ßnžËS—óFÞž¾]l"ÀÄ[&¢Ì¶óÈÜDà¦êV—/ÊÌ›Š¤WˈÒ!79ÏEªœl¸•‹®¤Ø'Ô"É%RŸ°¼ò|ÍÒàžN23¡PE#®L<íšÿá +¦¢f‘QÈS¾µŒÈ×q=å¸.ãs`ˆÂm߸«1^AókÝn$ÁBæ¨},ÀÝM½Ó(iô™t5¯¼ŒŒ((twX¡´êÂÀ<´º8|»Ø˜Ïžf¼½ÊO™Lª±ˆqQúáøÎCFÝC~2qo +×·A^&>bBÜTàzÄ|3Ô7f¾êHkÉ iIþÂ5u騑š=“‰è[¥V±Jb˜E^¯©<ص0Ù«$K{ƶChPE¬óŽ!·c9˜ìWrÔm«¶ +©ž2¥¡…±™Å´6³ +'P“#ÒÔt 5"GHÑ2
¹§F¹×b2ÙÄÈ#œê<g9Å‚^“‡”³«i\(7ãq6x¸Þð¼µ4ÏÇo‡T±ìfÕ- \@åjš.‰H2l¡ŽpË<Â4½¨=(ÁjQà "uÔ²D‰†Du„å;·=Â`Èñ(ù
‚OsvdQpd˜?ÐMª1>´ÆJ–ýëæð[<U#·]ÿy¸°Þ‰ +mN̓ғ’Ò"R3F¥éne6¡ÒǵMºfåôâIìDÀÓæ¬'µ.ãTŒª60â”wI +Êá§?x>^YšÒ×VRꘀ„—0.~1FkQwý–þ(;~N‰œÎÖ“ò0‹j—vd0ëœËýÓPÛé?ÆXÖuˆÜäxÖ¨¡çí‡?øu¼0RY??B-ÞÞ±‡YÔëàrUM$ÃX£ó¸C]èjbÕ¾žª¨ãÚÑ¥–ÂæÌ•»Y]ÉoÎÞ}xûìÛ7ܾûÕ;·~}ïæV¥%Ï‚NVi«ÐßžÏÍÝ‘7ÿUŸüšyòýëÑvâ:kÓ¸ç‡è©²¤öóŽ;¬àû¹"8ååµådáh³•µ‡ š]„¤Ý¤×-ŸÈCjT½j~CV¿Þò{(\õ¨:[?óûɳ7ï}qk/l.~ù僇§P ì¾Lñæd·ùÝè5ׯÜ}ððÆ݃[×/Üxxãú•×ß¹ñ½^²{S·9sîÞ½;›“÷oܺûðÖ}½ì´Ù¬gÞ¿uCþxóöwï~ùåƒ[?Ñ?û#þô±ýiÜðû÷o|÷`ùº+wo?¼}ãÎíÿwëæ|ÚÝç>{¥_¿ø¿·~Äg¶ßÂÿìýû7Æt\Ùœýñá½Íû7ÈsË}— 9tÓw¿xpëþÿܺyý/·~º®=XaÒ˵wïÝÝTçÁä6ïïU“o÷ýÏÇg÷Òæ½x?»' +iÔñ9§á(d!g±1¯ª*æÆ2’Ží$ƒó¾9aá7À×=.÷Y‘k^EO›qIŠWî'¬ Æ#þ8ŽÅ}£bE&¼“2ÀÉŠ<¥1bˆ‚g\]eOàòª‚ª¢.œ?buïì}¹÷ò5´Ý„ꪎß/-߇*}ª7A%9M÷¹á)ªÖ}:©ÐQ<A«ÃU)©¢m3#}:üè{@RnUU#›Âoc>YîFÌ~_-`N'½‹à*;_†1(hx(5bx/ƒ—'ß~½Gë;bÆP™ÛjŒ$^ô‰âÁR%“óB?”õÐxz[j„¥:2Ûx/ÐT¶ÞΛNïÔ¼~WšqŸedùº9¶<Õ¼Ó|ô×;ÿø9ЉúhïÈY?biò¡‡:r¡£a2ç÷aêHОñ£A¼‹ô]¼ì”øûåe_þ´ÿí( ]ZÏB“S„‰òvYÍÚÔè}ƒæ8gCˆf›h%Õƒ1¤1«¨wƒ¡¼=ÏÈã´Ùe¬æÒ¶¯jóx]¿ÀÁ³®ÏÁ3®ÏÁ3ÏÁ3®ÏάìÎÁQó´5›H›ÒÁh—©‡CaÜ+l¨ŒOj²‹qDô!ñÁÜ&žäY^”ç+2GuaལúH§s™|êg„ÒÄ2_™N®äÊ9…»´Ï` +é`´Ô6Ô‚Ç_Û‹Ý…SN#vÒbeHƒÅ¨†qŸÉIã|ª&Ä0Rû!r3ÜYåC®²ä§g•Ï&*žQT<›¨<xüØL=§ÚCã®PýcÂÔý* ÈP&“‘±dNr®CúXI³\)ŒÊ”cpÞ(˜½™Q~n©êgP³
û +†t3ÚHÙ„xK&X2 +p«×h–I2Ä;+
[ööÅüάa@Òu¯8 D’‡ßÀíàŠS(Å0íFrøÑ4h¹aÛ0
¬Û‹ùÉýŒÃBb
ì´Æ·JA¨P³’Ž°t’Þ,"¼d¡¦ÞT…0£OÞä\ŽÃ)J&†XÿÉ>šIwÁôújÁ,eJËâ×N/(öq‚Sa×ÓíQ#1ÉŠ8jœnåÁìÙÒˆYCç˜oäÝ9°™zN•”–»BÛ>.Åd·ækdè£:ö Olì +Wü<¨}ÚÝ +Å02=—Z7'³@QäÌŠÖ%«°Š¹h9lÍÎîÂø|„B~ÌÀ隨çVEi¹mA¼Ýà©BÐRC082PC…¬Us +dr‚ÐY¢EÚ‡¤íy8‚T{MO託¼ê–9M˜õh¨%ͤeUà Šžf ¾>?*/[¶”2¯akÕz†b%JxUa9ê~ñàU¬T'„YÁd³¤¹P&'aY Í&=Þ Ý›©çVLi¹¯›SRz=Åu²µë¹ª¦œ”B‹ÐU±²ù„‘ÌRÄ,¬Œd…ðR ´àLÏ&¦U ÈV.a(9ªdoúˆæÁ¤9€4|›EJÒýĈºbMg(DÛHßTý%ËbtRs°ZV_<YyÄT‡'wwÆvÖËÕdz»s`3õÜÊ,-÷e‘¬,ŒÉÁÖ
³)”hggŠÃÁÐU¯KP&íÁ›kf¤u…³×ôº®¹’ +5tzµÝïcSYÇÈÖÌî¬+ÛslïÎÍÔs+.µÜ—šéÜ1èSWç
Ûe,]mÎôŒG*‹váÛ-ö_-Cáî†÷Bò7·3d2Óœé@é&¹5Á„’ÛÙ1 Õø©rÇùQõ‹¾ÕW¦ðÉ„y7ÙN¡ôŽá[É8ˆåh²›U +(G’|‹ÓaêaSß,jiªIÖÀÂȇ'xgyG9ÎãñÝ9°™znEªVqúVý¢›ØÄ$m¬F!fш4„pQÃwB¼Ù]ûðꙢ“æk³ð„ïÅVÅT›ŠoM.'À¡ó¬# Y«©bŽÓÏdê€ësà]ãÈS¾¢mXWÕ›²ÚÐ U6³HR€;º ¹™‡iN Œ¢še†A“AU6t.}Rú²#˜8»[k›f=ÿã‹ïÃs`3õ|ê\-7]qs×b»¶:â¶Þ~„·JÍzMˆuJ¥–{·=‘®mK,ªJñO橲™×Åh\ÑZ¥E«SÑWg̃l°‡š\?Kb]Vuמ<fb=ø4òÔJ6ÿI^ãzµPr;ÍŒYÁÄ/§X%7ÚÏPH×ñ¦q_+s ŬNÿH)ª®Py<4µ;‹ZÛq܇ç@'êy•ÈZGsê$åHÊPžºÄк‹æΪ€Î¾/‚|w$ãmÃÀ£ªä3<Sk1õ%Lˆ²è0¾N-$¨}G’éâÉtš<8-ehR¨†Nð|j¢°’ùýX÷zxÈSN¶1š¹Äkf= Xj.“ž‹ždG£l{¶qÊÒM=ÚÞ¥ãû8ç·M¦:Í.Ž‹»%E¾oÉ|[šXXëÊã¼3v¦ÀæéyÕçZYpjÁ q¶zFçzT/Wy]ÊÒâJdz.uÛj|·P²N€ªÂ‹œ€FZ(©*v>äØý8Œ^1â[ÙÒ314C—H¡3¶—³§+šåË##Z*Y`
²FÂÔ¿b¢&ÌPN0ç8Žó†2R¯»§NN~jÕ|7=Y6*;j-¬l‘Tú´³D¶KÔÓ¯[Èí£ÝrÓÅÒ0ö¼ê€0êËÁ
ÞUæ47”JMýf²ïÔaz +UœBRë2PmCñPë
õ‡MŒÄÑI¥Xò/Ü„¥Y^ž~€egUñ(Z·KŽSMêôéa%ôþÞ¼* +Õqk7×HOÓIC@c«º‘Ú\Ò tÃÄŒÝ$öl‹<¬MŒÙ–À¡£+-ËUá‘£F/bÝ¡ð°)r¸øy Aõº#õ¸ªa|©3
šZ-™¿&Bª–b'BŠ:yóhþA¶C¡–9§2 Š‚s¦2j¨CCýÔ»C¿¨óƒ–•&IhZD`2Uûä +œgf`¶Ýœ‹ÐÊØÀ«}Á’£«GJcšQüQš•·ªiÁƒ·-euT¢P僅Íoô¼Jtmv?Æ\s³>[TÆ÷Êð[´ÿqbÕîd³iAG΄Â`§´žÍ‡žë¿E½~í¢^ôGÑÚµÊ^s ή›ôOah.‘þ¢µ¹ha4û³Ú
ë/#N?0ÒRqÜb 2ë/ö
ãÒŒ)l}|õ¿‘B`ì-›æ‘…ÀH²Mÿ©ÕÀ*QøêgA« jû–q6S{µí3›û¥¡ãàdšCÃfu®n]W–M‡ñhÜmCneèÁdñ¥yT#ÖqªkñÐ14 +R 14$gÿšÒ”ÒIkQSŒ´tŠ:ìb²^¨ÄÁ‚^
uƒSÕL´ûS@=†?d„½ð|×®RØW]OÑ¢+ +ûUæ-ƒMÝÃp¢i«CüÎLý”„ƒÛXÛsŸõ€4ñ”ÑÍӲǢFë}Ð’XÀ«ÓÞvÌ‘ŒòÝh;‰gGC`#å;“ˆ/ì%E ȿŸ!¨LÀ‘ÈÚµµ=iRDOc êöw£ù!`ØŠk²xV6.‚&Èí,Ê +bÌd<`¿ýªc.õµ¸ ¯ìLÑ»+KÑ:ß*é|Œ,Òƒ2³e 6.wm 5(ì={ÈÂQV‹ÕÆ@¶ÊÃ…#Áè³´tæê6ö:K~°åÐúÍÕ´Žj²Nn}r2whFμÈYŽ¾$HeÐ:"Qžªúô±3Øš¼·ßÚ±¨m´ðNCÞ£9•ùä/!ì‹1 CÔÂ…èx@ê{vjYìæ1¢/Ý.Ûzâ¶ÖKƒþÇ›[ï:fÃÀ)Së³ri<]è¡»ÆTa'ÒÙ¨3V¿dVU-¡tܵ(×Íd2ˆ}8-šâDˆüŒ8Ác–md™½²QhH8¥ñfð7MŠÐ¾ŒŠ‘R3ä¢í‘w囊ÓÚ˜†¸KqJ.6½60Ï U6™$ƒ¢fa£‰Çª ¼2aˆFêcfßµRrÊÑø…ÕÒá+±6‚SÉÀ‚MÑ-‰…š‘_ù|ÆÌmXëÇÄÆØ~Õ1›È÷%IÃA_c @çF»JViÈZg4-% ]ÚU.îyì‰MÊÀb‡N*qÍ¿E!TKT¥”lçÆ–Ïš£À$yFô
e*-|xŽÆoÍêvËMiþ1kGLOw8´bS` +Üé/#´˜ò&(cïR&D +PƒgSx¶–‡ÂéD‰%„™ƒðèôŠÊ¤6fpš3]¼Å’ž²áŽ¶ÅtGØâZjAB¬h€§ÏC€$V•ŠÎQK´”(á*u–ÌkHH
êä¶=ïG¶ 2/eSÇdYKð¨ŽÍL%`“5v›0 ¢)˜¨pƒ‰*kiÑfõõeÁX‡ù˜€së]ÇlüÏÈ4áyJ¥12“ÄtF7×™®´*zºTðXnÙ“–òeÓÄnöãb”Àë@ÁtUѪwj¡ÔÖÕ0©Fèˆ +5-Ý3èÕ1$G‡•N!;èFôxÇÁY¢–*ãˆÍÛ9?¿]Ãœ øz6Šµ4°ë³2…iÁ1+ûfÓ7é˜óhýM`2=†~;¥˜LaÁýØHÈÉdI«#5Ù{)›Ý‰ÛZY õ së]Çld¶T$z§U¤eW3¯@–Û%ÃG3“vèDkpvv54l‚ÉØV²ž,¾TXÕBsà,핲òÆaÀC
õÒ VÇ¢8¦$zÜ»aŒ$"µAéI½®Ðþ(ÿ +J°ô˜®™õ¨ÈWúh¹kA+à¢*ë Gkt_I³Èd¬Æ‘}‚ITy¢‹@׸oh‰~‡jÑë Å¢™4K5»tkÒVkÎjKÇ—;ïj“1ZK”¨«1e¹uzäà“dÝQÆkÖ5GÒ6,Y®~ÈÌh‹`ôF߯ÑÎÖL-RçS‚>tßÉîYÈóåB3¯hkòªFZ +üêÎë‘ê.3[Šjt®Dõ4—Á<Nž-µ=šoG¥¢ý +ÊßPP<ÅMa%•4`  +éþ¤h +Žq9ÐÇÌm˜•<:èÜ~W›Î*[œ€sÚýµ) 5l¥°Í2ŸÖgµMª“ðؘÌÀx,Qì Z¹å +SyUj“¥ÕÄ´‚/.s Z>S +é¸tŒlË9®HƒSÄ>š=³êwAY¢t6$y¾¨ø,]å-j”²6ýYÙ2£âp!A›m
g|]ϘèC>UvbôFш^›¢ý3¦,ͧ‰…*AæÖåI²£Ùèmm‚ÛÄm-X>F§úö»ÚlÌZ†™)hÝ4õ¬Ä¬•ÃSg|h¦ÜÇ)Céî\cÓk@Ú°‰,BºN¬ÚSÀYŠˆgH +Öowfʬ¹XhôãËV»?"DZ‹ðKM)ÀÄØÙrœÙ¥¥h²r¨6ÿ€*‚ˆ=A°@æ5ºÕµª'«nÂ@w +NÖu@³Šá@‚KÇœcØèL
yÌ‘ØdÿSÃ&’¸3¢»Á¯°éµjîîÄmWéõx꽫ÍÆ(("s‘‘•
£’C³Ì
KÍw¬½s MJßg*ZLpt>ª«eǪM*ÍHƒ
5ø0à´ç«ñ%¢³VÙFYÔË„£³xU-PLvF3¡ˆÊŸöó) ©Èƒ+Æ‚!2@Šaˆ6%i¯‘ΚYy—ùƒkŽÓƒ#úlê7É2hVP˜º”µyˆ5+ÙgÔ€gÚŽ:#`ši¡gê²7ËoKͯIq¶êK-jŽxl‘g/ªé!Ür¥gömŒã‡4ssVwhngXB4 ¥G5«Yˆ•},ÓÅÄÀ°_ŒÉ +Þ°È%p•´ÛoKÝ¥-¹ÄU7,•¨Ç`†×¥Y +\Kê*°û¨¦TÕÂj1¤Ù‘~QšRÙCµbÞÅZ$J¶À5zvVÊ=³Þ`‹ýÁJlö
Ïc6ÛÁi"D¢×„rí`Àa^£Fq@jðʾƒ²@ǪÙü&¡¤•¶}@I‹Zˆ’ÆJRg(O~×â ³«\œ\–ši«›ö6"xrJvBYýÎÑPÒGH|’0¼*àÄ\,‰ƒˆ\l4naçÁEârTÖ‹‹8Ї@.ˆh]k—Äh=+ +¢1ˆé¡ðšÖ²€–†°7¶èoˆò`Á*S ëÃSÍ‚Ìd »É +’»ê¬‚¬k²°ÂPz4³]jÿ'~Ô*Vr†©µœ%• Ö2CPàZ**C™³ìö— î½&6¯§ÏÊtÔ˜ØOD^P?À©ýf\([m–â¬ù£Å˜¸((H÷`Ql6ÓhW‹¶™Å•JÔét}ÂkЬ[«*
äÃ*îÀ‘¼‡€†º‰‰\ìè”ÐI!?b>ì•t毶&£fvA·»Ìp,#Qˆ½Fä†C
+ÆRÏz¨Ðuá4†zò¬ðÞž>µ®«3‘QÀÚÓÑfíØK;Ò“Ü7»®ËXA[ᢵ®›(x±5‡4d24ÃÐÃœ(?qåhq¢@±¡ÂþIÜ,o0)wµò¡W;ONVÖüH=é#w¬€ª“°)ZYcÑ$y0dó¨7Å¡*&HÌÖ†-E-ïœ~X`2ûì`O‡:‡Z¡>êu}Ò,Ów úL¤¿SLÈP÷tÖ4eŠÁ¶a$1Àˆ+º6‹V€Òœ?dëÉÜb@S¢ÀŽƒ@€œ¬&×A!ñÔj=24€GT¶½# úÞé¢ñ"%hÖŠj48ÙvÉÚé…®Âé;ºŒ’Õêºd´ ä!åvVv +Ä@…ç 0Ø·‘Ͳͮƒp‰£û(æˆÄ&vóÆOð(n, ë%`CRj¬Zél5rðᤥ”‘k…¶×¸–U0žh‰+tŽC} +Õ&›‡ÓhÄóå™V['ôrÈ¿ðÄ2“QÅì41hRÍÅYI±ÿË›kãn’‚cR¾¯iZ±1›~èáž“£e«_›#`Ý!»/Èà;sC¢¾qÎþ¡üSz™”~mºRdº%¦™ÓŽ3D§=;+PLÔ¬4»tcãI£
l=úÁ¯e¯C9[#‹G󒢉ÎÃFMr“ÕMàõ©¤«
8j©²+ÿ[ï×®¿åÒ*ï©3Š +÷tF‘@€X ¶=ÆbFåårœÛvIÍêRˆ}3/gùZÄ”ô’%Èr¹>Ëo¤‚Þéa>>¢„žù?°€Þ/«—6ïÐK÷"Õ‚¯:j;l竪4ƒ(uÄì-˜½Wçç€ Ü·GFÑkFuÌú°®Ï8¼Ÿªç³ªð¼h¿5Ðô®QK¶ìØ6heuuOÙ,à!wiHkhɼ„lýüý`Oëøí0.AȤœ<82ë‘s@}n…¤ŸAß®n\"N7$¶³'ß`+‰lþæŽ9¹¢|1´Z†ñÁ#† ‚¡KÈÕCkleò¼‚æý§ÍÙ½)¦†b»¼£„ÔQ"Šõ³êgÅÓ®Ý麒ÞÜ
bt7ëÒ"Õ]£ µY¢ªcçNVªæ‘“EO+Xÿpä|·§)MôrgûÛ¬f—µ{•ž›ëa§XËÞò¢X´jcù¦:I´q¤´Îk íZ[Ý&éc¿ +Cµž&qq>ïÎ;=ª`ÞQï>†Ðš†ï3¬iÄ'{Z"½/CÓ=˜g¥è²5?ç÷–‘nµÀÇMJØ~fû]>‚\JWWô1ãËÈüžeh<˸Í|ÚÝ7:ÿ¸·¶™Ñh;³|hÒáÇ9´ž‡—|ç÷Ž‚Î!tùÝ >ŒÑC(>„Šz#©;ˆ5Å¢ P›_í'ËÇ)ƒÁ[—DÆÿÂéxÃéÒêÍ“ö–7ŠžGa|²&MÔÆólÂ5aÏwMü@áWv G09Tû«'!Ï¥õË‚Âeõ–!ƺ×Ú¡p÷Áže1že1že1že1¶'b罘™9{a¿³&Dzö(›1}¶$ 5]>–3TƒÖ—1Ž° +A›~•¼†k´öKՈǺ
Yuê›>@ýs‰pÚÚ#^-Ø¿5ëÓ9mq]´Ü7ßjˆPê€XcFjÑlU~? ^ˆyjù ×tëA"wöºƒ´°!"žD¡6¡Væ‚ÑÔdAö°^sÍZƒÞ(³ \öZ-ƒu.ÊÈŸÕƉÀ‘Š¾®2ą́UW˜SaÁug†™ô뢵ՑN<x²–l|J(y S¨<§¤lƒÔº³¹óÖ63£Ö¦HE:)™Ì0ÊjLmmM‹ú,áudîlMFquk†žÓ÷ºýHùÈY+;p0ÌÈ;?jÒYW÷b5ò¹ÅºbÞ*ÎߊS
ñ‰ŠÓÊHyrv@0/ÀõA÷I27)øå½ÚTFÊØ£u׬Mkû[vn1osGèE÷¼W:ºc§mÂ4F=g‚µðaœû^lá<a«sÆ®M»“¸³~¾¯¯9.¨Ý~k›™QÛ1&[C`Á9ö'¢6èŸHÕ°Ü™ªõw +~ߦV—T·…Ã(v¸ZŠœÝ1ÔhvÞÚff +Ì L•±®à½ò…œ–šŸ¯y45¬ÊÿÚ!ô„´¦€æ›)±Áûn»`¨µ^L2…*ê³gÉŽ•¼Y{|Q{õRölê5aGTÉOe…Ÿ‚92ž¡†P±öÆÎWtÓxYÕŠž¸·QDu1ãI`ýT2¿1RãP:È--“‰Ïn‚Òð;Ó´½@Ú1þ¸Árçmff%?:qâY€Úi%?’×”ÙÏ:V¤R´™k¿eÄÇÑ9t¯¤B†u3Ô¬7’,«”·0mZsûheŒ›6tOÊ]£bP4.ÀòUfñš.š†áœƒÔ7SF³ÏCcÖ.p¹Z5à)8M¤Ð¬‹ÌÚf•ãõ¡X—QÛA;sX:ˆõBº Î’‡a^ôÐÃ#”ϧŖin³¹³¤¾;øn¿µĮ́§–+¹–1 +ª +ÑÞÕ
™PeÝÈtÄÐI¸È»ðeŠÞ°
†Ó#ç-5ãc5N°øZ>2Z¯%ÈeÖÐÉÖÒXákxd6Á—M i+hpnÁ\_Ú +ŒÂ ±Èë[2ä´òôíøom:>¼uÅöÑ,)-<ÂïÝY¢‘î¸ZF-ârÜÀ»óÖ63£äZ©ZûU0è0/ ¬±kAVºÕlP=k/]æ]ƒV¿ØöA63Ãç`'c·#Òšl™u¡Oœò<Ë”¸ºª8ɳKZRäìšyÓL.j‰ÑME͸àƉÜ{67¼f–W-BÀK(Üsö"5_…µ|mrsëÜÆÆȺÍ"²ÕÏ¡²áµ®µZê£iêîdn/£Öé8nàÝyk›™Q]W`‡ÄàÌU—¼ö's•ážI\J +Õ6¼ÃæúòV›“BÓÈ¢iÎ[¹^?·‡?F¨=ôÖœ—Q¯(y’œ“|»c—3RÕ„˜5#Ê·B²Â×Ya; ]ÓDT4¢‡Šm‹ù†ád‡?(*p‰`Óq›i†j¾'åR0
Í¡„6Žþ«#Hh!¯$ÏÖ‘—:DÑ(CAûƒáìµ”CÍcó¸j%?¼YZöHÈšƒŸ^š:\ÏÚÿƒ1>u
³0m×(ŠÖæG¹yæ3ÑqÖÌ,ëƒ"ÐloÍåöÖ#Vù?·[ïl³2J2ñE¬š£ {_a›š£7lróÓìzDüÙë mêm‰Å$(nU½
#ÌI94 <Mhf˜ð%U̦Q. "Zm$gÕ€×ÑjM²¥NF¦dÑê`ÌÁ˜Ó Î AîóCzuŸ6皆|ŠäbjNÖbòm¸üÜЫæ™0×°‰@vVÝÂtö`Þ@èÅÞt×ÌîDA‚¦á‹U„ÌÂil)sh ¶—¾„µþqLð¾ýÒ6/³>R"ãB Òh«‰ +1†’ýÌIÓ ™å#¢²N=ôc#FŸÍ
!k:2x_!˜·rñGiÓ=Àn
´J”bú¦M£Ðv\`›z–@¤JÆ!Š×T;ÀÙâÂÔSgH2¬!¶‚K^Þ®É-M]Š1öa÷8Ç”Ë: ]•oJdX~K+ë–µCÓÊ-DQ +ü†!æ]Ú†±`«Ù*£ìƒ·TN-óâ]QˆÅض˜JäRIxýˆYãÇL-ª¶–`.¥.ãȹ<٥ŠOfÅÄd*”9’v4¦˜Kšù0Us?i2ïn1p±H6U¸š¸ZIz"Zô9Œs¬iv2m—D¦@£^¢àª*œÚˆMÁùoÅÕ1¸egd-ÄÃþ2ºÆu\ ñÿNææÝZUÃI£ V£ÏÚ˺d5”}”ƒŸ‘ÌŠ³ÂïV$“-x_0›¾ãꕤ2ŸÉYó×i±Ú~œ Tè’³~£†að´Çé3C}ÅñsÓÂø\@[)k™Ìµ…Ó»u!¥¦¨ø`êÞ`ƒ +Q·3T 4~´¶³tǪïbj“·‘áÖH]`EtŽh̃Lòdc#‡i²1ØÚøÐ,<'clA‚KZgÅ'ƒÊ4|^µCQ…¹gºMLð¸×˜†?0êˆQ¿³‡2Œ®¹çw&¨5¡$£A‡ß¦¬ðóå,ÿ?„yÕ`ñoM€ÁºiŸœ¶µ‘"Ct+T[أؿM%ø +ÙÆFÓo;Ù~´Æ¢\!¿xÓ"¦.4Šê4zì_ËixÌÖ>ZŠŠ×Ecw¢fdÙzƒ_Ë|}¤1´¼b=l¿â¢nælmeu#•´,7\adŒºAÐØy¤ÿÖ2ú•kªE‹%Óý©lÓ—}€Š•÷
+©2?þÐWÑÌ»j˜á#ÁP¯pz/ù—WÍ/Á,·Qì¹~#…`á9QxQ×ÈPýX×hS+Ï¡¸ä¯Ö[Ï“Ò6µ;ÖU;éÍà8<–5âtuýÙ£ÆPLRή±n˜¬ÉÇI1–iÓmÉåEõȺsUÚýXHY}e£gì2†J¨5ÛÓk?¼âFe0=þ–ln
—=Œ"ʯ®‚¾J¥²Ü]K’VO@Œ`c:¢\©ïlŽ'Í£§³T¶Á4‹núœÑ¬·=zlµBó³Gí—qõX¤¥vÐÕs{'Î^É×/Þ½yõÆO·îŸ>¿Ÿ»õÕí»ÙÐr“žrôÉûBWÞd^ýbïä{7¾½ñ•àÿ꣤ËÇï\½våÂæµÍríëÙîº\-ÚÓgå¿ÿ{«´¶AíB•æY^Ò¥ä5Kž}ÞVIe³–x™wDøÛòÃ72ôïì™Í?>s››øÚ÷÷²DŒ¯E¿SD1D»@‹1¢¶~–MϦȨÇUÊ~¶p¿^"àhš4nC•Ó)kV¿HRÿN‰ªºêEìJÛµÝ2oÄtIŒÀ¤˜ß5/Áã&4oÃG6ÚÍÖ{=¢öјn1ÍÎ*f^ÈGŠŸY• ¨,~šÇ1Ôª™jc kéO´ô'vÞBYXØæ-=Gøúç÷–=L ˜w‰»|“
ȧ*˜²,Ãf×´lÓ:o3GÆ7Íù0ó.ãywßéüãÞÛæ棽#ìˆEí;s4Ágcç÷Ž +Ϥ½Ó|Ê¢´D{;ørb¤4–mU&ÂW¯ªÁiÀ—“Ï£eN4¢5,¹Ž11~õëœÒ`=zyÑC‡T Ð-ŒƒºêY/ò}I‚–,çìj!ø®Ô/LS +~~ezƒo]Û jxÍ[Éô»8ÝZ„ŽÐ@:¼½z‘uðL"ëàDÖÁ3‰¬Ç¿ø˜‹åuº›áíh
c3%7&tͳç +ˆP¾lŸò T^T<® #Ö‘WŠfî3¤Á.]xgÝ9€µù:=²x÷¢™|M[:`Äy‹û‚KRu§ÍJ¬ÊMÄHÖF±«ÝÈ¢ë9ªhZ·¶±(„Á¨ÇN`ñò‡&h= >„ cÎ +\Ú†%J²JÒÍèLVß
åULújˆ¶û +ûëàÉÑAÈôª•éQ^fžê nÜ¡0*Pß1¦É +„GHÒb8,ÿÊf!AZ7
Ñ›WY¢ÁŒ tÁô 9`Ût8 p:…
¬7I{Û:vo¾oïËš|8¦è¨—ß id&ÇœWí€Ó Ê´CÑJŽä4ñ;˜ÏÄXÚ"çY>ƒÉ#|8(,ƒÐVÌìó\f‡aí/êéÀS¢sh¶œ£ªºÔ(/Ë“Ô€ +¨•Q]d©.ņèÄkÍA4ì +b(€c*AK‰ÅjþËV¢òÄHÓ ÏæÙavmŒ¥äFœ]LÜÊ1gêënq zŸ χãµqC Ú[XT¶†Gë㦎1 ½šýF7ü›U™ÖÁEX01cÁ@úQ
žq\‚2@/Ž)zY¦ÔÏzð£3ƒd,~9œéb´œª³Š³©J!kña WÛ›¢i1²494™9é<‚z´^«~½ÊèÓ¹³Q“Ž‚w_ܦÇ\|`òBK´}`Õ³bS2RsFµ¦¥QüÒî{}_JÃ0òð0ù® vNG¬¸,Òš‚_3›@bkj +À%((Ô»B§ Þ`8:¬ËQƒÄ0Ãøû,vGñƒiPÁ]è„?‹]ÒäDb'K7®·dºÑ¢¶²¯–ÚO
Ã÷/îå1†;êj +4©91³X8I,³fÖì@{YZ +pøKwt"C+³ >A¹3]DÎaÅ(m¸ˆó€`ø"@0½I)`dº'G¢\Œˆ|ë?ímhõSôâ^¾¸—LJ¶aCãq%k®}Kð˜ëÝ(mÍËʯ”Ký†27†A¡€QP‹Ý ¡:Ūù +麷5PU2‘!µÆª§¾j¬ +0{äj$£ò ©ª¡˜å=¤ïÉ,Œº<›"#>ìeâGn!ÈèËOgÇï¬O/ñ`œÍ0HZ6Ñ’ÏM뜦þÏê)ÙlE€»â¬¨#L8묊ªf +‚koÓõ°¿’ås!&–²¿G“µ»~¢Š +UæÝ6°ªÅÅÞÝÍ<Ç’°Lö»>Y ‘€É@u9ea*´ŽI}X•lfD@Ýœ}Œ[Pœ—U¸ªLoAƒ$t*XiO~(ùdÚƒ)4Áªp¶ÂÝ`5L=ô“šy)î±ÚPåùaL*5sçm<fPG·kÒ÷ïòJ…ÿPëgCºJdNu™Zøã³g™:ïÔÕاUœØxÕñ+r¯ Lʈ +ÍÀˆ‚U¨ŸQz¶q&²\^pïý!!7`–¼ï‡Š;ôM'ÌTQZlMЊÎņ6)˜6c÷oU:OÊúÀg•2–âÒT®qðY …öǾ2]~†IúÚkýÞZ -d^RC6WsŸªj@êÇb±W/R¢4•Ž·Ô'³oFh(óLMóÓµ2Ô~ -
PS<íbÕ¶"}äZ»—ò1¬ÖÞ…„ô}‘Y¥˜NHhTv 4.¥©©ì”C³Dà +-Z…ö›®@VØTf$šNGª‹àtÓ†QO°»X®g±ÿTrbª$Åç“j;MºD!ë¶HºÚ&©®Dmm¥!à–þT_*'rêÏSÙIl0ŸSOšX‹øO¥acïdÕð:y½ÀTOê8„ò€{ˆâ.TW%&!ʵÌEEÕ© Ð!ƒ%©¨_®DAyµÕ€šøi˜FÆÙÈRT¢T¤R>oÖBò³0gÒ€²†¼Q"EÙ™p‘[GðÄ"©Vu ”¬ -ÀHEc«®ÀIÑÞaŠÊEŒúh/Êg!µB=±d?Õ·+œj”‰¦ŸŠ³Ly«’yY.'š’R3±ˆùH6@µ -4
xº¬€Å¬ÎN«âXT3"”½ -ÈÔ¬HñÄŽD8`‘+Ä1}A…cÀ6º˜G8UKúFκ+ÄHÌÐâŒxÛrµ+ˆ§&˜²ÛŠè
õ)vN> ú,Æ‹²S5ì„…g|ªFÐQ¡^ØqÄh$|>‹4…dz®#tÊs”œ^’þµW®À5’$VÁ˜&QvGkÜ -©p|?ót5H‡¤e®HÙÎ%ÚRäº}äßd»SŽêjIÔ¢*·Ô)‡Çé4¬É5Ä8¼õdTw9•Ìú*n©j(G¶Ÿ¬¿ßdÕÖ(÷Û· Ëé*lºPmX9´ªQ¾kšEæÑåBÖ#ÎÁt¢’Ë)ôªÔm¼Wõ Ø£uVýáöìíÛEeŒwûÕÇØÔuElXlá4ç«ðQ#EÑ‹+‹ˆ-iñ’bOnµû&&9¹Õ[ÃA-B¶¦Ë×5;8Š€«nR$^C”<GWLÌÐ(PnŠbþ$6Æœ/9¹Dz)Hg¿o&ÊìOlU…}4b(Õle*8‘¹L
…u$1ù‚ÓÁÍlÝ÷œ-ñSŠDyßÑr`Û>è’àáÉaìGäZÒG4h©i‡¦VDžÆ&†Î› -G:pšnËe4º‡%,Âë(R
—bu+Ñ)‚xæ¯ÏZ˜—$±vgR“XÔcùN̤0CV|ñˆ;)ÏÁRãT-ÄRƒ?¼V<åðFW¦Â ãˆXåžÕhMiä°`ñ(ä$à'xñ¸‡^ `‡¼.M#}½hôò~“bÚy’ã$. ?ÉFnˆ®÷!Sbš‰šê#%¨ùÍ‘KT#]¼ýïbËŠXÍ‘EDò©DÁÖ8…”*¸ÉfO^W„Ü» -ÖCµ!÷‹HudáüT7éUÌG'ɺ8rðŠg‚q2Š4Ð!Â…K—p‘& ºw²”bæMîÍFJ°©Ž“Æ•£–.'[”v¡_¦Œâà4¬ÇxßÚ>‹Ù‚ë°Yu/¨ø”Êv|ZÛ*€EŽ#Y´÷® ò¡O’<ˆiؼ4/TÙ -KD-Žé2Âá„‹KW|PåÄ1‹Ì”¯/æB‡B›<…I,Aʤ~òªÙ(<—IäÉF>rýg´Ú8my½É;é. °T-Ùr‹~ùìõzöö¼øÏ*8Åöᢟ}MGÒ›‚“ãÅfKÎ(*,E¹H†‚g
'@ÑúÞ>‰¨(µ¯h²OX#îå¬ ÌVn˜Qb,Êÿ?{oº$Çqf‰Þà;¤Ùµ#mº@÷ðX¦M?HPìÑ4(âÒ´4mc²B¡HV«XUZžþÆY>Ȫ T¢Rœ…ôÊôôððå[Îwθ¥GfÂ^Žbm5Õ—©Þd–§OÚL.|¦§¡Qt"€T_@µ²…´’4ŽT¢0*о"»è[Ñ?“wºH2fCˆ¦Yu1~2Î0‡Ÿ8Ó‰fó“²61bxâ××^š‰1!r&åêÎ $c„]*7æ*b`¦êCt^ù$QJ7÷$áÅøC«S¤ÕÖ2ÑL“†äqêö_èr–™ˆ²+AµAÌt¡¶üÙ&/#`Ó{%î8îù©®5 -Š3ʬÌ÷‘PX¢ ì]"T†ø‹Ç®Ùƨ
„>GA³h΢oƒG®7–˜Ð•ªà¬q3µ×Ì£A¦3PóÝZ=Gñ…ÉàM—×AtS4ªÆŒé½Œª¨®Ÿ£¶bÖZ3ê -ø®®"4kÅG1éJg!:öŽ|Ë^ó4®¹ÒþO¢®ªhè÷‘P$[“âdeˆx*9¬¡3Áê§ãž‚0b×)ï§ihÌ!%Ô߀Ië2 -mvq™£„bY|E7³#1"[báIÜDLipÜzî€0£n6ŽîÁxh¨ñ'&£ôËõ`Bð¨Aäå=tY«d"ØÍUÉûD@W5àæûÄú}Î0€.Ü,“›¼?CŠ[ý‘ɦÐØ‹xZü6"×ÄŽbCĶe…âAFߪÝúÙXÀΰ
5.wC\ -hTy -yì´ÝP³}‰Ønøl -35ÂÔØϱ[™Œ:ÝzØñ£ÇjšiÖ¹êD)dýP[0•ŸCuTŠÂUÂuLÛ«òJø7‚
ô„Ën’²&›
‰D£e3Qï¡ 3
æ8óÔ QaÚÒ¯’µ×ƒGWdÍ0Õì¸TbO=9&aì“ôMaiù0îAÕ3i@ÚÈǶ!#Ó<GP²AÑH2Ù…¦KflS9VÃä{ŠVääOÓNf"¤Ô£(š—#8š'J¹Ye’hË|<#ãH2§Npz` 4ºI‹\6«¹O‡,³MÙP?qs×ËÊ–†¬ÛÄ…Â_áјU[z»ªwu¢¨Šã\³=3ï$²'69ç)®˜î,±Y)oNd¯ѵyd‡åï"SõŽÇâ÷`cîÜè¨ßC'sÏê1ayYhçÌKÐÉ¡QÊÍØç$ôls0nž¥mœ7Z妣q²ÍÂÓcì|&”Ñbš4d
—€ésó+É$ ïÇa¾Ç΃Ͼs -à”[EIi.0~vdœkž
ÁžDa@ê–•ã±›gÙ¨…8ÿ¬N]¿‡OJ×–ÀÛý!‰9îÁ°©t FWŽãì#JƒžbÛ¡e–À’6n\9Uæ Ý’7=~A*g³¦´Ã/Wï¥N‚ž<æ$~ æ¹5š¬Y0¬`³ü¾Õ]cbÆX²f&a£q=´$Ì -äú.Z:·ÄÁ‡F0$ó±·,£Ù'AÀÕX}¢'Uð¡r¶‰Ì -ûòX¶\M’ñçº;Ñ<Mu½c{v‹æöký¦ä«—LÊ2@Æ‘)ÈTÝ0søÛd-”]jjßØ©zT”&IrÑ8ŽEj™÷0¬–ÛºF$‡°¼cßYÉ‚:oÐë;°Mf‹ïF yøæ$í5Ön²NÁèÕ6½¦ø¬.s4º¢Ÿ\6dôÚ®PV˜$1·mD_¯Ò©†qIÛU›oŒï7ÚvÔ¢«¬óÂ’$Y×rüh’GzbžœûÎœaýƶèS”AÑð#Moï0ï~ðJèëðd݃R±ÅÚ®ëŠHŠÚféP<‰fÞïhf¹ykVi
–zŠ•X[Å=‰(§p1l”ÛbòÌ@¢0xA׫ÍÚO?ÚPƒ›&û–\‰Aô!±I«-lKÔÿ¦lnBõ‰_P²Ÿ»ÚUê"äDÞàܨVâzÅB{³ í¾Ø©¨l¡?6‡8ÊÎÒÔ™k…Ôkê oI®N~tˆÊ„³Eô‡ª³n -fÆÜ<è\°½8Kw=‘¡·IçR(†¢¦ØH¹¶àE‘ æ<D¸¦ÅÆ›z(huĈùwV¹-ˆŽL‹Lqf‘MFú€-T3÷Ž|ç¾´@
Œ¾¨Ž¤™!ÈÉtÿ#|Ó1´‰_ce``L=::Víª3(£|OŠŠ?~rª-6U}2ªƒà÷7¯£`Œ%~nålº–£Y¯x:V-·Á©Laí¶¥0í}}œAe”®¯¶?% Ñ(n’VÀ1j¹Ô«›mñ¢>¬Dm¶g‰Z2Õä€xnê‚ó„—™Žk -àÑ%K‰vT)u…}Šã•ãìXåhîœ ³™ƒ¦Gk̤výV
«ƒë.Ü`„«¨/sÔ&"ʪ`0óA—Í®+Þ<fõCžmÙ›¶_¢¡ö[S“1ˆ HLR ‡*8¤ûä]Rò(ÇYõX|‹c\8HŽZˆ{X. ->—Epa²4ùc@É¢ì$ß©Q9m>~r¦ÑB„ÛKû×Z¢—’îIž*® -SÞ0ìˆdçb3ÎQBú×Íâ¢C~ºY/hž³ÓÖcl¶Ò¼C+ -ñÕ<‹@Å‚.v†¹sd†}Ãmi°áàŸºHÄ6Æ|4w5Æ/T¹ó^>à“•OÝ4DÏ\G¯£:ÉK`³–Î b— -ŠðadiÆÕ«D©gÖ¯`}ÑdošJ\œ™7 ¿]ã6„¥`êÇŽñöª=mW£_¨@À 0‹Òìþš,®R_×ÉYrs,¨VA^B§wÍ°²Äz0·3y—òë‚ë„@ƒ)»,ÔF£; Ú¦{1BÌÄÄÕ¸¸/NCöm›ÐÆ™üY¼ÿ˜iŠx•F|w-oÍ$¹h¦9›ÁËñ$šÅ¶1ƒ·umÌ ìIW³‚4ZÁ-ÍRÄãD¢ï‰ç¬6—¯ïœÈéaS»åwÐlõ9˜ä¦ší„¹RZLrÐ6EÚTsLÈ Ô±Òhƒj‰(ŠP27Š> ³a®x ›.˜ïjº¤¸}SŽMƽ8¢Æû#ÂcÝWóÈÒ"%/h;ÇúXåHSˆV,iæG’¢Ô¨òÉ&Eêo04¡]&hr1”‚¥öñzâØ4ËM4÷òF—f–\ªyVDÕXÊÞ¢âÐÖ#íÿ:)Óã%mO…€2˱<>"ãI.9Ðu -éÒ¬‚ÈÉ2v0{ÎÁí`r‹5ä†áÈdï©¿bs§}9´ÍZYâì`‡åê2|ÉÚú~‘`•ýg“õ¢0]¨‹>Ög?‰Ü…×?Õ~ùýÞlŒ|‘e0¿x‰EÂBCc`°zÝ®ê øËÇ9>ká\2!CÜGµ3²JaØUëxI–!¶`tuCá;„¡^É.èïÎ>6("×èØ{f®ªEáØŒ©a Š÷\/м»IÚU+ÅÜfÕ;×ÔÞ••@—-Æ3ಖSÄX§&ý^Î¥a ´Ö‚±t”#;© -.¸>'¯&þ2ÇÊ‚!:¸foPrS îðˆ0šç -ú~ŒªÓÒìÚ)5
ƒÄŽ£ýÄŠ 6š/=°0Á©õU:Ó阫´šZ†Õì1F©â5,öG$5s¼š$&í¾Û¬Â‘åT£V·-i|–7Ê)åR_ZyjeÇ;@®XVwo¯#VyÙhEü,=LP)ö1‚Òv"\§Y²@±Y.¬³ß¨Ð›ÍÆ)èjˆYㅈϢ³°Ï߇™’SãÍçêk•Íò`„½&CZ«Âûˆ,FÂQC@)X…rõß´!DVœB´w‰+Šâ*\Ý|ã"ï°.*nÆ)iàJ -–‹.?’ª+ž@ŒŠñ1±xÄ( ÿ>GBÉ<FàpA9æeVNŽlE^08¬ã™´*žõ¹—À)mnÃ9ÐXk5(whšæ0Œßää¶îBÈKï0´ßÿ¥Ñ«èCÙÑ5%‡Ð¸JØj2ዽf9çúþH8ï%BÁÒJ‘Õà6ý fU -p -MM½éMz¦-¡Ð²Àö*XŽ, -2÷ظl¾¦2 =ãØxH)æE7„·’HldJ§¥HX!QÏ~AZ‹‚^€'çÈ/Éi¨wd߸ -u;XÚˆAïÉ©vRÃ[Ÿ†ÙæôIa¸ˆÒ@1>û£éÇØÊÆÙka€E$c§k@ØWgÀµ£÷ %QSñÌ¢HEí ÌM"bSœQc ÃѬ4˜T&€#ñ¹ ‘ÝÞ¿&ánv·A9Y3ŽÐšRE „ßý2[Íš—,–Õ#)93ã$J]~$ä¥/·H7Á>¹ùfÈæ–ÝœEÍLyp±Iâß&Ï 7E*³,·˜êÀ9šD² -4š©Ð—»YmÙÒÛAvÆJƒÎÈ d4ªA#“nlôzã'‹?ɤž:è„¿ -¢4¹F„Æœ/ôÁTVŠVä®'£þë}l,ë]².Lç¨h?SúI‹¦£EuUñPÂí¢jû”9öåWC<@¹ˆÇ’'ˆWq‰
Æð¡94Jº -k
Œ8¯Áû+q†¡Y¥ Îë]"64Òj懛K4ÁAb2 •.д@#ºÎ7ÐràI5nž$8ûmƒ(âHT#|ÜhUÊÍÝ´¶Š¾÷BêO<=£Ð;w‚Í’ÏÐåÚšÍ
´kW»U‹‘™¡Å~1íñ6éØ»®Ál—›‚Õd7оƻì7I+V¶æò¤ÄE=4‰Q^šF`åC—Ëž>¡Šˆ¦ê,ÅVJc -ÎÔZ1Âß¹,º¢4—X¬4Ë\LMš.òrŽ0›!ŠÚ¹ñ\ÎáhZŽh›>ömgRÍóèêÉ$q -:Šb?‚©Û›"®Ä9×;ªïg)]èPUí"ã4IyQ`"5&ÇÀ¤6eWÈàÆ™ÐÅŸ:N+K&ÅšÃýŸVž2Q‚jÍZ¶Kj0µøH\¾I<QñýΤ IûõI4ëðBóàÎfÖ0±y4x•á*2K‰ÊÒ\Y±ÖN;[£8½Y•8ÑÌ—ƒVœîOÜ:úûLQE£ý-àaà›kƒÕ3yEÊt†]ä ÕÜ4ç‘4“Ëm9ÄB:&yœPékDbSŸœ’…CDpEôuÔ,àr«Œu”£&FÁÌdWYW]~YBÇÔrëðÐÇágÍV5M_¹·´x"’39‼xÞÆ!\=‡Ð&$a÷k²šƒ‘‹½Ù6¸KüX<6k9uxRq¯µºµHO·5CäüÓ°öa÷ŘRâB£ààÎYaƒò•>g»¡nNž1*÷`{G¯qet‚ķ桹‹s¿¶&÷Ì÷Ц‡ë6î"a)Äf<±5À{pjruÔ'Q̹”àÎíÊìO’u±½á¹w(šæ¶Í²9‹7K½RÝÁY»pã:AQ ëÒÙóÉŸŠËçS -ÙŽÐ!¨Ú S3¸”'cPµA„º÷Áè4ãÜ*ŸX¨šG,H„à$¶Ac#{E[“fÐcŒRÜ‘šFö‘+«^vMî¥.Äuz¸º¹g|¢q`„YZ:ý6Ü}⎂e Rd4¥ÝU×ó«¨99ý2ÞG•³eA›T>”‰ -J#¶ä\-eBÂɪRFAð>ËW¥Q®Ü€Ð¼±0u -"ÆóûH2¥hx$ÇqêP‹Ëéã'qÝ+#Q»Þâвà°MÄ‘Žlh~×Ê觰”¥..¶ìäæ`#K‘˜àûê©Mù/û+n¸p‰ê2³)¾_ã*©Dy“mCº|jœÛŽf1t#yØ÷ÞL¬ák&%6„_²Ø à¡“ëC,¹ašÝÆ$¯f¶ÔˆÍÙTˆCL“«3a+-C,„Ó»"¡àLNRjpˆ¨/%UªÙê²@á‘kéçÍNu](Ïð¦ÑÁšTgN[YW&§@¾+‡;•u¡âQ——ê”ÈŒ¡ÔF•‚smëìó’: -áàJ,Ä,?±s®x®‘m+@f±#½ -çdš]ázýC>/4e—KÙt!¤DHK–G…š)¤ehH(£èkr–ln‹£XÅÏ*ËWÚ˜g:á?“@ãƒ*I…É™ÌÙM% € -Ræ0÷J¸½#Üi³\ÔS‡ÉîkCh!]f·!MUë~ˆò’›À±A¦©å¨|CJÚ>aMp²k_V©.Ûì]jrÊ’Ñ–CÇ/ÑÚS³ý)}RÎ4ç°&muý“1žíE¤£ÊáñU,A<N¬,u##ÒËXÐ.j’:Q‰ÔwJÎ+Fè
¾Åñɺ‡zÃQ@5v.qdîˆ -I†Î€†¤sl¾c¶µ´:Þ -øÃ’G¯¤ÆgûÔ;TW⬆ÍjBZ_iî™Å82z?ɨ„< œ†[ÌeÕ³öµ÷Òçlø,dU"§)N#xº’ -„š]q‹êa(|icy\RPVåRxЧqíÀK”ïVàë¨Ô&b™9z0Fe‡©´•“ëÙ£d.ço„Ï€.*”£ëmkTÙˆà=ìn˜¹ô{¡°eä
‚KDõ_ÍîHø‰ÁÅ}¬WÑz¡¶n>zBV¥¨%UÜÇeØEÚ½DlÍÁ.eg©‘ÙA¥ç)àÚ.Ä×—wàFMíúÑfNÆÌð4è'S(‡£ä·%K~7÷¨*Ô“åæmG -k+¹‹").)ƒ^l׺Â:ë¢æ¥êrÐÝç
1¡È}º„‹hž:‘£ËÛh‰„¡ÈªQc–’í–šàüR{J30•Z̬YZç<«ÒÒj”V&“á¯K96™84×RýYép±Wahîà1y£’ù¾ÿo~òâêùéî“ëÛ//Ÿß~»ûôúÕÍ·»_]]D~ÄåUüæéÿ”úei,§XZþ7¥òyÚÿ_§¿¤Å:Y6ñχå`/Kþ³e7ôüÓ -8E9èûÀ¡t)}dªÃ²HÑBaÐyã™ -’ç9ʯp¢ -kƒžÃÑú¯’ùª%âýN=‘¹.§Pð¢fÜý%É ‰Ž2ø…n;/8n`q6Åw÷Ñ9…EªÂaþ®¹á°ku+ ‹íÁÜØã>_væ‘RXÌ.â9©Ìƒ‹’ïÏYg§°Ì{ÅX6Ù(e’ŽÂlÕNqñÇÛG²‹uÁg˱“êa‘´™µ™Ì^,,ŠmoóTd+tÞOð.Ü–ê…ž¸J@SúÞ+’’BäÍ"Ø|±C²2PRå’³•cO²`Iµê§?<cOö<õWNïZ -¡flÜ'öXhÆÚhós Y·¼¶ÑgO7VÂŽÁ0GÞ–qÞarY©À”!t€×žCC÷m• ÇD¬VRÞòžC]2mk @F -š€BÖb&F>7Fƹðüƒ]÷)Í€¤Ãòμ»y¯vz4Vn° =Àš84ÄC˜øUÅ·.Yðß—‡V™ÁC]|¶úÅšÞ¸m‡jĬ¼°l#Õ+à TéE3h¢<
Þ–ˆ{pIàøhxW©u": ® -"`ÄgD«²D¼ih„™¬0²]à”tíà ïUŒBÎ$F”{ˆÍšâê\³rá;QiB\ªa×®‰¸+˜ -ä'…(Óh†çO‚Œ -2㔎±«B‹õ!ÝÍLq/] Nxò -Å‚Xřݦõô>—Ɔw¡=à‚)„+×ÜNfÒóÇxöë@:¿ F݇Ç"þß‚Êðß -ñŽE±k„¢3‰¸ñTM]NTUH^`¤'ö H8±üþ¬Ë@âp- ÀiV ø|€É9_lÀqt3S:ÑŸ°C£©«Ž¥`¹ca d ÒA'×ú)ÃæxÛøY“pF>Pò0kR¦!@Øâäìż˜I\„y8½ --x½W|ªWçÁu¤!ÆÔgÍ@LŸ¥'Â×âŠx;ã è
œØIPyÖ@‰Òä»^ë…'žŽ¨žìõXçv¡±)6ÓžõGzÁBU"'‡˜Ã
X²ö±G ÞPöëÑB#ig}¶AõgCKç̵¦°£à.öé#¡YÀøÕË×Â|Ri¨„ƒŽ–`Q~WP‘’¢°µy^z¬Jœcô""Yš§6ýHvèá¡)h—•·CéÝi—çÖAÑ -&¬[ç(è¾Hƒ\Pfnš5IZaT)‹é3òxÊ”ÁšÛ[@ïÞgu½F -TGZsm•¤íÇ«·¤uißÙ(Ð ß7«–ØÁy¡ÑénîÝ:>t󴽡†ž‡nví_„¿ - "1‰íǬ¼¸4¦¶8{mФì×,é±æ‚ó–¹ïÞ´Æ‘5˜æ½â$ˆt¡".\^3Ðù}ûÖA‰Z -XÂpDG5ƒx®vÃE
õ¾l›#µK%@4Úï~öA'±ö/ÿòrìÁ„;O-"½¶íúF¥ÉØÎ(bìµnãþVñãÞgqŠëìßôº6j -ÇñÖD¸¸×œj‰˜dž°{Ib¡Æ:éDpc$s%´÷ÙѼ{½n9‚x²µÙ´ ›Nû†‡Ü Pýþ`÷>»>ÖÚ鈩)–ªã”MµE£uPG›Œ²žl´VC¨ôÁZc\7©“}»ùìâr³Žc¯×µQˆï¯q[¬}6íï«üðv¬›ÏnŸ5:½ûü1/}\£ÙB11öA‘šÝŽ«‘ÚdhòA(4q
dlßb^DǓΧhÐ2ÍhlæEY<¨\†Ÿje\Òƒª4ºáƒaÌ-ä-[6w+šY‘¡÷oÍB¿3˜šAw©5.íGkuçŸ~rròêâ««["ï6`¹w¿ -0št›Qã":ù8±éÙ94¬·“[A*2„£¬QÃ_Ú=’773«£?Ö&GrÚäUB™Íaèã·ªÖrm†k«É-»eåFßm¹xòW|±Þö“n~¤÷ò®²ð…®fv$;5ªÍFs`ÊŽ›tدsE¶Ÿ¾-æ/¥ÕqGxÏk[Ê@©Wß®„SÂô¨j_ðÃ#gjëÜ,A”E4„¤ óO²*wùÁ)ø±¶;·Y—å3Æü®›Úì©ôeËèMMV’˜ô9×ÌìÜ«MHºL±qºö‚òßß8ì€>[núéú1]Z9ȃ4¬äF+ñ27Àp¬íîÍÁ{t.%\Óèí6MF«ÕÅqœµ·G‰÷hoÖ#/»e¬:S•ïuÐ5ci -žQet\‰Ô’7Z6–A‘Y†ðˆ×!8íiÈöyÒÆ?vñ}Û_)Ü4_BwýÇ:•džK;§!žÂŸzÌqïÑ×
[Z´^5å»ÑØ"k¤~ãûÛ©Ò¯ü`1“Õ®rÝø¾8x*8¨h”ma+“«ø `’½}þT1r©1SÞ?Õɧ¾?ïÏ™?LVÚà š—‹{Í,ÛRcí»{·5Žsí7ƒIý\î|Ì_ñÙÖ붑#ˆÖæ)lµµ×ÒÜÒ͚Ǿ?ڽϮÏÕz½7aF¦øÁ
T§v"¬Í›MíŠC‚Z1&7Æv¶k¼ýl6¹ø^ŸÛFþ~¤ÐÝœÓöDXn$T÷Gq$p¬ÛO¶gÚöyïù11IîîW°ÊA‹ AÔHÛfÈh"ÀÎP;#íÈã˜MêîvºUÜp9“‹‘½Ñ®~ÊKpŸy2è\]_{”'~ì~Ç”õ‰ ŽàRš±AA¢E8ˆ‘§©D¬T¢‰ŒÖÎCd¥rÎbÁV)úâ³LO«×*˦¬AüÔLË -aš)‚mÈv<ŒK~Ô9$0uj)•©…y<‡G1ß“|cÑ`|ƒ?§ •Dr)ÍÕnYÇ øŠ›{¤”c`—+…õxùÕ0¡W¿2»9»ýäÛi‚î2^PcƉ ƒC¦ÃHÛ`ŽÛ1R{c´—óÅôÚ‘3ÚJ{”`…%Ñù^ -ߨë"Έy„·Æhƒ5)á®Õ÷kí,tìÆS‚hè$Î)?ºv©É÷íbÇ[`…ùÎÛT‹T'ɼ¶í`.‡Ylû¶KÈtÊm -Žsâ´•)‡1*F$ŠAÂÂAÑ£Õ
-‹^qà„wh¨šÏU˜Ð©¡"Æ@M2ä/K1vfðâ -zR9 -î-]*\à>¦)?ª°ðˆX?Ó“aëý¾¬ŠaÖ)2p80€vÄZOp˜C¹–Éw©¬H•‹ÈS¿¡Y:,Xv]³V)²=ª’κY6Z—ô¶Äó0Æâ:\LLûhdU©tMˈXÌŽî@꤄z§ &,*j‰÷ï"…ÍOM®eH8¹N%í/ÊÅñ Þ©®˜ØÀ•YÔ |G¦>·ªþ&Lv/*%QOîì>ò"£áà -¶%Õ䵃G¢Ÿ“U£‚¡PXr4Á¦ -¥[À»YoC²÷¹¶ýGY2W¸¼¢.!tLS -Z±õ„VÇ>î³1 -3A–žs0Ê–>j0M¨-¯cÛ´ÈÙúƒ÷&-N£@ÁÎ’2ê7@õ¤’sñÄÅ>“â•ÚD}Ôü Æ#Q@ùëV÷éB9¦!œ‰Ð³ì%®óxusTkÒ›@£M™îE -Iô9JÖIÇ9ëÆ™›;‹8D$ -ÔÛ[Z–[†iž˜ggIÿéŸöq -‘ -FÑPãdNȪç¢À™œ8“÷")¯ -øq"È-27FVÿŽ©‰ų́·GâD¬À£C:êÌl1Z‹áˆ°^æ5H2R ì;jCKÜÝB&àÞ´’¦óÂ2ÃI½q\½Hôî\rTOå‹caç8£H{ -‚uV›œD‚v^¶,,©ä– ZDð-÷Û¥~‘M¸Ò¬¨#Hê©HZ„k¢gèVòVÞøþÁÙz"£ÓGäcq½|ÃÑ€ˆ— ?ƒ“àsNNQ!· -ž—<ÏvJ"OˆµªìFDT½à»à‡¡‘µYoŠ£YF½7ó(êŽ4‡ÞË>:ßkÚËUÙ1 ¨H5ÂÑG/+„®‰v@§8RìDØÃf‡^ÄÙ3…ã:87‡P0ú§•ŠB[üÎòi÷dfõVï{!æt`©EbB -tNgœ„o<| eÐد$QAL%N:"HM”Ç*5Zt°†ß]koÃÁ”¡‚°ïnÄ#åçƒîÏ‚LÈ+Ô6éjmˆð/ƒrƒHI™Gå´jÅ1MÈ£dµ4ÒP–a Ì&]tÐM˜¬‹U‡äfu®V„2Ö埲 nmâÁdP<ûl‰ãþQ4¼±½«ïDLí›E'ðžAˆ+ƒç«îUÅ›… «Yf̺ð’À±SrÜôaÞ°ãÜ+á)®KF$¨’T`\i…›OÄEŸVó("Rø0¢²AvÇT
—Å0˜Ç¯ó)†»µk³™âê¦ìQ¿Fï°øó6k&ð2Ý&ðC²„j±r¢ÃË 6Ø„T¨§¹ÂJ¥Ú’;“h@ÌýºÌ’ àö*`3m¹ù™L‰#ÉgzÍIUl‹¾1J™ƒ¸HJ0ÍG¯×b(UÝ'œ¥ÉBa=%ÓC©¶<sŒ2<ªèLûÁaO6AV¸évC~™Bÿ²úå03¡CÚrê[L~Ž#”ñ{û!lÖYõšGÕ ’ígƒ9ݦN!4Ýq’tÍÑHD˘Ê!ùPßTºnîÍÛ<ê®Ó
—%–&GX²öÔò™³s!¦ -ò7¬x:™w°Œgâ¹ k[#c\‰,ÎTÀAwág.fíOMHX(úNÜ1a çc¥óÒ; I뛪&mt‹ªºæ§º?eûÁûÍÂqàÀðŠzF'(Ea•1Dï«#ÝPmSLIùʹZÚmDehýÏ#·¥Ü5¼ðQ·f{bÆ»DÑ5néËR¸S×›r<TÓËÀ…îb°M…}sw¯1ºåYéË (7'‡2Zü -15z§‰†ðšfj€7¸I¥±)σ,ß¡eEH±'†+›¼ÀÓ[áàë…C_ÏNjÖy.Së/;|®Cðµ§ÕåÁpÍZ¿‡R8¤cZȘ̩¢ DE¿†EÒdŽaê‡UmZ/4›š±E§Pž#îz8LÁÎëÉ»jñžSä“&« ð›ÁòÚ¢ïˆâöÑ9ý*´ý¬yc¿°!¿l6>JDîd¯e<l>5ígJ*ŸÖÐHßIsN(Ô9‡üJ‘X-`g.9ÌA„Nx¯×£ê`r›Šfu‘[±w*š‘\èJj+Ç“ÆÁ:¾„¬ô¯ê -Ðrô\šæS'!YGÙØK¬œ<²@ &“õ`‰ç}³K*P-.‘°‚R-û–jÂ!>§>Z¹™Ò˜"<CªR ›’lMZÙÅÒd´—û8ða:v-/e¢%Xžs¸àq½Þð!€¶Aý¤q4‡¥óTl --)gj
HãhQivÄ×L‹<×Þ##5×t -Ñ9.¤]š)#â -vÍÔ]cŒ…³[{¶7Æ0[2ioñlÿ䣧ùµÊüMc¤m#@2íµ?œ‰Ì¥ÑS -W‚tÀzvr%§±l/ú»èû’‰SŠ1Ç}¿!gC¦‡*Шöwd·ÁÃð}¾ª»‰žúÁk&å‚©ßÜQŒ"ê…ˆÚy;M%b*Q#…Š2a9ÃFÌ"#œ¹·B»øh‹«¾ûÌ
¹%gñÌ*ùïÈökºYr%î<+_°*.‚w(-RÙû,ÆÆ‹½p3ïGfYƒ0)´*¹ÄÜ¢ƒXé€× -ÅeMQì!T>¥DÍØÛ‘0Ì{X;X8C .pdm5| -уAÁèýx6SmCäcPFa…&ˆrÝû‚¯óbφL´Êب›Zc`ðh2mJp^º¼ÿø¬5}´±HŠ’t‰u2´ôsDj˜ÜÐg‰¨ïåËâÊ‹]³¬–WÚ3…µÙEI“ÂÇ5ì7b©%ê¡*L§×4Þ‹‚0uŒ°Àä³–€¯§ªêæe‚…¾ôHœz.9ÐËC ¹fÊ -_‰›P¹.BdÅþ†8%ïx|ˆ¥H¶µÅ^dÄ@cHBd(ºb¶5Q£‰o?'Û(|\J¸õ-蜨"ˤñDëÚl&ôy…S?6)ê,l#¤ž€À™¶8ÿ¶`z#Õi³9…A…lå5Òzõ£´Du8×r™D§2D¤‘f׸æÐcØͯ•: Cã`éíºzRj¶•î±Ô½VB¥†PYP²ÅAÚirÖ2,;ÂÑì'Èn+w/‰›Ùm®ñ¶¾ZVêP£¤E–ÕYõʼ[•ÂQYaQhéÑz™º -z±á³Q3Û‡þIªá ·âŘòf†QÏ!,x’Âdèý¬ÚEe -a -ц’#Á¥@2Œ,™¤™G¼VZ”+ËmºÓ4·î¸±¥GdåEù”ù·åRúj˜V›Dg¡ñÙ1,vGNœ«ûjÆßÁñ®vx`?"©Ð=*váy
Ç@cq°·xßo$&0‹]ä¤húðS-&²ù¾ÓÇä‘Á€*ÅEän={hÕ,ó² %¿š©b§-Gz«”&ÚÜõ¯Q€´ÅùV©ŠÆqÔ
•äÕD&Ž%½*?0,—¼Ã{Ïc̘ËùÃæŠYŸƒ‹a áÄЖ’ØL"&˜6”¼o•ãËI -lOarÝ#ý핾¹€¡ßëUÖ‡´:ój1²dÆ=¦&ÞFÝê#‡Yà:2l -ƒAÔ\6˜³s÷Œï -¨Ò‘Ñ0°`w‘¥êk«}i$óx½“ITJðJœ0ð"c‡ÈN.ÄãuË7LöE1á™\ÒÐQìÉÔ‘¤0ˆ±‘¸3ÊVj!ÚÜ ªÃàÏ’²^ÓXIÍ&(e¸¬SS|ᚦÓÔÀ(ØunâWÆ¡úW¹Fröž
%9 -1”ï[lrZNÅ—Âf¬Ÿè ¼§!ÄAgUm}¦1â°›Ç*ƒ{¡¤Z„D‰ -3Œíg²ñ„³4ÀQ»;6äI%s -ë‡Å}ŠëQ´ø(¨TÀËBòΘ‹.Ö/âªUXN …ßàHˆÚ†€¦2•Ýöz¥å+\+Z™#ªÜèi@dí15räÖa°Ž¬†ÄtÄ'æ<nI) -B΂ԮýoP`
dŠ³„îŽFF -û^/48ìÀ!UzjZ22X•Š×zèf.«d ªmÞ™¤>Äù‰>5!ñj:é\¹¨ÀŽQƒà‰ŠL,PüÖzÐ]¥ÄNÊŠo)`"®º5ŸÞ3s«˜\©…Õ=EXÚ@nPµZÚ/nZã<+²@µê¡ØM
ìì™3’‡$æ¢ȱâaŒ(8•é7UàFÄ¡´f¬Áéo6'˜µÖÊ÷ËáÑX›}m—/&ÓK-›ø„×I±üŒ‰^ë¤V´^±}á'è»àÍN³ I)ã)²¶26pÉ<bÛ¯t¢OƒïÖÈpztVJïKèY@‚§S GÈ Ëx5ÜéÒRHï+Þ›jœ¡X×½j†ðYËhZ_JŸ}_VŵjB47 [Td2·¤ó -ÍYFY¡š•¥ÆÉ(—‡’á›Û´¸Áú38 -È%äù pªAaÉô3IŸ»¯~‰..t +ž)ÂÒqEy8›Ö*tjTMºZÕ8ûµÂÅ:X+*ëHo¸ž¡Ðì ¬:X¥ã¬¤dx -ç5©\ï‹5gyÔ,& ’˱X™Ycdûy¾€qh¸ÙäL6š§6ºI^îG„SÙù•Z›KלÆ2P*¡Sq´^X0oPEan#«\"[´‘@"ŸqÊ0)oè®Îy8E¥ï½ùœ×Dd|Zaº›!÷R7Ô¤!,3ëAìô &öÒ’õêÙg¥&auÄôžS\0Ï%ÒŒ*šaRcY!Bsð&ìó¥|چ׌”ý¨wS@qà3åÇíéd [Ý <ñ¼öƒ -û;`\àP•9f¬âheÛ%Þˆžf¬ˆ$`DrdðÀŠxº²î—#Ñ™p"‰õVÊ Êd¶½Y#5²9ý ¬ƒFÖ©ÈïÅH{HÄ”UÓ{ÓœØ+>5¶ -ž¾<rº Ûæ²æ«e•OüÄU„#48&Aò8€
$^ÀfÎÁ’W¦°Ü7 ïÛhÀÜÌ@6-n¦¨„)¶L}€6×°¦Ý¬b -Æ)gJpñŒ&Ja*³°Ò“jOî@B×
g:¤Û £8$Úð}ѳêᘜV£oÄëûiµÐˆH2£¬zÐuõÂÅñöÞØ>›!Có‹¸u6… -/ã½w¿vjLJëýF.ƒÛxx¬™>ô´µR,ï7hBÞxµ¼õ„ÌúËòâžÝþéüôæƒÿíòê—üÅ°ùð“K.>þå2úÝ?ðñ'‹ÑóÝiüõãÇW/±o??;_æŸ_ßÙåNPëGõÇþÈ??ô¥g·Ç'¿Û/½Á/}z|sv²ý™ë«ßŸ~ïW2ÿýüËkvédkè-quûÕé ÁüQó|ìÞTaÑ&åÇŸ~½û—Ý»7Ý Jô/;þêî_>Ø}üôøúögùôüôòÅ÷?ý÷œßÛq¯^¿þšñ~ÏÐ_]¾xuvûšao¿øc¼t¼Îw˜'|}¦/? -ü×Z^Çïüäpû|8ÿ!ÇŽêÀ¡ûž,™œê -I™æÔͺ_g~vùNü@§»ß~üÅoÿm÷Õé&ÉESOÇ0«Ñíúßžž#_ágqÚ;´·¼ÇE Øöí½>=½Œ/ÇÙnèkŠ/Ç=0ËØm_~ü§ãøîó1ûÙøÍÖ/{ÄßGÂk)ÚÔºøôüUÌÒEÒ¦ÉS¦~ñU=zûêÇßœ^ÞûÛ]¨AͶg–c&
¸Ñö^£ðgCKáñÏûü‹Ÿ-¿ðÛŸ-cþ·Ÿë»Œ·>qŠößeüÿ
.¼ô”ÐÑŒŽÆ¥£Ô:ãw·ÅxË}ä±»ÙÕ°×U
4sÜÈøW¼ftUÇ6:®éµ«šÐÕ´×UÑ$¬‚[è*Þ§µ®ãµ«eþögÓæ%ìÌr7ö5G÷mÊ4ê©.=qLeÓQ^
Ž¶úWó´%¶÷&ª›£§ÍÓ=ªÞÔkÔc³”–•×µ…9rOó¦§1VåöÙr„óÚÞÉÚîêiìê)væÊQgIJMOÛw˜µVÔã„5º|ç·?ëRZúœ£ÏE‹¥Ê»M¦6›{„M5Å —¾¿øY沯K%Ç·@æ Îùêìî¶çÝlÊŸƒw¬Û‰‹i`û~}½ ‹ãÐ]µ¸GŒ
«¿¶=ÆÚï6ºp]¼Ó!¶»—Ž{ÂKí°dÓöU8Jö¨¶]´=0úFßNùÇXòË>ÊwzšcL6̽Ð3ÞêÔÕŒ5»¼øåù¶]‰Ãž//fe=I}¨µ7Qôo‚ÄÇLx S–ëÝÛ-êá3·ÓŠññÙ¬_žˆÝÞžÒûÜžÓ뉧XÝnÎ~ŽqÛQñmµ\>¼‹Éú¥¸s†˜¸.&¸lÏìÒ·ç-8Šº.îƒèiE€>–Z»h¦ðtÚ…\¶og™®è»ÇþíÖ¡]à~ÛÓ-Öa¿]~)^tÞ.šì#i95'ŠÂ³Éçf"U‹°ÇåZ¶íˆÁm»ìcE·a´³%~¬Æ´×¸´{-x¿+Œu9&~‹EÞ®Áv’nþ%Ø$ûX®íÍ–þîÁZÑó€e‹»Æè†x)í…7MšV›“}¿l‚èûqÀ[°‹úÜ&7vqt]à -i§N;›†hé·×ç¸`ýe] -šŸß£v.þ›es{QLü÷o¾xòË«§þñ_vþñâürùóÑrn.³üêVÕg¬È[–ìI?Bÿ›O-¯ýüÅõ©‹˜Åÿsû§—§úë‡ÿíòæwß_ßü˦JkûÑïŽÒgÑ~óšÏéjÄ]|ðŸÿîgçòêòô
&¨„ýᙉOþóßö¹žŸ]¾XÚ½Á³-‹ãÙéí/ù?ü|ÛOÿH¯ÿg¢ûÞ™x£ç?;^ÎÞ7Yø?øVÿž6úÿøî·:>ú7^Ñx¼“W7·Wۓ쯷ÿÇÍ1²\¸ó–-ö¦Ëñ¯¾/ž¡Ðÿ½ÊOa—Þ|ý‡÷ø6þoƒ›ó³“¿÷³ø(ça¼öý¾Ñ»ý[¼GC~´ø??ô0z“‡ùÓßúaÊ0ÃÃ~èiþ tõ?цý·|ª<W:~衾5_Æ?Õ·YãoùX
xóºz~u»˜ON¿¾ýòúìjñýà£ÝÿÎ{põóÌ{võêúäôS€ýþæwÿrCý‡pqz{üb1…Þuó;Žãÿ}áØÛ¬®Í‡9}¨,þ¢ëv-ˆ±˜1¯^îž_~óêø›ÓÝÓ«—¯^êCÀ¨ù;óîøúöùÕñõ‹Ý ã»Ýî:|˶9ØõSÓ+í~uúÇÛÝÏ_œÝ??;7·ÖòÿñÅ鋳W»¯No®Î_7tW¸ò¡A~~Žhóåéµ~âv·z~wÏ‚Òª²_¿ð(´ñ‚¥Œ{¿yyu{çSÇçgÞu%2ïÅ˳Gj‹É\æâºÍø'¿Ø}òêöj÷ÕñÍíéõÙŸOït‰Y|yüry€›³‹WçR¥îµó|¯‹e^âÅîΖ<¾=Ý‘Çu<Kg+úûâôæÛ6$þæfê¿·ûß_^üþêÕíîÅòÛd¬ùêöåòïï>ožîöúøòæåñ²%Nþ´ô{öb™‹˜¨\qß/ÅÏÖÜçéõŸÍëêüÁO>oì°~ô{ÝŒu»?Òî붌OÎÏ^.Ÿ‡£õÇe¼ß,æ%7®£ØûÆ5çùè»Ó“ÛåGžŸ_žÜ_e{_YÞê°v·ËnÜ_»¶÷öÜÿ÷ê»t÷D4Jß7ð`PÛ]}wzýAÓ›ý7ýûO~ñ,n§ËhoþýÛ³“oŸ^_}}v~jRµM×{}úÙç -Ÿy¡»Ô¹©w?· âL}~ݧþîÞsMyW -R~n -ØbŸÑí™9’ó›ÃRn³“Ý©ÃL6pjÚî¿°ûÄö¼Õ¨¯@H,.òZ^nRËíõJ·<1{˜Ï&ÌÁ÷¶”ÏþéÞ¹¿_J/¹{òš êÙ³ùyõ³s¼u‚
ÑÔNhŸýÓ†¬%,Ùn|ž¬.Û±„ÌM©6§G¿¢àä/Ìh>ß.àoy×ï'(¿SrSÜŸ Nø„P°áˆÐ["6²n[!S‚
KD‹ î#z®mÐí$4´ÛÎwк•Ç?ÔöŒˆ™M9¿SvÉõt_,a}6,
5x®6(Üuh_®€É÷¤Ù‰•üLõ€ÎÔÉøt– .£Ç -¿¢Žº KÍ|Ìvô–LÎOGøµ ¿šS£ÈQ?ŒÁ¿;áXNNè+‹ôÌãÞ2ïÉä¢þ¯çËsX¦&
›’׸ÅYˆœ «¹oÏ8™J€Öº~j¢|m'òWç -ZЫëÃo*R·÷Ùþëi›7ÆØYÿワÌpmcL©é0•‰(aj‡q‚á^ÀºšpÙ
Ö¾6`KcºèæÓ§ê{ÌZ0cU™ÀLA3÷R¿˜ebÖcÖŸU³m+UÌ~öÎ1§ê¢Æœ×¦skB9ÌcR
0¯}xÂ|±¢ó“®hb,8‚š¶‹Dre,Ú -ÿ`±Ýˆ%K~«†XJsRcdåÃ2ø¡‡eË–7_ãXaŒ±RÔ¨Ç*O«Nâ+¬ž-º°¦ÓÄZ×_%ÖÙ›RØ×0¼Xz¦T7=lÔp›°I«VÇfƒ[Ì"l Kl±e°m {ÄöeK;NÛGìbrd”Xv|Uª‰¢R“Pi”ºe§©4&£6¥ùŒ”¶â8¨tÚ‹[®tÿrJ_I«S»ž2¢‡”±S÷¨L.ku%9È»”Ù~v£,ô2eeyVt)k›êNÙ¼´Ê®
ÀéÅ7Jå°Ž
•“-À¼fÊU -¸ñªíáöÒx‡{.q#*i"x¶¨ãéeu‰óa=^÷ZbxWyéàƒÍúˆÏ~Wüw8ªà‡Åt«Áfc—F»žU5Íö qy•AM bÿÖÄVqפ=¼¦ØYï4
)¬ùª¦'š±måÒüÌÝߚѶh®f}[«9·ÍZóÜÚѺZ}‹6X
ö´‰üޥ͖ë3m¥‰jÛ+ÝA;¸.‹Ú…§kÔnÙ¡ö²ŽEüÓF˜βðwt¿' ÿú.ºìèŠ@*껺F×맺YîPÐm6î’È+õÚÄ|ª·&½·Pˆè£ƒ³EŸ>g}Ųžé;¹d[?Úcyý*Ò -™÷ߦԙ\™ÊÓ³ÊÔíWœ¦éÈ™2m'ë¶Y¹k¬Íf<b4{æ¸9^:¶ÍùÍbon¹{Nó¨×.š×–ÚÒ|ýù²YŒ‰ï¢Å£™l,±å`±ä[º¶¥U©-ã|3cÙäv«2çY͵ÚÄꛩÜÖä53°–§õ«™XÁBt[•ÁĦÓÅC6gSµ¶EÝcÒ–»TT¶ÖѶMªN·mðÚñ¬® Àíö’Þj×õK{vl+Ú›{¯Ã>±'÷ö]¦ÒràÇUÜákŽÈ>µq䓃®£c°¤À&ó:Ž•Ö©'ê;§Ç¥9“îQÓYñ&rξ_sþ~|.e»lSà.ë%it…C^+×5*]ƒúâšwÕg×Ù©>»kÃÅío{•ît2‰»›Ö²Þ=5ÿØÜG“Áë1QÏ>ÊxÈ„µîiÔêCÏd£ÛxŽþ®Ækè¹<^¿~F‚ý,=Èw¼ˆcíöïy÷–b¹íe2_>™pù¾"Á’o•ýúUå˜Ãï˜ç+þ„¦uðWSË4W~÷…Lê[
H%dV4èΗ‡Àª&xPß샮dš„ölýBpÖÎiƒ—±²éTîP,ù» -U–ÓlhìëéCÇÅ×(lŽv“áˆa¦—ÆËixØRçÇœÛ1¥ó§H˜˜ô#¥¼!~ÁìG«ƒ&j6'×ÑHéÔ–…JtLšˆèé0öǬå´5÷:µ±ºÇb³íúÇýuÜ9þ^ÅS³îO¼ýÓ^ĵãeBZÿ&üÕë6‘?ØN‰A"JNS£OZJg2î(D’õË%—\LÒ-BݹÎo¹t&re‹…è·—qâ0*ÖSVMd•JøúT³‡ÅS+öKjÛ¿g2h]úÉÒ|Ý$'åË9ôá´Û줳úÀ’îãÓbúhÔŸ26>™!*§u¦³LE2[Ãæ'kjä#Ù¸^ÿ›m~O“Ù_ú”Ó_¥\d®2æêe?·lÍ#y]ùûœ
Zy`Œø¼\] -:ß©[ ^¨kã†Â²õý[ÔÛ±V1²J$‹æÊQüM±’Ñû³,Å=©ïRÛ*•¶¡Q¶É`™ØåoåÕT>¦ÖÚŠc9VU²ÑÞµ2¼.U¬¿¸V}ä^Y-ûu¸¯.Œ}MgØjQ篷ÖòY£µm©™«[çšf=mMꃲþÐÀ”=cÃ׈†•€®Üø¹,&Mô¥j&¾óæW=VmžÁuË=Û[Åe¤ØZhR¿m}¢îRàíøÏ¢ÙþòáÊöiIu<™þo§lÔ;?ëâ´k©½]¢ßœtûßß6^-¾ËBô«a -쿶)}áÛ¾8¾óΟÁ÷l0‰ôôá)ÖK⫯^orˆô±¾E£ÀûÁR`ÒoVë…þ¾±ñ\cjPƾƒ•×ÐZšÍÔ0«³{‡ÓÎÒ8Ò»²×Qrg_ß—éXôÆÑX«=þŠUêãk¶Rk•Ê¤5kU&'ä6õ•.->ŸíßÓ}>;žyL?¿³êÔvšm[ßú¹+gsÏ+á¯Ä|“ÖÎÌqº(·;×Åzsþ8ÎìO¹®þ -üèEÜÇvv¬<aNËü³ô[§¡Á›>ëñ…ÿÿÜÍUAGUý#PÜ-76ÀÏÛ8Œw·£#§ÝÅ -ð -,ËðŠcìwˆS"wn²yµsoÛi›VIë̯½Ö™MóÄÆ[ÙR#èðX2RµS&¿˜oDöÛ£Šx“û1Ôš}Uìp0 ˆÇ ‚Sòíi{ª;H§Hb÷˜é¥Ùšlö¾ªHXÇ!
‰¿N‹¾ (¨‰·M”YúlŒ!úS¨ÊSÍ“¦Ôˆæè:²`évlÆH$erÑŸ0
§g¿¥šÉ{‡¼rÂMc¹{úLìºp
6š»Ð37– †ˆÔÐRwy¾<¿Óxƒø5kþ˜µê„gÒ¬†2Ä0o,§—xE=-Æ'˜}`¿wUà7³¯Tg½ÞIDZÎ2¬`¾å”¹MXwO,ê©¢' ->™.éƒrâ÷ƒ®"Áìy¿H®Î+”–æïŠC¯Êf˜QçÍprM—WÑÎ}ånHz@Ž9Á[¼`H_†³m¼>ÊÖUXGR -1#Âo†WSNŽ
;gË0hˆE\;àì5’ê±%¹»9`)÷„÷–ž}ø~ÍÙiX¿6€M4½O™Ó0 bµ
»£6FÂ'zK{ñVÕ›4ˆ|>c&C)·½…cù1ì¨æbOlr6œ«o†?½¾èÊàŠµ&Vo%S¬Ù'ƒfÜ©ÁÔ)‡^=HÚÓÉB~Š€%nÛæ“@ÔnÒ%£÷g@ááþ†j‰žÁ¯ (“è‡è«§^pTáÛ0úõA>KP â!3éu›‰šcøuHÁ&! “asø€¸£JÀF%…âよÝ;¹ÿ"ˆšÀÞTP—PÀX -ôdºgM|>—ç'Zõ+x`ÛîYEÚv¶ vq³ 0¯·ÙŸç‰Eõ\·®*ß@mN“”¾ít(¿¥!QSH³!f…¡Qv'^&‰ßö0¹úõXƒ‹-þô[ƒÐ$2òzk³=윙Ñh5¶¾é3 ÀJ¦ýÿɲðîþ€ñcÖG)Ugdµ²6¹4v“ÖU$ çŠK'Ž-²ËÞB2†0cì9¨dùR§ -: -Ôš§'«#bF…&Bs†*™
°,ýŸ«ý³:ê_ÏóI0 ™‘
#~"Ýõ.€9žrØiW‘¶Šé{<#…Zc©ÚQ•X4i §I¡Ÿ¥(D–*Üü”à„4k1¾ò’ƒ¾AE¦vב÷o}ôì‡Ljë·Ï;-äÕJŒ¥»-Ñþµ‹Ç«¥z‹$ô³Ûf±ï56ïú:©Ø -ùɱ‘ù>Ç×ÌKrÙÃÆHz8¼¬¾Ì %ŸX@µ¯,ž
@OË ±v„1æÅÝ`̶ÜDJÚ_Œ·X|¸?™Ò”JlÖ=XªÆhk|¼!hxcÁ|W ÌÇ%Æ…]Ž×Ó³_0/á“#ÖÄühЄuWÇ.¹zäXty¾¢IöWPXc -Ü¿!÷±c¿·lܸ—
L&÷:ÙEiþµ9<q
1qÍëO¹—ÕȽ?`%“úÊ&Hî/‡1Òí!Ê°òY`,îM†KDO0/OîJXj33Š¹oQ
’Ü%i× X|æÃq¿"¬`ìFOíܺœFžgºsi"LKÐvØ
·yGb[Ž€]Œ£x”\‰òÕùH];§ŒÏ‚µc1ë.%ZuôÅíã*¸ÈL~bÉEIlÊv÷O8Ú±C¦®'ƒ`³önº¥MìôËÌßW˜Ê¤NxT— ->sùFQÉ ÷¶6…Øè¢êÔж닱Pà)Ó¾x»cñïÔ´²ÑóÔ%Ú3ùƒ¯@õ+½gk©ob
ýæÇ·t±“ÙWjÖ~`5ð-ÀŒ·
`^Xê
µ…`Å@Aé5Éapiå#uDŽ[0É?Œš3/à\]ã¾ÉáÇbÏ´Lô30Å@k¨fR·÷ëy¯ì“BÖÁ€¸ï¯°Ë%sb³µ-ÀzYy"r7<øíC£ÛÁy-½¾êÞ Ú5 Ìf“ãc“/3aóiÉäܳŽ7ˆ±=±ñ©|6‡é¸ŠÊÕ
š0–„yXEè|"<í|¦!ŠñZ#v|\ªsr.žc{¢žN:YJ¶¢wíÐCï/ÞÐjúMd§µJÂÕv\&~ ÂÀæa«’º\´àÏôÈÓ“h-ï æÕññ£ê»¼ƒ% Ô¡•…´>l1ßÃE÷Ò«ñ!\Ý¡ÔÄúuàjÞTÏ|
ºNUš:Ÿ±—ü^¦ÈùHÏô%5It -<P4:¿ã†ã,–hö¶@{©èeQ „ðíkOddTd2Þ*b,ÛrŒ05ÜwŸ!Õ[ÿ:žjĽþÚß5JlÁ 6Ñ&p#CSIoÞ™wõXaVtEm°¶³i@Ìkí%—pu•ÍL¸çÒÊ)æq è,=ˆe-ó#µgó'¶‡»aÅ>þuª€‰ðåg@ì>¬D껕K<ßµÏXHÃùÒŒ˜mý&ö™è™Hùòú‡‘¿”Þ–n§ÞO/(k,퉅?·!&†î/ŒN!2¾Ù)‘;”·^Àìã¼@)iíù|ÈJ©jŽjÝL¦ìˆ×”· më€äoX=a2Ixðƒ›ÈŽ7øƒüÙTô€6ý”¥"ŸU&´ä2PÈttɘí2s¾›˜Ád&lþÆï - -ÒÛ±ñéi?_ -ãÿÌOòîzÂô²”%U—ÈkÔº+çÖUº{ÙÝtså3¥&¼÷òµn&X™ÞRÓ'Tl)ˆÜ‰#ûZX)¼B’ž™i~ã-ýÇ;Ѳ@vxþŸ½˜åÖ…¼ °º]¡'%›xf)5ÄÚü§“öe2³
Å.}¸ý°qZm!Žö“¾îx={¿üáorUÞz\’$ ¨–þKjÔeE]¼R’¼Òˆ‘aènHµs!¾ûéÎÔ -Û¬š+èÝ~Á _ÿ]wëBÙ‚dzZdJ8ȳã˼±¼n'»ñj#u÷
g
ËR=XBuH®8°‹·ç“Öjþ¿r»ÂRSå(}¬yLQ“¨ª«›~ÌJðÊÜHÞ·cYF¥ÐàÀÞ¼9_,Óýuw¿F˜º0%»[ÿƒ¥!ÿqnæÃÞk]rëCBTÝHxÃèí
™ýD0Ìq¼ÆhkbµYEƒ1º¼8á'‡+T
8ï/ª÷OèEÐm\ÄŸ^gTµð˜Xغ‘û[‡1\ó,1½3ÆÌVmMcÆÈ:„éK_~Ì´\W£…3^uÌTì˜ÙVtجᮡwcI}Õuvœ‹ sÄÚ-"΄Ïéó|y¶_(A95˜·¶ÌpžTà§S$<‰›¥\,ï?G|™PÛBî¿\Ô©÷e#¾ÈnƒÇÃS»!îÝÑXœêª1i6Ô -ø -çÓ)xn -#M{î@v`D:P— - -œ‡–AêYåÓ¸0Ò¦;íøIiÅÞs)ƒT3hÏZSÑ,‚ԽԵݔ0R—¾g9~„Gª$.®j6¡±ÚÈD>&‚Ô£RïNú°ÒîÀF.Ju)Jž¼£Mc!=7l"Mg
Qò:¾"B -Öâ$ÅÓ6Xɽk¤ -œOà‹Ê¥‘vÍ:£%W˜&oª·&9H¿B¶‚×l‡H
<¤ -ü¬ÌÌ÷žÚØì -%¿ëÛl«õJ¡±ž•ù̼ôý¥× "miw?¢HëËêh‚*ðDZ~§mü!$Œ´àÄ›d,FzÈ)…™Ñ¶†iåE„Àße[;š'„‘#©á Úï"í—×Y„î/cýíºg¤ÒžÏÖ?oÌÂHK¿‡mÙïsò,í0kÞ‰ø„טÒnÓ–Zms‚H}%³‹õÍ@Ž´#Ÿi®CïF:qêyL£ÿ*Œ
©CÑe¸#-ØF†@"51Hˆ€ý=Þ„~øÄGzÞkÂ4ÒKÔÈ)Öë)¤‰®=Ë„¦Ó¹Á -œA‹,¤´s¾…‘ºº_¢HÁ&òkçécì±"KG)Üò¦bHgl¤®:°‘Yh}¥D…t¦Ñ¨¤Hû¿#uòȵÿûHÓR}Y¯l´‡¢H‘ö/‚؃@û0HÁX8cí‹">»Ä‘Bí_©‡úÿRx¬!Ì"…´ EŠt -)ä}Z¨S48³:÷ßУOôDè“_³œvƒëvÇæ}‘–Õqꔟ¶s/éuGK‹s/NKËÖé¶:5–ƒ&B^O´pÑÔc<Ž·®Tó'rÐÍ´±eeïGúÐáQ‡@Düõ/êEÄŸþ&€à§ f'#šhô‘Nÿ1÷4¤ßÜuKÐ0¸ðjÄó>±—°.ç~ÿSck̴Ϭ|oL@,iöpG¹(íS]nVÀ
Th¯†u(½Ç¬T4\Þ=n öœÇѸ Û\+I¨Sk–×)v—†W-XºE“Cµ±üh<w "9–ýk"ÿŒèðÝyʘŸŸgFˆþˆÎàmþêÊçó§ºÏ@¯1¡Båµ)A,ùó·G듲,dK˜Ýø%EA)ä,÷±‚æ—V³®8;2µ²Ò½ã딤;Pn¾è•ü6å‰/Nšî -qbqEþQôR\Ñã=ŠgK7Õ˞ؼw™C@
%z„i7€—ŒÜ,ÒSÊDý¡igß Ó®kÆDŶW"œàкÊׇÆÞÅÐàœÑV£øŒÔ鼆>Mìa䊽‹±F5¯X4ôì?ˆÑÀÒÚ¿4 ! Ö0ç:,ÚÞÙ½ÎGz
è\‡™&ÓÁ>Vk3¨”Ÿÿ„±‰ïÒ˽1|[9¬•Œœ:ÂÀìr BtgòùnLÊå;i®{åXÙ¹JÎ¥ÊnjÚMðÏ·‘uHñ°,€dÔ¥òBÓ (ÆžPøL(ãˆ~\`|w)ø¸6ÊÕ{—XýBc¹¤{IOÎbƒŒÙæ—¦õA{œÆâ+§d–~¦…É=kßY‹nL2tF¦1Ðf¾/¢Û’e~Ó&™×µ'!ÞŸ¥¹rZ€XÅ=³ñJté͉î•åÝ9*è’¸Bw›:.o•/©X<Óù93¸Ã%‹æ/]Ù2 ¨•ü°úNF¿ -ü•N©þ( -\b¥ƒµÃÝôþ" -ÊÝšd Üdò+p^ß÷îö¾ -\HàlB½”Í>:ÖQ\¦7ÞØ<¾qøìÝØÛþ²ÐÅÅLÍ, ø¼|bfÊÿš˜ÀZØKBV‹ŠÙ?F?p™¹…liŽ%þÌ/¨ILÂ<‡#Oµ…‚ü0 -ÂÄö¼–@uy)„ŠyÝm,æ4F7ƒ½í¯êšUÒCSÈLvãFB¾êD+Ìù»c*ÙMì؆k%=Kv·O¥XÒ2%Â1MŸ™!)^6'SX0n–ýñÄfâ8>Ë|”'³ÆäKF/âJ1³wâ¡|)Åå¾ef>·í±„βïúØ£ëì™ãpí;ðÜ$à·MÁ Ù?œX¥EÕ.Ñ,0–¦ÄÏ{ªvÉÎã»>‹!oò,ÿEÅqZ‰§¦‰'ÁH«Ò1ðÚðR%Ö©˜PŠ¦øü=—E0Ks=˜‚ó'7Ïwz–#µ¸ÑéØÇ2DOÌɇXfÊ+Àž¯xùã:XߤØÓ4Qùƒd$ÚŸ(Æuü:®™è”áÖdrÉÓe|¾fÖÕkÂ~Ké|9 -v¬3ÙÞϬ‡ÜÇb"(nL¤˜n)'&²µ—ùŒ÷Ïkç»j@H¼ŸŽà˜žÍ¾L8ròHD¡Pú‚óL®‡H‰øç
&׉;ÄãYµlD"žµGÃCijöød"xL(êíé´ÞaC&ùˆåUx—
0Éke„ä˜(vrÙPB‡ô~Í^\hŸ¹
Áy}Dò‘œ$BVy»ØS8âW‹Ü¦%fýx%ðÓÛи^iÞmzÓ£&ŸI_ìôÔ ¾g¤Ú•
aYìbá?e¤Ž•CI¤23RÇʉ—Á“T¿d¤öŽŸÉH…p>‘‘ -óÅÞÏH…P>‘‘ -áÈ»šgÅõ!¿4õå #½™ž}.vÞfC^*œ°ût*Šç—ŒèùD*œà¼|<îï~K.Ťm÷ìÊ7RáØw¡d¸ÿ“T8¯ÂÿA*œ°L¦}Ö•RÙ¢€}²TâÓR4VUÎð\},iybÉ
ô‚ ܲ<Š2ȘøÍv/ê0—¿z¸ÀÊFïÊ<‘ºˆr¡-Áò<¹™ŸW×½‡¿9ܼ£Ûÿ°jœI=¨Äe¤¼LoZã!¡š]S¤_H%³^´@ò“¨·‹Ê†_©S,žñ4rÉ„ešL&¬yX„ ~¸mGø†ÛeÚãÄÍÅÊ:ƒV£ô-žwæ«*ìåÅMvNËE¶ó™…Ô½4à!l/–açêv¤’ÝfVQ¤6²‘Ê°ÃË«âXéHiÚìg!åçbŒg–ŽŸìæê,÷Ê„¼0¥N*ÙÍná!åÖãnÅ2ì<*ÕÑsí‰%»}Kem¥3ìö†(RMa¾œ‰!K×ã«vÄ‘¦JßiQòªwÎàPi•›a‡f0,=jô‰^ç™í‚Bí(¯§¥«WÑ¥¯Píè³àPDK7+)B^7ü
UÊw,#ä–«ÁwÔX8gDÍþ3©=Ï#Tù^ñ:VG]b‹ItêYpê³8Êzýd%9¡²#wªÈð.IU’{É÷MÈ‘|’
‰î„|!®ïY9ɸ>ùëéI9Ññ Õ}{VlDîøž×MôguFxw©½Q?N>¿¤çâ…ˆDÃ]å “öôþ%›îo~˜W³é„ì€[-ÎÏeÓɼæÍl:!Ÿ Ÿ_ÞϦʥûkæ£x6/^8Òþl:Yhž¼ìl:!POnùC6Ýwä³é„Îiî{åDzé„réØöþg²é„rédÆö¼M'äk¿U`ÿ\6Ðì"OïG³é„”vìèg²é„réDn›#›î±KK•¸¦ô×l:!åT:›Nhþ¢¡Þ̦ãƒzZSøOÙtbºåg³éäSìl:(þ™ø‡²éþD±—³é$s¬>–M'œ[ýél:! -"YÏbâuI®(Q]Ž{0õ§.AŠN½TvYªK¢F‚Ne—ED&ÜŸQÔž;ó,"§ÚxRØ\Ú3w¯–%Uèîí2w¬{®dªä)s'Z]./+WIf™;±L.y‰t²$¤ã“™BwïÍUº{SeFÒK%«ÌÝS"$ÌÛeîhFºÐÝÛeî¨Ü·'…îäò¸çÊmÚ¥'Q~žEþc!J‡<£rÿ9—-¬—»>EOy`º§±‡ÏÖ'L£ƒÆ³¤^V"œˆfÅóCñ Ùù… -£5z+G˜±÷.QR6„Hù´Þ«TµáñHfâ=FPKZâb1Ôóóú#™)÷›_×$A®Ÿª`^TĈeó~ó¥BÕb§o°ðÚÛêE*ªó8¸%€‚ónµj -Ê …n8|-Vµ)#‘á¥^½Q€
[2dyàß®pw˯«q÷6®økÝê×*ÜIe>¾Á†·…FW¸ûH¥¼§ùDò*å½›Ot¯”÷>JT¸ãæ%ÉÉùK…;©z¯°ÆÝëîäÞj³ŸÞO¬í5GÌz•X€=Wsrª6Ýßkù™îwýG0¿°(˜ýÚ=WÎäæÃÎGò9‹6y¶ØS8â¹°¼$&ųk&P¹¼WòÛ…’˜Ø§¢P@˜Ø0 {22üZ·ºo2Ó˜ä$1iþ%ÊÚÅä¤1qùÄwÊ€ºÏ‹hS@'+C]Òl¿se@'‡+å$1iÃ;¾òýW»²óR“X¬(±Ó¾¦vèÞ7nåç)†—%vºT
ˆOä¸&-â·ŠAûåÕŠt/•{D¤×ǺŸ»šª‹Nß>”ãÚ½šêufr~©Üã“JyÖ?渲øó†!#ëùyŽ+è’ì¬g©WÚ'¢àÆwSý`Æ[&Ü Öödškªy®®À‰¨±ÞïGFø”® ì>²Ó#gmDIPrí²|Çô'N^)Zc#åäÃ)ð³ªÕ°]UÜ:läwW$N/ž„wºŽv®Læ¥áÙb¹•Ú[Ó÷Å’ðz¢HÁX”äÁ):V[ZõÕEªÍN,?buØôÒ{&CàŠÛÁBÊMM;k½¦Ž “—å¨×E¿7BH8$0¿æ'
oÌÏýc“7ªˆ õ¨pW‰1>X~FÜPiZíGš®ª¾„¢ºo¾'µ’´&UG0ßGšJ5INd@«†ïM÷OtæÕ¶rg_¤3imÇί´¸ˆÆÀþ’b¶I0残¯tÞkhowóLJø‰ïÌ°I@T·qª˜=œ”±7Øa~bÓS‰xJÒch•h—àJïTRNjÓóĦó§*³ ‡î“Ê,r=I„th•èÔ=Tfꯄ IeÝñnž|#+íI„&E%…¼õÄ;ôzu|w¯5Ì»{¹Ê¢H—¢´øü"›è/Ei)p©N‰û‰_ë–âqZtbcyâ*Õ‹¸‡×©Çš)3% -ü%‡®h]?é¡ñ|®ëÇéÈCU¿?T -Þý‡º~Ò7ÝÏÄ߬ë'¹Ñ%Ñ.öº~Òná—n ’¨ë'mê -FAÿ¡®ŸPš$ÃzïÕãû@ÎûKuý¤¡@?ÿ'êúI¨(dÃy'ñŸ‘ú׺~ª&«ª»:ƒíº~<6´q«úqîìz9=Åv¯ë÷4ïõ#uý¤«úÝWò›uý¤®Y©oÕõcò·„Ö"ïž«?×õ“& Ò`?P×O‚×Îkç‡êñ¤¡È®Ç÷¤œœìz|oÕõ»CdŸW³9êúIä=<¶¿Z×OZ“‡7|¢®ŸØÞz<Iü[þ–uþv’øŒ
ŸÕõ“>oæFü½®—Ú|kñ¯õø^Ò¯Ç÷ö¹Wõ{¿Ÿœ$¦g·7<Æj¼VŠŸ‘ú^]?Žcû¡ª•1ô~]¿{ª”T]Ñ·ëúI«9"kìåº~ÒUýÞ¾µ‰®ë÷¦¯Of]?y¯¨ë']Õïåz|ÊÂåIËǺ~O†gUõcay«®ß£+™]ÕOì–³WëúI‡wñv±?×õ“tâù”þ\×O`^XUý¤ï…“_×ïï~K.Å^Ïy±+ߨëÇ.¡ª~ŽäÕõ“\¬ - ïÕõ“V)ëõýº~Ò ±ôŽüv]?î ùUýô1Ù7Yqëú‰+A”óä&+™uýdé0o×õcÏäãŽDv -×õ“Þ$³8?–KíûVíáKJG+7…#>ø÷J-©y{%x*îÚ•¼ç¥-rVÓm1§7‘ðOù¦hT:ÎiÙ3„±YËsÏž%Ž%Z8ÃÜ7Çy‰m%‡¿Kj›µ³öR`>¦.F²›n‡Y§ß—ó´Ì‘‘Mß_mtæ^›8&l™ŸR\u¼&<Xo<s‚O£îö3šbùXs×Ýoîu[\S_‘ìXò–æ.¤]£DmÝŒÎêEO{Ù˜—ÜÇ–n¾P·ãzñ«lÔòëÀ&ÔÙÏ£ºÝqè=â§ØÎSÂÚ¥¨VíÔ¥=øâ;›Õ_—ªo×¾7мr;#ÍF½…YŒƒæø9¶Œ!§6f#ù„\Ls¶´GS;F~ÝéìkgϪgrvO¾+÷Lˆ1l5·-΂_yK{ûµžÎ½=,6çWQ¹Õ2„“_ü*ýñiõ -ÿL˜©ÛY…à)ð¿ClÚˆžf8Œ75ÁQréÍâø®
÷ -%H x~gP¿{q„êU¶1‹ÜÃålJ2êÐGÏ6AííCòƒŽºN
-ÈÐBçFøÀ3otsEu¿ÓÞauÚ}*›|Ú•LÙ0,žeå;‰Ÿ¶`Œâí«ŽºP8Cí0Òw¥[ãÞ“¬.£gÊd\ ~V»ÀÆ-îí
4=„i•â0&ÕÑÔ]¯É8tþ®“ÑtÑ3¥2MÛføŽ8Â{WçŠÕYI’8Â6Wº<N%~±Òq a _{Ó`ƒf§&øm\G˜ìéÍûE+z -6ÿ–=;Ön‰½óM¸/‘©ÒÒÕ¡?Õ»‚ÙgtKT—jèJø¢Ë¯¬et=Ã÷É9¹©t1çM›£®µ€âÁ•æר†õƒéyqu¿ RŒ¾‡„{g…&Yîa¨‚ÞÌå µcÀÊ+ÓFz@Ĺ~ïš#Kçö›}O -û¨îéL÷±Øl¡#NÔ¬! -ü͉ ¯Ñ½W[Ý -¤RHÙò»Óž¶Çⶼ}ëŸÊf¸;èž0܈y®–W»É¶3‚Þ^7ŸhïÌ%–݉ÏÌ»)б85!OÞºŠ4óN
1‚gßaê@Ŧ³|!%ÿ¦âÛ€QT·ØMIt 0ŽØMºr‘ß>)dõ4oèj]ʨšŸ×Z6uÜEF3ãøIÌ‹{”Ë…Jïö,gÛ)Z¶Æ3OÌqÝ–íýÚÅ#í´b~{ÆúZj}¬ë߀gƒvˆ!ÈU·pôÈ»¿ê)l°JjGh¬úî‘ÃpýÎ43åôІ—nøÉɸñe˜éˆi(EôÆš î9òí©ðbÊJ¦ã˜Ì¾¢Ý{ÏÚl›^í³Ù³Ú äh#{,0[òga7ͶÜ:ë§ãù)‘C¹w¸p£}šYøÔ²OÔZEd„ó^ø3Ý+ˆCçO2ÖXÂK{áÐúã+ìîf4ñاëG n“8Ó⑃Ùû«ÍDX·p˜øKew賡`ª¸>âè¬[ÆÈÕ;†_1—3ÚÔyQ½ò‚x
9ØÄê6£ŽQ©TBšÒÄãÐ×0Â>Í&Ê€_4¿ô(;7]˜EAo#V»é°%C4mD Œ=:—5AC1}ÃÈèîî¢è¦U‹¢n ±ù5yL%Êmì(oqã\`ƪ2ªÀÑÿh‹ð~ðè`ýšïí¡Öùøhâ,âä…é’ùx|²aC¾BÛË*‹¤ûÈ
4 -A“»Ó”=Õ¹:‚úE{áX+¯4Ž†iKüÑÕ!àè@þ8¿û@¾*ñ÷ʪØö—§_7F‚Þf -†@÷RNNthÉÞòvÐeeΑy̾ºf ÿÍ’ƒôr0“´«‘Š_8±Vª=c>¤#Ì_bvM$aiÇpJÚÁDÅ= -؇q¯^³ÎX#à.¨“áÛ‹¤™yÁ;f`^ -!îf{ÈÛ!JŽåàŸ(Åû¦ã¡,Ìöw¹"¹I -m‘÷?»I -m‘ -üÓ›¤ÐÉlœŸÚ$…¶Hn) Û¡ÎC$.;z×Íw?ñ9ìf0£MÆ®§f0ÝŽŠE˜jØ›r\‡òm#‘lL\¼`ÕÑs-Þ -Ðe[öB¡LàÅÝÈœ -ÐV"3z™ð”ïEj¾yí¸TåRÇ,9[†¨Oî¨v¼µ¢ž‰Ü²‘Ä}Jºý»€KBÅØJï ÷32Ur ÃüÍgô’J~“–ÿ·*9¤ØŸ|F/©älÓÿJN]Bêû?VÉἈ¨ÐTÉÙæÿN%XX>±ÿ+•®1 ”ßUò3eôi¥›œú!Ðk)+szê˜nجè¸Îëã¾µ"eƒ²øzt\¢ÛN ;Tf‰“ RwÑÜÐoÜ3S‡d€×¾€bÜ:ݽ½´´ -Š$ÌN5~Údv~Æäø<e„£,V‰•$è†RŒÍêìòžé¡GK…¢lº ´Ðê~:f¤£Æ?QP)k·S»Û¤Àqð¤>¿\°{˜˜ÿ¬v…ñæ'…ýõ¯
ükÿçúçp»Ñ^?xà†O….1>Ïõÿ -;>´ÆOb5½¬ö»ñé?ÿðQ§Xhf‰tÃà?è‡mš‚çzèy‚¾
¶qð_çÚø|*+l›Ãév -È/<†ûŸÀ -ŸèÿöÉgŸþìóß|ú¿×ßãýOþ¯?þþò¿ÿÍÝô›»vÿ—uÿ«ÿñ
ž•¿Åg¥oñYákŸõîo%–X xóækC‚@x*Þ¾ÿä‹/þ,Á`W~½dø·ý?áÝñc#¦ /8„Ý·þPFK½[∈7é÷eay®ýþòLí¾Ä‡°P¼6Þ¨ë_—xÊõ¡…Š8Úú·55cýø¼;®YÈÌsí‰ã9±
3ò=™w¤PÖÓz9þ=ŵmðû)L^~üξf¿Ë~Îñ¾§z»vÈ/¯øŸùèõ×¹6|Œº¿6ýÛ¯ñié¡æ÷Ø›Ø?¿”‡ÒŽ¿Ú[¾½Û#1¯;îðgà'×4Ùl쿽ŗåõ´8O—¤Tùùû1>pü’Ø«ì‡ïzú˜·Ï|¨OÂ?Ü=3“ÏÍö¼¾Á3«v]ÙÓÊ¿½{OÑs‹°·wÏ¡ð)RoVþÞý»Ï¹™¸üXJk«”Ê}|ÛäPÇÀù[#N8Ší¸þˆô#V^VþÞ>·su=Ó—yÝ>—‚öÞþZRð[—–”ü}ÎãMÌã7ž˜Çš˜Ço>1wÏ|ìyl‚x]h#7Œ•ÖøÂ}m¶Ø1[!ˆÖË–šñŒ™×Îã}åaA¾áGÊœ|¥µK¨x¥4¾cMÞXcy=äÆWeýkª÷9¯÷Ñ-ù¡§¸>šéÚ Úœ3Œ¥fö‡:'h}4þ”ÚÈk²5²$jám}®·c¨!½òú®Ö8‰½ó× 0ð
ùa®Ò¯õuÛÚ:5=¤Q’ÍÇÒ ËxˆkÚïog3½..-•Û½ø§o.X?@°<~`yü†‚å¹õIø÷µÏ’zÉé(…ÇŒì¨.±ãV«õ¨!k/ü´µ×¼ÏÊßšP•øƒ#Ï¡‘ž×¿á‚Ü›£gà6÷€O˜Ê\ð…1׬ûj+^×Òû}ic1V®øx(evŒ„–꣄|Ú\)WŸ‰¸@&õ鈕›½™†ó-¹ÒÖ¾ÃXšÖz®„‘¾6·äÊÀ䬻©>ôÊ{jNI_1ê²X×+,PuÉŒ”—dYŸ±¬¸®ïÈ#² -¹¼ŽW*$Ä\`*êÃZÇŠ‘ZG”ÌH}uäÒº6d\$SYKY}¯¯Sb¬i¥Ð¨ë`ë„óXzŠî[3Ò×'f€£âHâ.ÍKçȱ!ÙÞ.Ðl3³i$®™†ª+í»=7¨¶A7µ0΄3qéâimãû¸vLò3qm4LÙÂiëuq(öÍ{Auaxøž°,½R“Ž-GïÀ^™ØÏàc½ÞRÜc)U·A»‡¦Eq·¶\N¶KQë¾°ks¯ïÄê¦ýTÄ‘]©úÉg‹äXXŸRZ| ¿ùP›G½¢ -KPŒµZrGk(¹ÞòÁ3Çd:c~Ôä…Ðud±¥Åòm¬‰Ç@M¦éÎub¤,µÊ!Ÿ–nÃÅŒ%ê4É-Qÿ®™8]¯3Ó"\2ºjêp¬ù^Ö\Óð=a.|GÊtŒ´€ÍÒ´ziûô*PÌÖV¼ -¿·„ò}\ª™±…ðÖ5ë¼Ê¹êkg>ïëAØ-}Nj÷ËÐ̶â#ó[Ý‘e3`B‰®®a½ÖûÆx¬ gòX¯:ÓxÀ<}¨M‚±"Ús)ÖfNí1¼Í>èéËÂ+Ûݽ¹¥ª±e@&‰Þ—們ä&NS, ŽiS»––OùL
N0ÌAÀÅ}‰îJËʾá²HZ{Ó´z]Ç‚åóC#©dºJèÉa‰@P9yÄ|]?‹IÌÓ´Ÿ‰oxtkKÆV,îzÉu¹Ö¿d8ÖþH¹k¹×ÞŽ<h–"ã¨ä¯éï•zŒPI
¡EwÝø4‹5°ç^*Oj“਴ˆkÖñOTz¬Ÿx/Fawãr -g™ã²ãé#Eó2„uc ¸†P .cIÌ=q±<@êÄò(k%—12Ê$r.²zós½õù;,Ø4,K¥Beˆ¹dê\/€ê¸uý¥Ü6à‹êËz¦úÀ²´+5Ù…Ë´þH
!h -Û”×*ð0Æ@2e½e3m©ù/TθEe,8êúƜϢ’Ö´{¼l}à8|
’òü6I³[ô˜dðY& —I±&ï ’³Cr¬ƒã-5å:Í1P¶O«Ø+,œ -]X¸@/fèÑDeY¿LU£´";’×,YYÒÜB3T”õùœˆ•c¡2x/œ-xRIM½ç}öC;]Òrà|6
a‰ÒuµCÏœ§:‚9˹ððÑØ:\»ëç–ø¤ÝEvä@a9gÜÂ’[e@·ó¸äÌãèþfÕZ{¨¾ -Xž>Ô&áŠKê“xß–±“YŠŸäWXfØ-ùðÑ®í—׬æp‰1ñª» Kê\”0]Xò_Þ #¼™ó›Å`¹p–è¢uÃ’Ðà q¦"TÄuÐÃÆK®=`Ó>ú—Ý>a<5S\×9²“ûõ/µK¦iX…š7,sÌHßx¨†¶þ”–J™a-ÒI<àå{¯me‘ŠÑõX˜G7X®¯àÜU6Çrµ2_CìàæCm®¸ÔL—ŽÉOîqÒ˜«g`N(dÌe‰v>ßÂRpïã[_Óvð -JŒv¯M:ÕÒ”"Ù[eÔ§u7]–jÈ@ÝQ6wy}Q^óò,—aň–ûï²äî‚e,£8,yR¯Ã˜îGþ|ZVò=€žf,sª”Ÿs‰Y×-ÛZRÀ2
†¢,3îËSn -Âr"ͱ1Ã%A¿„°¾ÁåªýþfõZû)¿ -`ž>Ô&Ái©bYfN<Ÿß¡%¬?1ª%‹}s½D-ÛÏM®13:—Àl2Cá·ÒHëKPrQZt\ÒÈ… ¥i -e2ùRÖ¸šÜ1©GX_ŸÁVÉ4èÄÉØ`j&ü™aT˜‰8äðäï¯Oï -¤úð,¡š–=½ÄåÒ.‹P¹Œí5F‰P=×ì9T Cec/=&æ(`2ÿ -HR$p‰g8`×m=J<#F‘D°Œî…°.;œj(²I -£7‰b’àfíô ¿L0JY -„z§þû‡¥N)lÀUÄ©XîFõKgy”úuÂÑLsã¨O¾ƒù;jrjª²v€#ø¥1²O=hÈ$n4'2Â
×
O´«}ã(¦ÀH…G˜EódèÜ튗@ÀÍ>ü¸KüÒ/ƒw繋üû¥ue”.3cÌ¢D+‰rjMtN8šëš€*ß7ӡ׫õJC£%¾ærX:c®”¸©çŠÖ¤)ß?ÍyH$.¿¡ÈSdÒêÌ4AݺÍ&¶ž"i®Í¸‘d()ò“Iˆïâw–1¯ÇHÙfîhQئáÔ‘
VT@‚º‰Ä%$Òsî– ª•Iiqh"¦ÒÊ3Ò›A«Íõ! ÆõØ@ZV(ÓöbîKd0p¡»Zfã2aúúå%áL]¤+P°Ž[4Lð¨ƒFéO$^[¼È†Åšä™:»-~/±4[=ű W,•¥©È•Ç?K2Yü£KS¿ßEFg0!ºk`bDNæQΆ“¹£t,™ ¸ûFS«É0^
M±Ç"3VÁµ¢&¬Ø±¹Ôô¤”ÂÀp‚²³¼"Œ>…/8?pÞõØý6æÌ4¨™Ê·^pFä®m±”h``d¦?AÝjÄ™Ž2¼wÌR$‰T -®Í@]×ÐF\e0NRŽYæXÌ›¬²ÜŸÀ‚©†qÿ °Ú^Œ LC€‚Ù(™zaëò¥¥T$¸—¶SÓËÓ¿‰$¼ª\Á%î[ £¿@~ð‘r‡Ä…‡qä×Õ‰2…u6(JÕ£)˜+ó…"ñi¸8Þ)¬H|úÎæ<¯õŽîiQç©Ò"òªæ£w^G¹P0VÜC6ÍÐcç×i|¼. -}í·oýZG{Tª+L“2½@)úº =VËÚfUhÙ1Ó5àFôôðûeίŸ6à ïq)¹‘LÚ…<¡4¬»ºr}³T\$¦¹7¼£ô¡Þ#Sù¨)–úΖem:z*±çéà‹ò×׋Í!V:×b*ÓF¬©Z¸….ð¯õl85L[`Ý5t4#!6Š¯2äŽÅcdçÉ·ÕÜ»u‡w¡ý¸ÕVÕ*ï)xÒ2d™’é¹ÄRÉ(ƒ¨IÍ"wEˆJ°Â9:Y·‘Æ°XÃúÄšÁ¥ÁAK‘²Á³F»p ˆ=™”S›ëiÑëÄ.‹2¨ôuÉãöÈdéQ¯aÈuf«Õ–“´Zý,~ƒ…]šÝ¶V.¯O]c3(pwWqCÍ*¬“ï×Ûa¡ÈDeÅøP]¯²*¦¨Ð`sJ¥è˜¢ÌкU?-øŽ°,žÜ=?rô²NLð¨Žñ‚ƒ6Gi=<7âèИÌ=‚Þ2aÓÔêšJ™Ÿèc·°ef&ME½ºè"å¹î¨AäÉ]Û«Wݪ¸AQTHo!†!8C“MáJàÉKÍu¢¬Ï¦CV(‚y|D+ö[Ó"Š#ñ]{;GˆjM#JJ\€©u¯Nç,ÃÜ´„Ëê †Èüù-Xê•dk¾ŒŸrYS’š!tí¡ÎÚΩ‚‹ -µ
}íxŽˆT¡vvÃÇ3ÒmF°“‰b¢ÂDpà@õè–!¶’ºv2YX½ÛïŸ~õã\MƒIäòÌW÷7auµÓZeƒ"SŠJßÓDEèKüÇB?ÏgÃY’sŠCÌ„>°V«Naú½Ö¢@£éhJwd2ÈÓ·¿ªÍßØ]²V¢Í³1ƒ5Öôàõ-ݽY -i“?ýÆÈþ2|OÆñ!œñ4‹Bþ˜?™•…ÀšíõüâJ8ý¼«ZÌÍŒwÍ -ß¾üu.^lîC/íü戂D‹ D«dv»fvO¡êªÊÂØ {wB˜²‘ú<OR–Høåó¬Déþ'?ûü$"Š÷}þÇß}ôþwŸ|ñ»ÏÿåçŸþñþþ77¤D‘ÜGFtßó~;Ï>ü;}ó_-RüÊ}þÅþâc2·ýÅÇðZ,½s-©ýùâÁby!W‡÷ºF6¹›`Bž
1Ä·ì"¿]wÜQ]Rt]µ¡ÊwÜb/…«¾Œ’ê£?üáýqMãýGÿöÇßßÿâ“/þøé~÷ÿ}úW ÎúÚOMäšèßüþŸ?ýø£ŸÍÿÛ?ñéþýÓß|ü|ú§uÑšïŸ\áò÷xÿ“¿ýýïßßÿåÿúäŸ|öÅñ¯?ûüwüÝ'ï×ïÚÊ¿òŸ>~úùz%
¿1õ'¿øô“õ¿ùÝgÿí·¿ýâÓ?þZÿŸù§_ý•Á|þ%õe÷ù§÷÷Ûß~úøÇãËýŽýõ?ûü‹?~òùã§ÿô“?~òñÏ~úñÏ?ù_õt‚þîúøoø‰ÛN˜ŒëòÏÿù}/…X -÷¿¸†4qýꣻW_ª?S¢þ<}q÷×gB²Û·þDÇLE(.h†uA!ýÛ:˜Ë0+.IJƒzú1‡õöUÌØ‚¸GhŽzçI}g™î±lN ->‰ª9³¿Iö%™>b‡Bj¡Ÿ¯BZCLòP
³îù} “è~_PøU¹uï¤6Å€±Š"\;† Áçú`P˜òø9ÑY‡#fWÑÛe9-*yúÿI¥wŸÇòƒe6åè!4G=ŽE”óøˆ9Þñt•½u‚ÛÍ5D.—ñö™Õ}÷Û»¿þå’•Óä≵îƒÉêø²8QßÐ]mÊR‡ß a:-®*EŠh¶Y«AÌío£ U´ØÃpæVÓøk,µîe™ ¡º¤Ú/ðýè):w1Ô.?†1èRx)Y|2j7¿ý¼/§¥{f|¨íä#…ýZØc˜Å†¤r^ho§vò··åµAØ^ôÅg!ñãæåmà©2pí‹àöÔÔøsŽ‘ãçöØñVûIûÕ/Ÿ÷ö«ç@õwÏÎú3KSŸ¼Ô³ý
·y{÷SÏ‚îéŒ?â+Ò¯x¹Ù½€îäG„ýˆ°çö÷çYëki£ƒ9¯ä-ë65zn¡sß×Tsc“©LžÁ`NÅg</ª·óŒÚVO9=ÆP”{{ÕØgéù?t}?p}?h}?p}.³rƒçæéf6Q]¤Ál—Ég‡¡äÏJ-&j~§JClŒ#Kù±‘˜Ìµ™Ê‹êþD–o‚Ê÷R>&}œ(u“çy*ý -ܨs -ózî`¬8hµ_àÍã?;›=¬!o»yø©`°YÖ^~`…BQ|Mj`«#}>!7ÃûóX}2á’%úPQùøa¢òñEå㇉Êǯž›©—sîø¡âçæréúÅ0ÖPeZ s¯Šñ{ÔÚ]9%TQ(åPÛ"~á8ŽQçnêqßÖ`µÁd?Ag¼ö¡ô^Mî +ÈdJE]<wyÏf{0fØ$°½°%öoVEà0H?º^!8H£'81;‘kMy”Ó¶gKáŽ\u`Ç°^jÚ‰ëÖÝ€n ‘£qûpçŒMž}!,š¢‡ex,Ø3±Ç—Jþ2þMÄÕì>Kz1DÞ#»µ2¥Ó»…“”o¼¿O:)±…<‡ˆxz8ufÅBŠqj‚v±gÏ\€tÁ/)d^ù¾ÎÍÔK„ŽÇAøÚnÍäµ -ª
L§ƒÂá)íZ܇s,×ÝP€ŒµrU¹€?„ÕY77£œ0+ÀzvHºÜ§±ûŒüPŒ(¯<=$Á·£`ÇŽ{ÙQÉ:I°zA[1QÌŨéþÉì\W$Ög”ðW†ÊøÜD½”=èxZC„ÛP©Š(¤) -7¡î5ºþ•¹µ -†N -)bÂi ª9rQÞüƒ÷ld¤’#»5h'8¼«‰eöÕ˜\›‘"P£).¤Ä¬žH•,DúØ|h#1Ž-POü Bsxy£ð4·CáŸÌ‚Á2[v1þ¿ÒÝ5{±ËBY”øUƒõ:6S/§:˜Û!KIùÈÁ1
¬%µl‡dÉî=˜ÒÜ -ÔE{ã†Y`S¸`•—®›ª& -‹‰Äضn?šÄEX׳¢P>‡,ÃucR,€ÛÖ³+R¶ FÌQܼҳ׾´Seà„5Ìsÿ“â…ÇAÉ–ßÄjMUâk›‰iô\=r]yšô²H_2T›ºÛåÈãÄ^×3´üê1}™›©SÏ‹ÝqÓÒè)t¶c°FÓûXK¡îÀG
¸Ã‹–%L´2M -–¨æ»½‘‹¥è¢è²éx\F`:y#†ˆÄîÔ¶
;ZÐÈÚ«[ç]Cc±o·Ù´93ãev/kʤµWŽëëØL½œÚèpnOøcØÈÖįˇ)®pö÷ÕÈœI;TÖç°Û¸ûÀ§µFj&…KKrŠxØ…5·é;É&U’Ù³ëßæŸ8¤¾u Y9~1ç.jàÍ;1BÏ–yN×UÐh‘'Ð o“6fõ|*š–Ì2Ý~C±…#ï:º¿‰©™Ô s½Qmj/+êT7¯Õ×9°™z9/ÒñÀÈ·«ËÅ y+¦kÙ•˜ÌOTÓát+qNS´‡kÑ}‰Ã¸¬.ðØ$™iìòA:î4´S|#B_ß?™d,&+¡(eÝôD@>{ß Ž.7R2{&_î2j+fSÆJ•¬[¯^O’3»mû˜‡Äwö‘›™½,([ݼrP_çÀfêå¤JÇ©º¨ÎI¯ÛC4P7_3$(šë¡šb9Ú¡IÄ`¨‡y×›«ÕÓ€Þ˜Q
Q,3R˜eÀtŒL“ÕªÑ ¬&øÅ&OÅ:ï[åß^À–ëK¸KÅÄ÷4i-ç†À<cÀVò=5›´fé>%G‰ÎKÛ‚V‚¤Ên26Ø$n45¤jè÷é_ÖÕ)'_3¶¯s`3õrr¦SŒ}ôx¨!¶¸•¢ö_[N(.v›Úía§qŸî¦3¦8Øû°øBœÍ–L¡C[µ×D6Ô›s£Š*“[v|¥ŠÜÈÖ{ÙS1à-QÑÜjJ¿¦t6ˆH²ª¡èJæ.v3Òœ;¼‘m‡0‹aœšËX¾Ø.¢ˆ³{³¨eóÑ¿^`?›©ñ;Ï:¥Ó0Å–bÝ㔶ÌÑÃRW]“rßRhÔ9m+‡³í„C'™·d
·šQŒ¢5±p6±2ÑõfÉÕÐE¸Þ“BÆQp“«Õ†•O±x…W«æ©GIY@oJê š2䘸åÌJR£] -…r÷/Íbª@qVß^Ö¤—P=|2µ—µìãµê§s ‰z95Ô9ÓwPÍÌï©[kpź©ÐT¹ÆyHn7ܘʋïLŽD)”Ü;ÀÒ{3E%mp’~…n•Ø·¾‘d»1ýÕÔíbÚKõ”æ:’k/Œ×Ñi'»¼BæÇ#‹³»ºK-¶%†ù¶{eØ;aÍ2k“ØgN/äôãÕHÑ”?[f¶]íL@yœµûW“J’Þ°ÇàáD©®«Ï!oKs„uT|Í{â26O/æ¥:iþðNû–`X·¥%¸åøBo¥¨5©žAÖ²R}í–•–ZÕ—KÛ=D3ãå”Ì*±#¡æýH°LMU+kÄÐŽ:¢Ír²‚½]SI,O‰l¥Y‰”"LðH[ÓÊ…~•´ƒ1ɼÜ8%̹Éغ¶MßiòetsÈÌbUœL®‘%ì%Ì#›=¾©±°oÈ´NK»ß@v:ýÚ²å’i{ÿÕéHN¦Wö”„ÁuFG³2vë*3»¾”·HeµÒì -†¬2°ú¹+ñHŒdoüѬR¿6¬ÄM7MU -F+4“š·:4éÃôëùÑÜ$@؈`ä•px8G²{Lª•p¨*‘úÞM.+þÈ,®yèèQÛÁ)!N 3èÿ0@ÇÆOòbº¬Ó/€½e+ÄQ¯–«çÐ-à
u‡¢Nñr8«ª¥x•K¯ -8Ÿ6êuE^Jç%E„ñ©í^ï!>öðåP‘3ý`ßkŸæçðñM4 Ü›Ák -S(š¹àVcž&œw;^7 1f{ -ææõÏ^HóÌbÙêuà¨^(Ätõ9kJj•’]†çÆUi(6dÂ*mhkQÏdBwh<ª©KPìÍéXÝ&Xâ‡:>";ž¬øJK±‡IãPÛ¾ŽV|°5›%µât½è™ ~)×
ܘ¡È -Õw½`RsÚun'-Ã÷6!*)›Ö‚EÔ -ðŸAC/s÷ o'T©}Ie¿‰|<¤Å¸O?Äkú8Þ…O©õxÛÛïù2º¬§_ØÌbÑß‘_½.øõúÄhtwÉÔ”ÁI@¿§&†Ô›I5‚h43ïü oØ[7?²ÖM-±úw_Ò‹æ`?ÅN?äCû]ôÓÛOyû¥ßj“ñwO'õé´'oñtù®|ÁÀÛ»§0y¤ÖÞÞ=…ãÀ^!paÀú`WÅ yE ùûã“£zÀž<ˆùþý‰i‰ãþ÷~ä3žûø!ÓôøÓôøÓôøͧéñîK?ø2!>eº£ÈlÁÄ¥ªkØŽœÉM%³sÝ,"aFk(%Ýg¡Ç£r幬eûá,Ú(ÿðèGËåç¿4¬å$ÚÞEô‡@u»Ô••Æ’ø9ßä bâXô™–ä‡Ðº¶-Y‚&;P×Í©©„T©4E¾×Ú&åÞ¢íܹ¨.bg9LCbƒ›hŽgôSÍ’J¯‡:ö蟾±¸yüqóøâæñŠ›/ÿVŸYÆŸ–·û‚Ì -š¤‡Nn!~ÚRÆ÷ÿ*ÄÇå[}6œ¢êC¹Peˆùë’HãÀ$3“Yu_v(a®ÅkZÄ¢ÆGÌÿFO£iéíHöb)°í’7ýÝÂ{äb/Õõ\ÿ~l•ž”YtŒ£æþ»¹“_ô¸~ðuBNSF× †‚Ýf% n%°³N^ÀLÜ•¼²;€å¬zƒœt^àÕIeš"··>¦H62†à -ä1ÄnÕ¿¹(kÒ•Ó”¨ý9É7’FS[¾BQ*£ò¦±£#ÛA==½! -0j<)è›4¼&éH‹›oõÙx))¥?®"L]Û@pAô>ü -;²Ë+%†-ïªzþÃbE¥nU/t;¢°S×Ì¿0>TÑÉ -§˜úìáï,rOI™0xŒuÓŽU‡¢ ¦Š’V•GIœQ@jPƒ5´cÇñµ~=ñîh<ËÈáúͲö„R^ò×›¥K¤$i€c® ,—´r¤æŸµ±N1¢‹vˆÚq{žƒ‹ ’³Ë¢œP°,—_ào?ÕçâeŽÇÃÊ …öˆd9Ô¶(¿Ä¸r1Puw‚@ÙtVÏÍZס÷Ñ3ÕÐY¾D$Z¬¯Ø܉MÅÅ0ð”›[Yg<ºÄ2G©"Ï"Ü¥ËA
Áž×ÍR¨ñKÈñhéQî§zDó$s°#¦½¤nl–Å—²˜üÐÁ,QþCÌG6²s
,OÅ[,©E ÄGOã+;OÜÍ2)0ÿ: yó>/ãoô‡5e™™FJN@‹ˆ„ -w¥ô,T7ˆ_¢‹ÂÊv²=‹¸MyÛhlB‚p¸A¬—ÝV&°u`5L+ÎÁDA±O›…ó•X·ŸêsñRÖÆÃűÞwƒ’2¯Y{[ ’ZÚˆî’hÄèZ¬dR2†Á¶Â*îRÊz9´ªd%*ürvíÚ<ÅsæÐ窂˜âpRå!D.œÓFL ‘kw%À‹í2Ym -ô+0€PÝH&E#YrTÎÙÚýuânVjS„¾TÞ|«ÏÆKÉ
¾%2)œ*Öj$¶Îcï3oÌÑ0¨*cf9Îü¥DF ‰Í¹É¬fè|Öu™:ãÚ™:Îï"ç)t< -½ž’…ù…È0Ì8FÖOÆlÕ`Iä¯àÊ"ëw¶êiÎIF‰aûˆ Oçñ½¤¸"¶lhòZ—X—#LlHÒØT¡æͤ ™££¼@^¾Õ&㥼„ÇÓÈÊîR2Ûì[êaœ…ר2KwäÊÐÛÎ{&.²je¹Â,Œƒã'*»"%
~ñu€Fde+LÅÕZ–¿€Læ@ŠìãÑñ9+µ]E@ÃÓ_@Ê÷t#Åñˆ?Š,ÅT_djᇡ*$$„ò®CñEÛf|W¶à?7‰Ç˼¿ÎÛÍ:¥òJ,ïë·úl¼”PðÁ¹oP²¸˜–U02T¸«‰8ºèa.°ÁŒtãB/Ö]¢ì´ºÐ‘$E£ ±%Gƒƒ(ÛÊ7ñE¡b´h…†DêFŒÙP=g¦ÜÔŒ¯Ké\W•3ä$Ø¢èˆ"»!*‘&òd|?FZz”£„%Ó>¬2ì°º a©9ˆ¨Ã]NÄýA(‚%“a>ÎnŸ¹›¥2B WËÛoµÙxàñ¤>vF -‹ÛØU˺—%¸Á\¸Ãú=ÑL’el j8ôèîŠ×b—f:½aèuZ]pD.5‰InÝÀÙS€Èµu:9@Š’¬z[Â5¡0]šé›ªV”Ýeçá0ºcÈÃ6/£eRä¨fzèQ¯'ùéT°—qðÏ|Ïšt_’²v1»”j›¸›Eª¯èì¾ýV›—úgÜØP‰ú<úAŒ)áÈDx2ÁtÀY!T'…9þ«QWBÃà-ëÔ
N¦¤¬~L^C(œ±Y¯Ùšj~S·™H1D ÐR÷$Ü W\¤–$„OßÄ$™Ð‡Á½ApŒâåXºÃ;Q#Úȃ ¡8•ìØi¨DtE(6Å*£¸b¯w³Rmö×Oò6/¤Ô; á&B=oãV,\Lúðl¾:uj##]!*[#™4xb’Ëd‹Òþ+v³–‡ºšÓ4d‘,D!‰‹Ôk€¹)o¸´¢ö“DRÕùW–Ä…!6U.Á‚ÛŒ¶ú¥5ý -š.4&V
UõÈNò˜¦Nò^1#ïL.ÑfÀœÇv#ßGxÎV³UÅÝñ¤Ž~l†P3ËD&ó(¹ô-ô2@4€7I,Å -‹QQ
Í›Ó$µ0PÀ·elfᇒq0è€'tÂD2´ Šv3ŠÙE$D¯NʹƑ=˜àb§¥^èåfò3ˆ~K³ -©$¦P'ùmRT5c3ïª"
(`ÿiðÄKz»~/c’ÃÑ“¸ˆ¬Y`èpÓgª#1M}Ó…‘OÇþ0îê€Ñ_¼³(r;ÈoŠr1m!é -YrÈMdTùåÒ$Èõ«uB¶î:f¡Ö¨š]úü'݉wšÑ³ðØ´ž¨L5 -<éd.Âe,cjE5üÌ‘ž2k>HlHð¼¿NøùvÖ Ö)½…:øgL›&ᬹ¢œÑ¹ U9DfGUÊ£ÌczVCrt.²`öQŽ"úE - -TsžCIHÁFÍìbPmZ™½’î@aˆê!¶œÃCª pÑ‚¯9…ñÂtÐÜÅ®ŽJö@…Ÿiú¸¹ˆ+MèÀŒkÉýˆH¬Yö‚oä«ŽT_‚5>9r% -QYË?ib€
€Ñ¤ÖÀ‰^fxðŸœAÎbOtó€¾µ¡9Øõj·³þ+>TñoHgŽRJCÁ€‡Ð™C§É-¾`B*2šž0/ø9‡°F‡!¼ÞÀþÉ3d”…mrn †€ÿ"4!ô2Ç“8Š´§™TM¦&Û0\ó>Ô‘^6DÊ@Gœ…ðëß{Q¹Kµ@&¾¡^®ý;¤%Œ„˜i
x[E]³ìlJÀ^ê÷ -5q¨Z2?ý2‚*s -×Á1{Yrt[ -XËJ§ å6?¤éVËhæßæ¢9^3DTXÍÈ~òò/ä±+`ìñlQ Ï
u2ø0ÀYn‘õ¥µÆ'îWØÀÇ\€×tH*™%‹˜^N7Mw
P5ä¬Ub[IÚ¼xÓl7¯þRººgm(ØéÆÔ#2/i*vÛ³#àuK¤WÈ¥?1$Ÿû®Éç (íœüGTž·ÿˆQ|ü‡4p´èÜ]¦P=.ÇQl—ô*_@ž÷ûr’³"Ô£KŽ(
|Çåz—}Ü·¿„?Îðþ=cË{b}ßpÜw‹{j)â°qßI×E*Ò3C°ÀÛönß÷t ¿óvÄùšÉùX6a…q®Ä¸¤ž“"w_ƒ”âx30ôÔ,“Ç;I‚ŽJïî”6‚L+Tý¸,†PÌ…Çæ{9î¿?Þ‰Å)~ ¢nÈ~©žŒÂÈýÔ8aþ݃öQÓZŒd$”¡ô›=áö -Šî¶¸qaÖlÏ ›çD
/vQóµ‚ækÅÌ'6»3eœ#úƒyã؃ Xr<nüìN¥>ô,Wû·MÙVÕ&IGÞ¹ -Fü÷.PŠ×6Ùð§vß\Ú=~ˆ´{ü i÷øU_m3óR"™ý¼,² •ì ¸ì"q¡fÅÖ'@
£ª‡©ë)e½Ù -ÝJ¿•NåwZ†ZÃ+Ô^._m3óR¾›ÓóXª.øÑÊÙÒ˜ÿ8LUM1Nþ+¯Qĉ¬6Êš\öÙxϱ$y[ÕnŠr7Ê·8«é:ÖÌñž¸5Þ£ÃÅ’úÓweM°ø4vƒòP«‹©Ï¶¬Ë`
µ(ÿHe%4Fzv
ƒ){Þ†—Èœ&-ü2M·K£Îã¯
—¯¶™y)ÛÍéy¬:¿±Ñ³7àF6U‘\!m„¬v“!Ū-ùÓ™UÿF#Êð;Ô¼(5Œz@“ŸtMfКÆYÜ.®‡½‡©œ5V׋լvëö ¥ 2Õ,T6d6£;YVÏtõ¹9?;2ïìˆ!cé2¦ÉÊVÝîn:'’;’Òåd6ÜXÞ6›—dù«ÃííWÛ̼
çô8±¹hðÛŽ¶è8´ -Ílùlx
£÷À¢‹1[C bRÇTk“+ØYc°eƒ@BÙ˜ðÆ#™GK¬öP;Ëvd
ç“(‚¶ç.RÖšÏG¥K°ïZñˆÓ$×fŸ”ãD}%K)Þ(×ÝNú1¶?#Z§å˜ÍNç÷²4^xZ>ñ—¼6Ð^¾Úfæ¥l9ûyIÎŽZ7 -FÛ²Âo»T¢Äi‰nj™Ël÷ò™èmî=R
&l¦í7+”tÃýƒ$–m•û[= ×–í¬iÄ,iÈœ•ŸB»uÚEI%^¬mõ>ÒkÍ!‘,uû:“·«K}…˜½|µÍÌK)wNÏã"š¨ef,Ö…|ÅÀj3?h¦2¨™6ÉìRe»²U_½_«¸¦)¤.øºð#&M ¶dYl°˜‚¼Ã,0 ÖÂô³w©®“°!Tt/1ø'Í#«‚
*Ò¾‘¤»G<TJâA‹¾L&àÃy5Šç*8j+òWÃ${Ö˜»÷2—·ë^¡zpóÍ6+/åã9=/íp¹e¸û;¶!ürÕO²6É<4ød‹ ¨|5 -ê,‹¢h5÷ -xYæ™å£ÍY\CI„ÒÉ›
Mѳ£Ã½æÍŠF=I}`(0hòÍDž.ä毮O¾šóòžžÓƒÎ©„èôaÛÃâ´Éåðîd¡•°55v˜ò'›ÜÛÞC¹ŠÐÒð3~‡ÒºÇ÷,ZµÛÕzÂRYhŠ´ž§•ç©öïº1_D3£ì•PZš=¼
y¬êUÁðœ\¼$[ª¢ ÑÉÒY -D7Ø0›kzXئ¾™ËÛ…ëÏ,í¬7ßl³òRŸ“èæIllËÍ–" ±Ò`“i2îMàn˘•ü<IÕâÄgÉ!ˆ³¥ã¶=‡˜UŠÊ³?y— b!æd ~¹O -£úƒº‡ Õ%’†‡•à½7_9¹ -«5[à{ZLºSšdkâ<apmáÁHƒY¯ßáºÉõX½GœT2ýT/¾g¬[9ÆLŒ¥ˆd£Vàæ³DÞÛÙ1Ϫû줨îÎhÖ*s±”Ù ¶ÚF·›T«¶•·8Œæ5‰å3¢¨ˆÖ›-^ÖÂðø±9U–2I¾9oóľHr,q³"}ôʺÊì:9•luØdz»b ú}I˜hÒ¢søá «àhí¢‹Õí‹:óôV/¢z}Œäê³í¹lZ˜]SüƒÌQ9 Áš5=Yo'ZúÀ>êŒ{š¦0ÀÓü™âh5ž$Žyn`f;°YØ }f¤ÕCÁItAüúhŽ^KR-›¢…ÆV3÷l6›è<¨XïO¼Ê4x'ºAÛò¤ÅÐ5<YQFÙÙŠ;)6™iЛù„5kdx®NMî0ïXu½*º^FúÝw;m/d
aº¹™-&_«ÝØYæû G²ÝÑó•†Ñᘠ·ÃÍ9ŽxöRè§UœL]C¬ŒO©b4yÏvÊÃõÕõ¤M -öâ<«–¹ØÎÃv>V«zýü+ªp-N/¯ÈŽæê}Qå~ëìUföÛ|Æj)‡ÈœR…É_ä©’³,«ž²&+Œ1$¯Êg»·iBÖÜgîãÉ»õã,û>‹¼‰Õ˜;ÓNJ%¶Dï°fEšÀ®o1(Ú&¨pì*¤–ÈåÍÅ(˜È]lÌK†v®;è>™¥0·0~ï‰<ð kÆAX(Px"&+×yÕ%+Ü)¨¾ÊÛ -Óc¹æVˆÆT`y -rö[”·ÕS]›ÄuUµb|°¸EÑj‚‰êÖvL6ÏsPBôI+¢>6-g/i©F“«¬‚Á’ÕÀ°hÂÙÜQ-»8V,…!W+ÔIžGyžÊó`ŠG¡gù¤Vk’k³Z>ü¸”ÐÑÜû“ð„õM-ØziRl3(˜=g*(~ekž$j±Ø$gØTn¾ã¥4=_b~©5s|àL3Ý~à¡8{¶jíô ISƒSpÏDò"ÌàÙ—Wú‘Òç;¦ô!P›8}Š©òÔéŠÁaOý‰ºø= y¤›û?ÌÓ-*P±«ÜŽöÒ=]ô¬õ_^µÿ`Uƒ°÷úañûÀ®K³úzÿ÷‰ÞçÏ ö`k-âB3ñkcYM˜ÞÙ¡m&ÂÓ±ª¸Ï»ó½ÏqF—±ipÌä„w£Y²“iÁã(€ûa¿\U®·¥RåÇò¤Çè;{µ·W¿µ¼ü0™þ
§HµÄh|D§L9ïé*¨›Ô §¼Ze±löá鶖LŽM;¯ÙWoZ½3°tö_ñ‡i¶ôžÑªÇ>?vZ¡}ïscIÍÞ=ƒ£ÿ9XuÞýíÝ_|ô³úñß}þ›wŸüéÓ?¼y£¿ÿí§ÿò»Ï9r
V0hµë{×ÿ†ûŠÁwÿ|÷—ÿý“Çÿç“YàÝ— Ž_ýüÝ/öÓûÿr\û7”Æáãuõú§ üÑú¿_ýÇ
éÈJ†û{ºÙ3øŸ£f'·4™–k'\ò]ø×5ô÷åþç÷ÿøOáþ7ø¥_Ü1Vˆ:’ØYy?“I‘GÛ‡r÷Ä-¦÷žêœ]uA@ÕÚCµ».©è§žÌÌÇPmÊEÕo<r¾´,õS±µéT¿^>ˆ5†A°k_‚×aNÎ~_Ùr\n¾ëKYžù~ÝŒ"˜b.þµ˜'±I|¤š-x»GøÚoLßOɃrü’
¬»:òFÉf׌jÓ±³Gü—öÀ~™ýßë7½ýªï¶¹ù‡»g&ú™Å˜—×yfIŸ,ûoïžÐSÝâðíÝ3P} -ç§Ø¸å^êÐŒþ‡ÛíðѸ‰Ûê&ëýF?ÂHÔ@ûëÁªbÈiliÞ¥==+z0×虉{ü‰{ü°‰{ü‰{ü°‰{¼ûªf‚luÖq,ó®g/ÈI™#mw¤C<#§j5V[â÷h§ ;句e¿eS -¨}]Lü¸eqâغ±G)ƒoHпtˆÎ=ÙRØa”OŒÕ5)ü¹ <ãˆöaô¥b¬ -qèß«.Š‰MR’˜Õ9»â«ŸJ¶Ã4•Ì–5#qLõZT¨Guò+Noa"lSžnï?}€Èzü ‘õø"ëñƒDÖW¸O"«ÃK7»Nìd°Ò¢ì½¦ª£›“a½T *
(¯–¼È¬]Œß€&¶Ã{Í)¬ -±2»ØóÁxŠ@@DCv$μ§øi0Ñ0¦ú -tl€8`Ì“t×42¢F†u;iJ݈ìP¬ È]‹½ª½ -CÀ6Z—á%HYd'\ƒZ6Æ8¸fºíõh¸·w%:‹ÆøúdÏÓ÷é1Ùãô]u·&{N~覘ÌÔi*2Ô™ àsUe5µlѾ„Ó˜çDCÐ#ùnÙ¸RGbè£>¢Ä‡B\A@‰#h„óÈnëȯ"¦é¼2pÞ?ÌŽ|¼U¤çˆóv+öÓ+:Ï}üu‚n¦‘…tQ* -ìx°˜l4ì˜Ûý1”?ý±If4²ˆ ß JŸ .+züu³5DžU‰hAî‚e²‚)ŸÚ>Òäx£ßÊ¡ ÀÙ¹PVdâA3Ø—eÚRâãëGK7Ÿ?Ë=GÐ - ƒ9àh)/ù -Ñ=(SŽÌP–[š¶{jš³›œ=ªÂúF’Å%m„;ð}@pžÅÛŸëcµŠhÜŠ@0MtCgæ*àñ†YFÞm¼wo!‚9'°®‚NErsâÚýÓ‰¼YÆì…•¯
¿O?ܦÇñk¶Ow…×Ry%Ÿa±®yõÉ+%xü|¹cÁô’”q G’ ¬ŠïÕ°¢%µ6Ö™Êôè¼<äëX&t”á`vÃ¥Ù¥y¬Ù 30Â}…Õ*òÑ¥ˆ:ø¿q % -ÂͨRb,±!J©Â5ÕLJ†•Dp<ˆ§ -¯8ióJ(M£Ï¸™½XœÀ¥&!à†§Ù,^fØ•êN+;†ËÊp/ëW[yÊïÓ·é¹wû¶çîˆ=rPfŸ8„N: -“\øBBrq’”_æªbÄX×&iÜxIPÓÂPÎpÌhÝe‚ÉøC,@xRa¡X‚F#î{Vö†Nn¸¶ˆbí¬>²›Ä#Š“ò1àð¥•Iš‚{ œîðpNÞpWˆáTþGséÖ
Ãtyà÷Y‹€t:Ò |»ˆ0Q© -S«¤¾Ä0v¦nÜé`’;-e÷Úå׆áë‡Ûô8†-²0¶¹æ‡ ú>„‘¬1F²Zörª\?=–V” \@í+ëÑš‘ÍÇÁ¤ð¤ãˆZ½e^&$âû$·éFò2Ÿ\ï@p£ù–Õ “ZÍ¥ -)HD¥YÔƒ‘è0~–•4² aë'Æàb&„Áˆ -pÈe–E$ˆwF±‹¸áÙp¹
x†Ó”F`{²5Ì‘ºûÓâ†V_£÷ôÃmzÂ2׫÷ÎùÎÛwÛaW‹Ë3Ð0¬‘÷h‡œEA‰nÌfÃÅ™¨>†@Íȇ6Á¡ÊûHʆI€ÉG݇téÂRN‘»åÎ]²·5eHU’º!®Æ´¦îITÀ4ûò!âš•©Òe']¼lœØPc¬XW…2ÅD†"…–¯¹dsø½”=§^ä,fÃÓ#é>€˜n‘Y7çâ6óe•š¥‘ž×’2ý5‚øúá6=b6oŠ½mÁÈ*€iqy&[܆âÙ´85§2'(ãhDq§c-ËŠ2c®²ÅíÛ†ôF9ÛPç×.# Ãx¶0¯]„(P%f‚K:…TßÏóàHépš5DŽåëÅÝéA~´d©È¥BaŠ#”ÌŠÿeë2IˆHª*óf2ù‘2óü¢ŽëÛ‘Y«nf&^rƒn@:^¾×8[ïYïŸâÁp找ã*£ç ă¿Õ¬ÝË-ÌŠªú³ÎŒ€jé§
3$»‰5Šq›Þ°”í>j¬Ý’Û'R¦7ÞMVþ·˜Î»ñù1ÿ+S¯í–Ä›‹|š@a ´œÒ/–-c’HVšéJÎB7&Dú- -èà‹'¦*Ê[P˜ -‡ìæΓU% -BKŸŒx0z&ÌÀ9B ÎrÆUÃ8ž¾×83j+ ¾gž€¾RGsY”g²³øCoœ
‰*±fUW´ðã³Î2EÞ©^©§I8‘g æ:«ù¯Èx)=ZÈ*
fu :_‘ÙÆþlp xÁˆÖ9ϳdë¾$Ü70Súh1e¢€ u:ÛÜäÀ4%ÿV%ò$«Ø¤•Á¯]PY~ƒí!‘~+CågH±¡Á÷c_•€Á1f‚j7¤M/¶ûOxài×À=“áÄß®^ñDú?Ê©n¬m&Ðð'ÆX–akMpd’Ú]Öwmv¦ˆvëe]áŠ_g¨ÖŽÜ7K¦U9t<éé²0áx†vÅ -:;/°dË"¬À˜ÚÀ%±@qdªAV63Œe¶ìÁ9`î“qd*©…ŒÕ‘Tûr”ÿ@a-¸„‘¬Ëé?`æår³NןvBúѸdG*7Ý>°¢ˆ&°Âô`‰•µºGú=Â8m8Cñú¡iu A‡ŠÂ`å£ê¾™9™‘NR”%©Hfñ¢†L‘©L&á’#ÁXkŽ†ÒìŸ^D‘ûÝ(š°ÜÑÕÎe†¦‚¨Kˆw#Âym#
i±”4Ü<à/Óøhc‡ÄÎâÝÉ:»yסï¤Å#9³µË÷Å#â3~e+½µª7b!ëØ®‰ 9AŽ`¤s‡êlVŽÄàøƒ?*ñ"ÜÅ=Š„&ïÑ…ÜÔŽ;KŒñ¨eã^û®VgI -u׃ëwZↈ[…›f¾ÊS½îOuJÛ - ª?ŽŒLB‘U«uµi¶uæmC,‹LÆJC¶À -G,¨JÃÛ´Rég±'a… - _USÕz¡ÓŒ
Šódk˜Êb/I;uz:ÐP*epMÅ«´31=!%5 ”“ª–¼úM%sÑhü±Ñ¦6Ñ™í½Æ°Ï9frŒ„;¬ -g挓ª(Yy¥X–éÀîŸÀaFc× b¸<•äƒ)aþšî[ŸÆí¥ôQÕ÷É(V‰Ãkª¢]…¼Ý¤j\Îd^3.¸"ž,Ëã·ã×+SAþã%h«ñÜÔÚä)U°µ£DW¬Ò3þŸ¯ñm7,ù-k>4nvM`ð&Y@»$ÑôÂHûJ^’€¶âLÐk8žÒÈqb;Ÿb”ø–5/šÛâ¡=¸êºd{d*ݺ'sðøø² ¼ð¦Ô’áçV¤œŸÅ)ÖÑ'¥˜µ×ZÆåñµŽŸZ¨ðùbŠvïr´Òí_º;4«Þ±5Œê¡2ø/œ,šþÙÄ5º~Ê—ÍÐ7ô [ÒÜ°’¦(ŇóQÁÂÒþ4RjÆ^ÿz«Þ&¾pÂ<urÊ85Xóå es4ߌ½¿Sï2_Eë÷)/áÀõÛ¿;§ÔsS鳚ÚCi [“Ô4ì’aœ±ÍÊõ8V5eä!–Õ¯S=ä‚üî¹ Ï·*JÈ=D«¹G
[:…R6[𞤎ð8ÂciWŒz}Ä1Ãoݳ‡èÉæ·äSØsúþUä‘þ&ºb¿ê~Äí÷ü°¨$ß裾ŒIÒöÎ÷‰Jò>å<Œîy&É+>/èì_ίÆf›ß™ß—¿ƒ¦qh"úH®e&x Qã³óÔŒ¡%©òiÆuŠ@6™UGX²y8’êAöØ;º²ä@ÿ -lcLk¬ïg'%ùo5ÆSÒ&j»‘Q•¼%2Ø>`‰ü’û"¸°³Ü¾•¤›(€’cQ=<XÒÆ2{wËS„ïNÿܘ/Ð{£ª‹÷?==¥åÝ á<ë±'û’Æ…µ÷-xT/‰A)rD ßà -ôSå·¡XɺÈiQ|DZ•ªã"¸‹˜ è48 ®l·í±iŽ%ödÆêTþêåO6òH*#2¸Ÿ®šjê̘¥¹T¹ð¯U™LÇœë&rŒô}×à‡¼}fz}òÑ¿þå:Èý/Q¼´?]ÿ÷‹«Dùè‡+Q¾8ÍÇ™¸ÔIz?€½ô
s$ë}J˜†á²ÔÏõW£Æ-—\öˆgi²wÞjóÈ‹zãXñTyÕýþõ¯Áê:‘Lz>!7\ŽÕžŒ@‰¾ù¥vz”¨ðIÈÕ+Ãåqú¤/ã"}òÕú[baîé Ô‘"ešü+w/¾~]Kî¸=à/ùöîBˆª\S=!æË;úÀ[q¬:®AÆŠ¾ßŸsŒ?¶ÇöùƒR½ù’·_õ¡\‘O§ò¹é~ò -Ï.Ýuy/x{wÁÈS•'ûŸö¼ú¶ÑoÂëô#D^Dþþ¼Ô3•ìë
®Œ
æù-ø`$Ú@¾ƒ!TcŒ||Žá™|þµlmOC©”vs
éNoüø‹ðøa‹ðøáñ/Âí\>ø錜g-Älcð!"ŒgG:ë+¨¿’T»‰Ÿ6¤onH¢âÈ°*\æ’êšVí£ú°"éç{Ž±“>~¸‰³Á~Ža–5Gà#Òˆfše3r¬&+G@¿È®k¨@*`JH%TâaCbåËaiCÓEìæ„·¥i ©÷Šï÷§¡Œù7RàOßTž=~<{ü0yöø
äÙãW}¨MƇÒqí瀪À&ŸÝ
µhCE1›´²ÅIhDtxÇ)4ÀÎÁÛê4ø‰.o]“¢öÃÖ Ž‘¡+Àg¤-Tõ[ ¥ŒÜsq¸`Úw¦ÕY•È fWDŒ€Œ ¶Pøl¸ÄXtᇆ)vë¯ÍÊõ¬K‚u/…¼Ú
ðNc„d•@,Sg0rÚkmš\bé9‘O‡“=dÐnÚ%››±Y| ó0w¨6-ÛÈ5&ºkĘU5Q¤oÀE¹. ùû¡k¤¸$)Š`¬ù×±¯4QÁÖ½W˜ÜBR±ðW°÷.j“ñ-1‹”ÆÏWæ¸ØÃDl—µêê5‡ÊÊgv”wPu®±ë€d -k$t.®EÚ×®?Êõt&4œ=êb++Œ0+OËÁpÆ–áé²0iâbÍ÷×™¼¬á¸¹äÖñÌ\|;<d§‡æ%«Cjdé"QHaJ@'¸SP†éMäX(:""è¾ -0ª¿·aI£+·–ç2ʺ×nñL3"¥~Fðæ ¢r€f;‹VŠy¶BliSxÒ-=^pÝ.‹›©¼¬â¼¹æ×ùÜd|Kd`§Çd»8;f°ÉXj&~@Kñ›
š)sS“®:“%èÄ2ò*Ê.ˆ;œ¿„ëTv$» l›¡+xUÆsw=n›âÛƒRXÌæ¯è‚ÅßçE”R¥@pmÓ|ÊÔc’üÔ‹ó%3ªBN*jÀ×,ÛcCiÙÕW}°çíñ’Ûe4|ýðñzùP›ŒoƒüëäÜõÖ°¤D‚¦hàV¤¬rD$ŠpPÄa†ÃpM€UÚ°øgX4M£(Ó4Y̱‘\`×\841/•dª€xèÞµp5ÍH'é´ÀOŠ®16=© éâZ{5CžÔo£9 -³ïù¯Ð[áy§ì` U®û -Y®“y»Žêö - -Æ>ˆ!Í ¦Ê–„W¦é›€UtÀêtè^&OKèBð”VÑåÖЊϖ2èŠ*bF†Ît+øL*ªbÀÈ„É÷¿†ŠŠ•¨ -tl(³ùʹ<¯bqåú‡×'j“ñíwžÊnk×iË0³¡“Ñ%.Œ¹ù™>¯„†²uײæûšµ›Ü*RAÙ°†ú@U•ÀY»bwÖ÷5šIp "Äk·€WNépÕš0¥¡¦ X&~ÕR›S6´q%±Ûƒ’§u>Ñ”Á`VÛdë ÀèÆ$[‡®Z¶àÚ:-Kð´†éÿoïÛv$¹®+¿ þ¡^xŠ>÷ËÌ“Ô– -„"FzÞ>‡&´lz;6š±qžÆQ•¡QŠ%¦,©bôK”3y…ðÉÎ7`ž;¨qyö]¤r*.𢮜5~>õ/Ôø(–¿-æçE…‡ènÉÅ\½) %PýðâìÙG™øJÄŽêÓ-È%4´ - ¡bZŠuDSÖߨ|¡ 5ÈOhÐåYz‹tãTÎô0«‘èðŽâX³SbP»µÌº”þú¢ËØÛ/pp’¯ãÏ ^ÂÑ¥÷Т2™c -Jì¼?Ôw•=¶µeo4R©–}l¡)Öä*¡ÔèçHŃŠÆÛ˜¹i».3½ýz³pªq½ âIÅ/May:ê¬,„¤OLÕØåU…iDäx%Ür̆{ÇóÉ4í -ŠŽ™„„â«QÈgÝ55zªìiÓeë
£©¼Øy%¾«½û‹×ŽèÅ -Q6¼è²x$ôb£XÇßÝ -hԛ么ìfI;x_Ed&|õ".ùeY/è‰(š’¢%zVh…UÊõ¡•3He/ sÔ)+W†éù6’(Á©$m˜¤õ=×Ø!©ên³v,cZïb¸R½¼[BÓªbÈfWT{Ó¤h¦Çæ©z*7DI!'÷ܦ-A¯¬óZÞˆ
·ÜŠÔNžwÈÁÚ£ÙûÙÂÇÕ‚v¦.œ£w:PŠ]ñ'«6®Ý”`*däEAZŸ€Äû•dÉšÑÌbŠœvbµÛßÆ°]Ŭ’¤ú°nOa\+Û@îšÐè¡än
¹ Õ‘4ê¤ó -^O¾€a8HÌDÎZ+‚ч¦anOðI,G¯†8ãÊû -å¹€ƒ5Œ°¦[’/MÉ4Ì¢.:]¬‡e?<ó²MŽ Z»–tÌF±v*’ªÑí"Ã%^+×é$…Ÿ±©ïÅf˲ÅÇuÎ!ÜN³Ý¦1 õïÑ,.±Öc¸Mœ®8`ït҄ઠBpÑh8þDª„g‘<1íÅ$ ´Wx«]‹>k3<-ŠÝXóJO2?I6”u6{H«Ÿ??ö³"¹/Á´VÐÈ^Êj6YÑîql´k×O×·œJ¥;·`pP€X2%;~¥ÉJo¦8ãÊ -ð21<²é»i-/V4Pöä1»Î
w¬dÀ]5»OõQàPUûÙ.ù¢°ùé´÷{;ãœgO˜ªÀÆ"N: -¾Ó]t”[xÒò@=š?׬Ý~S‘ön˜ž}d…
?’ນö5£t÷·á†zÂ'½îäøãõF5hå¯Ëvž¦]åôù×µ`mØ»‚¼È°$c§nä…4ê{&RX‡LŒQëol–ÞdÏž"™ÿO§ÝP—E~üÞú{ê³þ7ÝërÅ»Îæ]ãºö›+;søÞá~dŒP´Z‘{‚Š«´é·)T')Ô >úþ|ìýùÈûóqwb|jdĵB×dÉ1—‘ Ê=T@„ÉXÝ°~\$sÇJŽ‘|xÉ^+¤PènÖ˜É@a{!K½Z×_°üEÇÈ°³–x“ȶÊ{šÙÒ°AU -}3åp5Š8Ìóð«ú\‡›ÓÕœÂYðèQŸ"vº¾(K8±C€baB'>÷¯X‚ b’%| -Ìã
'|Iü)6@/ØéÀä}¸Tf(ï?é¢í›)"àÕc8†Ë´.¶‹¿¹×‹í·ÿè1_½g9|ÙþåîÚF\Ý®Ëm}uw}ûä1˜^Ý]Ý5h–Ç»p
èÃ,]ÐD}÷(Õì^`÷Ýa÷óÓ¢àÊ^ -ör\J.(јËĘ]¡h Å¿×7h(¦h; Rb —“6OGvÈI˜ -áx<ïÛ×'TÀ©í®,É•…;-pµ¤ -
•›ËsÓìd“k€’¬â"
h¯Òt¬-áœÄÑ4C%¸<hÚ‰¬ôõJ¨ËÖp¥ÂÑÔ+œDzƒáÌ.5‰é9RD™b¾žâUæü«r©F¾ìj®ªWã->€™£Þ1Ö—\'ø^xVeò7x’³@Jò]×|*ôðõó›ÅÎÙùh“’¯\S¤¦{¼¾l¦é¾=ëÉšŒY=öiN¹HQ‘}‘óxY‘¦ábË2d)M€æô=Ž(¨E›i%ÜQDŠö»°¾É ¼ØК\‘œÎi·1¯'a¹Ð,|k×˯~è*îÊ’\Y¸}«¸Þ–nA—5 -ªqìí¹dóšHâÇo"¿ÚíN`ž=àÕÂЀ*•ÐNÄ»9²Eß„A î2¾“W ¢lÅÉTHQäø£Æ°eϱ\“Ó8Y¨9o‘Æ[F
îSî2‡~aŒ¢Þ09°wFÃ#ˆˆ5Ö™EdWNÌåñT.ÿE[=±¾lÏe=\ ="‹0k.}·7Ì&–#@„*]J -|
HrUZjF“¿pî*«‚ï…3;<0Ž?elò«]VÙýa~nšaŽ5-:IƒÔž4ì͇”‡32Š\§_®fÿ:ÊŒ®)«F1¾Ú'ö‚ƒª&¸S®0ÏJFxºpÇ0‚Ißí>÷Üù“tŠMfä°^íÆYƒÏ"žëAcÑx²Uð<·£k˜°)·‰R|Îúo™ö‹³&HOûùÕe[xM£ÈËzj5|ÑnÄûyº0¹ü@åQ(¬(a¤ˆî
Eu˜·Âòˆ8ñ’·ŽÒ);ê¢àÀ»‘<¹œSZÚÎ÷Ú5b5uqr¦0y`$«<<Ó×ÕëPÞ8=ÛùÐé):<Q8[84*ø£äoˆ˜Õåp%•,âÝ›³4 -›åª¯jz&FB‹ÐD!„™!R'ËJÅJ _ˆ»äø¡Q4Tëòxq/7Wd^°þÄrø²Ý†8ôpÝ©òQ÷é“ôfo7qÝé…OµGÇÚ‹[[Zö—ý€¢—Ø…ëÍ×ÔSÑ*l.yè{b¸n
ÓüºÑÎR¤‰àl+H]"21ê1FÇ: B}ÊVÞ~³’Wùž¶×öZÓ«£MÕœrJÀUÌ»OÄ'æÕƒÙ–c=áÉÊ-ìYç7÷éEÃ…,bÖ«Œ#~¼¼—ÛKî°__
_´ñ•žÂcÛï`ÏökÌØÚ)4Åâ!$ü·ìæü´ùÛ8Â@Üq*ähÖDz]H|vÜ„ªÈ.L›æP71,WԄפIÌ¿´º·sê„+î÷°Î•S˜šÇ=– -C¤&‘QjØI OcÐŒý[+<…&D_j‘Õ8“Y?cˆä‡c6Ѳ¿ku¬ã稫-íyk³¼È¤?¹¶l7¢;=]x >âPGÃÃ(æÔm8fw@Ò£Oµy¨6£ÅBQˆê6ÍæW¢ÑíS˜ZœëRÎ,¨%ÌH·‹õÚŒ ù ì3ÞDÁ4q«§WBÉÒëì!”‘Ä= -Ë[F÷3ÞL5Aoô+8ºâèp¥qÝÚ4Ë\øÐðsš]æ}=4Êyg¶2n¡½h)gŠ÷WV÷r{ÉDõ‚ö'—ÖíFl©'ÿšþŽv4_@¨qëD{oš²Šå*z5´NÅŽæ,ž -‹ß€‡ñïAfY1À½Í覓išŽ8TØú1‰P—¡ŽoÇrª2QÛ²õ-Pcsi±OŒ0†¾Ë*àçÆU±¶kè]ì4ãI®þÀÜÜkí÷®—U2Æ"Ýa3ƒ9ïÙÀžµj¥Óš¾º—ÛË& ´?¹¶l·àZ=]•½¤õɼBôD1’d£›¨{nêµ
NÈn1›è#Óm*<Ís–ýÈQ$½Éí‰8v°4t{Y™ŠìÄÄ¢Xø‹$²Ö‡øš@#NUxÚ^¹ÚŒ_÷Áf’X†÷¦‰¾th{Õ1“ª€:»€ õ‚òU`}7dȨMw)eC{W¨æ¾Ï|všJWør{Ūô‚ö§–Öí/fj=yc½›×J3?Ô`Òn6f˜$x:%rú -‰!=ŒeµÓˆÞtzÏÆZ+âsÇ(hB¨J½ÁòÁ‚íUOCø¨¡§=7 ŽÓœìÍÀXÈCß3«y~\XDšåþ -fnCb{þ)ÌLt,:ʨp„ÅÙ¥GXŠ‘É -ÜR-«9¤*—ºãdßbŒ©Ø:lšw¨Œr¨éŸ=ñqª˜<?êw¯Úï©”N„K]‰âÒ܆ ÁPíµ!£±‰Í†Ai ã”Ô ¬ŠÃŽQ< -¢“Ao1£®ˆÁ¶n/–䙻ƳÎ<0™«¸9ÞšQl®¡ú0£àÿÇöDãd¤áÈÚ"˜S¥?S.OÇ\¥QÛ{¤™FŸÖäµ³Æ}÷xyoÄyË’ó!1¹ ¹Ô˜èGÔ»R³§ªIcPК¢&!–l,ª<c²ùˆæ7Ô±”¾à›Qöèy˜N¾k`ü‰2cXœ®FW,Ö÷¿i}’Þ—ü¼T8 -w†=d
K¹öŠÕîxETkvÚÌäÄ5ËËH_œ-„ÛÛ -Ì]m–W%3Z¯$ÒŽA²·½4ijÙÒAQ];+AµÕæõMòq·˜»üùÒ(äj^+õ›”0ìê¨udöKŒ’pÛìðØ’'•§Uñݪ®L™ÜTD½ªØѾc²_ ¦°”ËF¤zÓùQ/ªÑ¬óBž -‹Ùâ(s·«ukt?oÖèÅÅÒPT@m`y²ªyÓ¸Ftî\k¡®÷†Äñê‰0çLGë:2wœ{Î]
kÞ£¨§cl tdV
Áð—©ï¬Oqú—)“R¢>Ç)de3‘µ˜×ä6LØ,Œ€G[ì‹;{õ™Æµ3-2ΫJ{B»Xk†rÞò9®5úVú)7€¸FŒ²äó"—Q¬ êŽ,qÁ ìÊQª¬[±ÂØyU|œì6”ÊÜ%Ž8zeD›/§ØàÒ±ò¢Ú.ÁÉ€Ã{Ç+ÊÚ]Ó¤Æ}l 3KÄm“j0|¡õ3Xà¡©Ä"š™Özå©nõüD,„S
Ï^vUŒVŸëÖÕ¾<¶9¼Ê}ûÍC -§5…Ïj·¾ö™6
ô…Zù{¥VV4P!B‘+ïzŒ-® -A¬ÏGð‹=~RpV“ï˜Ie> ;m'Ýêƒ0òÚÉ by:³ÍæTFXð”gûg8G0’Ï¡·YO¢¶Wh,!|(μV˜ -Xd¢Ã<ý¢‹,Œ©ÐæúÜ~ó:‹Ë‡$g÷?†/8|ŸÁß« -ÔpurÔü¬ƒÈïþÕÝQXllÙºVŠ—7/Á+3Ks;~¦ÛʬË,Éá×\¶ß”_hÝøÅýzç -Ø2ýËÝÕ5¿²1éÊ=]Ùæ+`8CæÕÝu`]…ßãU¿çKÌ_bæ‚w÷»ñ½ -ÒKôÕ@×X½¡ óç -¶1 †å¨‘øAü-kýkMžuÆHÔãTÐ#hQ$¦D=C¨Þ6Ï4D£9Ó⯘•–ƒæÿ*/ -Ø:ÝŒÕm¿nÊqYBld4}mÛÔƒ^¤5»Ï9§2pÌ&q¥!¹¦RdÉ&ÑPÓDOÕ5r‘úe$UÂ? -V¨B¶Rós‚)d¦ênŽ´“—“§Þ'[è묘KûBsòA[µRž†¦i¢ùâ7î:àüd,ŒøeQ&Œa¯ø\
éþñª]îYíGíÅ -Ø:ÝŒ m¿n‡HãJÉA„b-ŠJq“X¢(íq„2Æ0½4ìÅI›W.^´bÄ4»Tá"%Oè639]uóMN{5
0 -ðt°½@fÆäÆ9q“<ËÀH=Zó|C·/Í‹Yå”UÚ»v?ðÛ[ÏnŒrÿx}/vבóáâûrlnCÁ¶_”äeîMiÊãU/ÝÖ< -™K\ÏÚ7vXJ˜ìÙÆ°¨[J)¹9må”â².šúAÂ(I4Ö½« W¦ŠLl±§Ý.iCHfÉ´Ù¬â
ªÁŒdã'ÞQhiª›=ÎŒz¯˜gñtw² -Ufï¥P˜‹°ŸK_•¤ ª»Ðfå ‡ŠVÆÞÕ ½Ë^o<ÍéÌæÞ>¨qJ‰“1üñÒ^li|Ø ¾\[§›1í¡øˆ.5WÚ#k›BqOiCªÞµlo¡HDÆ®î[7FöSÑͬàHFßCsÕ[ƒ°]JYAºÚ†gŠ¦öÜ^íË´¡ìí½’…çèf-°À×Ì÷HœÁBIÚ;ø2PN(1“Fy&¡—6Ín,F¯Þ¡1‘67£à ‘¦¶ž‡Ëµ½ØÙí -kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ùc1ª!Ûl[æŹknf—ÔëÓRH´8t"J]°RFŽÎ¥Äs¨;°‡…H¶—?—ÕqK;;úÕZ³‰ÐK?Ø@öÌÑB$9s‹ëª}š HdûÔ)LO
¶cl„$:‡äBï²è„šM÷qµÍÔHÝdS%ÖÒÆ•œW÷bggK8¶/W@Ët+δcþÆÚM¡ Gk¶G'C;dä6%¾Bx¡´™îºÙ'Ã,Ð$ªMš,‡Nä2L³ÓÓnJÞE›—ÔqÆC1û"3Xiž6™1¥[=Êèv±>Š%Òûn±ÿZ‡bUŸ‰ÍA¶3A.~hÚ!ÆPØ™eóÕàÀ˜&VD¬Rœ@ÌJØò~&ˆÀnÓ÷vS&™å>O»mûrÂDöàÿ‡z(-€ÒÍÈÕ>.êüTTí|eë=m&EdÃä>í·MªY´Ñt4;¤ùf(͉°/ˆŸv@(Fvxz):<{‘s/ÍÝCÿMð©TŠíû½+iñÖ4h—¦ƒ²úÝqo Øà£m)Tî|UxõGÍAV†"=˜žc±8¼ò™o>Ë—Z#5¨´Ì®¹,Ï€ìtò¾c=Á\¢.rÄx±[1±í?ÄÉËV fb–ä6xgòî⊠–dæT[^¬Ùpʼ>áfå„€‘¥ÿ¶c՜€·™±Y' ÓÅW=yæ\I¤ž|+ÄD˹hpK¶É=ñ«Uf‘‡O†%yx -Ûl¨%ÉV9L
Ø–$<)ì®Ùž¤£ëÄi–G»ÌobTüƒ(òäöU§Fœ"™«Èæsƒéë‰É1ÀŽ*KT÷¼XÍÔö#™°¤q ¶9~,øk¥_X/ÊH׿ëÁ[3“k”xR€A2¯GEf›ŸrçA¦Õ žÚà#œõîæô<ê/_Ì``lܪ[F‹Îõƒiø#åöÁjJñf¼7J”ðk3šhÏ÷¡Œá£k¨š¡I˜†éòjÔYûbŠ©´Ê Ž - -‰¸#Š -â¬*,âk}¥Ñ”{Àû ïéá9\¨sD¼ÀŸIQ´Ï›¬‹´Útõf‡°3ÌCÏ`¶S|‚€ù«§[y•Zõ<å“ÝþiGªš©‰Óô®|‚JàJi£ÿ®ˆ&ìj\¨ÞŽÓÌFõD~P¶…fkñÞö³,ÙXûjkVOhl`¨a
-ìZ£Pœ:¸ÝìgÃÑ˘àê0²U$¯!Ÿ`5Õäìg·ù‘ɹí ï:Ï¡æU{ØÌ“,¦Î«v+'Г»zDÞôC0k·Î¸VÐŒï™?ºƒïuãS쩈OL6·vôê´PÌŒÎc„²g€—ÕõH):Ž%û»-±x¼´êöÙ7sYŸó±ç¥ø¸>·ÝâV1þ…£¾Xع® -œ
¹bc˜£õ^f·Ò©ï-ñž“·7®®Í¼¬¦¡æ{¶ÐÚ¦Bmº‘‘K§xÊÄt#c+–fu[´5Í©˜jaÁ}ôÏy
gV3=üªÙDûj³N’fÒ+T¤ßi€úç¬8²d/Ì=,îع¬åGVc(‹¨BJ‘ +Ç`) •ø!|‹gíõM +~erÓ´)œ,±£ógíÇÚCSh„B¿ÓÕ¢ºkZlÚU¤úø~ªSÖVH°ýqe´`
EJ§Ö5¤Øû̯
ñþ± +
9ìW„½)7y]þE{32]˜ÃžÿÍ+ÌëîÏ{nÞ-¼„.äk¡ùrR™64O`Æ<¨ Ç a^zù¼#©AUfŒƒÑpL/å¸ôE1sIöJ„)ËT)KhyñÐVð-B†ÒÈ'è%±fðø¦†ºáRM‹˜4FÖ0cð®‡2øDÕ“vf) +ÞTVûw&§’©dV¦Ã„ÎT5©ƒ,¾©á.š›ÇŽ} ƒÉ¾‘,wa5[ɑׅí欃SõJV*6‰]=L 2£ì±ëzMYž*Â’°ÞMß;,Cɘ¦jR“ÂQܸÃÏTeÆ +)¨ÐjÜÜä7$/¶åù11Àk>´p5ƒJMQUåµÑš1J\6Xz%VôžˆÒÙ’{±æ›qÎQ +n¿?j¿?fÿ/ø?Í +ßDd“ÿ¤žÀòŸ%k⬷üòÍM„U…ÓzBÌw/¹²êQýtûʯ´€ë97ÉímÙþEëA©^ÞäËïzÑ@gäå^¼¶_/~«{;}ùæd/1X^,ì+h~‰ø3|~yÞê/f*yí7ˆ} ÓàyPØ…%!õ?$Ñ‚ k"8Y±5„BĪöó_ËžXx¥RÚå3ä†8ýâçÜ„çÛ„çï½ Ïß{®+p÷Â/Wä¼j!fËÁD¾‘,J:Û%+<ÑdIõ×X¢j‘Þ¹¡Ú‹’á®aV½ê3ú¥úðK‘ËôÊ8c/ߧÈ
F„„á” @%‰Øpšë.)«ÉÈÿñ/r`v-¦„¢G•H6¤DMYÃMâè#üÊPšI}Ã÷øþæ$ÊXßxÑ¿ÿ¾úìùƒôÙó‡é³çï¡Ïž¿ëE½¢Û•U+K‡ +qËMiÞÄÔ”á+¾‰:‚ +sy}¥^¬õl”mqCÆ2{ª¢(³bh¢xÛÜ
+c%Hg’VˆÚ°åe’“
W…9…¹µ=½X‘ëV¶uû$0w÷¢^ŒÇPžžÊyÙßÚz€=JUL€¬Éæ «?®üdûtxc êK}kFߦ}„a‰²Hû@j‚ÂÈl¥wéW*:bµkdaØó‚8‡·ëÊ·Âj8 Z}hóþ¢0wh‹f7ÎËŸ¨/C6r7VÉ DA6R3²]ܶNµ”úRŠO/Öñºƒš_ø @õîE½"7;=¶e+ÈíšGs<C2,9ì€d×<h‡«'·ÃþÅÜQùNÓM™PD}ªÆïaûÉ.°®ë2_m ÊxH×°zWkä2Â6‘#í_to7“&FWI0¯e´£®ÝIpc»”²>#8ÿ„N1PÀ°E;Å|´[ÚžôÇ3^pÝŒËRÞíâ¼|æ#†ë|m1Bdvzè@‰ôò§@ÇZ:yJÍÊIr*ßl`¶n6é¦É ÜsVm0 3äáUôŠu¸| Ö©ªMR1wØG¡+]O´ªL»/#!œ²u*XV$BÔ)üŠz +Œ(‹ÀÚ¦ãªdeÿÔçÌ® +7©hâ\s&dCµäuí%HÏëñ#×M4º>~´Þ½¨ã!Äe§HÚH¥$lŠÏhE--%âDx"»
cl.'‚ÅšÃ~¦iƒ¢L³8¬‘–%Àq²Dphâ‹*É–€(èÞµs5Ím +ÈêtŽ EéÖ›\žThÆû×^m8Œ¨H¸Êý§nå–'ÔÌmTŽË¡cN
;e#Ò–l»(ÓšözÞÇÞ/y‹°w/êÅxOÙé±,x·å¬o|Ï5…u¥r‹LW¦žåu=¾cƧ4.”/õfë¶"dõ(,-G«réòÑs±Zæ`tÚ®æ^ÜÕ‡ÿuœ§à8mšŠ$ðÒwd³½V'U‰Æ‘ˆ—ÆìŠ(•<…WR½òÞe…—Ç 7†X”õJJc|ªqn×ýZ^·qÔþiàõîE½"&;=¶€*×*–܇sÊ‹a9%)H™±I^nrXbÇqNB]à³8ºÌ6€³f!¸MÕo
Ëpòkغ¾ÇŒƒ¬×º‚Фs +ɳÏþ?DET´:ÎLÚ;õʵ<obY&öÇŽÖ/êÅxéØé¡œ#·Ð:½3œÌ/q_èg1¿*ʶ_SȾþšµ[k™¡·Ck ª…ج]Ù;O@?iZEßåÚòÊ)Ý‚µV¥ô֔˄¯IÓmÊkÍgU8³<=þl¬U6“€YYokÖÁ8€©Ò¤Y‡>ÅÞ—+yÝÂ˧ջõb<ˆ^ì’OHÃh=~±KH±Útµ_¬‚†&¶kÛe 0êÏ·Sø¼µÑΈŒ»®ºoºma,ÝÊáN´ ¢1Íœ8ݶ¢Yëdö´ê{ƒÁQ„†-Nl¥ÖÉE_´Ò¸uédºò´y›‡ 0‚F£B¸G¦mˆ\Ò⺫bÈClfŒk3|£¤HÒ4Hª˜V +,)8$ s˜T,q@)¯ðØXbþ«2ü Ú fˆ9šR¹Ô°¢ +êXتBÛ,·pkPñ‹5œ®‡]Ø4]hR})»œÔáÙe°cÐù+ª>Õ cT*4ºLÔ
äÄÐU +…¡ ‰’’?kÊ7ƒ†!od‰šlÙ1YÜŸ¹úíÓdæ:×VC Á˜=^ñG†‚f¼c !¡øjòY|Jžê +÷´¹dœR£©\ì|ïã껿¬]¬ec^– +½Ûhóþ̨hX/Se†!t=ª;Nõ]¨ó¢FXFJ;9cE\+¼ˆ¦ü–²¬ëz"ª¦DéK‰^‹E[a7G}hg†ÃašS„US!_9¨#Sú¯k¹:’(!Áˆ©$mXÒÇþž‚mì¶S½·mç¯ÀP^+u|Ë<@ä`ºd!†l+£úÞIцŠ‰Þ
Q&SÈi9rs™0AØu-DÖƒŸÜŠ”PžšÞÈ1á£ù¶v4¹:ˆgÝuç+}§?¥PFƒrrýqíV}ä§AèÅl×,'þ^ùDNÝŒfŸˆisZÕ?ÿ8&ûŠm”¤¢ˆO!^ü//^Û11‰vèÓ™ÞAð¶-¥åõµS˜a<é«k-gd‘"¯ëdÄÆɪiØ%ª:¤È# wWœqç„…ùÜçàþÖ|K²£©)¹ÃÖvÑYc½,»°™³mrMÐJ¶¤C7Š»¯ÈG—ŒtL”¬bʸÏ*Ée¤M}/6¿.ë_.Ôƒ’ð{š7Ÿ–‚6 G›#\c-ÈXszÅ;ûNN€®"@M¾ãŸèA¥ò¬¢'ÄW½ ø}¿·Úµê³6+ìé e(þamÕ‚’§J²¡T}¨³ù%]`}íQ_r›‚UZÐxbÊj¶¬h39Hª·kÃçRƾ¥÷pà8(˜¬¾š’œ¥æJoÖªq§xD™CÙÊpºCÆõå–gf{³aÈ¢üªæß©¶œ±êï‘Æ“·ˆGÅÓ5èí +{I¾1P«Š+Vç;duZVW<nº¢Õ·sYÏÇ^q¹·˜Vêô8â–E…\‹ƒN3^Ê»í5~§g¹0ïP¦“F=Úõknå>®k_se*Y’Ã…$ðŽ–üµ8Üruùõ¡µz‡ûúº?´^¯7jE—Ën3{ZÙÊ?\_ׂµá‹„,|ÈðíÉ8ë‹òGæ»Úþs'ùZ‡²“ü3£¸”ýê‰Îjÿ¸òŒY¶w.5óÿ“^ê†JÁïü½ýï©Ï®‰å fað\ÿÍ}¦Nß;ýÞŸ +]ý$DßÁXÅ×íce¬êÌXuÁæŽÌ?—8*ÿpL^è¨9Ÿ]1œ`]2’NTE“Gj2Ü;ÜÖ‚€±¬dÛÞ²¯MTH¢›Ý24ßÉR¯n
."©èS‚c¾&Z°Dx¾•*8•TjƒŠöq°]´–7YÃ8]£t_Õ8«ÝµÖn[³æ󧲊iq& ’l#¨(!¦•‰©¡Î-úê,Ê*hû꼯ɼ?W6ªý”¡¢ßo¯²4²n=N}P—|UI3ùOÕd¼*–˜@9¹õ.¤9au[”vdIdÅûCÅ%š:z>Ð]Zw‘dÓLïÍ![Úû«™»º•ýHºö‡šþt»kmçåŸZ‡ËúO; ˜b:Øûå+‹û.ª›ø«?{ó³ŸÿEýû?ÿÍ?~õ«ßýÛ·oõï?ûú×ÿüJÞ,-x?¦',ý±(bª~õoþÓÿ‡¡êÿê]—ÈßþåWý¿xú/Oû£ÿ•—vøûãÃǹ\Ô??þ÷·ÿqá„úÅc(¡î.òÿvüŸ9DÿñTžþòéÿŸðôøÓõæíñ5¨‘Ë–ÔXŒ—`…(Ë{ÎvO5·D{œyPœMÃÌ0ÊoNÕÐq”¬§?Zof~ +I¡ÈÛçRhÇ*§§QÄɶ§¿ªÏåqúqzÚâ(×+¼xÕ÷0KýàPÕë‹»…‘d„Ên"Œ½ÅçþKTå´…oAÝÆaƒÚØ’µÇ)Ù2ðñ +&yY<¹Õ;àx‚ã7¡©'Ï¢ )ž¯ü™ç_Ñç_Ñç^Ñç_Ñç7ß½$¯-ÜmD&°ÊfdYÁFÑqýhìKlsJ¤a5ï¥ÔéŽÎD“^u( ‡_§¤<f„ù£#Cy¾ëÀð=ÜCÓ¨ŠÎ©É`+?2‚®
"
(‡NÀ2"÷%ÿ‚.‘/T!žHQTÕZä(Å ñõªbÁ+i&ùˆ|Úø"Ã$áaRPiè|“ýß’I¾à—¾ìËDá7¯/•Äï?T>°.|þ`]øüÁºð}˱–íß“9<=¸éèXÅ°é†ØNдº1tÉße@Æ9ðå,$ThP¢‰ž‰2?áh`g}¯@ ‚SLÑû!v\`™CE/x˜5ä"L…à<ŸþcÅë;Â'©û^Y’Wî²ÀÕÓV!*7—§¨ùœ“Ÿ€’¬Z$
£¯Ò{,EáÈŸÄA;C%»<hò‰¬^”PÇÉQ…S©e8݈”cIÀ=o‰µÙ’ÀæË·¢`ž"øåp¯·ESͼ”^Uë(žÆŸø|¼œkƬá:Á´Æ{°ˆ“Óµ–œeÆQ¢†o¡å¯_ëA'©_yM!|’zïår¬esÕ³½^Í˜Õ aŸþ+)i-’9r1+Û Ò`ì~QÊ,… Ñל:Èq+µèq]!EÔ§ û›œ<ŒAWÔ+’Ë¡ío{–;5ýÞõS×w¯,É+w[à*®¸(dëe͵jœ¡DS/yøI +)‹Ü#G’Ю˨ßÂïÀ<¿Ìyf˜m£p'ìJ*žÑƒoxªÄ:³ +V9Š#`blí¨çëB‰r9²^®\Æžu~sq!óR8}‘EnÂz•¤yÊ/—÷~{Éêý쯯ÆZ´ÇП^âhǾa=û1qKd§Ð,ŠeE»’àßò2î§çŽã +¤Y +Îê®8:\i<·6
mW½>üœ6ËV‡mrÙ]ó-´-åLñé•Õ½ß^rZ}Fû;—ÃËöòÕ‹¯Í^€…u4j@¨©òÄzoŠ“½ëÃsΩÖÑäÅ3±Ž)÷Af™0@½‡ÓÃ4`£æ÷Í/X'}¬V;/Ã,œRä´hb2¶mè;hãyÍ4×'ƒGdë²D†ªû¹mUðË5»•Dío™©{Ý`ﺪ’¹xp‡g!sŽµ¡žµj¥]³Ÿkuï7—íCŸ±þÎåð²=„ºõòX6¥.¬OfâJ(#}6ºE}¥ç¦nmKvGlâïy÷4ÎÙ +i"‘ ÎÑ›Iw•tàœHÁï@T–8§Î¦F7ƒS± ìÛγsoÓº +^,îýÞ¦êg¨¿{9¼lᙽÜ$+Z‘u4{É/ŽÞÈg"jae¯À(N‘±ÃŒ3§5C˃œžN(Ó2ÝΡÎ)È£lò?àz¢êª”®e,¶:H”SøKiªE¡’_„ÿß2T%¥ÀË¢tº§ôJ¡Ùi͘q–áh +N®4çQ•Â?€¼kP ÝœÊ÷*6pÜé‚¢›aÇ#•|6ÿÓËŽß[’ß~†ú;—ÃËö’ÚËcû¸ÒQOóoµåƒ–€ˆÞDB~8(#P;Yo^f“j³kL´±îB†Šö¬ÈŒæ:Å,5£^«…æ`B]°ƒ€–
¡ÅÊDß57Ùéämd +ŠXW¦ÉÜN)»çqZP +v×,)›@Ž¯$ÓR +‘ÆT¼ÇϪ¬j +êPvÕaÇd +²åàªëþ/{ò ®Döá!}ÉÂ"rê-67`WªÎ +Ù1qÞ9a°ä‚…Ns5Uõ>³ñ9(ž~è¨ÌÛTîèbm¦%ÛŠ3¹À“ëCÃß*€î>qW¸"Î%À’ò¦’¥˜óÉÃý¡XÄ%Ù;[UȯÞPŽœj±ÛWdÍl#Œñ©¹r⨚úC9q¦ø›>ç.ÛîaiÔÐÝ…Rì‚ìªuqƒn¯š¤‰ÿ“– +—Qãg^¯OEi“
fí¸^Âë\jI½²¸\ÄnªÖ©@¥Ïð+×°5o¯XûŽÛ¤º7ê°¨W0.*Ýv6 Zý¹mä+&´»š4_•ÌèNK¾²Eò…G‡Nj\fwPØ''¨»Õ¼¿Iîo¢Ñ7o|f£p¬I±T~ÒÐ0Á£V•‰v,8JȽHâ!&í*Ï®bÁU=²Î©¥zUq¤¿cr6°k3¥½‘4©«}Ž¨[l4÷mŽàÞw +‹ÍöúzZwÏüu³De.‡¢bêo³EåVDV}ð6â2ö®¥´‹½7|vŠmO„Dg:; +И¹Ë6½QäÜeû°üáYE_á/@¶à Fʬ̳>ÅÁcV-$ÝRStkîH®°‰¬Þ|¹&âÙf|AÚmPhß¾±a0dF×ZlxdX•…v·Øû¼7<t^lô¹ôK"1eõçM[£¸ ¬EÔ(9ËÁðÊhª{¬»0 +1KC./öŠfnfVœ=8ÂÍšsM÷àÒ±V¢ÚîÑÉàÄ{ƒç+ÊñžÝؤ¾l O3kʽI5`h
R4•cD«éŽÕWÞê1ÜÍp¢âÕ#¯ŠçêsÝMñÛ»›c•ÅŸ£ñHátOù¬þéhï‘éQ¤TªæÛøÌÉö™“ííÈÉö™ø¬ÄB±UÔÏ7 ±Øâ6»qƒd³:ƒ˜3Îÿ.^p±O_Ù"9;-¥§Ìzþ+Ó|з_Áÿ¾æ~Àå]~*´Ð,@€Ò|-ô†îÇÉ]‚ú_}V蟿¹î÷†í÷í÷†ì÷ìïÀMÆèïO’Mo£vÑl0íÌ-!*{ÛtgF Ý*ǴŘ™Y"É"sû^VMyá9Ï"04·•½[BøLc:©>ÚÈ®wÙ®ˆ°hWÔ0D¶?·_a=ì囂m›LÍ¬à›°7|2Îs¦]>9>úEÍ"Ìc êg³äí3¢É@ÒÛ¬Q»m!œzŽ|WPiN„yù‹Kä »ñûs·"`¹I²ÿõ‰ùŽ}ø‡2+š™@ =È¢f§¥vRG£.Ý¥ˆ_IšL\Í ðâáx*xïRŒ‡Òq÷ÃH'ÞÄKqú“÷ʶ¾deS`$N¢¹=‹åw2i Øù§áayœÿõ%ßÃ$üCXË^YM‹rT-ÇI’ù¡¿[µ´EŠCrysÔ(º“h½þ—oÎÂâ €ûY)Þ¿½_ÚÍÊíü™î¥ÝÙ’Ó_[²ÛZÚ?üîå¾üÎð2ýÍ›W7í•M¯ü¦Wpò +š®˜ûòÍëÈ|¿/WýõóphîA÷Ë3@¦ú™B2'MMÆ’hr|ÓÜL#Q#Þ(ª}Ÿ›”«žWÒÞ +¬uzWÝí¹ä¥–848MPÝŒ.ÝÒÜš{fH´ù°!,M'¾Zf5œ»_†3yªú¢´¸«LnœQ‚ó¸®xòtñÔ¶µ7I´'<îJWBëpÐa_ìÚĪí)#nøͤc4Ž[¼p²Ò4’'íÐ}YŸŠn© +Ó¢Ž…Šû"4äFƒ šÌÇ`“y®æ$+:ä°zk½»êìùͱ氱•vÊò¯šˆ8‰&SyEj$½þjBVŠ'9+•f–NaE1ÿjAô'”¤+›Ý%+~M2@kçe £ˆa¢¯Íû4ñ‹Xëô0†¼Ûs9ÍÅǸÄთ|(Hwh0³¢£w–WA»ö!4ý˪eˆ*ãŸ*ÅÍk˜‘ ’k'ú®×EûX§±XšQÈÁáÌsW,'@ϵšÌae¡‘Ä»Þ"S¶X¾â*%)¸[¡»ýAÆâÓFèÝ +¬uzÝúCAL@ œƒ5™;”¬Ch«6)ýªÇ
—¶EY†ŒÅ•Â£ŠÀ˜Æ°X"µTÓè©¥BûÔóreéË!¥]Ÿš,M +·Ü_ݦ S]ŒD<Íu:§I 9l6<7 ´Sç\Ž`MÊE9z…î¶'…Ø?m€Þ¯€×éQ\t·Ç¦·!ÄÞK«kïRºGk^V=‡·Ê¾±EL¶M¹¦Rd×&%=h°§ºr‘öe0MÂ]<CŠU{=Áú˜ +eŒaµ4|oÒä•Ã]/™f—&ÜÄê ýqV™sin^ä4WÓpÈ€1P"9¯ÞÒ(û™¶E
m¹ÀE"²aÈ6ÉæF²Ï€šO›×uWÏí—¢ª +Æ6‹õ)JuÿìѪÃi;‰œ]dÌ…PŽs„’].C³dŽ›ÁJQ[Þd/yÕ÷´Ù¬¦Wwj +i#x¬B#]zú°7V]œ‚;½ëU£3cZ–9Q{<˺H=ºÛ¿¡;™¶Å¬§Ï*Ý]û:îÇç…£<½\ß»½]¸ùtÑ}¿^§ÇÝžJʵ…î‚4(‚шª;·µ’Ì%ngo;B%L~¹1‚K)¥eL;ºœRÜÆE“;?Hp%‰FÕwÕËR‘2ût3KÚ”Y÷Ç?Ú<g—DB7'ð¨ö´æfS6ceÕô³€Iª;9¼s”–#lÕ]d†0xã¿PRÍSÓÝÛÁâio«[K>]t߯€×éa<q·çÎ26¾Ó\žz6/ZFk\ö=»}Û¶50§–Ñ +É;rQWH4Ʊ4p‘>Ï·á~¥4‡æó²_Fž²_8í‚ +í$rwp`*¾W5yÆzU@fǨ°˜‹N@.}g¼Éx@lw´X½Tt}}W[7v0¯ÒçiÇ3ÛÅ}+¾)]N®ó—K{·±¤?û¤¡}¿^§‡ñÃÝ¢ó½uKu¬m +e¹KRuå²
‡"»zÛº1ò:ÝÖ‡™0ÚRÀ5Û¥”¨«m¬äÑô± ÑÁ½êŽ™I”Ñ}«hà9ºY•,ð5›á«æŽÓc(I·%^ Je!fÒ2ÇKÀmo,F¯«ud‚ÇÚºG%M;ífŒûµ½ÛÙã +$<)ìK²MEyÆ¥§MÎ^^Ö2¿‰}PbÉ“ÛW2âɾ"ûà
?’î“%.Ä +Š,O<¾ÅÄÀ-M¾8ǵ‡mõq òo0ËYD?öÖc°E¾¾pº»>´¦*ÒÞA£ œ +
˜yËm+ÍÀa~Ùr'GS(±¹3¾àãTˆh€ã¬ª.âµ¾ÓhÊ=à>è·$ñáÎY¨:sļÀúIQtŒçMÖEÚ횺Ù!¬Áf‚]ô.dŸâ̤4£âƒ‡å¡ÒÕC%–°ˆÆTˆz@êŽe
µ3‡ÎÔäl:[k +ªâJ9é)†¯ˆ'lIu5C[¬+¹”{¡[Vó;MY¨¿ÚšKÍX8ÙóáBDÐ¥.úeˆj)‹DͬÌéaU«Žjʺ&Æú«®o*US†¤ÓªR Õ¢¸3–$’}³Í±ì"W·\òa,GCF²ql<Í·ýŠ1(K·(–»°}·÷xx§èÌTÉñ)<3V]QV1§B©Åˆqm¯1i(}Õ×$Ž³(J%éi‡²¿šs6WŠÙRu¨ÄYúb1|’ Ìžmûž½mƒ-¿´â‹Ø>¨añ”}œ>’âÞ36î0kÜ#s0À[6pSsÜñØ]!íÒÿ¼Xxjró«þ,ÊÅ¢¾›Ü(ó~n^
jca™ÃÝä5%7#ß`7Ýä¼Nr[(çV–èù®ÓjÞʼnÍ^f±V¸®ÚÃئÀ¸¾t'ÂônÜÁ¦pq/¡-ó¸?ûŠïõ(ä§aOˆŸà§ómW[(¶±ó¸ÅIÙTÀLJºÔJ):%¯^†ÆæÓ²û%[ó7sÙŸ[£®Kñ0úÒcó¸s̸»Aqˆºîbœ
dÑÍÛÑ›yô¼œ£Ïi5GîžÏ¼“”,¿¡Z®·Ì¢»¦Ârú!#»©§¬ž–æð‡ŒMYš½L—Cÿcªv†¤+ÏãyêOsÍXXâWm>ÝÖž••´¨ÆØÙ¢"åO[u}Îå”%¯BÞÓâ>ŠRÌB20CÙtÒ¸øbî¡úrhñ®6.ì{ÝÓ± eàÉÝ!'£?×vq¤µ•â
Ñr
®òQ}XzåE'ößúÝNÙzߨ±â—÷݆>ã×dëQ~_òJ¸Š¼Ô»L·áEMG®²ãþ¨„cËTþÌàð™Ááú’Ÿ‰ÅL,6§Ò‚šZlËŠ†ÓÅ,} +ì)Á[uŸë×Ì4n¢å̵4/Ÿƒ&ªœni–‹HÓß´Œq}ÊM¼SãRÎÓ¢]iho}n¿ 0000000016 00000 n
-0000045544 00000 n
+0000046044 00000 n
0000000004 00000 f
0000000006 00000 f
-0000055744 00000 n
+0000046095 00000 n
0000000007 00000 f
0000000008 00000 f
0000000009 00000 f
@@ -4977,9 +4996,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000013 00000 f
0000000014 00000 f
0000000018 00000 f
-0000045595 00000 n
-0000055567 00000 n
-0000055598 00000 n
+0000359516 00000 n
+0000372837 00000 n
+0000372868 00000 n
0000000019 00000 f
0000000020 00000 f
0000000021 00000 f
@@ -4989,9 +5008,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000025 00000 f
0000000026 00000 f
0000000030 00000 f
-0000045664 00000 n
-0000055451 00000 n
-0000055482 00000 n
+0000359585 00000 n
+0000372721 00000 n
+0000372752 00000 n
0000000031 00000 f
0000000032 00000 f
0000000033 00000 f
@@ -4999,9 +5018,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000035 00000 f
0000000036 00000 f
0000000040 00000 f
-0000045735 00000 n
-0000055335 00000 n
-0000055366 00000 n
+0000359656 00000 n
+0000372605 00000 n
+0000372636 00000 n
0000000041 00000 f
0000000042 00000 f
0000000043 00000 f
@@ -5027,9 +5046,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000063 00000 f
0000000064 00000 f
0000000068 00000 f
-0000045805 00000 n
-0000055219 00000 n
-0000055250 00000 n
+0000359726 00000 n
+0000372489 00000 n
+0000372520 00000 n
0000000069 00000 f
0000000070 00000 f
0000000071 00000 f
@@ -5040,9 +5059,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000076 00000 f
0000000077 00000 f
0000000081 00000 f
-0000045874 00000 n
-0000055103 00000 n
-0000055134 00000 n
+0000359795 00000 n
+0000372373 00000 n
+0000372404 00000 n
0000000082 00000 f
0000000083 00000 f
0000000084 00000 f
@@ -5052,9 +5071,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000088 00000 f
0000000089 00000 f
0000000093 00000 f
-0000045945 00000 n
-0000054987 00000 n
-0000055018 00000 n
+0000359866 00000 n
+0000372257 00000 n
+0000372288 00000 n
0000000094 00000 f
0000000095 00000 f
0000000096 00000 f
@@ -5078,9 +5097,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000114 00000 f
0000000115 00000 f
0000000119 00000 f
-0000046015 00000 n
-0000054869 00000 n
-0000054901 00000 n
+0000359936 00000 n
+0000372139 00000 n
+0000372171 00000 n
0000000120 00000 f
0000000121 00000 f
0000000122 00000 f
@@ -5091,9 +5110,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000127 00000 f
0000000128 00000 f
0000000132 00000 f
-0000046087 00000 n
-0000054751 00000 n
-0000054783 00000 n
+0000360008 00000 n
+0000372021 00000 n
+0000372053 00000 n
0000000133 00000 f
0000000134 00000 f
0000000135 00000 f
@@ -5103,9 +5122,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000139 00000 f
0000000140 00000 f
0000000144 00000 f
-0000046161 00000 n
-0000054633 00000 n
-0000054665 00000 n
+0000360082 00000 n
+0000371903 00000 n
+0000371935 00000 n
0000000145 00000 f
0000000146 00000 f
0000000147 00000 f
@@ -5129,9 +5148,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000165 00000 f
0000000166 00000 f
0000000170 00000 f
-0000046234 00000 n
-0000054515 00000 n
-0000054547 00000 n
+0000360155 00000 n
+0000371785 00000 n
+0000371817 00000 n
0000000171 00000 f
0000000172 00000 f
0000000173 00000 f
@@ -5142,9 +5161,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000178 00000 f
0000000179 00000 f
0000000183 00000 f
-0000046306 00000 n
-0000054397 00000 n
-0000054429 00000 n
+0000360227 00000 n
+0000371667 00000 n
+0000371699 00000 n
0000000184 00000 f
0000000185 00000 f
0000000186 00000 f
@@ -5154,9 +5173,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000190 00000 f
0000000191 00000 f
0000000195 00000 f
-0000046380 00000 n
-0000054279 00000 n
-0000054311 00000 n
+0000360301 00000 n
+0000371549 00000 n
+0000371581 00000 n
0000000196 00000 f
0000000197 00000 f
0000000198 00000 f
@@ -5180,9 +5199,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000216 00000 f
0000000217 00000 f
0000000221 00000 f
-0000046453 00000 n
-0000054161 00000 n
-0000054193 00000 n
+0000360374 00000 n
+0000371431 00000 n
+0000371463 00000 n
0000000222 00000 f
0000000223 00000 f
0000000224 00000 f
@@ -5199,9 +5218,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000235 00000 f
0000000236 00000 f
0000000240 00000 f
-0000046525 00000 n
-0000054043 00000 n
-0000054075 00000 n
+0000360446 00000 n
+0000371313 00000 n
+0000371345 00000 n
0000000241 00000 f
0000000242 00000 f
0000000243 00000 f
@@ -5217,9 +5236,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000253 00000 f
0000000254 00000 f
0000000258 00000 f
-0000046599 00000 n
-0000053925 00000 n
-0000053957 00000 n
+0000360520 00000 n
+0000371195 00000 n
+0000371227 00000 n
0000000259 00000 f
0000000260 00000 f
0000000261 00000 f
@@ -5249,9 +5268,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000285 00000 f
0000000286 00000 f
0000000290 00000 f
-0000046672 00000 n
-0000053807 00000 n
-0000053839 00000 n
+0000360593 00000 n
+0000371077 00000 n
+0000371109 00000 n
0000000291 00000 f
0000000292 00000 f
0000000293 00000 f
@@ -5268,9 +5287,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000304 00000 f
0000000305 00000 f
0000000309 00000 f
-0000046744 00000 n
-0000053689 00000 n
-0000053721 00000 n
+0000360665 00000 n
+0000370959 00000 n
+0000370991 00000 n
0000000310 00000 f
0000000311 00000 f
0000000312 00000 f
@@ -5286,9 +5305,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000322 00000 f
0000000323 00000 f
0000000327 00000 f
-0000046818 00000 n
-0000053571 00000 n
-0000053603 00000 n
+0000360739 00000 n
+0000370841 00000 n
+0000370873 00000 n
0000000328 00000 f
0000000329 00000 f
0000000330 00000 f
@@ -5318,9 +5337,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000354 00000 f
0000000355 00000 f
0000000359 00000 f
-0000046891 00000 n
-0000053453 00000 n
-0000053485 00000 n
+0000360812 00000 n
+0000370723 00000 n
+0000370755 00000 n
0000000360 00000 f
0000000361 00000 f
0000000362 00000 f
@@ -5337,9 +5356,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000373 00000 f
0000000374 00000 f
0000000378 00000 f
-0000046963 00000 n
-0000053335 00000 n
-0000053367 00000 n
+0000360884 00000 n
+0000370605 00000 n
+0000370637 00000 n
0000000379 00000 f
0000000380 00000 f
0000000381 00000 f
@@ -5355,9 +5374,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000391 00000 f
0000000392 00000 f
0000000396 00000 f
-0000047037 00000 n
-0000053217 00000 n
-0000053249 00000 n
+0000360958 00000 n
+0000370487 00000 n
+0000370519 00000 n
0000000397 00000 f
0000000398 00000 f
0000000399 00000 f
@@ -5387,9 +5406,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000423 00000 f
0000000424 00000 f
0000000428 00000 f
-0000047110 00000 n
-0000053099 00000 n
-0000053131 00000 n
+0000361031 00000 n
+0000370369 00000 n
+0000370401 00000 n
0000000429 00000 f
0000000430 00000 f
0000000431 00000 f
@@ -5406,9 +5425,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000442 00000 f
0000000443 00000 f
0000000447 00000 f
-0000047182 00000 n
-0000052981 00000 n
-0000053013 00000 n
+0000361103 00000 n
+0000370251 00000 n
+0000370283 00000 n
0000000448 00000 f
0000000449 00000 f
0000000450 00000 f
@@ -5424,9 +5443,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000460 00000 f
0000000461 00000 f
0000000465 00000 f
-0000047254 00000 n
-0000052863 00000 n
-0000052895 00000 n
+0000361175 00000 n
+0000370133 00000 n
+0000370165 00000 n
0000000466 00000 f
0000000467 00000 f
0000000468 00000 f
@@ -5442,9 +5461,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000478 00000 f
0000000479 00000 f
0000000483 00000 f
-0000047328 00000 n
-0000052745 00000 n
-0000052777 00000 n
+0000361249 00000 n
+0000370015 00000 n
+0000370047 00000 n
0000000484 00000 f
0000000485 00000 f
0000000486 00000 f
@@ -5477,9 +5496,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000513 00000 f
0000000514 00000 f
0000000518 00000 f
-0000047401 00000 n
-0000052627 00000 n
-0000052659 00000 n
+0000361322 00000 n
+0000369897 00000 n
+0000369929 00000 n
0000000519 00000 f
0000000520 00000 f
0000000521 00000 f
@@ -5496,9 +5515,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000532 00000 f
0000000533 00000 f
0000000537 00000 f
-0000047473 00000 n
-0000052509 00000 n
-0000052541 00000 n
+0000361394 00000 n
+0000369779 00000 n
+0000369811 00000 n
0000000538 00000 f
0000000539 00000 f
0000000540 00000 f
@@ -5514,9 +5533,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000550 00000 f
0000000551 00000 f
0000000555 00000 f
-0000047545 00000 n
-0000052391 00000 n
-0000052423 00000 n
+0000361466 00000 n
+0000369661 00000 n
+0000369693 00000 n
0000000556 00000 f
0000000557 00000 f
0000000558 00000 f
@@ -5532,9 +5551,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000568 00000 f
0000000569 00000 f
0000000573 00000 f
-0000047619 00000 n
-0000052273 00000 n
-0000052305 00000 n
+0000361540 00000 n
+0000369543 00000 n
+0000369575 00000 n
0000000574 00000 f
0000000575 00000 f
0000000576 00000 f
@@ -5567,9 +5586,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000603 00000 f
0000000604 00000 f
0000000608 00000 f
-0000047692 00000 n
-0000052155 00000 n
-0000052187 00000 n
+0000361613 00000 n
+0000369425 00000 n
+0000369457 00000 n
0000000609 00000 f
0000000610 00000 f
0000000611 00000 f
@@ -5586,9 +5605,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000622 00000 f
0000000623 00000 f
0000000627 00000 f
-0000047764 00000 n
-0000052037 00000 n
-0000052069 00000 n
+0000361685 00000 n
+0000369307 00000 n
+0000369339 00000 n
0000000628 00000 f
0000000629 00000 f
0000000630 00000 f
@@ -5604,9 +5623,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000640 00000 f
0000000641 00000 f
0000000645 00000 f
-0000047836 00000 n
-0000051919 00000 n
-0000051951 00000 n
+0000361757 00000 n
+0000369189 00000 n
+0000369221 00000 n
0000000646 00000 f
0000000647 00000 f
0000000648 00000 f
@@ -5622,9 +5641,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000658 00000 f
0000000659 00000 f
0000000663 00000 f
-0000047910 00000 n
-0000051801 00000 n
-0000051833 00000 n
+0000361831 00000 n
+0000369071 00000 n
+0000369103 00000 n
0000000664 00000 f
0000000665 00000 f
0000000666 00000 f
@@ -5657,13 +5676,13 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000693 00000 f
0000000694 00000 f
0000000698 00000 f
-0000047983 00000 n
-0000051683 00000 n
-0000051715 00000 n
+0000361904 00000 n
+0000368953 00000 n
+0000368985 00000 n
0000000702 00000 f
-0000048054 00000 n
-0000051565 00000 n
-0000051597 00000 n
+0000361975 00000 n
+0000368835 00000 n
+0000368867 00000 n
0000000703 00000 f
0000000704 00000 f
0000000705 00000 f
@@ -5680,9 +5699,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000716 00000 f
0000000717 00000 f
0000000721 00000 f
-0000048126 00000 n
-0000051447 00000 n
-0000051479 00000 n
+0000362047 00000 n
+0000368717 00000 n
+0000368749 00000 n
0000000722 00000 f
0000000723 00000 f
0000000724 00000 f
@@ -5697,9 +5716,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000733 00000 f
0000000734 00000 f
0000000738 00000 f
-0000048198 00000 n
-0000051329 00000 n
-0000051361 00000 n
+0000362119 00000 n
+0000368599 00000 n
+0000368631 00000 n
0000000739 00000 f
0000000740 00000 f
0000000741 00000 f
@@ -5715,9 +5734,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000751 00000 f
0000000752 00000 f
0000000756 00000 f
-0000048272 00000 n
-0000051211 00000 n
-0000051243 00000 n
+0000362193 00000 n
+0000368481 00000 n
+0000368513 00000 n
0000000757 00000 f
0000000758 00000 f
0000000759 00000 f
@@ -5747,13 +5766,13 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000783 00000 f
0000000784 00000 f
0000000788 00000 f
-0000048345 00000 n
-0000051093 00000 n
-0000051125 00000 n
+0000362266 00000 n
+0000368363 00000 n
+0000368395 00000 n
0000000792 00000 f
-0000048416 00000 n
-0000050975 00000 n
-0000051007 00000 n
+0000362337 00000 n
+0000368245 00000 n
+0000368277 00000 n
0000000793 00000 f
0000000794 00000 f
0000000795 00000 f
@@ -5770,9 +5789,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000806 00000 f
0000000807 00000 f
0000000811 00000 f
-0000048488 00000 n
-0000050857 00000 n
-0000050889 00000 n
+0000362409 00000 n
+0000368127 00000 n
+0000368159 00000 n
0000000812 00000 f
0000000813 00000 f
0000000814 00000 f
@@ -5787,9 +5806,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000823 00000 f
0000000824 00000 f
0000000828 00000 f
-0000048560 00000 n
-0000050739 00000 n
-0000050771 00000 n
+0000362481 00000 n
+0000368009 00000 n
+0000368041 00000 n
0000000829 00000 f
0000000830 00000 f
0000000831 00000 f
@@ -5805,9 +5824,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000841 00000 f
0000000842 00000 f
0000000846 00000 f
-0000048634 00000 n
-0000050621 00000 n
-0000050653 00000 n
+0000362555 00000 n
+0000367891 00000 n
+0000367923 00000 n
0000000847 00000 f
0000000848 00000 f
0000000849 00000 f
@@ -5839,14 +5858,14 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000875 00000 f
0000000876 00000 f
0000000877 00000 f
-0000000881 00001 f
-0000048707 00000 n
-0000050503 00000 n
-0000050535 00000 n
+0000000881 00000 f
+0000362628 00000 n
+0000367773 00000 n
+0000367805 00000 n
0000000885 00000 f
-0000048778 00000 n
-0000050385 00000 n
-0000050417 00000 n
+0000362699 00000 n
+0000367655 00000 n
+0000367687 00000 n
0000000886 00000 f
0000000887 00000 f
0000000888 00000 f
@@ -5863,9 +5882,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000899 00000 f
0000000900 00000 f
0000000904 00000 f
-0000048850 00000 n
-0000050267 00000 n
-0000050299 00000 n
+0000362771 00000 n
+0000367537 00000 n
+0000367569 00000 n
0000000905 00000 f
0000000906 00000 f
0000000907 00000 f
@@ -5880,9 +5899,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000916 00000 f
0000000917 00000 f
0000000921 00000 f
-0000048922 00000 n
-0000050149 00000 n
-0000050181 00000 n
+0000362843 00000 n
+0000367419 00000 n
+0000367451 00000 n
0000000922 00000 f
0000000923 00000 f
0000000924 00000 f
@@ -5898,9 +5917,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000934 00000 f
0000000935 00000 f
0000000939 00000 f
-0000048996 00000 n
-0000050031 00000 n
-0000050063 00000 n
+0000362917 00000 n
+0000367301 00000 n
+0000367333 00000 n
0000000940 00000 f
0000000941 00000 f
0000000942 00000 f
@@ -5918,103 +5937,440 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000954 00000 f
0000000955 00000 f
0000000956 00000 f
-0000000957 00001 f
+0000000957 00000 f
0000000958 00000 f
0000000959 00000 f
0000000960 00000 f
0000000961 00000 f
+0000000962 00000 f
+0000000963 00000 f
+0000000964 00000 f
+0000000965 00000 f
+0000000966 00000 f
+0000000967 00000 f
+0000000968 00000 f
0000000969 00000 f
-0000174447 00000 n
-0000174523 00000 n
-0000174747 00000 n
-0000175772 00000 n
-0000183336 00000 n
-0000248925 00000 n
-0000314514 00000 n
-0000000974 00001 f
-0000055683 00000 n
-0000049069 00000 n
-0000049913 00000 n
-0000049945 00000 n
-0000000987 00001 f
-0000049140 00000 n
-0000049795 00000 n
+0000000970 00000 f
+0000000974 00000 f
+0000362990 00000 n
+0000367183 00000 n
+0000367215 00000 n
+0000000978 00000 f
+0000363061 00000 n
+0000367065 00000 n
+0000367097 00000 n
+0000000979 00000 f
+0000000980 00000 f
+0000000981 00000 f
+0000000982 00000 f
+0000000983 00000 f
+0000000984 00000 f
+0000000985 00000 f
+0000000986 00000 f
+0000000987 00000 f
+0000000988 00000 f
+0000000989 00000 f
+0000000990 00000 f
+0000000991 00000 f
+0000000992 00000 f
+0000000993 00000 f
+0000000997 00000 f
+0000363133 00000 n
+0000366947 00000 n
+0000366979 00000 n
+0000000998 00000 f
+0000000999 00000 f
+0000001000 00000 f
+0000001001 00000 f
+0000001002 00000 f
+0000001003 00000 f
+0000001004 00000 f
+0000001005 00000 f
+0000001006 00000 f
+0000001007 00000 f
+0000001008 00000 f
+0000001009 00000 f
+0000001010 00000 f
+0000001014 00000 f
+0000363205 00000 n
+0000366827 00000 n
+0000366860 00000 n
+0000001015 00000 f
+0000001016 00000 f
+0000001017 00000 f
+0000001018 00000 f
+0000001019 00000 f
+0000001020 00000 f
+0000001021 00000 f
+0000001022 00000 f
+0000001023 00000 f
+0000001024 00000 f
+0000001025 00000 f
+0000001026 00000 f
+0000001027 00000 f
+0000001028 00000 f
+0000001032 00000 f
+0000363282 00000 n
+0000366707 00000 n
+0000366740 00000 n
+0000001033 00000 f
+0000001034 00000 f
+0000001035 00000 f
+0000001036 00000 f
+0000001037 00000 f
+0000001038 00000 f
+0000001039 00000 f
+0000001040 00000 f
+0000001041 00000 f
+0000001042 00000 f
+0000001043 00000 f
+0000001044 00000 f
+0000001045 00000 f
+0000001046 00000 f
+0000001047 00000 f
+0000001048 00000 f
+0000001049 00000 f
+0000001050 00000 f
+0000001051 00000 f
+0000001052 00000 f
+0000001053 00000 f
+0000001055 00000 f
+0000001397 00000 n
+0000001061 00000 f
+0000363358 00000 n
+0000363432 00000 n
+0000363507 00000 n
+0000363582 00000 n
+0000363659 00000 n
+0000001062 00000 f
+0000001063 00000 f
+0000001064 00000 f
+0000001065 00000 f
+0000001066 00000 f
+0000001067 00000 f
+0000001068 00000 f
+0000001069 00000 f
+0000001070 00000 f
+0000001071 00000 f
+0000001072 00000 f
+0000001073 00000 f
+0000001074 00000 f
+0000001075 00000 f
+0000001076 00000 f
+0000001077 00000 f
+0000001078 00000 f
+0000001079 00000 f
+0000001080 00000 f
+0000001081 00000 f
+0000001082 00000 f
+0000001083 00000 f
+0000001084 00000 f
+0000001085 00000 f
+0000001086 00000 f
+0000001087 00000 f
+0000001088 00000 f
+0000001089 00000 f
+0000001090 00000 f
+0000001091 00000 f
+0000001092 00000 f
+0000001093 00000 f
+0000001094 00000 f
+0000001095 00000 f
+0000001096 00000 f
+0000001097 00000 f
+0000001098 00000 f
+0000001099 00000 f
+0000001100 00000 f
+0000001101 00000 f
+0000001102 00000 f
+0000001103 00000 f
+0000001104 00000 f
+0000001105 00000 f
+0000001106 00000 f
+0000001107 00000 f
+0000001108 00000 f
+0000001109 00000 f
+0000001110 00000 f
+0000001111 00000 f
+0000001112 00000 f
+0000001113 00000 f
+0000001114 00000 f
+0000001115 00000 f
+0000001116 00000 f
+0000001117 00000 f
+0000001128 00000 f
+0000366587 00000 n
+0000366620 00000 n
+0000366467 00000 n
+0000366500 00000 n
+0000366347 00000 n
+0000366380 00000 n
+0000366227 00000 n
+0000366260 00000 n
+0000366107 00000 n
+0000366140 00000 n
+0000001129 00000 f
+0000001130 00000 f
+0000001131 00000 f
+0000001132 00000 f
+0000001133 00000 f
+0000001134 00000 f
+0000001135 00000 f
+0000001136 00000 f
+0000001137 00000 f
+0000001144 00000 f
+0000363735 00000 n
+0000363824 00000 n
+0000363898 00000 n
+0000363973 00000 n
+0000364048 00000 n
+0000364125 00000 n
+0000001145 00000 f
+0000001146 00000 f
+0000001147 00000 f
+0000001148 00000 f
+0000001149 00000 f
+0000001150 00000 f
+0000001151 00000 f
+0000001152 00000 f
+0000001153 00000 f
+0000001154 00000 f
+0000001155 00000 f
+0000001156 00000 f
+0000001157 00000 f
+0000001158 00000 f
+0000001159 00000 f
+0000001160 00000 f
+0000001161 00000 f
+0000001162 00000 f
+0000001163 00000 f
+0000001164 00000 f
+0000001165 00000 f
+0000001166 00000 f
+0000001167 00000 f
+0000001168 00000 f
+0000001169 00000 f
+0000001170 00000 f
+0000001171 00000 f
+0000001172 00000 f
+0000001173 00000 f
+0000001174 00000 f
+0000001175 00000 f
+0000001176 00000 f
+0000001177 00000 f
+0000001178 00000 f
+0000001179 00000 f
+0000001180 00000 f
+0000001181 00000 f
+0000001182 00000 f
+0000001183 00000 f
+0000001184 00000 f
+0000001185 00000 f
+0000001186 00000 f
+0000001187 00000 f
+0000001188 00000 f
+0000001189 00000 f
+0000001190 00000 f
+0000001191 00000 f
+0000001192 00000 f
+0000001193 00000 f
+0000001194 00000 f
+0000001195 00000 f
+0000001196 00000 f
+0000001197 00000 f
+0000001198 00000 f
+0000001199 00000 f
+0000001200 00000 f
+0000001213 00000 f
+0000365987 00000 n
+0000366020 00000 n
+0000365867 00000 n
+0000365900 00000 n
+0000365747 00000 n
+0000365780 00000 n
+0000365627 00000 n
+0000365660 00000 n
+0000365507 00000 n
+0000365540 00000 n
+0000365387 00000 n
+0000365420 00000 n
+0000001214 00000 f
+0000001215 00000 f
+0000001216 00000 f
+0000001217 00000 f
+0000001218 00000 f
+0000001219 00000 f
+0000001220 00000 f
+0000001221 00000 f
+0000001242 00000 f
+0000000000 00000 f
+0000364201 00000 n
+0000364290 00000 n
+0000364364 00000 n
+0000364439 00000 n
+0000364514 00000 n
+0000364591 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000365267 00000 n
+0000365300 00000 n
+0000365147 00000 n
+0000365180 00000 n
+0000365027 00000 n
+0000365060 00000 n
+0000364907 00000 n
+0000364940 00000 n
+0000364787 00000 n
+0000364820 00000 n
+0000364667 00000 n
+0000364700 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000165196 00000 n
+0000164010 00000 n
+0000164099 00000 n
+0000164173 00000 n
+0000164248 00000 n
+0000164323 00000 n
+0000164400 00000 n
+0000372953 00000 n
+0000046731 00000 n
+0000167129 00000 n
+0000066385 00000 n
+0000066270 00000 n
0000049827 00000 n
-0000058541 00000 n
-0000159418 00000 n
-0000160143 00000 n
-0000173817 00000 n
-0000060510 00000 n
-0000060547 00000 n
-0000160206 00000 n
-0000159481 00000 n
-0000063196 00000 n
-0000000997 00001 f
-0000147299 00000 n
-0000148055 00000 n
-0000159355 00000 n
-0000148118 00000 n
-0000147362 00000 n
-0000063689 00000 n
-0000049212 00000 n
-0000049677 00000 n
-0000049709 00000 n
-0000001004 00001 f
-0000132732 00000 n
-0000133484 00000 n
-0000147235 00000 n
-0000133547 00000 n
-0000132795 00000 n
-0000064172 00000 n
-0000001014 00001 f
-0000120560 00000 n
-0000121317 00000 n
-0000132668 00000 n
-0000121381 00000 n
-0000120624 00000 n
-0000064671 00000 n
-0000049284 00000 n
-0000049557 00000 n
-0000049590 00000 n
-0000001021 00001 f
-0000106070 00000 n
-0000106822 00000 n
-0000120496 00000 n
-0000106886 00000 n
-0000106134 00000 n
-0000065160 00000 n
-0000001022 00001 f
-0000001032 00001 f
-0000093888 00000 n
-0000094644 00000 n
-0000106006 00000 n
-0000094708 00000 n
-0000093952 00000 n
-0000065664 00000 n
-0000049361 00000 n
-0000049437 00000 n
-0000049470 00000 n
-0000001039 00001 f
-0000079247 00000 n
-0000080008 00000 n
-0000093824 00000 n
-0000080072 00000 n
-0000079311 00000 n
-0000066147 00000 n
-0000000000 00001 f
-0000067133 00000 n
-0000067894 00000 n
-0000079183 00000 n
-0000067958 00000 n
-0000067197 00000 n
-0000066651 00000 n
-0000058655 00000 n
-0000058947 00000 n
-0000056363 00000 n
-0000362622 00000 n
-0000059211 00000 n
-0000173880 00000 n
-0000173932 00000 n
-0000058383 00000 n
-0000000982 00000 n
-trailer
<</Size 1055/Root 1 0 R/Info 1049 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><45AB28F93CAE4209BAB0B0278EBC9323>]>>
startxref
362760
%%EOF
\ No newline at end of file +0000050354 00000 n
+0000050894 00000 n
+0000051425 00000 n
+0000051967 00000 n
+0000052501 00000 n
+0000053037 00000 n
+0000053571 00000 n
+0000048764 00000 n
+0000049260 00000 n
+0000049312 00000 n
+0000149504 00000 n
+0000149568 00000 n
+0000137318 00000 n
+0000137382 00000 n
+0000122718 00000 n
+0000122782 00000 n
+0000110491 00000 n
+0000110555 00000 n
+0000095974 00000 n
+0000096038 00000 n
+0000083742 00000 n
+0000083806 00000 n
+0000069074 00000 n
+0000069138 00000 n
+0000054106 00000 n
+0000054170 00000 n
+0000054920 00000 n
+0000054984 00000 n
+0000066206 00000 n
+0000066424 00000 n
+0000069865 00000 n
+0000069929 00000 n
+0000083678 00000 n
+0000084551 00000 n
+0000084615 00000 n
+0000095910 00000 n
+0000096756 00000 n
+0000096820 00000 n
+0000110427 00000 n
+0000111301 00000 n
+0000111365 00000 n
+0000122654 00000 n
+0000123502 00000 n
+0000123566 00000 n
+0000137254 00000 n
+0000138131 00000 n
+0000138195 00000 n
+0000149440 00000 n
+0000150263 00000 n
+0000150327 00000 n
+0000163946 00000 n
+0000165076 00000 n
+0000165109 00000 n
+0000164956 00000 n
+0000164989 00000 n
+0000164836 00000 n
+0000164869 00000 n
+0000164716 00000 n
+0000164749 00000 n
+0000164596 00000 n
+0000164629 00000 n
+0000164476 00000 n
+0000164509 00000 n
+0000165488 00000 n
+0000165798 00000 n
+0000167207 00000 n
+0000167437 00000 n
+0000168418 00000 n
+0000175955 00000 n
+0000241545 00000 n
+0000307135 00000 n
+0000373027 00000 n
+trailer
<</Size 1392/Root 1 0 R/Info 1391 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><483E7E53040A4057B79E46A3828ABB5E>]>>
startxref
373165
%%EOF
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala index 37485bccab..4fb0341684 100644 --- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala +++ b/src/compiler/scala/tools/nsc/doc/model/Entity.scala @@ -50,6 +50,15 @@ trait Entity { } +object Entity { + private def isDeprecated(x: Entity) = x match { + case x: MemberEntity => x.deprecation.isDefined + case _ => false + } + /** Ordering deprecated things last. */ + implicit lazy val EntityOrdering: Ordering[Entity] = + Ordering[(Boolean, String)] on (x => (isDeprecated(x), x.name)) +} /** A template, which is either a class, trait, object or package. Depending on whether documentation is available * or not, the template will be modeled as a [scala.tools.nsc.doc.model.NoDocTemplate] or a @@ -156,7 +165,11 @@ trait MemberEntity extends Entity { def isAbstract: Boolean } - +object MemberEntity { + // Oh contravariance, contravariance, wherefore art thou contravariance? + // Note: the above works for both the commonly misunderstood meaning of the line and the real one. + implicit lazy val MemberEntityOrdering: Ordering[MemberEntity] = Entity.EntityOrdering on (x => x) +} /** An entity that is parameterized by types */ trait HigherKinded extends Entity { diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala index a7f22e94ff..405da29a57 100644 --- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala @@ -17,7 +17,7 @@ import model.{ RootPackage => RootPackageEntity } class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory: ModelFactory with CommentFactory with TreeFactory => import global._ - import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyRefClass } + import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyValClass, AnyRefClass } private var droppedPackages = 0 def templatesCount = templatesCache.size - droppedPackages @@ -25,6 +25,8 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory private var modelFinished = false private var universe: Universe = null + private lazy val noSubclassCache = Set(AnyClass, AnyRefClass, ObjectClass, ScalaObjectClass) + /** */ def makeModel: Option[Universe] = { val universe = new Universe { thisUniverse => @@ -160,10 +162,18 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory * * All non-package members (including other templates, as full templates). */ abstract class DocTemplateImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends MemberImpl(sym, inTpl) with TemplateImpl with HigherKindedImpl with DocTemplateEntity { //if (inTpl != null) println("mbr " + sym + " in " + (inTpl.toRoot map (_.sym)).mkString(" > ")) + if (settings.verbose.value) + inform("Creating doc template for " + sym) + templatesCache += (sym -> this) lazy val definitionName = optimize(inDefinitionTemplates.head.qualifiedName + "." + name) override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot - def inSource = if (sym.sourceFile != null) Some((sym.sourceFile, sym.pos.line)) else None + def inSource = + if (sym.sourceFile != null && ! sym.isSynthetic) + Some((sym.sourceFile, sym.pos.line)) + else + None + def sourceUrl = { def fixPath(s: String) = s.replaceAll("\\" + java.io.File.separator, "/") val assumedSourceRoot: String = { @@ -187,33 +197,40 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory else None } def parentType = { - if (sym.isPackage) None else { + if (sym.isPackage || sym == AnyClass) None else { val tps = (sym.tpe.parents filter (_ != ScalaObjectClass.tpe)) map { _.asSeenFrom(sym.thisType, sym) } Some(makeType(RefinedType(tps, EmptyScope), inTpl)) } } val linearization: List[(TemplateEntity, TypeEntity)] = { - val acs = sym.ancestors filter { _ != ScalaObjectClass } - val tps = acs map { cls => makeType(sym.info.baseType(cls), this) } - val tpls = acs map { makeTemplate(_) } - tpls map { - case dtpl: DocTemplateImpl => dtpl.registerSubClass(this) - case _ => + val acs = sym.ancestors filterNot (_ == ScalaObjectClass) + val tps = acs map (cls => makeType(sym.info.baseType(cls), this)) + val tpls = acs map makeTemplate + + tpls foreach { + case dtpl: DocTemplateImpl => dtpl.registerSubClass(this) + case _ => } tpls zip tps } def linearizationTemplates = linearization map { _._1 } def linearizationTypes = linearization map { _._2 } - private lazy val subClassesCache = mutable.Buffer.empty[DocTemplateEntity] + + private lazy val subClassesCache = ( + if (noSubclassCache(sym)) null + else mutable.ListBuffer[DocTemplateEntity]() + ) def registerSubClass(sc: DocTemplateEntity): Unit = { - assert(subClassesCache != null) - subClassesCache += sc + if (subClassesCache != null) + subClassesCache += sc } - def subClasses = subClassesCache.toList + def subClasses = if (subClassesCache == null) Nil else subClassesCache.toList + protected lazy val memberSyms = // Only this class's constructors are part of its members, inherited constructors are not. sym.info.members.filter(s => localShouldDocument(s) && (!s.isConstructor || s.owner == sym)) + val members = memberSyms flatMap (makeMember(_, this)) val templates = members collect { case c: DocTemplateEntity => c } val methods = members collect { case d: Def => d } @@ -591,8 +608,14 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory /* Refined types */ case RefinedType(parents, defs) => appendTypes0((if (parents.length > 1) parents filterNot (_ == ObjectClass.tpe) else parents), " with ") - if (!defs.isEmpty) { - nameBuffer append " {...}" // TODO: actually print the refinement + // XXX Still todo: properly printing refinements. + // Since I didn't know how to go about displaying a multi-line type, I went with + // printing single method refinements (which should be the most common) and printing + // the number of members if there are more. + defs.toList match { + case Nil => () + case x :: Nil => nameBuffer append (" { " + x.defString + " }") + case xs => nameBuffer append (" { ... /* %d definitions in type refinement */ }" format xs.size) } /* Eval-by-name types */ case NullaryMethodType(result) => diff --git a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala index 7485533641..e332b28c67 100644 --- a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala @@ -21,7 +21,7 @@ import util.{NoPosition, Position} trait CommentFactory { thisFactory: ModelFactory with CommentFactory => val global: Global - import global.reporter + import global.{ reporter, definitions } protected val commentCache = mutable.HashMap.empty[(global.Symbol, TemplateImpl), Comment] @@ -172,7 +172,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => /** Safe HTML tags that can be kept. */ protected val SafeTags = - new Regex("""((&\w+;)|(&#\d+;)|(<code( [^>]*)?>.*?</code>)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""") + new Regex("""((&\w+;)|(&#\d+;)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|code|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""") protected val safeTagMarker = '\u000E' @@ -515,10 +515,50 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => /* INLINES */ + val OPEN_TAG = "^<([A-Za-z]+)( [^>]*)?(/?)>$".r + val CLOSE_TAG = "^</([A-Za-z]+)>$".r + private def readHTMLFrom(begin: HtmlTag): String = { + val list = mutable.ListBuffer.empty[String] + val stack = mutable.ListBuffer.empty[String] + + begin.close match { + case Some(HtmlTag(CLOSE_TAG(s))) => + stack += s + case _ => + return "" + } + + do { + readUntil { char == safeTagMarker || char == endOfText } + val str = getRead() + nextChar() + + list += str + + str match { + case OPEN_TAG(s, _, standalone) => { + if (standalone != "/") { + stack += s + } + } + case CLOSE_TAG(s) => { + if (s == stack.last) { + stack.remove(stack.length-1) + } + } + case _ => ; + } + } while (stack.length > 0 && char != endOfText); + + return list.mkString("") + } def inline(isInlineEnd: => Boolean): Inline = { def inline0(): Inline = { - if (char == safeTagMarker) htmlTag() + if (char == safeTagMarker) { + val tag = htmlTag() + HtmlTag(tag.data + readHTMLFrom(tag)) + } else if (check("'''")) bold() else if (check("''")) italic() else if (check("`")) monospace() @@ -563,7 +603,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => } - def htmlTag(): Inline = { + def htmlTag(): HtmlTag = { jump(safeTagMarker) readUntil(safeTagMarker) if (char != endOfText) jump(safeTagMarker) @@ -634,7 +674,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => } def link(): Inline = { - val SchemeUri = new Regex("""([^:]+:.*)""") + val SchemeUri = """([^:]+:.*)""".r jump("[[") readUntil { check("]]") || check(" ") } val target = getRead() @@ -645,18 +685,20 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => }) else None jump("]]") + (target, title) match { - case (SchemeUri(uri), Some(title)) => - Link(uri, title) - case (SchemeUri(uri), None) => - Link(uri, Text(uri)) - case (qualName, None) => - entityLink(qualName) - case (qualName, Some(text)) => - reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'") + case (SchemeUri(uri), optTitle) => + Link(uri, optTitle getOrElse Text(uri)) + case (qualName, optTitle) => + optTitle foreach (text => reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'")) + // XXX rather than warning here we should allow unqualified names + // to refer to members of the same package. The "package exists" + // exclusion is because [[scala]] is used in some scaladoc. + if (!qualName.contains(".") && !definitions.packageExists(qualName)) + reportError(pos, "entity link to " + qualName + " should be a fully qualified name") + entityLink(qualName) } - } /* UTILITY */ diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index 76df0a6bd6..8ec93d70e3 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -103,11 +103,8 @@ trait CompilerControl { self: Global => throw new FatalError("no context found for "+pos) } - private def postWorkItem(item: WorkItem) { - scheduler.postWorkItem(item) - } - - private def onCompilerThread = Thread.currentThread == compileRunner + private def postWorkItem(item: WorkItem) = + if (item.onCompilerThread) item() else scheduler.postWorkItem(item) /** Makes sure a set of compilation units is loaded and parsed. * Returns () to syncvar `response` on completions. @@ -132,13 +129,8 @@ trait CompilerControl { self: Global => /** Sets sync var `response` to the fully attributed & typechecked tree contained in `source`. * @pre `source` needs to be loaded. */ - def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) = { - if (debugIDE) { - println("ask type called") - new Exception().printStackTrace() - } + def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) = postWorkItem(new AskTypeItem(source, forceReload, response)) - } /** Sets sync var `response` to the position of the definition of the given link in * the given sourcefile. @@ -230,7 +222,9 @@ trait CompilerControl { self: Global => } /** Asks for a computation to be done quickly on the presentation compiler thread */ - def ask[A](op: () => A): A = scheduler doQuickly op + def ask[A](op: () => A): A = if (self.onCompilerThread) op() else scheduler doQuickly op + + def onCompilerThread = Thread.currentThread == compileRunner /** Info given for every member found by completion */ @@ -258,7 +252,9 @@ trait CompilerControl { self: Global => // items that get sent to scheduler - abstract class WorkItem extends (() => Unit) + abstract class WorkItem extends (() => Unit) { + def onCompilerThread = self.onCompilerThread + } case class ReloadItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem { def apply() = reload(sources, response) @@ -296,12 +292,12 @@ trait CompilerControl { self: Global => } class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem { - def apply() = self.waitLoadedTyped(source, response) + def apply() = self.waitLoadedTyped(source, response, this.onCompilerThread) override def toString = "wait loaded & typed "+source } class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem { - def apply() = self.getParsedEntered(source, keepLoaded, response) + def apply() = self.getParsedEntered(source, keepLoaded, response, this.onCompilerThread) override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded } } @@ -321,4 +317,3 @@ object ShutdownReq extends ControlThrowable class NoSuchUnitError(file: AbstractFile) extends Exception("no unit found for file "+file) class MissingResponse extends Exception("response missing") - diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index ddc870a045..2563feeb72 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -277,7 +277,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") * @param pos The position of the tree if polling while typechecking, NoPosition otherwise * */ - protected[interactive] def pollForWork(pos: Position) { + private[interactive] def pollForWork(pos: Position) { if (!interruptsEnabled) return if (pos == NoPosition || nodesSeen % yieldPeriod == 0) Thread.`yield`() @@ -386,7 +386,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") private var threadId = 0 /** The current presentation compiler runner */ - @volatile protected[interactive] var compileRunner = newRunnerThread() + @volatile private[interactive] var compileRunner = newRunnerThread() /** Create a new presentation compiler runner. */ @@ -553,7 +553,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } } - protected def reloadSource(source: SourceFile) { + private def reloadSource(source: SourceFile) { val unit = new RichCompilationUnit(source) unitOfFile(source.file) = unit reset(unit) @@ -561,7 +561,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Make sure a set of compilation units is loaded and parsed */ - protected def reloadSources(sources: List[SourceFile]) { + private def reloadSources(sources: List[SourceFile]) { newTyperRun() minRunId = currentRunId sources foreach reloadSource @@ -569,7 +569,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Make sure a set of compilation units is loaded and parsed */ - protected def reload(sources: List[SourceFile], response: Response[Unit]) { + private[interactive] def reload(sources: List[SourceFile], response: Response[Unit]) { informIDE("reload: " + sources) lastWasReload = true respond(response)(reloadSources(sources)) @@ -577,7 +577,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** A fully attributed tree located at position `pos` */ - protected def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match { + private def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match { case None => reloadSources(List(pos.source)) val result = typedTreeAt(pos) @@ -612,31 +612,28 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** A fully attributed tree corresponding to the entire compilation unit */ - protected def typedTree(source: SourceFile, forceReload: Boolean): Tree = { + private def typedTree(source: SourceFile, forceReload: Boolean): Tree = { informIDE("typedTree " + source + " forceReload: " + forceReload) val unit = getOrCreateUnitOf(source) if (forceReload) reset(unit) parseAndEnter(unit) - if (unit.status <= PartiallyChecked) { - //newTyperRun() // not deeded for idempotent type checker phase - typeCheck(unit) - } + if (unit.status <= PartiallyChecked) typeCheck(unit) unit.body } /** Set sync var `response` to a fully attributed tree located at position `pos` */ - protected def getTypedTreeAt(pos: Position, response: Response[Tree]) { + private[interactive] def getTypedTreeAt(pos: Position, response: Response[Tree]) { respond(response)(typedTreeAt(pos)) } /** Set sync var `response` to a fully attributed tree corresponding to the * entire compilation unit */ - protected def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) { + private[interactive] def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) { respond(response)(typedTree(source, forceReload)) } /** Implements CompilerControl.askLinkPos */ - protected def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) { + private[interactive] def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) { informIDE("getLinkPos "+sym+" "+source) respond(response) { val preExisting = unitOfFile isDefinedAt source.file @@ -699,7 +696,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") import analyzer.{SearchResult, ImplicitSearch} - protected def getScopeCompletion(pos: Position, response: Response[List[Member]]) { + private[interactive] def getScopeCompletion(pos: Position, response: Response[List[Member]]) { informIDE("getScopeCompletion" + pos) respond(response) { scopeMembers(pos) } } @@ -740,7 +737,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Return all members visible without prefix in context enclosing `pos`. */ - protected def scopeMembers(pos: Position): List[ScopeMember] = { + private def scopeMembers(pos: Position): List[ScopeMember] = { typedTreeAt(pos) // to make sure context is entered val context = doLocateContext(pos) val locals = new Members[ScopeMember] @@ -773,13 +770,13 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") result } - protected def getTypeCompletion(pos: Position, response: Response[List[Member]]) { + private[interactive] def getTypeCompletion(pos: Position, response: Response[List[Member]]) { informIDE("getTypeCompletion " + pos) respondGradually(response) { typeMembers(pos) } //if (debugIDE) typeMembers(pos) } - protected def typeMembers(pos: Position): Stream[List[TypeMember]] = { + private def typeMembers(pos: Position): Stream[List[TypeMember]] = { var tree = typedTreeAt(pos) // if tree consists of just x. or x.fo where fo is not yet a full member name @@ -848,40 +845,42 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } } - /** Synchronous version of askStructure. */ - def getStructure(source: SourceFile, response: Response[Tree]) { - getUnit(source) match { - case Some(_) => waitLoadedTyped(source, response) - case None => getParsedEntered(source, false, response) - } - } - /** Implements CompilerControl.askLoadedTyped */ - protected def waitLoadedTyped(source: SourceFile, response: Response[Tree]) { + private[interactive] def waitLoadedTyped(source: SourceFile, response: Response[Tree], onSameThread: Boolean = true) { getUnit(source) match { case Some(unit) => - if (unit.isUpToDate) { debugLog("already typed"); response set unit.body } - else { debugLog("wait for later"); outOfDate = true; waitLoadedTypeResponses(source) += response } + if (unit.isUpToDate) { + debugLog("already typed"); + response set unit.body + } else if (onSameThread) { + getTypedTree(source, forceReload = false, response) + } else { + debugLog("wait for later") + outOfDate = true + waitLoadedTypeResponses(source) += response + } case None => debugLog("load unit and type") try reloadSources(List(source)) - finally waitLoadedTyped(source, response) + finally waitLoadedTyped(source, response, onSameThread) } } /** Implements CompilerControl.askParsedEntered */ - protected def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) { + private[interactive] def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree], onSameThread: Boolean = true) { getUnit(source) match { case Some(unit) => getParsedEnteredNow(source, response) case None => - if (keepLoaded) - try reloadSources(List(source)) - finally getParsedEnteredNow(source, response) - else if (outOfDate) - getParsedEnteredResponses(source) += response - else - getParsedEnteredNow(source, response) + try { + if (keepLoaded || outOfDate && onSameThread) + reloadSources(List(source)) + } finally { + if (keepLoaded || !outOfDate || onSameThread) + getParsedEnteredNow(source, response) + else + getParsedEnteredResponses(source) += response + } } } diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala index 250f648250..53ef20507f 100644 --- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala +++ b/src/compiler/scala/tools/nsc/interactive/Picklers.scala @@ -160,7 +160,7 @@ trait Picklers { self: Global => implicit def askLoadedTypedItem: CondPickler[AskLoadedTypedItem] = pkl[SourceFile] - .wrapped { new AskLoadedTypedItem(_, new Response) } { _.source } + .wrapped { source => new AskLoadedTypedItem(source, new Response) } { _.source } .asClass (classOf[AskLoadedTypedItem]) implicit def askParsedEnteredItem: CondPickler[AskParsedEnteredItem] = diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala index 39c27cfbb1..85dcff2086 100644 --- a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala @@ -5,8 +5,9 @@ package scala.tools.nsc package interpreter -import scala.tools.nsc.io.AbstractFile +import scala.tools.nsc.io.{ File, AbstractFile } import util.ScalaClassLoader +import java.net.URL /** * A class loader that loads files from a {@link scala.tools.nsc.io.AbstractFile}. @@ -17,28 +18,42 @@ class AbstractFileClassLoader(root: AbstractFile, parent: ClassLoader) extends ClassLoader(parent) with ScalaClassLoader { - private def findBytes(name: String, onError: => Array[Byte]): Array[Byte] = { + protected def classNameToPath(name: String): String = + if (name endsWith ".class") name + else name.replace('.', '/') + ".class" + + protected def findAbstractFile(name: String): AbstractFile = { var file: AbstractFile = root - val pathParts = name.split("[./]").toList + val pathParts = classNameToPath(name) split '/' for (dirPart <- pathParts.init) { file = file.lookupName(dirPart, true) if (file == null) - return onError + return null } - file.lookupName(pathParts.last+".class", false) match { - case null => onError - case file => file.toByteArray + file.lookupName(pathParts.last, false) match { + case null => null + case file => file } } - override def findBytesForClassName(name: String): Array[Byte] = - findBytes(name, super.findBytesForClassName(name)) - + override def getResourceAsStream(name: String) = findAbstractFile(name) match { + case null => super.getResourceAsStream(name) + case file => file.input + } + override def classBytes(name: String): Array[Byte] = findAbstractFile(name) match { + case null => super.classBytes(name) + case file => file.toByteArray + } override def findClass(name: String): JClass = { - val bytes = findBytes(name, throw new ClassNotFoundException(name)) - defineClass(name, bytes, 0, bytes.length) + val bytes = classBytes(name) + if (bytes.isEmpty) throw new ClassNotFoundException(name) + else defineClass(name, bytes, 0, bytes.length) } + // Don't know how to construct an URL for something which exists only in memory + // override def getResource(name: String): URL = findAbstractFile(name) match { + // case null => super.getResource(name) + // case file => new URL(...) + // } } - diff --git a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala index 2dadba3b4c..1b2f6443ae 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala @@ -6,9 +6,7 @@ package scala.tools.nsc package interpreter -import java.io.File import java.lang.reflect -import java.util.jar.{ JarEntry, JarFile } import java.util.concurrent.ConcurrentHashMap import util.ScalaClassLoader import ScalaClassLoader.getSystemLoader diff --git a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala index 94bcf3e4c8..e96918c90c 100644 --- a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala +++ b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala @@ -9,6 +9,6 @@ package interpreter /** A command line for the interpreter. */ class CommandLine(arguments: List[String], error: String => Unit) extends CompilerCommand(arguments, error) { - override val cmdName = "scala" + override def cmdName = "scala" override lazy val fileEndings = List(".scalaint") } diff --git a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala index a775fca92c..cfe932ad0b 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala @@ -55,8 +55,9 @@ trait ConsoleReaderHelper extends ConsoleReader { var linesLeft = if (isPaginationEnabled()) height - 1 else Int.MaxValue val columnSize = longest + marginSize val padded = items map ("%-" + columnSize + "s" format _) + val groupSize = 1 max (width / columnSize) // make sure it doesn't divide to 0 - padded grouped (width / columnSize) foreach { xs => + padded grouped groupSize foreach { xs => println(xs.mkString) linesLeft -= 1 if (linesLeft <= 0) { diff --git a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala index bfa6576b25..2c556656ca 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala @@ -33,7 +33,7 @@ trait Dossiers { } class TermDossier(val symbol: TermSymbol, val staticType: Type, val value: AnyRef) extends Dossier { - def runtimeClass: Class[_] = value.getClass + def runtimeClass: JClass = value.getClass def runtimeSymbol: Symbol = safeClass(runtimeClass.getName) getOrElse NoSymbol def runtimeType: Type = runtimeSymbol.tpe def runtimeTypeString = TypeStrings.fromClazz(runtimeClass) diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala index 584b8867b2..d6e447ca0a 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala @@ -8,7 +8,6 @@ package interpreter import Predef.{ println => _, _ } import java.io.{ BufferedReader, FileReader, PrintWriter } - import scala.sys.process.Process import session._ import scala.tools.nsc.interpreter.{ Results => IR } @@ -44,11 +43,14 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) var settings: Settings = _ var intp: IMain = _ - lazy val power = new Power(this) + lazy val power = { + val g = intp.global + Power[g.type](this, g) + } // TODO // object opt extends AestheticSettings - + // @deprecated("Use `intp` instead.") def interpreter = intp @@ -62,7 +64,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // Install a signal handler so we can be prodded. private val signallable = - if (isReplDebug) Signallable("Dump repl state.")(dumpCommand("")) + if (isReplDebug) Signallable("Dump repl state.")(dumpCommand()) else null // classpath entries added via :cp @@ -125,7 +127,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) |// Calling Thread.stop on runaway %s with offending code: |// scala> %s""".stripMargin - println(template.format(line.thread, line.code)) + echo(template.format(line.thread, line.code)) // XXX no way to suppress the deprecation warning line.thread.stop() in.redrawLine() @@ -146,12 +148,40 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } /** print a friendly help message */ - def printHelp() = { - out println "All commands can be abbreviated - for example :he instead of :help.\n" - val cmds = commands map (x => (x.usage, x.help)) - val width: Int = cmds map { case (x, _) => x.length } max - val formatStr = "%-" + width + "s %s" - cmds foreach { case (usage, help) => out println formatStr.format(usage, help) } + def helpCommand(line: String): Result = { + if (line == "") helpSummary() + else uniqueCommand(line) match { + case Some(lc) => echo("\n" + lc.longHelp) + case _ => ambiguousError(line) + } + } + private def helpSummary() = { + val usageWidth = commands map (_.usageMsg.length) max + val formatStr = "%-" + usageWidth + "s %s %s" + + echo("All commands can be abbreviated, e.g. :he instead of :help.") + echo("Those marked with a * have more detailed help, e.g. :help imports.\n") + + commands foreach { cmd => + val star = if (cmd.hasLongHelp) "*" else " " + echo(formatStr.format(cmd.usageMsg, star, cmd.help)) + } + } + private def ambiguousError(cmd: String): Result = { + matchingCommands(cmd) match { + case Nil => echo(cmd + ": no such command. Type :help for help.") + case xs => echo(cmd + " is ambiguous: did you mean " + xs.map(":" + _.name).mkString(" or ") + "?") + } + Result(true, None) + } + private def matchingCommands(cmd: String) = commands filter (_.name startsWith cmd) + private def uniqueCommand(cmd: String): Option[LoopCommand] = { + // this lets us add commands willy-nilly and only requires enough command to disambiguate + matchingCommands(cmd) match { + case List(x) => Some(x) + // exact match OK even if otherwise appears ambiguous + case xs => xs find (_.name == cmd) + } } /** Print a welcome message */ @@ -164,28 +194,37 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) stripMargin.format(versionString, javaVmName, javaVersion) val addendum = if (isReplDebug) "\n" + new java.util.Date else "" - plushln(welcomeMsg + addendum) + echo(welcomeMsg + addendum) } /** Show the history */ - def printHistory(xs: List[String]): Result = { - if (history eq NoHistory) - return "No history available." + lazy val historyCommand = new LoopCommand("history", "show the history (optional num is commands to show)") { + override def usage = "[num]" + def defaultLines = 20 - val defaultLines = 20 - val current = history.index - val count = try xs.head.toInt catch { case _: Exception => defaultLines } - val lines = history.asStrings takeRight count - val offset = current - lines.size + 1 + def apply(line: String): Result = { + if (history eq NoHistory) + return "No history available." - for ((line, index) <- lines.zipWithIndex) - println("%3d %s".format(index + offset, line)) + val xs = words(line) + val current = history.index + val count = try xs.head.toInt catch { case _: Exception => defaultLines } + val lines = history.asStrings takeRight count + val offset = current - lines.size + 1 + + for ((line, index) <- lines.zipWithIndex) + echo("%3d %s".format(index + offset, line)) + } } - /** Some print conveniences */ - def println(x: Any) = out println x - def plush(x: Any) = { out print x ; out.flush() } - def plushln(x: Any) = { out println x ; out.flush() } + private def echo(msg: String) = { + out println msg + out.flush() + } + private def echoNoNL(msg: String) = { + out print msg + out.flush() + } /** Search the history */ def searchHistory(_cmdline: String) { @@ -193,7 +232,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val offset = history.index - history.size + 1 for ((line, index) <- history.asStrings.zipWithIndex ; if line.toLowerCase contains cmdline) - println("%d %s".format(index + offset, line)) + echo("%d %s".format(index + offset, line)) } private var currentPrompt = Properties.shellPromptString @@ -201,39 +240,57 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) /** Prompt to print when awaiting input */ def prompt = currentPrompt + import LoopCommand.{ cmd, nullary } + /** Standard commands **/ - val standardCommands: List[LoopCommand] = { - List( - LineArg("cp", "add an entry (jar or directory) to the classpath", addClasspath), - NoArgs("help", "print this help message", printHelp), - VarArgs("history", "show the history (optional arg: lines to show)", printHistory), - LineArg("h?", "search the history", searchHistory), - LineArg("implicits", "show the implicits in scope (-v to include Predef)", implicitsCommand), - LineArg("javap", "disassemble a file or class name", javapCommand), - LineArg("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand), - OneArg("load", "load and interpret a Scala file", load), - NoArgs("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand), - NoArgs("power", "enable power user mode", powerCmd), - NoArgs("quit", "exit the interpreter", () => Result(false, None)), - NoArgs("replay", "reset execution and replay all previous commands", replay), - LineArg("sh", "fork a shell and run a command", shCommand), - NoArgs("silent", "disable/enable automatic printing of results", verbosity), - LineArg("type", "display the type of an expression without evaluating it", typeCommand) - ) - } + lazy val standardCommands = List( + cmd("cp", "<path>", "add a jar or directory to the classpath", addClasspath), + cmd("help", "[command]", "print this summary or command-specific help", helpCommand), + historyCommand, + cmd("h?", "<string>", "search the history", searchHistory), + cmd("imports", "[name name ...]", "show import history, identifying sources of names", importsCommand), + cmd("implicits", "[-v]", "show the implicits in scope", implicitsCommand), + cmd("javap", "<path|class>", "disassemble a file or class name", javapCommand), + nullary("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand), + cmd("load", "<path>", "load and interpret a Scala file", loadCommand), + nullary("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand), + nullary("power", "enable power user mode", powerCmd), + nullary("quit", "exit the interpreter", () => Result(false, None)), + nullary("replay", "reset execution and replay all previous commands", replay), + shCommand, + nullary("silent", "disable/enable automatic printing of results", verbosity), + cmd("type", "<expr>", "display the type of an expression without evaluating it", typeCommand) + ) /** Power user commands */ - val powerCommands: List[LoopCommand] = { - List( - LineArg("dump", "displays a view of the interpreter's internal state", dumpCommand), - LineArg("phase", "set the implicit phase for power commands", phaseCommand), - LineArg("wrap", "code to wrap around all executions", wrapCommand) - ) - } + lazy val powerCommands: List[LoopCommand] = List( + nullary("dump", "displays a view of the interpreter's internal state", dumpCommand), + cmd("phase", "<phase>", "set the implicit phase for power commands", phaseCommand), + cmd("wrap", "<method>", "name of method to wrap around each repl line", wrapCommand) withLongHelp (""" + |:wrap + |:wrap <method> + | + |Installs a wrapper around each line entered into the repl. + |Currently it must be the simple name of an existing method + |with the specific signature shown in the following example. + | + |def timed[T](body: => T): T = { + | val start = System.nanoTime + | try body + | finally println((System.nanoTime - start) + " nanos elapsed.") + |} + |:wrap timed + | + |If given no argument, :wrap removes any wrapper present. + |Note that wrappers do not compose (a new one replaces the old + |one) and also that the :phase command uses the same machinery, + |so setting :wrap will clear any :phase setting. + """.stripMargin.trim) + ) - private def dumpCommand(line: String): Result = { - println(power) - history.asStrings takeRight 30 foreach println + private def dumpCommand(): Result = { + echo("" + power) + history.asStrings takeRight 30 foreach echo in.redrawLine() } @@ -245,6 +302,31 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) "scala.runtime." -> "runtime." ) + private def importsCommand(line: String): Result = { + val tokens = words(line) + val handlers = intp.languageWildcardHandlers ++ intp.importHandlers + val isVerbose = tokens contains "-v" + + handlers.filterNot(_.importedSymbols.isEmpty).zipWithIndex foreach { + case (handler, idx) => + val (types, terms) = handler.importedSymbols partition (_.name.isTypeName) + val imps = handler.implicitSymbols + val found = tokens filter (handler importsSymbolNamed _) + val typeMsg = if (types.isEmpty) "" else types.size + " types" + val termMsg = if (terms.isEmpty) "" else terms.size + " terms" + val implicitMsg = if (imps.isEmpty) "" else imps.size + " are implicit" + val foundMsg = if (found.isEmpty) "" else found.mkString(" // imports: ", ", ", "") + val statsMsg = List(typeMsg, termMsg, implicitMsg) filterNot (_ == "") mkString ("(", ", ", ")") + + intp.reporter.printMessage("%2d) %-30s %s%s".format( + idx + 1, + handler.importString, + statsMsg, + foundMsg + )) + } + } + private def implicitsCommand(line: String): Result = { val intp = ILoop.this.intp import intp._ @@ -303,19 +385,22 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } } - private object javap extends Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) { + protected def newJavap() = new Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) { override def tryClass(path: String): Array[Byte] = { // Look for Foo first, then Foo$, but if Foo$ is given explicitly, // we have to drop the $ to find object Foo, then tack it back onto // the end of the flattened name. - def className = intp pathToFlatName path - def moduleName = (intp pathToFlatName path.stripSuffix("$")) + "$" + def className = intp flatName path + def moduleName = (intp flatName path.stripSuffix("$")) + "$" val bytes = super.tryClass(className) if (bytes.nonEmpty) bytes else super.tryClass(moduleName) } } + private lazy val javap = + try newJavap() + catch { case _: Exception => null } private def typeCommand(line: String): Result = { intp.typeOfExpression(line) match { @@ -325,6 +410,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } private def javapCommand(line: String): Result = { + if (javap == null) + return ":javap unavailable on this platform." if (line == "") return ":javap [-lcsvp] [path1 path2 ...]" @@ -333,20 +420,39 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) else res.show() } } - private def keybindingsCommand(line: String): Result = { + private def keybindingsCommand(): Result = { if (in.keyBindings.isEmpty) "Key bindings unavailable." else { - println("Reading jline properties for default key bindings.") - println("Accuracy not guaranteed: treat this as a guideline only.\n") - in.keyBindings foreach println + echo("Reading jline properties for default key bindings.") + echo("Accuracy not guaranteed: treat this as a guideline only.\n") + in.keyBindings foreach (x => echo ("" + x)) } } private def wrapCommand(line: String): Result = { - intp setExecutionWrapper line - if (line == "") "Cleared wrapper." - else "Set wrapper to '" + line + "'" + def failMsg = "Argument to :wrap must be the name of a method with signature [T](=> T): T" + val intp = ILoop.this.intp + val g: intp.global.type = intp.global + import g._ + + words(line) match { + case Nil => + intp setExecutionWrapper "" + "Cleared wrapper." + case wrapper :: Nil => + intp.typeOfExpression(wrapper) match { + case Some(PolyType(List(targ), MethodType(List(arg), restpe))) => + intp setExecutionWrapper intp.pathToTerm(wrapper) + "Set wrapper to '" + wrapper + "'" + case Some(x) => + failMsg + "\nFound: " + x + case _ => + failMsg + "\nFound: <unknown>" + } + case _ => failMsg + } } - private def pathToPhased = intp.pathToTerm("power") + ".phased" + + private def pathToPhaseWrapper = intp.pathToTerm("$r") + ".phased.atCurrent" private def phaseCommand(name: String): Result = { // This line crashes us in TreeGen: // @@ -377,7 +483,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) if (what.isEmpty || !phased.set(what)) "'" + name + "' does not appear to represent a valid phase." else { - intp.setExecutionWrapper(pathToPhased) + intp.setExecutionWrapper(pathToPhaseWrapper) val activeMessage = if (what.toString.length == name.length) "" + what else "%s (%s)".format(what, name) @@ -402,28 +508,24 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) case ex: Throwable => if (settings.YrichExes.value) { val sources = implicitly[Sources] - out.println("\n" + ex.getMessage) - out.println( + echo("\n" + ex.getMessage) + echo( if (isReplDebug) "[searching " + sources.path + " for exception contexts...]" else "[searching for exception contexts...]" ) - out.println(Exceptional(ex).force().context()) + echo(Exceptional(ex).force().context()) } else { - out.println(util.stackTraceString(ex)) + echo(util.stackTraceString(ex)) } ex match { case _: NoSuchMethodError | _: NoClassDefFoundError => - out.println("Unrecoverable error.") + echo("Unrecoverable error.") throw ex case _ => - out.print(replayQuestionMessage) - out.flush() - if (in.readAssumingNo("")) { - out.println("\nAttempting session recovery with replay.") - replay() - } - else out.println("\nAbandoning crashed session.") + def fn(): Boolean = in.readYesOrNo(replayQuestionMessage, { echo("\nYou must enter y or n.") ; fn() }) + if (fn()) replay() + else echo("\nAbandoning crashed session.") } } @@ -458,7 +560,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) try file applyReader { reader => in = SimpleReader(reader, out, false) - plushln("Loading " + file + "...") + echo("Loading " + file + "...") loop() } finally { @@ -472,33 +574,32 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) closeInterpreter() createInterpreter() for (cmd <- replayCommands) { - plushln("Replaying: " + cmd) // flush because maybe cmd will have its own output + echo("Replaying: " + cmd) // flush because maybe cmd will have its own output command(cmd) - out.println + echo("") } } /** fork a shell and run a command */ - def shCommand(cmd: String): Result = { - if (cmd == "") - return "Usage: sh <command line>" - - intp quietRun "import _root_.scala.sys.process._" - val pb = Process(cmd) - intp.bind("builder", pb) - val stdout = Process(cmd).lines - intp.bind("stdout", stdout) - () + lazy val shCommand = new LoopCommand("sh", "run a shell command (result is implicitly => List[String])") { + override def usage = "<command line>" + def apply(line: String): Result = line match { + case "" => showUsage() + case _ => + val toRun = classOf[ProcessResult].getName + "(" + string2codeQuoted(line) + ")" + intp interpret toRun + () + } } def withFile(filename: String)(action: File => Unit) { val f = File(filename) if (f.exists) action(f) - else out.println("That file does not exist") + else echo("That file does not exist") } - def load(arg: String) = { + def loadCommand(arg: String) = { var shouldReplay: Option[String] = None withFile(arg)(f => { interpretAllFrom(f) @@ -512,61 +613,41 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) if (f.exists) { addedClasspath = ClassPath.join(addedClasspath, f.path) val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath) - println("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath)) + echo("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath)) replay() } - else out.println("The path '" + f + "' doesn't seem to exist.") + else echo("The path '" + f + "' doesn't seem to exist.") } def powerCmd(): Result = { - if (isReplPower) return "Already in power mode." + if (isReplPower) "Already in power mode." else enablePowerMode() } def enablePowerMode() = { - isReplPower = true + replProps.power setValue true power.unleash() - out.println(power.banner) + echo(power.banner) } def verbosity() = { val old = intp.printResults intp.printResults = !old - out.println("Switched " + (if (old) "off" else "on") + " result printing.") + echo("Switched " + (if (old) "off" else "on") + " result printing.") } /** Run one command submitted by the user. Two values are returned: * (1) whether to keep running, (2) the line to record for replay, * if any. */ def command(line: String): Result = { - def withError(msg: String) = { - out println msg - Result(true, None) - } - def ambiguous(cmds: List[LoopCommand]) = "Ambiguous: did you mean " + cmds.map(":" + _.name).mkString(" or ") + "?" - - // not a command - if (!line.startsWith(":")) { - // Notice failure to create compiler - if (intp.global == null) return Result(false, None) - else return Result(true, interpretStartingWith(line)) - } - - val tokens = (line drop 1 split """\s+""").toList - if (tokens.isEmpty) - return withError(ambiguous(commands)) - - val (cmd :: args) = tokens - - // this lets us add commands willy-nilly and only requires enough command to disambiguate - commands.filter(_.name startsWith cmd) match { - case List(x) => x(args) - case Nil => withError("Unknown command. Type :help for help.") - case xs => - xs find (_.name == cmd) match { - case Some(exact) => exact(args) - case _ => withError(ambiguous(xs)) - } + if (line startsWith ":") { + val cmd = line.tail takeWhile (x => !x.isWhitespace) + uniqueCommand(cmd) match { + case Some(lc) => lc(line.tail stripPrefix cmd dropWhile (_.isWhitespace)) + case _ => ambiguousError(cmd) + } } + else if (intp.global == null) Result(false, None) // Notice failure to create compiler + else Result(true, interpretStartingWith(line)) } private def readWhile(cond: String => Boolean) = { @@ -574,10 +655,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } def pasteCommand(): Result = { - out.println("// Entering paste mode (ctrl-D to finish)\n") - out.flush() + echo("// Entering paste mode (ctrl-D to finish)\n") val code = readWhile(_ => true) mkString "\n" - out.println("\n// Exiting paste mode, now interpreting.\n") + echo("\n// Exiting paste mode, now interpreting.\n") intp interpret code () } @@ -587,13 +667,19 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val PromptString = "scala> " def interpret(line: String): Unit = { - out.println(line.trim) + echo(line.trim) intp interpret line - out.println("") + echo("") } - def transcript(start: String) = + def transcript(start: String) = { + // Printing this message doesn't work very well becaues it's buried in the + // transcript they just pasted. Todo: a short timer goes off when + // lines stop coming which tells them to hit ctrl-D. + // + // echo("// Detected repl transcript paste: ctrl-D to finish.") apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim)) + } } import paste.{ ContinueString, PromptString } @@ -614,7 +700,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) case IR.Success => Some(code) case IR.Incomplete => if (in.interactive && code.endsWith("\n\n")) { - out.println("You typed two blank lines. Starting a new command.") + echo("You typed two blank lines. Starting a new command.") None } else in.readLine(ContinueString) match { @@ -641,7 +727,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) * and avoid the interpreter, as it's likely not valid scala code. */ if (code == "") None - else if (!paste.running && code.startsWith(PromptString)) { + else if (!paste.running && code.trim.startsWith(PromptString)) { paste.transcript(code) None } @@ -679,7 +765,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val cmd = ":load " + filename command(cmd) addReplay(cmd) - out.println() + echo("") } case _ => } @@ -696,7 +782,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) else new JLineCompletion(intp) ) catch { - case _: Exception | _: NoClassDefFoundError => SimpleReader() + case ex @ (_: Exception | _: NoClassDefFoundError) => + echo("Failed to created JLineReader: " + ex + "\nFalling back to SimpleReader.") + SimpleReader() } } @@ -724,7 +812,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // they type a command the compiler is ready to roll. intp.initialize() if (isReplPower) { - plushln("Starting in power mode, one moment...\n") + echo("Starting in power mode, one moment...\n") enablePowerMode() } loop() @@ -735,8 +823,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) /** process command-line arguments and do as they request */ def process(args: Array[String]): Boolean = { - def error1(msg: String) = out println ("scala: " + msg) - val command = new CommandLine(args.toList, error1) + val command = new CommandLine(args.toList, msg => echo("scala: " + msg)) def neededHelp(): String = (if (command.settings.help.value) command.usageMsg + "\n" else "") + (if (command.settings.Xhelp.value) command.xusageMsg + "\n" else "") @@ -744,7 +831,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // if they asked for no help and command is valid, we call the real main neededHelp() match { case "" => command.ok && process(command.settings) - case help => plush(help) ; true + case help => echoNoNL(help) ; true } } @@ -761,11 +848,47 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) object ILoop { implicit def loopToInterpreter(repl: ILoop): IMain = repl.intp + private def echo(msg: String) = Console println msg + + // Designed primarily for use by test code: take a String with a + // bunch of code, and prints out a transcript of what it would look + // like if you'd just typed it into the repl. + def runForTranscript(code: String, settings: Settings): String = { + import java.io.{ BufferedReader, StringReader, OutputStreamWriter } + + stringFromStream { ostream => + Console.withOut(ostream) { + val output = new PrintWriter(new OutputStreamWriter(ostream), true) { + override def write(str: String) = { + // completely skip continuation lines + if (str forall (ch => ch.isWhitespace || ch == '|')) () + // print a newline on empty scala prompts + else if ((str contains '\n') && (str.trim == "scala> ")) super.write("\n") + else super.write(str) + } + } + val input = new BufferedReader(new StringReader(code)) { + override def readLine(): String = { + val s = super.readLine() + // helping out by printing the line being interpreted. + if (s != null) + output.println(s) + s + } + } + val repl = new ILoop(input, output) + if (settings.classpath.isDefault) + settings.classpath.value = sys.props("java.class.path") + + repl process settings + } + } + } /** Creates an interpreter loop with default settings and feeds * the given code to it as input. */ - def run(code: String): String = { + def run(code: String, sets: Settings = new Settings): String = { import java.io.{ BufferedReader, StringReader, OutputStreamWriter } stringFromStream { ostream => @@ -773,10 +896,11 @@ object ILoop { val input = new BufferedReader(new StringReader(code)) val output = new PrintWriter(new OutputStreamWriter(ostream), true) val repl = new ILoop(input, output) - val settings = new Settings - settings.classpath.value = sys.props("java.class.path") - repl process settings + if (sets.classpath.isDefault) + sets.classpath.value = sys.props("java.class.path") + + repl process sets } } } @@ -792,11 +916,11 @@ object ILoop { val msg = if (args.isEmpty) "" else " Binding " + args.size + " value%s.".format( if (args.size == 1) "" else "s" ) - Console.println("Debug repl starting." + msg) + echo("Debug repl starting." + msg) val repl = new ILoop { override def prompt = "\ndebug> " } - repl.settings = new Settings(Console println _) + repl.settings = new Settings(echo) repl.settings.embeddedDefaults[T] repl.createInterpreter() repl.in = JLineReader(repl) @@ -806,7 +930,7 @@ object ILoop { args foreach (p => repl.bind(p.name, p.tpe, p.value)) repl.loop() - Console.println("\nDebug repl exiting.") + echo("\nDebug repl exiting.") repl.closeInterpreter() } } diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala index d74aa5e6df..62e781958f 100644 --- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala +++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala @@ -11,7 +11,7 @@ import java.io.{ PrintWriter } import java.lang.reflect import java.net.URL import util.{ Set => _, _ } -import io.VirtualDirectory +import io.{ AbstractFile, VirtualDirectory } import reporters.{ ConsoleReporter, Reporter } import symtab.{ Flags, Names } import scala.tools.nsc.interpreter.{ Results => IR } @@ -57,7 +57,7 @@ import IMain._ * @author Moez A. Abdel-Gawad * @author Lex Spoon */ -class IMain(val settings: Settings, protected val out: PrintWriter) { +class IMain(val settings: Settings, protected val out: PrintWriter) extends Imports { imain => /** construct an interpreter that reports to Console */ @@ -78,7 +78,16 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { import formatting._ /** directory to save .class files to */ - val virtualDirectory = new VirtualDirectory("(memory)", None) + val virtualDirectory = new VirtualDirectory("(memory)", None) { + private def pp(root: io.AbstractFile, indentLevel: Int) { + val spaces = " " * indentLevel + out.println(spaces + root.name) + if (root.isDirectory) + root.toList sortBy (_.name) foreach (x => pp(x, indentLevel + 1)) + } + // print the contents hierarchically + def show() = pp(this, 0) + } /** reporter */ lazy val reporter: ConsoleReporter = new IMain.ReplReporter(this) @@ -102,11 +111,8 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { private def _initialize(): Boolean = { val source = """ - |// this is assembled to force the loading of approximately the - |// classes which will be loaded on the first expression anyway. |class $repl_$init { - | val x = "abc".reverse.length + (5 max 5) - | scala.runtime.ScalaRunTime.stringOf(x) + | List(1) map (_ + 1) |} |""".stripMargin @@ -157,11 +163,9 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { else null } @deprecated("Use `global` for access to the compiler instance.") - lazy val compiler = global + lazy val compiler: global.type = global import global._ - import definitions.{ ScalaPackage, JavaLangPackage, PredefModule, RootClass } - import nme.{ INTERPRETER_IMPORT_WRAPPER } object naming extends { val global: imain.global.type = imain.global @@ -268,9 +272,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { if (parentClassLoader == null) ScalaClassLoader fromURLs compilerClasspath else new URLClassLoader(compilerClasspath, parentClassLoader) - new AbstractFileClassLoader(virtualDirectory, parent) + new AbstractFileClassLoader(virtualDirectory, parent) { + /** Overridden here to try translating a simple name to the generated + * class name if the original attempt fails. This method is used by + * getResourceAsStream as well as findClass. + */ + override protected def findAbstractFile(name: String): AbstractFile = { + super.findAbstractFile(name) match { + // deadlocks on startup if we try to translate names too early + case null if isInitializeComplete => generatedName(name) map (x => super.findAbstractFile(x)) orNull + case file => file + } + } + } } - private def loadByName(s: String): Class[_] = + private def loadByName(s: String): JClass = (classLoader tryToInitializeClass s) getOrElse sys.error("Failed to load expected class: '" + s + "'") protected def parentClassLoader: ClassLoader = @@ -286,12 +302,12 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { * * $line19.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$Bippy */ - def pathToFlatName(id: String): String = { - requestForIdent(id) match { - case Some(req) => req fullFlatName id - case _ => id - } + def generatedName(simpleName: String): Option[String] = { + if (simpleName endsWith "$") optFlatName(simpleName.init) map (_ + "$") + else optFlatName(simpleName) } + def flatName(id: String) = optFlatName(id) getOrElse id + def optFlatName(id: String) = requestForIdent(id) map (_ fullFlatName id) def allDefinedNames = definedNameMap.keys.toList sortBy (_.toString) def pathToType(id: String): String = pathToName(newTypeName(id)) @@ -336,6 +352,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { prevRequests += req req.referencedNames foreach (x => referencedNameMap(x) = req) + // warning about serially defining companions. It'd be easy + // enough to just redefine them together but that may not always + // be what people want so I'm waiting until I can do it better. + if (!settings.nowarnings.value) { + for { + name <- req.definedNames filterNot (x => req.definedNames contains x.companionName) + oldReq <- definedNameMap get name.companionName + newSym <- req.definedSymbols get name + oldSym <- oldReq.definedSymbols get name.companionName + } { + printMessage("warning: previously defined %s is not a companion to %s.".format(oldSym, newSym)) + printMessage("Companions must be defined together; you may wish to use :paste mode for this.") + } + } + + // Updating the defined name map req.definedNames foreach { name => if (definedNameMap contains name) { if (name.isTypeName) handleTypeRedefinition(name.toTypeName, definedNameMap(name), req) @@ -345,114 +377,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { } } - /** Compute imports that allow definitions from previous - * requests to be visible in a new request. Returns - * three pieces of related code: - * - * 1. An initial code fragment that should go before - * the code of the new request. - * - * 2. A code fragment that should go after the code - * of the new request. - * - * 3. An access path which can be traverested to access - * any bindings inside code wrapped by #1 and #2 . - * - * The argument is a set of Names that need to be imported. - * - * Limitations: This method is not as precise as it could be. - * (1) It does not process wildcard imports to see what exactly - * they import. - * (2) If it imports any names from a request, it imports all - * of them, which is not really necessary. - * (3) It imports multiple same-named implicits, but only the - * last one imported is actually usable. - */ - private case class ComputedImports(prepend: String, append: String, access: String) - private def importsCode(wanted: Set[Name]): ComputedImports = { - /** Narrow down the list of requests from which imports - * should be taken. Removes requests which cannot contribute - * useful imports for the specified set of wanted names. - */ - case class ReqAndHandler(req: Request, handler: MemberHandler) { } - - def reqsToUse: List[ReqAndHandler] = { - /** Loop through a list of MemberHandlers and select which ones to keep. - * 'wanted' is the set of names that need to be imported. - */ - def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { - val isWanted = wanted contains _ - // Single symbol imports might be implicits! See bug #1752. Rather than - // try to finesse this, we will mimic all imports for now. - def keepHandler(handler: MemberHandler) = handler match { - case _: ImportHandler => true - case x => x.definesImplicit || (x.definedNames exists isWanted) - } - - reqs match { - case Nil => Nil - case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) - case rh :: rest => - import rh.handler._ - val newWanted = wanted ++ referencedNames -- definedNames -- importedNames - rh :: select(rest, newWanted) - } - } - - /** Flatten the handlers out and pair each with the original request */ - select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse - } - - val code, trailingBraces, accessPath = new StringBuilder - val currentImps = mutable.HashSet[Name]() - - // add code for a new object to hold some imports - def addWrapper() { - val impname = INTERPRETER_IMPORT_WRAPPER - code append "object %s {\n".format(impname) - trailingBraces append "}\n" - accessPath append ("." + impname) - - currentImps.clear - } - - addWrapper() - - // loop through previous requests, adding imports for each one - for (ReqAndHandler(req, handler) <- reqsToUse) { - handler match { - // If the user entered an import, then just use it; add an import wrapping - // level if the import might conflict with some other import - case x: ImportHandler => - if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) - addWrapper() - - code append (x.member + "\n") - - // give wildcard imports a import wrapper all to their own - if (x.importsWildcard) addWrapper() - else currentImps ++= x.importedNames - - // For other requests, import each defined name. - // import them explicitly instead of with _, so that - // ambiguity errors will not be generated. Also, quote - // the name of the variable, so that we don't need to - // handle quoting keywords separately. - case x => - for (imv <- x.definedNames) { - if (currentImps contains imv) addWrapper() - - code append ("import %s\n" format (req fullPath imv)) - currentImps += imv - } - } - } - // add one extra wrapper, to prevent warnings in the common case of - // redefining the value bound in the last interpreter request. - addWrapper() - ComputedImports(code.toString, trailingBraces.toString, accessPath.toString) - } - /** Parse a line into a sequence of trees. Returns None if the input is incomplete. */ def parse(line: String): Option[List[Tree]] = { var justNeedsMore = false @@ -497,7 +421,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { def compileString(code: String): Boolean = compileSources(new BatchSourceFile("<script>", code)) - /** Build a request from the user. `trees` is `line` after being parsed. */ private def buildRequest(line: String, trees: List[Tree]): Request = new Request(line, trees) @@ -627,14 +550,14 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { virtualDirectory.clear() resetClassLoader() resetAllCreators() - prevRequests.clear + prevRequests.clear() } /** This instance is no longer needed, so release any resources * it is using. The reporter's output gets flushed. */ def close() { - reporter.flush + reporter.flush() } /** Here is where we: @@ -862,8 +785,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { // lazy val definedTypes: Map[Name, Type] = { // typeNames map (x => x -> afterTyper(resultSymbol.info.nonPrivateDecl(x).tpe)) toMap // } - lazy val definedSymbols: Map[Name, Symbol] = - termNames map (x => x -> applyToResultMember(x, x => x)) toMap + lazy val definedSymbols: Map[Name, Symbol] = ( + termNames.map(x => x -> applyToResultMember(x, x => x)) ++ + typeNames.map(x => x -> compilerTypeOf.get(x).map(_.typeSymbol).getOrElse(NoSymbol)) + ).toMap lazy val typesOfDefinedTerms: Map[Name, Type] = termNames map (x => x -> applyToResultMember(x, _.tpe)) toMap @@ -905,7 +830,13 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { execution.state match { case Done => ("" + execution.get(), true) - case Threw => if (bindLastException) handleException(execution.caught()) else throw execution.caught() + case Threw => + val ex = execution.caught() + if (isReplDebug) + ex.printStackTrace() + + if (bindLastException) handleException(ex) + else throw ex case Cancelled => ("Execution interrupted by signal.\n", false) case Running => ("Execution still running! Seems impossible.", false) } @@ -929,8 +860,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { case _ => naming.mostRecentVar }) - private def requestForName(name: Name): Option[Request] = + private def requestForName(name: Name): Option[Request] = { + assert(definedNameMap != null, "definedNameMap is null") definedNameMap get name + } private def requestForIdent(line: String): Option[Request] = requestForName(newTermName(line)) orElse requestForName(newTypeName(line)) @@ -948,22 +881,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { requestForName(name) flatMap { req => req.handlers find (_.definedNames contains name) } - // def valueOfTerm(id: String): Option[AnyRef] = requestForIdent(id) flatMap (_.getEval) - def classOfTerm(id: String): Option[Class[_]] = + def classOfTerm(id: String): Option[JClass] = valueOfTerm(id) map (_.getClass) def typeOfTerm(id: String): Option[Type] = newTermName(id) match { - case nme.ROOTPKG => Some(RootClass.tpe) + case nme.ROOTPKG => Some(definitions.RootClass.tpe) case name => requestForName(name) flatMap (_.compilerTypeOf get name) } def symbolOfTerm(id: String): Symbol = requestForIdent(id) flatMap (_.definedSymbols get newTermName(id)) getOrElse NoSymbol - def runtimeClassAndTypeOfTerm(id: String): Option[(Class[_], Type)] = { + def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = { for { clazz <- classOfTerm(id) tpe <- runtimeTypeOfTerm(id) @@ -997,17 +929,23 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { return None } + def asQualifiedImport = { + val name = expr.takeWhile(_ != '.') + importedTermNamed(name) flatMap { sym => + typeOfExpression(sym.fullName + expr.drop(name.length)) + } + } def asModule = safeModule(expr) map (_.tpe) def asExpr = beSilentDuring { val lhs = freshInternalVarName() - interpret("lazy val " + lhs + " = { " + expr + " } ") match { + interpret("lazy val " + lhs + " = { " + expr + " } ", true) match { case IR.Success => typeOfExpression(lhs) case _ => None } } typeOfExpressionDepth += 1 - try typeOfTerm(expr) orElse asModule orElse asExpr + try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport finally typeOfExpressionDepth -= 1 } // def compileAndTypeExpr(expr: String): Option[Typer] = { @@ -1016,70 +954,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { // } // } - private def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x } - private def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x } + protected def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x } + protected def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x } - def importHandlers = allHandlers collect { case x: ImportHandler => x } def definedTerms = onlyTerms(allDefinedNames) filterNot isInternalVarName def definedTypes = onlyTypes(allDefinedNames) - def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames)) - def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames)) + def definedSymbols = prevRequests.toSet flatMap ((x: Request) => x.definedSymbols.values) /** the previous requests this interpreter has processed */ - private lazy val prevRequests = mutable.ArrayBuffer[Request]() + private lazy val prevRequests = mutable.ListBuffer[Request]() private lazy val referencedNameMap = mutable.Map[Name, Request]() private lazy val definedNameMap = mutable.Map[Name, Request]() - private def allHandlers = prevRequests.toList flatMap (_.handlers) - private def allReqAndHandlers = prevRequests.toList flatMap (req => req.handlers map (req -> _)) - def allSeenTypes = prevRequests.toList flatMap (_.typeOf.values.toList) distinct + protected def prevRequestList = prevRequests.toList + private def allHandlers = prevRequestList flatMap (_.handlers) + def allSeenTypes = prevRequestList flatMap (_.typeOf.values.toList) distinct def allImplicits = allHandlers filter (_.definesImplicit) flatMap (_.definedNames) - - private def membersAtPickler(sym: Symbol): List[Symbol] = - atPickler(sym.info.nonPrivateMembers) - - /** Symbols whose contents are language-defined to be imported. */ - def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule) - def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe) - - /** Types which have been wildcard imported, such as: - * val x = "abc" ; import x._ // type java.lang.String - * import java.lang.String._ // object java.lang.String - * - * Used by tab completion. - * - * XXX right now this gets import x._ and import java.lang.String._, - * but doesn't figure out import String._. There's a lot of ad hoc - * scope twiddling which should be swept away in favor of digging - * into the compiler scopes. - */ - def sessionWildcards: List[Type] = { - importHandlers flatMap { - case x if x.importsWildcard => x.targetType - case _ => None - } distinct - } - def wildcardTypes = languageWildcards ++ sessionWildcards - - def languageSymbols = languageWildcardSyms flatMap membersAtPickler - def sessionSymbols = importHandlers flatMap (_.importedSymbols) - def importedSymbols = languageSymbols ++ sessionSymbols - def implicitSymbols = importedSymbols filter (_.isImplicit) - - /** Tuples of (source, imported symbols) in the order they were imported. - */ - def importedSymbolsBySource: List[(Symbol, List[Symbol])] = { - val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym))) - val session = importHandlers filter (_.targetType.isDefined) map { mh => - (mh.targetType.get.typeSymbol, mh.importedSymbols) - } - - lang ++ session - } - def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = { - importedSymbolsBySource map { - case (k, vs) => (k, vs filter (_.isImplicit)) - } filterNot (_._2.isEmpty) - } + def importHandlers = allHandlers collect { case x: ImportHandler => x } def visibleTermNames: List[Name] = definedTerms ++ importedTerms distinct @@ -1141,7 +1031,7 @@ object IMain { def apply(contributors: List[T]): String = stringFromWriter { code => code println preamble - contributors map generate foreach (code print _) + contributors map generate foreach (code println _) code println postamble } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Imports.scala b/src/compiler/scala/tools/nsc/interpreter/Imports.scala new file mode 100644 index 0000000000..b2706330e7 --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/Imports.scala @@ -0,0 +1,194 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import scala.collection.{ mutable, immutable } + +trait Imports { + self: IMain => + + import global._ + import definitions.{ ScalaPackage, JavaLangPackage, PredefModule } + import memberHandlers._ + + /** Synthetic import handlers for the language defined imports. */ + private def makeWildcardImportHandler(sym: Symbol): ImportHandler = { + val hd :: tl = sym.fullName.split('.').toList map newTermName + val tree = Import( + tl.foldLeft(Ident(hd): Tree)((x, y) => Select(x, y)), + List(ImportSelector(nme.WILDCARD, -1, null, -1)) + ) + tree setSymbol sym + new ImportHandler(tree) + } + + /** Symbols whose contents are language-defined to be imported. */ + def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule) + def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe) + def languageWildcardHandlers = languageWildcardSyms map makeWildcardImportHandler + + def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames)) + def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames)) + + /** Types which have been wildcard imported, such as: + * val x = "abc" ; import x._ // type java.lang.String + * import java.lang.String._ // object java.lang.String + * + * Used by tab completion. + * + * XXX right now this gets import x._ and import java.lang.String._, + * but doesn't figure out import String._. There's a lot of ad hoc + * scope twiddling which should be swept away in favor of digging + * into the compiler scopes. + */ + def sessionWildcards: List[Type] = { + importHandlers flatMap { + case x if x.importsWildcard => x.targetType + case _ => None + } distinct + } + def wildcardTypes = languageWildcards ++ sessionWildcards + + def languageSymbols = languageWildcardSyms flatMap membersAtPickler + def sessionImportedSymbols = importHandlers flatMap (_.importedSymbols) + def importedSymbols = languageSymbols ++ sessionImportedSymbols + def importedTermSymbols = importedSymbols collect { case x: TermSymbol => x } + def importedTypeSymbols = importedSymbols collect { case x: TypeSymbol => x } + def implicitSymbols = importedSymbols filter (_.isImplicit) + + def importedTermNamed(name: String) = importedTermSymbols find (_.name.toString == name) + + /** Tuples of (source, imported symbols) in the order they were imported. + */ + def importedSymbolsBySource: List[(Symbol, List[Symbol])] = { + val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym))) + val session = importHandlers filter (_.targetType.isDefined) map { mh => + (mh.targetType.get.typeSymbol, mh.importedSymbols) + } + + lang ++ session + } + def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = { + importedSymbolsBySource map { + case (k, vs) => (k, vs filter (_.isImplicit)) + } filterNot (_._2.isEmpty) + } + + /** Compute imports that allow definitions from previous + * requests to be visible in a new request. Returns + * three pieces of related code: + * + * 1. An initial code fragment that should go before + * the code of the new request. + * + * 2. A code fragment that should go after the code + * of the new request. + * + * 3. An access path which can be traverested to access + * any bindings inside code wrapped by #1 and #2 . + * + * The argument is a set of Names that need to be imported. + * + * Limitations: This method is not as precise as it could be. + * (1) It does not process wildcard imports to see what exactly + * they import. + * (2) If it imports any names from a request, it imports all + * of them, which is not really necessary. + * (3) It imports multiple same-named implicits, but only the + * last one imported is actually usable. + */ + case class ComputedImports(prepend: String, append: String, access: String) + protected def importsCode(wanted: Set[Name]): ComputedImports = { + /** Narrow down the list of requests from which imports + * should be taken. Removes requests which cannot contribute + * useful imports for the specified set of wanted names. + */ + case class ReqAndHandler(req: Request, handler: MemberHandler) { } + + def reqsToUse: List[ReqAndHandler] = { + /** Loop through a list of MemberHandlers and select which ones to keep. + * 'wanted' is the set of names that need to be imported. + */ + def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { + val isWanted = wanted contains _ + // Single symbol imports might be implicits! See bug #1752. Rather than + // try to finesse this, we will mimic all imports for now. + def keepHandler(handler: MemberHandler) = handler match { + case _: ImportHandler => true + case x => x.definesImplicit || (x.definedNames exists isWanted) + } + + reqs match { + case Nil => Nil + case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) + case rh :: rest => + import rh.handler._ + val newWanted = wanted ++ referencedNames -- definedNames -- importedNames + rh :: select(rest, newWanted) + } + } + + /** Flatten the handlers out and pair each with the original request */ + select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse + } + + val code, trailingBraces, accessPath = new StringBuilder + val currentImps = mutable.HashSet[Name]() + + // add code for a new object to hold some imports + def addWrapper() { + val impname = nme.INTERPRETER_IMPORT_WRAPPER + code append "object %s {\n".format(impname) + trailingBraces append "}\n" + accessPath append ("." + impname) + + currentImps.clear + } + + addWrapper() + + // loop through previous requests, adding imports for each one + for (ReqAndHandler(req, handler) <- reqsToUse) { + handler match { + // If the user entered an import, then just use it; add an import wrapping + // level if the import might conflict with some other import + case x: ImportHandler => + if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) + addWrapper() + + code append (x.member + "\n") + + // give wildcard imports a import wrapper all to their own + if (x.importsWildcard) addWrapper() + else currentImps ++= x.importedNames + + // For other requests, import each defined name. + // import them explicitly instead of with _, so that + // ambiguity errors will not be generated. Also, quote + // the name of the variable, so that we don't need to + // handle quoting keywords separately. + case x => + for (imv <- x.definedNames) { + if (currentImps contains imv) addWrapper() + + code append ("import %s\n" format (req fullPath imv)) + currentImps += imv + } + } + } + // add one extra wrapper, to prevent warnings in the common case of + // redefining the value bound in the last interpreter request. + addWrapper() + ComputedImports(code.toString, trailingBraces.toString, accessPath.toString) + } + + private def allReqAndHandlers = + prevRequestList flatMap (req => req.handlers map (req -> _)) + + private def membersAtPickler(sym: Symbol): List[Symbol] = + atPickler(sym.info.nonPrivateMembers) +}
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala index 1430cbe55c..edade4da1b 100644 --- a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala @@ -27,12 +27,13 @@ trait InteractiveReader { def redrawLine(): Unit def currentLine: String - def readYesOrNo(prompt: String) = readOneKey(prompt) match { + def readYesOrNo(prompt: String, alt: => Boolean): Boolean = readOneKey(prompt) match { case 'y' => true case 'n' => false + case _ => alt } - def readAssumingNo(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => false } - def readAssumingYes(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => true } + def readAssumingNo(prompt: String) = readYesOrNo(prompt, false) + def readAssumingYes(prompt: String) = readYesOrNo(prompt, true) protected def readOneLine(prompt: String): String protected def readOneKey(prompt: String): Int diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala index 7430406306..b7baea57fc 100644 --- a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala +++ b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala @@ -102,7 +102,9 @@ class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc. def excludeNames: List[String] = (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_" - def methodSignatureString(sym: Symbol) = afterTyper(new MethodSymbolOutput(sym).methodString()) + def methodSignatureString(sym: Symbol) = { + IMain stripString afterTyper(new MethodSymbolOutput(sym).methodString()) + } def exclude(name: String): Boolean = ( (name contains "$") || diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala index d9260427b3..d222a80196 100644 --- a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala @@ -6,7 +6,6 @@ package scala.tools.nsc package interpreter -import java.io.File import scala.tools.jline.console.ConsoleReader import scala.tools.jline.console.completer._ import session._ diff --git a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala index 24fde9425f..196d8b882f 100644 --- a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala +++ b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala @@ -6,43 +6,87 @@ package scala.tools.nsc package interpreter +import collection.{ mutable, immutable } +import mutable.ListBuffer + +class ProcessResult(val line: String) { + import sys.process._ + private val buffer = new ListBuffer[String] + + val builder = Process(line) + val logger = ProcessLogger(buffer += _) + val exitCode = builder ! logger + def lines = buffer.toList + + def show() = lines foreach println + override def toString = "`%s` (%d lines, exit %d)".format(line, buffer.size, exitCode) +} +object ProcessResult { + implicit def processResultToOutputLines(pr: ProcessResult): List[String] = pr.lines + def apply(line: String): ProcessResult = new ProcessResult(line) +} + trait LoopCommands { protected def out: java.io.PrintWriter // a single interpreter command - sealed abstract class LoopCommand extends (List[String] => Result) { - def name: String - def help: String - def commandError(msg: String) = { - out.println(":" + name + " " + msg + ".") + abstract class LoopCommand(val name: String, val help: String) extends (String => Result) { + private var _longHelp: String = null + final def defaultHelp = usageMsg + " (no extended help available.)" + def hasLongHelp = _longHelp != null || longHelp != defaultHelp + def withLongHelp(text: String): this.type = { _longHelp = text ; this } + def longHelp = _longHelp match { + case null => defaultHelp + case text => text + } + def usage: String = "" + def usageMsg: String = ":" + name + ( + if (usage == "") "" else " " + usage + ) + def apply(line: String): Result + + // called if no args are given + def showUsage(): Result = { + "usage is " + usageMsg Result(true, None) } - def usage(): String + + def onError(msg: String) = { + out.println("error: " + msg) + showUsage() + } } - case class NoArgs(name: String, help: String, f: () => Result) extends LoopCommand { - def usage(): String = ":" + name - def apply(args: List[String]) = if (args.isEmpty) f() else commandError("accepts no arguments") + object LoopCommand { + def nullary(name: String, help: String, f: () => Result): LoopCommand = + new NullaryCmd(name, help, _ => f()) + + def cmd(name: String, usage: String, help: String, f: String => Result): LoopCommand = + if (usage == "") new NullaryCmd(name, help, f) + else new LineCmd(name, usage, help, f) + + def varargs(name: String, usage: String, help: String, f: List[String] => Result): LoopCommand = + new VarArgsCmd(name, usage, help, f) } - case class LineArg(name: String, help: String, f: (String) => Result) extends LoopCommand { - def usage(): String = ":" + name + " " - def apply(args: List[String]) = f(args mkString " ") + class NullaryCmd(name: String, help: String, f: String => Result) extends LoopCommand(name, help) { + def apply(line: String): Result = f(line) } - case class OneArg(name: String, help: String, f: (String) => Result) extends LoopCommand { - def usage(): String = ":" + name + " " - def apply(args: List[String]) = - if (args.size == 1) f(args.head) - else commandError("requires exactly one argument") + class LineCmd(name: String, argWord: String, help: String, f: String => Result) extends LoopCommand(name, help) { + override def usage = argWord + def apply(line: String): Result = f(line) } - case class VarArgs(name: String, help: String, f: (List[String]) => Result) extends LoopCommand { - def usage(): String = ":" + name + " [arg]" + class VarArgsCmd(name: String, argWord: String, help: String, f: List[String] => Result) + extends LoopCommand(name, help) { + override def usage = argWord + def apply(line: String): Result = apply(words(line)) def apply(args: List[String]) = f(args) } // the result of a single command case class Result(val keepRunning: Boolean, val lineToRecord: Option[String]) + object Result { // the default result means "keep running, and don't record that line" val default = Result(true, None) diff --git a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala index 29c31f50d6..330294f823 100644 --- a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala +++ b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala @@ -18,23 +18,6 @@ trait MemberHandlers { import global._ import naming._ - def string2codeQuoted(str: String) = "\"" + string2code(str) + "\"" - - /** Convert a string into code that can recreate the string. - * This requires replacing all special characters by escape - * codes. It does not add the surrounding " marks. */ - def string2code(str: String): String = { - val res = new StringBuilder - for (c <- str) c match { - case '"' | '\'' | '\\' => res += '\\' ; res += c - case _ if c.isControl => res ++= Chars.char2uescape(c) - case _ => res += c - } - res.toString - } - def any2stringOf(x: Any, maxlen: Int) = - "scala.runtime.ScalaRunTime.stringOf(%s, %s)".format(x, maxlen) - private def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*) private def codegenln(xs: String*): String = codegenln(true, xs: _*) @@ -121,7 +104,6 @@ trait MemberHandlers { class ValHandler(member: ValDef) extends MemberDefHandler(member) { val maxStringElements = 1000 // no need to mkString billions of elements - def stringOf(x: Any) = any2stringOf(x, maxStringElements) override def definesValue = true override def resultExtractionCode(req: Request): String = { @@ -131,7 +113,7 @@ trait MemberHandlers { // if this is a lazy val we avoid evaluating it here val resultString = if (mods.isLazy) codegenln(false, "<lazy>") - else stringOf(req fullPath name) + else any2stringOf(req fullPath name, maxStringElements) """ + "%s: %s = " + %s""".format(prettyName, string2code(req typeOf name), resultString) } @@ -215,7 +197,9 @@ trait MemberHandlers { /** The names imported by this statement */ override lazy val importedNames: List[Name] = wildcardNames ++ individualNames + lazy val importsSymbolNamed: Set[String] = importedNames map (_.toString) toSet - override def resultExtractionCode(req: Request) = codegenln(imp.toString) + "\n" + def importString = imp.toString + override def resultExtractionCode(req: Request) = codegenln(importString) + "\n" } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala index e605bb010d..83321356a3 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala @@ -9,51 +9,93 @@ package interpreter /** If it looks like they're pasting in a scala interpreter * transcript, remove all the formatting we inserted so we * can make some sense of it. + * + * Most of the interesting code in here is due to my goal of + * "paste idempotence" i.e. the transcript resulting from pasting + * a transcript should itself be pasteable and should achieve + * the same result. */ abstract class Pasted { def ContinueString: String def PromptString: String def interpret(line: String): Unit - private var isRunning = false + def matchesPrompt(line: String) = matchesString(line, PromptString) + def matchesContinue(line: String) = matchesString(line, ContinueString) def running = isRunning + private def matchesString(line: String, target: String): Boolean = ( + (line startsWith target) || + (line.nonEmpty && " \t".toSet(line.head) && matchesString(line.tail, target)) + ) + private def stripString(line: String, target: String) = line indexOf target match { + case -1 => line + case idx => line drop (idx + target.length) + } + private var isRunning = false + private val resReference = """(?<!^)(res\d+)""".r + private val resCreation = """^\s*(res\d+):.*""".r + private val resAssign = """^val (res\d+).*""".r + + private class PasteAnalyzer(val lines: List[String]) { + val referenced = lines flatMap (resReference findAllIn _.trim.stripPrefix("res")) toSet + val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList + + /** If it's a prompt or continuation line, strip the formatting bits and + * assemble the code. Otherwise ship it off to be analyzed for res references + * and discarded. + */ + def append(code: String, line: String): String = + if (matchesPrompt(line)) code + "\n" + line + else if (matchesContinue(line)) code + "\n" + stripString(line, ContinueString) + else fixResRefs(code, line) + + /** If the line looks like + * res15: Int + * + * and the additional conditions hold that: + * 1) res15 is referenced from elsewhere in the transcript + * 2) the preceding repl line is not "val res15 = ..." because that + * indicates it has already been "val-ified" on a previous paste + * + * then we go back in time to the preceding scala> prompt and + * rewrite the line containing <expr> as + * val res15 = { <expr> } + * and the rest as they say is rewritten history. + * + * In all other cases, discard the line. + */ + def fixResRefs(code: String, line: String) = line match { + case resCreation(resName) if referenced(resName) => + code.lastIndexOf(PromptString) match { + case -1 => code + case idx => + val (str1, str2) = code splitAt (idx + PromptString.length) + str2 match { + case resAssign(`resName`) => code + case _ => "%sval %s = { %s }".format(str1, resName, str2) + } + } + case _ => code + } + + def run() { + println("// Replaying %d commands from transcript.\n" format cmds.size) + cmds foreach { cmd => + print(PromptString) + interpret(cmd) + } + } + } + /** Commands start on lines beginning with "scala>" and each successive * line which begins with the continuation string is appended to that command. * Everything else is discarded. When the end of the transcript is spotted, * all the commands are replayed. */ def apply(lines: TraversableOnce[String]) = { - val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList; - println("// Replaying %d commands from transcript.\n" format cmds.size) - isRunning = true - try cmds foreach interpret + try new PasteAnalyzer(lines.toList) run() finally isRunning = false } - - private def isPrompted(line: String) = line startsWith PromptString - private def isContinuation(line: String) = line startsWith ContinueString - - private def append(code: String, line: String): String = - if (isPrompted(line)) code + "\n" + line - else if (isContinuation(line)) code + "\n" + line.stripPrefix(ContinueString) - else fixResRefs(code, line) - - /** If the line looks like - * res15: Int - * then we go back in time to the preceding scala> prompt and rewrite - * the line containing <expr> as - * val res15 = { <expr> } - * and the rest as they say is rewritten history. - * - * In all other cases, discard the line. - */ - private val resRegex = """^(res\d+):.*""".r - private def fixResRefs(code: String, line: String) = line match { - case resRegex(resName) if code contains PromptString => - val (str1, str2) = code splitAt code.lastIndexOf(PromptString) + PromptString.length - "%sval %s = { %s }".format(str1, resName, str2) - case _ => code - } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Phased.scala b/src/compiler/scala/tools/nsc/interpreter/Phased.scala index 1406d2af39..b3d33325e4 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Phased.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Phased.scala @@ -6,6 +6,9 @@ package scala.tools.nsc package interpreter +import scala.collection.{ mutable, immutable } +import immutable.SortedMap + /** Mix this into an object and use it as a phasing * swiss army knife. */ @@ -63,11 +66,14 @@ trait Phased { try parseInternal(str) catch { case _: Exception => NoPhaseName } - def apply[T](body: => T): T = atPhase(get)(body) + def apply[T](body: => T): SortedMap[PhaseName, T] = + SortedMap[PhaseName, T](atMap(PhaseName.all)(body): _*) + + def atCurrent[T](body: => T): T = atPhase(get)(body) def multi[T](body: => T): Seq[T] = multi map (ph => at(ph)(body)) - def all[T](body: => T): Seq[T] = ats(PhaseName.all)(body) - def allshow[T](body: => T): Seq[T] = { - val pairs = atz(PhaseName.all)(body) + def all[T](body: => T): Seq[T] = atMulti(PhaseName.all)(body) + def show[T](body: => T): Seq[T] = { + val pairs = atMap(PhaseName.all)(body) pairs foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) } pairs map (_._2) } @@ -75,25 +81,27 @@ trait Phased { def at[T](ph: PhaseName)(body: => T): T = { val saved = get set(ph) - try apply(body) + try atCurrent(body) finally set(saved) } - def ats[T](phs: Seq[PhaseName])(body: => T): Seq[T] = { + def atMulti[T](phs: Seq[PhaseName])(body: => T): Seq[T] = { val saved = multi setMulti(phs) try multi(body) finally setMulti(saved) } - def atshow[T](phs: Seq[PhaseName])(body: => T): Unit = - atz[T](phs)(body) foreach { + def showAt[T](phs: Seq[PhaseName])(body: => T): Unit = + atMap[T](phs)(body) foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) } - def atz[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] = - phs zip ats(phs)(body) + def atMap[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] = + phs zip atMulti(phs)(body) object PhaseName { + implicit lazy val phaseNameOrdering: Ordering[PhaseName] = Ordering[Int] on (_.id) + lazy val all = List( Parser, Namer, Packageobjects, Typer, Superaccessors, Pickler, Refchecks, Selectiveanf, Liftcode, Selectivecps, Uncurry, Tailcalls, Specialize, diff --git a/src/compiler/scala/tools/nsc/interpreter/Power.scala b/src/compiler/scala/tools/nsc/interpreter/Power.scala index 0933365d9e..c2f72e9f37 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Power.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Power.scala @@ -6,20 +6,57 @@ package scala.tools.nsc package interpreter +import scala.reflect.NameTransformer import scala.collection.{ mutable, immutable } import scala.util.matching.Regex import scala.tools.nsc.util.{ BatchSourceFile } import session.{ History } +import scala.io.Codec +import java.net.{ URL, MalformedURLException } +import io.{ Path } + +trait SharesGlobal[G <: Global] { + val global: G + + // This business gets really old: + // + // found : power.intp.global.Symbol + // required: global.Symbol + // + // Have tried many ways to cast it aside, this is the current winner. + // Todo: figure out a way to abstract over all the type members. + type AnySymbol = Global#Symbol + type AnyType = Global#Type + type AnyName = Global#Name + type AnyTree = Global#Tree + + type Symbol = global.Symbol + type Type = global.Type + type Name = global.Name + type Tree = global.Tree + + implicit def upDependentSymbol(x: AnySymbol): Symbol = x.asInstanceOf[Symbol] + implicit def upDependentType(x: AnyType): Type = x.asInstanceOf[Type] + implicit def upDependentName(x: AnyName): Name = x.asInstanceOf[Name] + implicit def upDependentTree(x: AnyTree): Tree = x.asInstanceOf[Tree] +} + +object Power { + def apply[G <: Global](repl: ILoop, g: G) = + new { final val global: G = g } with Power[G](repl, repl.intp) + + def apply(intp: IMain) = + new { final val global = intp.global } with Power[Global](null, intp) +} /** A class for methods to be injected into the intp in power mode. */ -class Power(repl: ILoop, intp: IMain) { - def this(repl: ILoop) = this(repl, repl.intp) - def this(intp: IMain) = this(null, intp) - - val global: intp.global.type = intp.global - import global._ +abstract class Power[G <: Global]( + val repl: ILoop, + val intp: IMain +) extends SharesGlobal[G] { import intp.{ beQuietDuring, interpret, parse } + import global.{ opt, definitions, stringToTermName, NoSymbol, NoType, analyzer, CompilationUnit } abstract class SymSlurper { def isKeep(sym: Symbol): Boolean @@ -82,7 +119,10 @@ class Power(repl: ILoop, intp: IMain) { def slurp() = apply(modClass) } - def banner = """ + private def customBanner = replProps.powerBanner.option flatMap (f => io.File(f).safeSlurp()) + private def customInit = replProps.powerInitCode.option flatMap (f => io.File(f).safeSlurp()) + + def banner = customBanner getOrElse """ |** Power User mode enabled - BEEP BOOP WHIR ** |** scala.tools.nsc._ has been imported ** |** global._ and definitions._ also imported ** @@ -91,27 +131,28 @@ class Power(repl: ILoop, intp: IMain) { |** New defs! Type power.<tab> to reveal ** """.stripMargin.trim - def init = """ + def init = customInit getOrElse """ |import scala.tools.nsc._ - |val global: intp.global.type = intp.global + |import scala.collection.JavaConverters._ |import global._ - |import definitions._ - |import power.phased |import power.Implicits._ """.stripMargin /** Starts up power mode and runs whatever is in init. */ def unleash(): Unit = beQuietDuring { - if (repl != null) { - intp.bind[ILoop]("repl", repl) - intp.bind[History]("history", repl.in.history) - intp.bind("completion", repl.in.completion) - } + val r = new ReplVals(repl) + intp.bind[ILoop]("repl", repl) + intp.bind[ReplVals]("$r", r) + + intp.bind("intp", r.intp) + intp.bind("global", r.global) + intp.bind("power", r.power) + intp.bind("phased", r.phased) + intp.bind("isettings", r.isettings) + intp.bind("completion", r.completion) + intp.bind("history", r.history) - intp.bind[IMain]("intp", intp) - intp.bind[Power]("power", this) - intp.bind[ISettings]("isettings", intp.isettings) init split '\n' foreach interpret } @@ -122,9 +163,11 @@ class Power(repl: ILoop, intp: IMain) { private def getCompilerClass(name: String) = missingWrap(definitions.getClass(name)) private def getCompilerModule(name: String) = missingWrap(definitions.getModule(name)) - object InternalInfo { + trait LowPriorityInternalInfo { implicit def apply[T: Manifest] : InternalInfo[T] = new InternalInfo[T](None) } + object InternalInfo extends LowPriorityInternalInfo { } + /** Todos... * translate manifest type arguments into applied types * customizable symbol filter (had to hardcode no-spec to reduce noise) @@ -152,11 +195,13 @@ class Power(repl: ILoop, intp: IMain) { def allMembers = tpe.members def bts = info.baseTypeSeq.toList def btsmap = bts map (x => (x, x.decls.toList)) toMap - def pkgName = erasure.getPackage.getName - def pkg = getCompilerModule(pkgName) + def pkgName = Option(erasure.getPackage) map (_.getName) + def pkg = pkgName map getCompilerModule getOrElse NoSymbol def pkgmates = pkg.tpe.members - def pkgslurp = new PackageSlurper(pkgName) slurp() - + def pkgslurp = pkgName match { + case Some(name) => new PackageSlurper(name) slurp() + case _ => Set() + } def ? = this def whoHas(name: String) = bts filter (_.decls.toList exists (_.name.toString == name)) @@ -171,8 +216,24 @@ class Power(repl: ILoop, intp: IMain) { } } - trait PCFormatter extends (Any => List[String]) { - def apply(x: Any): List[String] + trait LowPriorityPrettifier { + implicit object AnyPrettifier extends Prettifier[Any] { + def prettify(x: Any): List[String] = x match { + case x: Name => List(x.decode) + case Tuple2(k, v) => List(prettify(k) ++ Seq("->") ++ prettify(v) mkString " ") + case xs: TraversableOnce[_] => (xs.toList flatMap prettify).sorted + case x => List(rutil.stringOf(x)) + } + } + } + object Prettifier extends LowPriorityPrettifier { + def prettify[T](value: T): List[String] = default[T] prettify value + def default[T] = new Prettifier[T] { + def prettify(x: T): List[String] = AnyPrettifier prettify x + } + } + trait Prettifier[T] { + def prettify(x: T): List[String] private var indentLevel = 0 private def spaces = " " * indentLevel @@ -182,12 +243,13 @@ class Power(repl: ILoop, intp: IMain) { finally indentLevel -= 1 } - def show(x: Any): Unit = grep(x, _ => true) - def grep(x: Any, p: String => Boolean): Unit = - apply(x) filter p foreach (x => println(spaces + x)) + def show(x: T): Unit = grep(x, _ => true) + def grep(x: T, p: String => Boolean): Unit = + prettify(x) filter p foreach (x => println(spaces + x)) } - class MultiPrintingConvenience[T](coll: Traversable[T])(implicit fmt: PCFormatter) { - import fmt._ + class MultiPrintingConvenience[T: Prettifier](coll: TraversableOnce[T]) { + val pretty = implicitly[Prettifier[T]] + import pretty._ def freqBy[U](p: T => U) = { val map = coll.toList groupBy p @@ -197,8 +259,8 @@ class Power(repl: ILoop, intp: IMain) { val buf = new mutable.ListBuffer[String] freqBy(p) foreach { case (k, vs) => - buf += "%d: %s".format(vs.size, k) - vs flatMap fmt foreach (buf += " " + _) + buf += "%d: %s".format(vs.size, Prettifier.prettify(k)) + vs flatMap prettify foreach (buf += " " + _) } buf.toList } @@ -215,45 +277,85 @@ class Power(repl: ILoop, intp: IMain) { def #?[U](p: T => U) = this freqByFormatted p } - class PrintingConvenience[T](value: T)(implicit fmt: PCFormatter) { - def > : Unit = >(_ => true) + class PrintingConvenience[T: Prettifier](value: T) { + val pretty = implicitly[Prettifier[T]] + + def > { >(_ => true) } def >(s: String): Unit = >(_ contains s) def >(r: Regex): Unit = >(_ matches r.pattern.toString) - def >(p: String => Boolean): Unit = fmt.grep(value, p) + def >(p: String => Boolean): Unit = pretty.grep(value, p) } + class RichInputStream(in: InputStream)(implicit codec: Codec) { + def bytes(): Array[Byte] = io.Streamable.bytes(in) + def slurp(): String = io.Streamable.slurp(in) + } + protected trait Implicits1 { - implicit def replPrinting[T](x: T)(implicit fmt: PCFormatter) = new PrintingConvenience[T](x) + // fallback + implicit def replPrinting[T](x: T)(implicit pretty: Prettifier[T] = Prettifier.default[T]) = new PrintingConvenience[T](x) } - object Implicits extends Implicits1 { - implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString) - implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name) - implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol) + trait Implicits2 extends Implicits1 with SharesGlobal[G] { + import global._ + class RichSymbol(sym: Symbol) { + // convenient type application + def apply(targs: Type*): Type = typeRef(NoPrefix, sym, targs.toList) + } object symbolSubtypeOrdering extends Ordering[Symbol] { def compare(s1: Symbol, s2: Symbol) = if (s1 eq s2) 0 else if (s1 isLess s2) -1 else 1 } - implicit def replCollPrinting[T](xs: Traversable[T])(implicit fmt: PCFormatter) = new MultiPrintingConvenience[T](xs) + implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString) + implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name) + implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol) + + implicit def replCollPrinting[T: Prettifier](xs: TraversableOnce[T]): MultiPrintingConvenience[T] = new MultiPrintingConvenience[T](xs) implicit def replInternalInfo[T: Manifest](x: T): InternalInfo[T] = new InternalInfo[T](Some(x)) - implicit object ReplDefaultFormatter extends PCFormatter { - def apply(x: Any): List[String] = x match { - case Tuple2(k, v) => List(apply(k) ++ Seq("->") ++ apply(v) mkString " ") - case xs: Traversable[_] => (xs.toList flatMap apply).sorted.distinct - case x => List("" + x) + implicit def replPrettifier[T] : Prettifier[T] = Prettifier.default[T] + implicit def replTypeApplication(sym: Symbol): RichSymbol = new RichSymbol(sym) + implicit def replInputStream(in: InputStream)(implicit codec: Codec): RichInputStream = new RichInputStream(in) + implicit def replInputStreamURL(url: URL)(implicit codec: Codec) = replInputStream(url.openStream()) + } + object Implicits extends Implicits2 { + val global: G = Power.this.global + } + + trait ReplUtilities { + def ?[T: Manifest] = InternalInfo[T] + def url(s: String) = { + try new URL(s) + catch { case _: MalformedURLException => + if (Path(s).exists) Path(s).toURL + else new URL("http://" + s) + } + } + def sanitize(s: String): String = sanitize(s.getBytes()) + def sanitize(s: Array[Byte]): String = (s map { + case x if x.toChar.isControl => '?' + case x => x.toChar + }).mkString + + def strings(s: Seq[Byte]): List[String] = { + if (s.length == 0) Nil + else s dropWhile (_.toChar.isControl) span (x => !x.toChar.isControl) match { + case (next, rest) => next.map(_.toChar).mkString :: strings(rest) } } + def stringOf(x: Any): String = scala.runtime.ScalaRunTime.stringOf(x) } - object phased extends Phased { - val global: Power.this.global.type = Power.this.global + lazy val rutil: ReplUtilities = new ReplUtilities { } + lazy val phased: Phased = new Phased with SharesGlobal[G] { + val global: G = Power.this.global } - def context(code: String) = analyzer.rootContext(unit(code)) - def source(code: String) = new BatchSourceFile("<console>", code) - def unit(code: String) = new CompilationUnit(source(code)) - def trees(code: String): List[Tree] = parse(code) getOrElse Nil - def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType + + def context(code: String) = analyzer.rootContext(unit(code)) + def source(code: String) = new BatchSourceFile("<console>", code) + def unit(code: String) = new CompilationUnit(source(code)) + def trees(code: String) = parse(code) getOrElse Nil + def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType override def toString = """ |** Power mode status ** diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala new file mode 100644 index 0000000000..a8287e3a9a --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala @@ -0,0 +1,42 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import sys.{ Prop, BooleanProp } + +trait ReplConfig { + + class ReplProps { + private def bool(name: String) = BooleanProp.keyExists(name) + + val jlineDebug = bool("scala.tools.jline.internal.Log.debug") + val jlineTrace = bool("scala.tools.jline.internal.Log.trace") + + val debug = bool("scala.repl.debug") + val trace = bool("scala.repl.trace") + val power = bool("scala.repl.power") + + val replInitCode = Prop[JFile]("scala.repl.initcode") + val powerInitCode = Prop[JFile]("scala.repl.power.initcode") + val powerBanner = Prop[JFile]("scala.repl.power.banner") + } + lazy val replProps = new ReplProps + + /** Debug output */ + private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg + + /** Tracing */ + private[nsc] def tracing[T](msg: String)(x: T): T = { + if (isReplDebug) + println("(" + msg + ") " + x) + + x + } + + def isReplDebug: Boolean = replProps.debug + def isReplPower: Boolean = replProps.power +} diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala new file mode 100644 index 0000000000..cef46c963a --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala @@ -0,0 +1,45 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import scala.collection.{ mutable, immutable } +import scala.PartialFunction.cond +import scala.reflect.NameTransformer +import util.Chars + +trait ReplStrings { + // Longest common prefix + def longestCommonPrefix(xs: List[String]): String = { + if (xs.isEmpty || xs.contains("")) "" + else xs.head.head match { + case ch => + if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail)) + else "" + } + } + /** Convert a string into code that can recreate the string. + * This requires replacing all special characters by escape + * codes. It does not add the surrounding " marks. */ + def string2code(str: String): String = { + val res = new StringBuilder + for (c <- str) c match { + case '"' | '\'' | '\\' => res += '\\' ; res += c + case _ if c.isControl => res ++= Chars.char2uescape(c) + case _ => res += c + } + res.toString + } + + def string2codeQuoted(str: String) = + "\"" + string2code(str) + "\"" + + def any2stringOf(x: Any, maxlen: Int) = + "scala.runtime.ScalaRunTime.replStringOf(%s, %s)".format(x, maxlen) + + def words(s: String) = s.trim split "\\s+" filterNot (_ == "") toList + def isQuoted(s: String) = (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head) +} diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala new file mode 100644 index 0000000000..2c5f5474af --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala @@ -0,0 +1,20 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import java.lang.reflect.{ Method => JMethod } + +class ReplVals(final val r: ILoop) { + final val intp = r.intp + final val global = r.power.global + final val power = r.power + final val phased = r.power.phased + final val isettings = r.intp.isettings + final val completion = r.in.completion + final val history = r.in.history + final val rutil = r.power.rutil +} diff --git a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala index e377a140af..fc286b4868 100644 --- a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala +++ b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala @@ -63,7 +63,7 @@ trait TypeStrings { private def tvarString(tvar: TypeVariable[_]): String = tvarString(tvar.getBounds.toList) private def tvarString(bounds: List[AnyRef]): String = { - val xs = bounds filterNot (_ == ObjectClass) collect { case x: Class[_] => x } + val xs = bounds filterNot (_ == ObjectClass) collect { case x: JClass => x } if (xs.isEmpty) "_" else scalaName(xs.head) } diff --git a/src/compiler/scala/tools/nsc/interpreter/package.scala b/src/compiler/scala/tools/nsc/interpreter/package.scala index 13fb860128..1865e90e92 100644 --- a/src/compiler/scala/tools/nsc/interpreter/package.scala +++ b/src/compiler/scala/tools/nsc/interpreter/package.scala @@ -22,50 +22,17 @@ package scala.tools.nsc * InteractiveReader contains { history: History, completion: Completion } * IMain contains { global: Global } */ -package object interpreter { +package object interpreter extends ReplConfig with ReplStrings { + type JFile = java.io.File type JClass = java.lang.Class[_] type JList[T] = java.util.List[T] type JCollection[T] = java.util.Collection[T] - - private[nsc] val DebugProperty = "scala.repl.debug" - private[nsc] val TraceProperty = "scala.repl.trace" - private[nsc] val PowerProperty = "scala.repl.power" - private[nsc] var isReplDebug = sys.props contains DebugProperty // Also set by -Yrepl-debug - private[nsc] var isReplPower = sys.props contains PowerProperty + type InputStream = java.io.InputStream + type OutputStream = java.io.OutputStream private[nsc] implicit def enrichClass[T](clazz: Class[T]) = new RichClass[T](clazz) private[interpreter] implicit def javaCharSeqCollectionToScala(xs: JCollection[_ <: CharSequence]): List[String] = { import collection.JavaConverters._ xs.asScala.toList map ("" + _) } - - /** Debug output */ - private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg - - /** Tracing */ - private[nsc] def tracing[T](msg: String)(x: T): T = { - if (isReplDebug) - println("(" + msg + ") " + x) - - x - } - - // Longest common prefix - def longestCommonPrefix(xs: List[String]): String = { - if (xs.isEmpty || xs.contains("")) "" - else xs.head.head match { - case ch => - if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail)) - else "" - } - } - - private[nsc] def words(s: String) = s.trim split "\\s+" toList - private[nsc] def isQuoted(s: String) = - (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head) - - /** Class objects */ - private[nsc] def classForName(name: String): Option[JClass] = - try Some(Class forName name) - catch { case _: ClassNotFoundException | _: SecurityException => None } } diff --git a/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala new file mode 100644 index 0000000000..88efe1e0b5 --- /dev/null +++ b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala @@ -0,0 +1,39 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package io + +import java.net.URL +import collection.JavaConverters._ + +/** A convenience class for finding the jar with the bytecode for + * a given Class object and similar common tasks. + */ +class ClassAndJarInfo[T: ClassManifest] { + val man = classManifest[T] + def clazz = man.erasure + + def baseOfPath(path: String) = path indexOf '!' match { + case -1 => path stripSuffix internalClassName + case idx => path take idx + } + + def classUrl = clazz getResource simpleClassName + ".class" + def codeSource = protectionDomain.getCodeSource() + def internalClassName = internalName + ".class" + def internalName = clazz.getName.replace('.', '/') + def jarManifest = new JManifest(jarManifestUrl.openStream()) + def jarManifestMainAttrs = jarManifest.getMainAttributes().asScala + def jarManifestUrl = new URL(baseOfPath("" + classUrl) + "!/META-INF/MANIFEST.MF") + def locationFile = File(locationUrl.toURI.getPath()) + def locationUrl = if (codeSource == null) new URL("file:///") else codeSource.getLocation() + def protectionDomain = clazz.getProtectionDomain() + def rootClasspath = rootPossibles find (_.exists) + def rootFromLocation = Path(locationUrl.toURI.getPath()) + def rootFromResource = Path(baseOfPath(classUrl.getPath) stripPrefix "file:") + def rootPossibles = Iterator(rootFromResource, rootFromLocation) + def simpleClassName = clazz.getName split """[$.]""" last +} diff --git a/src/compiler/scala/tools/nsc/io/File.scala b/src/compiler/scala/tools/nsc/io/File.scala index 60d9a0f169..b11151ab7e 100644 --- a/src/compiler/scala/tools/nsc/io/File.scala +++ b/src/compiler/scala/tools/nsc/io/File.scala @@ -137,6 +137,10 @@ class File(jfile: JFile)(implicit constructorCodec: Codec) extends Path(jfile) w finally out close } + def safeSlurp(): Option[String] = + try Some(slurp()) + catch { case _: IOException => None } + def copyTo(destPath: Path, preserveFileDate: Boolean = false): Boolean = { val CHUNK = 1024 * 1024 * 16 // 16 MB val dest = destPath.toFile diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala index a9f0acaa00..bd7dbde5ec 100644 --- a/src/compiler/scala/tools/nsc/io/Jar.scala +++ b/src/compiler/scala/tools/nsc/io/Jar.scala @@ -1,3 +1,8 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + package scala.tools.nsc package io @@ -5,6 +10,27 @@ import java.io.{ InputStream, OutputStream, IOException, FileNotFoundException, import java.util.jar._ import collection.JavaConverters._ import Attributes.Name +import util.ClassPath + +// Attributes.Name instances: +// +// static Attributes.Name CLASS_PATH +// static Attributes.Name CONTENT_TYPE +// static Attributes.Name EXTENSION_INSTALLATION +// static Attributes.Name EXTENSION_LIST +// static Attributes.Name EXTENSION_NAME +// static Attributes.Name IMPLEMENTATION_TITLE +// static Attributes.Name IMPLEMENTATION_URL +// static Attributes.Name IMPLEMENTATION_VENDOR +// static Attributes.Name IMPLEMENTATION_VENDOR_ID +// static Attributes.Name IMPLEMENTATION_VERSION +// static Attributes.Name MAIN_CLASS +// static Attributes.Name MANIFEST_VERSION +// static Attributes.Name SEALED +// static Attributes.Name SIGNATURE_VERSION +// static Attributes.Name SPECIFICATION_TITLE +// static Attributes.Name SPECIFICATION_VENDOR +// static Attributes.Name SPECIFICATION_VERSION class Jar(file: File) extends Iterable[JarEntry] { def this(path: String) = this(File(path)) @@ -74,21 +100,6 @@ object Jar { def isJarOrZip(f: Path, examineFile: Boolean): Boolean = f.hasExtension("zip", "jar") || (examineFile && magicNumberIsZip(f)) - def locateByClass(clazz: Class[_]): Option[File] = { - try Some(File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath())) - catch { case _: Exception => None } - } - /** Walks upward from wherever the scala library jar is searching for - * the given jar name. This approach finds the scala library jar in the - * release layout and in trunk builds going up from pack. - */ - def locateByName(name: String): Option[File] = { - def toSrc(d: Directory) = d.dirs.toList map (_ / name) - def walk(d: Directory) = d.parents flatMap toSrc find (_.isFile) map (_.toFile) - - locateByClass(classOf[ScalaObject]) flatMap (x => walk(x.parent)) - } - def create(file: File, sourceDir: Directory, mainClass: String): File = { val writer = new Jar(file).jarWriter() writer.manifest(Name.MANIFEST_VERSION) = "1.0" diff --git a/src/compiler/scala/tools/nsc/io/Sources.scala b/src/compiler/scala/tools/nsc/io/Sources.scala index c763b04511..35c7a504a5 100644 --- a/src/compiler/scala/tools/nsc/io/Sources.scala +++ b/src/compiler/scala/tools/nsc/io/Sources.scala @@ -4,7 +4,6 @@ package io import util.ClassPath import java.util.concurrent.{ Future, ConcurrentHashMap, ExecutionException } import java.util.zip.ZipException -import Jar.{ isJarOrZip, locateByClass } import collection.JavaConverters._ import Properties.{ envOrElse, propOrElse } @@ -20,7 +19,7 @@ class Sources(val path: String) { private val partitioned = ClassPath toPaths expandedPath partition (_.isDirectory) val dirs = partitioned._1 map (_.toDirectory) - val jars = partitioned._2 filter isJarOrZip map (_.toFile) + val jars = partitioned._2 filter Jar.isJarOrZip map (_.toFile) val (isDone, force) = { val f1 = spawn(calculateDirs()) val f2 = spawn(calculateJars()) @@ -63,25 +62,12 @@ trait LowPrioritySourcesImplicits { } object Sources extends LowPrioritySourcesImplicits { - // Examples of what libraryJar might be, each of which we'd like to find - // the source files automatically: - // - // /scala/trunk/build/pack/lib/scala-library.jar - // /scala/trunk/build/quick/classes/library - // /scala/inst/scala-2.9.0.r24213-b20110206233447/lib/scala-library.jar - private def libraryJar = locateByClass(classOf[ScalaObject]) map (_.toAbsolute.path) - private def autoSourcePaths: List[String] = libraryJar.toList flatMap { lib => - val markers = List("build/pack/lib", "build/quick/classes", "scala-library.jar") - markers filter (lib contains _) flatMap { m => - val dir = Path(lib take lib.indexOf(m)) / "src" - - if (dir.exists) ClassPath.expandDir(dir.path) - else Nil - } - } + private def libraryInits = ClassPath.scalaLibrary.toList flatMap (_.toAbsolute.parents) + private def librarySourceDir = libraryInits map (_ / "src") find (_.isDirectory) + private def expandedSourceDir = librarySourceDir.toList flatMap (ClassPath expandDir _.path) - val sourcePathEnv = envOrElse("SOURCEPATH", "") - val defaultSources = apply(autoSourcePaths :+ sourcePathEnv: _*) + val sourcePathProp = sys.props.traceSourcePath.value + val defaultSources = apply(expandedSourceDir :+ sourcePathProp: _*) def apply(paths: String*): Sources = new Sources(ClassPath.join(paths: _*)) } diff --git a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala index 3de17d6b56..c600f6364b 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala @@ -305,14 +305,14 @@ trait JavaScanners extends ast.parser.ScannersCommon { */ private def fetchToken() { if (token == EOF) return - lastPos = in.cpos - 1 // Position.encode(in.cline, in.ccol) + lastPos = in.cpos - 1 //var index = bp while (true) { in.ch match { case ' ' | '\t' | CR | LF | FF => in.next case _ => - pos = in.cpos // Position.encode(in.cline, in.ccol) + pos = in.cpos (in.ch: @switch) match { case 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | diff --git a/src/compiler/scala/tools/nsc/plugins/Plugins.scala b/src/compiler/scala/tools/nsc/plugins/Plugins.scala index 6205633a7c..64e38fee9a 100644 --- a/src/compiler/scala/tools/nsc/plugins/Plugins.scala +++ b/src/compiler/scala/tools/nsc/plugins/Plugins.scala @@ -115,6 +115,6 @@ trait Plugins { /** Summary of the options for all loaded plugins */ def pluginOptionsHelp: String = (for (plug <- roughPluginsList ; help <- plug.optionsHelp) yield { - "Options for plugin %s:\n%s\n".format(plug.name, help) + "\nOptions for plugin '%s':\n%s\n".format(plug.name, help) }) mkString } diff --git a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala index 6f130b9e74..be2f8a370a 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala @@ -9,17 +9,19 @@ package settings trait AbsScalaSettings { self: AbsSettings => - type BooleanSetting <: AbsSetting { type T = Boolean } - type ChoiceSetting <: AbsSetting { type T = String } - type IntSetting <: AbsSetting { type T = Int } - type MultiStringSetting <: AbsSetting { type T = List[String] } - type PathSetting <: AbsSetting { type T = String } - type PhasesSetting <: AbsSetting { type T = List[String] } - type StringSetting <: AbsSetting { type T = String } - type PrefixSetting <: AbsSetting { type T = List[String] } + type Setting <: AbsSetting + + type BooleanSetting <: Setting { type T = Boolean } + type ChoiceSetting <: Setting { type T = String } + type IntSetting <: Setting { type T = Int } + type MultiStringSetting <: Setting { type T = List[String] } + type PathSetting <: Setting { type T = String } + type PhasesSetting <: Setting { type T = List[String] } + type StringSetting <: Setting { type T = String } + type PrefixSetting <: Setting { type T = List[String] } type OutputDirs - type OutputSetting <: AbsSetting + type OutputSetting <: Setting def BooleanSetting(name: String, descr: String): BooleanSetting def ChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String], default: String): ChoiceSetting diff --git a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala index f70e6dc7d3..82e311028b 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala @@ -75,8 +75,10 @@ trait AbsSettings { */ def withAbbreviation(name: String): this.type def withHelpSyntax(help: String): this.type + def withDeprecationMessage(msg: String): this.type def helpSyntax: String = name + def deprecationMessage: Option[String] = None def abbreviations: List[String] = Nil def dependencies: List[(Setting, String)] = Nil def respondsTo(label: String) = (name == label) || (abbreviations contains label) @@ -122,10 +124,11 @@ trait AbsSettings { /** These categorizations are so the help output shows -X and -P among * the standard options and -Y among the advanced options. */ - def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" } - def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" } - def isStandard = !isAdvanced && !isPrivate - def isForDebug = isPrivate && (name contains ("-debug")) // by convention, i.e. -Ytyper-debug + def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" } + def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" } + def isStandard = !isAdvanced && !isPrivate + def isForDebug = name endsWith "-debug" // by convention, i.e. -Ytyper-debug + def isDeprecated = deprecationMessage.isDefined def compare(that: Setting): Int = name compare that.name diff --git a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala index d7bec764b3..0908ea60b6 100644 --- a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala @@ -25,7 +25,7 @@ trait AestheticSettings { def fatalWarnings = settings.Xwarnfatal.value def logClasspath = settings.Ylogcp.value def printStats = settings.Ystatistics.value - def richExes = settings.YrichExes.value + def richExes = settings.YrichExes.value || sys.props.traceSourcePath.isSet def target = settings.target.value def unchecked = settings.unchecked.value def verbose = settings.verbose.value diff --git a/src/compiler/scala/tools/nsc/settings/FscSettings.scala b/src/compiler/scala/tools/nsc/settings/FscSettings.scala index a219148b16..bb62750026 100644 --- a/src/compiler/scala/tools/nsc/settings/FscSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/FscSettings.scala @@ -8,28 +8,45 @@ package nsc package settings import util.ClassPath +import io.{ Directory, Path, AbstractFile } class FscSettings(error: String => Unit) extends Settings(error) { outer => - def this() = this(Console.println) + locally { + disable(prompt) + disable(resident) + } + val currentDir = StringSetting ("-current-dir", "path", "Base directory for resolving relative paths", "").internalOnly() val reset = BooleanSetting("-reset", "Reset compile server caches") val shutdown = BooleanSetting("-shutdown", "Shutdown compile server") val server = StringSetting ("-server", "hostname:portnumber", "Specify compile server socket", "") - val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket") - val absClasspath = BooleanSetting("-absolute-cp", "Make classpath elements absolute paths before sending to server") . - withPostSetHook (_ => absolutizeClasspath()) + val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket") val idleMins = IntSetting ("-max-idle", "Set idle timeout in minutes for fsc (use 0 for no timeout)", 30, Some(0, Int.MaxValue), (_: String) => None) - disable(prompt) - disable(resident) + // For improved help output, separating fsc options from the others. + def fscSpecific = Set[Settings#Setting]( + currentDir, reset, shutdown, server, preferIPv4, idleMins + ) + val isFscSpecific: String => Boolean = fscSpecific map (_.name) + + /** If a setting (other than a PathSetting) represents a path or paths. + * For use in absolutization. + */ + private def holdsPath = Set[Settings#Setting]( + d, dependencyfile, pluginsDir, Ygenjavap + ) - // Make the classpath absolute: for going from client to server. - private def absolutizeClasspath() { - userSetSettings collect { - case x: PathSetting => x.value = ClassPath.makeAbsolute(x.value) + /** All user set settings rewritten with absolute paths. */ + def absolutize(root: Path) { + def rewrite(p: String) = (root resolve Path(p)).normalize.path + userSetSettings foreach { + case p: OutputSetting => p.outputDirs setSingleOutput AbstractFile.getDirectory(rewrite(p.value)) + case p: PathSetting => p.value = ClassPath.map(p.value, rewrite) + case p: StringSetting => if (holdsPath(p)) p.value = rewrite(p.value) + case _ => () } } } diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala index b485d4725a..477c2a528e 100644 --- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala @@ -345,6 +345,10 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal private var dependency: Option[(Setting, String)] = None override def dependencies = dependency.toList def dependsOn(s: Setting, value: String): this.type = { dependency = Some((s, value)); this } + + private var _deprecationMessage: Option[String] = None + override def deprecationMessage = _deprecationMessage + def withDeprecationMessage(msg: String): this.type = { _deprecationMessage = Some(msg) ; this } } /** A setting represented by an integer */ @@ -479,13 +483,14 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal /** Set the output directory. */ class OutputSetting private[nsc]( - outputDirs: OutputDirs, + private[nsc] val outputDirs: OutputDirs, default: String) extends StringSetting("-d", "directory", "Specify where to place generated class files", default) { value = default override def value_=(str: String) { super.value_=(str) - outputDirs.setSingleOutput(str) + try outputDirs.setSingleOutput(str) + catch { case FatalError(msg) => errorFn(msg) } } } @@ -559,7 +564,7 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal protected var v: List[String] = Nil override def value = if (v contains "all") List("all") else super.value private lazy val (numericValues, stringValues) = - value partition (_ forall (ch => ch.isDigit || ch == '-')) + value filterNot (_ == "" ) partition (_ forall (ch => ch.isDigit || ch == '-')) /** A little ad-hoc parsing. If a string is not the name of a phase, it can also be: * a phase id: 5 diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 7405ca0b3d..a92b5d7034 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -79,7 +79,6 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val sourceReader = StringSetting ("-Xsource-reader", "classname", "Specify a custom method for reading source files.", "") val Xwarnfatal = BooleanSetting ("-Xfatal-warnings", "Fail the compilation if there are any warnings.") - val Xwarninit = BooleanSetting ("-Xwarninit", "Warn about possible changes in initialization semantics.") val Xchecknull = BooleanSetting ("-Xcheck-null", "Emit warning on selection of nullable reference.") // Experimental Extensions @@ -129,21 +128,25 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val Ynosqueeze = BooleanSetting ("-Yno-squeeze", "Disable creation of compact code in matching.") val Ystatistics = BooleanSetting ("-Ystatistics", "Print compiler statistics.") . withPostSetHook(set => util.Statistics.enabled = set.value) - val stop = PhasesSetting ("-Ystop", "Stop after phase") + val stopAfter = PhasesSetting ("-Ystop-after", "Stop after given phase") withAbbreviation ("-stop") // backward compat + val stopBefore = PhasesSetting ("-Ystop-before", "Stop before given phase") val refinementMethodDispatch = ChoiceSetting ("-Ystruct-dispatch", "policy", "structural method dispatch policy", List("no-cache", "mono-cache", "poly-cache", "invoke-dynamic"), "poly-cache") val Yrangepos = BooleanSetting ("-Yrangepos", "Use range positions for syntax trees.") - val YrichExes = BooleanSetting ("-Yrich-exceptions", "More revealing exceptions. Set SOURCEPATH to java/scala source jars.") + val YrichExes = BooleanSetting ("-Yrich-exceptions", + "Fancier exceptions. Set source search path with -D" + + sys.SystemProperties.traceSourcePath.key) val Yidedebug = BooleanSetting ("-Yide-debug", "Generate, validate and output trees using the interactive compiler.") val Ybuilderdebug = ChoiceSetting ("-Ybuilder-debug", "manager", "Compile using the specified build manager.", List("none", "refined", "simple"), "none") val Ybuildmanagerdebug = BooleanSetting ("-Ybuild-manager-debug", "Generate debug information for the Refined Build Manager compiler.") - val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignements.") + val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignments.") val Ypmatdebug = BooleanSetting ("-Ypmat-debug", "Trace all pattern matcher activity.") val Yrepldebug = BooleanSetting ("-Yrepl-debug", "Trace all repl activity.") . - withPostSetHook(set => interpreter.isReplDebug = true) + withPostSetHook(_ => interpreter.replProps.debug setValue true) val Ycompletion = BooleanSetting ("-Ycompletion-debug", "Trace all tab completion activity.") + val Ydocdebug = BooleanSetting ("-Ydoc-debug", "Trace all scaladoc activity.") val Ypmatnaive = BooleanSetting ("-Ypmat-naive", "Desugar matches as naively as possible.") val Ynotnull = BooleanSetting ("-Ynotnull", "Enable (experimental and incomplete) scala.NotNull.") val YdepMethTpes = BooleanSetting ("-Ydependent-method-types", "Allow dependent method types.") @@ -153,6 +156,8 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val exposeEmptyPackage = BooleanSetting("-Yexpose-empty-package", "Internal only: expose the empty package.").internalOnly() + def stop = stopAfter + /** * Warnings */ diff --git a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala index 3975ae4998..cc960e55dd 100644 --- a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala @@ -35,6 +35,7 @@ trait StandardScalaSettings { val g = ChoiceSetting ("-g", "level", "Set level of generated debugging info.", List("none", "source", "line", "vars", "notailcalls"), "vars") val help = BooleanSetting ("-help", "Print a synopsis of standard options") val make = ChoiceSetting ("-make", "policy", "Recompilation detection policy", List("all", "changed", "immediate", "transitive", "transitivenocp"), "all") + . withDeprecationMessage ("this option is unmaintained. Use sbt or an IDE for selective recompilation.") val nowarn = BooleanSetting ("-nowarn", "Generate no warnings") val optimise: BooleanSetting // depends on post hook which mutates other settings val print = BooleanSetting ("-print", "Print program with Scala-specific features removed.") diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 118d650586..1134f0e15f 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -539,10 +539,10 @@ trait Definitions extends reflect.generic.StandardDefinitions { var Object_synchronized: Symbol = _ lazy val Object_isInstanceOf = newPolyMethod( ObjectClass, "$isInstanceOf", - tparam => MethodType(List(), booltype)) setFlag FINAL + tparam => MethodType(List(), booltype)) setFlag (FINAL | SYNTHETIC) lazy val Object_asInstanceOf = newPolyMethod( ObjectClass, "$asInstanceOf", - tparam => MethodType(List(), tparam.typeConstructor)) setFlag FINAL + tparam => MethodType(List(), tparam.typeConstructor)) setFlag (FINAL | SYNTHETIC) def Object_getClass = getMember(ObjectClass, nme.getClass_) def Object_clone = getMember(ObjectClass, nme.clone_) @@ -614,6 +614,10 @@ trait Definitions extends reflect.generic.StandardDefinitions { case result => result } } + def packageExists(packageName: String): Boolean = { + try getModuleOrClass(newTermName(packageName)).isPackage + catch { case _: MissingRequirementError => false } + } /** If you're looking for a class, pass a type name. * If a module, a term name. @@ -741,7 +745,8 @@ trait Definitions extends reflect.generic.StandardDefinitions { case _ => tp } def flatNameString(sym: Symbol, separator: Char): String = - if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "") + if (sym == NoSymbol) "" // be more resistant to error conditions, e.g. neg/t3222.scala + else if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "") else flatNameString(sym.owner, separator) + "$" + sym.simpleName; def signature1(etp: Type): String = { if (etp.typeSymbol == ArrayClass) "[" + signature1(erasure(etp.normalize.typeArgs.head)) diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index d7f9063ec6..d17077b129 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -59,6 +59,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => // annotations private var rawannots: List[AnnotationInfoBase] = Nil + def rawAnnotations = rawannots /* Used in namer to check whether annotations were already assigned or not */ def hasAssignedAnnotations = rawannots.nonEmpty @@ -1400,8 +1401,17 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => final def overridingSymbol(ofclazz: Symbol): Symbol = if (isClassConstructor) NoSymbol else matchingSymbol(ofclazz, ofclazz.thisType) + /** Returns all symbols overriden by this symbol + */ final def allOverriddenSymbols: List[Symbol] = if (!owner.isClass) Nil + else owner.ancestors map overriddenSymbol filter (_ != NoSymbol) + + /** Returns all symbols overridden by this symbol, plus all matching symbols + * defined in parents of the selftype + */ + final def extendedOverriddenSymbols: List[Symbol] = + if (!owner.isClass) Nil else owner.thisSym.ancestors map overriddenSymbol filter (_ != NoSymbol) /** The symbol accessed by a super in the definition of this symbol when diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 4eca9f140e..96ff17e897 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -933,7 +933,7 @@ abstract class ClassfileParser { throw new RuntimeException("Scala class file does not contain Scala annotation") } if (settings.debug.value) - log("" + sym + "; annotations = " + sym.annotations) + log("" + sym + "; annotations = " + sym.rawAnnotations) } else in.skip(attrLen) diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala index b57f89c020..0940598bd2 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala @@ -582,12 +582,12 @@ abstract class Pickler extends SubComponent { case ClassInfoType(parents, decls, clazz) => writeRef(clazz); writeRefs(parents); CLASSINFOtpe case mt @ MethodType(formals, restpe) => - writeRef(restpe); writeRefs(formals) - if (mt.isImplicit) IMPLICITMETHODtpe - else METHODtpe - case mt @ NullaryMethodType(restpe) => // reuse POLYtpe since those can never have an empty list of tparams -- TODO: is there any way this can come back and bite us in the bottom? - // ugliness and thrift aside, this should make this somewhat more backward compatible - // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one) + writeRef(restpe); writeRefs(formals) ; METHODtpe + case mt @ NullaryMethodType(restpe) => + // reuse POLYtpe since those can never have an empty list of tparams. + // TODO: is there any way this can come back and bite us in the bottom? + // ugliness and thrift aside, this should make this somewhat more backward compatible + // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one) writeRef(restpe); writeRefs(Nil); POLYtpe case PolyType(tparams, restpe) => // invar: tparams nonEmpty writeRef(restpe); writeRefs(tparams); POLYtpe @@ -1037,8 +1037,7 @@ abstract class Pickler extends SubComponent { case ClassInfoType(parents, decls, clazz) => print("CLASSINFOtpe "); printRef(clazz); printRefs(parents); case mt @ MethodType(formals, restpe) => - print(if (mt.isImplicit) "IMPLICITMETHODtpe " else "METHODtpe "); - printRef(restpe); printRefs(formals) + print("METHODtpe"); printRef(restpe); printRefs(formals) case PolyType(tparams, restpe) => print("POLYtpe "); printRef(restpe); printRefs(tparams); case ExistentialType(tparams, restpe) => diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala index 8d0ecd247b..9980db6ff5 100644 --- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala +++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala @@ -512,17 +512,31 @@ abstract class CleanUp extends Transform with ast.TreeDSL { * constructor. */ case Template(parents, self, body) => localTyper = typer.atOwner(tree, currentClass) + var savedNewStaticMembers : mutable.Buffer[Tree] = null + var savedNewStaticInits : mutable.Buffer[Tree] = null + var savedSymbolsStoredAsStatic : mutable.Map[String, Symbol] = null + if(forMSIL) { + savedNewStaticMembers = newStaticMembers.clone + savedNewStaticInits = newStaticInits.clone + savedSymbolsStoredAsStatic = symbolsStoredAsStatic.clone + } newStaticMembers.clear newStaticInits.clear symbolsStoredAsStatic.clear - val transformedTemplate: Template = - if (!forMSIL || forMSIL) { - var newBody = - transformTrees(body) - treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody) - } - else super.transform(tree).asInstanceOf[Template] - addStaticInits(transformedTemplate) // postprocess to include static ctors + val transformedTemplate: Template = { + var newBody = transformTrees(body) + treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody) + } + val res = addStaticInits(transformedTemplate) // postprocess to include static ctors + newStaticMembers.clear + newStaticInits.clear + symbolsStoredAsStatic.clear + if(forMSIL) { + newStaticMembers ++= savedNewStaticMembers + newStaticInits ++= savedNewStaticInits + symbolsStoredAsStatic ++= savedSymbolsStoredAsStatic + } + res case Literal(c) if (c.tag == ClassTag) && !forMSIL=> val tpe = c.typeValue diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala index a9e4c01d9f..c1efe4843d 100644 --- a/src/compiler/scala/tools/nsc/transform/Constructors.scala +++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala @@ -70,7 +70,6 @@ abstract class Constructors extends Transform with ast.TreeDSL { } } - var thisRefSeen: Boolean = false var usesSpecializedField: Boolean = false // A transformer for expressions that go into the constructor @@ -78,6 +77,7 @@ abstract class Constructors extends Transform with ast.TreeDSL { def isParamRef(sym: Symbol) = sym.isParamAccessor && sym.owner == clazz && + !(clazz isSubClass DelayedInitClass) && !(sym.isGetter && sym.accessed.isVariable) && !sym.isSetter private def possiblySpecialized(s: Symbol) = specializeTypes.specializedTypeVars(s).nonEmpty @@ -95,16 +95,9 @@ abstract class Constructors extends Transform with ast.TreeDSL { // references to parameter accessor field of own class become references to parameters gen.mkAttributedIdent(parameter(tree.symbol)) setPos tree.pos case Select(_, _) => - thisRefSeen = true if (specializeTypes.specializedTypeVars(tree.symbol).nonEmpty) usesSpecializedField = true super.transform(tree) - case This(_) => - thisRefSeen = true - super.transform(tree) - case Super(_, _) => - thisRefSeen = true - super.transform(tree) case _ => super.transform(tree) } @@ -117,16 +110,8 @@ abstract class Constructors extends Transform with ast.TreeDSL { // Should tree be moved in front of super constructor call? def canBeMoved(tree: Tree) = tree match { - //todo: eliminate thisRefSeen - case ValDef(mods, _, _, _) => - if (settings.Xwarninit.value) - if (!(mods hasFlag PRESUPER | PARAMACCESSOR) && !thisRefSeen && - { val g = tree.symbol.getter(tree.symbol.owner); - g != NoSymbol && !g.allOverriddenSymbols.isEmpty - }) - unit.warning(tree.pos, "the semantics of this definition has changed;\nthe initialization is no longer be executed before the superclass is called") - (mods hasFlag PRESUPER | PARAMACCESSOR)// || !thisRefSeen && (!settings.future.value && !settings.checkInit.value) - case _ => false + case ValDef(mods, _, _, _) => (mods hasFlag PRESUPER | PARAMACCESSOR) + case _ => false } // Create an assignment to class field `to' with rhs `from' @@ -230,12 +215,13 @@ abstract class Constructors extends Transform with ast.TreeDSL { // the symbol is an outer accessor of a final class which does not override another outer accessor. ) def maybeOmittable(sym: Symbol) = sym.owner == clazz && ( sym.isParamAccessor && sym.isPrivateLocal || - sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty + sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty && + !(clazz isSubClass DelayedInitClass) ) // Is symbol known to be accessed outside of the primary constructor, // or is it a symbol whose definition cannot be omitted anyway? - def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || accessedSyms(sym) + def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || (accessedSyms contains sym) // A traverser to set accessedSyms and outerAccessors val accessTraverser = new Traverser { @@ -593,7 +579,10 @@ abstract class Constructors extends Transform with ast.TreeDSL { // Unlink all fields that can be dropped from class scope for (sym <- clazz.info.decls.toList) - if (!mustbeKept(sym)) clazz.info.decls unlink sym + if (!mustbeKept(sym)) { + // println("dropping "+sym+sym.locationString) + clazz.info.decls unlink sym + } // Eliminate all field definitions that can be dropped from template treeCopy.Template(impl, impl.parents, impl.self, diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index ca39ec4a4d..f9f2f94917 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -209,7 +209,7 @@ abstract class Erasure extends AddInterfaces !sym.isHigherOrderTypeParameter && sym.isTypeParameterOrSkolem && ( (initialSymbol.enclClassChain.exists(sym isNestedIn _)) || - traceSig.seq("isMethod", Seq(initialSymbol, initialSymbol.typeParams)) { + traceSig("isMethod", (initialSymbol, initialSymbol.typeParams)) { (initialSymbol.isMethod && initialSymbol.typeParams.contains(sym)) } ) @@ -229,7 +229,8 @@ abstract class Erasure extends AddInterfaces } } // for debugging signatures: traces logic given system property - private val traceSig = util.Tracer(sys.props contains "scalac.sigs.trace") + private val traceProp = sys.BooleanProp keyExists "scalac.sigs.trace" + private val traceSig = util.Tracer(traceProp) /** This object is only used for sanity testing when -check:genjvm is set. * In that case we make sure that the erasure of the `normalized' type @@ -356,7 +357,7 @@ abstract class Erasure extends AddInterfaces } else if (sym.isClass) { val preRebound = pre.baseType(sym.owner) // #2585 - traceSig.seq("sym.isClass", Seq(sym.ownerChain, preRebound, sym0.enclClassChain)) { + traceSig("sym.isClass", (sym.ownerChain, preRebound, sym0.enclClassChain)) { dotCleanup( ( if (needsJavaSig(preRebound)) { @@ -389,7 +390,7 @@ abstract class Erasure extends AddInterfaces def paramSig(tsym: Symbol) = tsym.name + boundSig(hiBounds(tsym.info.bounds)) val paramString = if (toplevel) tparams map paramSig mkString ("<", "", ">") else "" - traceSig.seq("PolyType", Seq(tparams, restpe))(paramString + jsig(restpe)) + traceSig("PolyType", (tparams, restpe))(paramString + jsig(restpe)) case MethodType(params, restpe) => "("+(params map (_.tpe) map (jsig(_))).mkString+")"+ (if (restpe.typeSymbol == UnitClass || sym0.isConstructor) VOID_TAG.toString else jsig(restpe)) @@ -408,7 +409,7 @@ abstract class Erasure extends AddInterfaces else jsig(etp) } } - traceSig.seq("javaSig", Seq(sym0, info)) { + traceSig("javaSig", (sym0, info)) { if (needsJavaSig(info)) { try Some(jsig(info, toplevel = true)) catch { case ex: UnknownSig => None } diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala index ad6ccaff59..b52419f7ca 100644 --- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala +++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala @@ -51,9 +51,6 @@ abstract class LiftCode extends Transform with Reifiers { def className(value: AnyRef): String = value match { case _ :: _ => "scala.$colon$colon" case reflect.MethodType(_, _) => - if (value.isInstanceOf[reflect.ImplicitMethodType]) - "scala.reflect.ImplicitMethodType" - else "scala.reflect.MethodType" case x:Product => "scala.reflect."+x.productPrefix //caseName diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index cd845ab9e5..f966e1476c 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -783,9 +783,9 @@ trait Namers { self: Analyzer => // if default getters (for constructor defaults) need to be added to that module, here's the namer // to use. clazz is the ModuleClass. sourceModule works also for classes defined in methods. val module = clazz.sourceModule - if (classAndNamerOfModule contains module) { - val (cdef, _) = classAndNamerOfModule(module) - classAndNamerOfModule(module) = (cdef, templateNamer) + classAndNamerOfModule get module match { + case Some((cdef, _)) => classAndNamerOfModule(module) = (cdef, templateNamer) + case None => } if (opt.verbose) { @@ -1008,11 +1008,14 @@ trait Namers { self: Analyzer => val module = companionModuleOf(meth.owner, context) module.initialize // call type completer (typedTemplate), adds the // module's templateNamer to classAndNamerOfModule - if (!classAndNamerOfModule.contains(module)) - return // fix #3649 (prevent crash in erroneous source code) - val (cdef, nmr) = classAndNamerOfModule(module) - moduleNamer = Some(cdef, nmr) - (cdef, nmr) + classAndNamerOfModule get module match { + case s @ Some((cdef, nmr)) if nmr != null => + moduleNamer = s + (cdef, nmr) + case _ => + return // fix #3649 (prevent crash in erroneous source code) + // nmr == null can happen in IDE; this is really an ugly hack on top[ of an ugly hack but it seems to work + } } deftParams = cdef.tparams map copyUntypedInvariant nmr diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 63542e6dd5..3eb5107870 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -352,7 +352,7 @@ abstract class RefChecks extends InfoTransform { } else if ((member hasFlag (OVERRIDE | ABSOVERRIDE)) && !(member.owner.thisType.baseClasses exists (_ isSubClass other.owner)) && !member.isDeferred && !other.isDeferred && - intersectionIsEmpty(member.allOverriddenSymbols, other.allOverriddenSymbols)) { + intersectionIsEmpty(member.extendedOverriddenSymbols, other.extendedOverriddenSymbols)) { overrideError("cannot override a concrete member without a third member that's overridden by both "+ "(this rule is designed to prevent ``accidental overrides'')") } else if (other.isStable && !member.isStable) { // (1.4) @@ -550,6 +550,13 @@ abstract class RefChecks extends InfoTransform { if (abstractErrors.nonEmpty) unit.error(clazz.pos, abstractErrorMessage) + } else if (clazz.isTrait) { + // prevent abstract methods in interfaces that override final members in Object; see #4431 + for (decl <- clazz.info.decls.iterator) { + val overridden = decl.overriddenSymbol(ObjectClass) + if (overridden.isFinal) + unit.error(decl.pos, "trait cannot redefine final method from class AnyRef") + } } /** Returns whether there is a symbol declared in class `inclazz` diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 83d72fc3a0..240f0c5f12 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -125,7 +125,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT // otherwise lead to either a compiler crash or runtime failure. private lazy val isDisallowed = { import definitions._ - Set(Any_isInstanceOf, Object_isInstanceOf, Object_==, Object_!=, Object_##) + Set(Any_isInstanceOf, Object_isInstanceOf, Any_asInstanceOf, Object_asInstanceOf, Object_==, Object_!=, Object_##) } override def transform(tree: Tree): Tree = { diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 08d5f0e12d..3afbc5640b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1647,7 +1647,8 @@ trait Typers extends Modes { namer.enterSyms(trees) typedStats(trees, NoSymbol) useCase.defined = context.scope.toList filterNot (useCase.aliases contains _) -// println("defined use cases: "+(useCase.defined map (sym => sym+":"+sym.tpe))) + if (settings.debug.value) + useCase.defined foreach (sym => println("defined use cases: %s:%s".format(sym, sym.tpe))) } /** @@ -2523,13 +2524,22 @@ trait Typers extends Modes { /** Calling constfold right here is necessary because some trees (negated * floats and literals in particular) are not yet folded. */ - def tryConst(tr: Tree, pt: Type) = typed(constfold(tr), EXPRmode, pt) match { - // null cannot be used as constant value for classfile annotations - case l @ Literal(c) if !(l.isErroneous || c.value == null) => - Some(LiteralAnnotArg(c)) - case _ => - error(tr.pos, "annotation argument needs to be a constant; found: "+tr) - None + def tryConst(tr: Tree, pt: Type): Option[LiteralAnnotArg] = { + val const: Constant = typed(constfold(tr), EXPRmode, pt) match { + case l @ Literal(c) if !l.isErroneous => c + case tree => tree.tpe match { + case ConstantType(c) => c + case tpe => null + } + } + def fail(msg: String) = { error(tr.pos, msg) ; None } + + if (const == null) + fail("annotation argument needs to be a constant; found: " + tr) + else if (const.value == null) + fail("annotation argument cannot be null") + else + Some(LiteralAnnotArg(const)) } /** Converts an untyped tree to a ClassfileAnnotArg. If the conversion fails, @@ -2575,7 +2585,7 @@ trait Typers extends Modes { def trees2ConstArg(trees: List[Tree], pt: Type): Option[ArrayAnnotArg] = { val args = trees.map(tree2ConstArg(_, pt)) if (args.exists(_.isEmpty)) None - else Some(ArrayAnnotArg(args.map(_.get).toArray)) + else Some(ArrayAnnotArg(args.flatten.toArray)) } // begin typedAnnotation diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala index bb404480a9..962062eb2d 100644 --- a/src/compiler/scala/tools/nsc/util/ClassPath.scala +++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala @@ -9,9 +9,9 @@ package util import java.net.URL import scala.collection.mutable.ListBuffer -import io.{ File, Directory, Path, AbstractFile } +import io.{ File, Directory, Path, Jar, AbstractFile, ClassAndJarInfo } import scala.tools.util.StringOps.splitWhere -import Path.isJarOrZip +import Jar.isJarOrZip import File.pathSeparator /** <p> @@ -22,6 +22,14 @@ import File.pathSeparator * @author Stepan Koltsov */ object ClassPath { + def scalaLibrary = locate[ScalaObject] + def scalaCompiler = locate[Global] + + def info[T: ClassManifest] = new ClassAndJarInfo[T] + def locate[T: ClassManifest] = info[T] rootClasspath + def locateJar[T: ClassManifest] = info[T].rootPossibles find (x => isJarOrZip(x)) map (x => File(x)) + def locateDir[T: ClassManifest] = info[T].rootPossibles find (_.isDirectory) map (_.toDirectory) + /** Expand single path entry */ private def expandS(pattern: String): List[String] = { val wildSuffix = File.separator + "*" diff --git a/src/compiler/scala/tools/nsc/util/InterruptReq.scala b/src/compiler/scala/tools/nsc/util/InterruptReq.scala index 342284fb70..2857823ceb 100644 --- a/src/compiler/scala/tools/nsc/util/InterruptReq.scala +++ b/src/compiler/scala/tools/nsc/util/InterruptReq.scala @@ -24,7 +24,7 @@ abstract class InterruptReq { notify() } - /** To be called from interrupting client to get result fo interrupt */ + /** To be called from interrupting client to get result for interrupt */ def getResult(): R = synchronized { while (result.isEmpty) { try { @@ -34,7 +34,9 @@ abstract class InterruptReq { result.get match { case Left(res) => res - case Right(t) => throw t + case Right(t) => throw new FailedInterrupt(t) } } } + +class FailedInterrupt(cause: Throwable) extends Exception("Compiler exception during call to 'ask'", cause) diff --git a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala index be69c39547..d6d19eef92 100644 --- a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala +++ b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala @@ -37,12 +37,8 @@ trait ScalaClassLoader extends JavaClassLoader { Class.forName(path, initialize, this).asInstanceOf[Class[T]] /** Create an instance of a class with this classloader */ - def create(path: String): AnyRef = { - tryToInitializeClass(path) match { - case Some(clazz) => clazz.newInstance() - case None => null - } - } + def create(path: String): AnyRef = + tryToInitializeClass[AnyRef](path) map (_.newInstance()) orNull override def findClass(name: String) = { val result = super.findClass(name) @@ -60,14 +56,15 @@ trait ScalaClassLoader extends JavaClassLoader { manifest[T].erasure.getConstructors.toList map (_.asInstanceOf[Constructor[T]]) /** The actual bytes for a class file, or an empty array if it can't be found. */ - def findBytesForClassName(s: String): Array[Byte] = { - val name = s.replaceAll("""\.""", "/") + ".class" - val url = this.getResource(name) - - if (url == null) Array() - else io.Streamable.bytes(url.openStream) + def classBytes(className: String): Array[Byte] = classAsStream(className) match { + case null => Array() + case stream => io.Streamable.bytes(stream) } + /** An InputStream representing the given class name, or null if not found. */ + def classAsStream(className: String) = + getResourceAsStream(className.replaceAll("""\.""", "/") + ".class") + /** Run the main method of a class to be loaded by this classloader */ def run(objectName: String, arguments: Seq[String]) { val clsToRun = tryToInitializeClass(objectName) getOrElse ( diff --git a/src/compiler/scala/tools/nsc/util/ShowPickled.scala b/src/compiler/scala/tools/nsc/util/ShowPickled.scala index 476e0944cd..a8499fc6a7 100644 --- a/src/compiler/scala/tools/nsc/util/ShowPickled.scala +++ b/src/compiler/scala/tools/nsc/util/ShowPickled.scala @@ -76,7 +76,7 @@ object ShowPickled extends Names { case CLASSINFOtpe => "CLASSINFOtpe" case METHODtpe => "METHODtpe" case POLYtpe => "POLYtpe" - case IMPLICITMETHODtpe => "IMPLICITMETHODtpe" + case IMPLICITMETHODtpe => "METHODtpe" // IMPLICITMETHODtpe no longer used. case SUPERtpe => "SUPERtpe" case LITERALunit => "LITERALunit" case LITERALboolean => "LITERALboolean" diff --git a/src/compiler/scala/tools/nsc/util/Tracer.scala b/src/compiler/scala/tools/nsc/util/Tracer.scala index 17be05a4d6..1dd21b26c2 100644 --- a/src/compiler/scala/tools/nsc/util/Tracer.scala +++ b/src/compiler/scala/tools/nsc/util/Tracer.scala @@ -6,31 +6,56 @@ package scala.tools.nsc package util +import java.io.PrintStream + class Tracer(enabled: () => Boolean) { + def out: PrintStream = System.out + def intoString(x: Any): String = "" + x + def stringify(x: Any): String = x match { + case null => "null" + case x: TraversableOnce[_] => x map stringify mkString ", " + case x: Product => stringify(x.productIterator) + case x: AnyRef => intoString(x) + } + + private val LBRACE = "{" + private val RBRACE = "}" private var indentLevel = 0 - private def ind(s: String) = (" " * (indentLevel*2)) + s + private def ind(s: String) = (" " * (indentLevel * 2)) + s private def indented[T](body: => T): T = { indentLevel += 1 try body finally indentLevel -= 1 } private def p(s: String) = { - System.out.print(s) - System.out.flush() + out.print(s) + out.flush() } private def pin[T](x: T): T = { p(ind("" + x)) x } - def seq[T](name: String, args: => Seq[Any])(body: => T): T = { + def apply[T](name: String, args: => Any)(body: => T): T = { + val result = body if (enabled()) { - p(ind("%s(%s) = {\n".format(name, args mkString ", "))) - try indented(pin(body)) - finally println("\n" + ind("}")) + // concise output optimization + val boolResult = result match { + case x: Boolean => Some(x) + case _ => None + } + p(ind("%s(%s) = %s\n".format( + name, + stringify(args), + boolResult getOrElse LBRACE)) + ) + if (boolResult.isEmpty) { + indented(pin(result)) + p("\n" + ind(RBRACE)) + } + result } - else body + else result } - def apply[T](name: String, args: Any*)(body: => T): T = seq(name, args.toSeq)(body) } object Tracer { diff --git a/src/compiler/scala/tools/util/Javap.scala b/src/compiler/scala/tools/util/Javap.scala index bda8ffbd1b..581cc9dbef 100644 --- a/src/compiler/scala/tools/util/Javap.scala +++ b/src/compiler/scala/tools/util/Javap.scala @@ -77,7 +77,7 @@ class Javap( if (path endsWith ".class") (path dropRight 6).replace('/', '.') else path ) - loader.findBytesForClassName(extName) + loader.classBytes(extName) } } diff --git a/src/library-aux/README b/src/library-aux/README new file mode 100644 index 0000000000..e6dcd29277 --- /dev/null +++ b/src/library-aux/README @@ -0,0 +1,3 @@ +Source files under this directory cannot be compiled by normal means. + +They exist for bootstrapping and documentation purposes.
\ No newline at end of file diff --git a/src/library-aux/scala/Any.scala b/src/library-aux/scala/Any.scala new file mode 100644 index 0000000000..a97e5f050b --- /dev/null +++ b/src/library-aux/scala/Any.scala @@ -0,0 +1,105 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala + * execution environment inherits directly or indirectly from this class. + */ +abstract class Any { + /** Compares the receiver object (`this`) with the argument object (`that`) for equivalence. + * + * The default implementations of this method is an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]]: + * + * - It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`. + * - It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and + * only if `y.equals(x)` returns `true`. + * - It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and + * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`. + * + * If you override this method, you should verify that your implementation remains an equivalence relation. + * Additionally, when overriding this method it is usually necessary to override `hashCode` to ensure that + * objects which are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]]. + * (`o1.hashCode.equals(o2.hashCode)`). + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + def equals(that: Any): Boolean + + /** Calculate a hash code value for the object. + * + * The default hashing algorithm is platform dependent. + * + * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet + * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`. + * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have + * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure + * to verify that the behavior is consistent with the `equals` method. + * + * @return the hash code value for this object. + */ + def hashCode: Int + + /** Returns a string representation of the object. + * + * The default representation is platform dependent. + * + * @return a string representation of the object. + */ + def toString: String + + /** Test two objects for equality. + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + final def ==(that: Any): Boolean = this equals that + + /** Test two objects for inequality. + * + * @param that the object to compare against this object for equality. + * @return `true` if !(this == that), false otherwise. + */ + final def != (that: Any): Boolean = !(this == that) + + /** Equivalent to `x.hashCode` except for boxed numeric types. + * For numerics, it returns a hash value which is consistent + * with value equality: if two value type instances compare + * as true, then ## will produce the same hash value for each + * of them. + * + * @return a hash value consistent with == + */ + final def ## : Int = sys.error("##") + + /** Test whether the dynamic type of the receiver object is `T0`. + * + * Note that the result of the test is modulo Scala's erasure semantics. + * Therefore the expression `1.isInstanceOf[String]` will return `false`, while the + * expression `List(1).isInstanceOf[List[String]]` will return `true`. + * In the latter example, because the type argument is erased as part of compilation it is + * not possible to check whether the contents of the list are of the specified type. + * + * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise. + */ + def isInstanceOf[T0]: Boolean = sys.error("isInstanceOf") + + /** Cast the receiver object to be of type `T0`. + * + * Note that the success of a cast at runtime is modulo Scala's erasure semantics. + * Therefore the expression `1.asInstanceOf[String]` will throw a `ClassCastException` at + * runtime, while the expression `List(1).asInstanceOf[List[String]]` will not. + * In the latter example, because the type argument is erased as part of compilation it is + * not possible to check whether the contents of the list are of the requested type. + * + * @throws ClassCastException if the receiver object is not an instance of the erasure of type `T0`. + * @return the receiver object. + */ + def asInstanceOf[T0]: T0 = sys.error("asInstanceOf") +} diff --git a/src/library-aux/scala/AnyRef.scala b/src/library-aux/scala/AnyRef.scala new file mode 100644 index 0000000000..6792ba68b7 --- /dev/null +++ b/src/library-aux/scala/AnyRef.scala @@ -0,0 +1,129 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** Class `AnyRef` is the root class of all ''reference types''. + * All types except the value types descend from this class. + */ +trait AnyRef extends Any { + + /** The equality method for reference types. See equals in [[scala.Any]]. + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + def equals(that: Any): Boolean = this eq that + + /** The hashCode method for reference types. See hashCode in [[scala.Any]]. + * + * @return the hash code value for this object. + */ + def hashCode: Int = sys.error("hashCode") + + /** Creates a String representation of this object. The default + * representation is platform dependent. On the java platform it + * is the concatenation of the class name, "@", and the object's + * hashcode in hexadecimal. + * + * @return a String representation of the object. + */ + def toString: String = sys.error("toString") + + /** Executes the code in `body` with an exclusive lock on `this`. + * + * @param body the code to execute + * @return the result of `body` + */ + def synchronized[T](body: => T): T + + /** Tests whether the argument (`arg0`) is a reference to the receiver object (`this`). + * + * The `eq` method implements an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]] on + * non-null instances of `AnyRef`, and has three additional properties: + * + * - It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of + * `x.eq(y)` consistently returns `true` or consistently returns `false`. + * - For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`. + * - `null.eq(null)` returns `true`. + * + * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is + * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they + * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`). + * + * @param that the object to compare against this object for reference equality. + * @return `true` if the argument is a reference to the receiver object; `false` otherwise. + */ + final def eq(that: AnyRef): Boolean = sys.error("eq") + + /** Equivalent to `!(this eq that)`. + * + * @param that the object to compare against this object for reference equality. + * @return `true` if the argument is not a reference to the receiver object; `false` otherwise. + */ + final def ne(that: AnyRef): Boolean = !(this eq that) + + /** The expression `x == that` is equivalent to `if (x eq null) that eq null else x.equals(that)`. + * + * @param arg0 the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + final def ==(that: AnyRef): Boolean = + if (this eq null) that eq null + else this equals that + + /** Create a copy of the receiver object. + * + * The default implementation of the `clone` method is platform dependent. + * + * @note not specified by SLS as a member of AnyRef + * @return a copy of the receiver object. + */ + protected def clone(): AnyRef + + /** Called by the garbage collector on the receiver object when there + * are no more references to the object. + * + * The details of when and if the `finalize` method is invoked, as + * well as the interaction between `finalize` and non-local returns + * and exceptions, are all platform dependent. + * + * @note not specified by SLS as a member of AnyRef + */ + protected def finalize(): Unit + + /** A representation that corresponds to the dynamic class of the receiver object. + * + * The nature of the representation is platform dependent. + * + * @note not specified by SLS as a member of AnyRef + * @return a representation that corresponds to the dynamic class of the receiver object. + */ + def getClass(): Class[_] + + /** Wakes up a single thread that is waiting on the receiver object's monitor. + * + * @note not specified by SLS as a member of AnyRef + */ + def notify(): Unit + + /** Wakes up all threads that are waiting on the receiver object's monitor. + * + * @note not specified by SLS as a member of AnyRef + */ + def notifyAll(): Unit + + /** Causes the current Thread to wait until another Thread invokes + * the notify() or notifyAll() methods. + * + * @note not specified by SLS as a member of AnyRef + */ + def wait (): Unit + def wait (timeout: Long, nanos: Int): Unit + def wait (timeout: Long): Unit +} diff --git a/src/library-aux/scala/Nothing.scala b/src/library-aux/scala/Nothing.scala new file mode 100644 index 0000000000..eed6066039 --- /dev/null +++ b/src/library-aux/scala/Nothing.scala @@ -0,0 +1,23 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** `Nothing` is - together with [[scala.Null]] - at the bottom of Scala's type hierarchy. + * + * `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist + * ''no instances'' of this type. Although type `Nothing` is uninhabited, it is + * nevertheless useful in several ways. For instance, the Scala library defines a value + * [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists are covariant in Scala, + * this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any element of type `T`. + * + * Another usage for Nothing is the return type for methods which never return normally. + * One example is method error in [[scala.sys]], which always throws an exception. + */ +sealed trait Nothing + diff --git a/src/library-aux/scala/Null.scala b/src/library-aux/scala/Null.scala new file mode 100644 index 0000000000..7455e78ae7 --- /dev/null +++ b/src/library-aux/scala/Null.scala @@ -0,0 +1,17 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** `Null` is - together with [[scala.Nothing]] - at the bottom of the Scala type hierarchy. + * + * `Null` is a subtype of all reference types; its only instance is the `null` reference. + * Since `Null` is not a subtype of value types, `null` is not a member of any such type. For instance, + * it is not possible to assign `null` to a variable of type [[scala.Int]]. + */ +sealed trait Null diff --git a/src/library/scala/AnyVal.scala b/src/library/scala/AnyVal.scala index 4b4b6038d1..850042700f 100755 --- a/src/library/scala/AnyVal.scala +++ b/src/library/scala/AnyVal.scala @@ -8,4 +8,21 @@ package scala +/** `AnyVal` is the root class of all ''value types'', which describe values + * not implemented as objects in the underlying host system. The value classes + * are specified in SLS 12.2. + * + * The standard implementation includes nine `AnyVal` subtypes: + * + * [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]], + * [[scala.Short]], and [[scala.Byte]] are the ''numeric value types''. + * + * [[scala.Unit]] and [[scala.Boolean]] are the ''non-numeric value types''. + * + * Other groupings: + * + * The ''subrange types'' are [[scala.Byte]], [[scala.Short]], and [[scala.Char]]. + * The ''integer types'' include the subrange types as well as [[scala.Int]] and [[scala.Long]]. + * The ''floating point types'' are [[scala.Float]] and [[scala.Double]]. + */ sealed trait AnyVal diff --git a/src/library/scala/Boolean.scala b/src/library/scala/Boolean.scala index dc2076cb1d..7719065ae7 100755 --- a/src/library/scala/Boolean.scala +++ b/src/library/scala/Boolean.scala @@ -10,8 +10,12 @@ package scala -import java.{ lang => jl } - +/** `Boolean` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Boolean]] => [[scala.runtime.RichBoolean]] + * which provides useful non-primitive operations. + */ final class Boolean extends AnyVal { def unary_! : Boolean = sys.error("stub") @@ -28,7 +32,26 @@ final class Boolean extends AnyVal { } object Boolean extends AnyValCompanion { + + /** Transform a value type into a boxed reference type. + * + * @param x the Boolean to be boxed + * @return a java.lang.Boolean offering `x` as its underlying value. + */ + def box(x: Boolean): java.lang.Boolean = java.lang.Boolean.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Boolean. + * + * @param x the java.lang.Boolean to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Boolean + * @return the Boolean resulting from calling booleanValue() on `x` + */ + def unbox(x: java.lang.Object): Boolean = x.asInstanceOf[java.lang.Boolean].booleanValue() + + /** The String representation of the scala.Boolean companion object. + */ override def toString = "object scala.Boolean" - def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x) - def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue() -}
\ No newline at end of file +} + diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala index 69d435b33b..540e05c19f 100644 --- a/src/library/scala/Byte.scala +++ b/src/library/scala/Byte.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Byte` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Byte]] => [[scala.runtime.RichByte]] + * which provides useful non-primitive operations. + */ final class Byte extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Byte extends AnyVal { } - object Byte extends AnyValCompanion { - final val MinValue = jl.Byte.MIN_VALUE - final val MaxValue = jl.Byte.MAX_VALUE - - def box(x: Byte): jl.Byte = jl.Byte.valueOf(x) - def unbox(x: jl.Object): Byte = x.asInstanceOf[jl.Byte].byteValue() + /** The smallest value representable as a Byte. + */ + final val MinValue = java.lang.Byte.MIN_VALUE + + /** The largest value representable as a Byte. + */ + final val MaxValue = java.lang.Byte.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Byte to be boxed + * @return a java.lang.Byte offering `x` as its underlying value. + */ + def box(x: Byte): java.lang.Byte = java.lang.Byte.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Byte. + * + * @param x the java.lang.Byte to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Byte + * @return the Byte resulting from calling byteValue() on `x` + */ + def unbox(x: java.lang.Object): Byte = x.asInstanceOf[java.lang.Byte].byteValue() + + /** The String representation of the scala.Byte companion object. + */ override def toString = "object scala.Byte" } + diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala index 88d7617ea5..a5d1cb019b 100644 --- a/src/library/scala/Char.scala +++ b/src/library/scala/Char.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Char` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Char]] => [[scala.runtime.RichChar]] + * which provides useful non-primitive operations. + */ final class Char extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Char extends AnyVal { } - object Char extends AnyValCompanion { - final val MinValue = jl.Character.MIN_VALUE - final val MaxValue = jl.Character.MAX_VALUE - - def box(x: Char): jl.Character = jl.Character.valueOf(x) - def unbox(x: jl.Object): Char = x.asInstanceOf[jl.Character].charValue() + /** The smallest value representable as a Char. + */ + final val MinValue = java.lang.Character.MIN_VALUE + + /** The largest value representable as a Char. + */ + final val MaxValue = java.lang.Character.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Char to be boxed + * @return a java.lang.Character offering `x` as its underlying value. + */ + def box(x: Char): java.lang.Character = java.lang.Character.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Character. + * + * @param x the java.lang.Character to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Character + * @return the Char resulting from calling charValue() on `x` + */ + def unbox(x: java.lang.Object): Char = x.asInstanceOf[java.lang.Character].charValue() + + /** The String representation of the scala.Char companion object. + */ override def toString = "object scala.Char" } + diff --git a/src/library/scala/Double.scala b/src/library/scala/Double.scala index fe37860c07..6fd7b0984b 100644 --- a/src/library/scala/Double.scala +++ b/src/library/scala/Double.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Double` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Double]] => [[scala.runtime.RichDouble]] + * which provides useful non-primitive operations. + */ final class Double extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -117,13 +120,14 @@ final class Double extends AnyVal { } - object Double extends AnyValCompanion { - /** The smallest positive value greater than 0.0d.*/ - final val MinPositiveValue = jl.Double.MIN_VALUE - final val NaN = jl.Double.NaN - final val PositiveInfinity = jl.Double.POSITIVE_INFINITY - final val NegativeInfinity = jl.Double.NEGATIVE_INFINITY + /** The smallest positive value greater than 0.0d which is + * representable as a Double. + */ + final val MinPositiveValue = java.lang.Double.MIN_VALUE + final val NaN = java.lang.Double.NaN + final val PositiveInfinity = java.lang.Double.POSITIVE_INFINITY + final val NegativeInfinity = java.lang.Double.NEGATIVE_INFINITY @deprecated("use Double.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -133,12 +137,30 @@ object Double extends AnyValCompanion { * is the smallest positive value representable by a Double. In Scala that number * is called Double.MinPositiveValue. */ - final val MinValue = -jl.Double.MAX_VALUE + final val MinValue = -java.lang.Double.MAX_VALUE /** The largest finite positive number representable as a Double. */ - final val MaxValue = jl.Double.MAX_VALUE + final val MaxValue = java.lang.Double.MAX_VALUE - def box(x: Double): jl.Double = jl.Double.valueOf(x) - def unbox(x: jl.Object): Double = x.asInstanceOf[jl.Double].doubleValue() + /** Transform a value type into a boxed reference type. + * + * @param x the Double to be boxed + * @return a java.lang.Double offering `x` as its underlying value. + */ + def box(x: Double): java.lang.Double = java.lang.Double.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Double. + * + * @param x the java.lang.Double to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Double + * @return the Double resulting from calling doubleValue() on `x` + */ + def unbox(x: java.lang.Object): Double = x.asInstanceOf[java.lang.Double].doubleValue() + + /** The String representation of the scala.Double companion object. + */ override def toString = "object scala.Double" } + diff --git a/src/library/scala/Dynamic.scala b/src/library/scala/Dynamic.scala index 25ce4ef638..2f99518988 100644 --- a/src/library/scala/Dynamic.scala +++ b/src/library/scala/Dynamic.scala @@ -2,11 +2,12 @@ package scala /** A marker trait that enables dynamic invocations. Instances `x` of this trait * allow calls `x.meth(args)` for arbitrary method names `meth` and argument lists - * `args`. If a call is not natively supported by `x`, it is rewritten to + * `args`. If a call is not natively supported by `x`, it is rewritten to * `x.applyDynamic("meth", args)`. + * + * As of scala 2.9, scalac must receive the -Xexperimental optional for Dynamic + * to receive this treatment. */ -trait Dynamic { - -} +trait Dynamic diff --git a/src/library/scala/Equals.scala b/src/library/scala/Equals.scala index d0929a9ac4..8aff7af175 100644 --- a/src/library/scala/Equals.scala +++ b/src/library/scala/Equals.scala @@ -6,22 +6,22 @@ ** |/ ** \* */ - - package scala /** An interface containing operations for equality. * The only method not already present in class `AnyRef` is `canEqual`. */ trait Equals { - /** A method that should be called from every well-designed equals method * that is open to be overridden in a subclass. See Programming in Scala, * Chapter 28 for discussion and design. + * + * @param that the value being probed for possible equality + * @return true if this instance can possibly equal `that`, otherwise false */ def canEqual(that: Any): Boolean - /** The equality method defined in `AnyRef`. + /** The universal equality method defined in `AnyRef`. */ def equals(that: Any): Boolean } diff --git a/src/library/scala/Float.scala b/src/library/scala/Float.scala index 39e510e477..38819e5d16 100644 --- a/src/library/scala/Float.scala +++ b/src/library/scala/Float.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Float` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Float]] => [[scala.runtime.RichFloat]] + * which provides useful non-primitive operations. + */ final class Float extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -117,13 +120,14 @@ final class Float extends AnyVal { } - object Float extends AnyValCompanion { - /** The smallest positive value greater than 0.0f.*/ - final val MinPositiveValue = jl.Float.MIN_VALUE - final val NaN = jl.Float.NaN - final val PositiveInfinity = jl.Float.POSITIVE_INFINITY - final val NegativeInfinity = jl.Float.NEGATIVE_INFINITY + /** The smallest positive value greater than 0.0f which is + * representable as a Float. + */ + final val MinPositiveValue = java.lang.Float.MIN_VALUE + final val NaN = java.lang.Float.NaN + final val PositiveInfinity = java.lang.Float.POSITIVE_INFINITY + final val NegativeInfinity = java.lang.Float.NEGATIVE_INFINITY @deprecated("use Float.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -133,12 +137,30 @@ object Float extends AnyValCompanion { * is the smallest positive value representable by a Float. In Scala that number * is called Float.MinPositiveValue. */ - final val MinValue = -jl.Float.MAX_VALUE + final val MinValue = -java.lang.Float.MAX_VALUE /** The largest finite positive number representable as a Float. */ - final val MaxValue = jl.Float.MAX_VALUE + final val MaxValue = java.lang.Float.MAX_VALUE - def box(x: Float): jl.Float = jl.Float.valueOf(x) - def unbox(x: jl.Object): Float = x.asInstanceOf[jl.Float].floatValue() + /** Transform a value type into a boxed reference type. + * + * @param x the Float to be boxed + * @return a java.lang.Float offering `x` as its underlying value. + */ + def box(x: Float): java.lang.Float = java.lang.Float.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Float. + * + * @param x the java.lang.Float to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Float + * @return the Float resulting from calling floatValue() on `x` + */ + def unbox(x: java.lang.Object): Float = x.asInstanceOf[java.lang.Float].floatValue() + + /** The String representation of the scala.Float companion object. + */ override def toString = "object scala.Float" } + diff --git a/src/library/scala/Function0.scala b/src/library/scala/Function0.scala index d17122c0d8..f8e68a2e04 100644 --- a/src/library/scala/Function0.scala +++ b/src/library/scala/Function0.scala @@ -6,7 +6,7 @@ ** |/ ** \* */ // GENERATED CODE: DO NOT EDIT. -// genprod generated these sources at: Sat Feb 19 20:13:51 PST 2011 +// genprod generated these sources at: Wed Mar 30 13:47:19 PDT 2011 package scala diff --git a/src/library/scala/Function1.scala b/src/library/scala/Function1.scala index e256a94961..dc8e67bbb0 100644 --- a/src/library/scala/Function1.scala +++ b/src/library/scala/Function1.scala @@ -25,6 +25,7 @@ package scala * } * }}} */ +@annotation.implicitNotFound(msg = "No implicit view available from ${T1} => ${R}.") trait Function1[@specialized(scala.Int, scala.Long, scala.Float, scala.Double) -T1, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self => /** Apply the body of this function to the argument. * @return the result of function application. diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala index 69fb0a66b7..c53be1241d 100644 --- a/src/library/scala/Int.scala +++ b/src/library/scala/Int.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Int` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Int]] => [[scala.runtime.RichInt]] + * which provides useful non-primitive operations. + */ final class Int extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Int extends AnyVal { } - object Int extends AnyValCompanion { - final val MinValue = jl.Integer.MIN_VALUE - final val MaxValue = jl.Integer.MAX_VALUE - - def box(x: Int): jl.Integer = jl.Integer.valueOf(x) - def unbox(x: jl.Object): Int = x.asInstanceOf[jl.Integer].intValue() + /** The smallest value representable as a Int. + */ + final val MinValue = java.lang.Integer.MIN_VALUE + + /** The largest value representable as a Int. + */ + final val MaxValue = java.lang.Integer.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Int to be boxed + * @return a java.lang.Integer offering `x` as its underlying value. + */ + def box(x: Int): java.lang.Integer = java.lang.Integer.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Integer. + * + * @param x the java.lang.Integer to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Integer + * @return the Int resulting from calling intValue() on `x` + */ + def unbox(x: java.lang.Object): Int = x.asInstanceOf[java.lang.Integer].intValue() + + /** The String representation of the scala.Int companion object. + */ override def toString = "object scala.Int" } + diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala index 7fdefebae3..3124130663 100644 --- a/src/library/scala/Long.scala +++ b/src/library/scala/Long.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Long` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Long]] => [[scala.runtime.RichLong]] + * which provides useful non-primitive operations. + */ final class Long extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Long extends AnyVal { } - object Long extends AnyValCompanion { - final val MinValue = jl.Long.MIN_VALUE - final val MaxValue = jl.Long.MAX_VALUE - - def box(x: Long): jl.Long = jl.Long.valueOf(x) - def unbox(x: jl.Object): Long = x.asInstanceOf[jl.Long].longValue() + /** The smallest value representable as a Long. + */ + final val MinValue = java.lang.Long.MIN_VALUE + + /** The largest value representable as a Long. + */ + final val MaxValue = java.lang.Long.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Long to be boxed + * @return a java.lang.Long offering `x` as its underlying value. + */ + def box(x: Long): java.lang.Long = java.lang.Long.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Long. + * + * @param x the java.lang.Long to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Long + * @return the Long resulting from calling longValue() on `x` + */ + def unbox(x: java.lang.Object): Long = x.asInstanceOf[java.lang.Long].longValue() + + /** The String representation of the scala.Long companion object. + */ override def toString = "object scala.Long" } + diff --git a/src/library/scala/Option.scala b/src/library/scala/Option.scala index ef2cbcfd31..c2b1764fdb 100644 --- a/src/library/scala/Option.scala +++ b/src/library/scala/Option.scala @@ -21,7 +21,7 @@ object Option { */ def apply[A](x: A): Option[A] = if (x == null) None else Some(x) - /** An Option factory which returns $none in a manner consistent with + /** An Option factory which returns `None` in a manner consistent with * the collections hierarchy. */ def empty[A] : Option[A] = None diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 61c8ca3f6a..20473009bf 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -12,7 +12,7 @@ import scala.collection.{ mutable, immutable, generic } import immutable.StringOps import mutable.ArrayOps import generic.CanBuildFrom -import annotation.elidable +import annotation.{ elidable, implicitNotFound } import annotation.elidable.ASSERTION /** The <code>Predef</code> object provides definitions that are @@ -342,6 +342,7 @@ object Predef extends LowPriorityImplicits { * where L is the required lower bound). * in part contributed by Jason Zaugg */ + @implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.") sealed abstract class <:<[-From, +To] extends (From => To) with Serializable implicit def conforms[A]: A <:< A = new (A <:< A) { def apply(x: A) = x } // not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit) @@ -350,6 +351,7 @@ object Predef extends LowPriorityImplicits { * * @see <:< for expressing subtyping constraints */ + @implicitNotFound(msg = "Cannot prove that ${From} =:= ${To}.") sealed abstract class =:=[From, To] extends (From => To) with Serializable object =:= { implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x} diff --git a/src/library/scala/Product.scala b/src/library/scala/Product.scala index 786be5ec13..dfa04bbbe7 100644 --- a/src/library/scala/Product.scala +++ b/src/library/scala/Product.scala @@ -8,30 +8,33 @@ package scala -/** Base trait for all products. See [[scala.Product2]]. +/** Base trait for all products, which in the standard library include at least + * [[scala.Product1]] through [[scala.Product22]] and therefore also their + * subclasses [[scala.Tuple1]] through [[scala.Tuple22]]. In addition, all case + * classes implement Product with synthetically generated methods. * * @author Burak Emir * @version 1.0 * @since 2.3 */ trait Product extends Equals { - - /** Returns the nth element of this product, 0-based. In other words, for a - * product <code>A(x_1,...,x_k)</code>, returns <code>x_(n+1)</code> - * where <code>0 <= n < k</code> + /** The nth element of this product, 0-based. In other words, for a + * product `A(x_1, ..., x_k)`, returns x_(n+1) where 0 < n < k. * - * @param n the index of the element to return - * @throws IndexOutOfBoundsException - * @return The element <code>n</code> elements after the first element + * @param n the index of the element to return + * @throws IndexOutOfBoundsException + * @return the element `n` elements after the first element */ def productElement(n: Int): Any - /** Returns the size of this product. - * @return For a product <code>A(x_1,...,x_k)</code>, returns `k` + /** The size of this product. + * @return for a product `A(x_1, ..., x_k)`, returns `k` */ def productArity: Int - /** An iterator that returns all fields of this product */ + /** An iterator over all the elements of this product. + * @return in the default implementation, an Iterator[Any] + */ def productIterator: Iterator[Any] = new Iterator[Any] { private var c: Int = 0 private val cmax = productArity @@ -42,12 +45,11 @@ trait Product extends Equals { @deprecated("use productIterator instead") def productElements: Iterator[Any] = productIterator - /** - * Returns a string that is used in the `toString` method of subtraits/classes. - * Implementations may override this - * method in order to prepend a string prefix to the result of the - * toString methods. - * @return the empty string + /** A string used in the `toString` methods of derived classes. + * Implementations may override this method to prepend a string prefix + * to the result of toString methods. + * + * @return in the default implementation, the empty string */ def productPrefix = "" } diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala index df3e680575..8bf6f09154 100644 --- a/src/library/scala/Short.scala +++ b/src/library/scala/Short.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Short` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Short]] => [[scala.runtime.RichShort]] + * which provides useful non-primitive operations. + */ final class Short extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Short extends AnyVal { } - object Short extends AnyValCompanion { - final val MinValue = jl.Short.MIN_VALUE - final val MaxValue = jl.Short.MAX_VALUE - - def box(x: Short): jl.Short = jl.Short.valueOf(x) - def unbox(x: jl.Object): Short = x.asInstanceOf[jl.Short].shortValue() + /** The smallest value representable as a Short. + */ + final val MinValue = java.lang.Short.MIN_VALUE + + /** The largest value representable as a Short. + */ + final val MaxValue = java.lang.Short.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Short to be boxed + * @return a java.lang.Short offering `x` as its underlying value. + */ + def box(x: Short): java.lang.Short = java.lang.Short.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Short. + * + * @param x the java.lang.Short to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Short + * @return the Short resulting from calling shortValue() on `x` + */ + def unbox(x: java.lang.Object): Short = x.asInstanceOf[java.lang.Short].shortValue() + + /** The String representation of the scala.Short companion object. + */ override def toString = "object scala.Short" } + diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala index fc9b348fdb..afac96fe97 100644 --- a/src/library/scala/Tuple2.scala +++ b/src/library/scala/Tuple2.scala @@ -49,7 +49,7 @@ case class Tuple2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, D * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala index 2f533b10b2..6458fa5042 100644 --- a/src/library/scala/Tuple3.scala +++ b/src/library/scala/Tuple3.scala @@ -46,7 +46,7 @@ case class Tuple3[+T1, +T2, +T3](_1: T1, _2: T2, _3: T3) * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2], diff --git a/src/library/scala/Unit.scala b/src/library/scala/Unit.scala index 9e2d4dc616..58b024273b 100755 --- a/src/library/scala/Unit.scala +++ b/src/library/scala/Unit.scala @@ -10,14 +10,35 @@ package scala -import java.{ lang => jl } - -import runtime.BoxedUnit +/** Unit is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. There is + * only one value of type Unit: `()`. + */ final class Unit extends AnyVal { } + object Unit extends AnyValCompanion { + + /** Transform a value type into a boxed reference type. + * + * @param x the Unit to be boxed + * @return a scala.runtime.BoxedUnit offering `x` as its underlying value. + */ + def box(x: Unit): scala.runtime.BoxedUnit = scala.runtime.BoxedUnit.UNIT + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a scala.runtime.BoxedUnit. + * + * @param x the scala.runtime.BoxedUnit to be unboxed. + * @throws ClassCastException if the argument is not a scala.runtime.BoxedUnit + * @return the Unit value () + */ + def unbox(x: java.lang.Object): Unit = () + + /** The String representation of the scala.Unit companion object. + */ override def toString = "object scala.Unit" - def box(x: Unit): BoxedUnit = BoxedUnit.UNIT - def unbox(x: jl.Object): Unit = () -}
\ No newline at end of file +} + diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index 81582b7f78..4e349cb423 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -12,7 +12,6 @@ package scala.collection import mutable.ArrayBuffer import annotation.{ tailrec, migration } -import parallel.ParIterable /** The `Iterator` object provides various functions for * creating specialized iterators. diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala index 075317a483..7dcaafe45d 100644 --- a/src/library/scala/collection/Map.scala +++ b/src/library/scala/collection/Map.scala @@ -13,7 +13,7 @@ import generic._ /** * A map from keys of type `A` to values of type `B`. * - * $mapnote + * $mapNote * * '''Note:''' If you do not have specific implementations for `add` and `-` in mind, * you might consider inheriting from `DefaultMap` instead. diff --git a/src/library/scala/collection/Parallel.scala b/src/library/scala/collection/Parallel.scala index df77e5d1c7..037abde2b6 100644 --- a/src/library/scala/collection/Parallel.scala +++ b/src/library/scala/collection/Parallel.scala @@ -6,21 +6,11 @@ ** |/ ** \* */ - package scala.collection - - - - - /** A marker trait for objects with parallelised operations. * * @since 2.9 * @author prokopec */ trait Parallel - - - - diff --git a/src/library/scala/collection/SetProxyLike.scala b/src/library/scala/collection/SetProxyLike.scala index eaf67323b7..9308de45b0 100644 --- a/src/library/scala/collection/SetProxyLike.scala +++ b/src/library/scala/collection/SetProxyLike.scala @@ -19,10 +19,8 @@ import generic._ * @author Martin Odersky * @version 2.8 */ -trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] -{ +trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] { def empty: This - // def empty: This override def contains(elem: A): Boolean = self.contains(elem) override def + (elem: A) = self.+(elem) override def - (elem: A) = self.-(elem) diff --git a/src/library/scala/collection/SortedSet.scala b/src/library/scala/collection/SortedSet.scala index 46629b0cec..a1d1cd3fc3 100644 --- a/src/library/scala/collection/SortedSet.scala +++ b/src/library/scala/collection/SortedSet.scala @@ -29,6 +29,3 @@ object SortedSet extends SortedSetFactory[SortedSet] { def empty[A](implicit ord: Ordering[A]): immutable.SortedSet[A] = immutable.SortedSet.empty[A](ord) implicit def canBuildFrom[A](implicit ord: Ordering[A]): CanBuildFrom[Coll, A, SortedSet[A]] = new SortedSetCanBuildFrom[A] } - - - diff --git a/src/library/scala/collection/TraversableOnce.scala b/src/library/scala/collection/TraversableOnce.scala index 0a2d851b2d..f660d31ab2 100644 --- a/src/library/scala/collection/TraversableOnce.scala +++ b/src/library/scala/collection/TraversableOnce.scala @@ -37,11 +37,17 @@ import annotation.unchecked.{ uncheckedVariance => uV } * @since 2.8 * * @define coll traversable or iterator + * @define orderDependent + * + * Note: might return different results for different runs, unless the underlying collection type is ordered. * @define orderDependentFold * * Note: might return different results for different runs, unless the * underlying collection type is ordered or the operator is associative * and commutative. + * @define mayNotTerminateInf + * + * Note: may not terminate for infinite-sized collections. * @define willNotTerminateInf * * Note: will not terminate for infinite-sized collections. @@ -393,7 +399,7 @@ trait TraversableOnce[+A] { } def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = { if (isEmpty) - throw new UnsupportedOperationException("empty.maxBy") + throw new UnsupportedOperationException("empty.minBy") reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y) } diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala index 6f7f7f5a28..b5b18b7a8a 100644 --- a/src/library/scala/collection/TraversableViewLike.scala +++ b/src/library/scala/collection/TraversableViewLike.scala @@ -30,7 +30,7 @@ trait ViewMkString[+A] { } /** A template trait for non-strict views of traversable collections. - * $traversableviewinfo + * $traversableViewInfo * * Implementation note: Methods such as `map` or `flatMap` on this view will not invoke the implicitly passed * `Builder` factory, but will return a new view directly, to preserve by-name behavior. @@ -38,14 +38,14 @@ trait ViewMkString[+A] { * that takes a `View` as its `From` type parameter must yield the same view (or a generic * superclass of it) as its result parameter. If that assumption is broken, cast errors might result. * - * @define viewinfo + * @define viewInfo * A view is a lazy version of some collection. Collection transformers such as * `map` or `filter` or `++` do not traverse any elements when applied on a view. * Instead they create a new view which simply records that fact that the operation * needs to be applied. The collection elements are accessed, and the view operations are applied, * when a non-view result is needed, or when the `force` method is called on a view. - * @define traversableviewinfo - * $viewinfo + * @define traversableViewInfo + * $viewInfo * * All views for traversable collections are defined by creating a new `foreach` method. diff --git a/src/library/scala/collection/generic/Addable.scala b/src/library/scala/collection/generic/Addable.scala index d80e85c039..5be428305e 100644 --- a/src/library/scala/collection/generic/Addable.scala +++ b/src/library/scala/collection/generic/Addable.scala @@ -16,10 +16,10 @@ package generic * @tparam A the type of the elements of the $coll * @tparam Repr the type of the $coll itself * @author Martin Odersky - * @version 2.8 - * @since 2.8 - * @define $coll collection - * @define $Coll Addable + * @version 2.8 + * @since 2.8 + * @define coll collection + * @define Coll Addable */ @deprecated("Will be removed after scala 2.9") trait Addable[A, +Repr <: Addable[A, Repr]] { self => diff --git a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala index 69ae465806..82270d5728 100644 --- a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala +++ b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala @@ -6,20 +6,14 @@ ** |/ ** \* */ - package scala.collection package generic - - - - abstract class ClassManifestTraversableFactory[CC[X] <: Traversable[X] with GenericClassManifestTraversableTemplate[X, CC]] -extends GenericClassManifestCompanion[CC] { + extends GenericClassManifestCompanion[CC] { class GenericCanBuildFrom[A](implicit manif: ClassManifest[A]) extends CanBuildFrom[CC[_], A, CC[A]] { def apply(from: CC[_]) = from.genericClassManifestBuilder[A] def apply = newBuilder[A] } - } diff --git a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala index b85fc93cba..546e82fb4a 100644 --- a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala +++ b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala @@ -6,17 +6,12 @@ ** |/ ** \* */ - - package scala.collection package generic import mutable.Builder - - - -/** This class represents companions of classes which require classmanifests +/** This class represents companions of classes which require ClassManifests * for their element types. * * @author Aleksandar Prokopec @@ -34,4 +29,3 @@ abstract class GenericClassManifestCompanion[+CC[X] <: Traversable[X]] { b.result } } - diff --git a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala index 80415f8e79..03d426946b 100644 --- a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala +++ b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala @@ -6,17 +6,12 @@ ** |/ ** \* */ - - package scala.collection package generic import mutable.Builder import annotation.unchecked.uncheckedVariance - - - /** This trait represents collections classes which require class * manifests for their element types. * @@ -27,4 +22,3 @@ trait GenericClassManifestTraversableTemplate[+A, +CC[X] <: Traversable[X]] exte def classManifestCompanion: GenericClassManifestCompanion[CC] def genericClassManifestBuilder[B](implicit man: ClassManifest[B]): Builder[B, CC[B]] = classManifestCompanion.newBuilder[B] } - diff --git a/src/library/scala/collection/generic/GenericCompanion.scala b/src/library/scala/collection/generic/GenericCompanion.scala index 5aa9656cf2..084f884ebb 100644 --- a/src/library/scala/collection/generic/GenericCompanion.scala +++ b/src/library/scala/collection/generic/GenericCompanion.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.collection package generic diff --git a/src/library/scala/collection/generic/GenericParCompanion.scala b/src/library/scala/collection/generic/GenericParCompanion.scala index 0da1a3a543..9e151e7543 100644 --- a/src/library/scala/collection/generic/GenericParCompanion.scala +++ b/src/library/scala/collection/generic/GenericParCompanion.scala @@ -1,14 +1,13 @@ package scala.collection.generic - import scala.collection.parallel.Combiner import scala.collection.parallel.ParIterable import scala.collection.parallel.ParMap - - /** A template class for companion objects of parallel collection classes. * They should be mixed in together with `GenericCompanion` type. + * + * @define Coll ParIterable * @tparam CC the type constructor representing the collection class * @since 2.8 */ diff --git a/src/library/scala/collection/generic/ParFactory.scala b/src/library/scala/collection/generic/ParFactory.scala index a7ebb8c912..b4da60a133 100644 --- a/src/library/scala/collection/generic/ParFactory.scala +++ b/src/library/scala/collection/generic/ParFactory.scala @@ -9,8 +9,8 @@ import scala.collection.parallel.Combiner /** A template class for companion objects of `ParIterable` and subclasses thereof. * This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects. * - * @define $coll parallel collection - * @define $Coll ParIterable + * @define coll parallel collection + * @define Coll ParIterable */ abstract class ParFactory[CC[X] <: ParIterable[X] with GenericParTemplate[X, CC]] extends TraversableFactory[CC] diff --git a/src/library/scala/collection/generic/ParMapFactory.scala b/src/library/scala/collection/generic/ParMapFactory.scala index 2fba05c743..dda49e1354 100644 --- a/src/library/scala/collection/generic/ParMapFactory.scala +++ b/src/library/scala/collection/generic/ParMapFactory.scala @@ -1,20 +1,15 @@ package scala.collection.generic - - import scala.collection.parallel.ParMap import scala.collection.parallel.ParMapLike import scala.collection.parallel.Combiner import scala.collection.mutable.Builder - - - /** A template class for companion objects of `ParMap` and subclasses thereof. * This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects. * - * @define $coll parallel map - * @define $Coll ParMap + * @define coll parallel map + * @define Coll ParMap */ abstract class ParMapFactory[CC[X, Y] <: ParMap[X, Y] with ParMapLike[X, Y, CC[X, Y], _]] extends MapFactory[CC] diff --git a/src/library/scala/collection/generic/Subtractable.scala b/src/library/scala/collection/generic/Subtractable.scala index 158a3cac60..1b3425d792 100644 --- a/src/library/scala/collection/generic/Subtractable.scala +++ b/src/library/scala/collection/generic/Subtractable.scala @@ -16,10 +16,10 @@ package generic * @tparam A the type of the elements of the $coll. * @tparam Repr the type of the $coll itself * @author Martin Odersky - * @version 2.8 - * @since 2.8 - * @define $coll collection - * @define $Coll Subtractable + * @version 2.8 + * @since 2.8 + * @define coll collection + * @define Coll Subtractable */ trait Subtractable[A, +Repr <: Subtractable[A, Repr]] { self => diff --git a/src/library/scala/collection/immutable/IntMap.scala b/src/library/scala/collection/immutable/IntMap.scala index 140ba4dbec..ea68b53518 100644 --- a/src/library/scala/collection/immutable/IntMap.scala +++ b/src/library/scala/collection/immutable/IntMap.scala @@ -35,6 +35,11 @@ private[immutable] object IntMapUtils extends BitOperations.Int { import IntMapUtils._ /** A companion object for integer maps. + * + * @define Coll IntMap + * @define mapCanBuildFromInfo + * The standard `CanBuildFrom` instance for `$Coll` objects. + * The created value is an instance of class `MapCanBuildFrom`. * @since 2.7 */ object IntMap { diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala index c46c487968..84b62e7e29 100644 --- a/src/library/scala/collection/immutable/List.scala +++ b/src/library/scala/collection/immutable/List.scala @@ -33,7 +33,7 @@ import annotation.tailrec * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `List[B]` because an implicit of type `CanBuildFrom[List, B, That]` * is defined in object `List`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `List`. diff --git a/src/library/scala/collection/immutable/LongMap.scala b/src/library/scala/collection/immutable/LongMap.scala index d5f1374540..030dd72d35 100644 --- a/src/library/scala/collection/immutable/LongMap.scala +++ b/src/library/scala/collection/immutable/LongMap.scala @@ -35,9 +35,14 @@ private[immutable] object LongMapUtils extends BitOperations.Long { import LongMapUtils._ /** A companion object for long maps. + * + * @define Coll LongMap + * @define mapCanBuildFromInfo + * The standard `CanBuildFrom` instance for `$Coll` objects. + * The created value is an instance of class `MapCanBuildFrom`. * @since 2.7 */ -object LongMap{ +object LongMap { /** $mapCanBuildFromInfo */ implicit def canBuildFrom[A, B] = new CanBuildFrom[LongMap[A], (Long, B), LongMap[B]] { def apply(from: LongMap[A]): Builder[(Long, B), LongMap[B]] = apply() @@ -69,7 +74,6 @@ object LongMap{ else LongMap.Bin[S](prefix, mask, left, right); } } - } import LongMap._ diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala index 7975134174..33bc50ab56 100644 --- a/src/library/scala/collection/immutable/Set.scala +++ b/src/library/scala/collection/immutable/Set.scala @@ -15,13 +15,12 @@ import generic._ import parallel.immutable.ParSet /** A generic trait for immutable sets. + * $setNote + * $setTags * - * $setnote - * + * @since 1.0 * @author Matthias Zenger * @author Martin Odersky - * @version 2.8 - * @since 1 * @define Coll immutable.Set * @define coll immutable set */ diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala index 926fde4fe0..98f1b90866 100644 --- a/src/library/scala/collection/immutable/StringLike.scala +++ b/src/library/scala/collection/immutable/StringLike.scala @@ -162,6 +162,21 @@ self => if (toString.endsWith(suffix)) toString.substring(0, toString.length() - suffix.length) else toString + /** Replace all literal occurrences of `literal` with the string `replacement`. + * This is equivalent to [[java.lang.String#replaceAll]] except that both arguments + * are appropriately quoted to avoid being interpreted as metacharacters. + * + * @param literal the string which should be replaced everywhere it occurs + * @param replacement the replacement string + * @return the resulting string + */ + def replaceAllLiterally(literal: String, replacement: String): String = { + val arg1 = java.util.regex.Pattern.quote(literal) + val arg2 = java.util.regex.Matcher.quoteReplacement(replacement) + + toString.replaceAll(arg1, arg2) + } + /** * For every line in this string: * diff --git a/src/library/scala/collection/mutable/ArrayBuffer.scala b/src/library/scala/collection/mutable/ArrayBuffer.scala index daa3c48578..7edbad6518 100644 --- a/src/library/scala/collection/mutable/ArrayBuffer.scala +++ b/src/library/scala/collection/mutable/ArrayBuffer.scala @@ -31,7 +31,7 @@ import parallel.mutable.ParArray * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ArrayBuffer[B]` because an implicit of type `CanBuildFrom[ArrayBuffer, B, ArrayBuffer[B]]` * is defined in object `ArrayBuffer`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ArrayBuffer`. diff --git a/src/library/scala/collection/mutable/ArraySeq.scala b/src/library/scala/collection/mutable/ArraySeq.scala index 0b3f0ebc5b..b6cafbb677 100644 --- a/src/library/scala/collection/mutable/ArraySeq.scala +++ b/src/library/scala/collection/mutable/ArraySeq.scala @@ -30,7 +30,7 @@ import parallel.mutable.ParArray * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ArraySeq[B]` because an implicit of type `CanBuildFrom[ArraySeq, B, ArraySeq[B]]` * is defined in object `ArraySeq`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ArraySeq`. diff --git a/src/library/scala/collection/mutable/BitSet.scala b/src/library/scala/collection/mutable/BitSet.scala index 4735d58e33..a547e8a17e 100644 --- a/src/library/scala/collection/mutable/BitSet.scala +++ b/src/library/scala/collection/mutable/BitSet.scala @@ -23,7 +23,7 @@ import BitSetLike.{LogWL, updateArray} * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `BitSet[B]` because an implicit of type `CanBuildFrom[BitSet, B, BitSet]` * is defined in object `BitSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `BitSet`. diff --git a/src/library/scala/collection/mutable/DoubleLinkedList.scala b/src/library/scala/collection/mutable/DoubleLinkedList.scala index f2a732ffd1..2d630c3756 100644 --- a/src/library/scala/collection/mutable/DoubleLinkedList.scala +++ b/src/library/scala/collection/mutable/DoubleLinkedList.scala @@ -28,7 +28,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `DoubleLinkedList[B]` because an implicit of type `CanBuildFrom[DoubleLinkedList, B, DoubleLinkedList[B]]` * is defined in object `DoubleLinkedList`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `DoubleLinkedList`. @@ -66,26 +66,24 @@ class DoubleLinkedList[A]() extends LinearSeq[A] * @define Coll DoubleLinkedList */ object DoubleLinkedList extends SeqFactory[DoubleLinkedList] { - /** $genericCanBuildFrom */ + /** $genericCanBuildFromInfo */ implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, DoubleLinkedList[A]] = new GenericCanBuildFrom[A] + def newBuilder[A]: Builder[A, DoubleLinkedList[A]] = new Builder[A, DoubleLinkedList[A]] { - var current: DoubleLinkedList[A] = _ - val emptyList = new DoubleLinkedList[A]() - if(null == current) - current = emptyList + def emptyList() = new DoubleLinkedList[A]() + var current = emptyList() def +=(elem: A): this.type = { - if (current.nonEmpty) - current.insert(new DoubleLinkedList(elem, emptyList)) + if (current.isEmpty) + current = new DoubleLinkedList(elem, emptyList()) else - current = new DoubleLinkedList(elem, emptyList) + current append new DoubleLinkedList(elem, emptyList()) + this } - def clear() { - current = emptyList - } + def clear(): Unit = current = emptyList() def result() = current } } diff --git a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala index 18a0e164a2..7ad2f9558f 100644 --- a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala +++ b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala @@ -110,12 +110,9 @@ trait DoubleLinkedListLike[A, This <: Seq[A] with DoubleLinkedListLike[A, This]] private def outofbounds(n: Int) = throw new IndexOutOfBoundsException(n.toString) - override def drop(n: Int): This = super[SeqLike].drop(n) - - override def tail = drop(1) - - override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n)) - override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n)) - override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None) - + override def drop(n: Int): This = super[SeqLike].drop(n) + override def tail = drop(1) + override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n)) + override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n)) + override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None) } diff --git a/src/library/scala/collection/mutable/FlatHashTable.scala b/src/library/scala/collection/mutable/FlatHashTable.scala index 48386c8034..d78c466f69 100644 --- a/src/library/scala/collection/mutable/FlatHashTable.scala +++ b/src/library/scala/collection/mutable/FlatHashTable.scala @@ -16,13 +16,10 @@ package mutable * This trait is used internally. It can be mixed in with various collections relying on * hash table as an implementation. * - * @coll flat hash table - * + * @define coll flat hash table * @define cannotStoreNull '''Note''': A $coll cannot store `null` elements. - * * @since 2.3 - * - * @tparam A the type of the elements contained in the flat hash table. + * @tparam A the type of the elements contained in the $coll. */ trait FlatHashTable[A] extends FlatHashTable.HashUtils[A] { import FlatHashTable._ diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala index e78e9a1296..19ad53faf5 100644 --- a/src/library/scala/collection/mutable/HashMap.scala +++ b/src/library/scala/collection/mutable/HashMap.scala @@ -32,7 +32,7 @@ import scala.collection.parallel.mutable.ParHashMap * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[HashMap, (A, B), HashMap[A, B]]` * is defined in object `HashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `HashMap`. diff --git a/src/library/scala/collection/mutable/HashSet.scala b/src/library/scala/collection/mutable/HashSet.scala index 2ba5065964..134558ad15 100644 --- a/src/library/scala/collection/mutable/HashSet.scala +++ b/src/library/scala/collection/mutable/HashSet.scala @@ -23,15 +23,12 @@ import collection.parallel.mutable.ParHashSet * @version 2.0, 31/12/2006 * @since 1 * - * @tparam A the type of the elements contained in this set. - * - * * @define Coll mutable.HashSet * @define coll mutable hash set * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `HashSet[B]` because an implicit of type `CanBuildFrom[HashSet, B, HashSet[B]]` * is defined in object `HashSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `HashSet`. diff --git a/src/library/scala/collection/mutable/IndexedSeqView.scala b/src/library/scala/collection/mutable/IndexedSeqView.scala index 12b0229ae1..6af00d03b1 100644 --- a/src/library/scala/collection/mutable/IndexedSeqView.scala +++ b/src/library/scala/collection/mutable/IndexedSeqView.scala @@ -16,7 +16,7 @@ import generic._ import TraversableView.NoBuilder /** A non-strict view of a mutable `IndexedSeq`. - * $viewinfo + * $viewInfo * Some of the operations of this class will yield again a mutable indexed sequence, * others will just yield a plain indexed sequence of type `collection.IndexedSeq`. * Because this is a leaf class there is no associated `Like' class. diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala index 6df68b6e6e..31f539cc09 100644 --- a/src/library/scala/collection/mutable/LinkedHashMap.scala +++ b/src/library/scala/collection/mutable/LinkedHashMap.scala @@ -35,7 +35,7 @@ object LinkedHashMap extends MutableMapFactory[LinkedHashMap] { * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[LinkedHashMap, (A, B), LinkedHashMap[A, B]]` * is defined in object `LinkedHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedHashMap`. diff --git a/src/library/scala/collection/mutable/LinkedHashSet.scala b/src/library/scala/collection/mutable/LinkedHashSet.scala index bdbd22286a..7a1e695f32 100644 --- a/src/library/scala/collection/mutable/LinkedHashSet.scala +++ b/src/library/scala/collection/mutable/LinkedHashSet.scala @@ -29,7 +29,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `LinkedHashSet[B]` because an implicit of type `CanBuildFrom[LinkedHashSet, B, LinkedHashSet[B]]` * is defined in object `LinkedHashSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedHashSet`. diff --git a/src/library/scala/collection/mutable/LinkedList.scala b/src/library/scala/collection/mutable/LinkedList.scala index beee4857b0..b701a42596 100644 --- a/src/library/scala/collection/mutable/LinkedList.scala +++ b/src/library/scala/collection/mutable/LinkedList.scala @@ -28,7 +28,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `LinkedList[B]` because an implicit of type `CanBuildFrom[LinkedList, B, LinkedList[B]]` * is defined in object `LinkedList`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedList`. @@ -60,10 +60,9 @@ class LinkedList[A]() extends LinearSeq[A] * @define coll linked list */ object LinkedList extends SeqFactory[LinkedList] { - override def empty[A]: LinkedList[A] = new LinkedList[A] - implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, LinkedList[A]] = new GenericCanBuildFrom[A] + def newBuilder[A]: Builder[A, LinkedList[A]] = (new MutableList) mapResult ((l: MutableList[A]) => l.toLinkedList) } diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala index b24cda946e..a3fd786c2a 100644 --- a/src/library/scala/collection/mutable/LinkedListLike.scala +++ b/src/library/scala/collection/mutable/LinkedListLike.scala @@ -60,12 +60,14 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq var next: This = _ override def isEmpty = next eq this - override def length: Int = length0(repr, 0) - @tailrec private def length0(elem: This, acc: Int): Int = if (elem.isEmpty) acc else length0(elem.next, acc + 1) + @tailrec private def length0(elem: This, acc: Int): Int = + if (elem.isEmpty) acc else length0(elem.next, acc + 1) - override def head: A = elem + override def head: A = + if (isEmpty) throw new NoSuchElementException + else elem override def tail: This = { require(nonEmpty, "tail of empty list") @@ -92,7 +94,8 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq def insert(that: This): Unit = { require(nonEmpty, "insert into empty list") if (that.nonEmpty) { - next = next.append(that) + that append next + next = that } } @@ -100,7 +103,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq var i = 0 var these: This = repr while (i < n && !these.isEmpty) { - these = these.next.asInstanceOf[This] // !!! concrete overrides abstract problem + these = these.next i += 1 } these @@ -108,7 +111,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq private def atLocation[T](n: Int)(f: This => T) = { val loc = drop(n) - if (!loc.isEmpty) f(loc) + if (loc.nonEmpty) f(loc) else throw new IndexOutOfBoundsException(n.toString) } diff --git a/src/library/scala/collection/mutable/ListBuffer.scala b/src/library/scala/collection/mutable/ListBuffer.scala index 67d34cb481..6a75108dfb 100644 --- a/src/library/scala/collection/mutable/ListBuffer.scala +++ b/src/library/scala/collection/mutable/ListBuffer.scala @@ -29,7 +29,7 @@ import immutable.{List, Nil, ::} * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ListBuffer[B]` because an implicit of type `CanBuildFrom[ListBuffer, B, ListBuffer[B]]` * is defined in object `ListBuffer`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ListBuffer`. diff --git a/src/library/scala/collection/mutable/ListMap.scala b/src/library/scala/collection/mutable/ListMap.scala index 37baea60c2..c02593fdf3 100644 --- a/src/library/scala/collection/mutable/ListMap.scala +++ b/src/library/scala/collection/mutable/ListMap.scala @@ -25,7 +25,7 @@ import generic._ * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[ListMap, (A, B), ListMap[A, B]]` * is defined in object `ListMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ListMap`. diff --git a/src/library/scala/collection/mutable/MutableList.scala b/src/library/scala/collection/mutable/MutableList.scala index 0595faff67..86b0da39f1 100644 --- a/src/library/scala/collection/mutable/MutableList.scala +++ b/src/library/scala/collection/mutable/MutableList.scala @@ -17,8 +17,7 @@ import immutable.{List, Nil} // !!! todo: convert to LinkedListBuffer? /** * This class is used internally to represent mutable lists. It is the - * basis for the implementation of the classes - * `Stack`, and `Queue`. + * basis for the implementation of the class `Queue`. * * @author Matthias Zenger * @author Martin Odersky diff --git a/src/library/scala/collection/mutable/Set.scala b/src/library/scala/collection/mutable/Set.scala index 8d0588e5b9..dba629ae67 100644 --- a/src/library/scala/collection/mutable/Set.scala +++ b/src/library/scala/collection/mutable/Set.scala @@ -13,11 +13,14 @@ package mutable import generic._ -/** A base trait for sets that can be mutated. +/** A generic trait for mutable sets. * $setNote * $setTags + * * @since 1.0 * @author Matthias Zenger + * @define Coll mutable.Set + * @define coll mutable set */ trait Set[A] extends Iterable[A] with scala.collection.Set[A] diff --git a/src/library/scala/collection/mutable/StringBuilder.scala b/src/library/scala/collection/mutable/StringBuilder.scala index 0d1c51c42f..925a9fd9da 100644 --- a/src/library/scala/collection/mutable/StringBuilder.scala +++ b/src/library/scala/collection/mutable/StringBuilder.scala @@ -445,10 +445,9 @@ final class StringBuilder(private val underlying: JavaStringBuilder) */ override def mkString = toString - /** Returns the result of this Builder, which in the case - * of StringBuilders is a StringBuilder (not a String.) + /** Returns the result of this Builder (a String) * - * @return this StringBuilder + * @return the string assembled by this StringBuilder */ def result(): String = toString } diff --git a/src/library/scala/collection/mutable/UnrolledBuffer.scala b/src/library/scala/collection/mutable/UnrolledBuffer.scala index 10a572408b..0933aeaf69 100644 --- a/src/library/scala/collection/mutable/UnrolledBuffer.scala +++ b/src/library/scala/collection/mutable/UnrolledBuffer.scala @@ -1,15 +1,8 @@ package scala.collection.mutable - - import collection.generic._ - import annotation.tailrec - - - - /** A buffer that stores elements in an unrolled linked list. * * Unrolled linked lists store elements in linked fixed size @@ -32,10 +25,10 @@ import annotation.tailrec * Better than singly linked lists for random access, but * should still be avoided for such a purpose. * + * @define coll unrolled buffer + * @define Coll UnrolledBuffer * @author Aleksandar Prokopec * - * @coll unrolled buffer - * @Coll UnrolledBuffer */ @SerialVersionUID(1L) class UnrolledBuffer[T](implicit val manifest: ClassManifest[T]) diff --git a/src/library/scala/collection/mutable/WeakHashMap.scala b/src/library/scala/collection/mutable/WeakHashMap.scala index 3e6366dbd0..be2daa05ce 100644 --- a/src/library/scala/collection/mutable/WeakHashMap.scala +++ b/src/library/scala/collection/mutable/WeakHashMap.scala @@ -30,7 +30,7 @@ import generic._ * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[WeakHashMap, (A, B), WeakHashMap[A, B]]` * is defined in object `WeakHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `WeakHashMap`. diff --git a/src/library/scala/collection/parallel/ParIterable.scala b/src/library/scala/collection/parallel/ParIterable.scala index 48b0e35151..aeed6949c7 100644 --- a/src/library/scala/collection/parallel/ParIterable.scala +++ b/src/library/scala/collection/parallel/ParIterable.scala @@ -6,15 +6,12 @@ ** |/ ** \* */ - package scala.collection.parallel - import scala.collection.generic._ import scala.collection.parallel.mutable.ParArrayCombiner import scala.collection.parallel.mutable.ParArray - /** A template trait for parallel iterable collections. * * $paralleliterableinfo @@ -35,7 +32,7 @@ trait ParIterable[+T] extends Iterable[T] override def companion: GenericCompanion[ParIterable] with GenericParCompanion[ParIterable] = ParIterable } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = new GenericCanCombineFrom[T] @@ -44,17 +41,3 @@ object ParIterable extends ParFactory[ParIterable] { def newCombiner[T]: Combiner[T, ParIterable[T]] = ParArrayCombiner[T] } - - - - - - - - - - - - - - diff --git a/src/library/scala/collection/parallel/immutable/ParHashMap.scala b/src/library/scala/collection/parallel/immutable/ParHashMap.scala index 84705c33e7..11d4a02e18 100644 --- a/src/library/scala/collection/parallel/immutable/ParHashMap.scala +++ b/src/library/scala/collection/parallel/immutable/ParHashMap.scala @@ -146,7 +146,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll immutable.ParHashMap * @define coll immutable parallel hash map */ diff --git a/src/library/scala/collection/parallel/immutable/ParHashSet.scala b/src/library/scala/collection/parallel/immutable/ParHashSet.scala index 29c6eb0f93..e292a3ef72 100644 --- a/src/library/scala/collection/parallel/immutable/ParHashSet.scala +++ b/src/library/scala/collection/parallel/immutable/ParHashSet.scala @@ -127,7 +127,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll immutable.ParHashSet * @define coll immutable parallel hash set */ diff --git a/src/library/scala/collection/parallel/immutable/ParIterable.scala b/src/library/scala/collection/parallel/immutable/ParIterable.scala index c4da1ced8e..085f5220dd 100644 --- a/src/library/scala/collection/parallel/immutable/ParIterable.scala +++ b/src/library/scala/collection/parallel/immutable/ParIterable.scala @@ -44,7 +44,7 @@ extends collection.immutable.Iterable[T] } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = diff --git a/src/library/scala/collection/parallel/mutable/ParArray.scala b/src/library/scala/collection/parallel/mutable/ParArray.scala index f976098f5e..0ac009d58c 100644 --- a/src/library/scala/collection/parallel/mutable/ParArray.scala +++ b/src/library/scala/collection/parallel/mutable/ParArray.scala @@ -682,7 +682,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll mutable.ParArray * @define coll parallel array */ diff --git a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala index 3bb3d4d763..f2205fbb17 100644 --- a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala +++ b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala @@ -6,21 +6,16 @@ ** |/ ** \* */ - package scala.collection package parallel.mutable - - - import collection.parallel.ParIterableIterator - - - /** Parallel flat hash table. * - * @tparam T type of the elements in the table + * @tparam T type of the elements in the $coll. + * @define coll table + * @define Coll flat hash table * * @author Aleksandar Prokopec */ diff --git a/src/library/scala/collection/parallel/mutable/ParHashMap.scala b/src/library/scala/collection/parallel/mutable/ParHashMap.scala index 2945bcdc61..a3f3c33af5 100644 --- a/src/library/scala/collection/parallel/mutable/ParHashMap.scala +++ b/src/library/scala/collection/parallel/mutable/ParHashMap.scala @@ -141,7 +141,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll mutable.ParHashMap * @define coll parallel hash map */ diff --git a/src/library/scala/collection/parallel/mutable/ParHashSet.scala b/src/library/scala/collection/parallel/mutable/ParHashSet.scala index 0b969d1cf0..6d82e1b6aa 100644 --- a/src/library/scala/collection/parallel/mutable/ParHashSet.scala +++ b/src/library/scala/collection/parallel/mutable/ParHashSet.scala @@ -6,12 +6,8 @@ ** |/ ** \* */ - package scala.collection.parallel.mutable - - - import collection.generic._ import collection.mutable.HashSet import collection.mutable.FlatHashTable @@ -19,18 +15,15 @@ import collection.parallel.Combiner import collection.parallel.EnvironmentPassingCombiner import collection.mutable.UnrolledBuffer - - - /** A parallel hash set. * * `ParHashSet` is a parallel set which internally keeps elements within a hash table. * It uses linear probing to resolve collisions. * - * @tparam T type of the elements in the parallel hash map + * @tparam T type of the elements in the $coll. * - * @define Coll ParHashMap - * @define coll parallel hash map + * @define Coll ParHashSet + * @define coll parallel hash set * * @author Aleksandar Prokopec */ @@ -317,7 +310,6 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] => } - private[parallel] object ParHashSetCombiner { private[mutable] val discriminantbits = 5 private[mutable] val numblocks = 1 << discriminantbits @@ -327,16 +319,3 @@ private[parallel] object ParHashSetCombiner { def apply[T] = new ParHashSetCombiner[T](FlatHashTable.defaultLoadFactor) with EnvironmentPassingCombiner[T, ParHashSet[T]] } - - - - - - - - - - - - - diff --git a/src/library/scala/collection/parallel/mutable/ParIterable.scala b/src/library/scala/collection/parallel/mutable/ParIterable.scala index fcba75452f..cd0c45bd0d 100644 --- a/src/library/scala/collection/parallel/mutable/ParIterable.scala +++ b/src/library/scala/collection/parallel/mutable/ParIterable.scala @@ -39,7 +39,7 @@ trait ParIterable[T] extends collection.mutable.Iterable[T] override def toSeq: ParSeq[T] = toParCollection[T, ParSeq[T]](() => ParSeq.newCombiner[T]) } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = diff --git a/src/library/scala/io/Position.scala b/src/library/scala/io/Position.scala index d08ed2d7e7..3cc7a481f3 100644 --- a/src/library/scala/io/Position.scala +++ b/src/library/scala/io/Position.scala @@ -6,97 +6,76 @@ ** |/ ** \* */ - - package scala.io -/** <p> - * The object <code>Position</code> provides convenience methods to encode - * line and column number in one single integer. The encode line (column) - * numbers range from 0 to <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>), where 0 indicates that the line (column) is - * the undefined and 1 represents the first line (column). Line (Column) - * numbers greater than <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>) are replaced by <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>). Furthermore, if the encoded line number is - * <code>LINE_MASK</code>, the column number is always set to 0. - * </p> - * <p> - * The following properties hold: - * </p> - * <ul> - * <li> - * the undefined position is 0: <code>encode(0,0) == 0</code> - * </li> - * <li> - * encodings are non-negative : <code>encode(line,column) >= 0</code> - * </li> - * <li> - * position order is preserved: - * <code>(line1 < line2) || (line1 == line2 && column1 < column2)</code> - * <div>implies</div> - * <code>encode(line1,column1) <= encode(line2,column2)</code> - * </li> - * </ul> +/** The object Position provides convenience methods to encode + * line and column number in one single integer. The encoded line + * (column) numbers range from 0 to LINE_MASK (COLUMN_MASK), + * where 0 indicates that the line (column) is undefined and 1 + * represents the first line (column). + * + * Line (Column) numbers greater than LINE_MASK (COLUMN_MASK) are + * replaced by LINE_MASK (COLUMN_MASK). Furthermore, if the encoded + * line number is LINE_MASK, the column number is always set to 0. + * + * The following properties hold: + * + * the undefined position is 0: encode(0,0) == 0 + * encodings are non-negative : encode(line,column) >= 0 + * position order is preserved: + * + * (line1 <= line2) || (line1 == line2 && column1 <= column2) + * implies + * encode(line1,column1) <= encode(line2,column2) * * @author Burak Emir (translated from work by Matthias Zenger and others) */ -object Position { +abstract class Position { + /** Definable behavior for overflow conditions. + */ + def checkInput(line: Int, column: Int): Unit /** Number of bits used to encode the line number */ final val LINE_BITS = 20 /** Number of bits used to encode the column number */ final val COLUMN_BITS = 31 - LINE_BITS // no negatives => 31 - /** Mask to decode the line number */ final val LINE_MASK = (1 << LINE_BITS) - 1 /** Mask to decode the column number */ final val COLUMN_MASK = (1 << COLUMN_BITS) - 1 - /** The undefined position */ - final val NOPOS = 0 - - /** The first position in a source file */ - final val FIRSTPOS = encode(1, 1) - /** Encodes a position into a single integer. */ final def encode(line: Int, column: Int): Int = { - var line1, column1 = 0 - if (line < 0) - throw new IllegalArgumentException(line + " < 0") - if ((line == 0) && (column != 0)) - throw new IllegalArgumentException(line + "," + column + " not allowed") - if (column < 0) - throw new IllegalArgumentException(line + "," + column + " not allowed") + checkInput(line, column) - if (line >= LINE_MASK) { - line1 = LINE_MASK - column1 = 0 - } - else { - line1 = line - if (column > COLUMN_MASK) - column1 = COLUMN_MASK - else - column1 = column - } - (line1 << COLUMN_BITS) | column1 + if (line >= LINE_MASK) + LINE_MASK << COLUMN_BITS + else + (line << COLUMN_BITS) | math.min(LINE_MASK, line) } /** Returns the line number of the encoded position. */ - final def line(pos: Int): Int = - (pos >> COLUMN_BITS) & LINE_MASK + final def line(pos: Int): Int = (pos >> COLUMN_BITS) & LINE_MASK /** Returns the column number of the encoded position. */ - final def column(pos: Int): Int = - pos & COLUMN_MASK + final def column(pos: Int): Int = pos & COLUMN_MASK /** Returns a string representation of the encoded position. */ - def toString(pos: Int): String = { - val sb = new StringBuilder - sb append line(pos) - sb append ':' - sb append column(pos) - sb.toString() + def toString(pos: Int): String = line(pos) + ":" + column(pos) +} + +object Position extends Position { + /** The undefined position */ + @deprecated("This will be removed") final val NOPOS = 0 + /** The first position in a source file */ + @deprecated("This will be removed") final val FIRSTPOS = encode(1, 1) + + def checkInput(line: Int, column: Int) { + if (line < 0) + throw new IllegalArgumentException(line + " < 0") + if ((line == 0) && (column != 0)) + throw new IllegalArgumentException(line + "," + column + " not allowed") + if (column < 0) + throw new IllegalArgumentException(line + "," + column + " not allowed") } } diff --git a/src/library/scala/io/Source.scala b/src/library/scala/io/Source.scala index 570c48a91a..c81f2bfed0 100644 --- a/src/library/scala/io/Source.scala +++ b/src/library/scala/io/Source.scala @@ -186,7 +186,6 @@ abstract class Source extends Iterator[Char] { /** description of this source, default empty */ var descr: String = "" - var nerrors = 0 var nwarnings = 0 @@ -242,7 +241,8 @@ abstract class Source extends Iterator[Char] { */ def next: Char = positioner.next - class Positioner { + class Positioner(encoder: Position) { + def this() = this(RelaxedPosition) /** the last character returned by next. */ var ch: Char = _ @@ -258,7 +258,7 @@ abstract class Source extends Iterator[Char] { def next: Char = { ch = iter.next - pos = Position.encode(cline, ccol) + pos = encoder.encode(cline, ccol) ch match { case '\n' => ccol = 1 @@ -271,7 +271,14 @@ abstract class Source extends Iterator[Char] { ch } } - object NoPositioner extends Positioner { + /** A Position implementation which ignores errors in + * the positions. + */ + object RelaxedPosition extends Position { + def checkInput(line: Int, column: Int): Unit = () + } + object RelaxedPositioner extends Positioner(RelaxedPosition) { } + object NoPositioner extends Positioner(Position) { override def next: Char = iter.next } def ch = positioner.ch @@ -321,7 +328,7 @@ abstract class Source extends Iterator[Char] { private[this] var resetFunction: () => Source = null private[this] var closeFunction: () => Unit = null - private[this] var positioner: Positioner = new Positioner + private[this] var positioner: Positioner = RelaxedPositioner def withReset(f: () => Source): this.type = { resetFunction = f @@ -335,10 +342,13 @@ abstract class Source extends Iterator[Char] { descr = text this } - // we'd like to default to no positioning, but for now we break - // less by defaulting to status quo. + /** Change or disable the positioner. */ def withPositioning(on: Boolean): this.type = { - positioner = if (on) new Positioner else NoPositioner + positioner = if (on) RelaxedPositioner else NoPositioner + this + } + def withPositioning(pos: Positioner): this.type = { + positioner = pos this } diff --git a/src/library/scala/math/Ordering.scala b/src/library/scala/math/Ordering.scala index eeb8c080a1..10e42a6de4 100644 --- a/src/library/scala/math/Ordering.scala +++ b/src/library/scala/math/Ordering.scala @@ -30,6 +30,7 @@ import java.util.Comparator * @version 0.9.5, 2008-04-15 * @since 2.7 */ +@annotation.implicitNotFound(msg = "No implicit Ordering defined for ${T}.") trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable { outer => diff --git a/src/library/scala/reflect/ClassManifest.scala b/src/library/scala/reflect/ClassManifest.scala index d18cfbc652..3f3892e802 100644 --- a/src/library/scala/reflect/ClassManifest.scala +++ b/src/library/scala/reflect/ClassManifest.scala @@ -144,16 +144,10 @@ trait ClassManifest[T] extends OptManifest[T] with Equals with Serializable { else "" } -/** <p> - * This object is used by the compiler and <b>should not be used in client - * code</b>. The object Manifest defines factory methods for - * manifests. - * </p> - * <p> - * <b>BE AWARE</b>: The factory for refinement types is missing and - * will be implemented in a later version of this class. - * </p> - */ +/** The object ClassManifest defines factory methods for manifests. + * It is intended for use by the compiler and should not be used + * in client code. + */ object ClassManifest { val Byte = Manifest.Byte val Short = Manifest.Short diff --git a/src/library/scala/reflect/Manifest.scala b/src/library/scala/reflect/Manifest.scala index 5545a43740..229fa728a8 100644 --- a/src/library/scala/reflect/Manifest.scala +++ b/src/library/scala/reflect/Manifest.scala @@ -10,17 +10,35 @@ package scala.reflect import scala.collection.mutable.{ ArrayBuilder, WrappedArray } -/** <p> - * A <code>Manifest[T]</code> is an opaque descriptor for type <code>T</code>. - * Currently, its only use is to give access to the erasure of the type as a - * <code>Class</code> instance. - * </p> - * <p> - * <b>BE AWARE</b>: The different type-relation operators are all forwarded - * to the erased type as an approximation of the final semantics where - * these operators should be on the unerased type. - * </p> - */ +/** A Manifest[T] is an opaque descriptor for type T. Its + * supported use is to give access to the erasure of the type + * as a Class instance, as is necessary for the creation of native + * Arrays if the class is not known at compile time. + * + * The type-relation operators <:< and =:= should be considered + * approximations only, as there are numerous aspects of type conformance + * which are not yet adequately represented in manifests. + * + * Example usages: +{{{ + def arr[T] = new Array[T](0) // does not compile + def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles + def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding + + // Methods manifest, classManifest, and optManifest are in [[scala.Predef]]. + def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U] + isApproxSubType[List[String], List[AnyRef]] // true + isApproxSubType[List[String], List[Int]] // false + + def methods[T: ClassManifest] = classManifest[T].erasure.getMethods + def retType[T: ClassManifest](name: String) = + methods[T] find (_.getName == name) map (_.getGenericReturnType) + + retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>) +}}} + * + */ +@annotation.implicitNotFound(msg = "No Manifest available for ${T}.") trait Manifest[T] extends ClassManifest[T] with Equals { override def typeArguments: List[Manifest[_]] = Nil @@ -52,16 +70,10 @@ trait AnyValManifest[T] extends Manifest[T] with Equals { override def hashCode = System.identityHashCode(this) } -/** <ps> - * This object is used by the compiler and <b>should not be used in client - * code</b>. The object <code>Manifest</code> defines factory methods for - * manifests. - * </p> - * <p> - * <b>BE AWARE</b>: The factory for refinement types is missing and - * will be implemented in a later version of this class. - * </p> - */ +/** The object Manifest defines factory methods for manifests. + * It is intended for use by the compiler and should not be used + * in client code. + */ object Manifest { private def ObjectClass = classOf[java.lang.Object] diff --git a/src/library/scala/reflect/NameTransformer.scala b/src/library/scala/reflect/NameTransformer.scala index 6cfb40cadf..7bc5a61f6c 100755 --- a/src/library/scala/reflect/NameTransformer.scala +++ b/src/library/scala/reflect/NameTransformer.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.reflect /** @@ -21,7 +19,6 @@ object NameTransformer { private val op2code = new Array[String](nops) private val code2op = new Array[OpCodes](ncodes) - private def enterOp(op: Char, code: String) = { op2code(op) = code val c = (code.charAt(1) - 'a') * 26 + code.charAt(2) - 'a' @@ -48,10 +45,10 @@ object NameTransformer { enterOp('?', "$qmark") enterOp('@', "$at") - /** Replace operator symbols by corresponding "<code>$op_name</code>". + /** Replace operator symbols by corresponding `\$opname`. * - * @param name ... - * @return ... + * @param name the string to encode + * @return the string with all recognized opchars replaced with their encoding */ def encode(name: String): String = { var buf: StringBuilder = null @@ -82,10 +79,10 @@ object NameTransformer { if (buf eq null) name else buf.toString() } - /** Replace <code>$op_name</code> by corresponding operator symbol. + /** Replace `\$opname` by corresponding operator symbol. * - * @param name0 ... - * @return ... + * @param name0 the string to decode + * @return the string with all recognized operator symbol encodings replaced with their name */ def decode(name0: String): String = { //System.out.println("decode: " + name);//DEBUG diff --git a/src/library/scala/reflect/Type.scala b/src/library/scala/reflect/Type.scala index 85b047d97c..5aa92b3828 100644 --- a/src/library/scala/reflect/Type.scala +++ b/src/library/scala/reflect/Type.scala @@ -6,12 +6,8 @@ ** |/ ** \* */ - - package scala.reflect -import collection.immutable.List - /** This type is required by the compiler and <b>should not be used in client code</b>. */ abstract class Type @@ -55,13 +51,6 @@ case class NullaryMethodType(resultType: Type) extends Type /** This type is required by the compiler and <b>should not be used in client code</b>. */ case class PolyType(typeParams: List[Symbol], typeBounds: List[(Type, Type)], resultType: Type) extends Type - -/** This type is required by the compiler and <b>should not be used in client code</b>. */ -class ImplicitMethodType(formals: List[Symbol], restpe: Type) -extends MethodType(formals, restpe) - - - /* Standard pattern match: case reflect.NoPrefix => @@ -72,7 +61,7 @@ extends MethodType(formals, restpe) case reflect.ThisType(clazz) => case reflect.AppliedType(tpe, args) => case reflect.TypeBounds(lo, hi) => - case reflect.MethodType(formals, restpe) => //can also be ImplicitMethodType + case reflect.MethodType(formals, restpe) => case reflect.NullaryMethodType(restpe) => case reflect.PolyType(typeParams, typeBounds, resultType) => */ diff --git a/src/library/scala/reflect/generic/PickleFormat.scala b/src/library/scala/reflect/generic/PickleFormat.scala index a1f988a22d..1667e8c24f 100755 --- a/src/library/scala/reflect/generic/PickleFormat.scala +++ b/src/library/scala/reflect/generic/PickleFormat.scala @@ -137,7 +137,7 @@ object PickleFormat { final val CLASSINFOtpe = 19 final val METHODtpe = 20 final val POLYtpe = 21 - final val IMPLICITMETHODtpe = 22 + final val IMPLICITMETHODtpe = 22 // no longer generated final val LITERAL = 23 // base line for literals final val LITERALunit = 24 diff --git a/src/library/scala/reflect/generic/Symbols.scala b/src/library/scala/reflect/generic/Symbols.scala index 770c6e920c..49cf7df1ef 100755 --- a/src/library/scala/reflect/generic/Symbols.scala +++ b/src/library/scala/reflect/generic/Symbols.scala @@ -25,11 +25,11 @@ trait Symbols { self: Universe => */ def name: Name - /** The name of the symbol before decoding, e.g. `$eq$eq` instead of `==`. + /** The name of the symbol before decoding, e.g. `\$eq\$eq` instead of `==`. */ def encodedName: String - /** The decoded name of the symbol, e.g. `==` instead of `$eq$eq`. + /** The decoded name of the symbol, e.g. `==` instead of `\$eq\$eq`. */ def decodedName: String = stripLocalSuffix(NameTransformer.decode(encodedName)) diff --git a/src/library/scala/runtime/RichUnit.scala b/src/library/scala/runtime/RichUnit.scala deleted file mode 100644 index 522b139cb4..0000000000 --- a/src/library/scala/runtime/RichUnit.scala +++ /dev/null @@ -1,22 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - - - -package scala.runtime - -/** This class exists only as a dummy subclass so that there are two ambiguous - * implicit conversions from Unit to some subclass to Object. - * It's important that this class should NOT inherit from Ordered. - * - * Note - in reality the ambiguity is successfully introduced by any2stringadd - * and orderingToOrdered, and adding an implicit from () => RichUnit actually - * resolves the ambiguity by being more specific, and succeeds! So this class - * is probably useless, and unitWrapper has been removed from Predef. - */ -final class RichUnit {} diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index 3168fedc40..41a63777c5 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -252,9 +252,8 @@ object ScalaRunTime { * called on null and (b) depending on the apparent type of an * array, toString may or may not print it in a human-readable form. * - * @param arg the value to stringify - * @return a string representation of <code>arg</code> - * + * @param arg the value to stringify + * @return a string representation of arg. */ def stringOf(arg: Any): String = stringOf(arg, scala.Int.MaxValue) def stringOf(arg: Any, maxElements: Int): String = { @@ -288,14 +287,18 @@ object ScalaRunTime { case (k, v) => inner(k) + " -> " + inner(v) case _ => inner(arg) } - // The recursively applied attempt to prettify Array printing + // The recursively applied attempt to prettify Array printing. + // Note that iterator is used if possible and foreach is used as a + // last resort, because the parallel collections "foreach" in a + // random order even on sequences. def inner(arg: Any): String = arg match { case null => "null" case "" => "\"\"" case x: String => if (x.head.isWhitespace || x.last.isWhitespace) "\"" + x + "\"" else x - case x if useOwnToString(x) => x.toString + case x if useOwnToString(x) => x toString case x: AnyRef if isArray(x) => WrappedArray make x take maxElements map inner mkString ("Array(", ", ", ")") - case x: collection.Map[_, _] => x take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")") + case x: collection.Map[_, _] => x.iterator take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")") + case x: Iterable[_] => x.iterator take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")") case x: Traversable[_] => x take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")") case x: Product1[_] if isTuple(x) => "(" + inner(x._1) + ",)" // that special trailing comma case x: Product if isTuple(x) => x.productIterator map inner mkString ("(", ",", ")") @@ -304,13 +307,16 @@ object ScalaRunTime { // The try/catch is defense against iterables which aren't actually designed // to be iterated, such as some scala.tools.nsc.io.AbstractFile derived classes. - val s = - try inner(arg) - catch { - case _: StackOverflowError | _: UnsupportedOperationException => arg.toString - } - + try inner(arg) + catch { + case _: StackOverflowError | _: UnsupportedOperationException | _: AssertionError => "" + arg + } + } + /** stringOf formatted for use in a repl result. */ + def replStringOf(arg: Any, maxElements: Int): String = { + val s = stringOf(arg, maxElements) val nl = if (s contains "\n") "\n" else "" + nl + s + "\n" } } diff --git a/src/library/scala/sys/BooleanProp.scala b/src/library/scala/sys/BooleanProp.scala index 85719103de..e940990785 100644 --- a/src/library/scala/sys/BooleanProp.scala +++ b/src/library/scala/sys/BooleanProp.scala @@ -46,6 +46,8 @@ object BooleanProp { def setValue[T1 >: Boolean](newValue: T1): Boolean = value def get: String = "" + value val clear, enable, disable, toggle = () + def option = if (isSet) Some(value) else None + protected def zero = false } diff --git a/src/library/scala/sys/Prop.scala b/src/library/scala/sys/Prop.scala index de38a56c73..33b88f119f 100644 --- a/src/library/scala/sys/Prop.scala +++ b/src/library/scala/sys/Prop.scala @@ -53,6 +53,10 @@ trait Prop[+T] { */ def get: String + /** Some(value) if the property is set, None otherwise. + */ + def option: Option[T] + /** Removes the property from the underlying map. */ def clear(): Unit @@ -69,11 +73,13 @@ object Prop { * parameter of type Creator[T] is in scope, a Prop[T] can be created * via this object's apply method. */ + @annotation.implicitNotFound("No implicit property creator available for type ${T}.") trait Creator[+T] { /** Creates a Prop[T] of this type based on the given key. */ def apply(key: String): Prop[T] } + implicit object FileProp extends CreatorImpl[java.io.File](s => new java.io.File(s)) implicit object StringProp extends CreatorImpl[String](s => s) implicit object IntProp extends CreatorImpl[Int](_.toInt) implicit object DoubleProp extends CreatorImpl[Double](_.toDouble) diff --git a/src/library/scala/sys/PropImpl.scala b/src/library/scala/sys/PropImpl.scala index 888e9d7327..b84553ea22 100644 --- a/src/library/scala/sys/PropImpl.scala +++ b/src/library/scala/sys/PropImpl.scala @@ -31,6 +31,8 @@ private[sys] class PropImpl[+T](val key: String, valueFn: String => T) extends P else "" def clear(): Unit = underlying -= key + def option: Option[T] = if (isSet) Some(value) else None + def or[T1 >: T](alt: => T1): T1 = if (isSet) value else alt /** The underlying property map, in our case always sys.props */ protected def underlying: mutable.Map[String, String] = scala.sys.props diff --git a/src/library/scala/sys/SystemProperties.scala b/src/library/scala/sys/SystemProperties.scala index 228ca6315e..296db9e469 100644 --- a/src/library/scala/sys/SystemProperties.scala +++ b/src/library/scala/sys/SystemProperties.scala @@ -55,14 +55,15 @@ object SystemProperties { implicit def systemPropertiesToCompanion(p: SystemProperties): SystemProperties.type = this private lazy val propertyHelp = mutable.Map[String, String]() - private def bool(key: String, helpText: String): BooleanProp = { - val prop = ( - if (key startsWith "java.") BooleanProp.valueIsTrue(key) - else BooleanProp.keyExists(key) - ) - propertyHelp(key) = helpText - prop + private def addHelp[P <: Prop[_]](p: P, helpText: String): P = { + propertyHelp(p.key) = helpText + p } + private def str(key: String, helpText: String) = addHelp(Prop[String](key), helpText) + private def bool(key: String, helpText: String): BooleanProp = addHelp[BooleanProp]( + if (key startsWith "java.") BooleanProp.valueIsTrue(key) else BooleanProp.keyExists(key), + helpText + ) def help(key: String) = propertyHelp.getOrElse(key, "") // Todo: bring some sanity to the intersection of system properties aka "mutable @@ -72,5 +73,6 @@ object SystemProperties { lazy val preferIPv4Stack = bool("java.net.preferIPv4Stack", "system should prefer IPv4 sockets") lazy val preferIPv6Addresses = bool("java.net.preferIPv6Addresses", "system should prefer IPv6 addresses") lazy val noTraceSupression = bool("scala.control.noTraceSuppression", "scala should not suppress any stack trace creation") + lazy val traceSourcePath = str("scala.control.sourcepath", "sourcepath for looking up stack trace elements") } diff --git a/src/library/scala/util/control/NoStackTrace.scala b/src/library/scala/util/control/NoStackTrace.scala index f33e8cd013..f5a844d2c9 100644 --- a/src/library/scala/util/control/NoStackTrace.scala +++ b/src/library/scala/util/control/NoStackTrace.scala @@ -11,7 +11,7 @@ package scala.util.control /** A trait for exceptions which, for efficiency reasons, do not * fill in the stack trace. Stack trace suppression can be disabled * on a global basis via a system property wrapper in - * [[ scala.sys.SystemProperties ]]. + * [[scala.sys.SystemProperties]]. * * @author Paul Phillips * @since 2.8 diff --git a/src/library/scala/util/logging/Logged.scala b/src/library/scala/util/logging/Logged.scala index 3ec70c00c6..01757e1bfa 100644 --- a/src/library/scala/util/logging/Logged.scala +++ b/src/library/scala/util/logging/Logged.scala @@ -6,34 +6,25 @@ ** |/ ** \* */ - - package scala.util.logging -/** <p> - * Mixing in the class <code>Logged</code> indicates that a class provides - * support for logging. For instance, the developer of a library writes - * </p> - * <pre> - * <b>class</b> MyClass <b>extends</b> Logged { /* do stuff, call log */ } - * </pre> - * <p> - * The user of the library instantiates: - * </p> - * <pre> - * <b>val</b> x = <b>new</b> MyClass() <b>with</b> ConsoleLogger - * </pre> - * <p> - * and the logging will be sent to the <a href="../../Console$object.html" - * target="contentFrame"><code>Console</code></a> object. - * </p> +/** Mixing in Logged indicates that a class provides support for logging. + * For instance: +{{{ + // The developer of the library writes: + class MyClass extends Logged { + // do stuff, call log + } + // The user of the library instantiates: + val x = new MyClass() with ConsoleLogger +}}} + * and the logging is sent to the [[scala.util.logging.ConsoleLogger]] object. */ trait Logged { - /** This method should log the message given as argument somewhere * as a side-effect. * - * @param msg ... + * @param msg message to be logged */ def log(msg: String): Unit = {} } diff --git a/src/library/scala/xml/Attribute.scala b/src/library/scala/xml/Attribute.scala index dfee02c48a..5b69017e70 100644 --- a/src/library/scala/xml/Attribute.scala +++ b/src/library/scala/xml/Attribute.scala @@ -64,16 +64,6 @@ abstract trait Attribute extends MetaData { (next(arg, scope, key) == null) && (next wellformed scope) } - override def canEqual(other: Any) = other match { - case _: Attribute => true - case _ => false - } - override def strict_==(other: Equality) = other match { - case x: Attribute => (pre == x.pre) && (key == x.key) && (value sameElements x.value) && (next == x.next) - case _ => false - } - override def basisForHashCode = List(pre, key, value) - /** Appends string representation of only this attribute to stringbuffer. */ def toString1(sb: StringBuilder) { diff --git a/src/library/scala/xml/Elem.scala b/src/library/scala/xml/Elem.scala index b068a1a17d..4ea7e90de2 100644 --- a/src/library/scala/xml/Elem.scala +++ b/src/library/scala/xml/Elem.scala @@ -17,8 +17,7 @@ package scala.xml * Copyright 2008 Google Inc. All Rights Reserved. * @author Burak Emir <bqe@google.com> */ -object Elem -{ +object Elem { def apply(prefix: String,label: String, attributes: MetaData, scope: NamespaceBinding, child: Node*) = new Elem(prefix,label,attributes,scope,child:_*) diff --git a/src/library/scala/xml/MetaData.scala b/src/library/scala/xml/MetaData.scala index ff3071e050..2e55a9d67e 100644 --- a/src/library/scala/xml/MetaData.scala +++ b/src/library/scala/xml/MetaData.scala @@ -71,8 +71,7 @@ object MetaData { * Copyright 2008 Google Inc. All Rights Reserved. * @author Burak Emir <bqe@google.com> */ -abstract class MetaData extends Iterable[MetaData] with Equality with Serializable -{ +abstract class MetaData extends Iterable[MetaData] with Equality with Serializable { /** Updates this MetaData with the MetaData given as argument. All attributes that occur in updates * are part of the resulting MetaData. If an attribute occurs in both this instance and * updates, only the one in updates is part of the result (avoiding duplicates). For prefixed @@ -135,10 +134,10 @@ abstract class MetaData extends Iterable[MetaData] with Equality with Serializab case _ => false } override def strict_==(other: Equality) = other match { - case m: MetaData => this.toSet == m.toSet + case m: MetaData => this.asAttrMap == m.asAttrMap case _ => false } - def basisForHashCode: Seq[Any] = List(this.toSet) + def basisForHashCode: Seq[Any] = List(this.asAttrMap) /** Returns an iterator on attributes */ def iterator: Iterator[MetaData] = Iterator.single(this) ++ next.iterator diff --git a/src/library/scala/xml/include/sax/EncodingHeuristics.scala b/src/library/scala/xml/include/sax/EncodingHeuristics.scala index 349187437d..eaf0dffca8 100644 --- a/src/library/scala/xml/include/sax/EncodingHeuristics.scala +++ b/src/library/scala/xml/include/sax/EncodingHeuristics.scala @@ -14,14 +14,11 @@ import scala.xml.include._ import java.io.InputStream import scala.util.matching.Regex -/** - * <p> - * <code>EncodingHeuristics</code> reads from a stream +/** `EncodingHeuristics` reads from a stream * (which should be buffered) and attempts to guess * what the encoding of the text in the stream is. * If it fails to determine the type of the encoding, * it returns the default UTF-8. - * </p> * * @author Burak Emir * @author Paul Phillips @@ -40,16 +37,13 @@ object EncodingHeuristics } import EncodingNames._ - /** - * <p> - * This utility method attempts to determine the XML character encoding - * by examining the input stream, as specified here: - * http://www.w3.org/TR/xml/#sec-guessing - * </p> + /** This utility method attempts to determine the XML character encoding + * by examining the input stream, as specified at + * [[http://www.w3.org/TR/xml/#sec-guessing w3]]. * - * @param in <code>InputStream</code> to read from. - * @return String The name of the encoding. + * @param in `InputStream` to read from. * @throws IOException if the stream cannot be reset + * @return the name of the encoding. */ def readEncodingFromStream(in: InputStream): String = { var ret: String = null diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala index 4188f8b084..3902967626 100755 --- a/src/library/scala/xml/pull/XMLEventReader.scala +++ b/src/library/scala/xml/pull/XMLEventReader.scala @@ -24,8 +24,7 @@ import scala.xml.parsing.{ ExternalSources, MarkupHandler, MarkupParser } * @author Burak Emir * @author Paul Phillips */ -class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] -{ +class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] { // We implement a pull parser as an iterator, but since we may be operating on // a stream (e.g. XML over a network) there may be arbitrarily long periods when // the queue is empty. Fortunately the ProducerConsumerIterator is ideally diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java index aefb6fdaf1..0f2c4e6764 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java @@ -108,20 +108,20 @@ public class Attribute { private static final Map id2type = new HashMap(); static { map("Boolean", Signature.ELEMENT_TYPE_BOOLEAN); - map("Char", Signature.ELEMENT_TYPE_CHAR); - map("SByte", Signature.ELEMENT_TYPE_I1); - map("Byte", Signature.ELEMENT_TYPE_U1); - map("Int16", Signature.ELEMENT_TYPE_I2); - map("UInt16", Signature.ELEMENT_TYPE_U2); - map("Int32", Signature.ELEMENT_TYPE_I4); - map("UInt32", Signature.ELEMENT_TYPE_U4); - map("Int64", Signature.ELEMENT_TYPE_I8); - map("UInt64", Signature.ELEMENT_TYPE_U8); - map("Single", Signature.ELEMENT_TYPE_R4); - map("Double", Signature.ELEMENT_TYPE_R8); - map("String", Signature.ELEMENT_TYPE_STRING); - map("Type", Signature.X_ELEMENT_TYPE_TYPE); - map("Object", Signature.ELEMENT_TYPE_OBJECT); + map("Char", Signature.ELEMENT_TYPE_CHAR); + map("SByte", Signature.ELEMENT_TYPE_I1); + map("Byte", Signature.ELEMENT_TYPE_U1); + map("Int16", Signature.ELEMENT_TYPE_I2); + map("UInt16", Signature.ELEMENT_TYPE_U2); + map("Int32", Signature.ELEMENT_TYPE_I4); + map("UInt32", Signature.ELEMENT_TYPE_U4); + map("Int64", Signature.ELEMENT_TYPE_I8); + map("UInt64", Signature.ELEMENT_TYPE_U8); + map("Single", Signature.ELEMENT_TYPE_R4); + map("Double", Signature.ELEMENT_TYPE_R8); + map("String", Signature.ELEMENT_TYPE_STRING); + map("Type", Signature.X_ELEMENT_TYPE_TYPE); + map("Object", Signature.ELEMENT_TYPE_OBJECT); } private static void map(String type, int id) { Type t = Type.GetType("System." + type); @@ -150,42 +150,102 @@ public class Attribute { private void parseBlob0() { if (buf != null) return; - buf = ByteBuffer.wrap(value); + buf = ByteBuffer.wrap(value); // Sec. 23.3 in Partition II of CLR Spec. buf.order(ByteOrder.LITTLE_ENDIAN); - short sig = buf.getShort(); + short sig = buf.getShort(); // Prolog assert sig == 1 : PEFile.bytes2hex(value); ParameterInfo[] params = constr.GetParameters(); constrArgs = new Object[params.length]; for (int i = 0; i < params.length; i++) { - constrArgs[i] = parseElement(params[i].ParameterType); + constrArgs[i] = parseFixedArg(params[i].ParameterType); // FixedArg } - int ncount = buf.getShort(); + int ncount = buf.getShort(); // NumNamed namedArgs = new LinkedHashMap(); for (int i = 0; i < ncount; i++) { - int designator = buf.get(); + int designator = buf.get(); // designator one of 0x53 (FIELD) or 0x54 (PROPERTY) assert designator == Signature.X_ELEMENT_KIND_FIELD || designator == Signature.X_ELEMENT_KIND_PROPERTY : "0x" + PEFile.byte2hex(designator); - Type type = parseType(); - String name = parseString(); - Object value = parseElement(type); + Type type = parseFieldOrPropTypeInNamedArg(); // FieldOrPropType + String name = parseString(); // FieldOrPropName + Object value = parseFixedArg(type); // FixedArg NamedArgument narg = new NamedArgument(designator, name, type, value); namedArgs.put(name, narg); } } - private Object parseElement(Type type) { - if (type.IsArray()) + private Object parseFixedArg(Type type) { + if (type.IsArray()) return parseArray(type.GetElementType()); - if (type.IsEnum()) - return parseElement(type.getUnderlyingType()); - return parseElement(getTypeId(type)); + else + return parseElem(type); + } + + /* indicates whether the "simple" case (the other is "enum") of the first row + in the Elem production should be taken. */ + private boolean isSimpleElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + switch(id){ + case Signature.ELEMENT_TYPE_STRING: + case Signature.X_ELEMENT_TYPE_TYPE: + case Signature.ELEMENT_TYPE_OBJECT: + return false; + default: + return true; + } } - private Object parseElement(int id) { + /* indicates whether the second row in the Elem production + should be taken (and more specifically, "string" case within that row). */ + private boolean isStringElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.ELEMENT_TYPE_STRING; + } + + /* indicates whether the second row in the Elem production + should be taken (and more specifically, "type" case within that row). */ + private boolean isTypeElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.X_ELEMENT_TYPE_TYPE; + } + + /* indicates whether the third row in the Elem production + should be taken (and more specifically, "boxed" case within that row). */ + private boolean isSystemObject(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.ELEMENT_TYPE_OBJECT; + } + + private Object parseElem(Type type) { + // simple or enum + if (isSimpleElem(type)) return parseVal(getTypeId(type)); + if (type.IsEnum()) return parseVal(getTypeId(type.getUnderlyingType())); + // string or type + if (isStringElem(type)) return parseString(); + if (isTypeElem(type)) return getTypeFromSerString(); + // boxed valuetype, please notice that a "simple" boxed valuetype is preceded by 0x51 + if (isSystemObject(type)) { + Type boxedT = parse0x51(); + if(boxedT.IsEnum()) { + return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT.getUnderlyingType()))); + } else { + return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT))); // TODO dead code? + } + } else { + Type boxedT = parseType(); + return parseVal(getTypeId(boxedT)); + } + } + + /* this does not parse an Elem, but a made-up production (Element). Don't read too much into this method name! */ + private Object parseVal(int id) { switch (id) { case Signature.ELEMENT_TYPE_BOOLEAN: return new Boolean(buf.get() == 0 ? false : true); @@ -193,29 +253,26 @@ public class Attribute { return new Character(buf.getChar()); case Signature.ELEMENT_TYPE_I1: case Signature.ELEMENT_TYPE_U1: - return new Byte(buf.get()); + return new Byte(buf.get()); // TODO U1 not the same as I1 case Signature.ELEMENT_TYPE_I2: case Signature.ELEMENT_TYPE_U2: - return new Short(buf.getShort()); + return new Short(buf.getShort()); // TODO U2 not the same as I2 case Signature.ELEMENT_TYPE_I4: case Signature.ELEMENT_TYPE_U4: - return new Integer(buf.getInt()); + return new Integer(buf.getInt()); // TODO U4 not the same as I4 case Signature.ELEMENT_TYPE_I8: case Signature.ELEMENT_TYPE_U8: - return new Long(buf.getLong()); + return new Long(buf.getLong()); // TODO U8 not the same as I8 case Signature.ELEMENT_TYPE_R4: return new Float(buf.getFloat()); case Signature.ELEMENT_TYPE_R8: return new Double(buf.getDouble()); + case Signature.X_ELEMENT_TYPE_TYPE: + return getTypeFromSerString(); case Signature.ELEMENT_TYPE_STRING: return parseString(); - case Signature.X_ELEMENT_TYPE_TYPE: - return getType(); - case Signature.ELEMENT_TYPE_OBJECT: - Type type = parseType(); - return new BoxedArgument(type, parseElement(type)); default: - throw new RuntimeException("Unknown type id: " + id); + throw new RuntimeException("Shouldn't have called parseVal with: " + id); } } @@ -232,7 +289,7 @@ public class Attribute { case Signature.ELEMENT_TYPE_CHAR: return parseCharArray(); case Signature.ELEMENT_TYPE_I1: - case Signature.ELEMENT_TYPE_U1: + case Signature.ELEMENT_TYPE_U1: // TODO U1 not the same as I1 return parseByteArray(); case Signature.ELEMENT_TYPE_I2: case Signature.ELEMENT_TYPE_U2: @@ -250,19 +307,61 @@ public class Attribute { case Signature.ELEMENT_TYPE_STRING: return parseStringArray(); case Signature.X_ELEMENT_TYPE_ENUM: - return parseArray(getType()); + return parseArray(getTypeFromSerString()); default: throw new RuntimeException("Unknown type id: " + id); } } - private Type parseType() { + private Type parseType() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec. + int id = buf.get(); + switch (id) { + case Signature.ELEMENT_TYPE_SZARRAY: + Type arrT = Type.mkArray(parseType(), 1); + return arrT; + case Signature.X_ELEMENT_TYPE_ENUM: + String enumName = parseString(); + Type enumT = Type.getType(enumName); + return enumT; + default: + Type t = (Type)id2type.get(new Integer(id)); + assert t != null : PEFile.byte2hex(id); + return t; + } + } + + private Type parse0x51() { int id = buf.get(); switch (id) { + case 0x51: + return parse0x51(); case Signature.ELEMENT_TYPE_SZARRAY: - return Type.mkArray(parseType(), 1); + Type arrT = Type.mkArray(parseType(), 1); + return arrT; + case Signature.X_ELEMENT_TYPE_ENUM: + String enumName = parseString(); + Type enumT = Type.getType(enumName); + return enumT; + default: + Type t = (Type)id2type.get(new Integer(id)); + assert t != null : PEFile.byte2hex(id); + return t; + } + } + + + private Type parseFieldOrPropTypeInNamedArg() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec. + int id = buf.get(); + switch (id) { + case 0x51: + return (Type)(id2type.get(new Integer(Signature.ELEMENT_TYPE_OBJECT))); + // TODO remove case Signature.ELEMENT_TYPE_SZARRAY: + // Type arrT = Type.mkArray(parseType(), 1); + // return arrT; case Signature.X_ELEMENT_TYPE_ENUM: - return getType(); + String enumName = parseString(); + Type enumT = Type.getType(enumName); // TODO this "lookup" only covers already-loaded assemblies. + return enumT; // TODO null as return value (due to the above) spells trouble later. default: Type t = (Type)id2type.get(new Integer(id)); assert t != null : PEFile.byte2hex(id); @@ -270,13 +369,11 @@ public class Attribute { } } - private Type getType() { + private Type getTypeFromSerString() { String typename = parseString(); int i = typename.indexOf(','); - // fully qualified assembly name follows - // just strip it on the assumtion theat the - // assembly is referenced in the externs and the - // type will be found + /* fully qualified assembly name follows. Just strip it on the assumption that + the assembly is referenced in the externs and the type will be found. */ String name = (i < 0) ? typename : typename.substring(0, i); Type t = Type.GetType(name); if (t == null && i > 0) { @@ -358,7 +455,7 @@ public class Attribute { return arr; } - private String parseString() { + private String parseString() { // SerString convention String str = null; int length = parseLength(); if (length < 0) @@ -541,7 +638,7 @@ public class Attribute { //########################################################################## - protected static final class BoxedArgument { + public static class BoxedArgument { public final Type type; public final Object value; public BoxedArgument(Type type, Object value) { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java new file mode 100644 index 0000000000..cf30008c60 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java @@ -0,0 +1,45 @@ +package ch.epfl.lamp.compiler.msil; + +/** + * Quoting from the CIL spec, Partition II, Sec. 7.1.1: + * + * Custom modifiers, defined using `modreq` (required modifier) and `modopt` (optional modifier), are + * similar to custom attributes (Sec. 21) except that modifiers are part of a signature rather than being attached to a + * declaration. Each modifer associates a type reference with an item in the signature. + * + */ +public class CustomModifier { + + public boolean isReqd; + public Type marker; + + public CustomModifier(boolean isReqd, Type marker) { + this.isReqd = isReqd; + this.marker = marker; + } + + public String toString() { + String res = (isReqd ? "modreq( " : "modopt( ") + marker.toString() + " )"; + return res; + } + + public static Type[] helperCustomMods(boolean isReqd, CustomModifier[] cmods) { + if(cmods == null) return null; + int count = 0; + for (int idx = 0; idx < cmods.length; idx++) { + if(cmods[idx].isReqd == isReqd) count++; + } + Type[] res = new Type[count]; + int residx = 0; + for (int idx = 0; idx < cmods.length; idx++) { + res[residx] = cmods[idx].marker; + residx++; + } + return res; + } + + public static Type VolatileMarker() { + return Type.GetType("System.Runtime.CompilerServices.IsVolatile"); + } + +} diff --git a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java index 9649dabd4e..536a67e9a8 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java @@ -5,13 +5,15 @@ package ch.epfl.lamp.compiler.msil; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; + /** * Discovers the attributes of a field and provides access to field metadata. * * @author Nikolay Mihaylov * @version 1.0 */ -public class FieldInfo extends MemberInfo { +public class FieldInfo extends MemberInfo implements HasCustomModifiers { //########################################################################## // public interface @@ -24,6 +26,9 @@ public class FieldInfo extends MemberInfo { /** Type of the field represented by this FieldInfo object. */ public final Type FieldType; + /** can be null */ + public final CustomModifier[] cmods; + protected final Object value; public final boolean IsStatic() { @@ -80,6 +85,33 @@ public class FieldInfo extends MemberInfo { return (Attributes & FieldAttributes.NotSerialized) != 0; } + private boolean knownVolatile = false; + private boolean cachedVolatile = false; + public final boolean IsVolatile() { + if(knownVolatile) return cachedVolatile; + knownVolatile = true; + if(cmods == null) { + cachedVolatile = false; + return cachedVolatile; + } + for (int idx = 0; idx < cmods.length; idx++) { + if(cmods[idx].marker == CustomModifier.VolatileMarker()) { + cachedVolatile = true; + return cachedVolatile; + } + } + cachedVolatile = false; + return cachedVolatile; + } + + public final Type[] GetOptionalCustomModifiers () { + return CustomModifier.helperCustomMods(false, cmods); + } + + public final Type[] GetRequiredCustomModifiers() { + return CustomModifier.helperCustomMods(true, cmods); + } + public String toString() { return FieldAttributes.toString(Attributes) + " " + FieldType + " " + DeclaringType.FullName + "::" + Name; @@ -90,17 +122,14 @@ public class FieldInfo extends MemberInfo { protected static final FieldInfo[] EMPTY_ARRAY = new FieldInfo[0]; /** Initializes a new instance of the FieldInfo class. */ - protected FieldInfo(String name, Type declType, int attrs, Type fieldType) { - this(name, declType, attrs, fieldType, null); - } - protected FieldInfo(String name, Type declType, - int attrs, Type fieldType, Object value) + int attrs, PECustomMod fieldTypeWithMods, Object value) { - super(name, declType); - FieldType = fieldType; - Attributes = (short) attrs; - this.value = value; + super(name, declType); + FieldType = fieldTypeWithMods.marked; + cmods = fieldTypeWithMods.cmods; + Attributes = (short) attrs; + this.value = value; } /** diff --git a/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java new file mode 100644 index 0000000000..5ead087350 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java @@ -0,0 +1,9 @@ +package ch.epfl.lamp.compiler.msil; + +public interface HasCustomModifiers { + + public Type[] GetOptionalCustomModifiers(); + + public Type[] GetRequiredCustomModifiers(); + +} diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java index d6d12c8b4a..481d5f2116 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java @@ -873,10 +873,11 @@ public class PEFile { return type; } // decodeType0() - public Type decodeFieldType() { - skipByte(FIELD); - skipCustomMods(); - return decodeType(); + public PECustomMod decodeFieldType() { + skipByte(FIELD); // 0x06 + CustomModifier[] cmods = getCustomMods(); + Type fieldType = decodeType(); + return new PECustomMod(fieldType, cmods); } /** decodes the return type of a method signature (22.2.11). */ @@ -908,10 +909,10 @@ public class PEFile { } public void skipCustomMods() { - while (getByte() == ELEMENT_TYPE_CMOD_OPT - || getByte() == ELEMENT_TYPE_CMOD_REQD) + while (getByte() == ELEMENT_TYPE_CMOD_OPT /* 0x20 */ + || getByte() == ELEMENT_TYPE_CMOD_REQD /* 0x1f */ ) { - boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD); + boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD); // 0x1f // skip the tag 23.2.7 readByte(); // skip the TypeDefOrRefEncoded (23.2.8) @@ -923,7 +924,22 @@ public class PEFile { } } - //###################################################################### + /** + * @see CustomModifier + */ + public CustomModifier[] getCustomMods() { + java.util.List/*<CustomModifier>*/ cmods = new java.util.LinkedList(); + while (getByte() == ELEMENT_TYPE_CMOD_OPT || getByte() == ELEMENT_TYPE_CMOD_REQD) { + boolean isReqd = (getByte() == ELEMENT_TYPE_CMOD_REQD); + readByte(); // tag 23.2.7 + Type t = pemodule.getTypeDefOrRef(decodeInt()); // TypeDefOrRefEncoded (23.2.8) + cmods.add(new CustomModifier(isReqd, t)); + } + CustomModifier[] res = (CustomModifier[])cmods.toArray(new CustomModifier[0]); + return res; + } + + //###################################################################### } // class Sig diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java index 25e5373df1..418c6603b3 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java @@ -10,6 +10,7 @@ import ch.epfl.lamp.compiler.msil.PEFile.Sig; import ch.epfl.lamp.compiler.msil.util.Table; import ch.epfl.lamp.compiler.msil.util.Table.*; import ch.epfl.lamp.compiler.msil.util.Signature; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; import java.util.ArrayList; @@ -83,7 +84,7 @@ final class PEType extends Type implements Signature { String name = file.FieldDef.getName(); //System.out.println("\t-->Loading field: " + name); Sig sig = file.FieldDef.getSignature(); - Type fieldType = sig.decodeFieldType(); + PECustomMod pecmod = sig.decodeFieldType(); Object val = null; Table.Constant consts = file.Constant; for (int i = 1; i <= consts.rows; i++) { @@ -93,10 +94,8 @@ final class PEType extends Type implements Signature { if (tableId == Table.FieldDef.ID && refRow == frow) val = consts.getValue(); } - FieldInfo field = - new PEFieldInfo(row, name, attrs, fieldType, val); - if (field.Name.equals("value__") && field.IsSpecialName()) - { + FieldInfo field = new PEFieldInfo(row, name, attrs, pecmod, val); + if (field.Name.equals("value__") && field.IsSpecialName()) { assert underlyingType == null : underlyingType.toString(); underlyingType = field.FieldType; } @@ -158,8 +157,7 @@ final class PEType extends Type implements Signature { //System.out.println("Retval attributes 0x" + // PEFile.short2hex(pattr)); } else { - params[seq - 1] = new ParameterInfo - (paramName, paramType[seq - 1], pattr, seq - 1); + params[seq - 1] = new ParameterInfo(paramName, paramType[seq - 1], pattr, seq - 1); } } for (int i = 0; i < params.length; i++) { @@ -351,9 +349,9 @@ final class PEType extends Type implements Signature { private class PEFieldInfo extends FieldInfo { private final int definingRow; public PEFieldInfo(int definingRow, String name, - int attrs, Type fieldType, Object value) + int attrs, PECustomMod pecmod, Object value) { - super(name, PEType.this, attrs, fieldType, value); + super(name, PEType.this, attrs, pecmod, value); this.definingRow = definingRow; } protected void loadCustomAttributes(Type attributeType) { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java index ccca52edba..b19fe29869 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java @@ -1,5 +1,7 @@ package ch.epfl.lamp.compiler.msil; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; + public final class PrimitiveType extends Type { public PrimitiveType(Module module, int attributes, @@ -31,7 +33,8 @@ public final class PrimitiveType extends Type { } public FieldInfo addField(String name, int attrs, Type fieldType) { - FieldInfo res = new FieldInfo(name, this, attrs, fieldType); + PECustomMod fieldTypeWithMods = new PECustomMod(fieldType, null); + FieldInfo res = new FieldInfo(name, this, attrs, fieldTypeWithMods, null); FieldInfo[] ms = new FieldInfo[fields.length + 1]; System.arraycopy(fields, 0, ms, 0, fields.length); ms[ms.length - 1] = res; diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Type.java b/src/msil/ch/epfl/lamp/compiler/msil/Type.java index b2489ab66e..830632ce45 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/Type.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/Type.java @@ -315,6 +315,18 @@ public abstract class Type extends MemberInfo { return false; } + public boolean IsNestedType() { + return DeclaringType != null; + } + + public boolean IsDefinitelyInternal() { + if(IsNestedType()) { + return IsNestedPrivate(); + } else { + return IsNotPublic(); + } + } + //public final boolean IsCOMObject; //public final boolean IsContextful; //public final boolean IsMarshalByRef; diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala index 3ea06382e5..7ef9dc7a5b 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala @@ -9,6 +9,9 @@ import ch.epfl.lamp.compiler.msil.FieldInfo import ch.epfl.lamp.compiler.msil.Type import ch.epfl.lamp.compiler.msil.FieldAttributes import ch.epfl.lamp.compiler.msil.ConstructorInfo + +import ch.epfl.lamp.compiler.msil.util.PECustomMod + import java.io.IOException /** @@ -17,8 +20,8 @@ import java.io.IOException * @author Nikolay Mihaylov * @version 1.0 */ -class FieldBuilder(name: String, declType: Type, attrs: Int, fieldType: Type) - extends FieldInfo(name, declType, attrs, fieldType) +class FieldBuilder(name: String, declType: Type, attrs: Int, fieldTypeWithMods: PECustomMod) + extends FieldInfo(name, declType, attrs, fieldTypeWithMods, null) with ICustomAttributeSetter with Visitable { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala index 73bc0f435c..d3a57194da 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala @@ -271,7 +271,7 @@ abstract class ILPrinterVisitor extends Visitor { // [[int32]] <fieldAttr>* <type> <id> [= <fieldInit> | at <dataLabel>] print(".field ") print(FieldAttributes.toString(field.Attributes)) - print(" "); printSignature(field.FieldType) + print(" "); printSignature(field.FieldType, field.cmods) print(" \'"); print(field.Name); print("\'") if (field.IsLiteral()) { print(" = ") @@ -608,16 +608,16 @@ abstract class ILPrinterVisitor extends Visitor { } - def printSignature(field: FieldInfo) { - printSignature(field.FieldType) - //print(' ') print(owner) - print(' ') - //if (field.IsStatic && field.DeclaringType != currentType) { - printReference(field.DeclaringType) - print("::") - //} - printName(field.Name) - } + def printSignature(field: FieldInfo) { + printSignature(field.FieldType, field.cmods) + //print(' ') print(owner) + print(' ') + //if (field.IsStatic && field.DeclaringType != currentType) { + printReference(field.DeclaringType) + print("::") + //} + printName(field.Name) + } // print method head @throws(classOf[IOException]) @@ -670,7 +670,19 @@ abstract class ILPrinterVisitor extends Visitor { print(")") } - def printSignature(`type`: Type) { + def printSignature(marked: Type, cmods: Array[CustomModifier]) { + printSignature(marked) + if( (cmods != null) && !cmods.isEmpty ) { + print(" ") + for(cm <- cmods) { + print(if (cm.isReqd) "modreq( " else "modopt( ") + printReference(cm.marker) + print(" ) ") + } + } + } + + def printSignature(`type`: Type) { val sigOpt = primitive.get(`type`) if (sigOpt.isDefined) { print(sigOpt.get) diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala index 663b2c5cb0..5126a0c34d 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala @@ -6,6 +6,9 @@ package ch.epfl.lamp.compiler.msil.emit import ch.epfl.lamp.compiler.msil._ + +import ch.epfl.lamp.compiler.msil.util.PECustomMod + import java.io.IOException /** @@ -38,15 +41,22 @@ class TypeBuilder (module: Module, attributes: Int, fullName: String, baseType: } /** - * Adds a new field to the class, with the given name, - * attributes and field type. + * Adds a new field to the class, with the given name, attributes and field type. The location has no custom mods. */ - def DefineField(name: String, `type`: Type, attrs: Short): FieldBuilder = { - val field: FieldBuilder = new FieldBuilder(name, this, attrs, `type`) - fieldBuilders += field - return field + def DefineField(name: String, fieldType: Type, attrs: Short): FieldBuilder = { + val fieldTypeWithCustomMods = new PECustomMod(fieldType, null) + DefineField(name, fieldTypeWithCustomMods, attrs) } + /** + * Adds a new field to the class, with the given name, attributes and (field type , custom mods) combination. + */ + def DefineField(name: String, fieldTypeWithMods: PECustomMod, attrs: Short): FieldBuilder = { + val field: FieldBuilder = new FieldBuilder(name, this, attrs, fieldTypeWithMods) + fieldBuilders += field + return field + } + /** * Adds a new method to the class, with the given name and * method signature. diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java new file mode 100644 index 0000000000..56519e8487 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java @@ -0,0 +1,23 @@ +package ch.epfl.lamp.compiler.msil.util; + +import ch.epfl.lamp.compiler.msil.Type; +import ch.epfl.lamp.compiler.msil.CustomModifier; + +/** + * A PECustomMod holds the info parsed from metadata per the CustomMod production in Sec. 23.2.7, Partition II. + * */ +public final class PECustomMod { + + public final Type marked; + public final CustomModifier[] cmods; + + /** Terminology: + the CustomModifier(s) are markers, + and the msil.Type is a type marked by those markers. */ + public PECustomMod(Type marked, CustomModifier[] cmods) { + this.marked = marked; + this.cmods = cmods; + } + +} + diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java index ef043875ec..649d9e74f2 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java @@ -152,7 +152,7 @@ public final class PEStream implements Signature { assert length == 2 : "length == " + length; return new Character(buffer.getChar()); case ELEMENT_TYPE_I1: - case ELEMENT_TYPE_U1: + case ELEMENT_TYPE_U1: // TODO U1 not the same as I1 assert length == 1; return new Byte(buffer.get()); case ELEMENT_TYPE_I2: diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java index 119d9e6ba3..1f43b8c2fa 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java @@ -1615,7 +1615,7 @@ public abstract class Table { public int Number; public int Flags; - public int Owner; // a TypeOrMethodDef (§24.2.6) coded index + public int Owner; // a TypeOrMethodDef (Sec 24.2.6) coded index public int Name; // a non-null index into the String heap private java.util.Map /*<Integer, java.util.Set<Integer>>*/ GenericParamIdxesForMethodDefIdx = @@ -1760,7 +1760,7 @@ public abstract class Table { public static final int ID = 0x2c; public int Owner; // an index into the GenericParam table - public int Constraint; // a TypeDefOrRef (§24.2.6) coded index + public int Constraint; // a TypeDefOrRef (Sec 24.2.6) coded index public GenericParamConstraint(PEFile file, int rows) { super(file, ID, rows); diff --git a/src/partest/scala/tools/partest/PartestTask.scala b/src/partest/scala/tools/partest/PartestTask.scala index f1b3ea496d..1a75621d4d 100644 --- a/src/partest/scala/tools/partest/PartestTask.scala +++ b/src/partest/scala/tools/partest/PartestTask.scala @@ -19,7 +19,6 @@ import util.PathResolver import scala.tools.ant.sabbus.CompilationPathProperty import java.io.File -import java.net.URLClassLoader import java.lang.reflect.Method import org.apache.tools.ant.Task diff --git a/src/partest/scala/tools/partest/ReplTest.scala b/src/partest/scala/tools/partest/ReplTest.scala index 2f6bcea78b..b31c43ba6f 100644 --- a/src/partest/scala/tools/partest/ReplTest.scala +++ b/src/partest/scala/tools/partest/ReplTest.scala @@ -5,6 +5,7 @@ package scala.tools.partest +import scala.tools.nsc.Settings import scala.tools.nsc.interpreter.ILoop import java.lang.reflect.{ Method => JMethod, Field => JField } @@ -13,7 +14,8 @@ import java.lang.reflect.{ Method => JMethod, Field => JField } */ abstract class ReplTest extends App { def code: String - def eval() = (ILoop run code).lines drop 1 + def settings: Settings = new Settings // override for custom settings + def eval() = ILoop.runForTranscript(code, settings).lines drop 1 def show() = eval() foreach println show() diff --git a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala index 4182cc78b8..02edf0fc31 100644 --- a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala +++ b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala @@ -166,6 +166,7 @@ class ConsoleFileManager extends FileManager { var latestCompFile: File = _ var latestPartestFile: File = _ var latestFjbgFile: File = _ + def latestScalapFile: File = (latestLibFile.parent / "scalap.jar").jfile var testClassesDir: Directory = _ // initialize above fields findLatest() diff --git a/src/partest/scala/tools/partest/nest/PathSettings.scala b/src/partest/scala/tools/partest/nest/PathSettings.scala index b02417a50c..7461b45fee 100644 --- a/src/partest/scala/tools/partest/nest/PathSettings.scala +++ b/src/partest/scala/tools/partest/nest/PathSettings.scala @@ -10,7 +10,6 @@ import scala.tools.nsc.util.ClassPath import scala.tools.nsc.io import io.{ Path, File, Directory } import RunnerUtils._ -import java.net.URLClassLoader object PathSettings { import PartestDefaults.{ testRootDir, srcDirName } diff --git a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala index b0aa56f9ff..f39debf31d 100644 --- a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala +++ b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala @@ -48,9 +48,9 @@ class ReflectiveRunner { new ConsoleFileManager import fileManager. - { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile } + { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile } val files = - Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile) map (x => io.File(x)) + Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile) map (x => io.File(x)) val sepUrls = files map (_.toURL) val sepLoader = new URLClassLoader(sepUrls, null) diff --git a/src/partest/scala/tools/partest/nest/Worker.scala b/src/partest/scala/tools/partest/nest/Worker.scala index afbdfdba83..301fe5e32b 100644 --- a/src/partest/scala/tools/partest/nest/Worker.scala +++ b/src/partest/scala/tools/partest/nest/Worker.scala @@ -9,7 +9,7 @@ package scala.tools.partest package nest import java.io._ -import java.net.{ URLClassLoader, URL } +import java.net.URL import java.util.{ Timer, TimerTask } import scala.util.Properties.{ isWin } @@ -285,25 +285,7 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor */ def runCommand(command: String, outFile: File): Boolean = { NestUI.verbose("running command:\n"+command) - - // This is laboriously avoiding #> since it swallows exit failure code. - // To be revisited. XXX. - val out = new StringBuilder - val err = new StringBuilder - val errorLogger = ProcessLogger(x => err append (x + "\n")) - val pio = BasicIO( - false, - x => out append (x + "\n"), - Some(errorLogger) - ) - val process = Process(command) run pio - val code = process.exitValue() - SFile(outFile) writeAll out.toString - - (code == 0) || { - SFile(outFile).appendAll(command + " failed with code: " + code + "\n", err.toString) - false - } + (command #> outFile !) == 0 } def execTest(outDir: File, logFile: File, classpathPrefix: String = ""): Boolean = { @@ -842,35 +824,31 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor case "scalap" => runInContext(file, (logFile: File, outDir: File) => { - val sourceDir = file.getParentFile - val sourceDirName = sourceDir.getName - - // 1. Find file with result text - val results = sourceDir.listFiles(new FilenameFilter { - def accept(dir: File, name: String) = name == "result.test" - }) + val sourceDir = Directory(if (file.isFile) file.getParent else file) + val sources = sourceDir.files filter (_ hasExtension "scala") map (_.jfile) toList + val results = sourceDir.files filter (_.name == "result.test") map (_.jfile) toList - if (results.length != 1) { - NestUI.verbose("Result file not found in directory " + sourceDirName + " \n") + if (sources.length != 1 || results.length != 1) { + NestUI.warning("Misconfigured scalap test directory: " + sourceDir + " \n") false } else { - val resFile = results(0) + val resFile = results.head // 2. Compile source file - if (!compileMgr.shouldCompile(outDir, List(file), kind, logFile)) { - NestUI.verbose("compilerMgr failed to compile %s to %s".format(file, outDir)) + if (!compileMgr.shouldCompile(outDir, sources, kind, logFile)) { + NestUI.normal("compilerMgr failed to compile %s to %s".format(sources mkString ", ", outDir)) false } else { // 3. Decompile file and compare results - val isPackageObject = sourceDir.getName.startsWith("package") - val className = sourceDirName.capitalize + (if (!isPackageObject) "" else ".package") - val url = outDir.toURI.toURL - val loader = new URLClassLoader(Array(url), getClass.getClassLoader) - val clazz = loader.loadClass(className) + val isPackageObject = sourceDir.name startsWith "package" + val className = sourceDir.name.capitalize + (if (!isPackageObject) "" else ".package") + val url = outDir.toURI.toURL + val loader = ScalaClassLoader.fromURLs(List(url), this.getClass.getClassLoader) + val clazz = loader.loadClass(className) val byteCode = ByteCode.forClass(clazz) - val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject) + val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject) SFile(logFile) writeAll result diffCheck(compareFiles(logFile, resFile)) @@ -951,10 +929,12 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor wr.flush() swr.flush() NestUI.normal(swr.toString) - if (isFail && (fileManager.showDiff || isPartestDebug) && diff != "") - NestUI.normal(diff) - if (isFail && fileManager.showLog) - showLog(logFile) + if (isFail) { + if ((fileManager.showDiff || isPartestDebug) && diff != "") + NestUI.normal(diff) + else if (fileManager.showLog) + showLog(logFile) + } } cleanup() } diff --git a/src/scalap/scala/tools/scalap/Decode.scala b/src/scalap/scala/tools/scalap/Decode.scala index c8bb58c81e..816041720f 100644 --- a/src/scalap/scala/tools/scalap/Decode.scala +++ b/src/scalap/scala/tools/scalap/Decode.scala @@ -33,7 +33,7 @@ object Decode { */ def scalaSigBytes(name: String): Option[Array[Byte]] = scalaSigBytes(name, getSystemLoader()) def scalaSigBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = { - val bytes = classLoader.findBytesForClassName(name) + val bytes = classLoader.classBytes(name) val reader = new ByteArrayReader(bytes) val cf = new Classfile(reader) cf.scalaSigAttribute map (_.data) @@ -43,7 +43,7 @@ object Decode { */ def scalaSigAnnotationBytes(name: String): Option[Array[Byte]] = scalaSigAnnotationBytes(name, getSystemLoader()) def scalaSigAnnotationBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = { - val bytes = classLoader.findBytesForClassName(name) + val bytes = classLoader.classBytes(name) val byteCode = ByteCode(bytes) val classFile = ClassFileParser.parse(byteCode) import classFile._ diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala index 2a2716ba20..9ddb521a10 100644 --- a/src/scalap/scala/tools/scalap/Main.scala +++ b/src/scalap/scala/tools/scalap/Main.scala @@ -5,50 +5,33 @@ ** */ - package scala.tools.scalap -import java.io.{PrintStream, OutputStreamWriter, ByteArrayOutputStream} +import java.io.{ PrintStream, OutputStreamWriter, ByteArrayOutputStream } import scalax.rules.scalasig._ import tools.nsc.util.{ ClassPath, JavaClassPath } import tools.util.PathResolver import ClassPath.DefaultJavaContext -import tools.nsc.io.{PlainFile, AbstractFile} +import tools.nsc.io.{ PlainFile, AbstractFile } /**The main object used to execute scalap on the command-line. * * @author Matthias Zenger, Stephane Micheloud, Burak Emir, Ilya Sergey */ -object Main { - val SCALA_SIG = "ScalaSig" +class Main { + val SCALA_SIG = "ScalaSig" val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;" - val BYTES_VALUE = "bytes" + val BYTES_VALUE = "bytes" - val versionMsg = "Scala classfile decoder " + - Properties.versionString + " -- " + - Properties.copyrightString + "\n" + val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString) /**Verbose program run? */ var verbose = false var printPrivates = false - /**Prints usage information for scalap. - */ - def usage { - Console.println("usage: scalap {<option>} <name>") - Console.println("where <name> is fully-qualified class name or <package_name>.package for package objects") - Console.println("and <option> is") - Console.println(" -private print private definitions") - Console.println(" -verbose print out additional information") - Console.println(" -version print out the version number of scalap") - Console.println(" -help display this usage message") - Console.println(" -classpath <path> specify where to find user class files") - Console.println(" -cp <path> specify where to find user class files") - } - def isScalaFile(bytes: Array[Byte]): Boolean = { - val byteCode = ByteCode(bytes) + val byteCode = ByteCode(bytes) val classFile = ClassFileParser.parse(byteCode) classFile.attribute("ScalaSig").isDefined } @@ -69,11 +52,12 @@ object Main { def isPackageObjectFile(s: String) = s != null && (s.endsWith(".package") || s == "package") def parseScalaSignature(scalaSig: ScalaSig, isPackageObject: Boolean) = { - val baos = new ByteArrayOutputStream + val baos = new ByteArrayOutputStream val stream = new PrintStream(baos) - val syms = scalaSig.topLevelClasses ::: scalaSig.topLevelObjects + val syms = scalaSig.topLevelClasses ++ scalaSig.topLevelObjects + syms.head.parent match { - //Partial match + // Partial match case Some(p) if (p.name != "<empty>") => { val path = p.path if (!isPackageObject) { @@ -93,9 +77,7 @@ object Main { } // Print classes val printer = new ScalaSigPrinter(stream, printPrivates) - for (c <- syms) { - printer.printSymbol(c) - } + syms foreach (printer printSymbol _) baos.toString } @@ -109,12 +91,8 @@ object Main { } } - /**Executes scalap with the given arguments and classpath for the - * class denoted by <code>classname</code>. - * - * @param args... - * @param path... - * @param classname... + /** Executes scalap with the given arguments and classpath for the + * class denoted by `classname`. */ def process(args: Arguments, path: ClassPath[AbstractFile])(classname: String): Unit = { // find the classfile @@ -139,136 +117,9 @@ object Main { } // if the class corresponds to the artificial class scala.Any. // (see member list in class scala.tool.nsc.symtab.Definitions) - } else if (classname == "scala.Any") { - Console.println("package scala") - Console.println("class Any {") - Console.println(" final def ==(scala.Any): scala.Boolean") - Console.println(" final def !=(scala.Any): Boolean") - Console.println(" def equals(scala.Any): scala.Boolean") - Console.println(" def hashCode(): scala.Int") - Console.println(" def toString(): java.lang.String") - Console.println(" final def isInstanceOf[a]: scala.Boolean") - Console.println(" final def asInstanceOf[a]: a") - Console.println("}") - // if the class corresponds to the artificial class scala.AnyRef. - } else if (classname == "scala.AnyRef") { - Console.println("package scala") - Console.println("class AnyRef extends Any {") - Console.println(" def equals(scala.Any): scala.Boolean") - Console.println(" def hashCode(): scala.Int") - Console.println(" def toString(): java.lang.String") - Console.println("}") - // if the class corresponds to the artificial class scala.AnyVal. - } else if (classname == "scala.AnyVal") { - Console.println("package scala") - Console.println("sealed class AnyVal extends Any") - // if the class corresponds to the artificial class scala.Boolean. - } else if (classname == "scala.Boolean") { - Console.println("package scala") - Console.println("sealed abstract class Boolean extends AnyVal {") - Console.println(" def &&(p: => scala.Boolean): scala.Boolean // boolean and") - Console.println(" def ||(p: => scala.Boolean): scala.Boolean // boolean or") - Console.println(" def & (x: scala.Boolean): scala.Boolean // boolean strict and") - Console.println(" def | (x: scala.Boolean): scala.Boolean // boolean stric or") - Console.println(" def ==(x: scala.Boolean): scala.Boolean // boolean equality") - Console.println(" def !=(x: scala.Boolean): scala.Boolean // boolean inequality") - Console.println(" def !: scala.Boolean // boolean negation") - Console.println("}") - // if the class corresponds to the artificial class scala.Int. - } else if (classname == "scala.Int") { - Console.println("package scala") - Console.println("sealed abstract class Int extends AnyVal {") - Console.println(" def ==(that: scala.Double): scala.Boolean") - Console.println(" def ==(that: scala.Float): scala.Boolean") - Console.println(" def ==(that: scala.Long): scala.Boolean") - Console.println(" def ==(that: scala.Int): scala.Boolean") - Console.println(" def ==(that: scala.Short): scala.Boolean") - Console.println(" def ==(that: scala.Byte): scala.Boolean") - Console.println(" def ==(that: scala.Char): scala.Boolean") - Console.println(" /* analogous for !=, <, >, <=, >= */") - Console.println - Console.println(" def + (that: scala.Double): scala.Double // double addition") - Console.println(" def + (that: scala.Float): scala.Float // float addition") - Console.println(" def + (that: scala.Long): scala.Long // long addition") - Console.println(" def + (that: scala.Int): scala.Int // int addition") - Console.println(" def + (that: scala.Short): scala.Int // int addition") - Console.println(" def + (that: scala.Byte): scala.Int // int addition") - Console.println(" def + (that: scala.Char): scala.Int // int addition") - Console.println(" /* analogous for -, *, /, % */") - Console.println - Console.println(" def & (that: scala.Long): scala.Long // long bitwise and") - Console.println(" def & (that: scala.Int): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Short): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Byte): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Char): scala.Int // int bitwise and") - Console.println(" /* analogous for |, ^ */") - Console.println - Console.println(" def <<(cnt: scala.Int): scala.Int // int left shift") - Console.println(" def <<(cnt: scala.Long): scala.Int // long left shift") - Console.println(" /* analogous for >>, >>> */") - Console.println - Console.println(" def + : scala.Int // int identity") - Console.println(" def - : scala.Int // int negation") - Console.println(" def ~ : scala.Int // int bitwise negation") - Console.println - Console.println(" def toByte: scala.Byte // convert to Byte") - Console.println(" def toShort: scala.Short // convert to Short") - Console.println(" def toChar: scala.Char // convert to Char") - Console.println(" def toInt: scala.Int // convert to Int") - Console.println(" def toLong: scala.Long // convert to Long") - Console.println(" def toFloat: scala.Float // convert to Float") - Console.println(" def toDouble: scala.Double // convert to Double") - Console.println("}") - // if the class corresponds to the artificial class scala.Nothing. - } else if (classname == "scala.Nothing") { - Console.println("package scala") - Console.println("sealed abstract class Nothing") - // if the class corresponds to the artificial class scala.Null. - } else if (classname == "scala.Null") { - Console.println("package scala") - Console.println("sealed abstract class Null") - } else - Console.println("class/object " + classname + " not found.") - } - - /**The main method of this object. - */ - def main(args: Array[String]) { - // print usage information if there is no command-line argument - if (args.length == 0) - usage - // otherwise parse the arguments... - else { - val arguments = Arguments.Parser('-') - .withOption("-private") - .withOption("-verbose") - .withOption("-version") - .withOption("-help") - .withOptionalArg("-classpath") - .withOptionalArg("-cp") - .parse(args); - if (arguments contains "-version") - Console.println(versionMsg) - if (arguments contains "-help") - usage - verbose = arguments contains "-verbose" - printPrivates = arguments contains "-private" - // construct a custom class path - def cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _) - val path = cparg match { - case Some(cpstring) => - new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cpstring), DefaultJavaContext) - - case None => - PathResolver.fromPathString("") - } - // print the classpath if output is verbose - if (verbose) - Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path) - - // process all given classes - arguments.getOthers.foreach(process(arguments, path)) } + else + Console.println("class/object " + classname + " not found.") } object EmptyClasspath extends ClassPath[AbstractFile] { @@ -284,3 +135,55 @@ object Main { val sourcepaths: List[AbstractFile] = Nil } } + +object Main extends Main { + /** Prints usage information for scalap. */ + def usage() { + Console println """ + |Usage: scalap {<option>} <name> + |where <name> is fully-qualified class name or <package_name>.package for package objects + |and <option> is + | -private print private definitions + | -verbose print out additional information + | -version print out the version number of scalap + | -help display this usage message + | -classpath <path> specify where to find user class files + | -cp <path> specify where to find user class files + """.stripMargin.trim + } + + def main(args: Array[String]) { + // print usage information if there is no command-line argument + if (args.isEmpty) + return usage() + + val arguments = Arguments.Parser('-') + .withOption("-private") + .withOption("-verbose") + .withOption("-version") + .withOption("-help") + .withOptionalArg("-classpath") + .withOptionalArg("-cp") + .parse(args); + + if (arguments contains "-version") + Console.println(versionMsg) + if (arguments contains "-help") + usage() + + verbose = arguments contains "-verbose" + printPrivates = arguments contains "-private" + // construct a custom class path + val cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _) + val path = cparg match { + case Some(cp) => new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cp), DefaultJavaContext) + case _ => PathResolver.fromPathString("") + } + // print the classpath if output is verbose + if (verbose) + Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path) + + // process all given classes + arguments.getOthers foreach process(arguments, path) + } +} diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala index 170a9a15a3..995c629b5d 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala @@ -253,9 +253,11 @@ object ScalaSigEntryParsers extends RulesWithState with MemoisableRules { 18 -~ classSymRef ~ (typeRef*) ^~^ RefinedType, 19 -~ symbolRef ~ (typeRef*) ^~^ ClassInfoType, 20 -~ typeRef ~ (symbolRef*) ^~^ MethodType, - 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType, // TODO: make future safe for past by doing the same transformation as in the full unpickler in case we're reading pre-2.9 classfiles + 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType, + // TODO: make future safe for past by doing the same transformation as in the + // full unpickler in case we're reading pre-2.9 classfiles 21 -~ typeRef ^^ NullaryMethodType, - 22 -~ typeRef ~ (symbolRef*) ^~^ ImplicitMethodType, + 22 -~ typeRef ~ (symbolRef*) ^~^ MethodType, 42 -~ typeRef ~ (attribTreeRef*) ^~^ AnnotatedType, 51 -~ typeRef ~ symbolRef ~ (attribTreeRef*) ^~~^ AnnotatedWithSelfType, 47 -~ typeLevel ~ typeIndex ^~^ DeBruijnIndexType, diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala index acaf64df2a..93c1c7a394 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala @@ -205,16 +205,17 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { case ms: MethodSymbol => ms.name + " : " + toString(ms.infoType)(TypeFlags(true)) case _ => "^___^" }) + val implicitWord = mt.paramSymbols.headOption match { + case Some(p) if p.isImplicit => "implicit " + case _ => "" + } // Print parameter clauses - print(paramEntries.mkString( - "(" + (mt match {case _: ImplicitMethodType => "implicit "; case _ => ""}) - , ", ", ")")) + print(paramEntries.mkString("(" + implicitWord, ", ", ")")) // Print result type mt.resultType match { case mt: MethodType => printMethodType(mt, printResult)({}) - case imt: ImplicitMethodType => printMethodType(imt, printResult)({}) case x => if (printResult) { print(" : "); printType(x) @@ -225,7 +226,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { t match { case NullaryMethodType(resType) => if (printResult) { print(" : "); printType(resType) } case mt@MethodType(resType, paramSymbols) => _pmt(mt) - case mt@ImplicitMethodType(resType, paramSymbols) => _pmt(mt) case pt@PolyType(mt, typeParams) => { print(typeParamString(typeParams)) printMethodType(mt, printResult)({}) @@ -373,7 +373,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { case ClassInfoTypeWithCons(symbol, typeRefs, cons) => sep + typeRefs.map(toString). mkString(cons + " extends ", " with ", "") - case ImplicitMethodType(resultType, _) => toString(resultType, sep) case MethodType(resultType, _) => toString(resultType, sep) case NullaryMethodType(resultType) => toString(resultType, sep) diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala index 3658cb1c89..543ddbe186 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala @@ -20,7 +20,6 @@ case class MethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Typ case class NullaryMethodType(resultType : Type) extends Type case class PolyType(typeRef : Type, symbols : Seq[TypeSymbol]) extends Type case class PolyTypeWithCons(typeRef : Type, symbols : Seq[TypeSymbol], cons: String) extends Type -case class ImplicitMethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Type case class AnnotatedType(typeRef : Type, attribTreeRefs : List[Int]) extends Type case class AnnotatedWithSelfType(typeRef : Type, symbol : Symbol, attribTreeRefs : List[Int]) extends Type case class DeBruijnIndexType(typeLevel : Int, typeIndex : Int) extends Type diff --git a/src/swing/scala/swing/ComboBox.scala b/src/swing/scala/swing/ComboBox.scala index 69cfa6988f..75f981064b 100644 --- a/src/swing/scala/swing/ComboBox.scala +++ b/src/swing/scala/swing/ComboBox.scala @@ -122,7 +122,7 @@ object ComboBox { def newConstantModel[A](items: Seq[A]): ComboBoxModel = { new AbstractListModel with ComboBoxModel { - private var selected = items(0) + private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0) def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef] def setSelectedItem(a: Any) { if ((selected != null && selected != a) || diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala index 3cbe2dbfd1..b7a93ef448 100644 --- a/src/swing/scala/swing/Component.scala +++ b/src/swing/scala/swing/Component.scala @@ -103,7 +103,7 @@ abstract class Component extends UIElement { def tooltip_=(t: String) = peer.setToolTipText(t) def inputVerifier: Component => Boolean = { a => - peer.getInputVerifier.verify(a.peer) + Option(peer.getInputVerifier) forall (_ verify a.peer) } def inputVerifier_=(v: Component => Boolean) { peer.setInputVerifier(new javax.swing.InputVerifier { diff --git a/src/swing/scala/swing/TextField.scala b/src/swing/scala/swing/TextField.scala index d2a9f150a2..f04e122fb9 100644 --- a/src/swing/scala/swing/TextField.scala +++ b/src/swing/scala/swing/TextField.scala @@ -60,15 +60,15 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom peer.removeActionListener(actionListener) } - def verifier: String => Boolean = s => peer.getInputVerifier.verify(peer) + def verifier: String => Boolean = s => Option(peer.getInputVerifier) forall (_ verify peer) def verifier_=(v: String => Boolean) { peer.setInputVerifier(new InputVerifier { - private val old = peer.getInputVerifier + private val old = Option(peer.getInputVerifier) def verify(c: JComponent) = v(text) - override def shouldYieldFocus(c: JComponent) = old.shouldYieldFocus(c) + override def shouldYieldFocus(c: JComponent) = old forall (_ shouldYieldFocus c) }) } - def shouldYieldFocus: String=>Boolean = s => peer.getInputVerifier.shouldYieldFocus(peer) + def shouldYieldFocus: String => Boolean = s => Option(peer.getInputVerifier) forall (_ shouldYieldFocus peer) def shouldYieldFocus_=(y: String=>Boolean) { peer.setInputVerifier(new InputVerifier { private val old = peer.getInputVerifier diff --git a/test/files/presentation/simple-tests/SimpleInteractiveTest.scala b/test/disabled/presentation/simple-tests/SimpleInteractiveTest.scala index 014fd24b6f..014fd24b6f 100644 --- a/test/files/presentation/simple-tests/SimpleInteractiveTest.scala +++ b/test/disabled/presentation/simple-tests/SimpleInteractiveTest.scala diff --git a/test/files/presentation/simple-tests/src/Tester.scala b/test/disabled/presentation/simple-tests/src/Tester.scala index cb62187514..cb62187514 100644 --- a/test/files/presentation/simple-tests/src/Tester.scala +++ b/test/disabled/presentation/simple-tests/src/Tester.scala diff --git a/test/files/run/bug4279.scala b/test/disabled/run/bug4279.scala index 89a27fc065..d0afc3a032 100644 --- a/test/files/run/bug4279.scala +++ b/test/disabled/run/bug4279.scala @@ -32,7 +32,7 @@ object Test { // warmup { val r = new Runner(1000000, 10) ; r.straightSlice ; r.iteratorSlice ; r.viewSlice } - new Runner(10000000, 10) run 100 - new Runner(10000000, 50) run 50 + new Runner(10000000, 10) run 500 + new Runner(10000000, 50) run 300 } } diff --git a/test/files/script/fact.args b/test/disabled/script/fact.args index 7ed6ff82de..7ed6ff82de 100644 --- a/test/files/script/fact.args +++ b/test/disabled/script/fact.args diff --git a/test/files/script/fact.bat b/test/disabled/script/fact.bat index bee0ba25c6..bee0ba25c6 100755 --- a/test/files/script/fact.bat +++ b/test/disabled/script/fact.bat diff --git a/test/files/script/fact.check b/test/disabled/script/fact.check index 22aa60821e..22aa60821e 100644 --- a/test/files/script/fact.check +++ b/test/disabled/script/fact.check diff --git a/test/files/script/fact.scala b/test/disabled/script/fact.scala index d48dac6f0f..d48dac6f0f 100755 --- a/test/files/script/fact.scala +++ b/test/disabled/script/fact.scala diff --git a/test/files/script/second.bat b/test/disabled/script/second.bat index 0d7085954d..0d7085954d 100755 --- a/test/files/script/second.bat +++ b/test/disabled/script/second.bat diff --git a/test/files/script/second.check b/test/disabled/script/second.check index a105b862a1..a105b862a1 100644 --- a/test/files/script/second.check +++ b/test/disabled/script/second.check diff --git a/test/files/script/second.scala b/test/disabled/script/second.scala index 48b8d73815..48b8d73815 100755 --- a/test/files/script/second.scala +++ b/test/disabled/script/second.scala diff --git a/test/files/script/t1015.bat b/test/disabled/script/t1015.bat index 7475313d7e..7475313d7e 100755 --- a/test/files/script/t1015.bat +++ b/test/disabled/script/t1015.bat diff --git a/test/files/script/t1015.scala b/test/disabled/script/t1015.scala index 52d67bd6cc..52d67bd6cc 100755 --- a/test/files/script/t1015.scala +++ b/test/disabled/script/t1015.scala diff --git a/test/files/script/t1017.bat b/test/disabled/script/t1017.bat index 369dbd2aca..369dbd2aca 100755 --- a/test/files/script/t1017.bat +++ b/test/disabled/script/t1017.bat diff --git a/test/files/script/t1017.scala b/test/disabled/script/t1017.scala index d1b43ea923..d1b43ea923 100755 --- a/test/files/script/t1017.scala +++ b/test/disabled/script/t1017.scala diff --git a/test/files/jvm/interpreter.check b/test/files/jvm/interpreter.check index 3c0ee7b4bd..dd0f39551c 100644 --- a/test/files/jvm/interpreter.check +++ b/test/files/jvm/interpreter.check @@ -2,222 +2,360 @@ Type in expressions to have them evaluated. Type :help for more information. scala> -scala> -scala> res0: Int = 7 -scala> | | | | gcd: (x: Int,y: Int)Int +scala> // basics + +scala> 3+4 +res0: Int = 7 -scala> five: Int = 5 +scala> def gcd(x: Int, y: Int): Int = { + if (x == 0) y + else if (y == 0) x + else gcd(y%x, x) +} +gcd: (x: Int,y: Int)Int -scala> x: Int = 1 +scala> val five = gcd(15,35) +five: Int = 5 -scala> x: Int = 2 +scala> var x = 1 +x: Int = 1 -scala> three: Int = 3 +scala> x = 2 +x: Int = 2 -scala> defined type alias anotherint +scala> val three = x+1 +three: Int = 3 -scala> four: anotherint = 4 +scala> type anotherint = Int +defined type alias anotherint -scala> <console>:8: error: type mismatch; +scala> val four: anotherint = 4 +four: anotherint = 4 + +scala> val bogus: anotherint = "hello" +<console>:8: error: type mismatch; found : java.lang.String("hello") required: anotherint val bogus: anotherint = "hello" ^ -scala> defined trait PointlessTrait +scala> trait PointlessTrait +defined trait PointlessTrait -scala> x: Int = 2 +scala> val (x,y) = (2,3) +x: Int = 2 y: Int = 3 -scala> hello +scala> println("hello") +hello scala> -scala> -scala> t1513: Array[Null] = Array(null) -scala> -scala> atom: scala.xml.Atom[Unit] = () +scala> // ticket #1513 -scala> -scala> defined class S +scala> val t1513 = Array(null) +t1513: Array[Null] = Array(null) -scala> fish: S = fish +scala> // ambiguous toString problem from #547 -scala> -scala> arr: Array[java.lang.String] = Array(What's, up, doc?) +scala> val atom = new scala.xml.Atom() +atom: scala.xml.Atom[Unit] = () -scala> -scala> arrInt: Any = Array(1, 2, 3) +scala> // overriding toString problem from #1404 -scala> -scala> arrArrInt: Any = Array(Array(1, 2), Array(3, 4)) +scala> class S(override val toString : String) +defined class S -scala> -scala> -scala> defined class Foo +scala> val fish = new S("fish") +fish: S = fish -scala> defined class Bar +scala> // Test that arrays pretty print nicely. -scala> foo2bar: (foo: Foo)Bar +scala> val arr = Array("What's", "up", "doc?") +arr: Array[java.lang.String] = Array(What's, up, doc?) -scala> bar: Bar = Bar(3) +scala> // Test that arrays pretty print nicely, even when we give them type Any + +scala> val arrInt : Any = Array(1,2,3) +arrInt: Any = Array(1, 2, 3) + +scala> // Test that nested arrays are pretty-printed correctly + +scala> val arrArrInt : Any = Array(Array(1, 2), Array(3, 4)) +arrArrInt: Any = Array(Array(1, 2), Array(3, 4)) scala> + +scala> // implicit conversions + +scala> case class Foo(n: Int) +defined class Foo + +scala> case class Bar(n: Int) +defined class Bar + +scala> implicit def foo2bar(foo: Foo) = Bar(foo.n) +foo2bar: (foo: Foo)Bar + +scala> val bar: Bar = Foo(3) +bar: Bar = Bar(3) + scala> + +scala> // importing from a previous result + scala> import bar._ +import bar._ -scala> m: Int = 3 +scala> val m = n +m: Int = 3 scala> -scala> -scala> one: Int = 1 -scala> one: Int = 1 +scala> // stressing the imports mechanism -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 -scala> one: Int = 1 +scala> val one = 1 +one: Int = 1 + +scala> val one = 1 +one: Int = 1 + +scala> val one = 1 +one: Int = 1 scala> + scala> -scala> x1: Int = 1 -scala> x2: Int = 1 +scala> val x1 = 1 +x1: Int = 1 -scala> x3: Int = 1 +scala> val x2 = 1 +x2: Int = 1 -scala> x4: Int = 1 +scala> val x3 = 1 +x3: Int = 1 -scala> x5: Int = 1 +scala> val x4 = 1 +x4: Int = 1 -scala> x6: Int = 1 +scala> val x5 = 1 +x5: Int = 1 -scala> x7: Int = 1 +scala> val x6 = 1 +x6: Int = 1 -scala> x8: Int = 1 +scala> val x7 = 1 +x7: Int = 1 -scala> x9: Int = 1 +scala> val x8 = 1 +x8: Int = 1 -scala> x10: Int = 1 +scala> val x9 = 1 +x9: Int = 1 -scala> x11: Int = 1 +scala> val x10 = 1 +x10: Int = 1 -scala> x12: Int = 1 +scala> val x11 = 1 +x11: Int = 1 -scala> x13: Int = 1 +scala> val x12 = 1 +x12: Int = 1 -scala> x14: Int = 1 +scala> val x13 = 1 +x13: Int = 1 -scala> x15: Int = 1 +scala> val x14 = 1 +x14: Int = 1 -scala> x16: Int = 1 +scala> val x15 = 1 +x15: Int = 1 -scala> x17: Int = 1 +scala> val x16 = 1 +x16: Int = 1 -scala> x18: Int = 1 +scala> val x17 = 1 +x17: Int = 1 -scala> x19: Int = 1 +scala> val x18 = 1 +x18: Int = 1 -scala> x20: Int = 1 +scala> val x19 = 1 +x19: Int = 1 -scala> -scala> two: Int = 2 +scala> val x20 = 1 +x20: Int = 1 scala> + +scala> val two = one + x5 +two: Int = 2 + scala> -scala> -scala> xs: Array[_] = Array(1, 2) -scala> res2: Int = 2 +scala> // handling generic wildcard arrays (#2386) -scala> res3: Any = 1 +scala> // It's put here because type feedback is an important part of it. -scala> res4: Array[_] = Array(2) +scala> val xs: Array[_] = Array(1, 2) +xs: Array[_] = Array(1, 2) -scala> res5: Array[java.lang.String] = Array(abc, abc) +scala> xs.size +res2: Int = 2 -scala> res6: scala.collection.mutable.ArraySeq[_] = ArraySeq(1, 2) +scala> xs.head +res3: Any = 1 -scala> res7: Array[(_$1, _$1)] forSome { type _$1 } = Array((1,1), (2,2)) +scala> xs filter (_ == 2) +res4: Array[_] = Array(2) + +scala> xs map (_ => "abc") +res5: Array[java.lang.String] = Array(abc, abc) + +scala> xs map (x => x) +res6: scala.collection.mutable.ArraySeq[_] = ArraySeq(1, 2) + +scala> xs map (x => (x, x)) +res7: Array[(_$1, _$1)] forSome { type _$1 } = Array((1,1), (2,2)) scala> -scala> -scala> -scala> <console>:1: error: '=' expected but '=>' found. + +scala> // interior syntax errors should *not* go into multi-line input mode. + +scala> // both of the following should abort immediately: + +scala> def x => y => z +<console>:1: error: '=' expected but '=>' found. def x => y => z ^ -scala> <console>:1: error: illegal start of definition +scala> [1,2,3] +<console>:1: error: illegal start of definition [1,2,3] ^ scala> + scala> -scala> -scala> | | | | res8: scala.xml.Elem = + +scala> // multi-line XML + +scala> <a> +<b + c="c" + d="dd" +/></a> +res8: scala.xml.Elem = <a> <b c="c" d="dd"></b></a> scala> + scala> -scala> | | | | -scala> + +scala> /* + /* + multi-line comment + */ +*/ + scala> + scala> -scala> | | | res9: java.lang.String = + +scala> // multi-line string + +scala> """ +hello +there +""" +res9: java.lang.String = " hello there " scala> -scala> | | You typed two blank lines. Starting a new command. -scala> -scala> match: Int +scala> (1 + // give up early by typing two blank lines -scala> x: Int = 1 + +You typed two blank lines. Starting a new command. + +scala> // defining and using quoted names should work (ticket #323) + +scala> def `match` = 1 +match: Int + +scala> val x = `match` +x: Int = 1 scala> -scala> -scala> defined class Exp + +scala> // multiple classes defined on one line + +scala> sealed class Exp; class Fact extends Exp; class Term extends Exp +defined class Exp defined class Fact defined class Term -scala> | | <console>:18: warning: match is not exhaustive! +scala> def f(e: Exp) = e match { // non-exhaustive warning here + case _:Fact => 3 +} +<console>:18: warning: match is not exhaustive! missing combination Exp missing combination Term @@ -226,6 +364,7 @@ missing combination Term f: (e: Exp)Int scala> + scala> plusOne: (x: Int)Int res0: Int = 6 diff --git a/test/files/jvm/mkLibNatives.bat b/test/files/jvm/mkLibNatives.bat index 100246af79..e11b6ee21c 100755 --- a/test/files/jvm/mkLibNatives.bat +++ b/test/files/jvm/mkLibNatives.bat @@ -4,6 +4,9 @@ rem ########################################################################## rem # Author : Stephane Micheloud
rem ##########################################################################
+rem # For building the -64.dll, you need: Visual C++ Express, Microsoft SDK (to
+rem # get the 64bit compiler / libraries), adapt this script.
+
rem ##########################################################################
rem # variables
diff --git a/test/files/jvm/natives-64.dll b/test/files/jvm/natives-64.dll Binary files differnew file mode 100644 index 0000000000..f892f088f5 --- /dev/null +++ b/test/files/jvm/natives-64.dll diff --git a/test/files/neg/annot-nonconst.check b/test/files/neg/annot-nonconst.check index 385f066baa..e4166e08b6 100644 --- a/test/files/neg/annot-nonconst.check +++ b/test/files/neg/annot-nonconst.check @@ -11,7 +11,7 @@ class Ann2(value: String) extends ClassfileAnnotation annot-nonconst.scala:6: error: annotation argument needs to be a constant; found: n @Length(n) def foo = "foo" ^ -annot-nonconst.scala:7: error: annotation argument needs to be a constant; found: null +annot-nonconst.scala:7: error: annotation argument cannot be null @Ann2(null) def bar = "bar" ^ two warnings found diff --git a/test/files/neg/bug3736.check b/test/files/neg/bug3736.check index 8a91088914..cc222d1221 100644 --- a/test/files/neg/bug3736.check +++ b/test/files/neg/bug3736.check @@ -1,6 +1,9 @@ bug3736.scala:4: error: super not allowed here: use this.isInstanceOf instead def f2 = super.isInstanceOf[String] ^ +bug3736.scala:5: error: super not allowed here: use this.asInstanceOf instead + def f3 = super.asInstanceOf[AnyRef] + ^ bug3736.scala:6: error: super not allowed here: use this.== instead def f4 = super.==(new AnyRef) ^ @@ -10,4 +13,4 @@ bug3736.scala:7: error: super not allowed here: use this.!= instead bug3736.scala:8: error: super not allowed here: use this.## instead def f6 = super.## ^ -four errors found +5 errors found diff --git a/test/files/neg/super-cast-or-test.check b/test/files/neg/super-cast-or-test.check new file mode 100644 index 0000000000..8e5eed62bd --- /dev/null +++ b/test/files/neg/super-cast-or-test.check @@ -0,0 +1,7 @@ +super-cast-or-test.scala:1: error: super not allowed here: use this.asInstanceOf instead +trait A { def f = super.asInstanceOf[AnyRef] } + ^ +super-cast-or-test.scala:2: error: super not allowed here: use this.isInstanceOf instead +trait B { def g = super.isInstanceOf[AnyRef] } + ^ +two errors found diff --git a/test/files/neg/super-cast-or-test.scala b/test/files/neg/super-cast-or-test.scala new file mode 100644 index 0000000000..a0f86d8081 --- /dev/null +++ b/test/files/neg/super-cast-or-test.scala @@ -0,0 +1,3 @@ +trait A { def f = super.asInstanceOf[AnyRef] } +trait B { def g = super.isInstanceOf[AnyRef] } + diff --git a/test/files/neg/t3399.check b/test/files/neg/t3399.check index eb6c679704..987da944c6 100644 --- a/test/files/neg/t3399.check +++ b/test/files/neg/t3399.check @@ -1,4 +1,4 @@ -t3399.scala:23: error: could not find implicit value for parameter e: =:=[Nats.Add[Nats._1,Nats._1],Nats._1] +t3399.scala:23: error: Cannot prove that Nats.Add[Nats._1,Nats._1] =:= Nats._1. implicitly[ Add[_1, _1] =:= _1] ^ one error found diff --git a/test/files/neg/t3507.check b/test/files/neg/t3507.check index 1246a20d09..ab38280c1f 100644 --- a/test/files/neg/t3507.check +++ b/test/files/neg/t3507.check @@ -1,4 +1,4 @@ -t3507.scala:13: error: could not find implicit value for evidence parameter of type Manifest[object _1.b.c] +t3507.scala:13: error: No Manifest available for object _1.b.c. mani/*[object _1.b.c]*/(c) // kaboom in manifestOfType / TreeGen.mkAttributedQualifier ^ one error found diff --git a/test/files/neg/t4431.check b/test/files/neg/t4431.check new file mode 100644 index 0000000000..7896ec1a62 --- /dev/null +++ b/test/files/neg/t4431.check @@ -0,0 +1,7 @@ +t4431.scala:5: error: class BB needs to be abstract, since there is a deferred declaration of method f which is not implemented in a subclass + class BB extends B { def f (): Unit } + ^ +t4431.scala:8: error: trait cannot redefine final method from class AnyRef + trait C { def wait (): Unit } + ^ +two errors found diff --git a/test/files/neg/t4431.scala b/test/files/neg/t4431.scala new file mode 100644 index 0000000000..5fbb239e04 --- /dev/null +++ b/test/files/neg/t4431.scala @@ -0,0 +1,16 @@ +object Test { + // this works. + class B { final def f(): Unit = () } + trait A extends B { def f (): Unit } + class BB extends B { def f (): Unit } + + // this earns a VerifyError. + trait C { def wait (): Unit } + class D { } + + def main(args: Array[String]): Unit = { + new B with A { } + new BB +// new D with C { } + } +} diff --git a/test/files/pos/javaReadsSigs/fromjava.java b/test/files/pos/javaReadsSigs/fromjava.java index d31244bb95..745fb84efd 100644 --- a/test/files/pos/javaReadsSigs/fromjava.java +++ b/test/files/pos/javaReadsSigs/fromjava.java @@ -1,16 +1,75 @@ +import scala.*; +import scala.math.Ordering; +import scala.math.Numeric; +import scala.collection.Seq; +import scala.collection.Traversable; +import scala.collection.Traversable$; +import scala.collection.immutable.Set; +import scala.collection.immutable.HashSet; +import scala.collection.immutable.Map; +import scala.collection.immutable.Map$; +import scala.collection.immutable.HashMap; import scala.collection.immutable.Vector; import scala.collection.immutable.List; +import scala.collection.generic.CanBuildFrom; -public class fromjava { +class A { }; +class B { }; + +// This one compiles but it would be better if it didn't. +// Checking in under pos anyway in the interests of making sure +// we are informed if the status changes. +class Contra { + // Not an Ordering<Character>. + static Ordering<Object> charOrd = scala.math.Ordering$Char$.MODULE$; + + public boolean useCharOrd() { + return charOrd.compare(new Object(), new Object()) == 0; + } + + static Numeric<?> intNum = scala.math.Numeric$IntIsIntegral$.MODULE$; +} - void main(String[] args, Vector<String> x) { - Vector<String> y = x.take(2); - String h = y.head(); - System.out.println(h); +public class fromjava { + public static Function1<A, B> f1 = new scala.runtime.AbstractFunction1<A, B>() { + public B apply(A a) { + return null; } - void main(String[] args, List<String> x) { - List<String> y = x.drop(2); - String h = y.head(); - System.out.println(h); + }; + + public static Function1<Tuple2<? extends Object, B>, B> f2 = new scala.runtime.AbstractFunction1<Tuple2<? extends Object, B>, B>() { + public B apply(Tuple2<? extends Object, B> tup) { + return tup._2(); } + }; + + public static String vector(Vector<String> x) { + Vector<String> y = x.take(2); + return y.head(); + } + public static String list(List<String> x) { + List<String> y = x.drop(2); + return y.head(); + } + public static Tuple2<String, Integer> map(Map<String, Integer> x) { + Traversable<Tuple2<String, Integer>> y = x.drop(2); + return y.head(); + } + public static <T> Object sum(Traversable<T> x) { + return x.sum(Contra.intNum); + } + // Looks like sum as given below fails under java5, so disabled. + // + // [partest] testing: [...]/files/pos/javaReadsSigs [FAILED] + // [partest] files/pos/javaReadsSigs/fromjava.java:62: name clash: sum(scala.collection.Traversable<A>) and <T>sum(scala.collection.Traversable<T>) have the same erasure + // [partest] public static B sum(Traversable<A> x) { + // [partest] ^ + // + // + // can't make this work with an actual CanBuildFrom: see #4389. + // public static B sum(Traversable<A> x) { + // // have to cast it unfortunately: map in TraversableLike returns + // // "That" and such types seem to be signature poison. + // return ((Traversable<B>)x.map(f1, null)).head(); + // } }
\ No newline at end of file diff --git a/test/files/presentation/find-trees.check b/test/files/presentation/find-trees.check index 33213dd911..9f60d4fb52 100644 --- a/test/files/presentation/find-trees.check +++ b/test/files/presentation/find-trees.check @@ -3,4 +3,4 @@ asking position at 19:4 retrieved tree: InteractiveTest.this.settings ==================== asking position at 20:16 -retrieved tree: lazy private[this] var compiler: scala.tools.nsc.interactive.CompilerControl = new Global(InteractiveTest.this.settings, InteractiveTest.this.reporter) +retrieved tree: lazy private[this] var compiler: scala.tools.nsc.interactive.CompilerControl = new Global(InteractiveTest.this.settings, InteractiveTest.this.reporter, interactive.this.Global.init$default$3) diff --git a/test/files/run/bug3376.check b/test/files/run/bug3376.check index 7286096022..3a1d7d581b 100644 --- a/test/files/run/bug3376.check +++ b/test/files/run/bug3376.check @@ -2,12 +2,17 @@ Type in expressions to have them evaluated. Type :help for more information. scala> -scala> defined class M -scala> m1: M[Int] = mmm +scala> class M[@specialized T] { override def toString = "mmm" } +defined class M -scala> m2: M[Float] = mmm +scala> val m1 = new M[Int]() +m1: M[Int] = mmm -scala> m3: M[String] = mmm +scala> val m2 = new M[Float]() +m2: M[Float] = mmm + +scala> val m3 = new M[String]() +m3: M[String] = mmm scala> diff --git a/test/files/run/bug4080.check b/test/files/run/bug4080.check new file mode 100644 index 0000000000..66ce31bb43 --- /dev/null +++ b/test/files/run/bug4080.check @@ -0,0 +1 @@ +LinkedList(1, 0, 2, 3) diff --git a/test/files/run/bug4080.scala b/test/files/run/bug4080.scala new file mode 100644 index 0000000000..92740ed776 --- /dev/null +++ b/test/files/run/bug4080.scala @@ -0,0 +1,12 @@ +import scala.collection.mutable.LinkedList + +object Test { + def main(args: Array[String]) { + val ll = LinkedList(1, 2, 3) + ll.insert(LinkedList(0)) + println(ll) + val ll2 = LinkedList[Int]() + try println(ll2.head) + catch { case _ => () } + } +} diff --git a/test/files/run/bug4285.check b/test/files/run/bug4285.check index 5a3c9811c3..84f8929e43 100644 --- a/test/files/run/bug4285.check +++ b/test/files/run/bug4285.check @@ -2,11 +2,16 @@ Type in expressions to have them evaluated. Type :help for more information. scala> -scala> x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7) -scala> y: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 4, 6, 8, 10, 12, 14) +scala> val x = Array(1,2,3,4,5,6,7) +x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7) -scala> 56 +scala> val y = x transform (_ * 2) +y: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 4, 6, 8, 10, 12, 14) + +scala> println(y.sum) +56 scala> + scala> diff --git a/test/files/run/bug4387.scala b/test/files/run/bug4387.scala new file mode 100644 index 0000000000..f51c9b0572 --- /dev/null +++ b/test/files/run/bug4387.scala @@ -0,0 +1,12 @@ +object Test { + import xml.XML.loadString + def mkElem(arg: String) = <foo a="1" b="2" c="3" d="4" e={arg} /> + + val x1 = mkElem("5") + val x2 = mkElem("50") + + def main(args: Array[String]): Unit = { + assert(x1 == loadString("" + x1)) + assert(x2 != loadString("" + x1)) + } +} diff --git a/test/files/run/constrained-types.check b/test/files/run/constrained-types.check index e22e3a58d5..6919eca9bc 100644 --- a/test/files/run/constrained-types.check +++ b/test/files/run/constrained-types.check @@ -1,102 +1,110 @@ -class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint +Type in expressions to have them evaluated. +Type :help for more information. + +scala> + +scala> + +scala> class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint defined class Annot ------ -class A { +scala> + +scala> class A { val x = "hello" val y: Int @Annot(x) = 10 override def toString = "an A" } defined class A ------ -val a = new A +scala> + +scala> val a = new A a: A = an A ------ -val y = a.y // should rewrite "this.x" to "a.x" +scala> val y = a.y // should rewrite "this.x" to "a.x" y: Int @Annot(a.x) = 10 ------ -var a2 = new A +scala> var a2 = new A a2: A = an A ------ -val y2 = a2.y // should drop the annotation +scala> val y2 = a2.y // should drop the annotation y2: Int = 10 ------ -object Stuff { +scala> + +scala> object Stuff { val x = "hello" val y : Int @Annot(x) = 10 } defined module Stuff ------ -val y = Stuff.y // should rewrite the annotation +scala> + +scala> val y = Stuff.y // should rewrite the annotation y: Int @Annot(Stuff.x) = 10 ------ -class B { +scala> + +scala> class B { val y: Int @Annot(Stuff.x) = 10 override def toString = "a B" } defined class B ------ -val b = new B +scala> + +scala> val b = new B b: B = a B ------ -val y = b.y // should keep the annotation +scala> val y = b.y // should keep the annotation y: Int @Annot(Stuff.x) = 10 ------ -def m(x: String): String @Annot(x) = x +scala> def m(x: String): String @Annot(x) = x m: (x: String)String @Annot(x) ------ -val three = "three" +scala> + +scala> val three = "three" three: java.lang.String = three ------ -val three2 = m(three:three.type) // should change x to three +scala> val three2 = m(three:three.type) // should change x to three three2: String @Annot(three) = three ------ -var four = "four" +scala> var four = "four" four: java.lang.String = four ------ -val four2 = m(four) // should have an existential bound +scala> val four2 = m(four) // should have an existential bound four2: java.lang.String @Annot(x) forSome { val x: java.lang.String } = four ------ -val four3 = four2 // should have the same type as four2 +scala> val four3 = four2 // should have the same type as four2 four3: java.lang.String @Annot(x) forSome { val x: java.lang.String } = four ------ -val stuff = m("stuff") // should not crash +scala> val stuff = m("stuff") // should not crash stuff: String @Annot("stuff") = stuff ------ -class peer extends annotation.Annotation // should not crash +scala> + +scala> class peer extends annotation.Annotation // should not crash defined class peer ------ -class NPE[T <: NPE[T] @peer] // should not crash +scala> + +scala> class NPE[T <: NPE[T] @peer] // should not crash defined class NPE ------ -def m = { +scala> + +scala> def m = { val x = "three" val y : String @Annot(x) = x y } // x should not escape the local scope with a narrow type m: String @Annot("three") ------ -def n(y: String) = { +scala> + +scala> def n(y: String) = { def m(x: String) : String @Annot(x) = { (if (x == "") m("default") @@ -107,30 +115,40 @@ def n(y: String) = { } // x should be existentially bound n: (y: String)java.lang.String @Annot(x) forSome { val x: String } ------ -class rep extends annotation.Annotation +scala> + +scala> class rep extends annotation.Annotation { } defined class rep ------ -object A { val x = "hello" : String @ rep } +scala> + +scala> object A { val x = "hello" : String @ rep } defined module A +warning: previously defined class A is not a companion to object A. +Companions must be defined together; you may wish to use :paste mode for this. ------ -val y = a.x // should drop the annotation +scala> + +scala> val y = a.x // should drop the annotation y: java.lang.String = hello ------ -val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message +scala> + +scala> val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message <console>:8: error: not found: value e - val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message + val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message ^ ------ -class Where(condition: Boolean) extends annotation.Annotation +scala> + +scala> class Where(condition: Boolean) extends annotation.Annotation defined class Where ------ -val x : Int @Where(self > 0 && self < 100) = 3 +scala> + +scala> val x : Int @Where(self > 0 && self < 100) = 3 x: Int @Where(self.>(0).&&(self.<(100))) = 3 ------ +scala> + +scala> diff --git a/test/files/run/constrained-types.scala b/test/files/run/constrained-types.scala index 86fcaade6e..5f7eb7adde 100644 --- a/test/files/run/constrained-types.scala +++ b/test/files/run/constrained-types.scala @@ -3,103 +3,91 @@ * of DeBruijn's . It runs the test using the interpreter so that * the resulting annotated types can be printed out. */ -import scala.tools.nsc._ -import java.io._ -import scala.Console +import scala.tools.nsc.Settings +import scala.tools.partest.ReplTest -object Test { +object Test extends ReplTest { + def code = """ - val testCode = List( - "class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint", +class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint - """class A { - | val x = "hello" - | val y: Int @Annot(x) = 10 - | override def toString = "an A" - |} """, - - - - "val a = new A", - - """val y = a.y // should rewrite "this.x" to "a.x" """, - - - "var a2 = new A", - "val y2 = a2.y // should drop the annotation", - - - """object Stuff { - | val x = "hello" - | val y : Int @Annot(x) = 10 - |}""", - - "val y = Stuff.y // should rewrite the annotation", +class A { + val x = "hello" + val y: Int @Annot(x) = 10 + override def toString = "an A" +} - """class B { - | val y: Int @Annot(Stuff.x) = 10 - | override def toString = "a B" - |}""", +val a = new A +val y = a.y // should rewrite "this.x" to "a.x" +var a2 = new A +val y2 = a2.y // should drop the annotation - "val b = new B", - "val y = b.y // should keep the annotation", +object Stuff { + val x = "hello" + val y : Int @Annot(x) = 10 +} +val y = Stuff.y // should rewrite the annotation - "def m(x: String): String @Annot(x) = x", - "val three = \"three\"", - "val three2 = m(three:three.type) // should change x to three", - "var four = \"four\"", - "val four2 = m(four) // should have an existential bound", - "val four3 = four2 // should have the same type as four2", +class B { + val y: Int @Annot(Stuff.x) = 10 + override def toString = "a B" +} - """val stuff = m("stuff") // should not crash""", +val b = new B +val y = b.y // should keep the annotation +def m(x: String): String @Annot(x) = x + +val three = "three" +val three2 = m(three:three.type) // should change x to three +var four = "four" +val four2 = m(four) // should have an existential bound +val four3 = four2 // should have the same type as four2 +val stuff = m("stuff") // should not crash + +class peer extends annotation.Annotation // should not crash + +class NPE[T <: NPE[T] @peer] // should not crash + +def m = { + val x = "three" + val y : String @Annot(x) = x + y +} // x should not escape the local scope with a narrow type + +def n(y: String) = { + def m(x: String) : String @Annot(x) = { + (if (x == "") + m("default") + else + x) + } + m("stuff".stripMargin) +} // x should be existentially bound - """class peer extends annotation.Annotation // should not crash""", // reported by Manfred Stock - """class NPE[T <: NPE[T] @peer] // should not crash""", // reported by Manfred Stock +class rep extends annotation.Annotation { } - """def m = { - | val x = "three" - | val y : String @Annot(x) = x - | y - |} // x should not escape the local scope with a narrow type""", +object A { val x = "hello" : String @ rep } - """def n(y: String) = { - | def m(x: String) : String @Annot(x) = { - | (if (x == "") - | m("default") - | else - | x) - | } - | m("stuff".stripMargin) - |} // x should be existentially bound""", +val y = a.x // should drop the annotation - "class rep extends annotation.Annotation", - """object A { val x = "hello" : String @ rep }""", - "val y = a.x // should drop the annotation", +val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message - "val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message", +class Where(condition: Boolean) extends annotation.Annotation - "class Where(condition: Boolean) extends annotation.Annotation", - "val x : Int @Where(self > 0 && self < 100) = 3" - ).map(_.stripMargin) +val x : Int @Where(self > 0 && self < 100) = 3 +""" + override def settings: Settings = { + val s = new Settings - def main(args: Array[String]) { - val settings = new Settings - settings.Xexperimental.value = true - settings.selfInAnnots.value = true - settings.deprecation.value = true + s.Xexperimental.value = true + s.selfInAnnots.value = true + s.deprecation.value = true // when running that compiler, give it a scala-library to the classpath - settings.classpath.value = System.getProperty("java.class.path") - - val interp = new Interpreter(settings) + s.classpath.value = sys.props("java.class.path") - for (cmd <- testCode) { - println(cmd) - interp.interpret(cmd) - println() - println("-----") - } + s } } diff --git a/test/files/run/programmatic-main.scala b/test/files/run/programmatic-main.scala index 3a88252fd3..7fec0f3f98 100644 --- a/test/files/run/programmatic-main.scala +++ b/test/files/run/programmatic-main.scala @@ -8,7 +8,7 @@ object Test { def main(args: Array[String]): Unit = { Console.withErr(Console.out) { - Main process (baseargs ++ Array("-Xshow-phases")) + Main process (baseargs ++ "-Xpluginsdir /does/not/exist/foo/quux -Xshow-phases".split(' ')) } } } diff --git a/test/files/run/repl-assign.check b/test/files/run/repl-assign.check new file mode 100644 index 0000000000..c6b0458f04 --- /dev/null +++ b/test/files/run/repl-assign.check @@ -0,0 +1,20 @@ +Type in expressions to have them evaluated. +Type :help for more information. + +scala> + +scala> var x = 10 +x: Int = 10 + +scala> var y = 11 +y: Int = 11 + +scala> x = 12 +x: Int = 12 + +scala> y = 13 +y: Int = 13 + +scala> + +scala> diff --git a/test/files/run/repl-assign.scala b/test/files/run/repl-assign.scala new file mode 100644 index 0000000000..ee3c1649d8 --- /dev/null +++ b/test/files/run/repl-assign.scala @@ -0,0 +1,10 @@ +import scala.tools.partest.ReplTest + +object Test extends ReplTest { + def code = """ +var x = 10 +var y = 11 +x = 12 +y = 13 + """ +}
\ No newline at end of file diff --git a/test/files/run/repl-paste-2.check b/test/files/run/repl-paste-2.check index fb7a818f1a..435592567d 100644 --- a/test/files/run/repl-paste-2.check +++ b/test/files/run/repl-paste-2.check @@ -2,30 +2,60 @@ Type in expressions to have them evaluated. Type :help for more information. scala> -scala> // Replaying 7 commands from transcript. -val res0 = { 123 } -res0: Int = 123 +scala> scala> 0123 +res4: Int = 0123 -val res1 = { 567 } -res1: Int = 567 +scala> 123 +res5: Int = 123 -val res2 = { res0 + res1 } -res2: Int = 690 +scala> 567 +res6: Int = 567 -val x = dingus +scala> res5 + res6 +res7: Int = 690 + +scala> val x = dingus +<console>:7: error: not found: value dingus + val x = dingus + ^ + +scala> val x = "dingus" +x: java.lang.String = dingus + +scala> x.length +res9: Int = 6 + +scala> x.length + res5 +res10: Int = 12 + +// Replaying 8 commands from transcript. + +scala> 0123 +res0: Int = 83 + +scala> val res5 = { 123 } +res5: Int = 123 + +scala> val res6 = { 567 } +res6: Int = 567 + +scala> res5 + res6 +res1: Int = 690 + +scala> val x = dingus <console>:7: error: not found: value dingus val x = dingus ^ -val x = "dingus" +scala> val x = "dingus" x: java.lang.String = dingus -val res3 = { x.length } -res3: Int = 6 +scala> x.length +res2: Int = 6 -val res4 = { x.length + res3 } -res4: Int = 12 +scala> x.length + res5 +res3: Int = 129 scala> diff --git a/test/files/run/repl-paste-2.scala b/test/files/run/repl-paste-2.scala index 802c627701..f62927791d 100644 --- a/test/files/run/repl-paste-2.scala +++ b/test/files/run/repl-paste-2.scala @@ -2,14 +2,17 @@ import scala.tools.partest.ReplTest object Test extends ReplTest { def code = """ +scala> 0123 +res4: Int = 0123 + scala> 123 -res0: Int = 123 +res5: Int = 123 scala> 567 -res1: Int = 567 +res6: Int = 567 -scala> res0 + res1 -res2: Int = 690 +scala> res5 + res6 +res7: Int = 690 scala> val x = dingus <console>:7: error: not found: value dingus @@ -20,9 +23,9 @@ scala> val x = "dingus" x: java.lang.String = dingus scala> x.length -res3: Int = 6 +res9: Int = 6 -scala> x.length + res3 -res4: Int = 12 +scala> x.length + res5 +res10: Int = 12 """ }
\ No newline at end of file diff --git a/test/files/run/repl-paste.check b/test/files/run/repl-paste.check index 4c9de85e67..50589433cd 100644 --- a/test/files/run/repl-paste.check +++ b/test/files/run/repl-paste.check @@ -1,7 +1,21 @@ Type in expressions to have them evaluated. Type :help for more information. -scala> // Entering paste mode (ctrl-D to finish) +scala> :paste +// Entering paste mode (ctrl-D to finish) + + + class Dingus + { + private val x = 5 + def y = Dingus.x * 2 + } + object Dingus + { + private val x = 55 + } + + val x = (new Dingus).y // Exiting paste mode, now interpreting. diff --git a/test/files/run/repl-transcript.check b/test/files/run/repl-transcript.check index b2a8d2e156..03162451b6 100644 --- a/test/files/run/repl-transcript.check +++ b/test/files/run/repl-transcript.check @@ -2,21 +2,36 @@ Type in expressions to have them evaluated. Type :help for more information. scala> -scala> // Replaying 5 commands from transcript. -class Bippity +scala> scala> class Bippity defined class Bippity -def f = new Bippity +scala> def f = new Bippity f: Bippity -val res5 = { 123 } +scala> 123 res5: Int = 123 -val res6 = { 1 to 100 map (_ + 1) } +scala> 1 to 100 map (_ + 1) res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101) -res6.sum + res5 +scala> res6.sum + res5 + +// Replaying 5 commands from transcript. + +scala> class Bippity +defined class Bippity + +scala> def f = new Bippity +f: Bippity + +scala> val res5 = { 123 } +res5: Int = 123 + +scala> val res6 = { 1 to 100 map (_ + 1) } +res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101) + +scala> res6.sum + res5 res0: Int = 5273 diff --git a/test/files/run/t3361.scala b/test/files/run/t3361.scala index 17af89a67c..892e36dbd9 100644 --- a/test/files/run/t3361.scala +++ b/test/files/run/t3361.scala @@ -39,10 +39,8 @@ object Test extends App { def insert_1 { val ten = DoubleLinkedList(1 to 10: _*) - ten.insert(DoubleLinkedList(11)) match { - case _: Unit => require(true) - case _ => require(false) - } + ten.append(DoubleLinkedList(11)) + // Post-insert size test require(11 == ten.size) // Post-insert data test diff --git a/test/files/run/t4396.check b/test/files/run/t4396.check new file mode 100644 index 0000000000..58f4fc5138 --- /dev/null +++ b/test/files/run/t4396.check @@ -0,0 +1,5 @@ +hallo +constructor +out:22 +bye +foo diff --git a/test/files/run/t4396.scala b/test/files/run/t4396.scala new file mode 100644 index 0000000000..d67eaa378e --- /dev/null +++ b/test/files/run/t4396.scala @@ -0,0 +1,35 @@ +// #43896 +trait M extends DelayedInit { + def delayedInit(body : => Unit) { + println("hallo") + body + println("bye") + } +} + +class C(init : Int) extends M { + def foo = init + println("constructor") + var x = init + println("out:"+x) +} + +// #4380 +object Main { + def main(argv: Array[String]) { + class Bip { + class Foo { override def toString() = "foo" } + object Main extends App { + val cbn = new Foo() + } + Main.main(Array()) + println(Main.cbn) + } + new Bip + } +} + +object Test extends App { + new C(22) + Main.main(Array()) +} diff --git a/test/files/run/treePrint.scala b/test/files/run/treePrint.scala index ce7dd04499..452aaf390d 100644 --- a/test/files/run/treePrint.scala +++ b/test/files/run/treePrint.scala @@ -35,7 +35,7 @@ object Test { settings.Ycompacttrees.value = true val intp = new IMain(settings, new PrintWriter(new NullOutputStream)) - val power = new Power(intp) + val power = Power(intp) intp.interpret("""def initialize = "Have to interpret something or we get errors." """) power trees code foreach println } diff --git a/test/partest b/test/partest index 5f89588d1f..44f7130968 100755 --- a/test/partest +++ b/test/partest @@ -74,8 +74,7 @@ if $cygwin; then EXT_CLASSPATH=`cygpath --path --$format "$EXT_CLASSPATH"` fi -# Reminder: substitution ${JAVA_OPTS:=-Xmx256M -Xms16M} DO NOT work on Solaris -[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx512M -Xms16M" +[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx1024M -Xms16M" [ -n "$SCALAC_OPTS" ] || SCALAC_OPTS="-deprecation" partestDebugStr="" diff --git a/test/scaladoc/resources/Trac3484.scala b/test/scaladoc/resources/Trac3484.scala new file mode 100644 index 0000000000..9656ec268d --- /dev/null +++ b/test/scaladoc/resources/Trac3484.scala @@ -0,0 +1,27 @@ +class cbf[A, B, C] + +/** + * @define Coll Traversable + * @define bfreturn $Coll + */ +class Collection[A] { + /** What map does... + * + * $bfreturn + * @usecase def map[B](f: A => B): $bfreturn[B] + * + */ + def map[B, That](f: A => B)(implicit fact: cbf[Collection[A], B, That]) = + null +} + +/** + * @define b John + * @define a Mister $b + */ +class SR704 { + /** + * Hello $a. + */ + def foo = 123 +} diff --git a/test/scaladoc/resources/Trac4180.scala b/test/scaladoc/resources/Trac4180.scala new file mode 100644 index 0000000000..3d6922803b --- /dev/null +++ b/test/scaladoc/resources/Trac4180.scala @@ -0,0 +1,4 @@ +trait Trac4180 { + type A + object A +} diff --git a/test/scaladoc/resources/Trac4289.scala b/test/scaladoc/resources/Trac4289.scala new file mode 100644 index 0000000000..1644e18bd4 --- /dev/null +++ b/test/scaladoc/resources/Trac4289.scala @@ -0,0 +1,13 @@ +class Superclass { + /** + * @return 123 + */ + def foo = 123 +} + +class Subclass extends Superclass { + /** + * hello + */ + override def foo = 456 +} diff --git a/test/scaladoc/resources/Trac4325.scala b/test/scaladoc/resources/Trac4325.scala new file mode 100644 index 0000000000..ffb968d571 --- /dev/null +++ b/test/scaladoc/resources/Trac4325.scala @@ -0,0 +1,5 @@ +case class WithSynthetic + +case class WithObject +object WithObject + diff --git a/test/scaladoc/resources/Trac4358.scala b/test/scaladoc/resources/Trac4358.scala new file mode 100644 index 0000000000..961c82160e --- /dev/null +++ b/test/scaladoc/resources/Trac4358.scala @@ -0,0 +1,8 @@ +trait Trac4358 { + /** + * Implicit conversion that invokes the <code>expect</code> method on the <code>EasyMock</code> companion object (<em>i.e.</em>, the + * static <code>expect</code> method in Java class <code>org.easymock.EasyMock</code>). + * + */ + val foo = 123 +} diff --git a/test/scaladoc/resources/Trac4372.scala b/test/scaladoc/resources/Trac4372.scala new file mode 100644 index 0000000000..03da659eee --- /dev/null +++ b/test/scaladoc/resources/Trac4372.scala @@ -0,0 +1,5 @@ +class Trac4372 { + def method(n: Int) = n + def +:(n: Int) = n + val -: = 1 +} diff --git a/test/scaladoc/resources/Trac4374.scala b/test/scaladoc/resources/Trac4374.scala new file mode 100644 index 0000000000..4dd8ba2ae8 --- /dev/null +++ b/test/scaladoc/resources/Trac4374.scala @@ -0,0 +1,5 @@ +class WithPublic +object WithPublic + +class WithPrivate +private object WithPrivate diff --git a/test/scaladoc/resources/Trac4409.scala b/test/scaladoc/resources/Trac4409.scala new file mode 100644 index 0000000000..f93d3e238e --- /dev/null +++ b/test/scaladoc/resources/Trac4409.scala @@ -0,0 +1,14 @@ +/** + * @define xxx + * + * The value of xxx don't contain since tag. + * + * @since 1.0 + */ + +class Trac4409 { + /** + * $xxx + */ + def foo = 123 +} diff --git a/test/scaladoc/resources/Trac4420.scala b/test/scaladoc/resources/Trac4420.scala new file mode 100644 index 0000000000..dbe053f3da --- /dev/null +++ b/test/scaladoc/resources/Trac4420.scala @@ -0,0 +1,14 @@ +import java.io.File + +/** + * @define PP This class is an instance of XXX so it's members are not called directly. + * Instead these classes are instantiated via a driver's ''process''. See YYY for more details. */ +abstract class test + +/** + * TestA class + * + * this is a description. + * + * $PP */ +class TestA extends test diff --git a/test/scaladoc/resources/Trac484.scala b/test/scaladoc/resources/Trac484.scala new file mode 100644 index 0000000000..b4f81ae172 --- /dev/null +++ b/test/scaladoc/resources/Trac484.scala @@ -0,0 +1,18 @@ +class RefinementAndExistentials { + type Foo = { + type Dingus + def bippy(x: Int): String + def dingus(): String + } + type Bar = { + type Dingus <: T forSome { type T <: String } + } + def f(x: Foo) = 51 + def g(x: T forSome { type T <: String }) = x + def h(x: Float): { def quux(x: Int, y: Int): Int } = new { + def quux(x: Int, y: Int) = 55 + } + def hh(x: Float) = new { def quux(x: Int, y: Int) = 55 } + def j(x: Int): Bar = sys.error("") + def k(): AnyRef { type Dingus <: T forSome { type T <: String } } = sys.error("") +} diff --git a/test/scaladoc/scala/html/HtmlFactoryTest.scala b/test/scaladoc/scala/html/HtmlFactoryTest.scala index ecdbb3cf46..c0a3f1ad95 100644 --- a/test/scaladoc/scala/html/HtmlFactoryTest.scala +++ b/test/scaladoc/scala/html/HtmlFactoryTest.scala @@ -18,23 +18,6 @@ object XMLUtil { case _ => seq } } - - def attributeIs(key: String, value: String) = { - (element: Node) => { - element.attribute(key) match { - case Some(v) => - v.toString == value - case _ => - false - } - } - } - - def textIs(value: String) = { - (node: Node) => { - node.descendant.exists((n) => n.toString.trim == value) - } - } } object Test extends Properties("HtmlFactory") { @@ -52,18 +35,18 @@ object Test extends Properties("HtmlFactory") { (paths ++ morepaths).mkString(java.io.File.pathSeparator) } - def createTemplates(basename: String) = { - val result = scala.collection.mutable.Map[String, scala.xml.NodeSeq]() + def createFactory = { + val settings = new Settings({Console.err.println(_)}) + settings.classpath.value = getClasspath - val factory = { - val settings = new Settings({Console.err.println(_)}) - settings.classpath.value = getClasspath + val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings) + new DocFactory(reporter, settings) + } - val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings) - new DocFactory(reporter, settings) - } + def createTemplates(basename: String) = { + val result = scala.collection.mutable.Map[String, scala.xml.NodeSeq]() - factory.makeUniverse(List("test/scaladoc/resources/"+basename)) match { + createFactory.makeUniverse(List("test/scaladoc/resources/"+basename)) match { case Some(universe) => { val index = IndexModelFactory.makeIndex(universe) (new HtmlFactory(universe, index)).writeTemplates((page) => { @@ -76,19 +59,30 @@ object Test extends Properties("HtmlFactory") { result } - property("Trac #3790") = { - import XMLUtil._ + def createTemplate(scala: String) = { + val html = scala.stripSuffix(".scala") + ".html" + createTemplates(scala)(html) + } - val files = createTemplates("Trac3790.scala") - files("Trac3790.html") match { + def shortComments(root: scala.xml.Node) = + XMLUtil.stripGroup(root).descendant.flatMap { + case e: scala.xml.Elem => { + if (e.attribute("class").toString.contains("shortcomment")) { + Some(e) + } else { + None + } + } + case _ => None + } + + property("Trac #3790") = { + createTemplate("Trac3790.scala") match { case node: scala.xml.Node => { - val comments = (stripGroup(node) \\ "div").flatMap { - case e: scala.xml.Elem => Some(e) - case _ => None - }.filter { attributeIs("class", "fullcomment")(_) } + val comments = shortComments(node) - comments.filter(textIs("A lazy String")(_)).length == 1 && - comments.filter(textIs("A non-lazy String")(_)).length == 1 + comments.exists { _.toString.contains(">A lazy String\n</p>") } && + comments.exists { _.toString.contains(">A non-lazy String\n</p>") } } case _ => false } @@ -100,28 +94,176 @@ object Test extends Properties("HtmlFactory") { } property("Trac #4366") = { - val files = createTemplates("Trac4366.scala") - files("Trac4366.html") match { + createTemplate("Trac4366.scala") match { case node: scala.xml.Node => { - val comments = XMLUtil.stripGroup(node).descendant.flatMap { - case e: scala.xml.Elem => { - if (e.attribute("class").toString.contains("shortcomment")) { - Some(e) - } else { - None - } - } - case _ => None + shortComments(node).exists { n => { + val str = n.toString + str.contains("<code>foo</code>") && str.contains("</strong>") + } } + } + case _ => false + } + } + + property("Trac #4358") = { + createTemplate("Trac4358.scala") match { + case node: scala.xml.Node => + ! shortComments(node).exists { + _.toString.contains("<em>i.</em>") } + case _ => false + } + } + + property("Trac #4180") = { + createTemplate("Trac4180.scala") != None + } - comments.exists { - (e) => { - val s = e.toString - s.contains("<code>foo</code>") && s.contains("</strong>") - } + property("Trac #4372") = { + createTemplate("Trac4372.scala") match { + case node: scala.xml.Node => { + val html = node.toString + html.contains("<span class=\"name\">+:</span>\n") && + html.contains("<span class=\"name\">-:</span>\n") && + html.contains("""<span class="params">(<span name="n">n: <span name="scala.Int" class="extype">Int</span></span>)</span><span class="result">: <span name="scala.Int" class="extype">Int</span></span>""") + } + case _ => false + } + } + + property("Trac #4374 - public") = { + val files = createTemplates("Trac4374.scala") + files("WithPublic.html") match { + case node: scala.xml.Node => { + val s = node.toString + s.contains("""href="WithPublic$.html"""") && + files.get("WithPublic$.html") != None + } + case _ => false + } + } + + property("Trac #4374 - private") = { + val files = createTemplates("Trac4374.scala") + files("WithPrivate.html") match { + case node: scala.xml.Node => { + val s = node.toString + ! s.contains("""href="WithPrivate$.html"""") && + files.get("WithPrivate$.html") == None + } + case _ => false + } + } + + property("Trac #3484") = { + val files = createTemplates("Trac3484.scala") + + files("Collection.html") match { + case node: scala.xml.Node => { + val s = node.toString + s.contains("""<span class="result">: Traversable[B]</span>""") + } + case _ => false + } + } + + property("Trac #3484 - SR704") = { + val files = createTemplates("Trac3484.scala") + + files("SR704.html") match { + case node: scala.xml.Node => { + val s = node.toString + s.contains("Hello Mister John.") + } + case _ => false + } + } + + property("Trac #4325 - files") = { + val files = createTemplates("Trac4325.scala") + + files.get("WithSynthetic.html") != None && + files.get("WithSynthetic$.html") == None && + files.get("WithObject.html") != None && + files.get("WithObject$.html") != None + } + + property("Trac #4325 - Don't link to syntetic companion") = { + val files = createTemplates("Trac4325.scala") + + files("WithSynthetic.html") match { + case node: scala.xml.Node => { + val s = node.toString + ! s.contains("""href="WithSynthetic$.html"""") + } + case _ => false + } + } + + property("Trac #4325 - Link to companion") = { + val files = createTemplates("Trac4325.scala") + + files("WithObject.html") match { + case node: scala.xml.Node => { + val s = node.toString + s.contains("""href="WithObject$.html"""") + } + case _ => false + } + } + + property("Trac #4420 - no whitespace at end of line") = { + val files = createTemplates("Trac4420.scala") + + files("TestA.html") match { + case node: scala.xml.Node => { + val s = node.toString + s.contains("""See YYY for more details""") + } + case _ => false + } + } + + property("Trac #484 - refinements and existentials") = { + val files = createTemplates("Trac484.scala") + val lines = """ + |type Bar = AnyRef { type Dingus <: T forSome { type T <: String } } + |type Foo = AnyRef { ... /* 3 definitions in type refinement */ } + |def g (x: T forSome { type T <: String }): String + |def h (x: Float): AnyRef { def quux(x: Int,y: Int): Int } + |def hh (x: Float): AnyRef { def quux(x: Int,y: Int): Int } + |def j (x: Int): Bar + |def k (): AnyRef { type Dingus <: T forSome { type T <: String } } + """.stripMargin.trim.lines map (_.trim) + + files("RefinementAndExistentials.html") match { + case node: scala.xml.Node => { + val s = node.text.replaceAll("\\s+", " ") + lines forall (s contains _) + } + case _ => false + } + } + + property("Trac #4289") = { + val files = createTemplates("Trac4289.scala") + + files("Subclass.html") match { + case node: scala.xml.Node => { + node.toString.contains { + """<dt>returns</dt><dd class="cmt"><p>123</p></dd>""" } } case _ => false } } + + property("Trac #4409") = { + createTemplate("Trac4409.scala") match { + case node: scala.xml.Node => { + ! node.toString.contains("""<div class="block"><ol>since""") + } + case _ => false + } + } } diff --git a/test/scaladoc/scala/model/CommentFactoryTest.scala b/test/scaladoc/scala/model/CommentFactoryTest.scala index 25a91b1fa2..9f60d2a1b7 100644 --- a/test/scaladoc/scala/model/CommentFactoryTest.scala +++ b/test/scaladoc/scala/model/CommentFactoryTest.scala @@ -92,11 +92,9 @@ object Test extends Properties("CommentFactory") { * */""", Chain(List(Text(""), Text("\n"), - HtmlTag("<pre>"), Text("\n"), - Text("hello "), Chain(List(Text("^"), - Chain(List(Text("world"), - Text("\n"), - HtmlTag("</pre>"))))))) + + + HtmlTag("<pre>\nhello ^world\n</pre>"))) ) property("Trac #4366 - body") = { @@ -109,8 +107,7 @@ object Test extends Properties("CommentFactory") { ) body == Body(List(Paragraph(Chain(List( - Summary(Chain(List(Chain(List(HtmlTag("<strong>"), HtmlTag("<code>foo</code>"), Text(" has been deprecated and will be removed in a future version"))), Text(".")))), - Chain(List(Text(" Please call "), HtmlTag("<code>bar</code>"), Text(" instead."), HtmlTag("</strong>"), Text("\n"), Text(""))) + Summary(Chain(List(HtmlTag("<strong><code>foo</code> has been deprecated and will be removed in a future version. Please call <code>bar</code> instead.</strong>"), Text("\n"), Text("")))) ))))) } @@ -122,7 +119,37 @@ object Test extends Properties("CommentFactory") { */ """ ) + body.summary == Some(Chain(List(HtmlTag("<strong><code>foo</code> has been deprecated and will be removed in a future version. Please call <code>bar</code> instead.</strong>"), Text("\n"), Text("")))) + } - body.summary == Some(Chain(List(Chain(List(HtmlTag("<strong>"), HtmlTag("<code>foo</code>"), Text(" has been deprecated and will be removed in a future version"))), Text(".")))) + property("Trac #4358 - body") = { + factory.createBody( + """ + /** + * Implicit conversion that invokes the <code>expect</code> method on the <code>EasyMock</code> companion object (<em>i.e.</em>, the + * static <code>expect</code> method in Java class <code>org.easymock.EasyMock</code>). + */ + """ + ) match { + case Body(List(Paragraph(Chain(List(Summary(Chain(List(Chain(List( + Text("Implicit conversion that invokes the "), + HtmlTag("<code>expect</code>"), + Text(" method on the "), + HtmlTag("<code>EasyMock</code>"), + Text(" companion object ("), + HtmlTag("<em>i.e.</em>"), + Text(", the\nstatic "), + HtmlTag("<code>expect</code>"), + Text(" method in Java class "), + HtmlTag("<code>org.easymock.EasyMock</code>"), + Text(")") + )), Text(".")))), Text("\n")))))) => + true + case other => { + println(other) + false + } + } } + } diff --git a/tools/get-git-svn-rev b/tools/get-git-svn-rev deleted file mode 100755 index 685ce67a6d..0000000000 --- a/tools/get-git-svn-rev +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Usage: get-scala-rev [dir] -# Figures out current scala revision of an svn checkout or -# a git-svn mirror (or a git clone.) -# -# If no dir is given, current working dir is used. - -DIR="" -if [ $# -eq 0 ]; then - DIR=`pwd` -else - DIR=$1 -fi - -cd $DIR - -if [ -d .svn ]; then - svn info . | grep ^Revision | sed 's/Revision: //' -elif [ -d .git ]; then - GIT_PAGER=cat - # this grabs more than one line because otherwise if you have local - # commits which aren't in git-svn it won't see any revision. - git log -10 | grep git-svn-id | head -1 | sed 's/[^@]*@\([0-9]*\).*/\1/' -else - echo "${DIR} doesn't appear to be git or svn dir." >&2 - echo 0 - exit 1 -fi diff --git a/tools/get-scala-revision b/tools/get-scala-revision index 685ce67a6d..4d6e67f79e 100755 --- a/tools/get-scala-revision +++ b/tools/get-scala-revision @@ -16,7 +16,8 @@ fi cd $DIR if [ -d .svn ]; then - svn info . | grep ^Revision | sed 's/Revision: //' + # 2>&1 to catch also error output (e.g. svn warnings) + svn info . 2>&1 | grep ^Revision | sed 's/Revision: //' elif [ -d .git ]; then GIT_PAGER=cat # this grabs more than one line because otherwise if you have local |