diff --git a/.gitignore b/.gitignore index a30b3e33..19efae5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,11 @@ *.*~ .*.sw[a-p] -/.classpath -/.nbattrs -/.project -/bin -/dist -/doc/javadoc +/target /libs -/src/generated -/src/native/generated /src/native/common/Debug /src/native/common/Release /src/native/windows/Debug /src/native/windows/Release -/temp /src/native/*/org_lwjgl_*.h /src/native/*/*/org_lwjgl_*.h /src/native/linux/org_lwjgl_opengl_Display.c - -nbproject/project.xml -/nbproject/private/ - -/applet/advance/*.jar -/applet/basic/*.jar -/applet/advance/*.lzma -/applet/basic/*.lzma diff --git a/.tool-versions b/.tool-versions index fca290be..ab6a3328 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -java adoptopenjdk-8.0.302+8 +java adoptopenjdk-8.0.322+6 diff --git a/applet/advance/appletloader.html b/applet/advance/appletloader.html deleted file mode 100644 index 84d79c5c..00000000 --- a/applet/advance/appletloader.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - AppletLoader - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- if al_debug is true the applet will load and extract resources with a delay, to be able to see the loader process. -

- - - diff --git a/applet/appletviewer.policy b/applet/appletviewer.policy deleted file mode 100644 index 232d999e..00000000 --- a/applet/appletviewer.policy +++ /dev/null @@ -1,5 +0,0 @@ -keystore "lwjglkeystore"; - -grant SignedBy "lwjgl" { - permission java.security.AllPermission; -}; diff --git a/applet/basic/basicapplet.html b/applet/basic/basicapplet.html deleted file mode 100644 index cd4d98de..00000000 --- a/applet/basic/basicapplet.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - AppletLoader - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- if al_debug is true the applet will load and extract resources with a delay, to be able to see the loader process. -

- - - diff --git a/applet/lwjglkeystore b/applet/lwjglkeystore deleted file mode 100644 index 9d256820..00000000 Binary files a/applet/lwjglkeystore and /dev/null differ diff --git a/build.sh b/build.sh index a8f98aa3..842778df 100755 --- a/build.sh +++ b/build.sh @@ -2,6 +2,10 @@ set -e +# fixes the focus-stealing bug on macOS and seems to improve performance +export JAVA_TOOL_OPTIONS='-Djava.awt.headless=true' + +# ensure that JAVA_HOME is set export JAVA_HOME=${JAVA_HOME:-`asdf where java`} ant generate-all diff --git a/build.xml b/build.xml index b8d5e743..04cc7176 100644 --- a/build.xml +++ b/build.xml @@ -4,10 +4,7 @@ - - - @@ -18,41 +15,12 @@ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + @@ -60,7 +28,7 @@ @@ -70,8 +38,7 @@ Build aborted by user. - - + @@ -79,9 +46,6 @@ - - - @@ -89,16 +53,15 @@ - - + - - + + @@ -124,7 +87,7 @@ - + @@ -133,7 +96,7 @@ - + @@ -145,7 +108,7 @@ - + @@ -153,28 +116,14 @@ - - - - - - - - - - - - - - - + - + @@ -184,7 +133,7 @@ - + @@ -203,9 +152,9 @@ - + - + @@ -221,7 +170,7 @@ - + @@ -229,73 +178,66 @@ - + - + - + - + - + - + - + - + - - + + - - - - - - - - + - + - + @@ -304,7 +246,7 @@ - + @@ -312,7 +254,7 @@ - + @@ -321,17 +263,17 @@ - + - + - + @@ -343,7 +285,7 @@ - + @@ -355,7 +297,7 @@ - + @@ -363,7 +305,7 @@ - + @@ -437,35 +379,31 @@ - - - - + + + + - - - - - + + + + + - - - - - - - + + + - - + + - + - + @@ -475,8 +413,8 @@ - - + + @@ -513,35 +451,35 @@ - + - + - + - + - + - + - + - + @@ -549,17 +487,17 @@ - + - + - - + + @@ -577,17 +515,17 @@ - + - + - + - + @@ -638,13 +576,6 @@ - - - - - - - @@ -671,22 +602,10 @@ - + Lightweight Java Game Toolkit]]> Copyright © 2002-2009 lwjgl.org. All Rights Reserved.]]> - - - - - - - - - - - - diff --git a/doc/javadoc b/doc/javadoc new file mode 120000 index 00000000..b95affa8 --- /dev/null +++ b/doc/javadoc @@ -0,0 +1 @@ +../target/doc/javadoc \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.build/.classpath b/eclipse-update/org.lwjgl.build/.classpath deleted file mode 100644 index 771428d6..00000000 --- a/eclipse-update/org.lwjgl.build/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/eclipse-update/org.lwjgl.build/.project b/eclipse-update/org.lwjgl.build/.project deleted file mode 100644 index 7689f7f9..00000000 --- a/eclipse-update/org.lwjgl.build/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.lwjgl.build - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/eclipse-update/org.lwjgl.build/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl.build/META-INF/MANIFEST.MF deleted file mode 100644 index e7a4d6ad..00000000 --- a/eclipse-update/org.lwjgl.build/META-INF/MANIFEST.MF +++ /dev/null @@ -1,14 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Updatesite Build -Bundle-SymbolicName: org.lwjgl.build -Bundle-Version: 1.0.0 -Export-Package: org.lwjgl.ant -Import-Package: org.apache.tools.ant, - org.apache.tools.ant.taskdefs, - org.apache.tools.ant.types, - org.apache.tools.ant.types.selectors, - org.apache.tools.ant.util, - org.junit;version="4" -Bundle-Vendor: Lightweight Java Game Library Project -Require-Bundle: org.junit;bundle-version="4.8.1" diff --git a/eclipse-update/org.lwjgl.build/READ.ME b/eclipse-update/org.lwjgl.build/READ.ME deleted file mode 100644 index f2e6bbe9..00000000 --- a/eclipse-update/org.lwjgl.build/READ.ME +++ /dev/null @@ -1,98 +0,0 @@ -How to build the Eclipse update site ------------------------------------- -Author: Jens von Pilgrim - -Building the Eclipse update site is fully integrated into the main LWJGL build script. -Here is how to build the update site: - -Run main lwjgl ant script (LWJGL/build.xml) with target "eclipse-updatesite" - -You will find the updatesite in - LWJGL/eclipse-update/org.lwjgl.build/build/plugins/org.lwjgl.updatesite - -Note that there are two targets: eclipse-updatesite and -eclipse-updatesite-simple. The first one depends from the target "release", -defined in the main build file. However, if you are sure the relase target has -been called before, you may want to only create the update site without -building the release target again. In that case, you can all -eclipse-update-simple. - -The update site build requires some Java classes to be precompiled. These classes -can be found in some zip archives in folder plugin-classes and anttasks.jar. -Building these classes requires Eclipse dependencies (in case of the -plugin-classes) or they define anttasks required to be present when running ant. -In order to build these classes, open all projects found in subfolder -LWJGL/eclipse-update in Eclipse: this way, all Eclipse classes will get -automatically compiled. Then run the ant script buildEclipseClasses.xml from -within Eclipse. Actually, this is rarely necessary as the archives are all -committed to the LWJGL SVN and will be present if you check out everything. You -only need to run that build if the Eclise plugin classes (or the anttasks) were -changed. - -The build plugin is part of the LWJGL Eclipse plugins. The following plugins are -required: - -org.lwjgl - Skeleton plugin, that is it contains the Eclipse Activator for setting up the - native library path, but the lwjgl jars are missing. These jars are added by - the build script later on - -org.lwjgl.source - Skeleton plugin for sources, plugin.xml etc are already configured, but again - the sources itself are only added by the build script later on - -org.lwjgl.doc - Skeleton plugin for documentation, Javadoc is added by build script, however - some Eclipse help files are already in place - -org.lwjgl.info - This plugin was called org.lwjgl.test in the elder version. I renamed it as it - does not really contain a test but Eclipse views. Besides the spinning torus - test view, I added an info view printing out current version of driver etc. - and capabilities of user's OpenGL system - -org.lwjgl.tools - This plugin contains a library set up for plain Java projects, in order to get - rid of defining additional parameters in the run configuration. It is - documented in the help files. I have sent you this plugin once, but it never - made it into the update site. Well, now it is in place - -org.lwjgl.feature - Feature plugin referencing the core lwjgl plugin. It contains two - feature.xml definitions, one used for playing around in Eclipse, and a - template which is used by the build script. If you ever change something - here, pay attention to also change the template file. - -org.lwjgl.feature.sdk - Feature plugin referencing the src, doc, tools and info lwjgl plugin. - It contains two feature.xml definitions, one used for playing around in - Eclipse, and a template which is used by the build script. If you ever change - something here, pay attention to also change the template file. - -org.lwjgl.updatesite - Well, this is the updatesite. As in the feature project, site.xml comes - together with a template version used by the build script. - -org.lwjgl.build -- THIS Plugin - This is the build script project. Although it is an Eclipse project, you can - simply run the build script with ant from command line. See later on. - -Everything is created in LWJGL/eclipse-update/org.lwjgl.build/build. - -Some additional remarks: -- The version number is automatically "normalized" to Eclipse standards, - that is 2.6 will become 2.6.0 with the current date and time added. -- The lwjgl-debug.jar is not added to the org.lwjgl plugin, as I do not know - how to select one or the other. But I have not further investigated in - that direction. -- Note that only the created plugin and feature jars are signed, and not the - nested lwjgl.jar etc., as I figure that you will sign these jars yourself - when creating the zip files. -- When testing the update site and the installation of plugins, pay attention - to the Eclipse P2 system, which caches a lot of things. Simply uninstalling - a plugin does not remove the plugins from the Eclipse installation. When - the very same version is re-installed, instead of loading new files from the - update site these pre-installed versions are reused! Since the date and time - is added to the plugin version number, this should cause no problems. -- default values for keystore, alias and passphrase are the same as in - lwjgl-applet diff --git a/eclipse-update/org.lwjgl.build/anttasks.jar b/eclipse-update/org.lwjgl.build/anttasks.jar deleted file mode 100644 index c728f2ed..00000000 Binary files a/eclipse-update/org.lwjgl.build/anttasks.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl.build/build-updatesite.xml b/eclipse-update/org.lwjgl.build/build-updatesite.xml deleted file mode 100644 index 5f7f37c2..00000000 --- a/eclipse-update/org.lwjgl.build/build-updatesite.xml +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Building plugins for version ${lwjgl.version}, normalized version ${eclipse.normversion} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Lightweight Java Game Library -Bundle-SymbolicName: org.lwjgl -Bundle-Version: ${eclipse.normversion} -Bundle-Vendor: ${eclipse.bundle.vendor} -Bundle-Activator: org.lwjgl.Activator -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime -Bundle-ActivationPolicy: lazy -Export-Package: org.lwjgl.eclipse,${NL} ${eclipse.bundle.export-package} -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Bundle-ClassPath: .,${NL} ${eclipse.bundle.classpath.jars} - - - - - Manifest-Version: 1.0 -Bundle-Vendor: ${eclipse.bundle.vendor} -Bundle-Version: ${eclipse.normversion} -Bundle-SymbolicName: org.lwjgl.doc;singleton:=true -Bundle-Localization: plugin -Require-Bundle: org.eclipse.help;bundle-version="3.2.0" -Eclipse-LazyStart: true - - - - - - - - Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Sources -Bundle-Vendor: ${eclipse.bundle.vendor} -Bundle-Version: ${eclipse.normversion} -Bundle-SymbolicName: org.lwjgl.source;singleton:=true -Bundle-Localization: plugin - - - - Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Test and Info View -Bundle-Vendor: ${eclipse.bundle.vendor} -Bundle-Version: ${eclipse.normversion} -Bundle-SymbolicName: org.lwjgl.info;singleton:=true -Bundle-Localization: plugin -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.ui.views, - org.eclipse.core.resources, - org.lwjgl -Bundle-RequiredExecutionEnvironment: J2SE-1.5 - - - - - - Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Tools Plug-in -Bundle-SymbolicName: org.lwjgl.tools;singleton:=true -Bundle-Version: ${eclipse.normversion} -Bundle-Vendor: ${eclipse.bundle.vendor} -Bundle-Activator: org.lwjgl.tools.Activator -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.core.resources;bundle-version="3.4.0", - org.eclipse.jdt.core;bundle-version="3.4.0", - org.eclipse.jdt.ui;bundle-version="3.4.0", - org.lwjgl;bundle-version="${eclipse.normversion}", - org.eclipse.jdt.launching;bundle-version="3.4.0" -Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: J2SE-1.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Created Eclipse update site: ${eclipse.build.plugins}/org.lwjgl.updatesite - - - - - - - - This plugin is to be called from main LWJGL build.xml file. - It creates the update site, the result will be found in - ${eclipse.build.plugins}/org.lwjgl.updatesite - For more information, read READ.ME - - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.build/build.properties b/eclipse-update/org.lwjgl.build/build.properties deleted file mode 100644 index cc29de28..00000000 --- a/eclipse-update/org.lwjgl.build/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/java/ -bin.includes = META-INF/,\ - . diff --git a/eclipse-update/org.lwjgl.build/buildEclipseClasses.xml b/eclipse-update/org.lwjgl.build/buildEclipseClasses.xml deleted file mode 100644 index 3c18edee..00000000 --- a/eclipse-update/org.lwjgl.build/buildEclipseClasses.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Call this ant script in order to create archives containing the classes of all - Eclipes plugin related classes, such as Activors. - This build file removes the burden of building Eclipse dependent classes from - within the main build script - - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.info.zip b/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.info.zip deleted file mode 100644 index 194587b4..00000000 Binary files a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.info.zip and /dev/null differ diff --git a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.tools.zip b/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.tools.zip deleted file mode 100644 index 02bf0097..00000000 Binary files a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.tools.zip and /dev/null differ diff --git a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.zip b/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.zip deleted file mode 100644 index 42217f77..00000000 Binary files a/eclipse-update/org.lwjgl.build/plugin-classes/org.lwjgl.zip and /dev/null differ diff --git a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/NormalizeVersion.java b/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/NormalizeVersion.java deleted file mode 100644 index a7a48edc..00000000 --- a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/NormalizeVersion.java +++ /dev/null @@ -1,237 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.ant; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; - -/** - * Normalizes a version number and stores result in a property. The version - * number is normalized as "%n.%n.%n", e.g. "2.6" becomes "2.6.0" - * - * @author Jens von Pilgrim - * @since Nov 14, 2010 - * @see http://wiki.eclipse.org/index.php/Version_Numbering - */ -public class NormalizeVersion extends Task { - - public final static String SEGMENTS[] = { "major", "minor", "service", - "qualifier" }; - - public final static String VERSION_QUALIFIER_PATTERN = "yyyyMMdd-HHmm"; - - /** - * name of the property to set - */ - protected String property; - - protected String version; - - protected boolean addDateQualifier = false; - - /** - * @return the addQualifier - */ - public boolean isAddDateQualifier() { - return addDateQualifier; - } - - /** - * @param i_addQualifier the addQualifier to set - */ - public void setAddDateQualifier(boolean i_addDateQualifier) { - addDateQualifier = i_addDateQualifier; - } - - /** - * @return the property - */ - public String getProperty() { - return property; - } - - /** - * @param i_property the property to set - */ - public void setProperty(String i_property) { - property = i_property; - } - - /** - * @return the versionNumber - */ - public String getVersion() { - return version; - } - - /** - * @param i_versionNumber the versionNumber to set - */ - public void setVersion(String version) { - this.version = version; - } - - /** - * check for errors - * @throws BuildException if we are not configured right - */ - private void validate() { - //validation - if (property == null) { - throw new BuildException("attribute property missing"); - } - if (version == null) { - throw new BuildException("attribute version missing"); - } - String s = getVersion().trim(); - int sn = 0; - boolean qualifier = false; - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) == '.') { - sn++; - } else { - - qualifier = !Character.isDigit(s.charAt(i)); - if (sn < 1 && !Character.isDigit(s.charAt(i))) { - - throw new BuildException( - "Wrong version format, must contain only digits in the " - + SEGMENTS[sn] + " segment, was " - + s.substring(0, i) + ">>" + s.charAt(i) - + "<<" + s.substring(i + 1)); - - } - } - } - if ((sn > 2 || qualifier) && isAddDateQualifier()) { - throw new BuildException( - "Cannot add date qualifier, qualifier already specified"); - } - } - - /** - * Sets given property with normalized version number accoring to - * major.minor.service[.qualifier] - * {@inheritDoc} - * @see org.apache.tools.ant.Task#execute() - */ - @Override - public void execute() throws BuildException { - validate(); - //now exit here if the property is already set - if (getProject().getProperty(property) != null) { - return; - } - - String normalizedVersionNumber = doExecute(); - - getProject().setNewProperty(property, normalizedVersionNumber); - } - - /** - * @return - */ - protected String doExecute() { - String s = getVersion().trim(); - StringBuilder n = new StringBuilder(); - int snIndex = 0; - boolean qualifier = false; - - String digits = ""; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (Character.isDigit(c) && !qualifier) { - digits += c; - } else if (c == '.') { - if (qualifier) { - throw new BuildException( - "Wrong format, qualifier must not contain a dot in " - + s); - } - if (snIndex < 3) { - if (digits.length() > 0) { - if (snIndex > 0) - n.append('.'); - n.append(digits); - digits = ""; - snIndex++; - } - } else { - throw new BuildException( - "Wrong format, expected digit, was " + c - + " at pos " + i + " of " + s); - } - } else if (Character.isJavaIdentifierPart(c)) { - if (digits.length() > 0) { - throw new BuildException( - "Wrong format, qualifier must not start with digits in " - + s); - } - if (!qualifier) { - switch (snIndex) { - case 0: // e.g. "beta" - n.append("0"); - break; - case 1: // e.g. "1.beta - n.append(".0"); - case 2: // e.g. "1.2.beta - n.append(".0"); - } - qualifier = true; - n.append('.'); - } - n.append(c); - } - - } - - if (!qualifier) { - if (digits.length() > 0) { - if (snIndex > 0) - n.append('.'); - n.append(digits); - snIndex++; - } - switch (snIndex) { - case 0: // e.g. "" - n.append("0"); - break; - case 1: // e.g. "1.beta - n.append(".0"); - case 2: // e.g. "1.2.beta - n.append(".0"); - } - if (isAddDateQualifier()) - n.append(createDateQualifier()); - } else { - if (isAddDateQualifier()) { - throw new BuildException( - "Cannot add date qualifier, qualifier already specified"); - } - } - - return n.toString(); - } - - /** - * @return - */ - private String createDateQualifier() { - return ".v" - + new SimpleDateFormat(VERSION_QUALIFIER_PATTERN) - .format(new Date()); - } - -} diff --git a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/PackageList.java b/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/PackageList.java deleted file mode 100644 index 2c9770f1..00000000 --- a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/PackageList.java +++ /dev/null @@ -1,270 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.ant; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.Vector; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.taskdefs.Expand; -import org.apache.tools.ant.types.PatternSet; -import org.apache.tools.ant.types.selectors.SelectorUtils; -import org.apache.tools.ant.util.FileNameMapper; -import org.apache.tools.ant.util.FileUtils; - -/** - * Ant task extracting package names (or generally directory names) into given - * property. - * - * Parameters: - * - just like unzip, except dest can be null and is ignored otherwise - * - property - name of property storing the resulting list - * - pathsep - path separator, default "," - * - dirsep - directory separator, default "." - * - includeemptydirs -- whether to include empty directories, default: false - * - * @author Jens von Pilgrim - * @since 12.09.2007 - */ -public class PackageList extends Expand { - - /** - * The property to receive the conversion - */ - private String property = null; - - /** - * User override on path sep char - */ - private String pathSep = ","; - - /** - * User override on directory sep char - */ - private String dirSep = "."; - - - private boolean includeemptydirs = false; - - class IntegerContainer { - int value; - - public void inc() { - value++; - } - }; - - TreeMap packagelist = new TreeMap(); - - /** - * {@inheritDoc} - * @see org.apache.tools.ant.taskdefs.Expand#execute() - */ - @Override - public void execute() throws BuildException { - - setDest(new File(" no file, files are only listed internaly")); - super.execute(); - - StringBuffer strb = new StringBuffer(); - for (String name : packagelist.keySet()) { - - // System.out.println("name: " + name + " (" +packagelist.get(name).value + ")" ); - - if (includeemptydirs || packagelist.get(name).value > 0) { - if (strb.length() > 0) { - strb.append(pathSep); - } - StringTokenizer stDirectory = new StringTokenizer(name, "/", - true); - - while (stDirectory.hasMoreTokens()) { - String token = stDirectory.nextToken(); - strb.append("/".equals(token) ? dirSep : token); - } - } - } - - if (property != null) { - String value = strb.toString(); - getProject().setNewProperty(property, value); - } - - } - - private Vector patternsets = new Vector(); - - /** - * Add a patternset. - * @param set a pattern set - */ - public void addPatternset(PatternSet set) { - super.addPatternset(set); - patternsets.addElement(set); - } - - /** - * {@inheritDoc} - * @see org.apache.tools.ant.taskdefs.Expand#extractFile(org.apache.tools.ant.util.FileUtils, java.io.File, java.io.File, java.io.InputStream, java.lang.String, java.util.Date, boolean, org.apache.tools.ant.util.FileNameMapper) - */ - @Override - protected void extractFile(FileUtils i_fileUtils, File i_srcF, File i_dir, - InputStream i_compressedInputStream, String i_entryName, - Date i_entryDate, boolean i_isDirectory, FileNameMapper i_mapper) - throws IOException { - - if (!matchPatterns(i_entryName)) { - //Do not process this file - return; - } - - String strDir = getDir(i_isDirectory, i_entryName); - if (strDir != null && !"META-INF".equals(strDir)) { - if (!packagelist.containsKey(strDir)) { - packagelist.put(strDir, new IntegerContainer()); - } - if (!i_isDirectory) { - packagelist.get(strDir).inc(); - } - } - - } - - /** - * @param i_entryName - */ - private boolean matchPatterns(String i_entryName) { - if (patternsets != null && patternsets.size() > 0) { - boolean included = false; - String name = i_entryName.replace('/', File.separatorChar).replace( - '\\', File.separatorChar); - - Set includePatterns = new HashSet(); - Set excludePatterns = new HashSet(); - for (int v = 0, size = patternsets.size(); v < size; v++) { - PatternSet p = (PatternSet) patternsets.elementAt(v); - String[] incls = p.getIncludePatterns(getProject()); - if (incls == null || incls.length == 0) { - // no include pattern implicitly means includes="**" - incls = new String[] { "**" }; - } - - for (int w = 0; w < incls.length; w++) { - String pattern = incls[w].replace('/', File.separatorChar) - .replace('\\', File.separatorChar); - if (pattern.endsWith(File.separator)) { - pattern += "**"; - } - includePatterns.add(pattern); - } - - String[] excls = p.getExcludePatterns(getProject()); - if (excls != null) { - for (int w = 0; w < excls.length; w++) { - String pattern = excls[w].replace('/', - File.separatorChar).replace('\\', - File.separatorChar); - if (pattern.endsWith(File.separator)) { - pattern += "**"; - } - excludePatterns.add(pattern); - } - } - } - - for (Iterator iter = includePatterns.iterator(); !included - && iter.hasNext();) { - String pattern = iter.next(); - included = SelectorUtils.matchPath(pattern, name); - } - - for (Iterator iter = excludePatterns.iterator(); included - && iter.hasNext();) { - String pattern = iter.next(); - included = !SelectorUtils.matchPath(pattern, name); - } - - return included; - } - return true; - } - - /** - * @param i_isDirectory - * @param i_entryName - * @return - */ - private String getDir(boolean i_isDirectory, String i_entryName) { - - if (i_entryName == null) - return null; - int iIndex = i_entryName.lastIndexOf('/'); - if (iIndex >= 0) { - return i_entryName.substring(0, iIndex); - } - if (i_isDirectory) { - return i_entryName; - } - return null; - } - - /** - * Set the name of the property into which the converted path will be placed. - * @param p the property name. - */ - public void setProperty(String p) { - property = p; - } - - /** - * Set the default path separator string; defaults to current JVM - * {@link java.io.File#pathSeparator File.pathSeparator}. - * @param sep path separator string. - */ - public void setPathSep(String sep) { - pathSep = sep; - } - - /** - * Set the default directory separator string; - * defaults to current JVM {@link java.io.File#separator File.separator}. - * @param sep directory separator string. - */ - public void setDirSep(String sep) { - dirSep = sep; - } - - /** - * Simple getter for attribute includeemptydirs. - * @return the includeemptydirs - */ - public boolean isIncludeemptydirs() { - return includeemptydirs; - } - - /** - * Simple setter for attribute includeemptydirs. - * @param i_includeemptydirs the includeemptydirs to set - */ - public void setIncludeemptydirs(boolean i_includeemptydirs) { - includeemptydirs = i_includeemptydirs; - } - -} diff --git a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java b/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java deleted file mode 100644 index 8068ddbd..00000000 --- a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java +++ /dev/null @@ -1,1535 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Jens von Pilgrim and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ - -package org.lwjgl.ant; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.jar.JarEntry; -import java.util.jar.JarInputStream; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathFactory; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -/** - * Ant task creating p2 metadata files "content.xml" and "artifact.xml" based - * on existent plugins and features within an update site. - *

- * This task is a lighweight (and quick and dirty) version of the ant task - * "p2.publish.featuresAndBundles" - * provided by the Eclipse p2 plugin. However, it does not depend on any - * Eclipse related classes! - *

- *

Warning: This task is only tested with the LWJGL update site, - * if you have a different update site, you better test it by comparing its - * output with the files created by the original p2 tools.

- * - * @author Jens von Pilgrim (developer@jevopi.de) - * @since Dec 9, 2011 - * @see org.eclipse.equinox.p2.publisher.Publisher - */ -public class StandalonePublisher extends Task { - - public final static int BUFFERSIZE = 2048; - - public final static FileFilter JAR_FILTER = new FileFilter() { - - public boolean accept(File i_pathname) { - return i_pathname.isFile() && i_pathname.getName().endsWith(".jar"); - } - }; - - protected String updateSiteFolder; - - protected String repositoryName; - - protected String repositoryURI; - - protected Document currentDoc; - - protected boolean compressed = false; - - protected final XPath xpath = XPathFactory.newInstance().newXPath(); - - public abstract class XMLBasedInfo { - public Document doc; - - abstract public String getRootElementName(); - - public String xpath(String path) { - if (path.startsWith("/")) - return StandalonePublisher.this.xpath(doc, path); - else - return StandalonePublisher.this.xpath(doc, "//" - + getRootElementName() + "/" + path); - } - - public List xpathNods(String path) { - try { - XPathExpression expression = xpath.compile(path); - NodeList nodes = (NodeList) expression.evaluate(doc, - XPathConstants.NODESET); - - List list = new ArrayList(nodes.getLength()); - for (int i = 0; i < nodes.getLength(); i++) { - list.add(nodes.item(i)); - } - - return list; - } catch (Exception ex) { - System.err.println(ex); - return Collections.emptyList(); - } - } - } - - public class SiteInfo extends XMLBasedInfo { - /** - * {@inheritDoc} - * @see org.lwjgl.ant.StandalonePublisher.XMLBasedInfo#getRootElementName() - */ - @Override - public String getRootElementName() { - return "site"; - } - } - - public static class CategoryInfo { - String id; - - String name; - - String label; - - String description = ""; - - List required = new ArrayList( - 5); - - public String getVersion() { - String version = "0.0.0"; - for (FeatureInfo featureInfo : required) { - String v = featureInfo.getVersion(); - if (version.compareTo(v) < 0) { - version = v; // quick hack, not really correct - } - } - return version; - - } - - String getID() { - if (id == null) { - String timeStamp = new SimpleDateFormat("yyyyMMddHHmm") - .format(new Date()); - id = timeStamp + "." + name; - } - return id; - } - - public String getLabel() { - if (label==null || label.isEmpty()) return name; - return label; - } - - } - - public class FeatureInfo extends XMLBasedInfo { - - public String getClassifier() { - return "org.eclipse.update.feature"; - } - - public String getContentType() { - return "application/zip"; - } - - public String getRootElementName() { - return "feature"; - } - - public int size; - - public File jarFile; - - /** - * @return - */ - public String getID() { - return xpath("@id"); - } - - /** - * @return - */ - public String getVersion() { - return xpath("@version"); - } - } - - public class BundleInfo extends FeatureInfo { - - @Override - public String getID() { - return mfval("Bundle-SymbolicName"); - } - - @Override - public String getVersion() { - return mfval("Bundle-Version"); - } - - @Override - public String getClassifier() { - return "osgi.bundle"; - }; - - @Override - public String getContentType() { - return null; - } - - @Override - public String getRootElementName() { - return "plugin"; - } - - public Manifest manifest; - - public String mf(String attrib) { - return manifest.getMainAttributes().getValue(attrib); - } - - public String mfval(String attrib) { - return mfval(attrib, ""); - } - - /** - * @param i_value - * @param i_string - * @return - */ - public String mfval(String attrib, String key) { - String value = manifest.getMainAttributes().getValue(attrib); - if (value == null || value.isEmpty()) - return ""; - for (String s : value.split(";")) { - - if ("".equals(key)) - return s; - int l = 2; - int p = s.indexOf(":="); - if (p < 0) { - p = s.indexOf("="); - l = 1; - } - if (p > 0) { - String k = s.substring(0, p); - String v = s.substring(p + l); - if (key.equals(k)) { - v = v.trim(); - v = v.replaceAll("^\"([^\"]*)\"$", "\\1"); - return v; - } - } - - } - - return ""; - } - - public String valIndex(String[] attribValues, int index, String key) { - - if (attribValues.length <= index) - return ""; - String value = attribValues[index]; - for (String s : value.split(";")) { - - if ("".equals(key)) - return s; - int l = 2; - int p = s.indexOf(":="); - if (p < 0) { - p = s.indexOf("="); - l = 1; - } - if (p > 0) { - String k = s.substring(0, p); - String v = s.substring(p + l); - if (key.equals(k)) { - v = v.trim(); - v = v.replaceAll("^\"\\s*", ""); - v = v.replaceAll("\\s*\"$", ""); - return v; - } - } - - } - - return ""; - } - - public String mfval(String attrib, String key, String def) { - String v = mfval(attrib, key); - if (v == null || v.isEmpty()) - return def; - return v; - } - - public String valIndex(String[] attribValues, int index, String key, - String def) { - String v = valIndex(attribValues, index, key); - if (v == null || v.isEmpty()) - return def; - return v; - } - } - - protected String xpath(Node node, String path) { - try { - XPathExpression expression = xpath.compile(path); - NodeList nodes = (NodeList) expression.evaluate(node, - XPathConstants.NODESET); - String s = nodes.item(0).getNodeValue(); - s = s.replaceAll("^\\s+", ""); - s = s.replaceAll("\\s+$", ""); - return s; - } catch (Exception ex) { - System.err.println(ex); - return null; - } - } - - protected FeatureInfo readFeature(File featureArchive) - throws ParserConfigurationException { - - FeatureInfo info = new FeatureInfo(); - info.jarFile = featureArchive; - info.size = (int) featureArchive.length(); - - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - - JarInputStream jis = null; - try { - jis = new JarInputStream(new FileInputStream(featureArchive)); - - JarEntry jarEntry; - while ((jarEntry = jis.getNextJarEntry()) != null) { - if (!jarEntry.isDirectory() - && "feature.xml".equals(jarEntry.getName())) { - - Document doc = readXMLinJar(docBuilder, jis, jarEntry); - info.doc = doc; - break; - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } finally { - if (jis != null) - try { - jis.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - return info; - - } - - protected BundleInfo readBundle(File location) - throws ParserConfigurationException { - BundleInfo info = new BundleInfo(); - info.jarFile = location; - info.size = (int) location.length(); - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - JarInputStream jis = null; - try { - jis = new JarInputStream(new FileInputStream(location)); - info.manifest = jis.getManifest(); - - JarEntry jarEntry; - while ((jarEntry = jis.getNextJarEntry()) != null) { - if (!jarEntry.isDirectory() - && "plugin.xml".equals(jarEntry.getName())) { - - Document doc = readXMLinJar(docBuilder, jis, jarEntry); - info.doc = doc; - break; - } - - } - - } catch (Exception ex) { - ex.printStackTrace(); - } finally { - if (jis != null) - try { - jis.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - - return info; - - } - - protected Collection readSite( - DocumentBuilder documentBuilder, FeatureInfo[] featureInfos) - throws Exception { - - File f = new File(updateSiteFolder + File.separator + "site.xml"); - if (!f.exists()) { - f = new File(updateSiteFolder + File.separator + "category.xml"); - } - - Map featuresById = new HashMap(); - for (FeatureInfo featureInfo : featureInfos) { - featuresById.put(featureInfo.getID(), featureInfo); - } - - Map categoryInfos = new HashMap(); - Map featureToGroup = new HashMap(); - - if (f.exists()) { - SiteInfo site = new SiteInfo(); - site.doc = readXML(documentBuilder, new FileInputStream(f)); - - List categories = site.xpathNods("//site//category-def"); - for (Node category : categories) { - CategoryInfo categoryInfo = new CategoryInfo(); - categoryInfo.name = xpath(category, "@name"); - categoryInfo.label = xpath(category, "@label"); - categoryInfo.description = xpath(category, "description/text()"); - categoryInfos.put(categoryInfo.name, categoryInfo); - } - - List features = site.xpathNods("//site//feature"); - for (Node feature : features) { - featureToGroup.put(xpath(feature, "@id"), - xpath(feature, "category/@name")); - } - - } - - // sort features to their category: - List sortedFeatures = new ArrayList(); - for (String id : featuresById.keySet()) { - String categoryName = featureToGroup.get(id); - if (categoryName != null) { - CategoryInfo categoryInfo = categoryInfos.get(categoryName); - categoryInfo.required.add(featuresById.get(id)); - sortedFeatures.add(id); - } - } - for (String id : sortedFeatures) { - featuresById.remove(id); - } - - if (!featuresById.isEmpty()) { - CategoryInfo categoryInfo = categoryInfos.get(this.repositoryName); - if (categoryInfo == null) { - categoryInfo = new CategoryInfo(); - categoryInfo.name = this.repositoryName; - categoryInfo.label = this.repositoryName; - categoryInfo.description = ""; - categoryInfos.put(categoryInfo.name, categoryInfo); - } - - for (FeatureInfo featureInfo : featuresById.values()) { - categoryInfo.required.add(featureInfo); - } - - } - - return categoryInfos.values(); - } - - /** - * @param i_documentBuilder - * @param i_fileInputStream - * @return - */ - protected Document readXML(DocumentBuilder docBuilder, InputStream is) - throws Exception { - Document doc = docBuilder.parse(is); - return doc; - } - - /** - * @param docBuilder - * @param jis - * @param jarEntry - * @return - * @throws IOException - * @throws SAXException - */ - protected Document readXMLinJar(DocumentBuilder docBuilder, - JarInputStream jis, JarEntry jarEntry) throws IOException, - SAXException { - try { - Document doc = docBuilder.parse(jis); - return doc; - } catch (IOException ex) { - System.err.println("Error reading jar entry " + jarEntry + ": ex"); - throw ex; - } - } - - protected static void dump(Node doc) { - System.out.println(doDump(doc)); - } - - protected static String doDump(Node doc) { - StringWriter stringWriter = new StringWriter(); - StreamResult sr = new StreamResult(stringWriter); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer t = null; - Properties oprops = new Properties(); - oprops.put(OutputKeys.METHOD, "xml"); - oprops.put(OutputKeys.STANDALONE, "yes"); - oprops.put(OutputKeys.INDENT, "yes"); - try { - t = tf.newTransformer(); - t.setOutputProperties(oprops); - t.transform(new DOMSource(doc), sr); - } catch (Exception e) { - } - return stringWriter.toString(); - - } - - protected static void dump(Manifest manifest) { - System.out.println(doDump(manifest)); - } - - protected static String doDump(Manifest manifest) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - try { - manifest.write(os); - return os.toString(); - } catch (IOException ex) { - ex.printStackTrace(); - return ""; - } - } - - protected static String escapeToXMLAttrib(String s) { - return s.replaceAll("\r", "").replaceAll("\n\\s+", ""); - //.replaceAll("\"", """); - } - - public void doExecute() throws Exception { - File f = new File(updateSiteFolder + File.separator + "features"); - - File[] locations = f.listFiles(JAR_FILTER); - FeatureInfo[] featureInfos = new FeatureInfo[locations.length]; - for (int i = 0; i < locations.length; i++) { - featureInfos[i] = readFeature(locations[i]); - } - - f = new File(updateSiteFolder + File.separator + "plugins"); - locations = f.listFiles(JAR_FILTER); - BundleInfo[] bundleInfos = new BundleInfo[locations.length]; - for (int i = 0; i < locations.length; i++) { - bundleInfos[i] = readBundle(locations[i]); - } - - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - Collection categoryInfos = readSite(docBuilder, - featureInfos); - - writeContent(featureInfos, bundleInfos, categoryInfos); - writeArtifacts(featureInfos, bundleInfos); - - } - - /** - * @param i_featureInfos - * @param i_bundleInfos - * @param i_categoryInfos - * @throws Exception - */ - protected void writeContent(FeatureInfo[] i_featureInfos, - BundleInfo[] i_bundleInfos, Collection i_categoryInfos) - throws Exception { - - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - // - Document content = docBuilder.newDocument(); - content.setXmlStandalone(false); - content.setTextContent(repositoryName); - currentDoc = content; - // - - content.appendChild(content.createProcessingInstruction( - "metadataRepository", "version='1.1.0'")); - Element repository = addElement( - content, - "repository", // - "name", - repositoryName, // - "type", - "org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository", // - "version", "1"); - - addList(repository, - "properties", - createElement("property", "name", "p2.timestamp", "value", - String.valueOf(System.currentTimeMillis())), - createElement("property", "name", "p2.compressed", "value", - String.valueOf(compressed))); - - addList(repository, - "references", - createElement("repository", "uri", repositoryURI, "type", "0", - "options", "0")); - - List units = new ArrayList(); - - for (FeatureInfo featureInfo : i_featureInfos) { - units.add(createUnitForFeature(featureInfo)); - units.add(createUnitForFeatureGroups(featureInfo)); - } - for (BundleInfo bundleInfo : i_bundleInfos) { - units.add(createUnitForBundle(bundleInfo)); - } - - - for (CategoryInfo categoryInfo : i_categoryInfos) { - units.add(createUnitForCategory(categoryInfo)); - } - addList(repository, "units", units); - - //dump(content); - - writeDocument(content, updateSiteFolder + File.separator - + "content.xml"); - - currentDoc = null; - } - - /** - * @param i_featureInfos - * @param i_bundleInfos - * @throws Exception - */ - protected void writeArtifacts(FeatureInfo[] i_featureInfos, - BundleInfo[] i_bundleInfos) throws Exception { - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - // - Document artifact = docBuilder.newDocument(); - artifact.setXmlStandalone(false); - currentDoc = artifact; - - // - - artifact.appendChild(artifact.createProcessingInstruction( - "artifactRepository", "version='1.1.0'")); - Element repository = addElement(artifact, - "repository", // - "name", - repositoryName + " - artifacts", // - "type", - "org.eclipse.equinox.p2.artifact.repository.simpleRepository", // - "version", "1"); - - addList(repository, - "properties", - createElement("property", "name", "p2.timestamp", "value", - String.valueOf(System.currentTimeMillis())), - createElement("property", "name", "p2.compressed", "value", - String.valueOf(compressed))); - addList(repository, - "mappings", - createElement("rule", "filter", "(& (classifier=osgi.bundle))", - "output", "${repoUrl}/plugins/${id}_${version}.jar"), - createElement("rule", "filter", "(& (classifier=binary))", - "output", "${repoUrl}/binary/${id}_${version}"), - createElement("rule", "filter", - "(& (classifier=org.eclipse.update.feature))", - "output", "${repoUrl}/features/${id}_${version}.jar")); - - List artifacts = new ArrayList(); - - for (BundleInfo bundleInfo : i_bundleInfos) { - artifacts.add(createArtifact(bundleInfo)); - } - for (FeatureInfo featureInfo : i_featureInfos) { - artifacts.add(createArtifact(featureInfo)); - } - addList(repository, "artifacts", artifacts); - - //dump(artifact); - - writeDocument(artifact, updateSiteFolder + File.separator - + "artifacts.xml"); - - currentDoc = null; - - } - - /** - * @param i_featureInfo - * @return - * @throws Exception - */ - protected Element createArtifact(FeatureInfo info) throws Exception { - Element artifact = createElement("artifact", "classifier", - info.getClassifier(), "id", info.getID(), "version", - info.getVersion()); - - List properties = new ArrayList(); - properties.add(createElement("property", "name", "artifact.size", - "value", String.valueOf(info.jarFile.length()))); - properties.add(createElement("property", "name", "download.size", - "value", String.valueOf(info.jarFile.length()))); - properties.add(createElement("property", "name", "download.md5", - "value", String.valueOf(md5(info.jarFile)))); - String contentType = info.getContentType(); - if (contentType != null && !contentType.isEmpty()) { - properties.add(createElement("property", "name", - "download.contentType", "value", contentType)); - } - addList(artifact, "properties", properties); - - return artifact; - } - - /** - * @param i_jarFile - * @return - * @throws Exception - */ - protected String md5(File file) throws Exception { - - MessageDigest md = MessageDigest.getInstance("MD5"); - FileInputStream fis = new FileInputStream(file); - byte data[] = new byte[BUFFERSIZE]; - int count; - while ((count = fis.read(data, 0, BUFFERSIZE)) != -1) { - md.update(data, 0, count); - } - byte[] digest = md.digest(); - BigInteger bigInt = new BigInteger(1, digest); - String hashtext = bigInt.toString(16); - - return hashtext; - - } - - /** - * @param content - * @throws TransformerFactoryConfigurationError - * @throws TransformerConfigurationException - * @throws TransformerException - */ - protected void writeDocument(Document content, String targetFile) - throws Exception { - - if (compressed) { - String jarFileNameString = targetFile; - int pos = jarFileNameString.lastIndexOf('.'); - if (pos > 0) { - jarFileNameString = jarFileNameString.substring(0, pos) - + ".jar"; - } else { - jarFileNameString += ".jar"; - } - - JarOutputStream target = new JarOutputStream(new FileOutputStream( - jarFileNameString)); - - pos = targetFile.lastIndexOf(File.separatorChar); - if (pos > 0) { - targetFile = targetFile.substring(pos + 1); - } - - JarEntry entry = new JarEntry(targetFile); - target.putNextEntry(entry); - - StreamResult sr = new StreamResult(target); - doWriteDocument(content, sr); - target.closeEntry(); - target.close(); - } else { - StreamResult sr = new StreamResult(new File(targetFile)); - doWriteDocument(content, sr); - } - } - - /** - * @param content - * @param sr - * @throws TransformerFactoryConfigurationError - * @throws TransformerConfigurationException - * @throws TransformerException - */ - private void doWriteDocument(Document content, StreamResult sr) - throws TransformerFactoryConfigurationError, - TransformerConfigurationException, TransformerException { - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer t = tf.newTransformer(); - Properties oprops = new Properties(); - oprops.put(OutputKeys.METHOD, "xml"); - oprops.put(OutputKeys.INDENT, "yes"); - t.setOutputProperties(oprops); - t.transform(new DOMSource(content), sr); - } - - /** - * @param i_site - * @return - */ - protected Element createUnitForFeatureGroups(FeatureInfo info) { - String version = info.xpath("@version"); - // - Element unit = createElement("unit", // - "id", info.xpath("@id") + ".feature.group", // - "version", version, "singleton", "false"); - - // - addElement(unit, "update", "id", info.xpath("@id") + ".feature.group", - "range", "[0.0.0," + version + ")", "severity", "0"); - - /* - - - - - - - */ - addList(unit, - "properties", - createElement("property", "name", - "org.eclipse.equinox.p2.name", "value", - info.xpath("@label")), - createElement("property", "name", - "org.eclipse.equinox.p2.description", "value", - info.xpath("description/text()")), - createElement("property", "name", - "org.eclipse.equinox.p2.description.url", "value", - info.xpath("description/@url")), - createElement("property", "name", - "org.eclipse.equinox.p2.provider", "value", - info.xpath("@provider-name")), - createElement("property", "name", - "org.eclipse.equinox.p2.type.group", "value", "true")); - - /* - - - - */ - addList(unit, - "provides", - createElement("provided", "namespace", - "org.eclipse.equinox.p2.iu", "name", info.xpath("@id") - + ".feature.group", "version", version)); - /* - - - */ - List requires = new ArrayList(); - for (Node n : info.xpathNods("//feature//import")) { - requires.add(createElement("required", "namespace", - "org.eclipse.equinox.p2.iu", "name", xpath(n, "@feature") - + ".feature.group", "range", - "[" + xpath(n, "@version") + "," + xpath(n, "@version") - + "]")); - } - // - for (Node n : info.xpathNods("//feature//plugin")) { - requires.add(createElement("required", "namespace", - "org.eclipse.equinox.p2.iu", "name", xpath(n, "@id"), - "range", - "[" + xpath(n, "@version") + "," + xpath(n, "@version") - + "]")); - } - /* - - - (org.eclipse.update.install.features=true) - - - */ - Element reqFeature = createElement("required", "namespace", - "org.eclipse.equinox.p2.iu", "name", info.xpath("@id") - + ".feature.jar", "range", "[" + version + "," - + version + "]"); - addElement(reqFeature, "filter").setTextContent( - "(org.eclipse.update.install.features=true)"); - requires.add(reqFeature); - addList(unit, "requires", requires); - - // - addElement(unit, "touchpoint", "id", "null", "version", "0.0.0"); - - /* - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of 'Light Weight Java Game Library' nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - */ - List list = new ArrayList(); - for (Node n : info.xpathNods("//feature//license")) { - Element l = createElement("license", "uri", xpath(n, "@url"), - "url", xpath(n, "@url")); - l.setTextContent(escapeToXMLAttrib(xpath(n, "text()"))); - list.add(l); - } - addList(unit, "licenses", list); - - /* - - Copyright (c) 2002-2011 Lightweight Java Game Library Project All rights reserved. LWJGL is available under a BSD license, which means it's open source and freely available at no charge. Eclipse feature and plugins, plugin specific code made available under a BSD license and Eclipse Public License (EPL). - - - */ - Element l = createElement("copyright", "uri", - info.xpath("copyright/@url"), "url", - info.xpath("copyright/@url")); - l.setTextContent(escapeToXMLAttrib(info.xpath("copyright/text()"))); - unit.appendChild(l); - - return unit; - } - - /** - * @param i_categoryInfo - * @return - */ - private Element createUnitForCategory(CategoryInfo info) { - String version = info.getVersion(); - String id = info.getID(); - /* - - */ - Element unit = createElement("unit", // - "id", id, // - "version", version); - /* - - - - - - */ - addList(unit, - "properties", - createElement("property", "name", - "org.eclipse.equinox.p2.name", "value", - info.getLabel()), - createElement("property", "name", - "org.eclipse.equinox.p2.description", "value", - info.description), - createElement("property", "name", - "org.eclipse.equinox.p2.type.category", "value", - "true")); - /* - - - - */ - addList(unit, "provides", - createElement("provided", - "namespace", "org.eclipse.equinox.p2.iu", - "name", id, - "version", version)); - - /* - - - - ... - - */ - List requires = new ArrayList(); - for (FeatureInfo featureInfo: info.required) { - String featureVersion = featureInfo.xpath("@version"); - String featureName = featureInfo.xpath("@id") + ".feature.group"; - Element required = createElement("required", - "namespace", "org.eclipse.equinox.p2.iu", // - "name", featureName, // - "range", "[" + featureVersion +"," + featureVersion + "]" - ); - requires.add(required); - } - addList(unit, "requires", requires); - - /* - - - */ - addElement(unit, "touchpoint", "id", "null", "version", "0.0.0"); - - return unit; - - } - - /** - * @param i_bundleInfo - * @return - * @throws Exception - */ - protected Element createUnitForFeature(FeatureInfo info) throws Exception { - - String version = info.xpath("@version"); - - // - Element unit = createElement("unit", // - "id", info.xpath("@id") + ".feature.jar", // - "version", version); - - /* - - - - - - */ - addList(unit, - "properties", - createElement("property", "name", - "org.eclipse.equinox.p2.name", "value", - info.xpath("@label")), - createElement("property", "name", - "org.eclipse.equinox.p2.description", "value", - info.xpath("description/text()")), - createElement("property", "name", - "org.eclipse.equinox.p2.description.url", "value", - info.xpath("description/@url")), - createElement("property", "name", - "org.eclipse.equinox.p2.provider", "value", - info.xpath("@provider-name"))); - /* - - - - - - */ - addList(unit, - "provides", - createElement("provided", "namespace", - "org.eclipse.equinox.p2.iu", "name", info.xpath("@id") - + ".feature.jar", "version", version), - createElement("provided", "namespace", - "org.eclipse.equinox.p2.eclipse.type", "name", - "feature", "version", "1.0.0"), - createElement("provided", "namespace", - "org.eclipse.update.feature", "name", - info.xpath("@id"), "version", version)); - /* - - (org.eclipse.update.install.features=true) - - */ - addElement(unit, "filter").setTextContent( - "(org.eclipse.update.install.features=true)"); - - /* - - - - */ - addList(unit, - "artifacts", - createElement("artifact", "classifier", - "org.eclipse.update.feature", "id", info.xpath("@id"), - "version", version)); - - // - addElement(unit, "touchpoint", "id", "org.eclipse.equinox.p2.osgi", - "version", "1.0.0"); - - /* - - - - true - - - - */ - Element valueZipped = createElement("instruction", "key", "zipped"); - valueZipped.setTextContent("true"); - addList(unit, "touchpointData", createList("instructions", valueZipped)); - - /* - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of 'Light Weight Java Game Library' nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - */ - List list = new ArrayList(); - for (Node n : info.xpathNods("//feature//license")) { - Element l = createElement("license", "uri", xpath(n, "@url"), - "url", xpath(n, "@url")); - l.setTextContent(escapeToXMLAttrib(xpath(n, "text()"))); - list.add(l); - } - addList(unit, "licenses", list); - - /* - - Copyright (c) 2002-2011 Lightweight Java Game Library Project All rights reserved. LWJGL is available under a BSD license, which means it's open source and freely available at no charge. Eclipse feature and plugins, plugin specific code made available under a BSD license and Eclipse Public License (EPL). - - - */ - Element l = createElement("copyright", "uri", - info.xpath("copyright/@url"), "url", - info.xpath("copyright/@url")); - l.setTextContent(escapeToXMLAttrib(info.xpath("copyright/text()"))); - unit.appendChild(l); - - return unit; - } - - /** - * @param i_bundleInfo - * @return - */ - protected Element createUnitForBundle(BundleInfo info) { - - String version = info.mfval("Bundle-Version"); - /* - - */ - Element unit = createElement("unit", "id", - info.mfval("Bundle-SymbolicName"), "version", version, - "singleton", - info.mfval("Bundle-SymbolicName", "singleton", "false")); - - // - addElement(unit, "update", "id", info.mfval("Bundle-SymbolicName"), - "range", "[0.0.0," + version + ")", "severity", "0"); - - /* - - - - - */ - List properties = new ArrayList(); - mf2properties(info, properties, "Bundle-Name", - "org.eclipse.equinox.p2.name", "Bundle-Vendor", - "org.eclipse.equinox.p2.provider", "Bundle-Localization", - "org.eclipse.equinox.p2.bundle.localization"); - addList(unit, "properties", properties); - - /* - - - - - - - ... - - - */ - - List elements = new ArrayList(); - elements.add(createElement("provided", "namespace", - "org.eclipse.equinox.p2.iu", "name", - info.mfval("Bundle-SymbolicName"), "version", version)); - elements.add(createElement("provided", "namespace", "osgi.bundle", - "name", info.mfval("Bundle-SymbolicName"), "version", version)); - elements.add(createElement("provided", "namespace", - "org.eclipse.equinox.p2.eclipse.type", "name", "bundle", - "version", "1.0.0")); - - String expPackages = info.mf("Export-Package"); - if (expPackages != null) { - String[] ps = expPackages.split("\\s*,\\s*"); - for (int i = 0; i < ps.length; i++) { - String name = info.valIndex(ps, i, ""); - elements.add(createElement("provided", "namespace", - "java.package", "name", name, "version", "0.0.0")); - } - } - addList(unit, "provides", elements); - - /* - - - - - */ - /* - Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.core.resources;bundle-version="3.4.0", - org.eclipse.jdt.core;bundle-version="3.4.0", - org.eclipse.jdt.ui;bundle-version="3.4.0", - org.eclipse.jdt.launching;bundle-version="3.4.0", - org.lwjgl;bundle-version="2.0.0" - */ - String reqBundles = info.mf("Require-Bundle"); - if (reqBundles != null) { - elements = new ArrayList(); - String[] ps = reqBundles.split("\\s*,\\s*"); - for (int i = 0; i < ps.length; i++) { - String name = info.valIndex(ps, i, ""); - String range = info.valIndex(ps, i, "bundle-version"); - if (range == null || range.isEmpty()) - range = "0.0.0"; - elements.add(createElement("required", "namespace", - "osgi.bundle", "name", name, "range", range)); - } - addList(unit, "requires", elements); - } - - /* - - - - */ - addList(unit, - "artifacts", - createElement("artifact", "classifier", "osgi.bundle", "id", - info.mfval("Bundle-SymbolicName"), "version", version)); - - /* - - */ - addElement(unit, "touchpoint", "id", "org.eclipse.equinox.p2.osgi", - "version", "1.0.0"); - - /* - - - - Bundle-Name: LWJGL Lightweight Java Game Library Bundle-ClassPath: .,AppleJavaExtensions.jar,asm-debug-all.jar,jinput.jar,lwjgl.jar,lwjgl_util.jar,lwjgl_util_applet.jar,lzma.jar Bundle-Version: 2.8.2.v20111128-1752 Bundle-Activator: org.lwjgl.Activator Created-By: 20.1-b02-384 (Apple Inc.) Bundle-Vendor: lwjgl.org Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime Export-Package: org.lwjgl.eclipse,LZMA,com.apple.eawt,com.apple.eio,net.java.games.input,net.java.games.util,net.java.games.util.plugins,org.lwjgl,org.lwjgl.input,org.lwjgl.openal,org.lwjgl.opencl,org.lwjgl.opencl.api,org.lwjgl.opengl,org.lwjgl.opengles,org.lwjgl.util,org.lwjgl.util.applet,org.lwjgl.util.glu,org.lwjgl.util.glu.tessellation,org.lwjgl.util.input,org.lwjgl.util.jinput,org.lwjgl.util.mapped,org.lwjgl.util.vector,org.objectweb.asm,org.objectweb.asm.commons,org.objectweb.asm.signature,org.objectweb.asm.tree,org.objectweb.asm.tree.analysis,org.objectweb.asm.util,org.objectweb.asm.xml Bundle-SymbolicName: org.lwjgl Ant-Version: Apache Ant 1.7.1 Manifest-Version: 1.0 Bundle-ActivationPolicy: lazy Bundle-ManifestVersion: 2 Bundle-RequiredExecutionEnvironment: J2SE-1.5 - - - true - - - - */ - /* - - - - true - - - - */ - Element valueZipped = createElement("instruction", "key", "zipped"); - valueZipped.setTextContent("true"); - Element manifest = createElement("instruction", "key", "manifest"); - manifest.setTextContent(escapeToXMLAttrib(doDump(info.manifest))); - addList(unit, "touchpointData", - createList("instructions", manifest, valueZipped)); - - return unit; - } - - /** - * - */ - protected void mf2properties(BundleInfo info, List o_properties, - String... propName) { - for (int i = 0; i < propName.length; i += 2) { - String value = info.mfval(propName[i]); - if (value != null && !value.isEmpty()) { - o_properties.add(createElement("property", "name", - propName[i + 1], "value", value)); - } - } - } - - /** - * @param i_content - * @param i_string - * @param i_createElement - * @param i_createElement2 - */ - protected Element addList(Element parent, String listName, - Element... content) { - return addList(parent, listName, Arrays.asList(content)); - } - - /** - * @param i_content - * @param i_string - * @param i_createElement - * @param i_createElement2 - */ - protected Element addList(Element parent, String listName, - List content) { - Element list = createList(listName, content); - parent.appendChild(list); - return list; - } - - protected Element createList(String listName, Element... content) { - return createList(listName, Arrays.asList(content)); - } - - /** - * @param listName - * @param content - * @return - */ - protected Element createList(String listName, List content) { - Element list = createElement(listName, "size", - String.valueOf(content.size())); - for (Element e : content) { - list.appendChild(e); - } - return list; - } - - /** - * @param i_content - * @param i_repository - * @return - */ - protected Element addElement(Node parent, String name, - String... propName_Values) { - - Element child = createElement(name, propName_Values); - parent.appendChild(child); - return child; - } - - protected Element createElement(String name, String... propName_Values) { - if (propName_Values.length % 2 != 0) { - throw new IllegalArgumentException("expected key values pairs"); - } - Element element = currentDoc.createElement(name); - for (int i = 0; i < propName_Values.length; i += 2) { - if (propName_Values[i + 1] != null) - element.setAttribute(propName_Values[i], propName_Values[i + 1]); - } - return element; - } - - /** - * @return the updateSiteFolder - */ - public String getUpdateSiteFolder() { - return updateSiteFolder; - } - - /** - * @param i_updateSiteFolder the updateSiteFolder to set - */ - public void setUpdateSiteFolder(String i_updateSiteFolder) { - updateSiteFolder = i_updateSiteFolder; - } - - /** - * @return the repositoryName - */ - public String getRepositoryName() { - return repositoryName; - } - - /** - * @param i_repositoryName the repositoryName to set - */ - public void setRepositoryName(String i_repositoryName) { - repositoryName = i_repositoryName; - } - - /** - * @return the repositoryURI - */ - public String getRepositoryURI() { - return repositoryURI; - } - - /** - * @param i_repositoryURI the repositoryURI to set - */ - public void setRepositoryURI(String i_repositoryURI) { - repositoryURI = i_repositoryURI; - } - - /** - * @return the compressed - */ - public boolean isCompressed() { - return compressed; - } - - /** - * @param i_compressed the compressed to set - */ - public void setCompressed(boolean i_compressed) { - compressed = i_compressed; - } - - /** - * Basically for testing. - * @param args - * @throws Exception - */ - public static void main(String[] args) throws Exception { - StandalonePublisher publisher = new StandalonePublisher(); - - if (!publisher.parseArgs(args)) { - help(); - } else { - // publisher.updateSiteFolder = "build/plugins/org.lwjgl.updatesite"; - // publisher.repositoryName = "org.lwjgl"; - // publisher.repositoryURI = "http://lwjgl.org/update"; - try { - publisher.execute(); - System.out.println("Successfull created p2 metadata in " - + publisher.updateSiteFolder); - } catch (Exception ex) { - System.err.println("Error creating p2 metadata: "); - System.err.println(ex); - ex.printStackTrace(); - } - } - } - - /** - * - */ - static void help() { - System.out - .println("StandalonePublisher, (C) Jens von Pilgrim 2011 (EPL and BSD license)"); - System.out - .println("Ant task generating p2 metadata for old style Eclipse update site."); - System.out - .println("Limited support: only bundles and featues are supported, functionality only"); - System.out.println(" tested for LWJGL update site"); - System.out - .println("If run as command line tool, specify update site folder, repository name"); - System.out.println(" and URI as follows:"); - System.out - .println(" >java org.ljgl.ant.StandalonePublisher FOLDER NAME URI"); - System.out - .println("Example (supposed tool is called from updatesite folder):"); - System.out - .println(" >java org.lwjgl.ant.StandalonePublisher . org.lwjgl http://lwjgl.org/update"); - System.out - .println("If content.xml and artfact.xml should be compressed, add 'compress'"); - } - - /** - * @param i_args - * @return - */ - boolean parseArgs(String[] i_args) { - if (i_args == null || i_args.length < 3) { - return false; - } - updateSiteFolder = i_args[0]; - repositoryName = i_args[1]; - repositoryURI = i_args[2]; - - if (updateSiteFolder.isEmpty() || repositoryName.isEmpty() - || repositoryURI.isEmpty()) { - return false; - } - - File f = new File(updateSiteFolder); - if (!f.exists()) { - System.err.println("Update site folder does not exist."); - return false; - } - if (!(repositoryURI.startsWith("http") || repositoryURI - .startsWith("file"))) { - System.out - .println("Warning: Repository URI should start with protocol, e.g., http: or file:"); - } - - if (i_args.length == 4 && "compress".equalsIgnoreCase(i_args[3])) { - compressed = true; - } - - return true; - } - - /** - * {@inheritDoc} - * @see org.apache.tools.ant.Task#execute() - */ - @Override - public void execute() throws BuildException { - if (updateSiteFolder == null) { - throw new BuildException("attribute updateSiteFolder missing"); - } - if (repositoryName == null) { - throw new BuildException("attribute repositoryName missing"); - } - if (repositoryURI == null) { - throw new BuildException("attribute repositoryURI missing"); - } - try { - doExecute(); - } catch (Exception ex) { - throw new BuildException(ex); - } - - } - -} diff --git a/eclipse-update/org.lwjgl.build/test/buildtest/build.xml b/eclipse-update/org.lwjgl.build/test/buildtest/build.xml deleted file mode 100644 index 0e52dfce..00000000 --- a/eclipse-update/org.lwjgl.build/test/buildtest/build.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - description - - - - - - - - - - - - - ${norm} - - - - - - - diff --git a/eclipse-update/org.lwjgl.build/test/java/org/lwjgl/ant/NormalizeVersionTest.java b/eclipse-update/org.lwjgl.build/test/java/org/lwjgl/ant/NormalizeVersionTest.java deleted file mode 100644 index 8ca3e886..00000000 --- a/eclipse-update/org.lwjgl.build/test/java/org/lwjgl/ant/NormalizeVersionTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Jens von Pilgrim and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Project: de.jevopi.anttasks - * File: NormalizeVersionTest.java - * Date: Nov 14, 2010 - *******************************************************************************/ -package org.lwjgl.ant; - -import org.junit.Assert; - -import org.apache.tools.ant.BuildException; -import org.junit.Test; - - -/** - * NormalizeVersionTest - * There should really be more documentation here. - * - * @author Jens von Pilgrim - * @version $Revision$ - * @since Nov 14, 2010 - */ -public class NormalizeVersionTest { - - @Test - public void testNormalizer() { - NormalizeVersion t = new NormalizeVersion(); - t.setProperty("normalized"); - - t.setVersion("1"); - Assert.assertEquals("1.0.0", t.doExecute()); - - t.setVersion("1.2"); - Assert.assertEquals("1.2.0", t.doExecute()); - - t.setVersion("1.2.3"); - Assert.assertEquals("1.2.3", t.doExecute()); - - t.setVersion("1.2.3.beta"); - Assert.assertEquals("1.2.3.beta", t.doExecute()); - - t.setVersion("1.2.beta"); - Assert.assertEquals("1.2.0.beta", t.doExecute()); - - } - - - @Test(expected= BuildException.class) public void tooManyDots() { - NormalizeVersion t = new NormalizeVersion(); - t.setProperty("normalized"); - - t.setVersion("1.2.3.4.5"); - t.doExecute(); - } - - @Test(expected= BuildException.class) public void qualifierWithNumber() { - NormalizeVersion t = new NormalizeVersion(); - t.setProperty("normalized"); - - t.setVersion("1.2beta"); - t.doExecute(); - } - - - @Test - public void testQualifier() { - NormalizeVersion t = new NormalizeVersion(); - t.setProperty("normalized"); - t.setAddDateQualifier(true); - - t.setVersion("1"); - String s = t.doExecute(); - Assert.assertEquals(20, s.length()); - Assert.assertTrue(s.startsWith("1.0.0")); - - t.setVersion("1.2"); - s = t.doExecute(); - Assert.assertEquals(20, s.length()); - Assert.assertTrue(s.startsWith("1.2.0")); - - t.setVersion("1.2.3"); - s = t.doExecute(); - Assert.assertEquals(20, s.length()); - Assert.assertTrue(s.startsWith("1.2.3")); - - t.setVersion("2.8.2"); - s = t.doExecute(); - Assert.assertEquals(20, s.length()); - Assert.assertTrue(s.startsWith("2.8.2")); - - } - - @Test(expected= BuildException.class) public void dateQualifierWithQualifier() { - NormalizeVersion t = new NormalizeVersion(); - t.setProperty("normalized"); - t.setAddDateQualifier(true); - t.setVersion("1.2.beta"); - t.doExecute(); - } - - - -} diff --git a/eclipse-update/org.lwjgl.build/teststore b/eclipse-update/org.lwjgl.build/teststore deleted file mode 100644 index 49c899fe..00000000 Binary files a/eclipse-update/org.lwjgl.build/teststore and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/.project b/eclipse-update/org.lwjgl.doc/.project deleted file mode 100644 index 7a8a4ccb..00000000 --- a/eclipse-update/org.lwjgl.doc/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - org.lwjgl.doc - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/eclipse-update/org.lwjgl.doc/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl.doc/META-INF/MANIFEST.MF deleted file mode 100644 index 19ff43ff..00000000 --- a/eclipse-update/org.lwjgl.doc/META-INF/MANIFEST.MF +++ /dev/null @@ -1,6 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Documentation -Bundle-SymbolicName: org.lwjgl.doc; singleton:=true -Bundle-Version: 2 -Bundle-Vendor: Lightweight Java Game Library Project diff --git a/eclipse-update/org.lwjgl.doc/about.html b/eclipse-update/org.lwjgl.doc/about.html deleted file mode 100644 index d204f100..00000000 --- a/eclipse-update/org.lwjgl.doc/about.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -About - - - - -

About This Content

-

The Lightweight Java Game Library (LWJGL) is a solution aimed -directly at professional and amateur Java programmers alike to enable commercial quality games to be written in Java. -LWJGL provides developers access to high performance crossplatform -libraries such as OpenGL (Open Graphics Library) and OpenAL (Open Audio Library) -allowing for state of the art 3D games and 3D sound. Additionally LWJGL -provides access to controllers such as Gamepads, Steering wheel and -Joysticks. All in a simple and straight forward API.

-

LWJGL is not meant to make writing games particularly easy; it is -primarily an enabling technology which allows developers to get at -resources that are simply otherwise unavailable or poorly implemented on -the existing Java -platform. We anticipate that the LWJGL will, through evolution and -extension, become the foundation for more complete game libraries and -"game engines" as they have popularly become known, and hide some of the -new evils we have had to expose in the APIs.

-

LWJGL is available under a BSD -license, which means it's open source and freely available at no charge.

-

Please visit us on the Freenode IRC Network: #LWJGL. Do idle -if there is no one to answer any of your questions, we are on different -timezones.

- - - -

Plug-Ins

-

The following plug-ins are provided: -

-
org.lwjgl
-
Platform independent jars and native libraries for Windows, Linux and Mac OS X
-
org.lwjgl.doc
-
Documentation (JavaDoc)
-
org.lwjgl.source
-
Source files
-
org.lwjgl.tools
-
Developer tools
-
org.lwjgl.info
-
LWJGL test and info view
-
-

- - - - diff --git a/eclipse-update/org.lwjgl.doc/build.properties b/eclipse-update/org.lwjgl.doc/build.properties deleted file mode 100644 index 3c05d072..00000000 --- a/eclipse-update/org.lwjgl.doc/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -bin.includes = plugin.xml,\ - META-INF/,\ - html/,\ - *.xml diff --git a/eclipse-update/org.lwjgl.doc/html/fig/addLib_1.png b/eclipse-update/org.lwjgl.doc/html/fig/addLib_1.png deleted file mode 100644 index 4dd43a7c..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/addLib_1.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/addLib_2.png b/eclipse-update/org.lwjgl.doc/html/fig/addLib_2.png deleted file mode 100644 index 02d1b7fa..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/addLib_2.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/addLib_3.png b/eclipse-update/org.lwjgl.doc/html/fig/addLib_3.png deleted file mode 100644 index 01de559e..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/addLib_3.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/addLib_4.png b/eclipse-update/org.lwjgl.doc/html/fig/addLib_4.png deleted file mode 100644 index a79e512c..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/addLib_4.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/logo.png b/eclipse-update/org.lwjgl.doc/html/fig/logo.png deleted file mode 100644 index dbe2c75a..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/lwjgl_logo.png b/eclipse-update/org.lwjgl.doc/html/fig/lwjgl_logo.png deleted file mode 100644 index e4d806ae..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/lwjgl_logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/mesh.png b/eclipse-update/org.lwjgl.doc/html/fig/mesh.png deleted file mode 100644 index 120babdf..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/mesh.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/openView_1.png b/eclipse-update/org.lwjgl.doc/html/fig/openView_1.png deleted file mode 100644 index fa729ae5..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/openView_1.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/openView_2.png b/eclipse-update/org.lwjgl.doc/html/fig/openView_2.png deleted file mode 100644 index d2f3b107..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/openView_2.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/openView_Info.png b/eclipse-update/org.lwjgl.doc/html/fig/openView_Info.png deleted file mode 100644 index 158876a5..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/openView_Info.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/fig/openView_Test.png b/eclipse-update/org.lwjgl.doc/html/fig/openView_Test.png deleted file mode 100644 index 1ff61e9b..00000000 Binary files a/eclipse-update/org.lwjgl.doc/html/fig/openView_Test.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/html/overview.html b/eclipse-update/org.lwjgl.doc/html/overview.html deleted file mode 100644 index d966549f..00000000 --- a/eclipse-update/org.lwjgl.doc/html/overview.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - LWJGL Eclipse Plugins - - - -
- -

Table of Contents

- -

-Plugin documentation -

-

- -

-API -

-

- -

-External resources -

-

- -

About LWJGL

-

The Lightweight Java Game Library (LWJGL) is a solution aimed -directly at professional and amateur Java programmers alike to enable commercial quality games to be written in Java. -LWJGL provides developers access to high performance crossplatform -libraries such as OpenGL (Open Graphics Library) and OpenAL (Open Audio Library) -allowing for state of the art 3D games and 3D sound. Additionally LWJGL -provides access to controllers such as Gamepads, Steering wheel and -Joysticks. All in a simple and straight forward API.

-

LWJGL is not meant to make writing games particularly easy; it is -primarily an enabling technology which allows developers to get at -resources that are simply otherwise unavailable or poorly implemented on -the existing Java -platform. We anticipate that the LWJGL will, through evolution and -extension, become the foundation for more complete game libraries and -"game engines" as they have popularly become known, and hide some of the -new evils we have had to expose in the APIs.

-

LWJGL is available under a BSD -license, which means it's open source and freely available at no charge.

-

Please visit us on the Freenode IRC Network: #LWJGL. Do idle -if there is no one to answer any of your questions, we are on different -timezones.

- - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.doc/html/plugins.html b/eclipse-update/org.lwjgl.doc/html/plugins.html deleted file mode 100644 index 4e5e6a23..00000000 --- a/eclipse-update/org.lwjgl.doc/html/plugins.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - LWJGL Eclipse Plugins - - - - -

Overview

-

The following plug-ins are provided: -

-
org.lwjgl
-
Platform independent jars and native libraries for Windows, Linux, Solaris and Mac OS X
-
org.lwjgl.doc
-
Documentation, containing API documentation (Javadoc) and additional material such as this document your currently reading.
-
org.lwjgl.source
-
Source files of LWJGL Java components
-
org.lwjgl.info
-
Two Eclipse views, one for testing LWJGL and one printing out OpenGL specific information
-
org.lwjgl.tools
-
Plugin for Java developers, providing a LWJGL library for the Java Build Path settings
-
-

-All plugins are briefly described in the following. - -

LWJGL library: org.lwjgl

-The most important plugin, which actually is the only one needed by non-developers, is org.lwjgl. -It makes the LWJGL library available as an Eclipse plugin. That is if you write an Eclipse plugin using LWJGL, -simply add this plugin to the list of required plugins. It does not only provide the necessary jar files, -but it also configures the library path in order to automatically load the appropriate native library wihtin -the Eclipse workbench. - -

LWJGL documentation and sources

-

Both, documentation and sources, are only required for developers. Both, Javadoc and sources, are attached to -the LWJGL library in order to allow you easy access to these information. That is, you can simply open an LWJGL class, -and the source code will be opened. JavaDoc is available via tool-tip and with Shift-F2. You do not have to configure -anything in order to access the documentation and the source code. -The tools plugin makes JavaDoc and source code available for non-plugin projects as well.

-

-Note that only the Java source code is provided, if you want to have a look at the native code, please download -the LWJGL sources from the LWJGL website. -

-

LWJGL for Java developers

-

The org.lwjgl.tools plugin provides an already configured library to be added -to a projects build path. It does not only provide the JARs and native libraries, -relieving developers from configuring extra VM arguments in the run configuration, -but it also configures Javadoc and source code to be available in Java projects just as in -plugin projects.

-Read more about how to set up the library here. - -

Information and test view

-

In order to test whether your installation is correct and in order to -retrieve additional information on your system, two views are provided. The test view -draws a spinning torso, while the information view simply prints out available -versions and features of your graphics card and OpenGL driver.

-Read more about how to open the views here. - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.doc/html/tools.html b/eclipse-update/org.lwjgl.doc/html/tools.html deleted file mode 100644 index 14f51c2d..00000000 --- a/eclipse-update/org.lwjgl.doc/html/tools.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - LWJGL Tools - - - -

LWJGL Tools

-

The org.lwjgl.tools plugin provides an already configured library to be added -to a projects build path. It does not only provide the JARs and native libraries, -relieving developers from configuring extra VM arguments in the run configuration, -but it also configures Javadoc and source code to be available in Java projects just as in -plugin projects. -

-

You will also need the org.lwjgl plugin. JavaDoc and source code are -retrieved from the org.lwjgl.doc and org.lwjgl.source plugins.

- -

Configure the LWJGL library

-You can configure the LWJGL library for a plain Java project by opening the -projects properties. Select "Java Build Path" and "Libraries", such as shown in -Figure 1. Note: Click on the images here to show a larger version. - -
- -
- -Fig. 1: Project properties -
- -Select "Add Library..." on the right hand side. This will open a new dialog window as shown in Figure 2. - -
- -
- -Fig. 2: Add library -
- -Select "LWJGL Library". You can simply press "Finish". However if you want to have some information about -the paths of the added library, simply select "Next". In the latter case, the next wizard page will show -you the path settings automatically configured by the tool plugin as shown in Figure 3. - -
- -
- -Fig. 3: Library info -
- -You have no successfully configured the LWJGL library, as shown in Figure 4. Press "OK" to finish the set up. - -
- -
- -Fig. 4: Configured library -
- -

-You can now use the LWJGL library in your Java project, and you can simply start -the project by selecting "Run As / Java Application..." in the context menu of a class containing a main method. -That is, you do not have to configure some VM arguments in the run configuration anymore, which will hopefully make development -much easier. -

- -

Note: At this moment, no further tools, e.g., for exporting an LWJGL application, exists. -Feel free to write missing functions and contact us in order to add new functionalty.

- - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.doc/html/views.html b/eclipse-update/org.lwjgl.doc/html/views.html deleted file mode 100644 index b7eb579b..00000000 --- a/eclipse-update/org.lwjgl.doc/html/views.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - LWJGL Eclipse Views - - - -

LWJGL Eclipse Views

-

In order to test whether your installation is correct and in order to -retrieve additional information on your system, two views are provided. The test view -draws a spinning torso, while the information view simply prints out available -versions and features of your graphics card and OpenGL driver.

-

- -

Open the views

-You can open the views by selecting them from "Windows / Show View / Other..." as shown in -Figure 1. Note: Click on the images here to show a larger version. - -
- -
- -Fig. 1: Show View / Others... -
- -Under "Other", you will find two LWJGL views: "LWJGL Information View" and "LWJGL Test View" (see Figure 2). - -
- -
- -Fig. 2: LWJGL views -
- -Select "LWJGL Information View" in order to open a simple text view, as shown in Figure 3. - -
- -
- -Fig. 3: LWJGL Information View -
-

-This view shows the version numbers of the LWJGL feature, i.e. the LWJGL plugins, and the LWJGL library. For bug reports, it is usually very -useful to provide additional information about your OpenGL configuration. This view provides you with a lot of necessary information. Note that -not all information can be retrieved on all systems. Features not supported by your graphics card or OpenGL driver are omitted, you see only the -available features and capabilities. -

- -

In order to test whether LWJGL and OpenGL works on your system, open the test view. The view should look similar to Figure 4. - -

- -
- -Fig. 4: LWJGL Test View -
-The OpenGL code of this torso actually stems from an Eclipse SWT snippet: -snippet 195. - -

-You should see a spinning torso and the current frames per second (fps) in the status bar. If you do not even see this torso, -something has gone seriously wrong when installing the plugins. Note that other OpenGL based applications might cause problems, even if -you can see this test view: The test view does not use any extended OpenGL features, such as framebuffer objects. If an application -requires an additional feature which is not supported by your system (see Information View to retrieve the supported features), it -won't run. Sometimes it helps to update the drive of your graphics card! -

- - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.doc/lwjgl_logo.png b/eclipse-update/org.lwjgl.doc/lwjgl_logo.png deleted file mode 100644 index e4d806ae..00000000 Binary files a/eclipse-update/org.lwjgl.doc/lwjgl_logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.doc/plugin.xml b/eclipse-update/org.lwjgl.doc/plugin.xml deleted file mode 100644 index 2b5a7f98..00000000 --- a/eclipse-update/org.lwjgl.doc/plugin.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.doc/toc.xml b/eclipse-update/org.lwjgl.doc/toc.xml deleted file mode 100644 index b34f353c..00000000 --- a/eclipse-update/org.lwjgl.doc/toc.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.feature.sdk/.project b/eclipse-update/org.lwjgl.feature.sdk/.project deleted file mode 100644 index 149316ad..00000000 --- a/eclipse-update/org.lwjgl.feature.sdk/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - org.lwjgl.feature.sdk - - - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/eclipse-update/org.lwjgl.feature.sdk/build.properties b/eclipse-update/org.lwjgl.feature.sdk/build.properties deleted file mode 100644 index 64f93a9f..00000000 --- a/eclipse-update/org.lwjgl.feature.sdk/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = feature.xml diff --git a/eclipse-update/org.lwjgl.feature.sdk/feature.xml b/eclipse-update/org.lwjgl.feature.sdk/feature.xml deleted file mode 100644 index f700042f..00000000 --- a/eclipse-update/org.lwjgl.feature.sdk/feature.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - This feature provides easy access to the -Lightweight Java Game Library (LWJGL) -for Eclipse plugin developers. It includes -- source code -- javadoc -- info plugin -- library tool - - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project -All rights reserved. - -LWJGL is available under a BSD license, which means it's open -source and freely available at no charge. - -Eclipse feature and plugins, plugin specific code made available under -a BSD license and Eclipse Public License (EPL). - - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of 'Light Weight Java Game Library' nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.feature.sdk/feature.xml.template b/eclipse-update/org.lwjgl.feature.sdk/feature.xml.template deleted file mode 100644 index aa67ebd3..00000000 --- a/eclipse-update/org.lwjgl.feature.sdk/feature.xml.template +++ /dev/null @@ -1,95 +0,0 @@ - - - - - This feature provides easy access to the -Lightweight Java Game Library (LWJGL) SDK -for Eclipse plugin developers. It includes -- source code -- javadoc -- info plugin (Test and Info View) -- library tool (Library configuration for plain Java development) - - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project -All rights reserved. - -LWJGL is available under a BSD license, which means it's open -source and freely available at no charge. - -Eclipse feature and plugins, plugin specific code made available under a -BSD license and Eclipse Public License (EPL). - - - - Copyright (c) 2002-2011 Lightweight Java Game Library Project -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of 'Light Weight Java Game Library' nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.feature/.project b/eclipse-update/org.lwjgl.feature/.project deleted file mode 100644 index 8a573344..00000000 --- a/eclipse-update/org.lwjgl.feature/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - org.lwjgl.feature - - - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/eclipse-update/org.lwjgl.feature/build.properties b/eclipse-update/org.lwjgl.feature/build.properties deleted file mode 100644 index b6f6a064..00000000 --- a/eclipse-update/org.lwjgl.feature/build.properties +++ /dev/null @@ -1,2 +0,0 @@ -bin.includes = feature.xml,\ - lwjgl_logo.png diff --git a/eclipse-update/org.lwjgl.feature/feature.xml b/eclipse-update/org.lwjgl.feature/feature.xml deleted file mode 100644 index aa48c263..00000000 --- a/eclipse-update/org.lwjgl.feature/feature.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - This feature provides easy access to the -Lightweight Java Game Library (LWJGL) -for Eclipse plugin developers. It includes -- java and native libraries (Windows, Mac OS X, Linux, Solaris) -- source code -- javadoc -- info plugin -- library tool - - - - Copyright (c) 2002-2010 Lightweight Java Game Library Project -All rights reserved. - -LWJGL is available under a BSD license, which means it's open -source and freely available at no charge. - -Eclipse feature and plugins created by Jens von Pilgrim (developer@jevopi.de), -plugin specific code made available under a BSD license and -Eclipse Public License (EPL). - - - - Copyright (c) 2002-2010 Lightweight Java Game Library Project -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of 'Light Weight Java Game Library' nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.feature/feature.xml.template b/eclipse-update/org.lwjgl.feature/feature.xml.template deleted file mode 100644 index a533cddd..00000000 --- a/eclipse-update/org.lwjgl.feature/feature.xml.template +++ /dev/null @@ -1,72 +0,0 @@ - - - - - This feature provides easy access to the -Lightweight Java Game Library (LWJGL) -for Eclipse plugin developers. It includes -- java and native libraries (Windows, Mac OS X, Linux, Solaris) -For source, javadoc and more tools install SDK. - - - - Copyright (c) 2002-2010 Lightweight Java Game Library Project -All rights reserved. - -LWJGL is available under a BSD license, which means it's open -source and freely available at no charge. - -Eclipse feature and plugins created by Jens von Pilgrim (developer@jevopi.de), -plugin specific code made available under a BSD license and -Eclipse Public License (EPL). - - - - Copyright (c) 2002-2010 Lightweight Java Game Library Project -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of 'Light Weight Java Game Library' nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.feature/lwjgl_logo.png b/eclipse-update/org.lwjgl.feature/lwjgl_logo.png deleted file mode 100644 index e4d806ae..00000000 Binary files a/eclipse-update/org.lwjgl.feature/lwjgl_logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.info/.classpath b/eclipse-update/org.lwjgl.info/.classpath deleted file mode 100755 index 1ffb089d..00000000 --- a/eclipse-update/org.lwjgl.info/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/eclipse-update/org.lwjgl.info/.project b/eclipse-update/org.lwjgl.info/.project deleted file mode 100755 index 3acba453..00000000 --- a/eclipse-update/org.lwjgl.info/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.lwjgl.info - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/eclipse-update/org.lwjgl.info/.settings/org.eclipse.jdt.core.prefs b/eclipse-update/org.lwjgl.info/.settings/org.eclipse.jdt.core.prefs deleted file mode 100755 index 565eda3c..00000000 --- a/eclipse-update/org.lwjgl.info/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Thu Sep 13 13:53:08 CEST 2007 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/eclipse-update/org.lwjgl.info/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl.info/META-INF/MANIFEST.MF deleted file mode 100644 index c7bfb2f7..00000000 --- a/eclipse-update/org.lwjgl.info/META-INF/MANIFEST.MF +++ /dev/null @@ -1,16 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL TestView -Bundle-Vendor: Lightweight Java Game Library Project -Bundle-SymbolicName: org.lwjgl.info;singleton:=true -Bundle-Version: 2.0.0 -Bundle-Localization: plugin -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.ui.views, - org.eclipse.core.resources -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: org.lwjgl, - org.lwjgl.opengl, - org.lwjgl.util, - org.lwjgl.util.glu diff --git a/eclipse-update/org.lwjgl.info/about.html b/eclipse-update/org.lwjgl.info/about.html deleted file mode 100755 index 3d880e51..00000000 --- a/eclipse-update/org.lwjgl.info/about.html +++ /dev/null @@ -1,60 +0,0 @@ - - - -About - - - - -

About This Content

-

The Lightweight Java Game Library (LWJGL) is a solution aimed -directly at professional and amateur Java programmers alike to enable commercial quality games to be written in Java. -LWJGL provides developers access to high performance crossplatform -libraries such as OpenGL (Open Graphics Library) and OpenAL (Open Audio Library) -allowing for state of the art 3D games and 3D sound. Additionally LWJGL -provides access to controllers such as Gamepads, Steering wheel and -Joysticks. All in a simple and straight forward API.

-

LWJGL is not meant to make writing games particularly easy; it is -primarily an enabling technology which allows developers to get at -resources that are simply otherwise unavailable or poorly implemented on -the existing Java -platform. We anticipate that the LWJGL will, through evolution and -extension, become the foundation for more complete game libraries and -"game engines" as they have popularly become known, and hide some of the -new evils we have had to expose in the APIs.

-

LWJGL is available under a BSD -license, which means it's open source and freely available at no charge.

-

Please visit us on the Freenode IRC Network: #LWJGL. Do idle -if there is no one to answer any of your questions, we are on different -timezones.

- -

Plugin assembly

-

The plugins were assembled by Jens von Pilgrim (developer@jevopi.de). All files related to this assembly, such as manifest files or plugin descriptors, are copyright under the Eclipse Public License (EPL) and the BSD license

- -

Third party code

- -

IBM

-

The LWJGL Textview contains code copyright under the Eclipse Public License (EPL):
-

-Copyright (c) 2000, 2005 IBM Corporation and others.
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
-
-The source of this code can be found at: -http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet195.java?view=markup&content-type=text%2Fvnd.viewcvs-markup&revision=HEAD -

- -

SGI

-

-LWJGL contains code copyright by SGI. This code is copyright under the SGI FreeB v1.1, see http://oss.sgi.com/projects/FreeB/. Note that this license can be updated to version 2.0. -

- - - - diff --git a/eclipse-update/org.lwjgl.info/build.properties b/eclipse-update/org.lwjgl.info/build.properties deleted file mode 100755 index 6d465dae..00000000 --- a/eclipse-update/org.lwjgl.info/build.properties +++ /dev/null @@ -1,9 +0,0 @@ -source.. = src/java/ -output.. = build/classes/ -bin.includes = META-INF/,\ - .,\ - icons/,\ - lwjgl_logo.png,\ - plugin.xml,\ - about.html -src.includes = src/ diff --git a/eclipse-update/org.lwjgl.info/icons/lwjgl_logo_16.gif b/eclipse-update/org.lwjgl.info/icons/lwjgl_logo_16.gif deleted file mode 100755 index a0252157..00000000 Binary files a/eclipse-update/org.lwjgl.info/icons/lwjgl_logo_16.gif and /dev/null differ diff --git a/eclipse-update/org.lwjgl.info/lwjgl_logo.png b/eclipse-update/org.lwjgl.info/lwjgl_logo.png deleted file mode 100755 index e4d806ae..00000000 Binary files a/eclipse-update/org.lwjgl.info/lwjgl_logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.info/plugin.xml b/eclipse-update/org.lwjgl.info/plugin.xml deleted file mode 100755 index 82fc14ab..00000000 --- a/eclipse-update/org.lwjgl.info/plugin.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/FpsStatusLineItem.java b/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/FpsStatusLineItem.java deleted file mode 100755 index 132fd8a5..00000000 --- a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/FpsStatusLineItem.java +++ /dev/null @@ -1,186 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Kristian Duske - FPS Status Line Item - *******************************************************************************/ - -package org.lwjgl.info; - -import java.util.logging.Logger; - -import org.eclipse.jface.action.ContributionItem; -import org.eclipse.jface.action.StatusLineLayoutData; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; - -/** - * Displays FPS information in the Eclipse status bar. - * - * @author Kristian Duske - * @version $Revision$ - * @since 22.05.2008 - * @see $HeadURL$ - */ -public class FpsStatusLineItem extends ContributionItem { - - private static final int CHAR_WIDTH = 8; - - private static final int INDENT = 3; - - @SuppressWarnings("unused") - private static final Logger log = Logger.getLogger(FpsStatusLineItem.class - .getName()); - - private static final int NUM_FRAMES = 500; - - private static final long TIMEOUT = 300; - - private int m_fixedHeight = -1; - - private int m_fixedWidth = -1; - - private long[] m_frames = new long[NUM_FRAMES]; - - private int m_index = 0; - - private int m_count = -1; - - private double avg; - - private long m_lastFrame = -1; - - private CLabel m_label; - - /** - * - */ - public FpsStatusLineItem() { - for (int i = 0; i < m_frames.length; i++) - m_frames[i] = 0; - avg = 0; - } - - /** - * @param i_id - */ - public FpsStatusLineItem(String i_id) { - super(i_id); - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Composite) - */ - @Override - public void fill(Composite i_parent) { - - Label sep = new Label(i_parent, SWT.SEPARATOR); - m_label = new CLabel(i_parent, SWT.SHADOW_NONE); - - StatusLineLayoutData data = new StatusLineLayoutData(); - data.widthHint = getWidthHint(i_parent); - m_label.setLayoutData(data); - - data = new StatusLineLayoutData(); - data.heightHint = getHeightHint(i_parent); - sep.setLayoutData(data); - - updateCounter(); - } - - private int getHeightHint(Composite control) { - - if (m_fixedHeight < 0) { - GC gc = new GC(control); - gc.setFont(control.getFont()); - m_fixedHeight = gc.getFontMetrics().getHeight(); - gc.dispose(); - } - return m_fixedHeight; - } - - private int getWidthHint(Composite control) { - - if (m_fixedWidth < 0) { - GC gc = new GC(control); - gc.setFont(control.getFont()); - m_fixedWidth = gc.getFontMetrics().getAverageCharWidth() - * CHAR_WIDTH; - m_fixedWidth += INDENT * 2; - gc.dispose(); - } - return m_fixedWidth; - } - - /** - * {@inheritDoc} - * - * @see de.feu.draw3d.RenderListener#renderPassFinished() - */ - public void renderPassFinished() { - - long time = System.currentTimeMillis(); - if (m_lastFrame == -1) { - m_lastFrame = time; - return; - } - - long frameTime = time - m_lastFrame; - m_lastFrame = time; - - if (frameTime <= TIMEOUT) { - - if (m_count < NUM_FRAMES) - m_count++; - - avg -= m_frames[m_index]; - m_frames[m_index] = frameTime; - avg += m_frames[m_index]; - - m_index++; - if (m_index >= NUM_FRAMES) { - m_index = 0; - } - - } - - updateCounter(); - } - - /** - * {@inheritDoc} - * - * @see de.feu.draw3d.RenderListener#renderPassStarted() - */ - public void renderPassStarted() { - - // nothing to do - } - - private synchronized void updateCounter() { - - long fps = 0; - if (m_count > 0) - fps = (long) (1000.0 / (avg / ((double) m_count))); - // System.out.println("i:"+m_index+", c="+m_count+", avg: " + avg); - - if (m_label != null && !m_label.isDisposed()) { - Display display = m_label.getDisplay(); - - m_label.setForeground(display - .getSystemColor(SWT.COLOR_WIDGET_FOREGROUND)); - m_label.setText(fps + " FPS"); - } - } -} diff --git a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLInfoView.java b/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLInfoView.java deleted file mode 100644 index 7e79ea51..00000000 --- a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLInfoView.java +++ /dev/null @@ -1,609 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ - -package org.lwjgl.info; - -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.eclipse.core.runtime.IBundleGroup; -import org.eclipse.core.runtime.IBundleGroupProvider; -import org.eclipse.core.runtime.Platform; -import org.eclipse.swt.SWT; -import org.eclipse.swt.opengl.GLCanvas; -import org.eclipse.swt.opengl.GLData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.part.ViewPart; -import org.lwjgl.LWJGLException; -import org.lwjgl.LWJGLUtil; -import org.lwjgl.Sys; -import org.lwjgl.opengl.ContextCapabilities; -import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GLContext; -import org.lwjgl.util.glu.GLU; -import org.lwjgl.util.glu.Registry; - -/** - * LWJGLInfoView - * There should really be more documentation here. - * - * @author Jens von Pilgrim - * @version $Revision$ - * @since Nov 23, 2010 - */ -public class LWJGLInfoView extends ViewPart { - - static final String NL = System.getProperty("line.separator", "\n"); - - static final int TAB = 16; - - /** - * {@inheritDoc} - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override - public void createPartControl(Composite i_parent) { - - Text info = new Text(i_parent, SWT.READ_ONLY | SWT.LEFT | SWT.MULTI - | SWT.H_SCROLL | SWT.V_SCROLL); - - GLCanvas canvas = new GLCanvas(i_parent, SWT.NONE, new GLData()); - canvas.setCurrent(); - try { - GLContext.useContext(canvas); - } catch (LWJGLException ex) { - // TODO Implement catch block for LWJGLException - ex.printStackTrace(); - } - - String infoString = gatherInformation(); - info.setText(infoString); - } - - static String getFeatureVersion(String myFeatureId) { - IBundleGroupProvider[] providers = Platform.getBundleGroupProviders(); - if (providers != null) { - for (int i = 0; i < providers.length; ++i) { - IBundleGroup[] bundleGroups = providers[i].getBundleGroups(); - for (IBundleGroup bg : bundleGroups) { - if (bg.getIdentifier().equals(myFeatureId)) { - return bg.getVersion(); - } - } - } - } - return "Feature not found"; - } - - /** - * @param i_canvas - * @return - */ - private static String gatherInformation() { - StringBuffer strb = new StringBuffer(); - - try { - infoNL(strb, "LWJGL feature version", - getFeatureVersion("org.lwjgl")); - } catch (Exception ex) { - warnNL(strb, "Error retrieving feature version: " + ex.getMessage()); - } - - infoNL(strb, "LWJGL version", Sys.getVersion() - + (Sys.is64Bit() ? " (64bit)" : "")); - - infoNL(strb, "Java", System.getProperty("java.version"), - System.getProperty("java.vendor")); - infoNL(strb, "Platform", LWJGLUtil.getPlatformName()); - infoNL(strb, "Graphics card", Display.getAdapter()); - infoNL(strb, "Driver version", Display.getVersion()); - infoNL(strb, "OpenGL driver version", GL11.glGetString(GL11.GL_VERSION)); - - infoNL(strb, "GLU version", Registry.gluGetString(GLU.GLU_VERSION)); - infoNL(strb, "GLU extensions", - Registry.gluGetString(GLU.GLU_EXTENSIONS)); - - ContextCapabilities caps = GLContext.getCapabilities(); - openGLVersions(strb, caps); - - strb.append(NL).append("Capabilities").append(NL); - TreeMap capInfos = new TreeMap(); - gatherCapabilities(caps, capInfos); - infoGroupedCaps(strb, capInfos); - - Display.destroy(); - - return strb.toString(); - } - - static void openGLVersions(StringBuffer strb, ContextCapabilities caps) { - StringBuffer versions = new StringBuffer(); - if (caps.OpenGL11) - versions.append(", 1.1"); - if (caps.OpenGL12) - versions.append(", 1.2"); - if (caps.OpenGL13) - versions.append(", 1.3"); - if (caps.OpenGL14) - versions.append(", 1.4"); - if (caps.OpenGL15) - versions.append(", 1.5"); - if (caps.OpenGL20) - versions.append(", 2.0"); - if (caps.OpenGL21) - versions.append(", 2.1"); - if (caps.OpenGL30) - versions.append(", 3.0"); - if (caps.OpenGL31) - versions.append(", 3.1"); - if (caps.OpenGL32) - versions.append(", 3.2"); - if (caps.OpenGL33) - versions.append(", 3.3"); - if (caps.OpenGL40) - versions.append(", 4.0"); - if (caps.OpenGL41) - versions.append(", 4.1"); - if (strb.length() > 2) - versions.delete(0, 2); - infoNL(strb, "Supported OpenGL versions", versions.toString()); - } - - /** - * @param i_strb - * @param i_capInfos - */ - static void infoGroupedCaps(StringBuffer strb, - TreeMap capInfos) { - String currentGroup = "*NOGROUP*"; - Set groupInfosSupported = new TreeSet(); - Set groupInfosNA = new TreeSet(); - for (String key : capInfos.keySet()) { - if (!key.startsWith(currentGroup)) { - printGroup(strb, currentGroup, groupInfosSupported, - groupInfosNA); - currentGroup = key.substring(0, key.indexOf(' ')); - } - if (capInfos.get(key).booleanValue()) { - groupInfosSupported.add(key); - } else { - groupInfosNA.add(key); - } - } - printGroup(strb, currentGroup, groupInfosSupported, groupInfosNA); - - } - - /** - * @param i_currentGroup - * @param i_groupInfosSupported - * @param i_groupInfosNA - */ - private static void printGroup(StringBuffer strb, String currentGroup, - Set groupInfosSupported, Set groupInfosNA) { - String title = currentGroup + " extensions"; - if (!(groupInfosSupported.isEmpty() && groupInfosNA.isEmpty())) { - if (groupInfosSupported.isEmpty()) { - infoNL(strb, title, "n.a."); - } else { - - strb.append(title).append(": "); - for (int i = 0; i < TAB - title.length(); i++) { - strb.append(' '); - } - int c = 1; - for (String s : groupInfosSupported) { - if (c > 1) - strb.append(','); - if (c % 4 == 0) { - strb.append(NL).append(" "); - } else if (c > 1) { - strb.append(' '); - } - strb.append(s.substring(currentGroup.length() + 1)); - c++; - } - strb.append(NL); - } - - } - groupInfosNA.clear(); - groupInfosSupported.clear(); - - } - - /** - * @param caps - * @param capInfos - */ - private static void gatherCapabilities(ContextCapabilities caps, - Map capInfos) { - capInfos.put("AMD conservative depth", caps.GL_AMD_conservative_depth); - capInfos.put("AMD debug output", caps.GL_AMD_debug_output); - capInfos.put("AMD draw buffers blend", caps.GL_AMD_draw_buffers_blend); - capInfos.put("AMD name gen delete", caps.GL_AMD_name_gen_delete); - capInfos.put("AMD performance monitor", caps.GL_AMD_performance_monitor); - capInfos.put("AMD seamless cubemap per texture", - caps.GL_AMD_seamless_cubemap_per_texture); - capInfos.put("AMD shader stencil export", - caps.GL_AMD_shader_stencil_export); - capInfos.put("AMD texture texture4", caps.GL_AMD_texture_texture4); - capInfos.put("AMD transform feedback3 lines triangles", - caps.GL_AMD_transform_feedback3_lines_triangles); - capInfos.put("AMD vertex shader tessellator", - caps.GL_AMD_vertex_shader_tessellator); - capInfos.put("APPLE aux depth stencil", caps.GL_APPLE_aux_depth_stencil); - capInfos.put("APPLE client storage", caps.GL_APPLE_client_storage); - capInfos.put("APPLE element array", caps.GL_APPLE_element_array); - capInfos.put("APPLE fence", caps.GL_APPLE_fence); - capInfos.put("APPLE float pixels", caps.GL_APPLE_float_pixels); - capInfos.put("APPLE flush buffer range", - caps.GL_APPLE_flush_buffer_range); - capInfos.put("APPLE object purgeable", caps.GL_APPLE_object_purgeable); - capInfos.put("APPLE packed pixels", caps.GL_APPLE_packed_pixels); - capInfos.put("APPLE rgb 422", caps.GL_APPLE_rgb_422); - capInfos.put("APPLE row bytes", caps.GL_APPLE_row_bytes); - capInfos.put("APPLE texture range", caps.GL_APPLE_texture_range); - capInfos.put("APPLE vertex array object", - caps.GL_APPLE_vertex_array_object); - capInfos.put("APPLE vertex array range", - caps.GL_APPLE_vertex_array_range); - capInfos.put("APPLE vertex program evaluators", - caps.GL_APPLE_vertex_program_evaluators); - capInfos.put("APPLE ycbcr 422", caps.GL_APPLE_ycbcr_422); - capInfos.put("ARB ES2 compatibility", caps.GL_ARB_ES2_compatibility); - capInfos.put("ARB blend func extended", caps.GL_ARB_blend_func_extended); - capInfos.put("ARB cl event", caps.GL_ARB_cl_event); - capInfos.put("ARB color buffer float", caps.GL_ARB_color_buffer_float); - capInfos.put("ARB compatibility", caps.GL_ARB_compatibility); - capInfos.put("ARB copy buffer", caps.GL_ARB_copy_buffer); - capInfos.put("ARB debug output", caps.GL_ARB_debug_output); - capInfos.put("ARB depth buffer float", caps.GL_ARB_depth_buffer_float); - capInfos.put("ARB depth clamp", caps.GL_ARB_depth_clamp); - capInfos.put("ARB depth texture", caps.GL_ARB_depth_texture); - capInfos.put("ARB draw buffers", caps.GL_ARB_draw_buffers); - capInfos.put("ARB draw buffers blend", caps.GL_ARB_draw_buffers_blend); - capInfos.put("ARB draw elements base vertex", - caps.GL_ARB_draw_elements_base_vertex); - capInfos.put("ARB draw indirect", caps.GL_ARB_draw_indirect); - capInfos.put("ARB draw instanced", caps.GL_ARB_draw_instanced); - capInfos.put("ARB explicit attrib location", - caps.GL_ARB_explicit_attrib_location); - capInfos.put("ARB fragment coord conventions", - caps.GL_ARB_fragment_coord_conventions); - capInfos.put("ARB fragment program", caps.GL_ARB_fragment_program); - capInfos.put("ARB fragment program shadow", - caps.GL_ARB_fragment_program_shadow); - capInfos.put("ARB fragment shader", caps.GL_ARB_fragment_shader); - capInfos.put("ARB framebuffer object", caps.GL_ARB_framebuffer_object); - capInfos.put("ARB framebuffer sRGB", caps.GL_ARB_framebuffer_sRGB); - capInfos.put("ARB geometry shader4", caps.GL_ARB_geometry_shader4); - capInfos.put("ARB get program binary", caps.GL_ARB_get_program_binary); - capInfos.put("ARB gpu shader5", caps.GL_ARB_gpu_shader5); - capInfos.put("ARB gpu shader fp64", caps.GL_ARB_gpu_shader_fp64); - capInfos.put("ARB half float pixel", caps.GL_ARB_half_float_pixel); - capInfos.put("ARB half float vertex", caps.GL_ARB_half_float_vertex); - capInfos.put("ARB imaging", caps.GL_ARB_imaging); - capInfos.put("ARB instanced arrays", caps.GL_ARB_instanced_arrays); - capInfos.put("ARB map buffer range", caps.GL_ARB_map_buffer_range); - capInfos.put("ARB matrix palette", caps.GL_ARB_matrix_palette); - capInfos.put("ARB multisample", caps.GL_ARB_multisample); - capInfos.put("ARB multitexture", caps.GL_ARB_multitexture); - capInfos.put("ARB occlusion query", caps.GL_ARB_occlusion_query); - capInfos.put("ARB occlusion query2", caps.GL_ARB_occlusion_query2); - capInfos.put("ARB pixel buffer object", caps.GL_ARB_pixel_buffer_object); - capInfos.put("ARB point parameters", caps.GL_ARB_point_parameters); - capInfos.put("ARB point sprite", caps.GL_ARB_point_sprite); - capInfos.put("ARB provoking vertex", caps.GL_ARB_provoking_vertex); - capInfos.put("ARB robustness", caps.GL_ARB_robustness); - capInfos.put("ARB sample shading", caps.GL_ARB_sample_shading); - capInfos.put("ARB sampler objects", caps.GL_ARB_sampler_objects); - capInfos.put("ARB seamless cube map", caps.GL_ARB_seamless_cube_map); - capInfos.put("ARB separate shader objects", - caps.GL_ARB_separate_shader_objects); - capInfos.put("ARB shader bit encoding", caps.GL_ARB_shader_bit_encoding); - capInfos.put("ARB shader objects", caps.GL_ARB_shader_objects); - capInfos.put("ARB shader precision", caps.GL_ARB_shader_precision); - capInfos.put("ARB shader stencil export", - caps.GL_ARB_shader_stencil_export); - capInfos.put("ARB shader subroutine", caps.GL_ARB_shader_subroutine); - capInfos.put("ARB shader texture lod", caps.GL_ARB_shader_texture_lod); - capInfos.put("ARB shading language 100", - caps.GL_ARB_shading_language_100); - capInfos.put("ARB shading language include", - caps.GL_ARB_shading_language_include); - capInfos.put("ARB shadow", caps.GL_ARB_shadow); - capInfos.put("ARB shadow ambient", caps.GL_ARB_shadow_ambient); - capInfos.put("ARB sync", caps.GL_ARB_sync); - capInfos.put("ARB tessellation shader", caps.GL_ARB_tessellation_shader); - capInfos.put("ARB texture border clamp", - caps.GL_ARB_texture_border_clamp); - capInfos.put("ARB texture buffer object", - caps.GL_ARB_texture_buffer_object); - capInfos.put("ARB texture buffer object rgb32", - caps.GL_ARB_texture_buffer_object_rgb32); - capInfos.put("ARB texture compression", caps.GL_ARB_texture_compression); - capInfos.put("ARB texture compression bptc", - caps.GL_ARB_texture_compression_bptc); - capInfos.put("ARB texture compression rgtc", - caps.GL_ARB_texture_compression_rgtc); - capInfos.put("ARB texture cube map", caps.GL_ARB_texture_cube_map); - capInfos.put("ARB texture cube map array", - caps.GL_ARB_texture_cube_map_array); - capInfos.put("ARB texture env add", caps.GL_ARB_texture_env_add); - capInfos.put("ARB texture env combine", caps.GL_ARB_texture_env_combine); - capInfos.put("ARB texture env crossbar", - caps.GL_ARB_texture_env_crossbar); - capInfos.put("ARB texture env dot3", caps.GL_ARB_texture_env_dot3); - capInfos.put("ARB texture float", caps.GL_ARB_texture_float); - capInfos.put("ARB texture gather", caps.GL_ARB_texture_gather); - capInfos.put("ARB texture mirrored repeat", - caps.GL_ARB_texture_mirrored_repeat); - capInfos.put("ARB texture multisample", caps.GL_ARB_texture_multisample); - capInfos.put("ARB texture non power of two", - caps.GL_ARB_texture_non_power_of_two); - capInfos.put("ARB texture query lod", caps.GL_ARB_texture_query_lod); - capInfos.put("ARB texture rectangle", caps.GL_ARB_texture_rectangle); - capInfos.put("ARB texture rg", caps.GL_ARB_texture_rg); - capInfos.put("ARB texture rgb10 a2ui", caps.GL_ARB_texture_rgb10_a2ui); - capInfos.put("ARB texture swizzle", caps.GL_ARB_texture_swizzle); - capInfos.put("ARB timer query", caps.GL_ARB_timer_query); - capInfos.put("ARB transform feedback2", caps.GL_ARB_transform_feedback2); - capInfos.put("ARB transform feedback3", caps.GL_ARB_transform_feedback3); - capInfos.put("ARB transpose matrix", caps.GL_ARB_transpose_matrix); - capInfos.put("ARB uniform buffer object", - caps.GL_ARB_uniform_buffer_object); - capInfos.put("ARB vertex array bgra", caps.GL_ARB_vertex_array_bgra); - capInfos.put("ARB vertex array object", caps.GL_ARB_vertex_array_object); - capInfos.put("ARB vertex attrib 64bit", caps.GL_ARB_vertex_attrib_64bit); - capInfos.put("ARB vertex blend", caps.GL_ARB_vertex_blend); - capInfos.put("ARB vertex buffer object", - caps.GL_ARB_vertex_buffer_object); - capInfos.put("ARB vertex program", caps.GL_ARB_vertex_program); - capInfos.put("ARB vertex shader", caps.GL_ARB_vertex_shader); - capInfos.put("ARB vertex type 2 10 10 10 rev", - caps.GL_ARB_vertex_type_2_10_10_10_rev); - capInfos.put("ARB viewport array", caps.GL_ARB_viewport_array); - capInfos.put("ARB window pos", caps.GL_ARB_window_pos); - capInfos.put("ATI draw buffers", caps.GL_ATI_draw_buffers); - capInfos.put("ATI element array", caps.GL_ATI_element_array); - capInfos.put("ATI envmap bumpmap", caps.GL_ATI_envmap_bumpmap); - capInfos.put("ATI fragment shader", caps.GL_ATI_fragment_shader); - capInfos.put("ATI map object buffer", caps.GL_ATI_map_object_buffer); - capInfos.put("ATI meminfo", caps.GL_ATI_meminfo); - capInfos.put("ATI pn triangles", caps.GL_ATI_pn_triangles); - capInfos.put("ATI separate stencil", caps.GL_ATI_separate_stencil); - capInfos.put("ATI shader texture lod", caps.GL_ATI_shader_texture_lod); - capInfos.put("ATI text fragment shader", - caps.GL_ATI_text_fragment_shader); - capInfos.put("ATI texture compression 3dc", - caps.GL_ATI_texture_compression_3dc); - capInfos.put("ATI texture env combine3", - caps.GL_ATI_texture_env_combine3); - capInfos.put("ATI texture float", caps.GL_ATI_texture_float); - capInfos.put("ATI texture mirror once", caps.GL_ATI_texture_mirror_once); - capInfos.put("ATI vertex array object", caps.GL_ATI_vertex_array_object); - capInfos.put("ATI vertex attrib array object", - caps.GL_ATI_vertex_attrib_array_object); - capInfos.put("ATI vertex streams", caps.GL_ATI_vertex_streams); - capInfos.put("EXT abgr", caps.GL_EXT_abgr); - capInfos.put("EXT bgra", caps.GL_EXT_bgra); - capInfos.put("EXT bindable uniform", caps.GL_EXT_bindable_uniform); - capInfos.put("EXT blend color", caps.GL_EXT_blend_color); - capInfos.put("EXT blend equation separate", - caps.GL_EXT_blend_equation_separate); - capInfos.put("EXT blend func separate", caps.GL_EXT_blend_func_separate); - capInfos.put("EXT blend minmax", caps.GL_EXT_blend_minmax); - capInfos.put("EXT blend subtract", caps.GL_EXT_blend_subtract); - capInfos.put("EXT Cg shader", caps.GL_EXT_Cg_shader); - capInfos.put("EXT compiled vertex array", - caps.GL_EXT_compiled_vertex_array); - capInfos.put("EXT depth bounds test", caps.GL_EXT_depth_bounds_test); - capInfos.put("EXT direct state access", caps.GL_EXT_direct_state_access); - capInfos.put("EXT draw buffers2", caps.GL_EXT_draw_buffers2); - capInfos.put("EXT draw instanced", caps.GL_EXT_draw_instanced); - capInfos.put("EXT draw range elements", caps.GL_EXT_draw_range_elements); - capInfos.put("EXT fog coord", caps.GL_EXT_fog_coord); - capInfos.put("EXT framebuffer blit", caps.GL_EXT_framebuffer_blit); - capInfos.put("EXT framebuffer multisample", - caps.GL_EXT_framebuffer_multisample); - capInfos.put("EXT framebuffer object", caps.GL_EXT_framebuffer_object); - capInfos.put("EXT framebuffer sRGB", caps.GL_EXT_framebuffer_sRGB); - capInfos.put("EXT geometry shader4", caps.GL_EXT_geometry_shader4); - capInfos.put("EXT gpu program parameters", - caps.GL_EXT_gpu_program_parameters); - capInfos.put("EXT gpu shader4", caps.GL_EXT_gpu_shader4); - capInfos.put("EXT multi draw arrays", caps.GL_EXT_multi_draw_arrays); - capInfos.put("EXT packed depth stencil", - caps.GL_EXT_packed_depth_stencil); - capInfos.put("EXT packed float", caps.GL_EXT_packed_float); - capInfos.put("EXT packed pixels", caps.GL_EXT_packed_pixels); - capInfos.put("EXT paletted texture", caps.GL_EXT_paletted_texture); - capInfos.put("EXT pixel buffer object", caps.GL_EXT_pixel_buffer_object); - capInfos.put("EXT point parameters", caps.GL_EXT_point_parameters); - capInfos.put("EXT provoking vertex", caps.GL_EXT_provoking_vertex); - capInfos.put("EXT rescale normal", caps.GL_EXT_rescale_normal); - capInfos.put("EXT secondary color", caps.GL_EXT_secondary_color); - capInfos.put("EXT separate shader objects", - caps.GL_EXT_separate_shader_objects); - capInfos.put("EXT separate specular color", - caps.GL_EXT_separate_specular_color); - capInfos.put("EXT shader image load store", - caps.GL_EXT_shader_image_load_store); - capInfos.put("EXT shadow funcs", caps.GL_EXT_shadow_funcs); - capInfos.put("EXT shared texture palette", - caps.GL_EXT_shared_texture_palette); - capInfos.put("EXT stencil clear tag", caps.GL_EXT_stencil_clear_tag); - capInfos.put("EXT stencil two side", caps.GL_EXT_stencil_two_side); - capInfos.put("EXT stencil wrap", caps.GL_EXT_stencil_wrap); - capInfos.put("EXT texture 3d", caps.GL_EXT_texture_3d); - capInfos.put("EXT texture array", caps.GL_EXT_texture_array); - capInfos.put("EXT texture buffer object", - caps.GL_EXT_texture_buffer_object); - capInfos.put("EXT texture compression latc", - caps.GL_EXT_texture_compression_latc); - capInfos.put("EXT texture compression rgtc", - caps.GL_EXT_texture_compression_rgtc); - capInfos.put("EXT texture compression s3tc", - caps.GL_EXT_texture_compression_s3tc); - capInfos.put("EXT texture env combine", caps.GL_EXT_texture_env_combine); - capInfos.put("EXT texture env dot3", caps.GL_EXT_texture_env_dot3); - capInfos.put("EXT texture filter anisotropic", - caps.GL_EXT_texture_filter_anisotropic); - capInfos.put("EXT texture integer", caps.GL_EXT_texture_integer); - capInfos.put("EXT texture lod bias", caps.GL_EXT_texture_lod_bias); - capInfos.put("EXT texture mirror clamp", - caps.GL_EXT_texture_mirror_clamp); - capInfos.put("EXT texture rectangle", caps.GL_EXT_texture_rectangle); - capInfos.put("EXT texture sRGB", caps.GL_EXT_texture_sRGB); - capInfos.put("EXT texture shared exponent", - caps.GL_EXT_texture_shared_exponent); - capInfos.put("EXT texture snorm", caps.GL_EXT_texture_snorm); - capInfos.put("EXT texture swizzle", caps.GL_EXT_texture_swizzle); - capInfos.put("EXT timer query", caps.GL_EXT_timer_query); - capInfos.put("EXT transform feedback", caps.GL_EXT_transform_feedback); - capInfos.put("EXT vertex array bgra", caps.GL_EXT_vertex_array_bgra); - capInfos.put("EXT vertex attrib 64bit", caps.GL_EXT_vertex_attrib_64bit); - capInfos.put("EXT vertex shader", caps.GL_EXT_vertex_shader); - capInfos.put("EXT vertex weighting", caps.GL_EXT_vertex_weighting); - - capInfos.put("GREMEDY string marker", caps.GL_GREMEDY_string_marker); - capInfos.put("HP occlusion test", caps.GL_HP_occlusion_test); - capInfos.put("IBM rasterpos clip", caps.GL_IBM_rasterpos_clip); - capInfos.put("NVX gpu memory info", caps.GL_NVX_gpu_memory_info); - capInfos.put("NV blend square", caps.GL_NV_blend_square); - capInfos.put("NV conditional render", caps.GL_NV_conditional_render); - capInfos.put("NV copy depth to color", caps.GL_NV_copy_depth_to_color); - capInfos.put("NV copy image", caps.GL_NV_copy_image); - capInfos.put("NV depth buffer float", caps.GL_NV_depth_buffer_float); - capInfos.put("NV depth clamp", caps.GL_NV_depth_clamp); - capInfos.put("NV evaluators", caps.GL_NV_evaluators); - capInfos.put("NV explicit multisample", caps.GL_NV_explicit_multisample); - capInfos.put("NV fence", caps.GL_NV_fence); - capInfos.put("NV float buffer", caps.GL_NV_float_buffer); - capInfos.put("NV fog distance", caps.GL_NV_fog_distance); - capInfos.put("NV fragment program", caps.GL_NV_fragment_program); - capInfos.put("NV fragment program2", caps.GL_NV_fragment_program2); - capInfos.put("NV fragment program4", caps.GL_NV_fragment_program4); - capInfos.put("NV fragment program option", - caps.GL_NV_fragment_program_option); - capInfos.put("NV framebuffer multisample coverage", - caps.GL_NV_framebuffer_multisample_coverage); - capInfos.put("NV geometry program4", caps.GL_NV_geometry_program4); - capInfos.put("NV geometry shader4", caps.GL_NV_geometry_shader4); - capInfos.put("NV gpu program4", caps.GL_NV_gpu_program4); - capInfos.put("NV gpu program5", caps.GL_NV_gpu_program5); - capInfos.put("NV gpu shader5", caps.GL_NV_gpu_shader5); - capInfos.put("NV half float", caps.GL_NV_half_float); - capInfos.put("NV light max exponent", caps.GL_NV_light_max_exponent); - capInfos.put("NV multisample coverage", caps.GL_NV_multisample_coverage); - capInfos.put("NV multisample filter hint", - caps.GL_NV_multisample_filter_hint); - capInfos.put("NV occlusion query", caps.GL_NV_occlusion_query); - capInfos.put("NV packed depth stencil", caps.GL_NV_packed_depth_stencil); - capInfos.put("NV parameter buffer object", - caps.GL_NV_parameter_buffer_object); - capInfos.put("NV parameter buffer object2", - caps.GL_NV_parameter_buffer_object2); - capInfos.put("NV pixel data range", caps.GL_NV_pixel_data_range); - capInfos.put("NV point sprite", caps.GL_NV_point_sprite); - capInfos.put("NV primitive restart", caps.GL_NV_primitive_restart); - capInfos.put("NV register combiners", caps.GL_NV_register_combiners); - capInfos.put("NV register combiners2", caps.GL_NV_register_combiners2); - capInfos.put("NV shader buffer load", caps.GL_NV_shader_buffer_load); - capInfos.put("NV shader buffer store", caps.GL_NV_shader_buffer_store); - capInfos.put("NV tessellation program5", - caps.GL_NV_tessellation_program5); - capInfos.put("NV texgen reflection", caps.GL_NV_texgen_reflection); - capInfos.put("NV texture barrier", caps.GL_NV_texture_barrier); - capInfos.put("NV texture compression vtc", - caps.GL_NV_texture_compression_vtc); - capInfos.put("NV texture env combine4", caps.GL_NV_texture_env_combine4); - capInfos.put("NV texture expand normal", - caps.GL_NV_texture_expand_normal); - capInfos.put("NV texture rectangle", caps.GL_NV_texture_rectangle); - capInfos.put("NV texture shader", caps.GL_NV_texture_shader); - capInfos.put("NV texture shader2", caps.GL_NV_texture_shader2); - capInfos.put("NV texture shader3", caps.GL_NV_texture_shader3); - capInfos.put("NV transform feedback", caps.GL_NV_transform_feedback); - capInfos.put("NV transform feedback2", caps.GL_NV_transform_feedback2); - capInfos.put("NV vertex array range", caps.GL_NV_vertex_array_range); - capInfos.put("NV vertex array range2", caps.GL_NV_vertex_array_range2); - capInfos.put("NV vertex attrib integer 64bit", - caps.GL_NV_vertex_attrib_integer_64bit); - capInfos.put("NV vertex buffer unified memory", - caps.GL_NV_vertex_buffer_unified_memory); - capInfos.put("NV vertex program", caps.GL_NV_vertex_program); - capInfos.put("NV vertex program1 1", caps.GL_NV_vertex_program1_1); - capInfos.put("NV vertex program2", caps.GL_NV_vertex_program2); - capInfos.put("NV vertex program2 option", - caps.GL_NV_vertex_program2_option); - capInfos.put("NV vertex program3", caps.GL_NV_vertex_program3); - capInfos.put("NV vertex program4", caps.GL_NV_vertex_program4); - capInfos.put("SGIS generate mipmap", caps.GL_SGIS_generate_mipmap); - capInfos.put("SGIS texture lod", caps.GL_SGIS_texture_lod); - capInfos.put("SUN slice accum", caps.GL_SUN_slice_accum); - } - - /** - * @param io_strb - * @param title - * @param available - */ - static void availableNL(StringBuffer io_strb, String title, boolean flag) { - infoNL(io_strb, title, flag ? "supported" : "not available"); - - } - - static void warnNL(StringBuffer io_strb, String msg) { - io_strb.append(msg).append(NL); - } - - static void infoNL(StringBuffer io_strb, String title, String... msg) { - io_strb.append(title).append(":"); - for (int i = 0; i < TAB - title.length(); i++) { - io_strb.append(' '); - } - for (String s : msg) { - io_strb.append(' '); - if (s != null) - io_strb.append(s); - else - io_strb.append("n.a."); - } - io_strb.append(NL); - } - - public static void main(String[] args) throws Exception { - - Display.setFullscreen(false); - Display.create(); - - String s = gatherInformation(); - System.out.println(s); - } - - /** - * {@inheritDoc} - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - // TODO implement method LWJGLInfoView.setFocus - - } - -} diff --git a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLTestView.java b/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLTestView.java deleted file mode 100755 index baa99790..00000000 --- a/eclipse-update/org.lwjgl.info/src/java/org/lwjgl/info/LWJGLTestView.java +++ /dev/null @@ -1,203 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ - -package org.lwjgl.info; - -import org.eclipse.core.runtime.IBundleGroup; -import org.eclipse.core.runtime.IBundleGroupProvider; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.opengl.GLCanvas; -import org.eclipse.swt.opengl.GLData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.ui.part.ViewPart; -import org.lwjgl.LWJGLException; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GLContext; -import org.lwjgl.util.glu.GLU; - -/** - * Simple view for testing whether LWJGL is installed correctly on your - * system. - * The example is based on - * snippet 195. - * - * @author Jens von Pilgrim - * @version $Revision$ - * @since 16.07.2007 - * @headurl $HeadURL$ - */ -public class LWJGLTestView extends ViewPart { - - GLCanvas canvas; - - FpsStatusLineItem fpsstatuslineitem; - - static String getFeatureVersion(String myFeatureId) { - IBundleGroupProvider[] providers = Platform.getBundleGroupProviders(); - if (providers != null) { - for (int i = 0; i < providers.length; ++i) { - IBundleGroup[] bundleGroups = providers[i].getBundleGroups(); - for (IBundleGroup bg : bundleGroups) { - if (bg.getIdentifier().equals(myFeatureId)) { - return bg.getVersion(); - } - } - } - } - return "Feature not found"; - } - - /** - * {@inheritDoc} - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override - public void createPartControl(Composite parent) { - - String strVersion = getFeatureVersion("org.lwjgl"); - this.setPartName("org.lwjgl " + strVersion); - - IStatusLineManager statusLine = this.getViewSite().getActionBars() - .getStatusLineManager(); - - fpsstatuslineitem = new FpsStatusLineItem(); - statusLine.add(fpsstatuslineitem); - - GLData data = new GLData(); - data.doubleBuffer = true; - canvas = new GLCanvas(parent, SWT.NONE, data); - - canvas.setCurrent(); - try { - GLContext.useContext(canvas); - } catch (LWJGLException e) { - e.printStackTrace(); - } - - canvas.addListener(SWT.Resize, new Listener() { - public void handleEvent(Event event) { - Rectangle bounds = canvas.getBounds(); - float fAspect = (float) bounds.width / (float) bounds.height; - canvas.setCurrent(); - try { - GLContext.useContext(canvas); - } catch (LWJGLException e) { - e.printStackTrace(); - } - GL11.glViewport(0, 0, bounds.width, bounds.height); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - } - }); - - GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - GL11.glColor3f(1.0f, 0.0f, 0.0f); - GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); - GL11.glClearDepth(1.0); - GL11.glLineWidth(2); - GL11.glEnable(GL11.GL_DEPTH_TEST); - - Display.getCurrent().asyncExec(initRunnable()); - - } - - /** - * {@inheritDoc} - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - canvas.setFocus(); - } - - static void drawTorus(float r, float R, int nsides, int rings) { - float ringDelta = 2.0f * (float) Math.PI / rings; - float sideDelta = 2.0f * (float) Math.PI / nsides; - float theta = 0.0f, cosTheta = 1.0f, sinTheta = 0.0f; - for (int i = rings - 1; i >= 0; i--) { - float theta1 = theta + ringDelta; - float cosTheta1 = (float) Math.cos(theta1); - float sinTheta1 = (float) Math.sin(theta1); - GL11.glBegin(GL11.GL_QUAD_STRIP); - float phi = 0.0f; - for (int j = nsides; j >= 0; j--) { - phi += sideDelta; - float cosPhi = (float) Math.cos(phi); - float sinPhi = (float) Math.sin(phi); - float dist = R + r * cosPhi; - GL11 - .glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, - sinPhi); - GL11 - .glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r - * sinPhi); - GL11.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); - GL11.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); - } - GL11.glEnd(); - theta = theta1; - cosTheta = cosTheta1; - sinTheta = sinTheta1; - } - } - - Runnable initRunnable() { - return new Runnable() { - int rot = 0; - - public void run() { - if (!canvas.isDisposed() && canvas.isVisible()) { - - fpsstatuslineitem.renderPassStarted(); - - canvas.setCurrent(); - try { - GLContext.useContext(canvas); - } catch (LWJGLException e) { - e.printStackTrace(); - } - GL11.glClear(GL11.GL_COLOR_BUFFER_BIT - | GL11.GL_DEPTH_BUFFER_BIT); - GL11.glClearColor(.2f, .7f, .2f, 1.0f); - GL11.glLoadIdentity(); - GL11.glTranslatef(0.0f, 0.0f, -10.0f); - float frot = rot; - GL11 - .glRotatef(0.15f * rot, 2.0f * frot, 10.0f * frot, - 1.0f); - GL11.glRotatef(0.3f * rot, 3.0f * frot, 1.0f * frot, 1.0f); - rot++; - GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); - GL11.glColor3f(0.9f, 0.9f, 0.9f); - drawTorus(1, 1.9f + ((float) Math.sin((0.004f * frot))), - 15, 15); - - canvas.swapBuffers(); - - fpsstatuslineitem.renderPassFinished(); - Display.getCurrent().asyncExec(this); - - } - } - }; - } - -} diff --git a/eclipse-update/org.lwjgl.source/.project b/eclipse-update/org.lwjgl.source/.project deleted file mode 100644 index c2d3bf7c..00000000 --- a/eclipse-update/org.lwjgl.source/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - org.lwjgl.source - - - - - - - - diff --git a/eclipse-update/org.lwjgl.source/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl.source/META-INF/MANIFEST.MF deleted file mode 100644 index cd90e9e5..00000000 --- a/eclipse-update/org.lwjgl.source/META-INF/MANIFEST.MF +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Sources -Bundle-Vendor: Lightweight Java Game Library Project -Bundle-Version: 2 -Bundle-SymbolicName: org.lwjgl.source;singleton:=true -Bundle-Localization: plugin diff --git a/eclipse-update/org.lwjgl.source/about.html b/eclipse-update/org.lwjgl.source/about.html deleted file mode 100644 index d204f100..00000000 --- a/eclipse-update/org.lwjgl.source/about.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -About - - - - -

About This Content

-

The Lightweight Java Game Library (LWJGL) is a solution aimed -directly at professional and amateur Java programmers alike to enable commercial quality games to be written in Java. -LWJGL provides developers access to high performance crossplatform -libraries such as OpenGL (Open Graphics Library) and OpenAL (Open Audio Library) -allowing for state of the art 3D games and 3D sound. Additionally LWJGL -provides access to controllers such as Gamepads, Steering wheel and -Joysticks. All in a simple and straight forward API.

-

LWJGL is not meant to make writing games particularly easy; it is -primarily an enabling technology which allows developers to get at -resources that are simply otherwise unavailable or poorly implemented on -the existing Java -platform. We anticipate that the LWJGL will, through evolution and -extension, become the foundation for more complete game libraries and -"game engines" as they have popularly become known, and hide some of the -new evils we have had to expose in the APIs.

-

LWJGL is available under a BSD -license, which means it's open source and freely available at no charge.

-

Please visit us on the Freenode IRC Network: #LWJGL. Do idle -if there is no one to answer any of your questions, we are on different -timezones.

- - - -

Plug-Ins

-

The following plug-ins are provided: -

-
org.lwjgl
-
Platform independent jars and native libraries for Windows, Linux and Mac OS X
-
org.lwjgl.doc
-
Documentation (JavaDoc)
-
org.lwjgl.source
-
Source files
-
org.lwjgl.tools
-
Developer tools
-
org.lwjgl.info
-
LWJGL test and info view
-
-

- - - - diff --git a/eclipse-update/org.lwjgl.source/build.properties b/eclipse-update/org.lwjgl.source/build.properties deleted file mode 100644 index edb9a818..00000000 --- a/eclipse-update/org.lwjgl.source/build.properties +++ /dev/null @@ -1,10 +0,0 @@ -bin.includes = META-INF/,\ - about.html,\ - lwjgl_logo.png,\ - plugin.xml,\ - src/ -src.includes = src/,\ - lwjgl_logo.png,\ - about.html,\ - plugin.xml,\ - META-INF/ diff --git a/eclipse-update/org.lwjgl.source/lwjgl_logo.png b/eclipse-update/org.lwjgl.source/lwjgl_logo.png deleted file mode 100644 index e4d806ae..00000000 Binary files a/eclipse-update/org.lwjgl.source/lwjgl_logo.png and /dev/null differ diff --git a/eclipse-update/org.lwjgl.source/plugin.xml b/eclipse-update/org.lwjgl.source/plugin.xml deleted file mode 100644 index bd34b669..00000000 --- a/eclipse-update/org.lwjgl.source/plugin.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/eclipse-update/org.lwjgl.tools/.classpath b/eclipse-update/org.lwjgl.tools/.classpath deleted file mode 100644 index 1ffb089d..00000000 --- a/eclipse-update/org.lwjgl.tools/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/eclipse-update/org.lwjgl.tools/.project b/eclipse-update/org.lwjgl.tools/.project deleted file mode 100644 index 423f5000..00000000 --- a/eclipse-update/org.lwjgl.tools/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.lwjgl.tools - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/eclipse-update/org.lwjgl.tools/.settings/org.eclipse.jdt.core.prefs b/eclipse-update/org.lwjgl.tools/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 739259f1..00000000 --- a/eclipse-update/org.lwjgl.tools/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Tue Nov 23 14:40:51 CET 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/eclipse-update/org.lwjgl.tools/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl.tools/META-INF/MANIFEST.MF deleted file mode 100644 index dab64a84..00000000 --- a/eclipse-update/org.lwjgl.tools/META-INF/MANIFEST.MF +++ /dev/null @@ -1,16 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Tools Plug-in -Bundle-SymbolicName: org.lwjgl.tools;singleton:=true -Bundle-Version: 1.0.0 -Bundle-Activator: org.lwjgl.tools.Activator -Bundle-Vendor: Lightweight Java Game Library Project -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.core.resources;bundle-version="3.4.0", - org.eclipse.jdt.core;bundle-version="3.4.0", - org.eclipse.jdt.ui;bundle-version="3.4.0", - org.eclipse.jdt.launching;bundle-version="3.4.0", - org.lwjgl;bundle-version="2.0.0" -Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/eclipse-update/org.lwjgl.tools/about.html b/eclipse-update/org.lwjgl.tools/about.html deleted file mode 100644 index fc8c5f66..00000000 --- a/eclipse-update/org.lwjgl.tools/about.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - -About - - -

About This Content

- -

November, 2010

-

License

- -

The LWJGL team makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

- -

If you did not receive this Content directly from lwjgl.org, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

- -

Third party code

-

This plug-in contains code from the plugin org.eclipse.jdt.junit, this code -is provided by the Eclipse Foundation under the terms -of the Eclipse Public License Version 1.0.

- - - \ No newline at end of file diff --git a/eclipse-update/org.lwjgl.tools/build.properties b/eclipse-update/org.lwjgl.tools/build.properties deleted file mode 100644 index 42e9c6e1..00000000 --- a/eclipse-update/org.lwjgl.tools/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -source.. = src/java/ -output.. = build/classes/ -bin.includes = META-INF/,\ - .,\ - plugin.xml,\ - about.html diff --git a/eclipse-update/org.lwjgl.tools/plugin.xml b/eclipse-update/org.lwjgl.tools/plugin.xml deleted file mode 100644 index e62e401c..00000000 --- a/eclipse-update/org.lwjgl.tools/plugin.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/Activator.java b/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/Activator.java deleted file mode 100644 index 7d9993af..00000000 --- a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/Activator.java +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.tools; - -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - * - * @author Jens von Pilgrim (developer@jevopi.de) - * @since Mar 30, 2011 - */ -public class Activator extends AbstractUIPlugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.lwjgl.tools"; - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - -} diff --git a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/BuildPathSupport.java b/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/BuildPathSupport.java deleted file mode 100644 index e7021350..00000000 --- a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/BuildPathSupport.java +++ /dev/null @@ -1,269 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.tools; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.logging.Logger; - -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jdt.core.IAccessRule; -import org.eclipse.jdt.core.IClasspathAttribute; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.launching.JavaRuntime; -import org.lwjgl.LibraryPathUtil; -import org.lwjgl.OSNotSupportedException; -import org.osgi.framework.Bundle; -import org.osgi.framework.Constants; - -/** - * This class resolves the actual LWJGL library path, that is the location - * of the jars in the org.lwjgl plugin. - * - * Following the "monkey sees, monkey does"-rule, this code was copied and - * modified from the plugin org.eclipse.jdt.junit . This code is published - * under the EPL and (c) by IBM and others. - * - * @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport - * @see org.eclipse.jdt.internal.junit.buildpath.BuildPathSupport - */ -public class BuildPathSupport { - /** - * Logger for this class - */ - private static final Logger log = Logger.getLogger(BuildPathSupport.class.getName()); - - public static class LWJGLPluginDescription { - private final String strBundleId; - - private Bundle bundle = null; - - public LWJGLPluginDescription(String bundleId) { - strBundleId = bundleId; - - } - - public Bundle getBundle() { - if (bundle == null) - bundle = Platform.getBundle(strBundleId); - return bundle; - } - - public String getBundleId() { - return strBundleId; - } - - } - - public static final LWJGLPluginDescription LWJGL_PLUGIN = new LWJGLPluginDescription( - "org.lwjgl"); //$NON-NLS-1$ - - public static final LWJGLPluginDescription LWJGL_SRC_PLUGIN = new LWJGLPluginDescription( - "org.lwjgl.source"); //$NON-NLS-1$ - - public static final LWJGLPluginDescription LWJGL_DOC_PLUGIN = new LWJGLPluginDescription( - "org.lwjgl.doc"); //$NON-NLS-1$ - - public static final String[] JAR_FILES = { "lwjgl.jar", "lwjgl_util.jar", - "lwjgl_util_applet.jar", "jinput.jar" }; - - public static final String[] SRC_FILES = { "lwjglsrc.zip", - "lwjgl_utilsrc.zip", "lwjgl_util_applet.zip", null }; - - public static final String[] DOC_FILES = { "doc.zip", "doc.zip", "doc.zip", - "doc.zip" }; - - public static String[] NATIVEPATH = new String[] { "windows", "macosx", - "linux", "solaris" }; - - - - public static IPath getBundleLocation(LWJGLPluginDescription pluginDesc) { - Bundle bundle = pluginDesc.getBundle(); - if (bundle == null) - return null; - - URL local = null; - try { - local = FileLocator.toFileURL(bundle.getEntry("/")); //$NON-NLS-1$ - } catch (IOException e) { - return null; - } - String fullPath = new File(local.getPath()).getAbsolutePath(); - return Path.fromOSString(fullPath); - } - - - - /** - * - * /Devel/Applications/Eclipse3.4/plugins/org.lwjgl.source_2.0.1/src/org.lwjgl_2.0.1/lwjglsrc.zip - * /Devel/Applications/Eclipse3.4/plugins/org.lwjgl.source_2.0.1/src/org.lwjgl_2.0.1/lwjgl_utilsrc.zip - * /Devel/Applications/Eclipse3.4/plugins/org.lwjgl.source_2.0.1/src/org.lwjgl_2.0.1/lwjgl_util_applet.zip - * - * - * @param pluginDesc - * @return - */ - public static IPath getSourceLocation(String filename) { - if (filename==null) - return null; - Bundle bundleSrc = LWJGL_SRC_PLUGIN.getBundle(); - if (bundleSrc == null) - return null; - - String version = (String) bundleSrc.getHeaders().get( - Constants.BUNDLE_VERSION); - if (version == null) { - return null; - } - - String bundlePath = getURL(bundleSrc); - if (bundlePath == null) { - return null; - } - - File bundleLoc = new File(bundlePath); - if (bundleLoc.isDirectory()) { - String fullPath = bundleLoc.getAbsolutePath() + File.separator - + "src" + File.separator + LWJGL_PLUGIN.getBundleId() + '_' - + version + File.separator + filename; - return Path.fromOSString(fullPath); - } else if (bundleLoc.isFile()) { - return Path.fromOSString(bundleLoc.getAbsolutePath()); - } - - return null; - } - - /** - * jar:file:/Devel/Applications/Eclipse3.4/plugins/org.lwjgl.doc_2.0.1/doc.zip!/javadoc - * - * @param pluginDesc - * @param filename - * @return - */ - public static String getJavadocLocation(String filename) { - if (filename==null) - return null; - - Bundle bundleDoc = LWJGL_DOC_PLUGIN.getBundle(); - if (bundleDoc == null) - return null; - - String version = (String) bundleDoc.getHeaders().get( - Constants.BUNDLE_VERSION); - if (version == null) { - return null; - } - - String bundlePath = getURL(bundleDoc); - if (bundlePath == null) { - return null; - } - - File bundleLoc = new File(bundlePath); - if (bundleLoc.isDirectory()) { - String fullPath = "jar:file:" + bundleLoc.getAbsolutePath() - + File.separator + filename + "!" - + File.separator + "javadoc" + File.separator; - return fullPath; - } else if (bundleLoc.isFile()) { - return bundleLoc.getAbsolutePath(); - } - - return null; - } - - public static String getNativeLocation() { - - String basePath; - try { - basePath = LibraryPathUtil.getRelativeLWJGLLibraryPath(); - } catch (OSNotSupportedException ex) { - log.warning(ex.toString()); //$NON-NLS-1$ - return null; - } - - Bundle bundle = LWJGL_PLUGIN.getBundle(); - if (bundle == null) - return null; - - String bundlePath = getURL(bundle); - if (bundlePath == null) { - return null; - } - - File bundleLoc = new File(bundlePath); - if (bundleLoc.isDirectory()) { - String fullPath = bundleLoc.getAbsolutePath() - + File.separator + basePath; - return fullPath; - } else if (bundleLoc.isFile()) { - return null; - } - - return null; - } - - private static String getURL(Bundle bundle) { - try { - URL fileURL = FileLocator.toFileURL(bundle.getEntry("/")); //$NON-NLS-1$ - if (fileURL != null) { - return fileURL.getFile(); - } - return null; - } catch (IOException e) { - return null; - } - } - - public static IClasspathEntry getLWJGLClasspathEntry() { - return JavaCore - .newContainerEntry(LWJGLClasspathContainerInitializer.LWJGL_LIBRARY_PATH); - } - - public static IClasspathEntry[] getLWJGLLibraryEntries() { - IPath bundleBase = getBundleLocation(LWJGL_PLUGIN); - if (bundleBase != null) { - IClasspathEntry[] entries = new IClasspathEntry[JAR_FILES.length]; - for (int i = 0; i < JAR_FILES.length; i++) { - IPath jarLocation = bundleBase.append(JAR_FILES[i]); //$NON-NLS-1$ - IPath srcLocation = getSourceLocation(SRC_FILES[i]); - String nativeLocation = getNativeLocation(); - String javadocLocation = getJavadocLocation(DOC_FILES[i]); - IAccessRule[] accessRules = {}; - IClasspathAttribute[] attributes = { // - JavaCore - .newClasspathAttribute( - IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, - javadocLocation), - JavaCore.newClasspathAttribute( - JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY, - nativeLocation) }; - - // return JavaCore.newClasspathAttribute(JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY, dialog.getNativeLibraryPath()); - - entries[i] = JavaCore.newLibraryEntry(jarLocation, srcLocation, - null, accessRules, attributes, false); - } - return entries; - - } - return null; - } -} diff --git a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerInitializer.java b/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerInitializer.java deleted file mode 100644 index 5e95d689..00000000 --- a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerInitializer.java +++ /dev/null @@ -1,233 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.tools; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Status; -import org.eclipse.jdt.core.ClasspathContainerInitializer; -import org.eclipse.jdt.core.IClasspathAttribute; -import org.eclipse.jdt.core.IClasspathContainer; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.IJavaModel; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.launching.JavaRuntime; - -/** - * LWJGLClasspathContainerInitializer sets up LWJGL library path. - * - * Parts of this code were copied and modified from - * {@link org.eclipse.jdt.internal.junit.buildpath.JUnitContainerInitializer}, - * which is licensed under the EPL as well. - * - * @author Jens von Pilgrim - * @version $Revision$ - * @since Dec 5, 2008 - */ -public class LWJGLClasspathContainerInitializer extends - ClasspathContainerInitializer { - - public static String LWJGL_LIBRARY_ID = "org.lwjgl.LWJGL_CONTAINER"; - - public static IPath LWJGL_LIBRARY_PATH = new Path(LWJGL_LIBRARY_ID); - - private static final IStatus NOT_SUPPORTED = new Status(IStatus.ERROR, - Activator.PLUGIN_ID, - ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED, - new String(), null); - - private static class LWJGLClasspathContainer implements IClasspathContainer { - - private final IClasspathEntry[] fEntries; - - private final IPath fPath; - - public LWJGLClasspathContainer(IPath path, IClasspathEntry[] entries) { - fPath = path; - fEntries = entries; - } - - public IClasspathEntry[] getClasspathEntries() { - return fEntries; - } - - public String getDescription() { - return "LWJGL Libraries"; - } - - public int getKind() { - return IClasspathContainer.K_APPLICATION; - } - - public IPath getPath() { - return fPath; - } - - } - - public LWJGLClasspathContainerInitializer() { - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#initialize(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public void initialize(IPath containerPath, IJavaProject project) - throws CoreException { - if (isValidLWJGLContainerPath(containerPath)) { - LWJGLClasspathContainer container = getNewContainer(containerPath); - - JavaCore.setClasspathContainer(containerPath, - new IJavaProject[] { project }, - new IClasspathContainer[] { container }, null); - } - - } - - private static boolean isValidLWJGLContainerPath(IPath path) { - return path != null && path.segmentCount() > 0 - && LWJGL_LIBRARY_ID.equals(path.segment(0)); - } - - private static LWJGLClasspathContainer getNewContainer(IPath containerPath) { - IClasspathEntry[] entries = null; - // String version = containerPath.segment(1); - entries = BuildPathSupport.getLWJGLLibraryEntries(); - - if (entries == null) - entries = new IClasspathEntry[] {}; - - return new LWJGLClasspathContainer(containerPath, entries); - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#canUpdateClasspathContainer(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public boolean canUpdateClasspathContainer(IPath containerPath, - IJavaProject project) { - return true; - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAccessRulesStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public IStatus getAccessRulesStatus(IPath containerPath, - IJavaProject project) { - return NOT_SUPPORTED; - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getSourceAttachmentStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public IStatus getSourceAttachmentStatus(IPath containerPath, - IJavaProject project) { - return Status.OK_STATUS; - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getAttributeStatus(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject, java.lang.String) - */ - public IStatus getAttributeStatus(IPath containerPath, - IJavaProject project, String attributeKey) { - if (attributeKey - .equals(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME)) { - return Status.OK_STATUS; - } - if (attributeKey.equals(JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY)) { - return Status.OK_STATUS; - } - - return NOT_SUPPORTED; - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#requestClasspathContainerUpdate(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathContainer) - */ - public void requestClasspathContainerUpdate(IPath containerPath, - IJavaProject project, IClasspathContainer containerSuggestion) - throws CoreException { - IClasspathEntry[] entries = containerSuggestion.getClasspathEntries(); - if (entries.length == 1 && isValidLWJGLContainerPath(containerPath)) { - // String version = containerPath.segment(1); - - // only modifiable entry in Javadoc location - IClasspathAttribute[] extraAttributes = entries[0] - .getExtraAttributes(); - for (int i = 0; i < extraAttributes.length; i++) { - IClasspathAttribute attrib = extraAttributes[i]; - if (attrib.getName().equals( - IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME)) { - break; - } - } - rebindClasspathEntries(project.getJavaModel(), containerPath); - } - } - - private static void rebindClasspathEntries(IJavaModel model, - IPath containerPath) throws JavaModelException { - List affectedProjects = new ArrayList(); - - IJavaProject[] projects = model.getJavaProjects(); - for (int i = 0; i < projects.length; i++) { - IJavaProject project = projects[i]; - IClasspathEntry[] entries = project.getRawClasspath(); - for (int k = 0; k < entries.length; k++) { - IClasspathEntry curr = entries[k]; - if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER - && containerPath.equals(curr.getPath())) { - affectedProjects.add(project); - } - } - } - if (!affectedProjects.isEmpty()) { - IJavaProject[] affected = (IJavaProject[]) affectedProjects - .toArray(new IJavaProject[affectedProjects.size()]); - IClasspathContainer[] containers = new IClasspathContainer[affected.length]; - for (int i = 0; i < containers.length; i++) { - containers[i] = getNewContainer(containerPath); - } - JavaCore.setClasspathContainer(containerPath, affected, containers, - null); - } - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getDescription(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public String getDescription(IPath containerPath, IJavaProject project) { - return "LWJGL library settings, including required java libraries " - + "(jars) and native libraries."; - } - - /** - * {@inheritDoc} - * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getComparisonID(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject) - */ - public Object getComparisonID(IPath containerPath, IJavaProject project) { - return containerPath; - } - -} diff --git a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerPage.java b/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerPage.java deleted file mode 100644 index 76c850c6..00000000 --- a/eclipse-update/org.lwjgl.tools/src/java/org/lwjgl/tools/LWJGLClasspathContainerPage.java +++ /dev/null @@ -1,279 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl.tools; - -import java.io.StringWriter; -import java.util.Set; -import java.util.TreeSet; - -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jdt.core.IClasspathAttribute; -import org.eclipse.jdt.core.IClasspathContainer; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.internal.ui.JavaPluginImages; -import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; -import org.eclipse.jdt.launching.JavaRuntime; -import org.eclipse.jdt.ui.JavaElementLabels; -import org.eclipse.jdt.ui.wizards.IClasspathContainerPage; -import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension; -import org.eclipse.jdt.ui.wizards.NewElementWizardPage; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; - -/** - * LWJGLClasspathContainerPage - * There should really be more documentation here. - * - * @author Jens von Pilgrim - * @since Dec 5, 2008 - */ -public class LWJGLClasspathContainerPage extends NewElementWizardPage implements - IClasspathContainerPage, IClasspathContainerPageExtension { - - private IClasspathEntry containerEntryResult; - - private Label labelResolvedPath; - - private Label labelResolvedSourcePath; - - private Label labelResolvedDocPath; - - private Label labelNativePath; - - public LWJGLClasspathContainerPage() { - super("LWJGLContainterPage"); //$NON-NLS-1$ - setTitle("LWJGL Library"); - setDescription("Adds LWJGL Java Libraries to build path"); - setImageDescriptor(JavaPluginImages.DESC_WIZBAN_ADD_LIBRARY); - - containerEntryResult = JavaCore - .newContainerEntry(LWJGLClasspathContainerInitializer.LWJGL_LIBRARY_PATH); - } - - public static IJavaProject getPlaceholderProject() { - String name = "####internal"; //$NON-NLS-1$ - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - while (true) { - IProject project = root.getProject(name); - if (!project.exists()) { - return JavaCore.create(project); - } - name += '1'; - } - } - - public boolean finish() { - try { - IJavaProject[] javaProjects = new IJavaProject[] { getPlaceholderProject() }; - IClasspathContainer[] containers = { null }; - JavaCore.setClasspathContainer(containerEntryResult.getPath(), - javaProjects, containers, null); - } catch (JavaModelException e) { - perform(e, getShell(), e.getMessage()); - return false; - } - return true; - } - - public IClasspathEntry getSelection() { - return containerEntryResult; - } - - public void setSelection(IClasspathEntry containerEntry) { - containerEntryResult = containerEntry; - } - - public void createControl(Composite parent) { - - Composite composite = new Composite(parent, SWT.NONE); - composite.setFont(parent.getFont()); - - composite.setLayout(new GridLayout(2, false)); - - createLabel(composite, "Path"); - labelResolvedPath = createPathLabel(composite); - - createLabel(composite, "Source Path"); - labelResolvedSourcePath = createPathLabel(composite); - - createLabel(composite, "JavaDoc Path"); - labelResolvedDocPath = createPathLabel(composite); - - createLabel(composite, "Native Path"); - labelNativePath = createPathLabel(composite); - - - update(); - - setControl(composite); - } - - private void createLabel(Composite parent, String strLabel) { - Label label = new Label(parent, SWT.NONE); - label.setFont(parent.getFont()); - label.setText(strLabel); - label.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false, 1, 1)); - } - - private Label createPathLabel(Composite parent) { - Label label = new Label(parent, SWT.WRAP); - label.setFont(parent.getFont()); - label.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, - true, 1, 1)); - return label; - } - - protected void update() { - - IStatus status = null; - - IClasspathEntry[] libEntries = BuildPathSupport - .getLWJGLLibraryEntries(); - - IPath containerPath = LWJGLClasspathContainerInitializer.LWJGL_LIBRARY_PATH; - containerEntryResult = JavaCore.newContainerEntry(containerPath); - - if (libEntries == null) { - status = new Status(ERROR, Activator.PLUGIN_ID, - "No LWJGL library found"); - } else - - if (labelResolvedPath != null && !labelResolvedPath.isDisposed()) { - // implies all other labels to be created and not yet disposed - if (libEntries != null) { - Set setLines = new TreeSet(); - IPath path; - for (IClasspathEntry entry : libEntries) { - path = entry.getPath(); - if (path != null) { - setLines.add(getPathLabel(path)); - } - } - setLabel(labelResolvedPath, setLines); - - setLines.clear(); - for (IClasspathEntry entry : libEntries) { - path = entry.getSourceAttachmentPath(); - if (path != null) { - setLines.add(getPathLabel(path)); - } - } - setLabel(labelResolvedSourcePath, setLines); - - setLines.clear(); - for (IClasspathEntry entry : libEntries) { - if (entry.getExtraAttributes() != null) { - for (IClasspathAttribute attr : entry - .getExtraAttributes()) { - if (IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME - .equals(attr.getName())) { - setLines.add(attr.getValue()); - break; - } - if (JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY.equals(attr.getName())) { - - } - } - } - } - setLabel(labelResolvedDocPath, setLines); - - setLines.clear(); - for (IClasspathEntry entry : libEntries) { - if (entry.getExtraAttributes() != null) { - for (IClasspathAttribute attr : entry - .getExtraAttributes()) { - if (JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY.equals(attr.getName())) { - setLines.add(attr.getValue()); - } - } - } - } - setLabel(labelNativePath, setLines); - - } else { - labelResolvedPath.setText("not found"); - labelResolvedSourcePath.setText("not found"); - labelResolvedDocPath.setText("not found"); - } - } - if (status != null) - updateStatus(status); - } - - /** - * @param i_labelResolvedDocPath - * @param i_setDocPaths - */ - private void setLabel(Label label, Set lines) { - StringBuffer strb = new StringBuffer(); - for (String str : lines) { - if (strb.length() > 0) { - strb.append("\n"); - } - strb.append(str); - } - label.setText(strb.toString()); - } - - private String getPathLabel(IPath path) { - StringBuffer buf = new StringBuffer(BasicElementLabels - .getResourceName(path.lastSegment())); - buf.append(JavaElementLabels.CONCAT_STRING); - buf.append(BasicElementLabels.getPathLabel(path.removeLastSegments(1), - true)); - return buf.toString(); - } - - /* (non-Javadoc) - * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[]) - */ - public void initialize(IJavaProject project, - IClasspathEntry[] currentEntries) { - } - - protected void perform(CoreException e, Shell shell, String message) { - IStatus status = e.getStatus(); - if (status != null) { - ErrorDialog.openError(shell, "LWJGL Library", message, status); - } else { - - StringWriter msg = new StringWriter(); - if (message != null) { - msg.write(message); - msg.write("\n\n"); //$NON-NLS-1$ - } - if (message == null || message.length() == 0) - msg.write("Unknown error adding LWJGL library"); - else - msg.write(message); - MessageDialog.openError(shell, "LWJGL Library", msg.toString()); - - } - } - -} diff --git a/eclipse-update/org.lwjgl.updatesite/.project b/eclipse-update/org.lwjgl.updatesite/.project deleted file mode 100644 index 62f4a96e..00000000 --- a/eclipse-update/org.lwjgl.updatesite/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - org.lwjgl.updatesite - - - - - - org.eclipse.pde.UpdateSiteBuilder - - - - - - org.eclipse.pde.UpdateSiteNature - - diff --git a/eclipse-update/org.lwjgl.updatesite/about.html b/eclipse-update/org.lwjgl.updatesite/about.html deleted file mode 100644 index 3d880e51..00000000 --- a/eclipse-update/org.lwjgl.updatesite/about.html +++ /dev/null @@ -1,60 +0,0 @@ - - - -About - - - - -

About This Content

-

The Lightweight Java Game Library (LWJGL) is a solution aimed -directly at professional and amateur Java programmers alike to enable commercial quality games to be written in Java. -LWJGL provides developers access to high performance crossplatform -libraries such as OpenGL (Open Graphics Library) and OpenAL (Open Audio Library) -allowing for state of the art 3D games and 3D sound. Additionally LWJGL -provides access to controllers such as Gamepads, Steering wheel and -Joysticks. All in a simple and straight forward API.

-

LWJGL is not meant to make writing games particularly easy; it is -primarily an enabling technology which allows developers to get at -resources that are simply otherwise unavailable or poorly implemented on -the existing Java -platform. We anticipate that the LWJGL will, through evolution and -extension, become the foundation for more complete game libraries and -"game engines" as they have popularly become known, and hide some of the -new evils we have had to expose in the APIs.

-

LWJGL is available under a BSD -license, which means it's open source and freely available at no charge.

-

Please visit us on the Freenode IRC Network: #LWJGL. Do idle -if there is no one to answer any of your questions, we are on different -timezones.

- -

Plugin assembly

-

The plugins were assembled by Jens von Pilgrim (developer@jevopi.de). All files related to this assembly, such as manifest files or plugin descriptors, are copyright under the Eclipse Public License (EPL) and the BSD license

- -

Third party code

- -

IBM

-

The LWJGL Textview contains code copyright under the Eclipse Public License (EPL):
-

-Copyright (c) 2000, 2005 IBM Corporation and others.
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
-
-The source of this code can be found at: -http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet195.java?view=markup&content-type=text%2Fvnd.viewcvs-markup&revision=HEAD -

- -

SGI

-

-LWJGL contains code copyright by SGI. This code is copyright under the SGI FreeB v1.1, see http://oss.sgi.com/projects/FreeB/. Note that this license can be updated to version 2.0. -

- - - - diff --git a/eclipse-update/org.lwjgl.updatesite/index.html b/eclipse-update/org.lwjgl.updatesite/index.html deleted file mode 100644 index 6f89f6e7..00000000 --- a/eclipse-update/org.lwjgl.updatesite/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - -org.lwjgl.updatesite - - - - - - -
- - diff --git a/eclipse-update/org.lwjgl.updatesite/site.xml b/eclipse-update/org.lwjgl.updatesite/site.xml deleted file mode 100644 index ba0306cc..00000000 --- a/eclipse-update/org.lwjgl.updatesite/site.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - Update site for LWJGL and related features and plugins. - - - - - - - - - - Java 3D libraries such as LWJGL. - - - diff --git a/eclipse-update/org.lwjgl.updatesite/site.xml.template b/eclipse-update/org.lwjgl.updatesite/site.xml.template deleted file mode 100644 index 597adecb..00000000 --- a/eclipse-update/org.lwjgl.updatesite/site.xml.template +++ /dev/null @@ -1,17 +0,0 @@ - - - - Update site for LWJGL and related features and plugins. - - - - - - - - - - Java 3D libraries such as LWJGL. - - - diff --git a/eclipse-update/org.lwjgl.updatesite/web/site.css b/eclipse-update/org.lwjgl.updatesite/web/site.css deleted file mode 100644 index 62c6f9ff..00000000 --- a/eclipse-update/org.lwjgl.updatesite/web/site.css +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/eclipse-update/org.lwjgl.updatesite/web/site.xsl b/eclipse-update/org.lwjgl.updatesite/web/site.xsl deleted file mode 100644 index bdb7ce81..00000000 --- a/eclipse-update/org.lwjgl.updatesite/web/site.xsl +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - org.lwjgl.updatesite - - - -

org.lwjgl.updatesite

-

- - - - - - - - - - - - - - - - dark-row - - - light-row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dark-row - - - light-row - - - - - - - - - - - - - - - dark-row - - - light-row - - - - - - - - -
- - - -
- - - -
-
- ( - ) -
-
- - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - -
Operating Systems:
Windows Systems:
Languages:
Architecture:
-


- Uncategorized -
- - - -
-
- ( - ) -
-
- - - - -
-

-
- - - - - - - - - - - - - - - - - - - - - -
Operating Systems:
Windows Systems:
Languages:
Architecture:
-
- - - -
-
- ( - ) -
-
- - - - -
-

-
- - - - - - - - - - - - - - - - - - - - - -
Operating Systems:
Windows Systems:
Languages:
Architecture:
-
- - -
-
-
diff --git a/eclipse-update/org.lwjgl/.classpath b/eclipse-update/org.lwjgl/.classpath deleted file mode 100644 index b31fe69b..00000000 --- a/eclipse-update/org.lwjgl/.classpath +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/eclipse-update/org.lwjgl/.project b/eclipse-update/org.lwjgl/.project deleted file mode 100644 index 3ddc24b6..00000000 --- a/eclipse-update/org.lwjgl/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.lwjgl - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/eclipse-update/org.lwjgl/.settings/org.eclipse.jdt.core.prefs b/eclipse-update/org.lwjgl/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 311cf837..00000000 --- a/eclipse-update/org.lwjgl/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Tue Nov 23 14:49:20 CET 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/eclipse-update/org.lwjgl/AppleJavaExtensions.jar b/eclipse-update/org.lwjgl/AppleJavaExtensions.jar deleted file mode 100644 index 160d62b6..00000000 Binary files a/eclipse-update/org.lwjgl/AppleJavaExtensions.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/META-INF/MANIFEST.MF b/eclipse-update/org.lwjgl/META-INF/MANIFEST.MF deleted file mode 100644 index 982ee914..00000000 --- a/eclipse-update/org.lwjgl/META-INF/MANIFEST.MF +++ /dev/null @@ -1,38 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: LWJGL Lightweight Java Game Library -Bundle-SymbolicName: org.lwjgl -Bundle-Version: 2.0.0 -Bundle-Vendor: Lightweight Java Game Library Project -Bundle-Activator: org.lwjgl.Activator -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime -Bundle-ActivationPolicy: lazy -Export-Package: LZMA, - com.apple.eawt, - com.apple.eio, - net.java.games.input, - net.java.games.util, - net.java.games.util.plugins, - org.lwjgl, - org.lwjgl.input, - org.lwjgl.openal, - org.lwjgl.opencl, - org.lwjgl.opencl.api, - org.lwjgl.opengl, - org.lwjgl.util, - org.lwjgl.util.applet, - org.lwjgl.util.glu, - org.lwjgl.util.glu.tessellation, - org.lwjgl.util.input, - org.lwjgl.util.jinput, - org.lwjgl.util.vector -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Bundle-ClassPath: ., - lwjgl.jar, - lwjgl_util.jar, - lwjgl_util_applet.jar, - lwjgl_test.jar, - AppleJavaExtensions.jar, - jinput.jar, - lzma.jar diff --git a/eclipse-update/org.lwjgl/build.properties b/eclipse-update/org.lwjgl/build.properties deleted file mode 100644 index fa12c573..00000000 --- a/eclipse-update/org.lwjgl/build.properties +++ /dev/null @@ -1,11 +0,0 @@ -source.. = src/java/ -output.. = build/classes/ -bin.includes = META-INF/,\ - .,\ - lzma.jar,\ - jinput.jar,\ - lwjgl.jar,\ - lwjgl_test.jar,\ - lwjgl_util.jar,\ - lwjgl_util_applet.jar,\ - native/ diff --git a/eclipse-update/org.lwjgl/jinput.jar b/eclipse-update/org.lwjgl/jinput.jar deleted file mode 100644 index 7c2b6b06..00000000 Binary files a/eclipse-update/org.lwjgl/jinput.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/lwjgl.jar b/eclipse-update/org.lwjgl/lwjgl.jar deleted file mode 100644 index 46a7092f..00000000 Binary files a/eclipse-update/org.lwjgl/lwjgl.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/lwjgl_test.jar b/eclipse-update/org.lwjgl/lwjgl_test.jar deleted file mode 100644 index b9d83ce3..00000000 Binary files a/eclipse-update/org.lwjgl/lwjgl_test.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/lwjgl_util.jar b/eclipse-update/org.lwjgl/lwjgl_util.jar deleted file mode 100644 index 6e7c7586..00000000 Binary files a/eclipse-update/org.lwjgl/lwjgl_util.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/lwjgl_util_applet.jar b/eclipse-update/org.lwjgl/lwjgl_util_applet.jar deleted file mode 100644 index 1eee7f97..00000000 Binary files a/eclipse-update/org.lwjgl/lwjgl_util_applet.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/lzma.jar b/eclipse-update/org.lwjgl/lzma.jar deleted file mode 100644 index a2572d37..00000000 Binary files a/eclipse-update/org.lwjgl/lzma.jar and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/libjinput-linux.so b/eclipse-update/org.lwjgl/native/linux/libjinput-linux.so deleted file mode 100644 index 3cdc4397..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/libjinput-linux.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/libjinput-linux64.so b/eclipse-update/org.lwjgl/native/linux/libjinput-linux64.so deleted file mode 100644 index de1ee5f3..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/libjinput-linux64.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/liblwjgl.so b/eclipse-update/org.lwjgl/native/linux/liblwjgl.so deleted file mode 100644 index 011a17f4..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/liblwjgl.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/liblwjgl64.so b/eclipse-update/org.lwjgl/native/linux/liblwjgl64.so deleted file mode 100644 index 2f02f6ea..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/liblwjgl64.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/libopenal.so b/eclipse-update/org.lwjgl/native/linux/libopenal.so deleted file mode 100644 index 8ddc5fed..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/libopenal.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/linux/libopenal64.so b/eclipse-update/org.lwjgl/native/linux/libopenal64.so deleted file mode 100644 index 9d74310b..00000000 Binary files a/eclipse-update/org.lwjgl/native/linux/libopenal64.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/macosx/libjinput-osx.jnilib b/eclipse-update/org.lwjgl/native/macosx/libjinput-osx.jnilib deleted file mode 100644 index 59a3eab5..00000000 Binary files a/eclipse-update/org.lwjgl/native/macosx/libjinput-osx.jnilib and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/macosx/liblwjgl.jnilib b/eclipse-update/org.lwjgl/native/macosx/liblwjgl.jnilib deleted file mode 100644 index 484c849d..00000000 Binary files a/eclipse-update/org.lwjgl/native/macosx/liblwjgl.jnilib and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/macosx/openal.dylib b/eclipse-update/org.lwjgl/native/macosx/openal.dylib deleted file mode 100644 index cb8e4584..00000000 Binary files a/eclipse-update/org.lwjgl/native/macosx/openal.dylib and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/solaris/liblwjgl.so b/eclipse-update/org.lwjgl/native/solaris/liblwjgl.so deleted file mode 100644 index abbd345c..00000000 Binary files a/eclipse-update/org.lwjgl/native/solaris/liblwjgl.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/solaris/liblwjgl64.so b/eclipse-update/org.lwjgl/native/solaris/liblwjgl64.so deleted file mode 100644 index 237933ae..00000000 Binary files a/eclipse-update/org.lwjgl/native/solaris/liblwjgl64.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/solaris/libopenal.so b/eclipse-update/org.lwjgl/native/solaris/libopenal.so deleted file mode 100644 index 71efee2a..00000000 Binary files a/eclipse-update/org.lwjgl/native/solaris/libopenal.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/solaris/libopenal64.so b/eclipse-update/org.lwjgl/native/solaris/libopenal64.so deleted file mode 100644 index d211b09b..00000000 Binary files a/eclipse-update/org.lwjgl/native/solaris/libopenal64.so and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/OpenAL32.dll b/eclipse-update/org.lwjgl/native/windows/OpenAL32.dll deleted file mode 100644 index 42d88769..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/OpenAL32.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/OpenAL64.dll b/eclipse-update/org.lwjgl/native/windows/OpenAL64.dll deleted file mode 100644 index dda83c57..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/OpenAL64.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/jinput-dx8.dll b/eclipse-update/org.lwjgl/native/windows/jinput-dx8.dll deleted file mode 100644 index e65ccd92..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/jinput-dx8.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/jinput-dx8_64.dll b/eclipse-update/org.lwjgl/native/windows/jinput-dx8_64.dll deleted file mode 100644 index 67305896..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/jinput-dx8_64.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/jinput-raw.dll b/eclipse-update/org.lwjgl/native/windows/jinput-raw.dll deleted file mode 100644 index e0f98495..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/jinput-raw.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/jinput-raw_64.dll b/eclipse-update/org.lwjgl/native/windows/jinput-raw_64.dll deleted file mode 100644 index 3d2b3ada..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/jinput-raw_64.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/lwjgl.dll b/eclipse-update/org.lwjgl/native/windows/lwjgl.dll deleted file mode 100644 index d0dfbd57..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/lwjgl.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/native/windows/lwjgl64.dll b/eclipse-update/org.lwjgl/native/windows/lwjgl64.dll deleted file mode 100644 index 413fe831..00000000 Binary files a/eclipse-update/org.lwjgl/native/windows/lwjgl64.dll and /dev/null differ diff --git a/eclipse-update/org.lwjgl/src/java/org/lwjgl/Activator.java b/eclipse-update/org.lwjgl/src/java/org/lwjgl/Activator.java deleted file mode 100644 index 8da72e93..00000000 --- a/eclipse-update/org.lwjgl/src/java/org/lwjgl/Activator.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl; - -import org.eclipse.core.runtime.Plugin; -import org.eclipse.core.runtime.Status; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; - -/** - * The activator class controls the plug-in life cycle. - * - * @author Jens von Pilgrim (developer@jevopi.de) - * @since Mar 30, 2011 - */ -public class Activator extends Plugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.lwjgl"; - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - - super.start(context); - - try { - String path = LibraryPathUtil.getLWJGLLibraryPath(context); - Status status = new Status(Status.INFO, PLUGIN_ID, Status.INFO, - "Set org.lwjgl.librarypath to " + path, null); - getLog().log(status); - - } catch (Throwable ex) { - Status status = new Status(Status.ERROR, PLUGIN_ID, Status.ERROR, - "Error setting native LWJGL libraries path: " + ex.toString(), ex); - getLog().log(status); - throw new BundleException(status.getMessage(), ex); - } - - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - -} diff --git a/eclipse-update/org.lwjgl/src/java/org/lwjgl/LibraryPathUtil.java b/eclipse-update/org.lwjgl/src/java/org/lwjgl/LibraryPathUtil.java deleted file mode 100644 index 893f7fc6..00000000 --- a/eclipse-update/org.lwjgl/src/java/org/lwjgl/LibraryPathUtil.java +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import org.eclipse.core.runtime.FileLocator; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; - -/** - * Helper class for retrieving plugin relative path of native LWJGL - * libraries and setting the path in the system properties. - * - * @author Jens von Pilgrim - * @since Jan 30, 2011 - */ -public class LibraryPathUtil { - - public static final String LWJGL_SYSTEM_PROPERTY = "org.lwjgl.librarypath"; - - public static String[] NATIVEPATH = new String[] { "windows", "macosx", - "linux", "solaris" }; - - /** - * Returns plugin relative path to native libraries according to - * current operating system. - * - * @return - * @throws OSNotSupportedException - */ - public static String getRelativeLWJGLLibraryPath() - throws OSNotSupportedException { - int iOS = -1; - String osname = System.getProperty("os.name").toLowerCase(); - String osarch = System.getProperty("os.arch").toLowerCase(); - - // applied patch by Carlo Salinari: ignore osarch on windows - // see http://lwjgl.org/forum/index.php/topic,3726.0.html - if (osname.startsWith("windows")) { - iOS = 0; - } else if (osname.startsWith("mac")) { - iOS = 1; - } else if (osname.startsWith("linux")) { - iOS = 2; - } else if (osname.startsWith("solaris")) { - iOS = 3; - } - - if (iOS >= 0 && iOS < NATIVEPATH.length) { - String base = "native" + File.separator + NATIVEPATH[iOS]; - return base; - } else { - throw new OSNotSupportedException(osname, osarch); - } - } - - /** - * Returns absolute path of native LWJGL libraries according to - * current operating system, this path is also set as - * system property. - * - * @param context - * @return - * @throws OSNotSupportedException - * @throws IOException - */ - public static String getLWJGLLibraryPath(BundleContext context) - throws OSNotSupportedException, IOException { - String base = getRelativeLWJGLLibraryPath(); - Bundle fragment = context.getBundle(); - - URL url = FileLocator.resolve(fragment.getEntry(base)); - File fileDir = new File(url.getPath()); - String path = fileDir.getPath(); - - System.setProperty(LWJGL_SYSTEM_PROPERTY, path); - return path; - } - -} diff --git a/eclipse-update/org.lwjgl/src/java/org/lwjgl/OSNotSupportedException.java b/eclipse-update/org.lwjgl/src/java/org/lwjgl/OSNotSupportedException.java deleted file mode 100644 index 551dd25e..00000000 --- a/eclipse-update/org.lwjgl/src/java/org/lwjgl/OSNotSupportedException.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 LWJGL Project and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html, and under the terms of the - * BSD license, see http://lwjgl.org/license.php for details. - * - * Contributors: - * Jens von Pilgrim - initial implementation - ******************************************************************************/ -package org.lwjgl; - -/** - * Exception thrown by library loader if operating system is not supported. - * - * @author Jens von Pilgrim (developer@jevopi.de) - * @since Jan 30, 2011 - */ -public class OSNotSupportedException extends Exception { - - String strOSName; - String strOSArch; - /** - * @param i_strOSName - * @param i_strOSArch - */ - public OSNotSupportedException(String i_strOSName, String i_strOSArch) { - super(); - strOSName = i_strOSName; - strOSArch = i_strOSArch; - } - - /** - * {@inheritDoc} - * @see java.lang.Throwable#getMessage() - */ - @Override - public String getMessage() { - return strOSName + " (" + strOSArch + ") not supported by LWJGL."; - } - - /** - * {@inheritDoc} - * @see java.lang.Throwable#toString() - */ - @Override - public String toString() { - return getMessage(); - } - - -} diff --git a/maven/build.xml b/maven/build.xml index 011eb129..2b0b3b7b 100644 --- a/maven/build.xml +++ b/maven/build.xml @@ -80,22 +80,8 @@ - - - - - - - - - - - - - - - -
+ +
@@ -199,37 +185,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + diff --git a/maven/lwjgl_util_applet.pom b/maven/lwjgl_util_applet.pom deleted file mode 100644 index 93017b37..00000000 --- a/maven/lwjgl_util_applet.pom +++ /dev/null @@ -1,19 +0,0 @@ - - 4.0.0 - - org.lwjgl.lwjgl - parent - @VERSION@ - - org.lwjgl.lwjgl - lwjgl_util_applet - jar - Lighweight Java Game Library - @VERSION@ - Lighweight Java Game Library - http://lwjgl.org/ - - http://java-game-lib.svn.sourceforge.net/viewvc/java-game-lib/trunk/ - https://java-game-lib.svn.sourceforge.net/svnroot/java-game-lib - - diff --git a/platform_build/bsd_ant/build.xml b/platform_build/bsd_ant/build.xml index 74224d4f..c49322ba 100644 --- a/platform_build/bsd_ant/build.xml +++ b/platform_build/bsd_ant/build.xml @@ -94,9 +94,9 @@ - - - + + + @@ -129,9 +129,9 @@ - - - + + + diff --git a/platform_build/build-applet.xml b/platform_build/build-applet.xml deleted file mode 100644 index a44ecb92..00000000 --- a/platform_build/build-applet.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/platform_build/build-definitions.xml b/platform_build/build-definitions.xml index 3d20507c..ce34c328 100644 --- a/platform_build/build-definitions.xml +++ b/platform_build/build-definitions.xml @@ -1,37 +1,42 @@ - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - + @@ -41,22 +46,14 @@ - + - - - - - - - - - + @@ -74,7 +71,7 @@ - + @@ -82,23 +79,14 @@ - + - - - - - - - - - @@ -189,13 +177,6 @@ - - - - - - - diff --git a/platform_build/build-generator.xml b/platform_build/build-generator.xml index f113d380..8b433ce1 100644 --- a/platform_build/build-generator.xml +++ b/platform_build/build-generator.xml @@ -1,30 +1,16 @@ - - + - - - - - - - - - - - - - - - - - - - + + + + + + - + @@ -33,7 +19,7 @@ - + @@ -69,17 +55,17 @@ - + - + - + - - + + @@ -91,17 +77,17 @@ - + - + - + - - + + @@ -120,17 +106,17 @@ - + - + - + - - + + @@ -143,17 +129,17 @@ - + - + - + - - + + @@ -167,14 +153,14 @@ - + - + - + @@ -185,14 +171,14 @@ - + - + - + @@ -204,14 +190,14 @@ - + - + - + @@ -230,17 +216,17 @@ - + - + - + - - + + @@ -253,17 +239,17 @@ - + - + - + - - + + @@ -277,14 +263,14 @@ - + - + - + @@ -296,14 +282,14 @@ - + - + - + @@ -322,17 +308,17 @@ - + - + - + - - + + @@ -345,17 +331,17 @@ - + - + - + - - + + @@ -369,14 +355,14 @@ - + - + - + @@ -388,14 +374,14 @@ - + - + - + diff --git a/platform_build/build-maven.xml b/platform_build/build-maven.xml index 6878a2fa..05e7a87b 100644 --- a/platform_build/build-maven.xml +++ b/platform_build/build-maven.xml @@ -1,22 +1,17 @@ - - - + - + - + - + - - - @@ -104,11 +99,10 @@ - + - @@ -121,11 +115,7 @@ - - - - - + @@ -153,18 +143,8 @@ - - - Lightweight Java Game Toolkit]]> - Copyright © 2002-2010 lwjgl.org. All Rights Reserved.]]> - - - - - - @@ -206,6 +186,6 @@ - + diff --git a/platform_build/build-webstart.xml b/platform_build/build-webstart.xml deleted file mode 100644 index cbc1f502..00000000 --- a/platform_build/build-webstart.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/platform_build/linux_ant/build.xml b/platform_build/linux_ant/build.xml index 360c2424..8804a45d 100644 --- a/platform_build/linux_ant/build.xml +++ b/platform_build/linux_ant/build.xml @@ -76,9 +76,9 @@ - - - + + + @@ -108,9 +108,9 @@ - - - + + + diff --git a/platform_build/linux_ant/build_es.xml b/platform_build/linux_ant/build_es.xml index 50e3972a..b50f170f 100644 --- a/platform_build/linux_ant/build_es.xml +++ b/platform_build/linux_ant/build_es.xml @@ -77,9 +77,9 @@ - - - + + + @@ -109,9 +109,9 @@ - - - + + + diff --git a/platform_build/macosx_ant/build.xml b/platform_build/macosx_ant/build.xml index 4a4b0dfa..da69903b 100644 --- a/platform_build/macosx_ant/build.xml +++ b/platform_build/macosx_ant/build.xml @@ -1,8 +1,5 @@ - - - + - @@ -96,27 +93,19 @@ - - - - - - - - - - + + - + - - - - - - - + + + + + + + @@ -127,13 +116,13 @@ - - - + + + - + @@ -156,66 +145,65 @@ - - - - - - - - + + + - - - + + + - - - + + + + + + + - + - + - - - + + + - + - - + + - + - - - + + + - - + + - + - - + + diff --git a/platform_build/mingw_ant/build.xml b/platform_build/mingw_ant/build.xml index ed8db179..7237c6c6 100644 --- a/platform_build/mingw_ant/build.xml +++ b/platform_build/mingw_ant/build.xml @@ -22,9 +22,9 @@ - - - + + + diff --git a/platform_build/windows_ant/build.xml b/platform_build/windows_ant/build.xml index 907ed197..d0f47d69 100644 --- a/platform_build/windows_ant/build.xml +++ b/platform_build/windows_ant/build.xml @@ -18,9 +18,9 @@ - - - + + + diff --git a/platform_build/windows_ant/build_es.xml b/platform_build/windows_ant/build_es.xml index 67c2b985..8c52e19f 100644 --- a/platform_build/windows_ant/build_es.xml +++ b/platform_build/windows_ant/build_es.xml @@ -18,9 +18,9 @@ - - - + + + diff --git a/res/Footsteps.wav b/res/Footsteps.wav deleted file mode 100644 index 074c9366..00000000 Binary files a/res/Footsteps.wav and /dev/null differ diff --git a/res/ILtest.bmp b/res/ILtest.bmp deleted file mode 100644 index a0966d94..00000000 Binary files a/res/ILtest.bmp and /dev/null differ diff --git a/res/ILtest.gif b/res/ILtest.gif deleted file mode 100644 index 749c909e..00000000 Binary files a/res/ILtest.gif and /dev/null differ diff --git a/res/ILtest.jpg b/res/ILtest.jpg deleted file mode 100644 index 08dd27ee..00000000 Binary files a/res/ILtest.jpg and /dev/null differ diff --git a/res/ILtest.tga b/res/ILtest.tga deleted file mode 100644 index ff73305f..00000000 Binary files a/res/ILtest.tga and /dev/null differ diff --git a/res/Missing_you.mod b/res/Missing_you.mod deleted file mode 100644 index a8994fdd..00000000 Binary files a/res/Missing_you.mod and /dev/null differ diff --git a/res/appletlogo.gif b/res/appletlogo.gif deleted file mode 100644 index 283e15e3..00000000 Binary files a/res/appletlogo.gif and /dev/null differ diff --git a/res/appletprogress.gif b/res/appletprogress.gif deleted file mode 100644 index 3ed42c66..00000000 Binary files a/res/appletprogress.gif and /dev/null differ diff --git a/res/ball.png b/res/ball.png deleted file mode 100644 index 53aa8574..00000000 Binary files a/res/ball.png and /dev/null differ diff --git a/res/ball_sm.png b/res/ball_sm.png deleted file mode 100644 index 0c9db45a..00000000 Binary files a/res/ball_sm.png and /dev/null differ diff --git a/res/center.wav b/res/center.wav deleted file mode 100644 index 29e6dded..00000000 Binary files a/res/center.wav and /dev/null differ diff --git a/res/ding.wav b/res/ding.wav deleted file mode 100644 index fdb625aa..00000000 Binary files a/res/ding.wav and /dev/null differ diff --git a/res/left.wav b/res/left.wav deleted file mode 100644 index 87635a59..00000000 Binary files a/res/left.wav and /dev/null differ diff --git a/res/logo/lwjgl_logo-with_jacket.ai b/res/logo/lwjgl_logo-with_jacket.ai deleted file mode 100644 index b41ed089..00000000 --- a/res/logo/lwjgl_logo-with_jacket.ai +++ /dev/null @@ -1,1086 +0,0 @@ -%PDF-1.4 %âãÏÓ -1 0 obj<> endobj 2 0 obj<> endobj 5 0 obj<>/ArtBox[40.3667 286.146 522.334 477.897]/MediaBox[0.0 0.0 612.0 792.0]/Thumb 231 0 R/TrimBox[0.0 0.0 612.0 792.0]/Resources<>/ProcSet[/PDF/Text]/Properties<>/MC1<>/MC2<>/MC3<>>>/ExtGState<>>>/Type/Page/LastModified(D:20050904082821-06'00')>> endobj 214 0 obj<> endobj 215 0 obj<> endobj 216 0 obj<>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 12.0 -%%AI8_CreatorVersion: 12.0.0 -%%For: (Glen Moyes) (Glen Moyes Studios) -%%Title: (lwjgl_logo.ai) -%%CreationDate: 9/4/2005 8:28 AM -%%BoundingBox: 31 281 575 478 -%%HiResBoundingBox: 31.6665 281.667 574.9473 477.897 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 8.0 -%AI12_BuildNumber: 198 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%CMYKCustomColor: 1 1 1 1 ([Registration]) -%AI3_TemplateBox: 306.5 395.5 306.5 395.5 -%AI3_TileBox: 1.00781 0.000061 611.9998 792 -%AI3_DocumentPreview: None -%AI5_ArtSize: 612 792 -%AI5_RulerUnits: 2 -%AI9_ColorModel: 2 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 4 -%AI9_OpenToView: -176 819 1 988 914 18 1 1 8 81 0 0 1 1 1 0 1 -%AI5_OpenViewLayers: 7777 -%%PageOrigin:1 0 -%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 217 0 obj<>stream -%%BoundingBox: 31 281 575 478 -%%HiResBoundingBox: 31.6665 281.667 574.9473 477.897 -%AI7_Thumbnail: 128 48 8 -%%BeginData: 7644 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 -%524C45FD97FFA97E85365A5A8584FD76FF846114140E3614140E3636A9FD -%73FF7E360E140E140E140E140E140E84FD71FFA8AFA9FFA9AFA8AF858514 -%3614361485FD6EFFA8272727522752527D52A8FF840E3614140E85FD6DFF -%5227F8272727F8FD0427FFFF5A0E36143614FD6CFFA852F827F827F827F8 -%27F852A8FFA8140E360E145AFD10FFAF7DA87DA8FFFF7DA87DA8FD0CFF7D -%A87DA8A8FD06FFA87DA87DA8A8FD05FFA87D527D7DA8FD06FF7DA87DA8FD -%1DFF7EFF2727202727272027272752FFFFFF843614361436A9FD0FFF5227 -%20277DFFFF52272727FD0BFF7DFD0427FD07FF5227212752FD04FFA85227 -%F8272127F87DFD04FF5227F82752FD1CFF5A847D27F827F827F827F827F8 -%7DFD04FF143614360E85FD0EFFA827F82727FFFFFF2727F852FD0BFF52F8 -%27F87DFD06FFA827F827F87DFFFFFF7DF827F8272727F827F87DFFFFA827 -%F827F8A8FD1BFFA814A97DF8272727F8272727F827A8FD04FF5A14361414 -%36FD0EFFA8F827277DFFFFFF27F82752FD0AFFA82727F827A9FD06FFA820 -%27F827A8FFFFA82027F8277DFF52FD0427FFFFA8F8272027A8FD1BFF5A0E -%FF2727F827F827F827F82727FD05FF36140E360E14A8FD0DFF5227F8277D -%FFFFFF2727F852FD0AFF5227F82752FD07FF5227F82727FFFFA8F827F827 -%7DFFFF7DF827F828A8FF5227F82752FD1BFFA90E61A92720272727202727 -%27207DFD04FFA9361436143614A9FD0DFF27202727FFFFFFA827202753FD -%09FFA827272720FD08FF522127F87DFFFF5227272752FFFFFF5227272752 -%FFFF52F827217DFD1BFF36145AA8F827F827F827F827F8277DFD04FF850E -%360E3614145AFD0CFFA8F827F852FFFFFFA8F827F87DFD09FF7DF827F852 -%FD07FFA8F827F827A8FFA827F827F8A8FFFFFF27F827F87DFFA8F827F827 -%A8FD1AFF841414A952272727F8272727F82727A9FD04FF5A361436143614 -%85FD0CFF522727277DFFFFFFA82727277DFD09FF2727F8277EFD07FF7D27 -%F82752FFFF7D2027F852FFFFFFA82027F827A8FF59FD0427FD16FF7D7DA8 -%FFFFA95A5AA97DF827F827F827F827F852FD04FFA9360E360E140E145AFD -%0BFFA827F82727FD04FFA8F827F87DFD08FF7D27F82727FD08FF52F827F8 -%7DFFFFF827F8277DFFFFFF5927272752FFFF52F827F87DFD15FF7E272027 -%527D7EFFFFFFA87D522720272727202752FD04FFAF1436143614361461FD -%0BFFA820272752FD04FF7D2727277DFD08FF52272720A8FD08FF2127F827 -%A8FF7DFD0427FD0AFFA8F8272727A8FD15FF7DF827F827F827277DFD04FF -%A8A852522727F8A8FD04FF7E140E3614360E145AFD0BFF5227F8277DFD04 -%FF7DF827F87DFD07FFA8F827F827A8FD07FF5927F82727FFFF52F827F852 -%FD0AFF7D27F82727FD16FFFD0427F8272727F8FFFFFF7DA8FD04FFA8A8FD -%05FF611436143614361461FD0BFF522727F8FD05FF7D27F827A8FFFD04A8 -%FFFF5227F82753FD08FF52F827207DFFFF2727F8277DFD0AFF522027F87D -%FD15FFA827F827F827F827F827A8FF2727F827527DA8FD06FFAF0D140E14 -%0E360E145AFD0AFFA8F827F852FD05FF7DF827F8A8FF28F827F8A8A827F8 -%27F8A8FD08FFF827F8277DFF7D27F827F8FFFFFFFD05A8FFFFA8F827F827 -%7DFD15FFA8202727272027272752FFA827202727272027277D7DFFFFFFA9 -%A98585363614140E85FD0AFF7D2727277DFD05FF7D272027AF7D20272727 -%A8A827272053FD08FF7D27202727FFFF7D2127F852FFFF52272127F827A8 -%FF7DFD0427FD16FF5227F827F827F827F87DFFA8F827F827F827F827F827 -%52FD07FFA8A95A367EFD0AFF52F827F8A8FD05FF7DF82727A82727F827F8 -%A82727F8277DFF7D7D7D7EA8FFFF52F827F87DFFFF2727F82752FFA827F8 -%27F82727FFFF52F827F852FD16FF522727F8272727F827A8FF52272727F8 -%272727F8272752FFFFFF7D527DA8FD0FFF2727F852FD06FF52FD0727F827 -%5227F82727FFA8272027F8FFFFFF272721277DFFFF27F82720A8FFFFA853 -%F827207DFFFF2727F8277DFD15FFA9F827F827F827F827F8FFFF52F827F8 -%27F827F827F82752FFFF7DF827F82727527DA8FD0AFF5327F82752FD06FF -%52F827F827F827F827F827F827F87DFF7DF827F852FFFF7D27F82727FFFF -%A8F827F827A8FFFFFF2727F8277DFF7D27F827F8A8FD15FFA82727272027 -%27272052FFFFFD0427202727272027277DFFFF5227202727272027275252 -%A8FD07FF52272720A8FD06FF5227272720272727202727272027FFFF5227 -%27277DFFFF7DF827217DFFFFA827F82727FFFFFFA827F82727FFFF7D2127 -%F852FD17FF5227F827F827F82752FF7D27F827F827F827F827F827A8FFA8 -%27F827F827F827F827F827F8A8FD05FFA8F827F827FD07FF52F827F827F8 -%7D5227F827F82752FFA827F827F8A8FFFF2727F8277DFFFFA8F827F827FF -%FFFF7DF827F87DFFFF2727F82752FD18FFA87D2727F82727A8FF7D2727F8 -%272727F8FD0427FFFFA8F8272727F8272727F827272752FD05FF7D27F827 -%7DFD07FF2727F8272752FF7D2727F82727A8FFA82027F827FFFF7DFD0427 -%FFFFFF7E27202727FFFFA8202721277DFF7D27F82720A8FD1BFF5227F827 -%A8FF2727F827F827F827F827F852FFFF5327F827F827F827F827F827F87D -%FD05FF52F827F8FD047DA87DA8A827F827F827A8FF5227F827F852FFFFA8 -%27F827F87D7D27F827F87DFFFFFFA8F827F827527D2727F82727FFFF59F8 -%27F8277D7E7D7E7D7D7DA8FD15FFA87D7DFFA82727272027272720272727 -%7DFFFF52202727272027272720272727A8FD05FF27272027272720272727 -%7DFF2727202753FFFF7D27272027A8FFFFFF5227F8272127F8272152FD05 -%FF7D21272127212721272153FFFF272720272727F8272127F8277DFD1AFF -%2727F827F827F827F827F8A8FFFF2727F827F827F827F827F82727FD05FF -%7D27F827F827F827F827F8FFA827F82727FFFFFF5227F82727FD05FF5227 -%F827F827277DFD06FFA852F827F827F827F8277DFF7D27F827F827F827F8 -%27F827F8FD1BFFA8FD0427F8272727F827FFFF7E272727F8272727F82727 -%27F87DFD06FFFD09A8A9FFFFA8A8A8FD05FFA8A8A8FD07FFA8A87DA8A8FD -%0AFFA87DA8A8A9A8A8A8FFFFFF84FD0BA8FD1DFF7D52F827F827F82727FF -%FF7DF827F827F827F827F827F8277DFD61FF6184FD06FFA852272727207D -%FFFF52272727202727272027272720A8FD06FFA8FD0FFFA8FFFFFFA8FD21 -%FFAFFD24FF5A145AAFFD06FFA87D2127A8FFA827F827F827F827F827F827 -%F827A8FFFFFFA87DFFA87DFFFFFF52FFA9FD08FF7DFFFFA852FFFFA8FFFF -%7DA9FD09FF7D7D7DFD0BFF7DFF7E7D52FD23FFAF14141485FD08FFA8FFFF -%FF2727F8272727F8272727F82752FD04FFA852FF7DFF7D847D527D5252A8 -%7DA87D7D7EFF7D847DA827A87D4BFFFF52A87DA87DA87DA87DFFA8527DA8 -%A8FD057DA8AF7DFF8452FFA87D527D7D7DA97DA87D7D7DA884FD19FF5A0E -%140D367EFD09FFA827F827F827F827F827F827F87DFD04FF527DA8525252 -%277D522727A8FD0427F87D5227FD0752FF7DFD055227525252FF527D7D52 -%7D27272752287D2727A87D7DFF52525227277DFD04527D5227A8FD19FF85 -%141436141436A9FD08FFA85220272727202727272027A8FD04FF52527D7D -%7D277D7D7E527DA852527D7D52A87D5252597D7D7D53A8A8537D5252FF27 -%A87D527DFF7E5252845252527E7D7D84527DFF527D527D7D7D527EA85252 -%7D7DFF2784FD1BFF5A140E3614140E5AA8FD08FFA82827F827F827F82727 -%FD05FFA8A8A8FF5252A8FFFFFFA8FD05FFA8FFA87D27A8AFFFFFFFA8FFA8 -%FFA8FD05FFA8FFFFFFA8FFFFFFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFFF -%FFA8FFA8FF7D7DFD1DFF3614143614360E365AFD09FF84592727F8272752 -%FD18FFA8FD2EFFA8FD1FFF36140E360E360E141484A8FD08FFA85227F827 -%7DFD68FF5A361436143614360E3784FD09FFA87D7DFD6AFF845A14140E14 -%14365AA9FD79FFA9AFA8AFFDFCFFFDFCFFFDF0FFFF -%%EndData - -endstream endobj 218 0 obj<>stream -%AI12_CompressedDataxœì½ks%·‘ ú½#ú?ð~˜;vÅ.< ð˜òœÕ m9lywbCAuSR¯ùв»åÕþú›o ªpH¶š{l²ìO$‰|ãïþŸßþþ³£7·__~§ƒ—/þîïvw—ïoï~u@àƒÏ¯®>¼{‡ _üî—ÎNØêèóò•´ü—Ë»wooo~Eã¿žá÷ñW—7¿¾ýñòÝ/û¿ÿáÍÛÛw¿Ä–_¾}u m¯þô¿¾½úêêöÛÛË·¿´q@¿'ï¡A}_ùiJåW¾ý[ß~¸yóöæÛãÛÿó«ƒà|qiNq.øçÿñöw—ïVmsÎ Â/34Ž‡5ξ1–:ã·Nn_¸¾¼yÿÛ»Û×—ïÞín¯nïÞýê`÷ã ÿâ[øËÅÁ¿_^]ÝþéàøêâõûïœÝÞ¼‡¶Gwo/®>ûüýÅÕÛ׿þü·ƒ_ÿÀ7Ÿß^½á?ôßûÍåå›Ë7ùí£ÏÓWgo¯.××ï -aþèsç¿:þðöêÍo>\} «àj!xøŠ¦ò‡w0˜þNðù«Ï¯ôûË÷ïMð~ZÀݯÿýŸw°î·×Ôº‘çÿñ»ËoßAÀÚüÏ_Jß_^^ Åhžòa:5á¿íwm -c¦fîpšfX2 øÉî ;wXk-sõÒ¸­Æåo/ÿô«ƒßÜÞ\ÊäîÞÿþíÿ…Édçí+é«ß}¸º¼ûÃÍ[Ä%Ã*Oý×·o.¯F_?»º ÓãÚ¿ÒâË‹»o/ßÝ^}xO^&ý ÷üâÇK$(/ùâûË›/oÿ…†ù™›óAqú«¥T\!–ƒ¢orô6'=â×ñËÚí ?¸¿…Õùâîí·oo~ådhóWÿx÷öM[²ÙC·ôu}XºÿWý¿Œæüþý%îV%—ݯ»ÅŸý{|ëéÍ›Ýí5¢þm5XôØ°Aå¯íý ºøðýËÿñòE¨¯þ÷‡Û÷—ï Ç«Ëƒš_}{wñÃ%p‡òêôÃÝí S×âë‹w—¯¾åy{ÃÐ7_3 öØÛïß½…׿zsñí·—wòøû«×oï€.¾¹ºü?¯¾¿¼{ÿÝí‡w7o^ýþõÅÝíÍ«oþ©ï«ËoÞ¿úâôÀÅÄ}#ú£ß¥ß½·WRSýÀúú@ß¿º¼ysñî»W—×ôŸ÷°µ._ù¿¹¼¾¸ƒÝÿêÝê¥üåÛËWonµ½{÷öÀ¥úêßß¼½¼ƒ¿;xõîû‹×€Ž_½þpwwyóúGø_}}wûÇË›¯/`[º\^iûW¯o¿ÿQú¼{óÍåõÛ›·7ðõÙ¿ü¿}}qusûþÕw?~ÿÝåÍ«;Ú›ðÅ7¯®/^ã°­°H¯¾&ßüðîÕû?ݾûH{{{÷êýww——öéâõ‡÷—¯®?¥†W{óÖŸz{}ùæíÕÕôûϾº¾x÷úèüãÿþpqßÁ_¿»¸ú†ß!ÀwÀü«#¢èêˆßxÔ­æã÷Èf„xutúj'CxuJ_uJ_†^N»¯ŸÚ÷>çVŸó+>ïÚ|nmNß÷ê7ôBèæ þÂü…/º/|Ácú¾wýáêýÛï¯~|õÅ»+¤‰?è„þÀ_þC÷å?Ø·þÿøåw·w@-—À´o€ÔÞ½ºà_è|.ºo_ð«/¬“ BÇÅå«×ŠŽKþú%÷~Ù¾ ]]Ú÷Þr«·Üêm÷Š·ÖæÐqÃ/¼åæ·:¦Ûî ·Òľ÷æíoÀÈøÀ_ýÀoú°ÏûÎüç÷„ŒüòÅ—§Ì Ó?}õå;àüÃ_£9½y}‹ú¯¾Zž”›ƒó?^­Z¼Z}ùþ—ÿßKêxšö}ðå݇Ë/üþò#³9¢G‡6 i}µý&£‘LÖFÆ£ø -†õ[ Œ÷´×ó=ý­|õÛ«ðǼ»ýðýç7ßܾ|ñ –è~{ñþ;]€¯¡\Æ0þxÀ_èùÛòØ÷¿| Ë/ï€jax_|ý¿._¿‡ï  ýöûoß_>¦«ßâñtwóÅ óîûï¾¼½½²¡Jù“ŽsþÎ_ÌK¬ñèðÇ¿ÜÎwpöÂ>þþ; ÆAÿƒ¿Û‹ö|÷1¯…ã±>zãòOö²í7þ2ÞƒˆþæíÍø -~ÃÜíõ÷¨‘üþ»‹ïŒ-Ϻ–ÿÉå7 ówkKÐÓ›.¯n¿¿lpƒÀIsð¯wß? -9?^}{õöÝuÃI±ßÓˆšwÝpè#ü÷üï£véÕÅÍÅÝýÁFCœé·ÀíVÜŠ`­Û„|³çŒŸ}v?Ïtáàø¦oòwxîÞ¼í”4½ÿ~ð¯ßÁ -üÀWð–!·?8~C¢ðß¿|qvvvzvr¶;;>;:«gål>Ëgé,ž…3æΦӳÓÓÓ“ÓÝéñéÑi=-§ói>M§ñ4œúSw:œœžœœìNŽOŽNê èr'óI>I'ñ$œøw2íÎv§»“Ýnw¼;ÚÕ]ÙÍ»¼K»¸ ;¿s»éøìøôøäxw|||t\Ëñ|œÓq<Çþ؃Fqtvtztr´;:>::ªGåh>ÊGé(…#䎦zVOëIÝÕãz„úYk®©Æª¯®N嬜–“²+Ç娀ºóòE™K.©Ä -èÚešÏæÓùdÞÍÇóÑ\çªMžAûžÃìg7Où,Ÿæ“¼ËÇù(×\òŒzzŽ9dŸ]†1¦³tšNÒ.§£TS=?§”b -É'—¦xOãIÜÅãxk,qŽ9¦cˆ>º8…³pNÂ.‡£PŒ1Ì!‡bÁÐIü™?õ'~çý‘¯¾øÙgŸ|ôÁ{ïüäÎÜ©;q;wìŽ\uÅÍ.»ä¢ Î;ç`Œ,ç 2O€´ ¦=å †6Aç“CÕñ ÑÁß}u|Gä1™æ™ð?GÕë«øø¶t ‚žVm»?`ë㓶”ˆ÷öîö{å‘–å7èmîÈŽhgÄ#êùˆ~\\\\\\ -Z Z\\\\\˜£—/`qpypp‰x‘p™p¡p©`±h¹pÁpÉpÑpÙxá`éà™iñpù,d¤EÄeÄ…„¥¤ÅäåÄÅ%ÅEÅeÅ…Å¥ÅÅÅåÅæ%ÆE†eö°L°Ô¸Ø¸Ü¸à¸ä¸è¸ì¸ð¼ô¸ø¸üHHHŽ–ð&e¹U–›Å¶ m–~»,7 m™—/lÓ,·Írã,·ŽlÙ:ËÍ3ÃÚöh¹…–›h¹úD[I7­D¿™–Ûi¹¡–[j§xC†ô”ìX‘bø‰ØÑËNŸ„¡É¤añãØ‘âè¯=ëŸiù£Z>§«úFÖ?»Ís¼zŽVO]>ÐcY=óêÉ«'­ž¸| Gd­ËǯžÍÔù‡ðæ„þæðQß<®{`*Ð#OéÌžSyNäÙÑsLÏ=Uv0ÒÛL4‡T‡tÐïhÜÓŽÐs†Th;g÷ˆgýsdO•§ÈüY?²…cbÄÈN‘%Ò²ŸÑ~Å‹{–w-î[Þ¹ºwa÷‚ á»l{XgâÍø)›gîEh’‡Ž<6 G‘<‰IŽˆøŒžS˜XdB¡ Å&œXtRáIÅ' 'G#!Jg@\®=2ÙµÚ¹e'ý<:½Öû¸PmClŒC D‡Høƒô‰”Z‰r‘Hšq!ÆψúñU8IØ1ݹx È>ÕiØ„Š@‰¶À 4SzŽaQžN΀Æà8õ%xÑ Ø¯° -øÓŸÜfÙbëvz|ìÊÁjX×Ãœaµ`åw@§»3  4€jL`úª_Eü ža '…G4âñzLxFŒ#îahE­®®®%¢pöeg`EÈ•ðKȽ¯!§CÄ# - ñN䦸Õë"#‡®M ÍØ¡óõ8y”ûÆé†ãœ‰~QdÝIÒnÜJxªƒlEÌ_‹_$¡ˆ, -—e4”ÕPB8&ù 7$Ês ?€ ˆÅãkñË‘¤ $0” -Q:D)Ù.ûŽ¶4J“ UÒQ€Ä‹ÃŗƳ†³IÅ#”MQFEYÙnè”cuM çŠïD˜.†åá÷Œ0ë³¼ò ›Ç„GÂ"¯4`(öfÂÛ‘aì”påK°” ?Œc `E0â€!ÅD%ìtþ4wO³Ž4ç™f«3ÅyžÑžÕ›h¯ÝÑÙrDû÷èíQG»3ÚpCÏ U`ÙÇÀ‘µžÎgpL; …€KˆÍ I¨ŽH²:ëd­3 RÜ&õ$2”}kãí†ó%Æ—ø^b»Çµ`Zð X&^«x^b¹ÇñÆ_Âî·@•n—˜]âµÃê£+|Î$³7|.±Ùãr‰Ç%kÏ1á]rÌ%¿nÙá\ÖRòœõ³–¦ÂFÞŠÆ£ÖÏZzS¶| É„uð¬åɣĩ<±{ Gå’Ëg-á -]?[4Gý,åíÍù¹Ö)å|^ê“M›œ‡Ú¤Jê0V’ÇUê>óB1©9‰™!˜Ì;)¨ÁCtæû4Œ‡M0VôNöfÑclöø{äúk#ÌÇé<ëÑ,sÿXöŒd¸ÆÏ£~{í‘ßXÉ[jUa» -[VضÂÖ¶¯ kìfia[ [[ÈÞØf=ž¬.¤ƒªÝ…-/l{aíž-0lƒ "p:µÄˆÎ¼‡Îo¶È°MF­2Gb™aÛL%)«…†VXm4AÄXX2èщÒv&öšS±Ù°Õ†í6l¹aÛM]HÖ½ÄLƒÖõ]i"MQ+i!fI`=äxa³Q‹Ù@nU»‚ZØv³´Þ,í7jc`+ƒÚĆgC=Ò‰žx*Zá±YŠé€Íš£¶¶>¨ýhhHíqqeÕQ[ÄN¨¡šõ­Ùv¼ÙÝÔævlzÙÊý©hÒ,&èOµø€,²2AªÅ䥕 úS->Æ{ö[]Äö2|¶ö9  Çѹ¸==6yÊžSy{zí4ckMg³é$}¶’ÆØ~3¶â¸ÿDSúá‹u0º‰"Êœ …ËÂÀhþ˜Ædv? ¹`ðTž"¶Ï5zlÇ7,©ëôá¶Üg þ*þ§Žp )¡‡Õ…|0÷?ò q1´mÎñG„8öSœßïB¡Õñ?‰ãû|Ìv_¸©Ì¶o®Ø Ì)`»Td±|?¡‡š~¤{äwoo¾¾ýúGôW˜pîý{OàÓë*°Û'ðéõ ŽÃ'ðéõ Øíøôz†JÐ'ûôzq’…‹Oõéõ%âJ¤dÞ!`Ç3k³ÀŸüHcvû“èñ {[õ¸ï¸øÈz|¢žöô¸vCü„gëÌ`ZXÈô§eñÔ{ž£{žc} ÇãÕ³»ç9¹ç‘èqûs¶ÿ(̦8ó Ñ Ïö>$ºBqø¤{ž¼÷®=Î{žrÏSûÇìôW=ÖZlë‘öªÇZ«@’}¤½ê±Ö*`ÿ´W=ÆZ…v{8“k¹/ÛîáP…1Âñz¤~"µƒc7Àñ›àži'ÑÞÁ}pF´ë‰ÚÑ®4 íÌ| {¤æÇ=bOÏŽþ,LøÏuô|Ò»eÛ÷1ÕûŸ5{ÞǶ?ñÙôxßññ¨züØïÜwœÁ=>Ðâcé±üÔÇXvxÚç/¼G²ãÑAõ¤Ï_^º¾Ÿ¢}t¯—/>Eûé^/_|Šö5Ò½^¾øík¤{½|ñ)Ú×H÷zùâS´¯©Xõ§z×RH_ŸèE\Ke Ø~¢q-•ôõ‰^ĵTöòÅ>¹ì§Je }í‘Ë–ÊLêzœ‡±–h–¥’ç:k*ô8²±Ž¬±÷x,ÞË‘ÿòaoæг¹°7?àé\={~:¨àl¢{è?­øò)"ÖÇhÞÃç^Áò>]}ï=Þ«ÝüÏÇÚúgÄž÷ù÷=k'Á(àóÓž±…íimv?Ÿ…í‰,mPî~‚ª›û©,á*‹üõD–p•ÅàÀ{"K¸Êb =‘%\e1 -i{K¸Êb =‘%\íà¸{Ôî¼Øþì“›f*AP -9–@.SwÑÊwo;öÕ9§®«YÛ”¾«{›IOS%wß\"½ DâðZôt_3éɧDM"½°®M⢧ûšqOrl®EUŸésЪ{øVîù„Ç=Ð#j!÷¤ûèqÿ_óOy Ç|þé™$æ±B<~~¢)÷ÑÒÌÇú4?Nj»Wjș㠒ýÏ&¸ä§vªë„87ãÜOâÜŒ0ÿÉ!ÎÍ8AЄ87ãIi÷8ö'VJ¦Úg{4+Ù#Ñ“§áxê표ԩ¡GŽÏ:“§i\ú³³çXž#{ÖÉL€.Êå¥0iS< öø.•ÉiBS—Ôt&²ò©¥7qŠ“þhØ‘=Užb2˜Æ¤;lìS™¯²êÆà5*íìx¤Ún¹ˆOÏÉæY'ÐyËrZ?Gƒ§nž²| GÇ^?yð¤Á32jÌò#{Éèg>´ç<6’pC8Œ |lôà2âï)Ϥt’PË` ëüEÍ`”ìä¥\dyæ׺––ÒRFZæœo%$Ê®ÉýÚÇ=›4´È??Ä:/âœ_¾XE9k&zŸ‹~ºÊG_f¤/sÒ“dþ-óý–™~÷dùu4k4)N¥Fg]vÐJËêÕÕnƒòÏù<ÿùù<c‰výȉû,ñæý´˜# ¤§µÀÌ °>­†Ò -ŸÔãaŒû-0‹­¥)¡-!tž–é -t” -š, ”µ> ô¤K_ܦ€J¢ª¦vÉŸ–úI±•ÛÔϹKl\¦}žu ŽË„OI÷¤² ƒtORœlã–ô˜iž‹$OI[vT¦¡O[nIËFÞ+sÅ cœuZ©Æ–éÃ9É?ð§á ͇ÀÅÓ÷¶{È”ÒavåQæ i*!Ù4îèZ´vĺ·¡ïjî£ôÁÞ®"½u_þù# I¸¹¹¸¾|sð­€Ð’´=‡_?‡_?‡_züD§ÐG8‡>­ÇŸ%Þñ'dv>êù/Õã“ý||>ë_BëœÚçøûçøûçøûçøûGDË?ùyôg9…ÿ\²Ç'ÉXÿÀ¡>á?áÿe„Ì?}¡!óOßãsþß@þO í|àytvêCð—ÕãŸE»ÜÔ'|ΰxΰhÏÃ2ëÃÒòs†…>ÏÏ›añ÷OlIûy-’Ÿöü%ŸæŸ"à ¿ûÏ©3Ï©3Ï©3Ï©3ÿ9©3dr{dþ̲íþ$š®Ýƒ™4˶ûÓi8Såq95˶ÿåkÖ±nP迉x>;žÏŽç³ãoóìx6Ù<›lžM6Ï&›g“ͳÉæÙdóŸj²yYxÔó²ðs<}¡Ï! Ï! Ï! ¡=þY$ç°ïç°ïç°ïç°ïç°ïGš±ŸÊ0þIæúqØ÷s:çs:çs:'=ŸÈI>‰£|L? }N眞Ó9·Wü=‰þ)c~Žˆ…Ÿ%²âgˆyº•OŠ‰ðã ¿(:ú÷ÃÐ*ísŽÕŠ¡bqOÅ¢±£tŸza -ÆË c¬dìs˜vj†1Ï'pþö -;?J]Aå“]¿¨.ÙMµ¬gŸµgál¥å|÷„î‰ÝhE æî™»glf»×–¯}®©±Ò¿QêWu¸Z%®V‹«Qx£ƒF tNUúU ‹r@•ª•·B@DM™nô¾¢xª(ë:iju£”F+Z½ŬÍ< QxŸ0<6SÅaç>‘x,?x‹:ಌǢñ¾HN8Öµþ3© a¼ÅP‘§P,¦‰MU=õ÷%›‰¬ÿéwÖÊÉf¦¼}©¶ŸçAÁÐAÑPèqY:tY>Ôw<§/ÌØq(¨Î¸Ýç-ëÒV¦­M[¦Æµ5ZÐ-¬È±U,œå>v5µ+õ¶õj+ÖÖlEÁ° ¥Ö`±ƒ¼zŽ%[ÔRSôÈP¼©Öñ|>?ŸÏÏçóóùü|>?ŸÏÏçó_ØùLæx€ TÔç#þR®#¥ÿᶚT‘f´ -$jQ`j˜ËáTj]vjË}ÞÿîkðùÑcÕö×ÄxýGŒ÷ñXýtcÊØ–B¦¿¼¿eZ×~¨ô² ðâû囇‚Ï7.[8/–RνnÛåt^¾¸GÖy¨"ô Ý*¦²|µ|#œDŸú¾uU}RèûÖ] ²à#Cßr£yvö ¼Õh³Qg£Ï&{+… -Ê­J§M -/]qä-Œ¼¡ÕF­J¯p’ h¶4ÙüA‰‹h·Ié~%5ZjÔ¤ôÔ(ªÑQÕ†ó#ËA+50 ³ÿY -##‡*3ýæ/ŸÌ»æ1óš1=.v†àd‰´ruâ› d¹ú -ÖãÖnYÚ®hŠâBd^-¡2e?5•±éÙÁ’!¬Y˜)[–°/#æŒA7×3æž1÷Œ¹ÿ˜ëñâÀ>úPÇ» tužû^õ½¼1ãþž¡­]ë”â‹*ÅadÆaTÇz·x¢m4‘Ľ|AESDQEÝå†'tÓ1ÅÙ5‡…"fŠ6Êrå!_{HÐF éãÏún$}î å <Ì'}ߣ®í3ÞŸñþŒ÷g¼ÿ¬x_Æ0®¥ýô™zÇÂr³· ›€2†ï,þÙÆúìoc7´tÿw.ÀßÓò’–a þ>Y–ìÿ›ÞžŸ¬¸Õ±âVQq fv:t›ºÃv©µ?Êk¶MèìJ¢¥Oô‹¨MíKí‚"½ž´°4±®>¸œˆÈ&BŠíÉ4wGw“öþò]÷›H¬d=^…ËJæ‘èôÇr¯£Ü6Ù™ÎWy¸ ,Åâ£Ï}ÆèßF‡ÚóÚÿ7®ˆáŸåº±ÕŸðš³üA¼çë­ÍÞÃȧC_¦zÿ¤>õPJix(xeMÜ8Bžò"̽ -s˜µöòŃ.QÐÊÚÑÙ3€—ä¥ECmÍ1Á® u‡Ôr´¨‹¡‘ï~Q¥aY8l™Á‚زú Õ‘yùÂjɬ«Â,ë»,«µ,rÞÅ!ÀN+†iÕøQá´Š£àÈnU<F´“ûõŽE -Ú¸™ ¬°ƒÑŸ O´'É“í™í)ƒû 1üàI]>Çî‘NŸ­5„?ºÂ&èW¹OòHUô^É^l-yMOe2Ð¥Q±ÆE0Ë…¼³©Už#yŽÇ˜ënÉî®ðîbä~m+5¤KÌ׺ùÆnØJ/_›+“«‹¾ó›o?"Ç×19¿vä;!'˜„F-‚¡$êå ~jáN-À©5µÜd [j¡Jš$9¾”ß«9»-·’[ kÇÄA€?K¿Ø¨‹¨ù¹”¼6*‡ÓœëA ‡¸+ú³ñ–MgôAoÙÁ÷fwˆ¬q¥8îm†=á1ŽY#£ Ñß>òxþ—··W—ïN¼ÄS¹û„=ö·êÏ:ƒ~Ðs¶[=Ç«çHèQ¯›g”¬>Jn_$ÂCüÛ8~œrïIÖ÷…5zFE†±Zý=Žb¸ö?WBëã‹z}lá°G•Wz‚rKO_é)zü)Å‘ž¾ÜÒsŸÜã?(OcÆœJyQ1Þ’ŒCxÝÕ²'uï]P9+‹™L’F,RcO)¥þD”cJ­?"á¥P‚ýL …Ÿœ€(AÉöAÄ!Œ&Jº?£ÄûS§v”€LIøG”ˆ©ø…ÒñgJÉǤ|| G” X¾`Qdk’ì…Mó&IŠ;>æŸ#y*=d­†ã¦‹Z|Ljöq’'Ê£r·G%{©QyÔ@ç˲áNìÙÙcC8êj÷”î¥zœÉ@ß?iñÄÅV_?УÛ<ƒêœÛÞY¾|Aÿ=¹÷Ù=ø·z<¾ç9úøzäßžìzÜ÷S~Ú=þÄoþ×îQÔþûŠ üôÒ‰"˜ŸäùYË…ý¹Š{ýu•GhÏ“—xîñ¹ÇÇ÷hrÊh(Í$“4FrÊ_(y¡¼…’JX(Y¡<Å¥ŠPrâ"E(!q¢D2PòDZœHKia¢V.²•$Z$êÊ?ï =¦LäÞ<&ÎdzùÂr™úl¦–ÏÔ2š´d¤f{-³g(³ ógÈÄùMœCÃ9NœEÓòh™—²jRƒ5 lG"ÜQ—Q3SV¤æÕh^˜d×3>³›5Yøã\›*ÆËYrn0ësØHË6IÎÀÁ‡™,+ק’sB¹T;ʧ:–ÌÎΩ”¡CÏËb`Îò$yÔ ­vPµ·ŸÆ;¥3´4•©{ZQõeñõ…(¸¯šéyLù±ñ9}ÿ½"OPF³;Ÿú´yB~ñt}ý|=®Jj6`[ y^=yó¤õcYyýVßÏš¾hù'rú‹FÏz|>Y‘>ÏZºêÓ3Q‹(ëɨåúÚù¸~ƒU×5ïVÝYk—œ8ã̹Õ[êÔ:µ¼ ÉœXAÝV’­¯AìGâÐÝ©3¥‹CXg ÕÎ}ÒE"¼|±[_æ íËq»7ÛŒÊCo‚Õ–K ¦øØŸWûx@çÒ=Ô{c?‰]l™ˆZY‰û¡zìòSÆþTqc¼¾ÈÒŒ]ž‡øØbdË@·8!¬ÀVXâe‹™-n¶Ì´Ã`k› ­Úâh‹¥MJ=`k„©-®6Øú+Tû?9ìùÆrSþþŠÎÈ ³¨ñW'.VŸKôsç±¼·™”Ô£z€‡©f×|›Ãz‹ï«éÝ×Lœ°p– ³6&m’Ýa -%äx,{î=±¶GqF-EFM“Õ-œ§Cïcßßýí,‡³K´ÏÉÍwu÷Çtîþëwoß_þ÷ƒã«‹×D÷îâsŸy®Îq„éìXsILþ´³c}rwüijc}rÐ]ŸÓ:¶Â ”—Øõºíc“’òÕono~{÷öæýÛ›o?û¬'ñþ//_üæ{ú[à¿ýöâýûË» þ£ÿûáîòàwÐæÿñÀ{ؘôO*òŽñÔÉPÿíGþüOðûÿèŸâÁ¯þãNo^"üß~‡o}]ÛGêõ?ZÿÝGjr¾ü.}¼á÷ýNÖŸÀê¦5Òpþ™8èáœþ¯“vL¯¥>¦’‚?Œqª¤îé·×Ô|LÕ1$v_ŠÚ5ÃO¹@7.èWæ¬ÝÑoÔN_EêS¿ÕH ßÙ(®è#õÞÚƼ²õÖÒFL}t#!`úG¿ÕZ¯FLÿ´‡i9ⶊíË:›‰~).CHŸ–ƒn4Ò°§¯"cvêÝ:|·$ºkû¨ËLß[L¿CÍ´A›|k5ú¨ ­ßj$ÐÈCßFú¾~«q5îFôQÛÆmÃÞŒZ¿¬_Y- ý¦k½˜ê - Ñ ô[m€«A7 -áöÓrÐÛ—um”ú­Á2î§å¸;B(ëq7Ôê·Zë6î¶$×öQ—›iŽdËsÊA–ÃYrƒÒ µiD¢o#ý£ßj­WãnDBuÅmÜ6ìͨuÐÆD–«²dýTWhX ˆ¡ßj\ º ·Ÿ–ƒn{¬NéÙHÏ|V4»ä ¥#’ÕFÓ·µ5Ðoµ1¶qÿáå‹S9^áH–Ãu|Þî.®o?|suñ-…vŸH@˜üouÆúGŸ±ØÃ5ÿÑYIÚ¯Žsú‹œ¤_H‚ öÎwÕÁ=£÷ô†ëEg­ÿî¥m$ßH ©Uòtjó<¿Ä²c¬­kù,ÝÆ|8—à×íUíÛý ×ýv\©¼ré**Åït0ç sò1ΆV=Ö ÷‡¥¸ Ÿ2¦Š^~9ŒO @R‡>­>„Ã2;Ç2b”/6C³Üæ³w‡S²äRñ¦]Oeý &žS´/ vY˜f íÃ䧴ù˜§bóCÕÃyò°š& Ó[ÆÀÝ”å% -›§”óÌ ã&_~„b½ Jañ0N1À@fÐ96 V+ó:.‚~‰vBÀfÎÁm>&@ÞdèeX=t jèZÂçàJ´Ï@ ;:1fa|J0úYÛ7™@§°þìsÿNʸ`1ãÔÏ‹©P¦š½K)l?÷T b:) ‡o?w ¥0]L­mgû¹' -Ñø|jL›Ï º3 “&ü4µ²ùØÓ¶ux,ÈŸû-d@ÙdÍ)m>÷›Ta²ueëGÇTÑBÏEªwÈ=—Ô«dþૈ‹DØsR&"Ÿ°d€¶‚æ|{±ýfœ 6qðyÁL(è‚·‚î7Ÿ87 ¯ Ð -–äÝ|¤•rP /FÚ¿n?÷4d@"4j4cÂõçžX &`¥æÍçÅ®0 lˆ¬Özó¹ß -4f‡Ÿ/uûyÁ](ì@VY¹…|Tæ’*Gj§“~†æÑ»Še©ë†Ra‰õs·ÙÁ¸™*У&™ n²õgè(S¿¤@`ì“Ç9Mxè­?ÂTKÌ+$"qŠh˜ iûäB7É{ 8ÁûfCõó¼þæC_Œ¥+0€ä§T¦‘³ß|öØ–O -̘AÂ3¨xì­?=eG -¡ ØÍÉ ÀÃwý9“åKt‡ÁCÏ€²9f·ù<!ädØ&X8¬s9ÐUŽ¼eô£°ã³|„äø?no.|}{ý5 -ŽíŠèµE9xiv -D[&Ø.°>yNŤIwpôýH”{HªÔþ´ÿkQÜ/=ïòf®†³.¾~ã<áA‰ygoÉQ²óx2òä¬pºP§Ì#T p÷ ѹ,0°SX8I£lLÜÖ7n×NaÚáâËÀ]˜½LdõêsÓ ^ݽ?yûúýÛÛ›‹»~E° àèîîB~ÿEýåÁ«ß¿¿{{óíÁGÀÿ{ð‹ß_^ý‹÷ØÓÅû jûKþ[ÿEðêó›÷Ûïðòîó“wý÷ú¿yñõÕ%ŽHÿ†ÿ0ò•Rx-¨jHdË­ž®ÑÁOljc;ÐB™ Ø[ UÎAÂnžŠ[b1Â~™‰ÀБ}õí¦.— †tB6ëWÿ9– <õèfÕíð¨}¼6Εi1ò‰Ô”s‘#ç#oݹ¤e;…QwÎ-¿Œ› *½/ßû·ºPîr~µØ“¶â°ß=ÇåPØ‚°mú-°~õ_ÉøÒGtd´A?QZœ DcPLÕ©\"¨KYÍL±lÃý¤¼ü - -ž%ÉŠ­ßøWBöçø ýTž0|†¡‰/ùò@ÍÁväx–Y¥l-¨].¾óaYXþòÝ{ä>£T=ñ…yì+H¹o@ÒÊÙzüù…Ó•´l¨@ê2§Å·AYp^—iýî¿5ÂO0|¨Ô]/þ AÏÕ-±‡PÄ6Ê2ò¢¡µËþÛ ý†&=­Þý·Gùȃãšò¸ èP‘Ô%éÃZÐ×-¸ }ý:Ñ~PÇôêík´hËÅ»%í+pAÒ†}$~'lh9ÆP–-ˆ}6yH¾NÔ_U Z½ý¯„úº¤Ÿ;©Ö…¨|¼d#w5gdàêþÁ~ÑRÚåâë3þQÉ}õî¿’-ð“Å}´¢³÷Ñ*4ÇùÕ–²ý¢!go].×U§´ø-ÿ&w‚`[A -7ËC¿ÔÒ³h©À‰ë×{aýö¿ÕÍ 6˜ÅfPà‚ÆýfP[Ï¢¡$n‹Ðo†õËÿ*6ÃG†ÿéÃÍ·W—8ìï/)Šo9D;rŒ§ußム¸9i #sõw¿:ed³ýzÓ½P‚øÍÿÜÑ…9ÞpÈ×Ò+üz…¿JÈpØcrÐŽêCßûC#VzÝ¢±ƒ_üòàßþõ#ñýëË7oá×»‹›Ë‹›ƒ/ß^1ÒG`´ñD`+ƒ¤ƒG·—G›A"_àj-o’_õzÝÁ¤k“¢º×-`úÝóAmá46DF÷Çn/#C˜S‹º„µaºX)æg6Æw—À0µ² Jë„–˜BÐ èö@ß­á€Ú+‹‹M•a¥¬{/¾¶^)®C‹Û€à8˜Qì‰÷¼h8$Ÿ‹¯dDªaÒ3=°TKßð+ ¼Ôˆöí@GFw¯ic\¾ai?2–HÈÈSé:E£ ¨plvo÷°vœ§Ð†Yf2qeçV@|™½dæ<¯½ ùõ!×{Q7êuôvòEÏI`z¤à”a éËa¤×¨òM_ HÃeûšé ÉüýºìÈ˸z²°zâlH’ŪG‚}3BÙõ} ´:‚ ñ½~ÓïÙ×=l³1cí©öM¿²¼×=lH…’æªÇÕœÚ~Yì¡Å~2‚möÚjÿ}¬7÷·?Þ]\¿}C'‡ýÎé>ã.ë&Öþ'ÅRgl 1óý””Â;¾ûðî;ë뿹üÓ|‚sÿ—/AèǤ”ûÓËð—~qÇôÆÔöÙ\`°Hê!fõâŒ?›ç„æµ:øùîðh* —. öíØøÏ·ëÞž@EßîÕ-hY:WhÈ ]c&ÇÜlÆ$½œÖa¤>üâ3Œ šæš›¦ð‹ãã£×¯?\ÿîöý6^Êòø -ô=Ó„ü!œ¹N` µ0¼ÄšuHcht -˜7Æú° L3œÜ2TFU¹$¡ö0%8lx²¡Ì‚—Êߟт/H©  ©vŠ¬'Ç಼lš‚ôPüd#˜µ‡ ŠXw1J“ ×Wj`N&F‘^­_“` º°1ÌÒ8Lq ÅSÐåèZ+¼?ýÒÂ(0 ±êbiK0„‰W+Tw ëuðm]}žeðÞâí¬Œ:âÆH ÌÁKÙ…p0Ãîg˜æ,” -K»G§ ÔÈU¢r:’Îx•c2` I§3Ù*ÝFXs¢Ô)òy:|ãÓ¯]:Œ.+Þ`$:) ûsB¥0膥h\Åù$À<¹,ÀÂïN;H! ¼bÖ€öštB)h«!<ýÒåC¦Ô½÷ZáSž…uLer2ž’u/V]ºýÓ$[øAôÚØͳ"*ëÜu#ë¶JJ26ŠÑ•Æ[»x¶ý줥‡74ò)Ew‰K™1`7ê.™½S™…*FEÛ¦˜„I…ÚYÃ@UŒá˜¶À@øUÆ–3†C ?ý"î'Õ´*ðŒQq•ÛÈ@W«ï€6}`²Š«¬9³1”ÿ$RÅ%RFVÂä—!w¿:D;º1‚\¹O -³kðU?OÏ;@{.Æžðà¼Vx4ñ))´=Q –ÐÁL2G;¹g Gk¬Ži}.ÊP&f«$J±•ÖCE;(K³ÑsaÓï=:f4t Ó„†s{ú•.xDÈØ=ž×¯NÎüU1UÎÎ)°ðÚûÅypóžeš»vë†CxòYb<¹¼‚Žh™dÕÅ’FÎy2Úñvl ¯jnÈ’Çípô YËä3•fP. Š¹4…G&ZS8{P9²"¤6c„5ÛRÑzˆFQµ2CÁwe/4 ²fh=”) ±§IHªÓ®2°XB”¨%ȺV8@ÚF§â/ɼFÁzÞ,ðFô¡pÊã7Nsaø(컚Pêéd·!û’e~ +fHI”¼$¯ªQ鳆Üõ`’|Ò Z­1&Le]ºÁŽ B;¥•(gˆ¸"04V3Kªú9è¶LJ 9O^ ×™^(™8Kà!š¤^:ð²›'gÃ9pö…›©€ÙcÉ!ã©šf…p7«l‘X¾Éy`<[0ïÑý(˜hüØiÓƒšÂ@ŸT)¡L -b†o»âKë!ûIà¶Ga4³“wšYµÊ“Xy°s°ðxóºwq·Jc9OàuiŽ¬8v&ש[`ƒ Ãt®(Á ¨í—XKûz‰ÜÒ1kæQQ~ ·¼ÅsâüE&ܼ6…ê”Õ‰Ô‘Q”‹½6,½fe=X©D;€Žçb,‰iKÚG•òbV:îv9å_+Êyúmä1ƒV5ö¶‹dÙ…ÅF¥–`*b]iÍ©F¿D·­ËhP瘫 =‚§Ÿ#ˆ ÖÈBzU.<§ëëƒ3 -¡™û($±RÂÕÚêñæÛÄ×#xú9bvœŠdÁûÐ& ‡PÏ ÎÞNaÒýÏÍjû4Ù¶)¦æ“8|ã“OªP°‰0gbu× ƒXUˆÊà,‹4‹JŒ“HÙwÇ1¯©rªé“Jºµ³»ŠX À¦½t Ž¥ö¬'\©Ú8©P¯’ Z½|tªz¥ÔÁØ€½dxP‰%Î20œPÒÝجOȃLŒ!#¤46ei.L€ÄH~Zã¤<ßMW¬3# Ê4ŽÓDt=×^«lx˜kÇ)ësáqÅ$ÀÉ©°QÌ ²UÕ1rfhöhR”¶µyNœÅ-Qç–]XámªvO.Ù9Z;=ˆê™‘>[c£¨œ™Xi‡d†ÇÀR"&GV=\)}S^•UE‰Î»ÖÃdZJMü2ÌÍrf`Ë<,PžB’W%á ÇÇzT8mÜN±ê„qÍƈ=Û4¬‡8[Ïkß3{uc±PfIæ–øgãr¹šý¬ÊYÍRÝ,Ø2*ñº)¤ÖC2é^© {jø¬SV`D_9sÏj¶^€ÃÊëÈÈÂÝ‚J¤"](A1Í*6L&Õ(ëy› 5älÆ,dFz OÈP õµÁΘÌf‡¥ï”¢„áϨ)­NÕ–¬j_̳m!Üz*VÖüæþpÅ% -pìˆÄh{È×” &í¡[!ÑÔæÄöo~ª©ÖªàI#o•ÉesS8æE!.ÈH÷œ§f·½Mûz¶QížU€ÕÉ«ðƒö{é ' -icFÒÙÜoKb9^%»`LáÖ8EkœË¤Bÿ\g6͵?ë ä ÇŠ `Ó¤ëÐ:mf -—ƒ«lciô$@Wõ\ò9+przÜU3¼$Ý>!±²Lœ÷ÌhDÓsÐ}]ÃlG ÇÍ‚_’±Ï•ý»Æ"ñÜa`[L[ù‰Æ s¡;‚l’ï›{(A5MÅoÁȯ³kÆ$€ç¢”DŠ*̓Ƨ‡ÑoáþT5Èsâ:±´¯JÌ0p’fÊœh±ñlj´/z×Ö­èÖ[‰äé…žõ,¯¬Ç§çCEŽï Êîäe–¨3oe;ësP/fU45Ék0+ž£j¤*šœY›'ñî!P8¦:…} õŸ'§+)=ò¥* *h‰ƒ•èçÚiêê¿¥£ˆœ¸ÿ ´€;¿ª8OIÍ(Œ™Q™ÎfµÂå’”Ñ Å¶‚E{” gæ?eêdQx‘͸¬"&ꥻ=#{r» ¼"DÕõQв¹»jùì”#ת -1¸ûÏ„f«%“ŸÍVKä?ÂÓ¯p4i9l[a¬:Š’¡ z¶£ëp³™ì9£ƒI;QP‚ðú:ƒ­Ûå~¦Ö˜)±ŽkÕ"–âàA Â`mDgZ‚šN¶ý<9ÙÕ؉Á¤ñPk0KidkÕÀ Ü@4Š’†z-éhæ©ÎlÆ‘7n'5â‘KŒ[† ‚(¹õ òP<”<OœžÄ‹e®[ÿh^ž‚J˜nûØ ³$h®a¥€”IÆ{ÜMÖƒ·‹P»HÚf¸¨ÌI‡”EHAaQ¥/]ë!ÕIÕN瀶QŒƒhf—“9[¯â–²¹ï¿U…X€»¢“«¢D,Ê£6 êŽYz-j‹"• - (hóU{pªÜ©p --ç¢<”ŒCÒl¼I âSˆj[hÆY„|6vŠ]1©™t“,µe–“Š¹Šc›BÓîøºˆÓÈœ6Äðt=U®³ÅŸ  ˆ r¯L°Ã 6J³‚Ö¹ É¡³\z˜´eßÃŒÅÄÌYζ·Z8å“TÔ$¦jáZÍCð¶új$¨Û“ÂhQQ¤¤ZsgYa‰¡‚zô„°1ÔÎqÝ™¿±3‹{¶ –iâ„ÉbV6î¡…÷‰Hسz¿%b•z³oTµÍ¦±I7n-®6:¯†™$öCxWµ0‹&7x6 ¼úÔk5ËNœgª­eƒêuŽ#R‹ùˆD 3N.1m`Y…à:YÞ‚¢.&Õ¥™Í1P-‘Ù¡õ †:WQ¡ÔÆI(¯<ÚjFÊ“šg‹éãƒwÏĆҋӓájàlr=×ÒqR:mr¿šj¶è³Èá¶W`—jÇ(ÍŸ+|*ꄪzæd¶ŠpË2!ö,§Sèû§°SáGð éáÈ”N(„³DFC6GóM¼¹§¢ƒhµ’d6ò˾|?uØô6g•Õ#À`º8^ãØ ±”-.Ge±ÒžŠlˬ¦]xø–{>½ª˜˜¬#äp­ðl§°oA@8Y¯fn2µœïéç窚¬±*Wqm¨Å9¡YµNãøÅpÕ¦‡°¢>²Z¦žRŒSu E23@[þÕžúÀÄ<Ùé]Ñ·pm¼Á"ÒIù:W¸R4Êüµ‡ÛI8)ësXSQmë)¸ƒáŸ~Rh²™—´«eRÂcN¥Ì´«„ÆE®ËË@…ÿ4ç"r×dÇ”¶ØØÿÃ9õ ‚*áò}”øÌ9f”€ÞlZ‡@8À£¾)Ûb'„’ÞÌ@:…] -ÓF \‡ê«õÐY9j8XÃD[ ñéWjF‡˜*úŠE‰„v²Ûò&?!pöʲZø7ÂIFnœ´3IL“Xs5‘âgß× ßDŒÂ©œ"6xFseµª˜•Azøջ̜{hÊuÕó½pÄ è²õPÅî)§¯K-&`æ™9Pk³¢Ñ_DxÄŸ¼‹Ë~ x'9s¶\綗[ì*ñj¶ð'oÑòÏfÝIdNÀ4D´ JÔ»™aŠƒ)U•8%¦tHóža/ ÉùVÌ$g=T3¦fiܦ&m$m…[N]Ù<•Òâ]XÈûñØ\Û$9JF§1N¤0ßÄJÅMéÏ‚àÄZ Ϙs„@„é"ý'3< |Qí**¸+ºJ¡(®°˜&ÈŒøÚyÞ8¬*{ŸÆV<ÚPœ…àò>r¨Ç332Znè·´tj.+iÒQËysœ4‚ïJ³’åì‹NÚOò\: Ÿ{0 €ãÁ±¥æ¦&Æð5„·šJc*]ÌFÀÀšñr5–Ð,°‘Lìt\~^øãlJ™Ô¤oâ3TÕ8p5šQ¤xÙÁLY‰ÂéÕ‹'`™\°u‹Ì$¨š›˜¤‡[Fx?‰É<ã)ªäCdË+¯1Y‘£¥e‘ ;äyrÁñ¶~Ÿô\õyÎT77f»#€ 7H|$˜CäÚª@œ›”ăl,Å2C¥ÏY­@µhHjë¡­Cf«5bGŽbeG~V¡ž6gP%O ÔxšW”î²YAa (bí”A”<™*•noÉI*¦91 õ“2@ è£ãÅt,²}´Êl”ˆyn‡oRB«rÂLˆ"˹äŒÀ2eÌöÔ&;·rgÎ"Uå\ásө퉫”,[úÉoЉƒºƒ\˜´õæ¡+óÕ×'1…l-×–DG ÏÌ!Zã`­")Œøÿ/äF‹0]ªgúÉd*G!÷ýF…ÀUcÕ9ún«’ÂJ“Á’¥s%¯^§BúHzrD‘¤¨ýÇð4Ç…Wç\ám³ÓIx>îæ©íÅãf¢¨®'Aç>æîÜàf¬p.³H„™ªÞ²ÇcÓí“#8DSÔ='^+|–<]ŽB<7°eÍ•Ïi‚Ȧ^:aÛŽŸ|ì©…¡Ò¹yè‹”^©ÇP(Y5¼”™âu)&Û¶0E‚7ÑeÒ£SS-JQj:* •t‰˜²)Ÿ‘mÖqiU.Á`¸kâèR8 -‰ì‡‰ŠX—’ÅÈDv¯ìtÒù¾AP³0sÀáHU‘4j¡$±ýŠH‰Eߤ‡JŠšóµûrš”?ˆŸ~Öø}ÊG çûЉÉT‡„vwòHêÛ+TPX ¡°h’¦Þœo®^P¦€)x;®XÚ fõD.•ƒÀbÉ(ȸԃp ¢FŸ”ˆž§iµÀ,’V-|Á i”E®ª(ÇÖÈ%/ÀÙø–‹QbKf‰”Lm7–°íMâÒ´(8`ÑÁ¨ÓhÙn‘Í ö}À‡PAäôUöùR3#qaâ›Í²Ñ"ašC$ŽRà=Cg&"¢‘$YdhV#†õª Füi…ªÚ뾡­n=í“Úè8ÅVÜ)nFit²…Ê+ê±QÑ€ÊÌ%O A]žLh )åWynbJÁkÈrÔcˆ¥Î°0`þw€·‚M–ÅméûšÌX8&Î&"SØq©¶³X™b Õ|TÊ\%¶RÂV­oqLÞ±xÅ5õÐM(,fˆÎ"€ƒ)ó¡WmÕMÈbh$:·€dɸaîjX$1‰„– 2¾|=›Ÿ#Rü¯b©ëCâÉèd“Ô¸¨‰%аÕà̈b—+H¡¬ºù%–žzh‘\XI õ0)%¿ªߥ²9éÀ›Ñ,ÜûÞŒ¤2à€g›RO¶`´-Wžj™0Pc%­6nç+,ŽáÞ[îg! ¤‹—³¶5<§ŒJ¡Û\-ËÌRë¦É:30FÍ%rÉwœu*þ“¿Y¾¦SNhS í";öfS·’ì—@uÆû%Bu¬ãHÇ-»ÍÒœžµ©ÒF@KßdtÚÏÍ÷ðP5»R§Œ–µ6å¤=ÌA}ù›á–ˆ&ñÆLiÒÄrŽDån³M[–žª-²W­.39uËQ(ßöâù6K;Ö›†¦"5ˆS67Á4¨áT -³"$ضÙ%6•:ðÖ«Èw¡t㢅·ºÌ•"”Z™c1"…û°™BcSxíF¶ø,çRc­M¡æqå².¦ -¡àg)áŠF¼m5hš YXX\s§6ueá+‘HjÜYq&ö a†Vx%?ovP)žˆÀXÍ.E_ñøàή±õ0;×o¬s•ÀÝlÕX¼¨ 8"‹TçøjÔ4¨SÒ(Mh…)"çÜ4œYC}f!Ò‘ôD "ET UïÔû˜­¢GÐŒßB7çªCÒÕ hq”@n=¨9,pH5)“•\EdÏœ,ìÓ‚¼ðf…N¤¥lî¨gR’˜yŒrvj]RbMXœ›b"TšÏzæp»ˆ·½³~Ù1«Ex[•=R¹ÒÌ#0Ì3Øò®"RS –yk]¯òIÃï*S7†"[ˆ"jòSTB¨²²g¡¬,×X€8¨òDÕÃLê.âëÅÚ™&VNMÝL®/v׎d´H¤bü/¨M£xÓnSU«ÈÒõä¦. £®”'îêk…«ÝÅ[ñn†k–*Ù¡68ˆ*z8Ê9ÑúdQzâdÙ¾ñç˜ÔjmRI#ͽnÅÌ«e•B¹wwá_ÔAní|ŒJƒ%…Ðmð-þžØz™Èåļ6¡³âŸ"…a¥;o‰ÓJåsç…-p6eKëãp¯VTAÜøÛ!<½vî‚\sótà„‚2*âúf ­ÍÁm‘¤ƒ~ž|Af<â4 K[ñHgÏuiLÖ¨s…k oÔBh ±ÝS^Â|Q×ê !|Njš¤½‹ÀÈÑÛ”ì>jn^bÑ}§C˜Ìö\EèÊÅB^AXdÖ—³ ž±'s‹Ï\=ƒç–[L*'I}à7'±cJ9ÏBe·Ô’[$wFY‰ lç -Ÿ2wâ}…À>h[ò -DK‚5Ë !ð¬6©Ôu쬠D4‰"àG­±x\Ô¨¼NʘӨ£Her­çÉìUAä<,*˜5ì#p1ª+>ò“žžµçY‚!ñJxK¡”º«lÖÛÜ¢ -¨°¡úäD)ÂR…E1Åt’ªEîE6K¨¦€cÌÔlmÕ}'eKhcíLiXO°hc©(„@MNjXÆò›!èÙ=[DUWã3&ek-ïA%XliRb« ‚ok,C—¸«s(u—xÞv²aA푺s…kjH2›&¢ÌÒ̤#/qVb° oZ ëYƒxÁjcŸT”‚wYr{‡`¤‡ ò§º_r«µâª…oQXi#`spG+ÎK»Àªáh -•'4ó²c{ -lDš=3ÙÖ…¥Ñ¢ö<;ök`ÞÊérú½Ë"D)(ÓÆÖ -«è2åVJ‹[±N›]3òÀl !(¹«%{KˆšQ†@µX`Z]á ™êóßÙíZÝI„ϵÈ6„õÌ«ù–3’äm™ÙþŸCW]);Í%ni™3Ul,ûzh\Ã;MÿAx«ŸEæ&æâ-PU³VrîB ½;±SÒƒKWΗ^”r0¤iOÅw=Xœ"f;¬v$5$#ÿ&@3¬†¹‡õ¤L@×,™\8¿gq5Õ[hA:(| -2÷›,ôkeye«Š¼MâA1äŒ9ÈÍN,•áj"›®ÊŽkìÊÑαXˆÉUñdN¢ÎÞÊäDÞz„ O–ˆ5Bœžc¥²‘Lž\LÃ" “zJ*ž× -ÏN³¤(È÷ÜÚ‹%5j%¾‚•ž‚"IMØXJ<©w4Î-ïS\×"ýXc=kèM–¨êBù Nš„KÀ¤[øs:ÎîÉX&K¡OœªÁ,ÎÒÌ’&çP8uâ“J€I[Òué2M,+§‡lp~ˆµ§¦"=¨hnžêÄ>%éa¶¦¤…«¨ug¢VW*ssDŽ!–ZùƒÔ«“X„Ë©lÌ¥|hÁ%r$YHíœÌ{GÂg®ÅňEÀ„Í&> øUM «-.áS)[ñ<›1;2;2x¨Æd¬à$á£èÎ×(H¬&6æd1Ãв2\åFdýV)]Ž$¬òbŒÃæ l*¨”¾¤€5¸"KÐ9–„ Ñ2wð/ÚVÓf¢Þ|‚@@£‡°ø‡õk²†—t‡VÚ‘$¥¤e¬¨§-Y±S;™0T³á—É -G.Ž€@o‘󉉆M}hU}®õð’V()d3ÂW¥´y!‹…n„Ð\lªÐòëÄÔX$EȵH¯-Ü­/àŽUŸÅŒ”?foCh®¿F˜d6QUG¥?² f™ƒÔQ\^ßcÐ"/Y±gG¦úI·<çéÙš³z‡‰ŠeWSw -ÞÔÁFfd`"'öˆÝÃÕ°ãI™·0 €iËd6ÑÒÂüSŸ(°ÙÓÚþðòEÕ/ñ>L¼êôæÍòf¨ÇÝ×7Fñå½ã{£@ßåéöÊq½EOvf8DN[HÉÍ Úz:o·Eñ èÎ(LãÀ +ñª.ºUÌÃðÊèxkågäîU7‰u­ná®xŇ -J·¬IñU¬äeäŠÄ¶µƒ×j K˜œ5FB¯Ôƒ6æ­$@4 Oæ|kðÔJ!~Ç6 ´á&6ÿ¡ÈÉbÝ74«Üì£ö@‘o¯Õ*2%:¬ðº%ɱÏQewºƒÉ«­$Î$%ädI;˜4l&GÊågä‘rChˆ©ÝSmkôZ½wâêÃ;Ä Ž¡ ÌÖR3zÀ5'RaÄædqI{¦«‡èضƒ@I ôvß…"r×ÑOì/ÞMß­½Ô>C©ã¢­8euo¨ç5m^$¼„×½á}ÖHv ŠBCŒƒÖh-Ð6"ýƨmñZ @—ˆ¼Œn±<àÂÈÀªV^FA±½L§ÐJ_µ&´,ù¡&IH2je^T–¤ôŽjº7Xâ${möGkÑiÁ3ö-¼¨êZ`v m1:‘Z¹Ý02Ç\ü¼ZeÅz•uÖëUîßV “ט®åʵE^q—õDÚÍKý¬ƒº‚:ô$[º.ÉMf›Vá¾­s[¢h„²XÏ9ùÍ2£ÆØ-s1 -,¶x¹9³/T“ÅÝÐr¿HÙj™.Kén*L<)P"% h4<£ã80X³-1Þ”ÍgXUX]€Îæ&À׺»½­q£T‡-ÜGÖG±°!“¨W‰.I-Y*aG” ëÛ…odS‚ ̈Le2i›c¸öí¹ánåí¾ðƒ†Š!­ ©r é}´1†¸Ü‹øÑm–s°ÊÝr”1ï1ª=,¿«Òš,²Q¶Â7{@¢ñöì—}{k¸ Ç[v´¿‡œ`Ë66ìı{-žÌÎbÏs´×nÌR„ÈS(DaKãbbBìûl[ohf9cžy¼ -\“I×… iìCtÜÀõÎø-—XÓIã(õt«¹]úŽÔŒ÷KÓe²JQöµ¦”Ž­ ¹å£8«PÕþ†#Þ7½ÇqÖ×ÀÙC¼}ïAÛ-¾_pÐF)Þ(»‘T7‰Žþ*ïoÙX«ú˜:ªö:Ó¥£Û‘9 o³3’…©d«D4·hW¼H†zQ¯j~Òb܈{¦¶ÌSÛÚ÷)ä$ÈÖ´‰AhÂJ›¥Ì}Hbç ›(¥KìÈé6a[‡í¢ÝwHn÷÷f‰Ûþq}fÈŽ†ŒkËå6kÜcbH&#zÚG{CB’ô•ûð>\¡ÍjnyÁ؇ tÈj‡|yßÙ“j·Æ ²¶5î7€#ýféNÅÎÊ2Þn2ûó×6̃}\i&0ë6*í µz—°tå›ÀƒVÙ&%UÖ»iÖ6ª´Q Xz!/¤.$‚Ý—à,R±[̺H"îwx˜çR„¶kAð‚mØoÖíþnÍ‘«<›V´år{8â{ùì–)˜uCÄN†µü†´:¤ê!*÷á}¸B›Õ,rw yþèp#û5ßY½óÜ»Þ0UËà*Ÿ/¶€a±]Bû»½%óXïBía±eGª/šf]ÑܤÙ2“ÙòQø¡U{[³ý¡½¶ÈEY{i•fb»¸$ý5TJ(èëvÄÙɬšÉA¬³Ôzcºc—€ØÁú++§ÌVõÂI5n4rPà†Lj¯úöüD³hkÙ¾]øuq #ëÊÍ5EMQÒvõž7\ IøÇøöˆáû0ÕWÈÄi03Rkæ€êŽLê€á—iÏ©^»k]–´æ&‹ŒPjM†ãT®3Œå ýÀ˜Õs5ÜClîE}èØKÜÈb=–£^¯36¶;– íJU£Wuƒ·>2·k÷˜ƒ==¾©4mw$Eº}íìZì¹^>ï7¨*ëË­¼æ¸í½e,tð}¾„õv¡oŸ«áYËè8ÎúŒò“Zc=½ÝóÅ0[Èh£’¦Mb¢pÙmX†Îÿ1G¬p˜ ¾7ò­=‚”G«‡ÛÇ ‡|s/“qä!ïÞ2úÁÐÑÙ¬Gô?Ú*û#ÄrA¦½æ^ôìpÒ’¶Èµ¤îò¾°‘eˆ ×—]£Tõ*v+Ù…Fe]” ßÚ³Š‡Éœô° žÉþÙRÃ×WŠÆ|sC„d¢}Ö#`ƒtì;™©N{^ì+D„ª÷æüH‘Ù±~fô`mx§žQû8­Å}ךJtÖML˜«…Åh\M?“Ôn0 ¶AÛod SE#-=kÅ‚[N•ÆåÜ/#l‚ƒº˜˜u$Ñ0æèžø¤ QÉw8â}³Û"á>|m"™Æ1O£©ý6¶¢»ˆ˜ºÙØä>–„áœãƒÃWs§Ô«f#ßÔ‹¸ÞðÍÕmŠìvÐܧqwðÊ*¥EØ·8=ZZÌR±½²ˆošì0ïb¡f[¶5¥/[[©®,'Ô35QÝw·Q -Üì+™³¹ƒusΦ[si Þêöüjáî=æ73Y‹uƒ#hŒÌ!âG+´]ÍMlÈ"šjp6 MÛÆ6yDZ–«Ü…n‚¼¶a›U^PðTÆD5¢ÀotIWLß< Ûbx–ì;x†§Ôð<Û~›­» ïáþrŠ=\eȆ¼j¸?ön¦Ñ¶ÛîÑͪ.NüáÁ:>‚Gçõ7OZž$´Ëê±N±ùâ;PF8ô¼ÿêØ}ù§„X“9.šjízß'5G¼¼ÝkÒ·”2ŠÅŒièþâ´·X¹¤æN™Nâ>p¢Wç,Ó¹hÆBrvDŠZ¸ÉýÄ¿s2¾íЙµJRwTG»B¸;Ô±n"^^JhWd· ‡' åÏ\.¨‹NÆíÀ×*-£“|i© CÂÃdb¤4^g;Ø"~¿Ì6îuœ¬TÇ?©´¸XîGžìe=[GŸ §¯¤b,sÔj=x.ˆË*Ï&Æ£'²Ï•+˲d Ÿ«¼-iü7(Õì‘Ùq& ~-Ù1$˜¤=‹‰vm)Å÷¥"‹,é=9Z5¤¶ËHɾ8 ÛõAݶFt@I9ß5Þï“þéϨUÌr+O<×þÍí"= ä,>œr«÷Š,“o.ÂÔÓÉr °to&ÝSUg®Å†|”3¶(NKvRÔ¤@³,H=ƒ®qCr k¸\Æ.pß¼“Ý:aÔ§çi+2·X»OôÚ‹áx@Y#ÜìNEìî· 5^ÒÑLöM{Œ 528îÂÇ›a´m†{l¯1RY†Å¦¤·<öa±‰™5©“¥Ü1ÀîN¤”´9ËJVßáZž!j6)E)Éë‚’«×(îÇh}£íFÇ‹ˆ±-}¯qÜöBÛ4=&6h»W¹ÞnHÃò`÷÷ù†)ì”)¬°®=–j¸¨£©ì›÷ã˜ÅëG ó!vµŸñ†n¡{¦@ÛÐupîZ®C&`T ”‘# ïª~I¹sŒÜi5»°ÆWòÀø#,‹@,6Gd–»ÿ–¨X6uð>B±£Ù ØQw7ͤïå››c|s°Ë†ûq³ywÚà -u¶©x®Èh&û¦=FЙ/B%ÇŒaÄB†üfŸßµjÝ9³YìZ…U©= -•4šn¼ÏF;r;äÝ}!ë³ÅÅV.ÜfQþzÅÞ&¦«#\+Ãâ6Ñ‘!s±É®B@§TÆàkˆ^ÙÚ5ne=кêV\¦V¾§NúŠ)Þ€—¢‰!*YiÄÉ Û9ïî Ûòõ̆¯lƒsV¨›à´çXuʶpÛ)>f­¼·ÙQ›ïöoàÉ -’æÎp+yô¹iÝÝ=»­¸iv±¢V7ÄêªU‚R$˜W‹du§¯?¿7”hC£·êÙŠ¤RqŽv‘ô½Åp%4m9·V¢|K~çªEkngµéÆT½o ìÙ/£µšóþ…Ä"„‘jº-"`(¨Ÿ¨±s*b2ß¾Ú¹©Gkw"Íü¥ŽÝgRžÂ‰ÿqC †Äq9òçY5_Œ$ŒNâ&èbG³‰ä2‹a%´häDeZ1d!ê)%zü"î¢30thl¦ˆW°°[2²±g,¼ÑªúwnжÄ}TŠ-ñÒ»í.Ë®qò†á.üz½n÷Ô­QÑìVk¬°»] Y¡5ËVhkúɆ†å"¹>—|`/Ú—F'Z¼Ñ©[é!M ègï8›œDÑNùÌìõb Ü•ÇÏf*Á"ÉjШZÀ“ÚÚõŽ¨órQalœ´Š¢˜wæœÆœË­Ï«ˆˆÄ•Ü$|Âi ãFigÑSe‹AYP°6íIÝ8x¿/¸[ ëp“²AˆȡåÌB'*—„ÃÁ(ç±òÐX—º$õ­Öá^Qƒ²kµõÃù”&­A!%˨×Ýì[5¬8Æâ]6$Õy"%0K 8‰[¶“eÄŸ‘ËB -<Å`•q&-´ƒ•|,A ”cÝîÜòA¼^õ±t`VIkqÑ]Ä›zΊmq­—× ƒ³ÖÜ@ê~Ô!GçňGíãgCη—MyêûnXõ€…¯$“-]6Àž½2ØVÃý7ܬß|ü‘Ü¿Ã>â -C2ä5CòÞ·Æ»f³Å6k’VÃÁ¹9:a‡Çñ* èÃ^YnàkÁ:×jVHV—´ âAÛx»JQʿωµŽ£¥¤å<±`e¢œTØÅøë9iÙ]1¡aìW²Â½’®‹ÖŠ8w'£ÜüŠg+̽E 6Î!£P13êUo¹ÕŠÇø (ú×d9¹ k|W“I=ß$ŠºÓ¬§¶ãKóÌc{­ø”»²°:‡\ã‰^¹!ÙáÕ|Rm0¿_Ä ¾<’’Ú•]b±?‹ï<äÒ]'á]¸Æ°“' -Ó#+“\Œ)à; sì)S1aÏÓS©CX"Au£Zá°VEY§ÁCžF„%¾&ö[U¦[n, [ÎÞÒ2“¾ÏBUì¹2‘LäZáÀ|œ.ÿ¤ý¥žv¦ra -ÌB—¢‡íTç“Ë ‘VœEÁcnv(âÖh <½9ÄÙÕy†°|yÎ[ a`øWh¶ký– ²šô}‡îv­Š†„1$¡½Y,Ê -u6“!ž‡+²É=Ó hƒMÛ -û6¶1É~´Gö©m3 P'õÉQ;ÅÀ‡?݉QìSê%¨‹yl©è\߸¥¸inéx·gÈç÷IèÉrö'¾úZ%÷â(Uø¦U&»JZjAðÐîÊ¥I•ëÕ¬ƒ_Î:¨…œŠWs¦6â¬Uf;àû<†{×oÓ‹E ^9Üf&d´Zo ÇŒ6c¾ÇgXô– -,=a¶VÔ«P>UÕçBÖ šœEÊYÍ«$L[^F—Òë)Í| |k­{ÕÙ5Gw(T»ql=à{=Û^ÌÉ2xåxl«yØüVôió[Sòà7»c·g¼÷í=Œà[´ÐòÕ®F‹Ù®{q­B ž³êD¥ Ô(¶ªåôPÖEdÐÔ‚Nd5¼Ž1ð]Î*ácäÄ<V¬”¹õ¼óù}ûM/FŸƒW¢ˆª7Ùಞ[«Îë™Û SÑû”ȇ»aMˆ»=#>ŒÃ~!kãªÈý–˱¥îJ.‹V[ÔË0½•ûG{¢Üz0õù‰Û7>ä¨_uc¼3ö·Iéè‚]-¿D?^Üòq¼c1ë…‚F¥CzÞÒnϘ÷/Jß<,ÆÜkµžË¨³¸É¸±Ü-€LA$y -T˜$½ûÎW~‘ƒ0©S}æ"šQîxa ÒØéÐîYÃz¸æó%c]«jÂ÷œâÝ€…M Ø8«œ’¹’Çl{x¥oaö+ÃÊ™nøN›U®Z.V‚š]Ù,^wóVIv¡»30ö3½Äe…ø{ªÛ©\Ž6ÓÞ‡Ÿ%2 É+Ò­ö~¸ÇòF³¶±­°¾BFßÉý‹Úmïi‚„(þŒÂšª]bùæ2öLZcfÄÑ¥®šNN³©(]èeÂËÅr¤×?QI ÖýÝ^Ú¶ )YÝ“TúFµkõ­cŒk0=£C ›{ðEƒžô€éŽ.ª¶•õª”ÆØ«ÞÏám‘–ToÎñÕ÷Nóh7tâÝ,¬ã£å&YÕ„óM|豆#ß6 ‘ž?ÃÕ¸O•ëð†•À¬Z- q qþÍaíèœDs¢8ÒïY;õFD³hb´“&ºBՋʆ{Lö´L˜¯‘ŽÍ\» +”™“sÅ"Ï>ä§CλMoy:r–Ìód÷íá.¥O0lt¥j£k§B°¨äÙn×ÚrMã¦+z3B¯ ¶ÈÕzžªHQñvÍóÕmèÌ I1/HÃ+ã²ñãý˜w;ñvFŽ°$—”?îŒ N㌜/©Œa‰.ud5|x\ÁHÍx­%ï)´D~CÑv¥†k:"€oîß}CTå>®µaqCf¸sÙ솼 ÙÅ€±ì¡¢‘è…zOÐrDÔ•ÅfÉ=Fè˜Újè€N”ª¾=9c±8}L -”í”ņ/–#Œì%S@/iœÛm[+üªv]k  @ZÈÞ®V_Xs=ßuÞÛ}£Æ¬ŒÄQw5Y”³Z”%D˜lÏêÃßg§žYÉDZžõB@uØí ¶ˆ-Þw÷J^Óúõžåk&÷Ñ;‡£Û;•‘}~%1¶û Â3¹ÎÄ1øE¬Íù-í¹ÂÕp?Ûe·xy''ßaá ,÷ ÍÌ$6–ÆÒÝŠ×[«íÑ5 æ ;EgŽ.&6ZF -fÀÕ‡Ô§%Ÿ”./×ßmf}Ÿµ Ù”äÙ¾ëózìn°‘•~=ɸ[ÔYÏC<‹ƒ„îPe¾·òNÙò–XôÑ€mŒøˆíö’ù+°g­† ;¤‚1½lˆËƶb^Ƥ¶œnÌG ôIëx¿®G0®DàÆu‚Ý¥3²Ý@O2¸‚ΨXM†vÑôÔ}QËp‚œl„ÓÃoTGì!À<éT}BÏ"ˆÆäÈ ¸`³ýh29‹=úÊ«=_™+=q% Žõö©9r¢cc¯»ÒTÅÄpŒüÑ„”y²(Ê ¯Ýômom¸¡ a’ÍvÒ+çé!+†+—Yb j‰?ª˜XjýÌ1W{:ïg[8*j–ªb6]¹lo?ÀËÓù½%–«mº”kF¼‰ÌåW{:·÷F´Ôòàfg™ A€a)ïÌ9.°Z¡´·ÑEŒ’æ;ûjÛåÕo£<}Ò6ÒÛi¦3³12ѧPú{—ŸW"võD6;&3ñ–Û8¹Þ¨@ÎÉ€'`šõ˜%U˜WUá–l)9$ª¢1–M¡·PÝûM;ˆPðÞ‹je¥É‰*n±b…÷Âa¤ª¶Øƒj0Q®õ¦× ,ÕQXÄл×JœÔƒ³Ðë‘`5}øÅ›³Åƒi¨;ŒÊÅö3^ ܬøtÍ-Âýd!ÎuB±2Tœàd†o¢u^Ž®‹ëãôAÐÐ? 90ƒÀÀª1rO:œuÄÒ%F‰ª JÓ$I#€Ï‚¦|Þï@—}æÁÉ¡ËDˆxÚzžÅ"“8¡z#YW,´@"Ô˜‘Æ d‹æ_¤H‚Æ$ºéöaê$K©ñ'ŸCG‹äúbUÌoA¦°<>̦’ ¡fÔ‘˜¤–M8†.‚‹Ë³!|ž£zßX(Â×QúºpêX£Ð„Ý<€±C´p8 X+2Rxf™/ÅÞâ á¦J±ú8•žGÃ(jÀyÄiÖëjÔ”I}X€n£)ðbPF o´qWnö–ÍRS‘¹©€“ñ)ÊVöQ7ê›tï8ö½kt]>M¯Så€|§4M©LzPÃN"I  Ã@šq Z……‚Ž'}D‡ŠJL-ÈÁ”<½äYQà0õ¹SEK¨’χF¡”Épf t -§Àr“Žç‡vÑbÒoäðò®¨éTxs¤&’ÍrŽâÛìö­YxŽ ‹X¾6)™îôÆ9èåÍXÜ’‡ë·¯®° š9òíϨúø\”צvQm;ÇÛZ‹÷#_ɼ.øçxðƒnuŠl§QR\3Ssž&×PUH_ÆÄÑ“õ2òè‡2ÿ ‹è0 ± 3…rõˆÞJxïvÀÚj˜Ó2ÍVl–*6F ›ÀtˆL‚bøL}êºÌäÂÙhÒQ`½*^F½d' âwhãÆXã}F] f1^ñáRÐ%ØÆ&È"QE”ͼð-Cgð¼$2ŒÄŒäíŽk,4I’|t…m2 '‚Ñ -“9j`»Ø?Œ‡Oj‚ö9ž]¬L…ŽúÚ¤5+¥> îðÊòÐ’ÙWBÆ‘¬¸œÇ°OÌ?Œx°Jú–ö‰ [±À>gÅÀ\A"ž1û¶ ý$î„S?9Š6â))VRï8B‚69‹~÷¸#(ù­\$î‡ÞÓ”Õ ¹Åƒ±—Õx†È[DžÃK6HÌEæÁj%¬P,dØÁ}/YÇéˆlÜ“Ø_k>PÎrWa˜¯Å¢#ÛÀ{Üa !RæðàÉv³³D— 5?ºÞ@yõôæguRŸæ°V˜õ ZH/"¬9,Gz-òas¶hhÂË?Hvx'BÐP~Gb;~ÅMœëÎÀÊىШÔ^€aŽºPvŽ;ôO0QGܤ5ˆŒ@…&$EÏ£E9h^È&PxÌŒg£ã,ÊŠ«‡I‡$oH HýûƒƒØ&·…mš€™BæT>[ÄÖƒ›µ%œü´±•«7×w{|ÛÙ½Ðò—šüRË_ZVZþ§-þpssq}ùæÀ¹µÁ¢«öùh˨xdÀª‚І6¶‰­5pŽjðó%<ãíAJ"týìƒ÷ýÜ´¯¬ ÷`¨Þ°ªx­8Ž¡Ò°} N…Ñ©-,3A¨4·Â¤:€¡—RÒN_Jc”¯ƒöãÈuˆ ˜QT$`ŠÖAäËLv¬s…gd5üBJ -ºÂid‰*&&ÖuB’Ç4ƘñFŸ,å¢>2Îl“€Ò^¤äcT` e`Ž\ÛFzN„#„ãqÉÀ€5æè'íV»¤Þ$Á¥[bÖòuF©LÅh -6;äGˆ¸Bc,ºž¢D‡õœ³¹0¸´‰ÉÎòÊóýX Ã;ïÄ£ø‘º Íf’ÃiÄÇ-²}L|[jÃôŒØ´šh€˜NoÙ†ÿ‡ŠhïtîÂ^´†­_„ß±:å딩>åŸPZ{ã-8Lv€Ør¢ ;×|JEÎ’~~_Bö|Cϼ#1I ð™.\%#RcsX”«'}ÖBÉ|¾±EÂËúRÕ¬;ŸÛøÓŒLŒ!7q¨|ÊN_ø -ÜÖÈ+Î[ìâҢƒ ÏTá*râ¾nŽ}kê©gš$6O8çÖ](œôS¨7~\ñ­sªÖßÄcBw>§ºØðÒ9äMÄT`rhq*Nâ°Ç¿u,~YG»r‹ª:´ž“ØíädÝiàÄs9 A‘ƒmN§>çÄÙŽÒ¹hž6ñ¸’{‘g‘ Þ¸ÓÝ;ãG×Á‰#U^ÞºL£Á—)TÎAq :^;×.¹#Þž¯HâTkÑõw”dr°{t ‹‡8qL êZ9¾ ¹ÑŠg¼)6»<5C£¹›ïiö -¦QzS!~D¯|Å’v,ÿ)h¦ S0ýŒƒ˜qð­)æó;à÷ÇÂqp@œÃ€©¢ÞD܉9œÄ…ô/»=É4‘Ê1d¦‘ò{ áê³›‘¥öãì®G£ä%Ãc±+Ó©Þ˜¤ô`‹SËUÏV;D<ª¤òœ—£Q»>î.`p¸J#qÚ§“A¾œŒTWsûòcˆ-{÷FŽ ~\D€â%­Í'Ìõ¼ß–a¯= -Ø­²á'î¬4'ÎèÐ)ï÷px ‡V•qX½í f -q{ÙŠ–Ó›+Á 0 -ˆç/K—1wgLð¨™ôêÊ19ÔœâxÚEuCùð–Ík¡·kMM«£ó¼l Að³ª@ÿÚW$RŠNœÃ‚Bu²bK\‡™˜¸ŽŸëan ]à5¤c ]›ÛVlEĺ‡ãNt\ U¤&·GéaretM±§q ixþ,„EÚóFüGwq$4—….ƒ`¤&qjæü{•‘˜°ò ΨPP¼­Ó‘žá~2Osqb¸O*’ŠèáÄpª-rž¦FuþÜ©’ËQ5°EÛy £e¡¤Oó½èCFlP±ïë»/ˆEuj`=ÓAëôÒ+ïõh§È:‚ë²[ ™ßÑ3MûT÷ñ÷Áäß -\‰®h—LâiÒÐk»p†hŠÍ+@‰U:åwÙ´Þ(W¢SÙÖ‘sUD×2—áªäÈÏu X÷*ÊÑùf œåÄãHœúØú -ÉH³ sË[=h4ÌÒª Þ'KODOÜ[¡É:].¿sâ¦?“¹bbÚëuÀ¶†@_ùÂ!wÉtbíˆ}îó/ë°—(…nÀò#z­•tøJèõßN\“\ -£cZLè`Éé% qXÓFäCf†’K—e¥á%ÄSÖÛ¯Ù¨AÌ fÇ@ã§9üŽéhï°{[ ¬èE5ÍÔô sÏÔ¡'Ïg %¼B~‰5%c ÒZ§÷tÐü.ÚÁ“IJ‡j¿·¡Å¨Ç°Ä"c® ÂOЫ?ÂF/8·NŒÈu#×î¬ïs):3–nßÝ 5¨O~}$…12t#Bù4¢—”<-Î’5'À ZÌ;üÝÒµ‘¾gÓ“M -6]úµ•U®ÉÓÑe3t+Õ¯d|ð¤[mëjäàýŒ8ô’¬‰;N#ü¼¥] –ÙiA&,ÜÜ~tsÑáíô9M|¯÷qÀqæ0DâìòRœÄó¶J/3z‘?©?à€wÇ•¢%îí‚®e²/8´Yä¶= tlÀv=!‰ - 6#ÖII;åéÃ,è12/D1I¨óÐ:Ðk`WÖ ýàÀxq^Ð.'“È kó½°¦°ü2[´¶ì­XGx~I|? ,.ÓR<ʉ‹Þ¾ŒZ}ÆŒƒ¹[¾tÎꄹkU{“ßÒüq…h蜵¬!¸+*ÈGkù©M¿ÖW’yàI'ÑT§ÁÁæ^%ôæ¶[28¸÷Ë’NS˜ûÖdNçÒb1 ®ˆ¶ŒÄ£êX·+êðÛ5÷êÈ•@°pΘÑÓ¶[¬NB8È|úklÎ)¼tÓÒ¿µ£§#OÅÀÇç²ó A¿'áµåš­bX—Ü5ÐW¦Pq¯MLg?\G}ÓËÒóbÌl,ЭëÇ_ŒÁØŽA7ëìè²NOṫ;I+ÃT»¢$š¤¡>1u}ŒCxô3çÄÖú’Wü>†«]Û§=QÓTjå`YÂéݽl4*ÍÛˆå¯H–Ý Z¹Ú”°ºç©{PŽ\ÝoæÄ­R¾ ẓçI’2¶˜b‡CL£‚y:ßZ’„¬Ñ)‚w©ÐÓbÌC4ÉòÛ/îÁô'Z2lÕRYf(TˆÅn$Ò0‘4bNzjJß6ñ óÞázh¼¸™?¦Wâm{lV¸ïÐØ)Ï ©…Ògø?í\S-÷ÚL}éIX_âÐÄ×tÒïME`tëzF„ÅaDêÓ÷‘]}êòÔ#ïAÔåì^uÿ¦×ðAœ™øÝô°Ÿâ¡¶Tìp˜ëý¿ýà‹å„ie‘§ÑisÛní ŒhVµ £x?­BŽô5S¨2Y&‰‡+Š>nU®1o{b:âT‡{Õk{o©F$ùøm¼NŸé5ÞEÇü2‚„X3Nÿ¡á"!ÄÞ¢Ö³ˆ-‘x±îP*(zÝ’3[$#?Y‰ùþÃCÕÍÔò¥§ÓRó~kyW µ…Ž™Y‹¨w«\´ž2B‡°z:v’Sök°rÍV“ÚtÛá½ù#ÖíT¸R¹ÜìN«£ÓõpUMÍoKÕ€™c†{ßšð´Ø MºéÑ‘/÷8†=¼¤@§9tó‡âF·ð;ˆÛíå$.Å^¢38 =äžèŽŸÛnésán[ õAq2äÕ4UÃòvç#ëp¾Í"&hý  Xþψã“Ëe/ÏI<-6˜ŸFì2VÕKuë<}£êxXWJX"f,6®F1zèuâiB2`ª´'~AW¾XÖ|’XãòL„F=@I9†VðäÇÊ"SÔp߮Ÿ‡‘+ƒX•Âv츱…Ê¡=,ϽG¶jßVUÄëØVddHyU-å©d()n ;ùeß]?±jÌèbÁ:yÂæ4 õrÿT¼´,âó:‚/í|‚çÂ;wÞìîÊõ‘Ö‡FÆQ7‡¾”¹ ÷µÕïÌÂd„Ú!Í­P&GÚB/ÇæÐ%öð‚RÑxúŽÆÕ¹ß}´[¤¬ è'ÈÜ=0!ç9€”BhÍHKfŽƒ˜cë!Ò;RCHŒ¦go“ÃNˆ(¡uŒkì¨4âÊ!¢cŒ?LaOκ¹Àlµ*ª¥ ÈÈáe,ÈBûŽïy â+ßø|_~¢ Ë͈]ìËO(ƒÅuóͪő6ÝæûŸø ëñ·‚§eDL«;n­ÎEņXsô¡;Š´q³rYMô6x‚Z‡¿Á~nè#+âi _—áé‰4Ãÿ({xt®ºèg~|*8ƒÄ#µ¬Ã².ÃSbÍ †ƒF¾5¼ÉË4ÖÒ!²öG¤¹h‚Ë¢"‹«±zê®s)Fbt&ºXc]hæ=BOF¤ß̈S“gtZu~Àq¬L3E,žaq«;ª$P ùjaœE÷D-~[×Ì@ДÊÔÑì˜ß# inæÃoNm^QkôÚŵ•º6y'û†ˆrúNP’îh?WB×`ÈѾ„CðÐñ6ç±D§Öpq&;‰ÎzoŸùå©t]8œ–h½á÷vô•j Ê8@<ŽËÛ ì!™ô©oÏ…Æ{xŽŠ%\ÇnpÉ!/Öb5#ÆÀtK3K+—aGBˆ²´·ˆ)~ žÊom½Â[æË„¹lÐÕ OþBD9Ø`öá¡Oç@yÎäȆC£‚('ßÏA\¢Ìãg‘}žû;ø¶’Ip sVÔknGѼcê…^ŠWÔ&‚aŒt‰èypDíÑKPÀ*oéݲ½+ú¶NºcF‚ŠC™¶fq‰9ö=Š‘eæ;²‚#ã“Ý ÿ$þÂín -ÔÎüè26ìµµäþý÷…•B]휨؆sµó2k¬ìýûýb-¦§ˆØ#ýtÏDszÚJØ¢‚itXlºY£O»¤ßø_âkÕÄIŠ8Är»wzfnRÈáÈàoA\¸j­êØ}Ӌݶ.D‡>®0†<Æþsæ|Ã~É¢ÁÓ¹Â/çÀE8#gýûÃ÷ßV5NE‰@¡ÕÑ÷ò•'ÈóKyÖøD™n ¹êÕ/ýý–·èKáÕ:¥‹1}Àu–oî@òèDPêB×+Ãb–ŠcZxw]ȯlöä-f¥XVŸS檕Q1 ®†Êksô•UJNTL½"Œñ%iÓ$vmƒÇhÇ° F\¼{˜æGä™àRï°ÿ¾E—uÓa—?³ÙóÏç?yø=wÌÿˆ Q·v³¦åy.ïI4ïÆQ@ôÆœ¿¥–vÒ–ÖÃ-C#ÊàD_Ôâ*!0½õ·8/&ãX¿4?,ÓÒ)2 ~ëQá>cû² NÆéÅ3PŒ~.ŒÆÀB›ZÇý»¯CìáÀÆkÕ#JlªÔjóiHÓÞ^6Ïéub£%¹ð¤~‰CFÕeÊàA°âyÅdp'²ÐÆœ¾9Rý¬‡v$cÌ™i^ÈÇ·\†è qæ®M²v©ñª)»ÊúÐHYá$3H†¨Ö5׬Yèªñ (Ôm?G -²@l¼œê'ƒóù.ûÑ"ji=L(2¢«éØÎcìu¹gîBÈ¥v„ðˆì{‰g‹Q©ØŠ­y( -ÓŽ0¥LƒÀaµúÄ4¹8}{§ì8Ðç¤,]°¥£ÍRkj¿§«yâÕw–¦>û¶M`]AÎ0"Œ¨_3# ×3Wä@†J“<åÒêñä83Û$ùê fXdˆT¨r/8ñ±Œ¯!7–¥¸´²y†N5”&a[ЛM™q›Ù›ñ¼¨*§Õ/šO¶¿szfFŒmî«6¢’rÞ–p_bS‚;ÕÞ™’$©÷ø6!½¿EOmñ{/ÇùþÀçû"«áÀV8qlQííœZ¸Iz¥šjD¯A„ÊfÄ‘Zl_eÈ×è -yC›4¡¹ÈiáÏÂA5gû¬»#ÎP[*pëZ£ž&M œX” •ã)/µrda:5zØ|RÖ½ý¿ô6<1„ó-\\K²ãkå.ÉéuVU«ð²Š[CM, œ‰‰DGi›Ñ}ä]Š¹iÙÕÍx%Ì•®…vÐ*óù(ûåoĉdïX ©ô[h¹X™‰æÎõ]#º›Déy4«ãµDž¢sÝ›èî4¢·Üà:xLÞ×!‡Zy_Ÿ8™õ«¨ aûgÓ³jÆxƒŒ¸¦œ·>Öz(ƈmhéêq© óâÍoÑKx€ …¯ù±Díql[ò&×zUJ‘ÿï mšªû ]”0ëÞ¿TrÚù4Ö+¦5ÒãâP‹±„Q ›Ç‹ ^ý,ç~pÇ;$ÎRh˜+gÑëºØà.È)Ò«LþâE.ãÖ"ÛËla–”èæÙôYžPë,Èb ³8"Çàþ} ëÐW¥5 ïüˆ^Û¤ª×é±íK/zÄZáãkÄÙÂÙß*û®êMªBæΟTéP!ãÄ“9N¡Ó‡»0\³d∠,wL‰#÷Yìœ]H×ãÿ}%z-±b&®4‘’\Œžxô¥¿ßζó€O~ÜÂÅ,Ÿ¯Å§,£_BÃ’ à §ôë:Ê2Ð]A²ìp©j/—‡®ÎÚЉØkP€P,«JÝÕ=V ¿$z”ô9'11 ¨ÁQ”yÞñÞ±E~¸Å&ð²¬#q;ÄVÄÔÍ#ÁÜu+0Yò±&ø ½í÷T¤/=,VwÒ#hÂ44+G8Fa¢–UêÙL.÷Žáš^5"Xn^þÍ?KúŠ¸ÑQÒbtFþŒ* ̃G¯©U—e†û£f“Qq¢å:o³”hïZy•{ ß­ÙSNn=«õ¡Ý`ª!œo¾Ãzñèû@ÄöA§­dg´I‰–ç ƒºyKýr%ʬSãÉ´{’Eô‡‹Ä$5Ü¡@‚ë°Ýˆ¼F‹œÒ™ºöÀV8n™´NÇÅvQ|Ï‹ä”7ß‚îÿº?y."–a†Ñé¹…[¡Ê€µŸ³ ¿[ ùXæçã c㥠È>CCÔÃ}1Í°h<%%¦°ýí95­í›l ±W½{±*',Í›O¾)oðb.}<ô䣈õ`ÀøHe¨=¢?„¦ù:w¿ -é-b+¾lçÿf' -K@<ða-ÕFgòƒ—LðÇJDÖ²Òg½íoå&ÕÕ*=çu„ê$³rÎÆÔ¾­©Kå+QßœkJr×”Q.˜(d›T4†õÝçS ³áD¯c9$äÞlèçPg"=ÃcXË%([{Äm !ÿÝÍü-Î*4i‘wb=o¦"Ü¢ÜY16E‡Ìywƒ³ÕÓ(±n^3djäVws…k –h­Ñ7¡G†íñq‰oóï+öbyD4¡šÖ&÷£ò;+[/ó@°÷$öHñø/q`1… W»’§m0Ô±1ÌÊ÷"ŠðÝ_þ¥KÔ#Š–wNd.º$BÜoáÖá*³–,}Ï^?¢cOÎRÈfÅÊDZ_JØ‘Vütâ±ÝJfA¹âhíØ -”æ|L-ôz§OÚ³w(²UV*xj!›j·Ím`9Æð6‹¯‹f©‰dþÐ,ó‚û;‡ÝØ -»QÖˆcñË«fYä:°®¸=T@(þñ„êˆBÐM3Ú`üÔÍÝTÈv%rè#8¼ÍâKþßÄ°‚ŽÁ÷ÁSD—u¢;ì÷‡ï¿/\³¸Ž´CÈp·Qð >¨æ uÒôx[/ˆëéåó2}ãßSÌMø€ð8ù‚Ž•8äsÆSS zúhê†(½«ŒÛSL¿?ð\,Ó–‹y Ó誯ëȧù’“ÊÓÒÎV¿óÙftŽÅ‚.L?Açƒ_¢<ÛˆU)Lrÿ×Hmù.±Vر ß%~(rzÂ×utU‰3îµåè,‘1°5÷ï_&Êž1,o‰ªR°EaZMQvÙ¢ˈ%²5ƺÌTe—Lªâôß2²ênwÑ®å«5‡+ÝŒþ®•Ú -¢Þç+•g$òZélDs(Ma¤Ê·T;F”­/{l˜›+,£C36Ž’ÜÕ¥c1^N"rkì·JDÖm1efö5–Æ宜(KD§×#7)ª¦ˆÖzCšÊøm5r-ªŒxõ¬…""ÊF\x§sƒÃ“uá9±äÏM&¾ÚßÏQô÷K°äé€ Ûß3}©òØ°hu$½š¶|IÖy¯M”fêšä"6Ið4þÌØIôÙòIšŠåã—$53Û‰9ñHÑj¥· ƒ#Ì»U>íøPƒ'•-[Ù©ªú¶ó¿í,5%%+Q#ÛeËTgóŒ4«ì Z^(ÃÁ€Ye-‹‹2ŠåiÉ‹¤'óZÄì·8ŒC¥/7+žî[Ã8…ÑŠFå”1õ>8ÂYfƒ4Y;Vr¿h_—$2Ì[é‰7á’”"Ð#ܼŒ©Ð+O‡«¼¹Íܘá’t»ØéJtu¸  ¸7—oÞ -°Í[È°ÇPõ1t>'ÒïtŸEL°LÆWP|>ºbÑ"—¡ß¾ßâ8ü›æIkᣫòh8}E­)¾‡\d:‹C{RKîĊˆo¿¸7®2}ÝþÉ ~6½ÐwI"¬MñÛÚOEax Y,R=2$ß"S{ï?öuY”Ê¡×Ç8FÁ8 -²oö»N'ÿÅ×mŠnâÇžGÍ /ià;ùØ4 &0ÄÈ”©ÊLM«™êζ -GýX¤«ñÝÈðM†r}v᫲Íê‹ú¬§4pf¹QE7ñ¶<ûùó¤MVn®*=Á$1«Î‰²äbûç¡(ÝØ\Ï+ž×ÏóVWÑ­øh‘êžûÅsðÆ'~"ªù˜Ô®~D÷1§{߆ïø>ZyFK†'>×YèUtÞ·®aÇ+ ·[Ç¿½Ñœf&…ví¥]ª/ð\¢ïß_6¯„æá—`UCÉpÇzìsÆŒ^â:Üù쟨 -Z/†å~DïÈá5:kÄí㦺‰Âࢗ”˜‹/ÅB#I-v”+ÃÕêlQAuÃõøÊJŒXñ†uÚÈ/:Ge\jÄ ¨[A¡c)EhȈ]JGe¢ü} _×½ž¡=ì@³é$Uõµz?Lÿ B ùmïòç¡|TzTr”JšîõÏ+ho¿ÿuÙXé·DkÞµ­e§<Þ¿¿Cþ‰—ö•r9Ñh¡eê܈«ìºct0_vÐÛÑ$ 7|à¿ïe ñ\¯­?ªJ¥¦7¦$.t—;QîÎ;ȉîÚΰ"ÇIÏá¨+«³x³u9ÈÞ†pµÂPtëN™Hr{¦†O&†p-±tèmFd8»FièÓpBA§iQ3»Zúë3¦8¼á:¸å6Ñ´.ʳôËÒ%¼™-2HÝì†C¥)“Û&^1ñvÍŒvo& -W[¤þ:ƒÂ_˹É,~Â×ecõB¿Ô]š;’jÚ „ˆ%1‰²±vĽœ‹ù’~šbx=8«~¶7?·’ÎËۮÃõa̽ d /D/'òßHdèr"!¿8ñBÌkåØóÕG÷9û'G|Þ¾•TÉÊ…fõHŸwú® -¹ó¹þÄl¿§y_îSbFªg‚«9«F›ËO¼ñ‰Ÿ(G(|q¨Ñט1 ¼(5±—¯'#YF<ŠÆ¿{z}6~,ï³ý½~3’úïcøº(rX1j¼©»ï¹rë[ikº„KÀˆ£u®çžP9*•úSžjØ–…̆IÙ4ºÁÙv"ý÷±]B–òLÛ -¬ÂÓcû3!=6·àŽrÈ“¢@ÞÅÊ”*ãœéPAîcv©Û·1ìá%©bÓLq®¼å¨ê.ì{V„Üè¯|¾Ÿ€°X/=ðÏÿÿý³ÿa\¾ù3zðÿ÷ao¾Â ”…žÍÜ€M* Ž<ÒHõÿý?#4 «öϽ¾ÿ±¤•ôÞ'µáîGto¢ úAh©ŽŽxNì™xLôZoâoýq#^?^ÙqB®l'Ô=†¯ÿ–yÝf@7²ùd­Ú§iÒ‡èð¯æú ž€+sòÌ‘gý$¢c$"”_fObÌ~Æùúñô©³xHâ†Ð5ùÛ¢Ä -<¬à‡µ~Þ˜Ç]ü°ßo«Æ8©NSKû¾„\Ù*\xë€TYÕâŸ×î0ºÖ±¦Æ¯{²±{oóuü"þŽ•˜ÒõãeI–KlÅdÈÂ8¾ …]\Û÷%ÿã‡íyÜÈO»þxDÓûªieÛ©fieoKK[|l­„ΗVã÷âkŸnÇt¿ƒÏp`”I¯æ/b«ùÞZo™êÛ’“KîåL¯Ÿ«ë8¡W¶V •0f7ŒbÉø¿9æ¾oQÐöóqç?“Ç3õxúnë¬Íèóœß¿ÿ°¸Ü KŽsD­iúùì ØINì˜U&ˆC_F7=ÿÅ\0[C÷[¿'ß4¯Ý^o+@âo­atÒåcKÅì•s„ªt÷2G@ãô5»† d¿Á@.'6Æè«@·ã°·ývvžOÙ§#ùx~Oúmç´½Óé˳ú²†ñ@<,øÓÎ|ÚÅ„ÜÇ÷(Û/àÇšsöüYËÊd³Õ¯dGˆ ë8£:âšµ¢0XuŒ«™?çŠÿë$HŒƒ@D±ëÇ¢ýd h&¯[tÀ¶×1Xi88û€‹6Ýcï˜Z[íÏÒù{< §Ù·ËXÞ·+oûéÓ²<.àçÕvL!ȨȈNLÄ -´ô{. €6¿ö‰ñ;>ˆôÅ7x]Þ»ðí}&-d­µ±}ýÔª½ñ\1-닲­v¾ Õê,r^¯“ú´×ãù=·¿3”­÷]âTB·¼/Æãª}\alÁ«e­/åºõrlm/pËb¬p²ÏëÇÈ£¯lŸ—øq7ž¶ía‡ÿî¢Ê7Ãÿu¼³çP¬gÑ¿V¸mÅãûûÐVݯïtþ@’¥G• -ë~ÀM a -èé—YèùÊö6æ¯Gmûíg¶Qñ4¦‡Ñߦºµâä⸀µ¥ñŸN¯{ Üib«ëm HŒ%pdì×›´g›u*ËÆP.ÇòmiBã}\LJÚž›¾}[‚ŸÐ˜ºcâ™ßÉb{¡Õº/ã¤gvcÁÉ„vR\rýyci€?ÿòq•² w§žZÂúRXr·%‹¥yXßÇø´m{üxnëö¤rß17¯4AwOê·d%¡A+CÊ[}µL»“ÞØ͇åQ0'“èeÑIü­%;UûòöqA ü•m†s‘cÈc¿d^ƒróm“¶™pßÑǽÿtPOÕãù»­ó“Ê}[Ü©Óü­Ž©ú;€B Wµªu¾Ë¢uB¬Ji²æÕÐKsNúD ÆO Ù:ÌUŸßV€ÄØ5Onxý8 t×Ùóú^èc èÀà¬G ÐzÉ™+»—™½}8‹Ûy¸ìûíð<³Ogòñ?õÛÖ=éÜ·Eü ;ü¾âO{ói#Mµ™>ÐfˆTÀÕ5[?×2°ÀÁÖ—ê$ Îȧ´¬bÓÿ¼.*«Öµ4ø­2@™‰qêLãíc‹‚;¤ó•­¥Ù¹áuIþBl׎ÐílZFñ§ƒôxêžÏçÓa¾iÜ·™Æf=,Ëã>.õXà“\Îg8Þ ›wÕ¤Þg¬žÕÄÇV xZ,UxY^¨â¿6{=^ç)b¼oÄq¾~\Qøʶļ^ÇP¨ý:`o¿545š¶ûñh<¢§wÕ¹o“ 'ñÊ<®Ý§…ÀÕ<éð¨PÔ Ý[2Ú‹+b,4_˜ëǽ®^Ù~ZèÇ]yÜ¿§Í¾(ß–óÚ|à3³4|÷ž‰„H!¤gµRuw`…Ò Wøc‡—ãûˆª5!­$ž2ZÄŽC2T{üz¬åÄðšÐ͇áÖÒ㘔ïZpÍ[&aZµJJÛð]pTK>8žBgÏœr-É£jº§ŸŽé?ŒóÃŒ>Mÿq­Wõm bl§Ð5k÷±™ÖÛú¼©B@ŸVç/ÚËŠ=(Ý÷ŸˆeåC3¼*Eþ-K}š@ãîI_öhv¿Ïfwfδ¡ãŒ/&YeåJYoU^I–³çF‚xŠwnYžaÜ·2Æö¸ï·óq_–Ï x_èÛŠ=¨Û÷Éÿˆþ°RkzÛ€˜üÑ\ˆYëJ+ûÖ²ö Û?£}ZÐçQüÈV4eÁÊz£rg‚’y'†õaôíû·WvÍÅâäF\H‡«`'¶¾Žµ+5Á9w^›\SlØmƒƒþpÏÍÓ!{W·ïûýa×붸_Zšcº=Ö/ùp¾:ÉÊmA/erÉ’U゘›Ö1JpùqìmžHo?1V?>ئֈiä¨ÒØM“K“1+PJþÊ +h…ƒÇž¬$[S]·Öfò ΣA·¯èØêDä¥8qùíBåpiÜOC,Îýè<²§ù®lßçÿ{s_¬Çeý´©tï[Ÿãe5ÇZ…D±~Ýß#Žmó$Ô.žtKbHú˜. o‰Ú±²V<ã ëŠ;åѳ £§O~}krƃc@’–”•ÄŽ -bážnÖ8/˘à‰h]çˆ ¥çàñÈ<œ­Çsø®lߦù³×é¶$ïy¥Í._¢Ó·ëýX;Öܪ*‡5Q†‹ u$Ö:-K¸U=ŽÀ:oº¶ç­¯ÂKƒ€³¤¶ò‡[ýx.OÐÃi»¨Ú·þh‰VãqÝ>¬qCÖ ›3¢ÈÍÒɱ£G(¹­£~*õ¸ˆw>²0ºD;ñT®ÿx•·äiï¶ù¢f[ìµú“pI7‚°H+ɳn—d¢uŸ}o(!RÛÛÝ ŸOãU1E"P+ý½´Õ‰Þú·Fâ.)XÔöº‚8¦_{»1îÃû˜ÔlƒüAl®OŠ¼ë‡o"Øéqe‚ÜïxÝs9@TÔùñ׿Eê㤞Wàq¹>,ìÛ.plÖ›Â_}{÷â©š–ÞØhþ*ÔîXVf$@ŸVíAÙ¾ý -WÖ€ä\ôúmÕÍ ¤¼½ùœè¥hÎcÀN4h \çæõ'ʘl]ít¤pŸDëóQé˜hY´ Aiku iÚ÷­üÖYxØ÷çr_–køaµ_×ìAÛ¾/`,¬ãR8Ý{ÊrøÖu §`íýÌÃl×åÃ"ZHÏxE+>#š»Ômjï*X×e®ÍéUÛÚÜøÝ:à[szøÛÚÛ8Éc)ɤ9z”,ž1á÷Xûá-ŸèÇ;”Õcàß•_FƒS§{#{øñèE6nM¤sõÀ¶%…»ó¾½ßÚÃYx:5Gì]¾¯À–ða¹žÖõÓXeßHÛEz½F—´ôˆ‘v% ©A‹s¨Ãʼnýîħm{ÜãÇÓð¶j_ŽõÛ†Ó±§ƒ!$¯Ö ?íÁˆU'xª™ÀkÁÀ aí &brV46¤S{e·§ã´÷ˆ Ù_mÁW "Ó·,Æ:j8¼nkñ†Ç zÚÉç]<"ÓÛ²=y×okk»¦$÷uü쉾ÖÅéè¬ê X#ÒÊ)ŠLåNšzÔ§Ô}s`7 r€.;±u?¡ð¤µB}´\¢O •þm6—Ê·èo;ôÇí|ØøO§äÑz8|·U~Ð÷ï+³½¯÷e|ZïÛÞ|É5FÒé`u:èÞôµý7iñã"’½QEB-)8ÈIHÇðs¿â¹‹G¼p¬…FYØ…²“a*‘ðØò蛣»^‘Ðíðl ‹Ú¶ðÔÕ8jNj¨Ýı q ]`ɥ…o:yÆD¿@`=´M8”§÷é¨?øÜß&ü¸÷U|^ïO›ãPR´bNI+߶²^†õ -”g4 +‡L Lì2¥ŒU@h>«>k>c¨Š–”R"ÿ¤Ÿ‚‡k˜xÌã4Ý4°Ü¾FµEü%pH£¬Ý17Tñ7Æ!˜`3´$Ÿ¦§‹þ'äñ8=»§3úàv›ixt–åq?­ö0eTÇj§)Þeð\©‚ÁˆÝæ¦óöñ…ŽNyN—qÑíùxÑìîíÔ©âz"s8ÞéEè%Âx&à*´4ŒÎIJËÐ6@8?tv™2ù¬+aoÜCôäýà 8ÎÑýÐ]}ï·Yþˆþ°$‹÷i¥íuìž:â,0ÛÕÜ‘ˆQiðU‹Ðý/â†ÕÈ€Xc"'.F¯?®ô㶊7yEíD$ƒ,ë x0ÄYr8WQ‚Îðˆ/Ùì‰NakÞGûû®ßåGîíZ•–¬Ôwè`¤Iz§ËÅб»ˆ²à {)íàRJ¶ˆíô´pl E•k£Ãóñ‹aÉØÒÅap_ÄX™ÇÜ›ûÒüÁ:>-øÛ²=¨ã÷5¼D5Š² -ê×L8±0/ƒê±!øhÖz¡¯tF-GG€#Â2§Äô²T@dê²¹šFS¬cਛa~ˆû’‹þ¸?;ù¸ígäÓiz[¶'÷ûm Ãýî0\)×(眧d]•ô>šD-@fMŽhRJ®RŒÎ¶”NdPÀœ!)ôq¯˜CÌÎ ¡<‰µyÊÝ() R‘ Ö^‚T=eù@9ÎÃûùq?vþÓ1ùp¦Nßm™Ÿüï·µ Ï ÷ýuzÛ5– 8Tt8w%Ÿb¸ý…dÄaª\‹¶“1¦\º÷¶Æ$¢èúºŸ†éåï’ÕCîÔÇûVDéqßvøÓqx<;§ì¶l_ÎóÛü(æq_®§u½o—ܹ§!&¹xD±Åp$Ÿ&žõõ .Z¨clŸº¦²U×æ\¦NÝ%â(³È)`®"îÅ[Îï€VÇ‹h~“¥À€7!óð¾å«£ûö$â6ˆ/YÅyCný,°Ýœèq¬o><ª¨‚õ/­ûÛÁ yñpÊÏãÓá}W’o+ð£r_­Çuý¸ íÛq<©šH™Å;‚Ø`ýŒ‚–"áTWæE…‘ˆ1dÄÍíãÕ™u2Â7iG¨Rá%ódS~Ü÷qÊi|^PTÞÀùvH†£ÉˆØ3iª’ýƒSðpd>®ÛA¼úÔoüýa5×íÓ"w3GL]…ùbÇ`qFvÖÒ¼Y¿#ô‘&Sa˜«ã蛉ó£ä?Zâ‡Íø´m·=>—èú¯¶Lû^lÔ#³Îp·wÍâ^§›þËýýžåïSþ&Z¦MȆ Ý´=T¨×&ôŒëD‹kŒ–_?n‡ô¾ÍõB{Á…¾‡»¹^&v_™«U:2”*«ŸÞ%½ÐÊÌ-Â5_<JÇ~)¬=CÏÚ#d¹Ôh_ÙÄf4À,j î@XÇB€+Š8–rÎÍðcι¥É¸Nç\vP a³iá}uAØ™H§@8¯œ˜LÇû*ðdý›—ÓõZêô¼nOìò£¾Oñq1>®ÜÓ2?oÈãÞ=oóãø°nqºKA[œã *vj F¾öÎÌÈ05==êÀÃm8¢À¹j8F×Q*¡}·æ—Wâ0¶­dr°iT:?bA,grñ/¥ªŽ)ßâÚÍa,w·ñ㢣t(¡«‘áÓ:<ž¯×ꬷߌV1|œÊ§y?.Òãr~ZûÇzÜÒ§y\¤Çå|ZûWùÅÚ&G4ÌQÅ6‚YƒXÄ/(±Ãªµ‹ÊY™ä¸èãسdo/0Õ›FK2#FnëÛÉJ'Óµ M‹º€“ð‹õ™ÞëÇ´‡ãPí5Û+S)┯šév‹m±$§JŸ—öêmö ‹3u›éÏÿ_fúß¿ã÷Fuÿ/ÏÝúÎý×ÿÖîs瀋àѽ]pRÇÀäm¥ó…þýJ·Ï®}¿òùD¿òAoº-ŽÐ¤Îÿ;Õ6€w$¯îd/N‡,c¯À,Ú9ÿòNék,Õß°Î@Å4˜Õ ¾t¥GkÓÝX’?@„ë´ Ú —" @E%€Y]#Rì¸m­;¢¬z– ÿÞÊYGàPI¿‘ñTõ&ˆm˜aŠ6 È·  P>ÄÊS·Õ;&“£Öª_ú¼b±[’àP»Po„mÄF˜= Ëâùäèzl` ‹l4¡²¦2Åè]’±¶]XŽ•ðÜ ¿ÅÀCû¾:§Õ'pɬG€fz¢8Z°š¾«yºEOzâ-¦ýàÇ#£;³+µ‰ý?½Õ&qê\ºàÉøe­ˆ-XîgÖ´´5è=G3ˆƒ ,è?ò¨‚¤´H‡“ØÑ‘ÝÚnžöøþóQ›€˜,ìãçëiUx­ sj´;;[ý˜óBŒ½‘ Yr¿úëhdÞ¾7/¡Nz‚Úˆ¼D?·ÜÃA¥îÐ;`Áp/P¾3«kñ¨@Iñ÷禢zÀˆ&%Õ´XÅn§ô`#ý£þtÁ c[õšItw8:$_Ðr ±÷P;åàÓÑ—” ˆoŒ´ÄŸÑ›j`Û‘·bx"&Në`~*ÉíŽ+[¦n;ÑŸ#ZÁwY"–àЀÊQUŒ4°ÑNZDBÇuânl™‰]½•„%tëv°;ó"`¤‡ÎÁR÷¦ó„yò‘K°+ÇWBËßEGvK6@D,Ĺ¾\Ø;;ÁU£×ÄIô.Īö†N+C"Á…;t!'o¼Wø1Ðý€Û±%‡¡~J‚€° •j|<0^˵+B™"Ô[ëýKHð8*À‹¬ÿìXÜïêfÄL ]ï~0䤧8 †Ü=kÛŸÏ *s­Q=ŒY*ÃXÐrœÞ3°’œe -û€GÌAŽNô\‡£®D†§ÄgN‡•0¡…=«EhfNŒ½TCóŒçè[ôóV' ö!6>>N™ûÖâQNÈì -ÎT¹ @ÑwØó@ôÒ,sˆÜ#p;vÎÄ û¥¼«bÉÌË9ðjH½´L\Ž¡·C-®É×ÓõI øx7¬’’ˆ‚°[˜pµuu>î[0Ï]goã¼îTïmCÄ6/ñ¨M pÄ6†1‹ˆ+ëÚw^°¤=#¹9è«Äö @í…êÌß’™Gª¤/¼àVžuÞU=-Qvfn„øRæXzTõzn’±§NľҒzÖµñózÛ·êA½¨0X· J^¯&”to ƒ³`+ÎU°V‰ˆ2]`“+"÷-›’8%!Áâ·4ÊR3qc—Z[—Àx®!zjh›á‚ö›HË0ô1sÆø1T‹­>[ÿðRLiMö‹ Ͻ—F´vï24íÈí`ƒ›„Ÿów^V!(R#Úx8,ž¾xÞûþܵ2ïÇ/ y[¯¿Gü˲É*•3+×l’1(ÓʽçX¤9=¥)„t‹é'$€—1ÿ¹f3:tý]³Ãⳟ;Š æì‹ &7ïö`>àSò˜Ü™lð‚YNC¸èRÑU‰mÎWâú  Îu0©SêDцÁ$àysZK¾¢Æ“ˆo{ñûOÝrœëJ´î -Û=†€× ä2³qÀó&ÚèQêÕI°$:Â8&¸ýR/·jØÁ½5a ñ¥*KPóŽâ˜´ÝÅ:ˆ!D6¼¢¥êÀ*z…-Œ;Q™Sئ'ÝbN÷Ú7Œ/¼uöei$úfý‡óNz…­âßü˜ò­8ÎÙÕ}D‘žÐZõeÆÖ¶ Øj²+&2–¼—ªWÍ-ËÂ_sý ûÃ…t,ú.!5’°ž¦ÿßÚä™3Ç0'°CŒHǶ‹pÌ]wú‡1’šÆ!/T¦‚ÝÔŸ+¦xˆFæf ü˜sU{^œ~ç;ÛÊà½)ßsÇ”g¿8Îõ'*µiw€ïµCLúKÔíß"ܵc£š†Øôºï/·_[—Ìê­öm÷¹ÑRæàÇ®ø\1uYÀ1ƒ€ ?†“»´3ñ'ƒE½ðûñ¢ÌRá,¸2¨Ó)èÍÍ3éÚp‚t!yºRÃ%L‚SYŠµº 8ª°@½Tü] ;P_ÚÛºösŽ¹ ›ÓÎ@\U¢d»³üc/q¨’€i…íz?Gºxõt×Hs‚‹ê'ŽJktñõ mh,d„ÓIËg:ø„;ÍÊ/|ry.:<+¥˜yØÊ:‰ÃÙñ·8´îY®À$±Œƒ$®&ÏáËRÁ2>àÍ žYL  nF”o<Ù]F9£ªÿ·Ö‡š¼ÑpuâÖBÒž´ -ˆ-ƒÎQ?З¾­tY \èܶ꓾¸ÛVü黽z€u•üHI\4b:óx\PžÜ'ˆ}ÝýÀV¹'B}é9öô ÿ8I0´ÀVêèe‹ûºjžÞ\« :ˆÞ€Ò‰}bù_ˆ¥„:¶Ë¡^9´) î‹ÌX7¯;—Ãí´fÐñyÏš:ä¤Ðì«KÙÜö‘ÑŒí -Ÿh¶"µW62õY¬‚p‰KXc +Tõ:µsÂÑ©ÀãÊçðCt>æGë$¢V‡ÄEÉéÅáºñDwÂضZõ"d Á\ ÕðÎÙejSßÒ.·8„úŒæX~lä*ézæ“RXÊïÄzHü—ÚDì„ê*?ÉB‚_]o¿0®+r’~¹%e¾ºÝó[zt« ÌÁkx¾½Ò_í§‹kNÊ.‡U LîqçÛ|X@,ñ˜oüênÃTWÃR7Û„ŽR:%@7;ƒîÄ!”öäžË“hFö$‡pyŸôEG©ßl_†–L ¨í“Z§‡ë€*²P3÷;‹Dë^ðD€È/]â¿D'ÍÅÓy‹- POº'­€˜Ç¢?È^ ºÛdÁúhuVíؼ&£vÃWyÉß¼×ÙwÞÞIÏ2 ŽÆæ<¶\¬ -ÈQsSæÉ+í”èæµ÷@ò*BUçÃÂëk²‘1¥›týsøÿ7Økõ!þ߆¾fË ð*å9n’ÝH³´YÞ€þ™Àb/\ßÁØì¿ìQîóo=ÍXNîµþÝ2Ig³Z#6Ï}0âÁêôŽ¸‚sQª¥3öäW#dGqd‚Wyféã¾TÁ™Y‚—ûGô‰:+#Ûù¥Å‰õøãѱÜÙ~3£ÁB1ïšs5·PF"ç}{t]Y†½4×eíØfÔK -¢‰¹ù=—ÅZ_@Î1b­‹‚ó‰óõG'ZcÏ—ºL££¨Óª<¼îôU:ö½ÕØ|à³qõ’š–¬Š—$à¢Ø¼É ÕvN$«RìI8Š’íj„i[QIxg¼3«˜hYÂk$à o£ÓÕðî$óqg†Í¨26‘ÿ‡ÓÚ#‡È'4¶Cê>†Xus8wáÎ%Kcþ½ `Yà ÝÈv¨×Ž>ÓYHbĦLØ7¾ñ“Ö³{êÎÊ€k -ø9½Âz¹ÛDm4;r²­|Ší ¬ ˆRVh5×¥Wëâ>u‹1Zïü5ˆì§!ÄèLóG½ÙQåÉh‚Pêè" ',v=é‹eÃFD |cÂBï;ç¯Ë!zRþl2Ø à†“8|g¬ø¤ µ5§T›tÀÄq÷0èy¦Ué"Š‚¶¦ÆÓT¯çqűn æ¡/µw®ú :§=±`Ú tY£ºÔ˪èV”Žµ%ÌßĨÊkK%È«HšLš˜¬ê>¶½Ð˜ÜÅb}lJ¤ Oƶº›:Õñ¾eм칫‹~E«s3™Åó`—Z”M£÷*6µ<¸áõ¤®«…¡neÒ‰áñòqŽþö—/w2£·&É¢¹Xzs~`ûAÜ°…šK–Xz83¡¶Ÿfñu‘À„:°ƒ6£¢'µ(2:Ëh]Øf~ŒÌ'ž'è¸Ü‰Á×Þà¯+Ù éÜñ¾Ôíÿm ÿ°hšÐ¸!@Õºbª1“MóhjÁ‘³„²ºÁóãØ•!ÉtÚ’–qbþ@2•Í:Aÿþ½Puñ ±šcíVÁe u¢çt}Åßs»ÊùcÓ+‡Œ:mÜc³'²\·Þ$4>ö—7úndô™x™ÕMÕˆ=ˆ(»3Žß´îŠH£>ÿéØ:”Ñ‹ÀXQ¿&ÊVì1c½’/Î¥7»E_ì—?×™ñßZzYËrÀWÔ²üò:±Ô³îùÜ¥¥Em.¼+áR¼EøÐSŒn‚yuÊŸ©Ü§³9õdó¯¨MmèëQÁ1.tt™¥þAgÛ;㓦J ÙÄÆ^)¶÷0~æjàè¢+ª‰Å¥gîØ…™]E…&ö.EßÖ×¥s ®R}òì0\àÈs©ö _k("íËuv £•hÑnŸ£µªÿ›³ZQêˆÅÈÚ^Ééô8 i mì]†âÇçÂu+:Úà‰s9-k¶‰¥ÝPöP;“LìÉfËhåu¥y—1w -öÆ¡eÙ$N¯,Uq¹2m¬Ð¸dæÏ  fK¸£ŒŸIÆ·M|}ƒ†ˆ§MAeèÒ;Ütjô!õe‡º±¢«¤µóeI©/è9bÕùÒ]@§o¡6D¶Ž™õr„Dœ¨âh2ík°ûL™°*t%jñÙά>‰M«WB@p^´W’éX”´Fé}&ÑÓìhÂ溰ÿ =´=8a§š\í“zØê.Ó÷£@âBÓ%‡½ÎüÒ}~–¤bÖÞûfË΢®öµË[ÃF1ÅÑf‹ÞD¶Fl¯n³¥o¥¶{#ªðŒ—Ujg)[-ª]ÌCþá–WÌ2œ‹Û¢E¾ûGx™øº´ë`%çêQt¹ -z8±±˜ÚöíUÍ•®Lsm€çØXW±zThšùmÙû 4K —o™¸FuF~Pmꌘ`Œõhžê°q&©Ëeh0Ö¾¾ß~…—g{©1!¨–çìÆß³£ìjûdUš[v7ß{Óž*lëÊ4÷Ìxÿlmè”XQß»”îÄZt´3žGèkEFÛ­ì}H}jÒKcð¦E¸ólL1 e,”æ†î@<»‹™:Ð@F75óCM0r‘#ÁÁk‚Ã(rÙ f̈¨ãµ‹GŸˆi0×KSTs(à}^»ÞT†¸ý‰Qº) ‰¾ŒV§ ò^™#ÌôO¨lçI$‡´¡L¡âþdÉèS0ÅõI&¢éˆ}NS4rç5¶„‚|Q·[çÐb6L`ÊÀð0ZMB_—¿OMÞÏASQfî¦gÚþ‚›œ±ºû­+(kñgB¢so–Zæ6 ÛÍ°±‹V—ý±æ–Èu·í/ÂP¶Û°_¦UÝvö6@î4yª‰*h,X »‡º°/¾i;_b°à¡p'âR—ëËÚ¬¬Þí×L86ø!„å•£–õú€Úkã]%úas{˜GërPÕêÄû+Èà•®flóËzk‘Þ PÏÉl¬eI«u RÄ% ݵ™®„mG§Áë9þŽú@æt°—+†±µd:¤xúÁwpF~E@ 2&Œ!¼t¯p•_ZŸ—à<ª8+àà -RýüÞJî·~Èaƃa×-Pó1è)ˆÐ¯q|JWè.mÕ¬¿ÕjúXí˜G8³ía\jèÌ6† :4 Ù.×·è,Pve×Ã:‹ !ÓÚ°t#€˜mëĶ /ËdínMX wI¨¿¹üñ– ½±F[lÛ.Ÿ7lê£) ÂÓÆÎY‰®x#zxÚ´k p/·gŠtK} Ždpà“g/»mצ¨ ŽÍã€~fm‚ºÎ™úýbÏy˜¼ë9çðªdt^ñ5Tp¶u1§ùâú¸¡*O u:#Z›…”æAg횊=m×ðqyá2;Y焸EêUnõccP[iûé7Kz‚£o€H4{ÍG@ç1¨•ø3è_J4q÷*ñ{ü¤âjõuÑ漩ÉöÚæÂ0…*¾iL% lvåÄaHWñ"ji”)oÀß)(7wz=o·“eú24`½o%ÇÇÑÄÙ_mj,¡pl V¿sš§ê`?/Žæ&åòÖ[œCÏ7ª¨0¹´yäƒf8²ÔXº#B‡ÛÁd3<ˆ­Ü }Äõ¶¤âŠŽ.}°Ó{aåäIÊnÚ XÎ;%£¬•ˆ¹Y¹©¸ t”Ƽ æ€.—رÓ}àOºL„‚tIrè¡-Piê/šÉ¶&ŒÃT ïà;ieî€K¸nECƒT^ΰ&¬[.l7ý‡fA0וÕ'¤…¶\òÅ[ò®˜ï°É!Óh.Zw¢Ûí-ic'díx¶íD†§ÎdWW+U¯®÷.—‰Ê<£îú“<ôýå¤a%|CS’Â-bg‚$Ð,;»Ç¸p î¶_«%akßg½Êþ®ƒÈ¦Ó~7ýœ<Þõo®#«SG2[<;ø&†´*®½ Êdð1å²5]¡ÆM§wpNº¹_à·¾ WÐÙ Ó¦Ð0ûÿДíö‰Á¶ž$Š:vÙu+¹ßˆ®a"è¸Î3…r/ÿRŸ Dv=ó[Î+bïFWtG¿Ðé]¸§tKó.5µ>®­Pp?ñ”Ûs…(Æ›ÔYàKiÞE½i.r¿4O²¡€Mú¹´½4-8;þÊz3*&A¾;‘ˆ„òy‚HÐcÔÂూáD@fM¤ó~®Ù«Å|+<5äЂƒ{ ²I½«jÌ}ÚÝR6T±5§þâJ³QôÐpÕ4ܺŽËóœw¿î¤ÉÝÝÁ˜Ý¥=ÂÀÍhêºêžrv²®Jô?víZ—Ó5ÒŽ}·w6C¾þònî Ô‹èäl*„8+æaeÀEVia/c+^]R´<€R˜ò…=dðs@ÖXe·ÊK¨wÅ0Ò y²È®pt¸ÀÁX!Á -ý®Ö¾hûðØê•äéó¶_âÀ¦è+3ÇÚ‰û¸/f5ñ)õ -ª»Â2¶çh%Û‚aÝ™`v²‹3ÞÀ=k€ÚÇJs2_§8l¶qT¢ž úK82%áÍ”(ͽû(ˆÇ¥ðRL"0›¼.àЀùÏ㺡TLk=Â&´ÙQL8ÃeHI>Lmçí˜tDº“ž‹Sv“¸ÀóÜ°CŸÓÝg%ýIúD«Bˆ;&­]ЮپÛVÂZgÉ%i3EŽöjÙÑxÃÎsÎœ=pI\‰J=ÃQ+ã|—9O¥¸YÙj)•ßºF'^—´Žy™Ü¸ -;ƒå–9ÈîKˆ§Óɇâ:59„{dž6g¿±À¬¬¯!«?ÕË#à„Úb߶Ç _"¤)㜕ǦÃÕÚå·pi­Â£³/W ¬÷*Ø‚&¶T-ñ¤Òcˆ/GX]—øIµØÛ$w(Ñ>¹^–ì$–#Üâ PÌ¥9bÉR ¿¿ùd [éÑùˆÔu  ˆ«K²>5SI·kŸÇ¤üd Ú0ŒähR‰¦Û ‘g¸SèïêFX&5)]ÔÀi›†0gm¢+ˆCÜ—x©1à:²ûgul.¯ Ä*0ÛÉæ°æÕ²°‡{‰Ëô=hT|ÂËñ?{‘JQÖ%Kû"¢¬¦0‹¨•úX— &$ê·¢ÐÆéÔÇLø±¡]™’©6¹CéR“‹èAüyY™tïðé蹕ù=QŽDb&íSWÝ)èlkÄU´`>±us÷vü‡ó• ¼èe„“ùq„~„öY P¥è]ØæNa¢¥x=í,üÌ‘µñ6müØ~ûøPNÉ¢˜6¶Ý¶CóÐxi»“b´ÍÉeŽ¸Üôs4«-¯¥'müÎr/;íÊv®ë´» Ðv{%é`Óßh¹*³é îë’Søpügæáp%­hdò‘yöýq]3J® äõ›[ -à³ó$3Åó\CzŸfÈÂÇž! y´¸í&—=¸ ÎÌã§Æk˜hð³Yüt&Ë,ÒZóå¹`J°Ñ×6⑘ ”BÚÓ>´¡œ.ècÙˆ(…?B£Jð´@Œ;b“·¼²ò‚’)XµêÆš?6 ã€^`À -ÄÊCÓÙÊ؉„Õs(Ÿk¶¾õGŒ’V‹ó²Ä‡'­¨Óê8àñ9“Þ|…  ZÇöQx,Pô—Çȉâç»™{#]ÎjäÑdåWxvU%`ÊiÃeçx:’]"Á3å¹BSi ™s¶Ó oö¨ -…[ý¶XFQ Ø~‘K'VÕPmµ„‡ZXÑ,—úg0s’˜ù é 33™¿mì.ð hjdÌÎð¢õVntÅ}I§2ó*nç’ß{-Αyþ6®kªd±l‚]È°´é~¹¯:eˆ)K(;w궣êóª|漋u”gÓÜêÊyðW±u%™Qa1´¨¯­[#‘_M&ËÆs432¡Î4#“¢e™¦°ÖÅÿH™”lr€{Öˆ*ç½íë -b©,FÃ؇Ñ&]‘ž¾«µS.aš;Ÿ¨\µ<©È¶uçîèû'Æ.U3:ão¨ ¿å[}àÿýrÔF$g˜Ú˜m7Lï¡A¨Ö®Citž$ ¯” ”nå@ûÆ•Ž¿ûB’¤!¯ÐYjbd„zHËÇr—Ì$b‡œU%wúpèdj}þf|Ã+ìL -cÓ5É Î -¶rÙCMS÷Š8üpyY/yg3”ƒÅäpKRC¬ßíëlçê— =ÖINû9N}DÚÅÊÛxI2'¬Ötò™üôÖ¿-Ã×¥Xx„QâJQ Ëd\Gä´Y€#ëžÏmAÜø\&èÝ´ÆŠ6â@D™>ŽSxTYT(’u/Ô¡ƒ®©KÎÑóù¨öq1••hY -)Çt¶úúR2<ƒÃ–/‘Ht›E¬¡u~¢;ÑWóGŠ³hoBQy…w–¨"¦Ñ›µ.ÊMr«ÙjÏý ºnÔD‹ºý=¢æ·ìp/Úðjx©¤9ÝæÓ´…æGŠçͬv„ÏmwÚTÂ{Ѻy´¡-DØå•tÆWT&µq‰hÉ l4OIÜAÕk·”øÙµ~÷Y¼LUá öðÜR·Š2­énê."þ^-éíÕÕ“ãùé!/–’© ¤qõ¯Î‡)t[MÁÊO5°ðÛ©%¯Ãúú0·×Ř-y_«˜ûz­ó©5o— #é~¸;ÞÔ m÷4˜WÁp–œqVJDr1T·1ï­¬z‡íŸF ²µªZwt”KÚƒ#cCƒ[ÃAù¢Ñ¶ö‰ó—8´8WVœWxQ"«^ -Nå5~äüwZ¹Ž&ôô¸zÌ5>–׎49ç¾PS`È.-ã¾q¾®á‹á¦H¬![̹“ªšrÆæŠèŒi¿ž°×8ÎM¸t~$„¾½ºá@¼ áõ}¯QʧhÊèòëHº£–š•7Ž#ø7>ßE¸/Å7ý!ÿ]þê–ë·èlâ4©"|àóz-O£åHäè¡S!ÍöYŽ|&zµb5²ù<»ëC¡r›4KÊ=D¢X~ŒÇ2ÙÕxs¨JÕƒ¹F– q‘ ói ²ÿ‰p(ñÓk§ÆìØN.°UŸT}¬jù¥ —ýÅâºÆLAÑEŒ ÌŠœËYì–W¤c]3wZÓCçÊ¿Z óû<åÐ1›í’˜Òs‹ˆt$èx|«°³v^OCL‚™cŠm±Ž—/=À5ârªmßËà .$×½Tï­Ç1ü]\`V¾%ÄGDW¡iBœ“D&¤PI[x›¢¹;³­Ö® V}Ì°¶t©¥µx8¢‚ƒô†#|7ös^=vÚÞ§1°@ßfÁTtc;”  FY÷ux•O[Ðy»›X¦.]ÒkòË%/ðHbçJS¤t5øØäHŠJ„UöÔ@å"MeÚ½ãÕqq2ò”!fFåË8GŽqö¿Ø£RÙbq-oúŸMO*Arí;ž©2”Dv1Èù\Í:‹h7Oý8ð kTÉåh\Ñ‹A¥)Ó‘¥½žÞIµc]³Ö—Ò@Z9”÷θ¶D"ºa8Ò%k]I;Î~®ªœã -ÓÛÅÁ1£÷†Ž¥»ûAtØ#LYYë–†yCÇX›A/Ñì.mFQ^¥÷˜`MH•)ìôrßøÍÓ5/Üç’ª¥ò¦Oú òîÆug³,GJ{®¼~aìâ°Š¾5OQ5ÌŽq\òSÓεá­©®%g«*!-ýªénCù7E™¡•¢kPê¥tõ–ÎÈt°RÆ»òà-Zeª~™íwlÔ)´eóMêç?ÜkG3ò>¬Wqd&s20ä‘?ˆS¯`Ž!_òBY^ë÷>¯ºŒÒ?TižöøW©Æ”óZHæ­AlëЂÕ(ã¾1Ž£ÒDÜý~ÈÕc#ŒŠÇKˆÞ0»¡Ç|éóÆçú-Êœ= ?¡Ú0ö{!1«™¢‘þtåFK3‡¼«ÛÙ:ÒŸgåHÊ{à=ttf åÆe’Š‹ÚYb\4g`6¥×œêZ´£(äÝ5h5=0ʃyßóÚŒÁS/Q1Þ¢vifqð¼S,}d_Øâ äí±¢Ý[ûxŽxù–QÏdfÏdnZ3<£ÕÆëNî«m¢QÚŠÇOD¯M)lÔóL ¼$‘ò®˜F‚…û%¥ªCÚ5Þ±â"gb~€Sñ¢†Ç¡ç-ˆ3;fêÅQ™)ÄC—ž tŸ­/${8-„¨|å]PqSE*×.PKqk¥òs Ñt²lÀ´dö³-tcˆrxY)s]š1xú$gÕô—ø»AS¸Ds‘è|å:AÓBQzÚ îÿ`qÔ§"CU ±õDâíö5OTßæqÙU©&Ör½†jÀ•Üú¸¿ñíçIbº-}è©õk‘y¾GSj¥JÌí׋R›ýƵQ¯5Ѩ'5OHôP­ètåy×Jï{UfÒuwËwÊ‚žQ@â©ÖI-&T•ž"œ;“Ô“”-ªó¬OûT^¶‡¥#TxêyJ ®l´—¢Ñn€‚íüŸª¤}ux½È³è^VYL`DtNh. î~}F›ÚÑhIã‹›vnËT[èZ×f ÷èçÌjΫrÊU cl³¶Ê#{)Ú¬Õ6^ÇàžŒ^þIœÛ;´ž&ù¶~ð/râ4•ÇˆûµÐò"Bº¬±³Ó¾µð1T†ã%Yoª\ÓÊ·ËNÎÃW aT-|H¼11WûHBõóü*‡*­ò ¯ ¶¢òî$f4.´¦:š7‰Àç½ÕíÞÛ‘C†uÒ;#ïÀðË…DÄ -üËåÐœçèNt¬Íø“FG)…@ÏCrž)s/]W-U¤ïÆŸ¯s¦‚¦¯D«ê ëfÀ|ÆÁ͇ßÿŒ ‚žfêÐÉãe5×ÉŽã€ÇûK¸¼)¡íˆëpØØ”‘¼â;æ…AûzÛÈDß4vÝkלié@G4b¢ñvG‚îô02ÏÊv¶µ%×Û–‚8Ëâ—‘‹êôu4ÒÑȉŽ0F·œXy.âï×cêØ)0Æ£‹-zC;Ññy6‘c(†vhèæļ’01í8uì®Nw)èîµx!R(\æ´ÅŸ+B±õ§¸šm”v'ÖÒ`jì…÷qìhæ:˜Ñª€°G#±ÏÚ…yžæ…ÃÑ }*7pµ´å ¢›v ¢€¦¥ïè GNDîvµî•ƒ™ÕÍÁ9“-W"‘ºë&8TsšW(•À¶,ÐN@L¨édú¼gFQòëljŽñ¶–ÌÔææŠ@®W ÄNk™ï8Ýîöt¾ÓŠÈ CT`ÜÈs® xX‹À¬.¿ÂŽû9†0J“׳QÕqÃAt9 V¨91™‡/ù2˜²ó’äƒàÅf˜'±Wqb_Dš“ƒ§]d‚‡Z Èž:[&4­÷º:‰iäÀ 5O9 ød/v¶%ác«ä˜¤­ØÞ V1„Ë·Þ¤ÇMØìƒ=¹+õXµ\.[ !9’wpñ4 ˆn»7FFrX@~p˜‰Dm2¡”Ñ)ÔöÃ|1 Zö.f‘ÃVû Tlûí2ÎÄ?\NôD ÿÒëOÉÁ¶°V<,…ÌéŠ×ÆÉÍÌ1 àŽÛU#웃N¿p0koD­ƒÑ×Þ }ܸÃ:ð}Ö“‹ƒJU——edy ŽðiØ€~|˜k}v¼ùÍlb#¼äÙéÃ\œX,؉±p/¿u1,œžÍJp]d^ØÎ  lOI™ ö™ëå0pqìé;æÛ"L¶Q9 “ÑKL8ù#fP ™1ì›n¯Y’n ºŒ!Ð+‹PË=lÞV|ÀÞn =ºÛï?þµ>‚§®ÿXÜßD¥ö?ó·^tÜWÑÒ^RÞŠc¶ŠsÂÜÏLÍ4^v§W6nxâóýçO"cW5ðóÃÌ*ß=¯1 Xú# žMoÖýúñ@E¥j ÷ÑÆ=°HE•’Šöïø—ȈžÖjD ¬ŒzaK†Õ1ßî A—ÛGÛÍjLŸN¡E5&ÄÌ>Å–<\‰®¸<®Ã×_ñmUtzÁÿÈÕñÕm åˆS´¿v×ä &ê"x‚!ñ2J)¶>Ê -kÿõóë0o\þìašVnÝfö©‰qvÇn7ºW;ÇåsŸ•Ó½Ã÷>ÿ#Ý¿ì ªFZ¸Fïß—3HœÁŸ½õƒ/0ߺŸwÃŒwÿûþ}WÇ'>úšÆ{`RGÑaÜ¥Vø~»åûN¿ŒôÎç¯&’ Ë-ÿi¯m€H^ÖØ¥–Wº,'´rþv 47×›f³PœŽ•Nôèü•u¶‡©IP˜Ž#8XÔI5Ê`ËV}S¸ ‹mÉéàYÂ_š›è—áZ›ú:^•£û*ürv€±÷-}oOÅû÷:×|þÜóîÒøFr¡ã°Ì¢ ô#ðþ1ŠœØ9ƶ#Nw}jIJÒz;A=<1m·D}âð-º˜l]Ú>G—´îûìþÔC€±Ï2®zýècæ|™Ó·è¥hDhÊäÄÃq^'d¨éz3¿ÄaÓ/ëç^ˆocûÓg?Ãé÷zzfø-/ýúq×mùsñ:‚Nÿ^CbÚûǨxß=K³³(ã+òN~Þí¬Šf. ¶92ˆ^ôþþå¡Þ5 ¯Ñ.ô‘õ>†?w–ÐÃê‘/Æwhò‰Ê(¿8ÃWûªñÐ/üuç€ ÁÏi”ÛÕ‰|ß¾—–22ÇågD_c^‡ó}§{ƒøï;ŸOtñù³O£lórÚØuF™òy÷xñF®Á…j͸D}ePP%öôcÿè³S¼qX…ëÉ“ì~DŸmÕWOWèäN-”†:±åF×``Jœt‹~Írq%’H/ œŽ'Ѫª;ÝuzuÒÏ›==È€Û9‰%~–ê¼Hëˆ0­‰AdPPFåto ã´5f¹8›A,]>ZÏÀ‡i[¬™Ö £ Í'ÑåÇ‹û\7+ƒ† žf !/ 'b¸îvbS~ÚÃmã<;Ò.8qÆÇ‚SX.lpeüCîXlª˜„uÇ“osK…1‚•áx-†7 _*óT±ÞãnÈÚd±BE¸t'#èN–8ãDO‘|á¯&_öî:{Gê—I}øþÏ~kGßÂ`DU:£I$C2¢åˆ#KÁ~Í$SÖ×ù1›ø;½{Gÿ¸·ƒ£}¨¹V“L 1emV§u ½%‡3ðòÜ×qåݯÞ'‘Çâƒ3øàX« ŠÕ4²†Ø 4ó%$¦òìØ•-}e(p5ý±àÇÁ³ê- ÈÀÐxðæ)ÌëDÙ×Çø¾ºç¥kë2Æ8}©õ¹%Ç÷‡ÏÿtlÿðËáós>.¸‡¥cHfN# þÄùO_L¯Ù¦î4Õ®Ïé#†3.cwtÞ÷h§)Â÷¢'zàsÏòKŽ§†"2öuò·¡ýÙ“¦jÍz ÚcòÚ™{|þT„ü^ /¶i¯Åx’½Žú$ÎÈ…>­±Nqçý+Oyâ]VHô¼7#nr&1:jô‰ìq§{õ;ˆë±Øfˆž´O^/DÞZÏΘùW$Tïæ. º@±g}éŪÁÁ[ãûÏy2ˆ³ºÌðäÏ<þò:ZÉÁ<÷.R^ìà·³VÒ¦5õÑ{@:Ñ[gÇ2«f8é9¢–]‘Šáºˆ-y³^Ïz±ó ½ -¡Àç[CkH|ñºÍµ6½T?´Qv‰á ÿEoÈå¾³[˜kŠ8¸üeW˜½›$»•vgkEn+ió—õÃk¹ÊÜ8‚A<쵌î^×Åô’Öˆæï“bÍ££´Ú‰ç“_ADÞØf7¿¬µ„ôÁÎ1JwWÚ”ÑÈý$&lËI,’M>£Í~Pƒ]DâÖ¬(È6¢_¸FhkÖq· pÑRÆ°ä£ÊV³¡”:B–ž3;¯û"mµ×Íl&€ù÷úTÙÃáMê_®ŸM`‡ñ›LE+`ãi4¼¼^.“= ÿ¨ÚµÅÏ×<¯çcm ²3 ‹è‹±ˆL%Ëy¥Øñ¾”£QUÎÁnó¢0óøîoq˜ÐØNq˜¹†Ö%³½‰Hë-è>##F—ˆë‚›œð©[=觉ÜÂ60™>ëÚû¨÷«`mÿ ->îD#|lßHÁ>¹ó®¾Á:5%Øo=N(="6]«ëŠã¬\®Šî@F´äbϔӔh^Q ìeìªxE›:ýð{8`¼ †5v1×Ë36á:[o õú¶Y‚Qáëè@,œÅ0ñ[@ìÈg[ìÆ⩼“è¯=9˜ã³(Uò¥é‡ÚÃb}¼J y~k<ät p;Û±^4|Y{¡o) Ê®ëpqDy H–A¼x­ýçÄ9!Ejä¿X³{¤ÊRþÖjVF¼ý:Ñ‹CA\eH.,8ã0µ’{~Uo­¾·‰­$Ë}ÿŠž[jk9â?^Ž½.è‹ 5b—ÂÎ'Ãt·Å 9&Ç—\èc)¢àÝ¿CÞvyT^Xí7}ZnË’Z±ÔËm³ôKío¨$¼Oö¯çaR„"ŽÍReBŽ¨¢A˜¢U*󃞌Èx×V–Woœè¿.qWQF[s•Ô~Q{"OµW}ŒF’H^-îåQkî_—ŒÖÐÃc ¥Cœè•á£Ü¤ÿ Z‰Ôs^‰uÔˆòÖ”ÜÁÚÖÅvÎb²Õ­íAt<Ç¡ÌX: ¯HioëVôñD½û;‘Yʯ–‘û.E—µ}ÛŽdØ#]–: + wª5ˆ9 ¤¨ªòõäðo#±‘Y££*©5S],;Ó5Æ/YøúëeA¯¿u9…[Õ|Ïw¼÷¡ƒÇýò¢ù× °ÒÈ6ï)Ú}!nszg~ ©û-ÁzxwÊv¼/G,ïãõ>X5˜©Þ_oÔ›š5å1Óçí¥qKlyĽBº\rÝÅ9# íu2”"®²âoc`àHh˜š›LøX¹ÅqQ.: Ë—upgÁ·èŽAàô¡‰„ð¾RCÄš;ÝÞ '83Ã_g48'Äæ¼—glÓþ8Kl]‰ÊÚ0z$î¿:,CÿÁu5pìLÒ‹À—%M -NšÃ0waáÒj÷î¾ñ6Ø—ž}NŒÍtùXøkÅkÞÊèeüçýús°ïj\¾«ejïÆÙëÇ•Ñ»í*¾áOß«Öw¥Êß&oøô:Æ+1 øúE|™„ÙËâ½á¯)ÌtI9͸æûFû¤Þrßbuw>zÙ‡µáÓ/»ɯð*å²xߢgDÍÞè7>ÿz\:ŠÌªc\.Ý+¡ÄÅ0vb÷‹εŒk³? -Óm']LŸÛþìk3ÿöÞl¹®ãH}w„þ/ŽPG\À5­' ²úú6=„åöqlj -E´1ð€ %ùëoåXµÖÚ›Ø@iÜv·I& -µª²²²rN Æ„4B -¿8–³œ(%P²=V_¨ÃOz Œ M "–cí`âÍ\H¹[;Èœ±Z£÷3…-ûÑøÄH†œ%»)’xµ¶Ì”I¬àxÚÊÚï ²é ü5°:çüFÃquƒ»®rá6´…%±y1#b§à®ã±kï^š NHlCЀ`‘·¨'­5ž¨¢•<ÄD£F{å`b¢+Ð×2¦’kÒH*è¨ aª*C8‡)Œç<¤*UŠÀš2SC#Èvè)‡ -ƒ½Ü[€Æ¹Œ·ÏQ]É©¹kq~Özi…¢/gBúu¶ ³ñÎÈTNÍÐNÉ”|Ç`E@÷϶Œÿ%Å#~ ±h^ -ûrOÂ:àVße´‰B‹•hÚÓ«"ðP5p¼}Zê žƒ>¦P¿Ã²‘ZíÑý«Ï¾ÇnMyeµâ¸€aU+5#)ØR´ÐÀ‡adÖض‘ÁeÄS¡¥Ï&»HÔfiz ¹m¤ÎÐ9LÖ ››NŠÁíòd ;О´X]áÕrÌ¡2ë‚kMP6…3óXß )¡ïÌš˜§xœŒ­v¾ßrÔÕ"š]Øä ELl÷0˜üƒðN=92æ[ó;lVáj¨„âžrÛ½¤K-nÛcKàÞµ“WÿRàÖÐÃß"í…(%ÍD„ÌYïm¯¹³ôð3,>÷ß¿˜ yÖç¦*+pøz¦ædVMdý϶Ìóè2¸ÊÚòåK•©cö³•ÎÆIÁÚ4Ïc?^¡ìBý$/ç¯Ãç7Tqý~M|›r:†?›óƒ~ó/n¸¥¥×¿Y¬ùCÙÒ™ÿ¹xYôº ›8+—ã]úè¯ÕüÈä½)TXh"àçØŸÇ XÎüØk‡Å(|{X{WD†eNLÙK §iàéžúyL&‘ÖÉ2$&o¹¶¯|òÃ5^]Ä’Ž÷ã=‡b…|^œÇä1‘ó˜ -$ý}œù’D„WÈÍ…¨LÜ€÷É´qЃkû7)§ê‡µÏóf¬k¿ Žóür3,xëÀ†.ž«ñ ’Bk»0 ß¹ïrž_RE:Åò$Há’XÐ:•úçðé4¿Ü)88'=æRÀ\ŒröFŒÃÑm½ÎêÐcuÙD-î™jA‚:Õs×?/h -žäÅÄË;Q4JNí Dß«™SpÆø*J îC¯PÚ€d½•I6ÎüèÑ¡¦ a ±àRà+•¤MÑ©$ Ôw¦¨˜Ä5· ˆ]:èKÔðtu@X…å„Ð`46h|)ÚD[× æ¸p×DÇÕ…cô^Je`) ê(! -ÐÃx”£GÝj\-Äã"îÛ~±|éáÊÚ€˜\ÅkðÐÝ0A3¯¤ÁøN«øÏÐøئ&0ä¤íölïÅâI’bŸí œ¥ð-,E¯3»r¨1t:ñ‚Œ?Vã)àì½=)Ê/EÍ£ìr Tóm -hƒPGκè`ù½u¼,,Lª3°¿4Aÿ˜4³§LMΈÉ)ˆ…àÕÞ3¬ -þ{7ÃBån ›ðø¨'5«å /JÃÂXƒ»ýùü³ß¤Ç-þ]Vü;ˆ&ªÔ·5´£áF¹:íLKàg30¾-ÚTgÙïÓ\m.üÝ&‡^¶ŽÛawÉK`§·ÔW‹¢fi=T©¡£Á¶w<ÒJ46±pÍõ÷¥¯V¡/U0ŸP&ûŽÎêׄvj¦êÖ‚ß°‡w2nh@RrJ;óƒ¶p+m:a½okƒ{još³ÔX•MZêªgìˆ#IO$xMÜK:K;l³VHÚ±‹W&(±,Æú"ý¤lÔ%̶ðèHrTR„»I»¨Ñ¬+—†ØPúÙJ#-ÊŸA I†±á}’PßE—N¥QhÚœ­L;] ô´QZ:!d#‡5|`´B.ßf¸X܇h -¥xä9,aÉ +·•zBë*}°~Ý»PÌM¥ù<¨+‘á€Sn£V„ŽføqŒÑ†Ô\/Š}R/ü¹“YÆlE±W|P ¾€™÷M%®‘-¶c ž„Ø£Ûõ«‚j1õç€Rë tÒ¦“êf 0P#QlY¬í­¡qA1Ò:ØS_C¨âe¥Ùq{ðé²5AÄX&iã5Ýl–ÖÜlJúYi䪯d±Ê°G*ÏäL°[5„¨1sû,0°7ã?£OrT‘îu¨¡ÖFP 9˺ÐOË÷=Þ„ÚÖN0zi®›Š¼^AÑTyNœ·Òº>±¿ÁÁ\.]P-&)"9« t.Hß-mið¾nU -Ÿ35r§$Ìp¢Ç«HSTÄ|>t…Å’•´/c¤&n"¦G¦V@¤‹iî*ô®€rôÌÄ«%ŒB¸¿ç^™ð¿i,„x'y¨é)¹cs¿}‚Ÿ´W&öcfŒ‚€¥ÝiÀ~`ÄDWn%ŠX ­Øt­KFÏ$hË"ÝkÈx.Ôš‰g0²ã¦ç>ƒcŽ-™mæ-—ˆ gÜ…F¯kù=ó\ðŽmV©ùÞ¬€sEÊ$|8.$‡pnQpê2•1SºÍRñ”wî2VÏ'€¢Èoܤ¢xÊÒMÛé Òãx†*kpQFLdËЀ™àÚ$–šÒ–½Ì€¥t6ááÑù}"µ›N½·†ƒÒ»Ü»Ê[ãk¹ÇSHFî½q¸Ù3t? Âï-¶ÐVºZƒ[G­DÑÔgÙrÕFSfàÇ>—é‘·ÐNfÀJ8äâô”f$—+æ»Å0[ÏÀƒ´ŽÚ`ͪ?㉭YH®·U>Gm¥,Q&¿ì«3¸^ªÎE®¶éÀª Ê~s,D5 }S­WúìxÁ¾ö5d¥cnmÅ N °·;o-ÉàL’ WU2—z§‘^Ú6SeZš3Wá-©Ö;L¾Ç¯¡K@ïtl©Ã¨ Ô|€éQÛŸZð¨Ê ÒÑÎÆáÖQÞ£—[çª -’0Ø ™ÙcýÜà¶5DŘ4õÄ­Õ<#ÈwƒQ‚äþx:ÞÎ2 $-Õ*hiB8¼Ù®ÒÕH…¬5ÑJªéW2ÑûÛA@4Ió |4‰øRéNe,J@û²¼T Œç«ß‘LÝ:y í_IÖ5´ !‹Lå6ˆÖ:ª; -´¨ÌÌÀ( -Eþš®‰\Ýg`Ù fL…ÊÑð²¨ë"£<~šà†ð¨ø¥~S È1$šsf[I cy=é ö"H—åºnÃ(ï@îê OºgÈ-J»àîãÎPŒ}<­—ÁX8’ž»¡Bt°t€—Nš;¤…åç, éOM[tpfí¦}Õ‡vŠŒ.†¥IªhIxPåŽAÄ™Üj´!'}Ç -6,wãƶcAð[ÐF °öÎÕ‡±ì’VZA8>dÇ2Kól¬¡þZ…RŸê[â<÷B­–zsÃãÇ]„!_+ð¬ ÙÒ…òLE½È”äY -3žå¦¬Îð¬P˜Sz_W©1MÒ‰Î@õqÇ%déé(,hËBµ¼[]ŒÒµQ²?‹·¼cãUKÙ‹uˆ5°CÒ"tm™EA­¤«z¢Ý¸PÅ0âû&À[ÙS -±aè±IÆgXWW»øá„å¤KÐw6çXf1ìD:2d\# jÉpÔÄ3 îF@f·šü„@f·`¶ª*ŒAõy(xÃ5#ƒ³ ÜvWT?&åp|:C¨‚#Ö³:´uwÜÞ@ ¢t—GÁþTfØ0xË´ÛÖ°qÁ·¶æáxmêJHm1”aéC´ âˆ/æ±XE—©T'A€$îW½®†kÏÐy!Qñfš™»LcÎT”<õ¼7]‡"‰Uí£haçµ™Ä3dÕ*5ë& ¸3j¯¥‹pÎ+—èBä5$ª•·¥’żäû !ŠšÆÎ5ØE¶¢q£Q™÷k-ËÄ”:&S•7°Èi‚V(öŒ uÜþ.ƒ½ÁGäˆnT†D¶b½äª6ž6jz2)ý¦ùj¯Ï‹@ë1˜ì(^—”8g…-á´“ =»ÅÒDQÊÄÛIªY¡K-5D j:§2ƒ°…¨»ƒÏ‘^¨À4Ò•àU"-̨çi çµµùRaE,E!Å'·”DßJ$*À®ŠÕˆ=Ex5 U}Ô‹WkCIÄ æÅóž|Ó n¹Ú$% ü¶dž¤cíÏìRŽŒ>.ú±‹Û59*uÍ{À%$0UWÞʦ‡¨]¡+‚&ðY\Ëòƾ‘@ÂÁ¶Oj²Ws[ª$JÓΪ“h«\iÜ¡„¢½þHÖýÕ„8«‚ªLb•Òd$ÛZÊÔsŒ8E|ßR&÷ Ñ?6ºÆB*¥cË #ob¹O ÉýN@ö2Ãj%„gê5ªµ€†ë‰ -×øÇSÇç4Fu/0ؼ† àºXxËhÝÁicá­5 -ðŽq®µ]ÃX˜î¹èà,l‘kEa„xjXuƒî Q+D -Ô.»ŒfôäF –%C|„À#±Æd~‰±Ž3Xc |©ñ^n1Ix‘=†´ZðÂë üéù—Ïù(·˜Ö°$êÓ%³Å›P‹ƒME)ZªË”Fbqû‚ðIòŽë˜µ'4iÃ5ÐíDBc¤›”ÎbN(†æpÆ ƒ 99x9†@Ú q¤,õ؇Ë=(B{ñ c,…h96…Èݲ㾄Œ¿{¥âO9 ÅaPý_Un ¨Ñ~nœƒÿ8Æüø¸m EÛ–h8CŸ— Å!иfØ@¸^øNA¿vº’ª‘V¼;ê¤áT«E[\>X$Ñ\@ -ÿh":?Tì0P‘ ÷ *êzÆÚ¯8ÔAu®CŠb ‰?Ö]e›[dÀzàºɈ2b¾K.öT … è;•dgèUV]™5<[»™L·ˆóß2[«,ÔC̶_lÄãß1‹Dès4cQƒ€i­^šÎNÛʉ‡hË«´aï¨{}¶¿Zzè '7‚ïÉ1ØàAB>c•‡¢Ý+`7`íeNq0;‘¡x:‡yðM£ê¸ÃÏ!™ºéžC÷îÆ‚þ0Ñ3<blÐÆ!é5`¡'ÍGyNp±F²à)u±1WˆJ"óˆ¡Da—Äj”U$ðY•êä’„#¤@­VÚ´…Ò©V“YAŽ …¼{{²x#¢Ç®2ëXòÈrc$:b! -uR…*¿RÀµBÂsƒny  Àµ8>ø,@ôÒ6î†02˜ÙÈ - TÉ`›!ñ›¢%€{”ê6²Ó¶†ï·éøæàw¸º=øüË?Xspz}ùêúÍÕóƒ×/O^\^??›åL ƒoXo™ƒƒ‰-ðhlVmÐ4Y|œÛý)û<lN@>DÅ7Ù³»¢0œ°]¯DÇAÒ;õA¥CbdÑ4õAžm¾Q$‚"µø5špÄp’#Ÿ ßUU•äö°¯©Ç½„D‚è!ÚžØ+å ä|! F#~Þ…N!(‚¥ÛÖÌT“MŽôL!£$Á>õPyÀªQÁgêgˆLÒBÿBw°bnNíh =„× wSÑÿ, ?Œm®}J¸¨¤×ádÖÕ#[9ˆLøñµNÂ|$7°Q2εÏѯ{ꊎØù+ÇÇÆÊyŒTÐåÅHJ p’ŒOA;¼îüûpE‰ bH,9ÇëGpõQ*´a#ÛqC_¬AÄa€Ó:C•ÈRĵ© ûþòN·Ì…Èð` ‰Î0¦_Šw&Úà òKÌQqÈ.\@µ =<:ýu–±IÊJ­ødWjÚ@Lb†…¥WNÅW‡­×kºH>ò*×Â.QŠ®ea›c论œ±n8¾¢ƒ@_ËéÖȪxŽ@ð{|÷ññ`g_ÿPÈ\„EŒH 6$NÒÂiMÄ8Ã{IIÜ^hpâ(3˜Á °k 3,ôäÌT -Mcròq*m\5²„œ-5 ªu ÄI:C"ÿ.JžÇ²*-œ€HI(&`{§‚vXÂH–xhåJ¬ÀêÚÈVAb>˜ãÀvÉ™Õô¹D¢[Dô³YDYÕUNÐÁF¢í…n±}Ø&b>ÝBäBÿð -S,W€¢J‰jà“ }^! %l_qÏM¯%ú)(î ¢ÊÁö¢þ,,àÒà\â…„fÑðÑxFãÜCD‰ -\¸]°Cÿòxš’Še€`+y9ÖžöWµu+=® ˜c¡oY} 72zð‡Y‰ðFÃ[kÆÃä—2¤èÅX! 5uµW”Z=¢‹n%§ÿÅ.î\x›tËzx›²Â»Ò§Zl€hÛÅ2Í—ò Gzp†.@2Äc‹ õä¾|>Ä@.u†'=¬@—ýbËWuA S¢ØvëÁ~¬' S±âBlb‚ x_ôdš\•£0T¾˜Q>˜ñêú¾À¾HûS!”ü¸Ø²He jÃ×.Pˆ¥Œ^²~oÁ4*ÛãR”(%bð5c -„Lä¶m4 -Oj÷¶($îVÐá¤'n²~!VîF…lÐÆ÷®‡{Ý}í -—ˆ$Š?ÅšØɃ^…ãSøÁt€> ˜ígr:á²Éúú骡7ÁUƒ}ÛêüÃqy øœƒ µJT»ƒœ­0zF}àˆ%T4•x‰Bੇז/$6¬Zj‡§B9pðÆž£Ü_Ì/W8³ñ^'ÁO䤙p‰gÃhæù†îuËý*Ú2Qò H*ÏKdOGÚï)°ôoÉ>‡ÎLT K”®ÚYó3n=ŒEMÙJ IYRãeäÓÅtÆPɉÌ-BW®Ke´Îö„+Že¼×ßq< É<4›:Ï‹TöGiSx^™mʲaˆåë¼ =ÛÚÑY7ì -<_q± r²ƒ5zº›ÚK@Oày|(*3 d¸Åá²û³Ÿ ¿b¹9ˆÀ¢ê˜€Ÿ KíbÈg$J˜Ù\>‘å?[0ØG“ÖÁçPØͼ¸`øÜåü òfF‘m ~{÷ЋÉJæÓlþضumÜÇ‹i‘9|$Ù -§œU@íp`® dò0f.¿.ó<Û2?¯bŽ= caÌÁîpˆá3QãŠv¶Áežg[柦À[Íc~ˆØ:€I’p ýŠ3`#xãÚ8«¸>‡ï#hˆ.OÓN3B‡ ;púõ–Ú'í{šo_}ºý'Pê¥t!S÷ ðÉná}á ÂÈšÍ5†ü SÔXn°;Yè÷=Ó*p¶†¬ÓŽ[[àát{±ÐÙE©¨ÛºÏ“ªZ_€“åuø°—>í°ë¾†)Š §Rˆe68ˆ?N«ÀÙ:|X°N;nm‡ ("B¾œ/NCúÒ:yÀ yðNÞäJÞÃ畼§˜ìC;ʇ9;pº€VÛgÕ]ͶºéA|üÇÑÍÇÑŽáv{"ó]1EÞ9ý—„Šq⯽ÐÎßjÛbþ셵騭ü»M÷í#bÈ´ -3 •„¡ð  ¶¼„>&é FAÞAnt*°¡p d€€¤gÓy¶ÁÇy®ø$¿^ šã÷ó{sÚÞY´`rFpàÉŸ4JÊû£’ÈM²x| =Šs“ ÏÅ7é(SÖGˆ’ï²F;C…ºD^¦˜§ÙMŽÄü}¨Õˆ1.ROCbz;úð²Ñ¼B¨³—PYm3;çÄ1å* -e®''p’#‹rŽŠ%°«l1ž=ÂÇî*ë*Û—«ç8‰D%¶È ßâÀG‡Î&›¥ ¸GØÇ ¹K•âÍÀ—iP„i!/‚C  ¤2 -•ñ'f(Ã]‚*Œ¨Bž3Õy l8A¸$‰B@HE]IóR4€VSí¼—„G_4@ÆGI&gŸ#›~[Žµ¨MC9Âî#†/S^ð\ƒÑ.^«qeX±q~é{€Çábë`3.À›#4)qBàrVC.x(t&p¾Ö!¹S)/"°Í†¨—… øq(¢’€«Š 8jàhû@å`¼èÄq&A&cG{%·1(ŽÓàá[”³8çÂÈ7鋆¿F(!A>‘Òã7]î6ÁWÀ¾Æ/p~A¿Û $[X•.D3ã2ªè@C×û¯«$CDP%7 -ü5Ò9D R¤ðŸ!Ž‚]­z‡Áî‘xcQAƒá7"݃%BMZ ÐÝÌD“¼5"' ,bßÊ`Ž`Ä𺛀ç˜HÚÉUüÍÖ|ŠC¬~Þ.ÌÎ5jÁ3 ñs\¼K–½•ëœ¬ò@Îm„À²êØÉ9Ó`à|9 -œÓb©–‘Š5›éX?ÿjò-Ù|uqvõ¼I/ÿðµŒùÏ­cþöó«e@¤äÈÜÂ[Ѿn¬·@8SÜ‹\6§æ' ­q΢nOÕÌ)…ŠŽÑÖøb¾4Ž¢çà!fæ“Q„ -y=$'a-zÛ^F Ìž‚P -o/*©¬PjLÀèwáLb -‘'£ùQù&$"S®pbl;“Œ““^zì–ű³=;‡DÎòÁixŒA)s°ÊjáËÈ[ëÐ#Æ\£8J‚ÛQ*ß4ëô:d<¨§‘¨Ä†v¡]r™ ðwC·Ø€ þŸÂ“0ÇüK¹u…²w€›Gý4WJƒK)»×Ð ¼Ìçä0ì¿’Ø'!ó“’*K´\+ €˜WB—YCÛ¯œ†‘D™² ™½?âœtˆÐ¥ìH¸Á=¹è”ân}¢,"™È1‰ž¨Ð—3‰„f<*¼ØƒÀŸu0…ŒÁ­KSDyè‹ ¹wòEƒZ†•Mj:€`=ßaÔIõºTX,¼$0P°¼³YM3j8ÝB%ïÊ¿~ÁòËÇ,ÇêâÀð9Öí4zB)zùx•»ÇÙ(a4¤¢6‡'MîBѦróp´A]ÈCg8Ä †yçó{. -O% §r@Ü>”ë~+†9auÝŽ-0ƒ£KkƒÅ¤…y°¥’o<8P>)^W©o•ä(º€@‘<4}Zó0s’¨Ïš”ëRÕ\e·§ºŽRE5æ6"NELQÈÔ(éçí–Ã}$¢ìÕÚEå -Àä!R¹£¥ø[õYôhæb~.Ú=@E a=à” 'ôÀˆÅ¦ä +V‡ƒUËq–S„JJ -çH]H©b&‡*ViHº” „…5 ‰ùí’ž^˵kÞŠ¡®ñsOðÂaùðP¡ÃuõÞŠE­RR»©Z#É«mÒZˆQå-Ò®¡>Ç‚HF5kIS×™9îÒÃ6 ÃC츮1ëÁ„Œ¶?Ç)jY/Èòp—~€F@Ó€ö¤<&v$àÓ¤Ú‚  —T†¤®öÙY/s Ê?¶©&‡Ë«e1Ð}%³%2X• ¢¤³b ¸+6WF‹ -endstream endobj 219 0 obj<>stream -!T`U KÊLÑäíÅÄoëçêq?`Ä+]Îaöªhµý" I/óv,•.§±N/2ˆãTW¶)Òtâ -‘”Øn»#-²4 Ž“Jç¨×çÓ;?Å2ç¢>ÆÀä9Ïo¸'Á깞“TvŒlÌÊ×Á\P%tƒÉG2! Q2kœ —œ&›¬t×D«*뵘„e%+È’ žWÈuy+“pmt`}â‰Rcä!à‚ÝÂù -VóÏÁ”à±h#šÜŠZ«ä3:È&çÔ Åšþe.%—ɪPçìÞJÖ‹œ»:9#<穲A8P?Xz¨Åö4Ÿø¹”ѪëIf¸«©X¡zæo„*$‘“R«<•´ðA86Åt’ÉCÿ³:¦HQ“ze5ÆSE‰w}ÑŠž×o‹PÊͳ/ÐtC-p¾h83SLL™êqá’ñ^¿•}§dX3–\ß%’ÿllÕ³}4Te0b†[©>âYŠl²8jPAÁ1‰=UÅlÌBCžãôŽ·ú²wu… -Ê\9sÊCx4[L’ÔÕz-aà ’ Y¨}>ûÈ6ç5¤² ­å]Ž‡YlýqþfuÇ"Bïâ‡.²êËÐ#híx ÝE¶á¢§¾;NÁ„CõA=Y 4•Ü#æá’$ïœó“@Uóˆ•Ï,j@ãZ*~¨*ë¤âd"V.,PÄþ˜Ëpª••T"xC£‘Âoœ3eN8_’“8kÄP‚µ¦=± €]ÇN’· ¬ÆX1 ²ê‚é$Z5,«d.Œ½Ž7$¦ÊÙ–&© Pˆb¢¥ö5êçFäÛQ%ã žßÞù1rv,Ü7 -Éñ!½(Ýž>%"xW`$PSfÖž -ž,pTÖ#=*É·h78m¹÷Žçf}@DÖ.ò]ƒÝ—ËqºJŹQ Ùˆª¾'ꎓÀÀÄg5ƒ>ÇF©@QÙ1i5õ%ˆœé>«\Ž0 *81’(ÏV¥:G7Ô•Ý”•ù»{+ï;²áO9;³§O ;¯Wtm¹pk(ëu©>72 ‚¨Ë Ô0椰1¸p¡‚-g«¶‰§±]BßMЪ•Ž‹ùÚ8™ ³½"‡•’ëè>æºýF¼™¶‡-Á TyÃBDxj”y -\!ƱcŠnT‡u¾’ -ëP_-L”ÓA3`õ¯RɈ¡ýœïIöRÛ?I먜¸F’s±^¨“Ë›…²õTë^46Ý@y*O¯ǘ¤õX¼«H`l$ïN¯Ì¶<Â÷÷ðT)`g¼''Hë6T­ÙÄâ?T×IYÚr4\Iý5Ê@Sª Xg¡*r’¥Þ(ЃÔØw&ÛŒÀ<ç¤VV÷Tƒ™å(ƒB)´‡dÓaó.—ÄS—­ ’¡Ë­½Ÿdø)bfG®ô‰¡æ ?DBØ"ì®Ò6›“z ¸c0¬…_Î@ÛvHú“—fo[Àš(5™óYï?Ô´‰`,†h*r”´ ã³"âÒPëVõó¬M ~!Ú<ñlGÒ8ª¥2'p˜ŸB& *fÒtÿåw%­­ìõŒ±“u\©ãŠ%ØVDC¹ž1~ñ… ðÉ<‹ÄB,—c`  VÔµä -Ä£eÃ6/E‡b8|¬›åá!ôa Ï^Ð%óhí…àL]À£‘â_R*Q£wc±Î»Ð‹_\¡#¿Õ•bÿ‚*nØl뾘g zï¢ÌD …Ò“tˆJ0‘InJ|¹×PŸÀ¥îü@“¯Ý…+¼ŠT–zBŠPí…îã”ä¤ ÄZL±DÓ‡àf‹ÜÍûq³˜µÏ”·P“k‡ï‚ÈÌi †9H~ûÙ–YïÇÔR”ÊÓÕ pK­ ô0‚Ѷ²žÅÉh “³®S+ª,¿{%a;Â:Í…õÒ¸›ÃëGxŸ|>Å=ïZG¼\æ^Ñ‚[)L.96;§J f,#YÜ\ou淔ʹ€÷ùßͦ²¨‰£à´;÷A›1`ýÂødž_æþ-2ƒë -&»ñ -:?¿SÈ´:ÍrNº€“2_ãMÜJ×I -;'h=’ô˜ -ç2\ãùp¼Ü´[湓TmV§ž’¤Ÿõw¸ƒø Ñ%ôpàwKÉÆÇp*PšA7w:ϸŠhÛ3ö13y8ÑÌ%‰0P˳ªŸ<;Å"HÇöGâ©Ÿmùä³Vv(>b‡§<Ùý+n,0íæ4×Í~…ò yxH¯«,™ûa+ˆÊ½• X‚;³w£_ª~Ôë/ß@[•.‡5¿ˆÁueIpa9·H2 4:)Ú:yð¯Kwö$‘Xí·9X˜Ž…Îñ7‘;²@pŠ`oâÂÞË kÝC¹¢´È¿T8•(ƒªQI[.%#ÕdðÙ<ÏôŽšÁ¡»;].á˜ÙB̨R¤ ¼Ç‘’H¥x,œ+“éMfÞ:m/ãcÁ¶'8—2%iP5È^¹Œ+¡'hœI†¾é>zƒ–Ù掇}sŽ$|=úóM%)äWô£ÜÍJÆ?Û2Ï’oõrC% ˆdZ¨€Nkäz8X[_ûï ¦°Ü^éH³! $hªà” ÞøñŽg‹‡ÞHLÌ È¡a’*¬›LÅ|ÆÃtR2s‹HZ•ÆÞ½*´ÒtV£ŸãŽ.ü9ËÅvè!áœA¨´c´„D -’f“r>ÎKT9Ò§«bï$t -'ÿ±HÄ|õÆÁ‘ê–â`)Æ #¼2ûŠñ IR¬ o›ˆS–p”Š£´jÚפÄëv,o0F[OW¹>P´ã&¤€›ð’÷-YÙ†5@õUB"´z0^ú]ÉHO)@Ç¢‰ -~N@î…åØ(Š#{EŽ£h¼c±t¸ôHÉ^Ëmzá¶Y“õ¡¤iÖ¦ÕAròÇ «¢ôä(á¤'a{iì3çùŒ±Ï f6B9¨:7ðñ¸±a;ÔØ­±ÎfÐz™Ð¡(ûl&Í„¾`|”P§9ks;ªØˆ~²”–ÃD¢1M‡æ³F:6  M-—- -õQo e‹ð T±¤-Ÿ¤K›`·Á0¡Ø@tÛ [¬Õ8Å,Hoâ‰gèí+= ´¥l¥™¨v䪒q¹ŠÖ|ÿP¬:Gi²ÎÎ.‘¤q©™tO¯Nú±ñŽ±!¯t`”§aò)Œ Ö ¨÷V"©€Ð”1îØ'7“*à÷äß·’g -M×8{Xm”‹|$JÉÁá6‡ÊÒéK‚# ÝdòÒ{Ñ)¸,Z vÁÖ-È×¼v?Rbø -\Þ§ÓT‘íiòÃç,Qï!õH´R™Oò(É0n–¬”èå" -œ×JIëÙðî#õ”Oõ¨¿« Šñó̃î%v€£ /êXÏab++VøKllLS2††ŠÜ×°“ -”î"ЛÃG!%{'í8>#ÙYÌôY£Å÷§ÔYQ•œâé ØK7ñ ‰{ƒ‚·“Pæûõ**öxªU£¬ˆ\xbåÚ˜ì"^kì@…_ÊÀÃ’ðÚx½ó8( -Ëý£¶JÏRv½Šä¥ì”s„Ro¯'­C'b°tbI"ÿé£ÂÒ:ˆÜ. -ôÒk`ù¢?2RW7ÒbªRI¼ÃÜôžabÓ`qéL-!×â3Æ¢0ôÀË–'@8ÔQEæÌàã Ey¡(%¤`éÃê—KP)E&¦YEkÉÚ]&©cKˆ_%%.¶•²*)بPjåã­› -Ç…*8t¹2@ᾧ½ë¥7PìÀªâ5Á¥®Ñb7PÀ›¢ &>Tû–)™à˜q k`ò•N§‡"÷û¶Ý;ÝØØá!ÖXUòجju…"sËØ9ÐCà™Î kózn¼täáiù8“ÛE03ýÂOh6—¹[x¯áX£ôŸtÉçnHæ -Yg‚‰RšUØp8’C²¡2:dz> “¼œ|«Ð£¡wWàN?‡=c™áÅòá´* ð`oÝŶøA£·@¶tkÃXG:>Ì1 Tꤌ¸uÕΖª$§à£ªWÞJƒ‚+‹D“†‰i“u7.aóà ³n[H:ADk)Û&°\!Ÿ«L°°XÂrðÆi·®*ôUB¥ˆp!‡é¡×€gr^àée7¾&R4›R‘aßkòÃYó.ÌfŠ¸˜çæãé•iØê€nr[ªÎlÇû&DYûméÀ4®m¸œ¹ÏÐ/aé—0ŒÂ,ŒTö*3‡ñzË´ý¶,¹Æñ3ªÖǵ&ö^:ÙJsÄ&P$iÓ¶>+ÜÚm­ÞÒ€AeZÍeY{˜±¯C.ÚàÅPþ„Úí›L[û4ªb18¢T7:w*‹\ ­a‚Cw1¹#†V8NúhÇîìËÚ -„ºçª' Si°ïèèÅÜúU°ê‰NY”‘?œ5CÑsË=ü…Ž¶ØÄ&«^n!ôãI^sëWýØÃhÀ%ôÃËYP©›‚W<šÚÓ+˜º‡MÁ‹¹õ«+S¤ŠyÖôuSt™`åÕàö2½Ñ“2ý\NÂàªç:‚!>“ÚØdʿؼ]£ñÃIAþù¥Þ&³zä }ÕL•cê_]Ì-§m­èéa£6ðÀÞGÁéIU™êP2+*ÁÍÅGŸ$?F™»!úCÊŽÕ&:}ÅUÉ]‡MAéZ h -zLn3Ø6]ƒ´¤+±JÀi¼•ÖÈJÀ&©+qzYõ+ÕòYOFû*Ô ±9::èæ'l#:½xa¸J±Óú¸Àõ²Ü°C´Ávp_ hnYÚôÛ»8b!Ʀ±H[ìvŸõÆHß>< -ý¬)r¦àª­œj_;4÷ÅÒ­tÌA:9mø¨é´£ †ÈTTJïèòš6sZreµžDôr+iÊéTŠoTö-ÔVV”U…`C†ëÇÃ,$±‡I™/"jsîe@†‚ªº•#ØåuxVf?¾[1ͳp­%=~§ÃQìÓ=I†8ð(¿ô4MÿªtÕżË-8ï,=ˆô걂ÔJ÷»âÆg°ßC¨L¦IG/ä11=»á5Z|².¸ôl AĈ€ç§zdOPN®³'½½ -L¢è‚8ü"¢âÀB‹h…vBÍ• -¼ Í O°>ƒƒØäÅÕS%a„W0©+|¾S¹,›ºùAO>nUU.K÷®±£!qù?¦¯Æ,)*mþ©tºãúW{8 y9I@¥¿O³øj>ªb8SOôKù0×,Gëµ~Š/ÓP#R‚‡ÂçYà> ¨/SSÖiªÔ~„KÙ׉ «_J½eà áK¥Ú%|l‘g’¼u“»j -õf§«]õ£Ö -: íu"›P¼œH£=¨Ç}±‘Šãú -!›ý)èÍYÊp€óñc9¾s`Ôîï\ûÃı7vüÓŽK*øÑë@IbVv c׊”j&Ä`c<áaã! ³`lðÔå²*q0qäAÃèÁëÛSm£ ÅÖo:|xg‡mO›ÒÅ8"cÚ¿̲´mh<տ䜜ûdü¨|mƒ[2>*ƒel£÷c(ìÁ™€'k¾x/Ý5ô»?]_ýåæüêöüê‡ÃC†£N;þä³ßüéþÌúá·ÿoÎ/ÚTŸýæwúwÈøÝ?þøìO×ÏÏà@ð&ðÓåÅUûá!ü¨È˜'°ùÇoO.ÞÐÏíÁïþpu;ýé­ÔIüÝ—77'?/¿|ö·77ß¿¹8»:=û…¾ÿEqúòüâùÍ¥Aünš@1Y&Móîå}~{×NúRÝ£.uÖÈææüû7·g¯q`ûIŸvÜÐ÷'¯Ï¾¹9û¿oÚr¾sg湦=ÍV?ßÜÕ›Ë?ŸÞž¼…_¸cgnMÛ×=ßÓëÛóÛÓ—;¿ØaSW×ßâè5ím²þùænÎ^¿¹¸Ýé‚­iO²ìÿçÝãæ»}qv|}ùêúõùíšYÞõ«³›“Ûë;_…ÏϯÖt&}Ùs´o]gßÊ·×onNÏþãæäÕËóÓ5íêüjÓ~¶1¯õÞ\óÝ×å>ôJ2Ì]ßÞÍ ¯¿ÿŸ³ÓÛ¯®ß\=o£¾ºþiM8šld~è;¼Õ¿]Óf6¼ÎÛ½Ö-ü´ÜÂçÏo·½®}Ö¬k#¼êùf^žÿðòîÇwm»‘e/Øâó;·òå¾ûòâÕË“ïìš6 ¿ƒ5þîë³_ìU¹®Ê½¸9i‚øÅŸ®Ï_?AenUdÿxº\XÓ¶öºÜÇ%™îu¹½.·×åöºÜ^—Ûër¶±6íg¯ËÍu¹UI¿.÷'o^¿>?¹úêâÍ/µ‚û¼¯oŸ}ööœ‹™}L -Âtå÷”¢¿ß~:¿¶}?y ïòšvÄÒÚûé~ñâõÙ§÷+^›Éë÷ñð±ÙÚîË&]àùÝráªÙó ráó»Ãuíá§{Üòo_¾¹8¹yÂKÛǯóPÿåúüêöÙ.b߯Èoî&éÃ&“³&š¸—ºsW¶‹ Ï¿îÞ…[ÛaüëC™^¿¹yqrzöíéÉÅÝnUAMW~Oòuãa~³mÜþyüçýõíÏ;PÚ¿)‡§××7ÿþãËíæ_I{ùyÕ½æ'ñ÷?½º¾:»Úűª]-–¿mƒÇ×W¯oOvÙà÷×WÿÞBÏÞÝñ+¸;>If¾ÂÝÜ×u³ZÛÆNœ§ÌNnÎo_^žÝ®ËEø`Npq~û—“ó­ÏÓÇÆ -žœ/w•¼Í-÷òÏmVšÁÁ·¦MÀz{Ø&‚­uvÃüÇ%hÂz{¸ûZ¬k÷yÿxvóÃ/õ0nú4ü{Åïò¼~>‡{¹žÈ‰¬Q˜Øí<áK»Ïò¾o·®Œû™»W¶‰ûÇ÷„umäñ=+ÛÍÃâ{¾:{{vñíË“ç×?î36Yf¸¾yõòúâú‡;ùÕÇ Ì??¿8Y—™üÁŠüªìEO6ºç}™Òºöð|u–ÇI‰_ÕSòx)ñ« -XܧÄßÁ³WE„y@×õøÜó]Õiì`j\>>_Ÿ¿~uqrzvyvuûÇ“W+~v½!ÛÜàûòè7d‡(–•]‘M,»\ôUÕ&QùõNÉ «ÚÆëÍY ?¿<¹º:»øöìâìt[Ø—kÚÔrõóýýô¾ûûëšö·\ý{?9Ç®ðÇ“6îNçñÚžËwíbEªÎ®o窔釼«bt÷•.Wu›\ÈÝʘ9ÿ,þj']Ó†esïÍß~…²“œ\_nw­·¾8¿¸ØÁ˜tvö¯U™‘hÙó×qÂ¥ßÕ}w1’_eo³],¨úæúòã -Í¥Ï÷q{ýqÙÃ`½ó=4±ùô×wGŒ~~q~uv²ªÙ¾ôù¦žßÍ+?Ûžš_ÇÖÿfƒprzúæòÍ;|ó£‰òjUÜm\úb[ÏŸŸßž¿½{S7ghMZÕ¾tí¤âÛ“›¬.~<ùyU´§+Ÿoé{hès·@¶ªÍðšï–³î#j¼Wñ¯U=`SükU¯ÙC4ºu)C÷ÔèVu÷ò<•H”ÓUÝõO<e]‡qßH”²¦Mì#Qžp$ÊSí´·®J?ûX”;¸öª\»xBWöüÜó ]ÕiìcQðLVå†zÚ7d‡X”•]‘{Æ¢¬‹¨î‹²*qy‹²EYïsó)Æ¢œ®Êà÷·s]üúžÒåªNã1cQì>å×gpŸ¸—ætUöœ‡ðºu±‰{òºUƽ4é}‰¹‡4[ìäš'±2§é'|k¬lñ8!# ðdߟ”öv¸²:s÷lÙ³ª=Ü¿„¡]×aìKŠÝðß___|µº˜÷}ýÂ}á¯wSȧÓ}Ç¢S«²÷í^rê^BãNœík¤ÙïV…—=_Ûóµ=_{/¾–Ö´ñµUáeÏ×ÖÅ×În®·š}ölm lmUbÉØÚïd÷ÒÚž«í¹Ú¯Mö{a푹ڪÐòñsµ§^²ª†ExɯvÆ£þnU8Ú_£5^£¼&Yé5ZŽ>ökôDÊ^Ýœ]^o-´²¢²W;ÆÛÚû…36¶ÿ5íÿ¿ho~Ñ~p°¦]!¶(ïEäÿ×­ˆYcm¯ëI½~¥Ö´³‡Õ“²ëªƒ³/(µ‘î JýúÓ,(5;Wg'·_ïÀίžŸ½8¿:_—CrXÿÝì^Ãø•5Œ{UëZYGó}3Ï•̽’BŽ¯/_]¿ÞÎÔÖÀvö@l%Á•¹vÍ“³ùó›mƒ?6°º;sϪ+ö¹O œÜœß¾¼<»]×Á<*7XU¶ëCRCWÊáÆV(àl¨*óÏmþšAƒ[Ó&`½‹=l»k݃ݰ‡mA5+Mn‡õ.öp÷ÕX×îóHîó§œ?½Ö'lŸ7º†¼ÑÝœ¥9ÿéìâ/'?·.ÚP~æ.ÇÏÐÅÂÄU½TÃÒï¸{ÿïÞÿ+›ÙÑÿ‹Ô`g¾Xåï}¾wnî©õÚû|÷>ß½Ïwïó]lgïóÝû|ßópö>ßéVVk½—þ¹¶ƒ¹gIý/Þ¼>{…iÚ6özÙ^/£íü|vqqýã?Üœ]}ÑHýì‹öžÿpýÅÛó닳Û/nΞq}srµÕ ú+l|O¡ú÷šö·×Ú¶hmûÖ¯{­m¯µíµ¶§¯µ}}ÞÎ÷êöÙ.E™éì¢}g'•-­Êä;¬{Áéþu~ùf—"šeU;ÒeßMj÷RÏßܼhlýÛzú¬ªTótå÷TÏŸ“µ¦}=õ˜Ì»UóÊ&Ÿ0Ôn7gUîÉÂò:!ÿøú -ªkg‹ÅÏw·“n8W£×´ÃùÞ[ùöÕÙiÓnö6£½Íh!lƒ…ˆlFl@BÓÑÞf´·}€ímF{›ÑÞf´·ímFOÃf´ƒfwñŽ-¬F¯ÛÛ¾Ö²£5Ù¾ìÓ3~½fUpe){OÜ&XÿýO¯šÌ·‹…e]”·Xþ¶ înBZÓY.¾Á÷4"5½yMû{°éI¥˜?±BO¥¯tGO4¯üæO´ØÄÅùí_Nη¾Â;Xq¹–û1„5:;?á"«rgÞ³ÈĺÎá~E&Öµ‡ýãø´ÇUÝú¼Žk|ìïû0®VðÿtÇuía_i{ØW`zôwù=Xýªha_}éc¬¾´á¬Æ#»¯¾ôkW_zšåVEøûrÓ­¬ÖR~qçÏ/^¼>[sìÎŽäuûpsö|uGóÄžßÙ[x]Í-a½‹=l“¢Öº‡ŸöÊÍcóš®ãºù̽ž€'r2k÷¿íUÏèGP=¿}yòüúÇUVýÝkh«ÒÐVÕÐ}¯¡mz žÆó¼×ÐVNlk»7÷ÔÐÊšöpO m]{Økh{ m¯¡í5´½†¶“†v÷uhão×´ ÔÝoÔÚ6ñÓr?ž?ß%%3˜Um„W=ßÌ˳]²“?·~]»‘e?ÈŽ±*7âÇoÇøÛ››ïß\œ]m-±¯Môtj½_™žïO^Ÿ}ssöß4êØö­±JÏ‹›ëË»£+V•èKkžïäöz‡}¬ª¬x¾‹O¶jÒ¾hÒåû¢I[6õMú¤* ÝGþ uß›7'§·'º>_WncŸvR(k¹bµõlñó½]½¹üs;Š·;DÏ®«Ǹðù¦^ßžßž¾üÛùÅ»ººþG¯io“õo`ª»¸zNW¥w>Àµsº®@€Mùjw›Öu÷ê&õ¤2V?–Â.»Üu‘Ö'YùdïPx`È×íÉÊ’Ç÷†Ò_„aï¤-ÜÞµ“XW0OTYXUÈ^W¸û‚­iOƒ¶°—QWr&’Q×F`{)u/¥¾_Ø˺îô²®-Ü?äŬk# yYÙnòÒuŽï¶ÕÚÙksŸ¸6÷´}?«ÊO~Ç.ÍÏv1ÞýŠ|vÒÀÆÌëJõØðÄŸ]´µìV»sUلúç[:ù×ùå›] Ù~U6R]öÝ÷^–Á77/NNϾ==ÙA¤[b¦+¿§€°Â¾¬{3Ç -e¤ƒÚíæ¬*÷u²ð…åƒ|}…/îǵ³Åâç»»`)æð]tßÜ/WVöa¾þ÷–æ¾å~›{qîŹ5QÈ^šÛKsŸª4·ÒfÂO\¢¬ÿþ§W×Wg»ˆ «b2ËåoÛàÇ)-W¿Šö&üÆ„ÿôxúJwôi_?eNprs~ûòòleY̤'úš6õÉDôíÀÖh¾ÛäÇûç¶ðƒ!6M›€õ.ö°MÔ\©0 -ë]ìa[ŠñZÏÁoØÃÝ×b]{Ø?ŽûÇñ#x׸û¾‹«•û?Ý·q]{¸ßÛ¸®÷ý~oãºöpŸ·qßkðÝž´»YýÚ#ïKÿɬø~Úû꾄χ>ÜÇ(áód+²®Ë{¶¯áóî}ÝÉ,>6lµæþ{4.®oþxÒÆÝ™î·vV~ù®]¬ˆ‰ïxmþ£-äõ;¢X>¶[³N6°É’ Ùá:0üßMSÈšv+;{o6±/òñÁÚG(ò±VÍqÿÖ~ö”jdüyÕfŠÛZ·´é‘Ú¡ÄÄáªÔ¿{Ö˜8\›¾W‘‰'å4|b±up6píÿ¶²: àb«Tîë1\÷[s¿»§(LÛuµŠ}qzä «JWsX+¿»§ñê’þvsrõúůUó›7W§]ñEÞÉzv{òýº^ŒÍÆ3\æßw3иƒUù &KoZ"û=‘­ŽÈŽò9XÕ–Lf_íÉl}df?jfö­Q ü£½ýߜ߬êÌŸ¨·7}¬ä<ÅôAæõ'tuÖÊ –Z¸ÊÔ¨}Œè£³¢ |·öQãïÃÐð„¿¼¸XRvovÄì{ ÑÞíºzÕÜ« ÒÚ6qÿ>Hq]y`¤•íæa}þ×õõónNÖ%ʾG¤ß~ùk¾ûýÕsm†„° ïþt}õ—¶%,„rÈð¯Î~8¿òÙoþôJæÁ~ûóå÷×äþ?;øÛÉÕÿö™9øò³ß˜ƒüøÙoÞ ÿgþ ÿCÿý'üU¾þñ3üëÿkûŸûñ üñàÿsð¼Mõ¿~ö›Ã\j9r>„ƒ«9²Å¥ƒK‚ç£T=ÀK=rÅøl±,G&ùˆÀtdcu42“Ni†x|Ž4³s™Ç#›K®?ÓàtäBE¸=ÊÉdÜæ3×ÖæŠÆ°}$×âJ2mÁÑþ\i ö¾Ü¶ü\¿zK@=N›a²`Ú¶gíÁ1ÎjLðxTc²08å£ ì®º£]E`U[x`tF'°GÕÙ@ð¦%Ð!0ÅìeZŸ}d káÜQqÁ<”v‚´.ç ŽG בƄJÀÒ0CÎÕ<ÕÊkˆG&Ð`wdjMŒ#Ž4 7íÇ4CnÿJ¸†\Õ8CömfÈ ¥6ü7mßÎÀ é¹Ò±ù£d+ÐYn_3qÖPCDæpTŒ)BgmbŸ`sm®†²Â¤S-ÛÒ’I‰¯XüVÛ™ÓåvBmàFÙ•ÇzãaÇ´£R: Ö0z½urb"äð½•ÁÙÉࢷ¥fëè„m"šn—ÍÖTxÖPô -5LñÉÇ£è‰"ÛÖ™kø÷p3«i•‰Êì‘«‘÷VM£ÔL3›¶K¼$Ò`k£c -íÞá´¾}Ffh8hðv*Á&þ\D¿õÈÃ\4C»ý@íH%ð mw|[Ú‡õ<¸í§07â9 o%½Ñ„a ÆdŒì -€mC C GÙáP3vÖîö‹ÆŒkÐnk[{û£a;µ?¶þ©ß¨%²®Vb„ϼ'ã‚l´-ÝÑ—KF‚©Æ·½eK@Ÿ³,Ý6Š }6æè6µsup}.º0äNOt-hŸÈ¡èTñ·ÐŽ0¹a )9¦ ä‘|¬îÌÏ0A¨AfðG!ef ƸÊ4àjÂììÁF$ -ú°‡ö‡oü¢á=4Lè/ iÒù7Mju)ðšó_›œåËYC,LíÂÈÓb$L×¢<W¬ŒÜ˜&s˜†S6–‡ÀƘŒ÷™ßø‡ð³v´ÙáÑÂůåÆ”½’jx„ 0a˜vHÂRÛ)×Zii.¥ÄÜåTù1 ú0øKó(þ\cÊÕy>®vpð-frm53Ê&àùÂSv™†Æs}EÒ¦Üèè€Xr H²ð·äa€ß«–­klÃ+ñïP»•M`ÕÎ;y£Z}ˆGçÓÖPÒ@þMÓ6üň„Ô¾Ú.œï¼Z^Ø&?WÇw¯B䂧G"Dý}WBfŽj]fžì‹a¤‡¬Àd ¿ºøΓéàÛnr¥cÃB!`c¨´††…†âEÁÄÂ7"ªY&üWµÊ“_/¸Ôw‰å†&@D!ã-¿(ÊD˜(±È3#œ%zÞ0˯~“xpc2…üÞ6¬T^)ÃKd,z›ås•Ø<sÖ ’cò¬ÂýJj²a¨üÒKO`»:Ù¢Óˆ.ZÊ2¼, c’i|! -¯‘Œ±‰9ZÎF^Öék{,p±±P½K<¶D¶ê Ëj¡öèÓF£Âšå]‘£‘V.Ì$Û÷•ä©[Wˆ>‹´€ö,ºÏ@Ç©¨}¡mœSb1à €$—á@|â{^>p/-¬Id¹DÙÄäô Û%¨$£[}CàÐí¢qÃœ…ÂH¼†]Ølbr…P'Ì`ÛE²L&[ÏÀT KN¾ ï²má;ÒДÝ%ºL ‘ô¼°-“gmr¶íÔˆ@0C"¯r>>yÚ ÇÛ0^úð&¼°$Ý€ÙU¾hí¯²‰,‚8¼]>O•ßèè’,A¤ë¦ƒ4^,x ‘¯oµ¥Dˆø” ZÅËÂì@¼¬$æ5YIS ¥è­ngU<œ¼\M;ʬ•Pø52ÅZ¦1 )=@uQÙÑÒP¥¡÷¬Qi(¸á -âB­,’4±‰•@Tz,<ÐBzi‡J<ä”H”S¢—;¥@x,l86©’&n»Î¼G· -žlòµm¤IŠ!Èœ¹¿$Môe‰P¸#ò -üØðN#føí†áXԎƃ*ƒ'ОHuQ gkï©7ŒE䮬-¶GÛà ®ðkĘð Ë,¿=¬…Ÿiž¤½v¾B ®c15ÙI/eajL®Ê5™½§(VMºöEä°—Ê´bt„Ì&ÔÈ35ÈMrDíé· Æ&§õ‡ÎG’§¢H¹ „…Q¡n¬½Ò ™"Þ´€>A(jRI£?G¤êÛ È¤Ú~õôvKùÛÁ™À•O}­7c€±Qxwìgò5Â{gX ¹ó·ßýî˛۩Ñç·ß}~ØnŽm7lŒýê«/OOß\þõú¶Çgþö;0î|§k™(Šç&<«ôA44…X"ÁL1Ñó:ÑM!·¼Á»Û(¢½ €‘FHuŒgëX³¦„Žçœê@¬JzR&#4²FÝô+ÖÌ›B¤gÝø)çí92Mã·³:?Þ„†;ÝdöwE´9øAÑj+K_M F²þF°&¦Óu²±‰§—‚G·§È‘Uxt²# -òΈîéˆã·ÏànUQe)ng½¸]C›3ÍÐng ©¢½Ž3ÀÛˆ| 谸š¡(ì€æ@À2?KF)ô’è‹`SiÚ?NDC’k¡…Ô:C,gè¦Uù‰ÈHhkOX`ŠlHN´¬¦p•A`" À.]&‘“˜-Li2¡çCŠ¾vÎÑÆÒ ¨®¤›ZækƒÕ¢Iȵʕ°V5ÖÆÓ3â¼Á½M¬u3²èe@Åœn˜Ñ¸ØÏ€Í{ ÄùKbÝNÒì`šÜ‚íꮕ÷ì“Ø&ÇÊíg£8†­X…(œ 5‹žË~/C~_Iâ2ú>b_ÙÁ’+qÒ¶ãĽÝ^€l/ihÀ‹s*‚p%±í¼dÔ£9ôÈ>“9ß©„Ó®õî:øDî·ª9±çR¶‹²0Ok˜´pp[¬FÖr2á× ‰ºÁ ˜ ï¬äʃÉÛ¦ŠHSïô· ÝDBv|`M$O ÀŽbü}r ÒÁ®¯DS¬ÜZçxÄœ·|ç*kÏ9¨åÙ›òX×+º‹räˆbùÈ}ð Éð‘;ˆoé¦}"G¸Lp”„výЕ[‹¾9ÜZˆ…°Œ†¢–ªë£Ðòìï š†êhw6ÜŒüwÇ¿oþ2ϧ{lGDm ’zó=$WmŒúíwø?$yüö;Œ–jÅþ8´ j - ›â¦‘S¿ýîmµíÅ'YnÅ ¼Œ‰ª­Ã`°ÿ™”៧ü»`zÉÓqh2.Œó °’å— ˜²¸´hÂdÊ‘P ÿ”ë‡q}#}¾ÉŽñ—·SИ°÷íË“Wg_]œ]=ÿËÉíË?|Í´óùnó7 êk£¾|ölã¸?ž@Èë¯Î^\ßœMÉOtz¼nz¾"šV‘ÐÈz¹ø ÆF±ò†˜Â64´†’ÿ»º0§èýJa:¼€"/Î1™¸e:GÿI"'Ó81˜Õ›æ˜&ëP ž­,{>l½O¼ÄÇGüå/uÄ_¾¸=»™Ÿ0²å"ñ @´ ˆïûü¶ß#9¿ç÷¿å¸ã÷¿á¸ß+½Ý|ÖMo·jrª¡”1ø•¶”Éö–ëàÚá /[¾Í O$?¤DBÃ!ºs@C€z’MhÈ“Á`äÍևɴPÖ fb†×".qŽÊR¸‚®@`ýTSŠ“¡}[}Ê% -X±‹B˜!°£T(Ô—\ᩨ(½QYî€3•ˆÂ,-?Ô`à̃²ƒxuTÚ§€²µõ3°ï©Ï·Ü¿bÏAá{-5ÇžQ"À…~9ƒƒvSYRn+"Ý9œ—Ãwõ-öP&GüEBšè&Ó@Yƒbám·¡f‰­£i+-'KXG`ta2´ïk˜s‰E¡ e†ÂN’…Ý%žA8¿œÁ‡Ð ÔsQgNŽƒ¸0¢ @ ÍIíY}0zë´PÖÐ]E‡ÁÌ2-8É+ã@× ÀŽD\ð8¸om˜v‰Á¢W¦'H &.X­Õx”`;Jx.è}A‚Y&óò³GË=Ãzp“G½F‡¢ë*¡·N§`òùîæ"8DîJx¬L -(IÎÚɨø£ÅŽƒû®†i—(PüÅ Û½œÁ›:`b’G%$ôx9‹ „HüÊ@ƢƒöÁ軯bœäi ¬A±(–ÿÜp5Æ·DFL£p7Yƒ;qÁãྵaÚ%‹íËS,úêê ‹Iý!í±Wéå 6ZŽÍl‹Š–,[àªâwŵ‡7¦ÈX´ä_™ ®`¦§¹OÛ²žAá5KHŸcYdÕ5(P±H ÷­ Ó.ñ X”N±¸¯UF7A±‰;° 0ŽHªVè0kŽaŠÀ¦~N‡bl=Á2ãâkHÃ!÷®s&Lé`Ù^¾¯ÀŽ½fƒûž†i—Pì-žeÈþšc0HÃäŽ=²ÊóšjVKp‘ãw¶æÈ(Ï ñÓÁpuØWߧ€¼†ÅCpáìð‚®…q -ìHăûÖ†i—xP$Ú0{T†Çºc±-Œw€q›—s¸¥@VZT -ÌÌðô¨@\/9 ¨XtM1 †X¨àãtÚÈkP,2Âé@=§M%I²vÇ.xÜ·6L»Äƒ`ÑV3{Tš<>×ó šK€Àÿs9CŒV7ãÐÉ`ÁÑ9‹oC€´‚Žò< f§ÂtÚHKPE›ÁcÌ™^:+ 9ãØqˆë÷ Ó.° (Liþ¢ty§£0Ä(á±88ä3FyQ2[ù›°PÈOPÀãdÃT¢_l2¢^EÓôi ¯AÕE†WŒ&$Ò´€Œ× @E"-xÜ·6L»Äƒb1¸ù‹ù®s,b:EÀ#u9‡;±¯Áš(D$ƒô/I¿lƒ`£·<ŠšZΓ)~P)Z ¬ä%×I!š¹Ä& P`G`ª³Á}WôK(/r—…ñ—+È£—s¸#]”Ö$N0`$$Wµ×³ ¨(äô¾a0„Åk˜°L;y *¥3 —‰Ez™ð -YSu -T$Ò‚ÇÁ}kôK<ÊfvCWó\ßkŠ·‘ ´C]Îà¨Kqð‡—°ˆ0Uv)¦A€ŒÅ,‘"Ã`H™5ÖN§í@YƒbQà©DnNë9åY× ÀŽEö!ôÁÖû´K<(³©»c1RJ¾yCdA1SÐIl`Ü*¡E¢ÀïM€ŠCÃó>à }œNÛ´Õs -¢G Ò¤P- ‹·EV ÀŽA\î8xØnŸvŽÅ_È3ó¡k—~¿’*S†"_Îà`ÛL^Ñap Enƒ ˜¢WÈLm_D}0Ä:ÊdïÓv ¬A…t§~meZ@‹>NÖ @Å!-x—½ˆrXif8}¨8{–O½×ÔzÉð ¨ë¤u‘Ã)hˆIL7CLj€ €1ÐX¼ëo·œÆ…¤pÀjå:öt$0ƘÊfLL¢}[#!ê•Ó2÷t?Å…ªÄ/fN¾>Œ”$ E,eK!01ÐÕ¢‰‘VXtÑà€ÒãÖ“&ŒÁ&ÀŒ›^iภ„C* ÙóÆÑ6¢át z:æÚidÞ—"_¥à¤P*:B´†B¸i+F“(ð¸»ù.Kñ0Dž ôÖ€ÕÒsÕ®¢E@ ×±^|ÒÈS -GÅ”w‘¨9K€Xû€Y­_éCo ~ ¨Ø„)ì:ÁìM¢YΨüÞ©”Év" ~s±^€ãçU*H¡)ML !ª‡6ZE”M´±^T•˜N0=ˆÓ-¤g ”~]Ù‡})¿’yV¥ -¨. ¿_ eLȮڜUÓ)dúPÖP†ÚVóéò,{IT‡€pŽ…ä¢WMSŽÂUgtÂLâ úÚÍ^ÀtrÌy{ [–\ë$IŸ <œnÁ¢®öâDš‚Öâc8]æŒ@9/ÌÜ•‘qàªAÎk6Øky=™v±†Ó-këËŽ’ÚE!ØáRx ãj(FVZª¢y R! Mn$P=öZ^ªó0˜(ÆxÃwÍ\@.—UÐ –ûuÞq©©40FE-ÊDè>V;³—´¹«+±|’*~Zààt n:ÚœšíøŽ#s—ô­â¸Z¥U%²‰a¶ˆz^“ÔzBskß6‘?p9Ÿ­ÞªÈæa–ÔŠXFˆ÷Õ  ‚=DÏEgN­rÄ®X]‘wÜÅÁ0(FSÌ£×¹cSp»€R©4‹Ðß8΀"jìÿGœE"CÛˆÈÓ-qo\âLu §Ó§-®EíâYJäAV#¾J€ŠìEqN -gÞgX8 -+ŠXVgkgï€Ñ;ò&aΟ¤úC!v˜à*”bÝ@õïF÷uFNϵhé)Ÿ8ã]¨Š8¬=Ið¨¶G¾x<؈ÄÓ-Èí{U-ÒP5‚àFÌo®d©¤âOf‰-Ƀ&6BV7#§jE( aFoo‘¸¤¸°a™g)šiŽ®—#6”æh¯@g´Ú©VËÀ'‡”fȲÑbƒõÁQQËÊ)›Ý+Fi_X°«øÂõnDâéäv¼'¶Ì¥Úu††.–•1”¥,GþXþ44 ÑÍóZðI›ÎÄôÞ© 5ò·BÚR1tCk@‡ ú¬GŠ§áG¹£ÙˆõÕðU„Ò‘aXãmãŽO·`b”:%?¶PÕÀK!O5A^¯BH®®¡¹´{TJ…Ú5Z¨Ò YS÷YmñrQŒÌåqÁ¸Ì¨tM•>ås‰BZ y†Ò%_§¥;+˜ò%“«æÕCQ‘™bjbUi†Ó-èé2_W¹ÜXxü ¤}–Akw”“o‘/+FQÝ cy‡P3 ¸ð&R„÷Ûª I¬²Ó€ûé3$b‹òB&¢×(ÍÆd j†u÷$ÖQé(A&u"Š”‰†ýr‰¡%N· §ã ‚´¶dí©¬ìYðd™¢{Âek ÅOTrârŠú€óÌ@WŠ`ŽukÈÖçb…ONyÀ–\Šzæâ€fá–ÒtÉÇ,%+¸Ð¸‡: 9~Ȥª–X©Ì–¥hܧ[ðÓQ)«Q„¥.å®ñ›ÔÅrÖ™«œß)¥¨áZgAÑ \ÃïGËÌéÈù0ˆ%£ÎyRñ`†á5qšÁëÕz)ú"E³ 6*YO(26ê4Cê'ðÖæÀÕϵe,UP%+Q‚Lµ zlêFáH+ë–(tN«‘õd± ÆÞÚcªÃpnX\ìÍ.\µÌ”^³õ!ö¨JE$±­T/n,8Læ”h’ „I£©žŒßhQ`1 -ò,¸5BÖ Ìr/1 -@×ÀHCmÞ‰6/Žúø€q»½Ù=rÅÒ=ÇÏI¬’ê$fM¢6²¬|$-HO ihQØB„5_éR@ÖH’L–jæXžH­±M5Œ$Ç{ ä®RTëq«Óƒ-QGKæ±h]íYg+–KãÁ¬WÁ3Z轔Ǫp£ægdmÉ‹îÈÅÁ°”,ƒr$5µ'°D­axÓ—ºm 0,§Ä ŸF&ß'@c=‚5¿¨‰×v+s/ iÇš% —÷êV’—>Võ#‹“!‘ÍŒLjV TC*ȇݭâ%±ÉAJóÂn‹x)ü$ªT*Û•nߪrÑ*ÛJhÚÕñ…u’X Ñ@N,(“§ª}™ Ñ£¡*)d’á(&Òé†Éj³ji"”’Ëz4d¼‹Ef3y†¤–)iQܦ£–¡?EA“¦D¤Gîjƒ%ÀÅÅ®Y3´Ij‡‘±ÛLA5œ€™X T »iV+{_ÙÙãcM…Ë"häò` ÈEã5YL4ÉÅH1õ†=½ çHÞHhù\¬D{Ik±HÂa u¢«ZNüÄ¢ý,ÃIÇŒL§µP[¦èÓ -žÃiÊ©·à1†¶\Èí@Àê);SY]Š»T^¸Ë>d|†]¸ 6¥³„ÐÛÁÉÂåxkчb§’gzÌ܉-U’ù Çòº“Àp˘Qy¨œö€¶xÞY¦OÅÀO T’ÖÚ³¬Š#ñw+ {>»­ËkU¦éBÀ(&ìÝÖg0ž©Wò|AóWÊAÿä…ATQ·ÒE‰ÊF7¿S’ŠTSkl”–ö¢ f&ck^Á±Iå*Q…Öi B“¥„³êb$ËN…ÄÀJÇ>°¤k‚”t«¥ùÁ6ÈÔl¤÷¨vÜ\²]ÉŒƒ^¬Ê³¢žƒëB}…&€J^œ âÔÆPy‘À¥fbÊbѬìö M@Û ›yiØ …€˜2LZ°’£)MüêèdH‘Ê«!+¬R™òC9)†7ÙTmd‘’休£|NÐTšƒfMŒÝ0Ær”uûà¤!OÎRv‹ÞržnaZ -=ApHjôÊA²<”®¤¥Î¢ÝÐ%ωÏßú*ƒ¹V1Z+âŸ5¼À;uBì"¶Åàœ1æŽ/`µa#Sa›nêR –²­œÙeµ‘†äæsXÎ×K~ן5<¸#NÒÒ7…Üd‘ÏB"‘,6ØûËh+ØW†NÂÇréhŒdǧªç'œd»Ø^ˆ&à2ØÀf÷îQë?°¾Þa+©µpÀ90˜jƒ,s0?×ÄX`Û3@ùf1KèêªtÖK9jç­˜ìµ"]x*À¥,u†YTÄ¿y)ðÊV!,a­28TO™«ª¨IB™papLA Í@ŽQ™ÔB¥›‚¹GVÞ, @#"òP/eJ}e¢Ç;g4‡ÃQWÊÔ[7–¾ª:…Æ[†«'=RB|Ž•]ŒM3\žÇ7dÇTªöŸ2Å ¢Q‡‘ G]“†ÝÂj{YÞªA )«»3PcÒ[c–#F—³YƒæPz¯ŒFR‡6 0˜z¸aˆ7/ “‚‹3`ïB²Õ‹¡ >¦‡÷e¤ý$é渪ÒÛO‚:æxµè  ÷Rï$ €Ý¹)˜!…QgàNX`™¾feV(jI.zñÉ¥è}ß„D9 -¿ä¯E5+ `Û^få@@Æ ¼iŽ{OhŸV¬àê¤×KÅXàUžk‚®ÉÄíYp¡+^ªäî—(‚˜gb/ËœÇÝ+ØçúCÕi)þ=¶cHî¹nbI»‚iHhM+Â\'æÑIªlHuÎz:yhm±ôàGŸâ ´™`÷‡°Pb ÜéMThêÂ'µ( …–|É<ØZ)¢Î=R©.Xewõ´^ûÅ°Äv–®—™,ªèà…AØ’i³ -ìב[ZµËL-ÃÈŠt‘W¨JÛªúaÜSŒô:@5ës‰D÷»bR— a¡xòΰ£ÞìLⶸ“;oà–T™D$OÃKnYÒ°­i”–:¡gÁ6kHM±\nüédׅε%+AU‘§ ?øX.–ôë¬Â ‰~­XÒ´ž”X)5–QD:’Zj¤®“£¨h•“ðÒ¯ÕjU,Þ•¥c( x'4KŽ€Fî Š,š]»ÑÛI¦@Å ›žÉÃädÔÀ¨/ÁH#4ˆîéŠX¥Ã®lÜæ²ÊËÆ€Þl*ÅÔ ƒ ÎrÛø½4{D*˜ -LC) ÄÛH¤4þnà²nhøè_çž¿ÜáSdHÀBc±t“åûs÷.*¨>8±‚q®"Ø®­ä2çÊÀ¦m4ù¾~¬^+…g$³¿ dlWöI³¡¨ð6F=õ΂U -o£‡MÞµgCHŽÓ&^´Ù~0ˇ…Z ðœÌ@2³FJÑÏIÔú]Ô:/r ºãºPc†-/Qª;‚AÏ %瞈 -ßeoD ~ytìòÝ9¢­zz†ò`k¹ÉM–\ÖªÅülïs™Õæ¨?”n¢‰’Ö&tƒ-¹¹²“^ƒQB@ô±~8lýA¾ §x”~”9˜v™$ ãÕIH™˜Ô(Z^¤šH Œ^œXFÕX½R•k³Ó´®J;'•å‚¨<€Éž/'Ã)­a¤Ÿm!W'vœ¹[Oß•µõõc%“JÕF3Pk -LÀMŒMƒß8/"´ÉÔím(&s4Sb«*&ià‚•a¬xAUµ‡’aݤédK-ØÈ—&âxÐg¦%Ã(IQ|iû.‚¥ÚIx)KMÔ.Ërɨڛlc¦%¿àžë»”$ñ]›ÈCqqºa‡=A^)«ÕQ`Z~άƘTì‘ã èÿö޵Ƕë¸ýn@ÿá| hz¾ÉVœë¤H±¯Œ ¨-ûšG4*¾þ÷wWÕUsíÝG"y¨À€"¦T\=÷z֬Ǩ1†OBˇթé¾tÁ&S^;»qQäi­1O7ÐqƒMqy‰BRÅÆsàw)=¢§À¢Lc‰]Z†ya§ï‹Ðÿ ™õ~atW\I ê¶í¦*×ùC™BNE”_Ý™# §ˆZ¯¬0&ù.–/;ào†½5îEØ¿eîM¨Áš4$ÑÊ+Ôqµz$VðKªP¨¯©Jpo>ÕÉç…—A3B_!ç1ù2¸Üyy ¨$-&£ póhÓæËòîµ {6¡jA00}®Ü‡EÆì\w[N¤–ÀàŠŸÆn#Q…¨†ì3ÝåÀrwɯêQÏ8<ÃäÌhk„;´(´Šá‘ cphÜZ§žjÎÓ•lçð+@ÝAÇY|û±j Þr¡‹I¥%8!Å'N>žB&?¨â韩ðÆ ’ ü®s*c‘,>jƒÒû2ʤ~0¢'Íïb§’’6³Í_.õêé½Í‘F“JìdE¤+X†â3Ÿ'Q…ŽÇ̱øŠ°kf¤~Õ©Ô ëúÌÖb®Ø’«ÇÑ-(a ö8L³ú×d¶ñ,„°øôlqÎ(NG¤&}+n@© --·Q÷‰JH‘PÙ¶$¬p;»ev¾_ãvaCŽBlÿ¨ªµEСގì)Ì6ƒ¸% Z‚ï(‘P‘,_jË6Þnî -­)iL ÿvs;†.¸ù$ûpðfݺÛjð{³ÐÑ(Ój¯ŒpmŠ4Ê:ÌÁ×±¢ï&htŒ`Lïý-Gr))ŠùÀ=ŽóÈÿâ90™ÉŠ)0ÛÚ‹1ËtÚf9ukOÉÞü‚;£óMHRuÙlFÌ̓¡ÒÇÍÀlºŒã4y„Ú=æìÖtˆeåfDATp«µ N´îtÁ½TBÊL¼Þdå½#‘o~³¯s°”ªD5íhf "¨„EÒ` \þ´T%ð.5WæSê†æ$!RÑ nªE{ÁÈâ-¶ó`…A" Ÿ»Eãš½éæ+X}B[;Ý4G5 Îv&væµ€Å`…jóÇ6(?o«c­‚] .ˆg˜wuD›Â?–Uù8_¡³¬ŽD8™WÁ0J>Æ´:€/Újóû€áˆ>ÕHõÔ ƒ\*¶QP=‹Á¹Nx<þ§Piu lvþPà%&¶2ë²%†©ÇpѤD¤ìŽãœª‹Ñ0—Šó^¶Dº3sY€›ugàôãåÍÉÑŽÞEe!_¯Áê2zsìKœJÓ•ºUÖTFˆ íSQ•R!)ø -´S ±À§ýì“Fòq²LK!”1œÌ&kk¢¥8 `R†<_a!ÌJ€É H«Ïˆ1óµ½Åï~ƒøHÝt‡ÿÜâ´z’Dô‚3´\æQ0&£æ`‰CĪÁ° G¯1/ðÈ~Dµü€¥i™ª¦n~…p°ÚWˆz×qh? -ÞMo9Òr&©ZÔ|té{r¼ÑÀ,–¯>]pEÒ µá|,™{m%\ò’ú“Y${^m,è™+¬Ê‚"*¢K ¬»´”;µ¨9p Zá5@LÐRU¾„LÌ ^§ñ8ÜI&œOÌ >)­O‚N ᬛð eÙ©F¬0)»*e˜Òï`& Î⃽]íßLW‘Ÿ¤…ÒÂ:˜ÏEo‚°øŸ=©|ÈP [¨Š¦1Ê­¿Rܾτéò÷£“ f8a'[fšÛÒŽ³}´èuÙDEftÌô\½MÊHlÒpXýÞWàPÌð=Q.Ë&cxy6@aJͯ–€£!z=X¸däõ "'‘U Z—f âÈ@†ƒ.“ȲÒ9#˜XWV>–ÚãuLv{Uï÷X¡9ÊtyøI¦W¥lðs@‰^!0‰2ÂÔ—ïÌŠ²T€þQÑøFF¦jôT»[ <È׬ÎZ–OÅ‘ ­úmßÍ„ ¼bлU–üø"¶›ðÊKntý€†j Âä\%Ÿ‰€=ÊÜ0òYÁ¾k¹ˆm¾I—]ä¦â>ËÕŒoÖŒWTOÓt…¡…“1Ã7|Å£~@§ýP–³bòøìîÓr=Õ¢mb 7‹µ‡–L WW9%ÜÜQ°y¨ á‡¦¡Ì—4/(úN-÷£ù~bâ˜^Û–£% ®¹¢ø|SÎÀ%îý¹+.1b@ ¬9o+šX -f¹X§“Õ|rø =š jôÎŒ|èÖNØ}²Z‹5Õ×f2!ê³]ë¨]òI ¨ž¬Tê1 |Ÿ¬2l¡—Š\­”ÀªNó; b Ü΋&<›V±“CÉÚ`³ž¤‰tÈDKÉÓõáICúdåò bƒ"‰‚„“üü`ýWA+VIWký]À:0òyïF J=‚îòˆÃhSMÆîÎÿx$í £õÁ¦¶õb” Å-›§ýZ†^ѲEÏ«vB¾Ö< \ÓÞùT»ã¾߈HDj\ï—È5÷󲕤˜Jõ‹0mçÎLQËŠnŠ,Ža’Žwô£bz×ݸ­}©¿e_ª¤9ðC™¥CU˜lŒvèŒoÞxf·\RõrÞ"±„kÕ±;ÌA×bƒ01ÁVh¾“ç@ÿ4ã²ÝòÀÞlƽÅ]ÀË»Z`Á*·eÎ&¡,ÛºûýØäTã Î!z5ú('¹8Õ·=s…Þ¼WRjÄó’Ï·ñùBð^ÆsÓŽ ÆVÈš(În,ðz€WßLÒ”³Éïç<Š¥ý€laÈ£8’ZZÙ¡gcgyc§3xÔ&98/\üÎ$â6eAL]1} é0½¼u8‘q54zÞhÿ?“‚]ÐHZß‘ì[Ô0ù.LâRéA£aÒ{ïÀ£Ö(sœ“mj¦2ì‘hä Ͷ|/:ðNê$sÒl`lÉI2­Et¹H¯|Í1x#Eüøøq<ӣÒuo˜’óbD[o:·Åt©Äe‰ -W´žé œímøJË•K1{º7Ö3µ¼õÖŠ9œö#——:°2ÆŠDàRó¯£ÍÌ-\jÖ^BÿÒ¥ä\J -¡á¤þŠD`ë‰Ð§êºl`H3êLŠéV>Æì‰OÞ5I¥ÂävºÂƒ”·yšœdÓ:=ì£T"ݬÜNôvð8íÆð ¢€²$Ò8¬,¯ÝAÙŽ‘3νJWÆxYÖ¦è+ö»8«Žê0›Ó6¢v.]Xº°»?óÏQd–bQ5ÃØ\,«ê…+ðºº5H㬣&.Œ²ÊMÈ<[çe¶7Òƒ[j,tÝËÁ[ˆû¶F3Æ|Ý1[­ {QzÌÒ~Öó‚©.$3DH6(ä‚v=‡aç(+•«càE`ŠD®8H¢»? -å D'oD!=|c4"wwrå¥*ºæq Ü0…ýÈ6°­*T”e:aÇžÁ°# üBÚòUIg1sùµ©¿cÞÍåF=ñMÅ¿©fàElc`ZzËÅ,óéâçP·o¤™zE«m˜³Ê7j=¤9ØØBÅÑ3l¹bä› -îª|”}ƒ!Í]A'DY=èfïv:PìyïCÛ1•ly>‡‚`õçxÇ’ -ƒµuÿ²…G¢¢ Á:µî0 DBSåh¬q"ë÷‹1¤6Ŧ,ã3#øè¤X_•Bå JáG|<£ºý£˜gE\Ö/”;‰A#%ËøX½‡¶ðÉZÑ¢Y>1ŒnÔŒÈ`Ž^ø”EBFØ©i|Rv0ß(aÚò›ÃÛ»­‚÷ÚUÈvО´š ¯‚]O!©¦ÃååÑâ0]ÅNÖF]d9à]s?¿ˆ=8üM¤¤‚*~mn£ÆIìI0ãˆÍ¢•AœA"øÑ™¢ š^Á @6yŒ£À$Fì.Ÿmã -ÚƒáH¯ÌÁ$£9ݨXrð[;0 %âz¼ ƒ{î¾JmZ½nnt¤Gõž¡‰}à°îåYb@9Ža5Û>ZÑìõòŒ˜½’˜ÐÈŒµä$€FR!mÒéœÅRT—Ê Ù§íÖñs¸Esô]8º㫇4ýöÊþÑ·<ìR“Y„.°±\¬mötÖf®´âÊ'‡(jK<˜ÈÎàX|C‹/ˆk/ÄBáúá„— H©$–ÄO -vŸvLX—5x cË‹Ç¢S3ˆš»®s§Ì+‰ -ˆAÁFhÜ2ñ 3²Ç»m÷q,sœ¹¼wLÆ{V7æSùBì¶ãÄ–K.cøV©±\ƒ·ê“iï™+â$'b7f#Ž­Ø›ø¾ÜÆâåúC,sLVnN)Cœg:§£WvHH -Z©â¹D´ž”•}-v=߯PX•Ð†;P]èÛ$Ñ`xŸÏ¼RŠ$6ì·,ÌW/fD=tkg?&9¥2™Éžê¼ÌI¬ðÚ™NŒ˜u_a7ŽÄïMâQ\•Ö¼óÎu—XÓcóñWÄ‘ñJ©ÇèÄ)ïè¶m¤Qã5#ŸÃãJÕ؈sÔQ¥boš6¦áÏ…4$Û±»Ò‡>¹¢2d‰z;ˆ<*çA5‚u2цI¢ÄÆz´h¶aìì -oVw£iw(Àl$;t -ÂÅ:ŠØ€ÁNÈô‹¯¥#¥61#IçºÏ0HaV7Ä÷G`èï`v^2‹íÉãB±CÞæõ–ésDÔÆÀo¡ªÑŒ9ºùö½HÜ šƒƒ¥pËšò·ø”¶æQž0t¸qÉÛ™<ñ±èˆ+Õ[%L4‚À]ª,=¼œb¹Òæ2r8á€îãlçÛ.(>ˆ÷aÑ+ºÏÒø(¬o6/ÈšèFÂäÁñǬÓ|'ù3±·®Äx}xšÏ«‹ɃŒ?ôX;¥ Ïüµ¶˜©Ï鄸ÑÔä»­Ì<({I"²‚.*Ø -•V…®èb“:·u/%%¥I§8€8¹Dªè^Q€~ä§i2öÑžæÐOÚÎGÇLƒÅà†)L©Å¶éØ·­ùÔ$S ‡Z’ULž¹É8½ìÐ+Õ ‹J ì¨ûÉT“À*øµAWû“MZy•£ªT}¿Î­‰GæÆ‘»&©á©’D?ÞvÄÉ\Bù±xN -|Þt¡ZµÃ;áœÂ+ŽÌÛñÊÙ<:N9ò¶úPtÂ<_I##eÛëa¸+Z`´7&¾Èìßút8À ñ¥ž){aT(“æ±È{<°ìïm‹—#;ÜK¾óM!ò§ó÷9oQŸ.Ï;A>9ä„Ç7§¹‰Aa±%;åÕÌN/ Ë÷~-ûXòo4y®9 º’‰Ð9˜€|*Ûõ3”‘¥a u:3"R`àÁQ”‰”ý -Or“EÆ#ZRóòEgúµ9â¡%nŠÊ˜„›“8ÿ.ÆLK‰ãÜJb¯’ÐÕX‹DŒx¥Ûè=4pø!±“ãÇ BåÕˆQ,CP^3$ʦ&{9(–ð*„+ýœX³Ýõ•+÷6«Ç^²¬U5²TxÙ(f1â_5S¹}TÊu¦Î)áÒ"R ÔJžÄÉÉ›î‚1ÝIJ .2–OIÇ«®íæÐq*„¨ ÓÉžÔ^>1ÛAò,v¢Î¦åÂ_C¦go…H=9TƒAB¦”Ò D9zp.–5ŽÿÄDËè†òèäN£{Q¢`+ ³+QÙ/LGr ˜B÷ÙÀE®À®|P™sE¼š"-b’£p¼p}pYf$Ž¬Á-éú¢ÝÙz'cnA¿¸Ö%Éb¦‰a8š3HŠ^óAb9@ŒÑB.ÆŸ«(³~ð‰ð–O62´—hŒ$ú. Ò”`VN0$Îÿe-àŽ•w&ešuò–hŽ[ê#/îJÞƒ.~q›Ô¤j4Àø ©¤ç…oõ$¥V;¾Ù¢fÌå·ö|µŒ´ýïÿ•unÇ?Øö)Qʘ¼3?L(¤F'<2• ‘1ìTx‹EB†Â­F ¹=d@èÅ9YÁÔ . —Œ5gÒûË`ÐãØÓº‰Á˜;Ö#O›™²ö–Aêç´Øús“zr%€$ï[¦·Ïجm!¸ -[м:ì•ÚÒçÛ½CYH£¦o/9™P탦çDš5.ò²$‡L7›µ{æ -3/.‰›ŽDÀI˜ª'±µ'À ±p”Ñ›&3‘ì|$l!9nBAˆá”ì›RÎàôî“b,Þ=ôSè>ü«ý3_€e›+‰‡³G®£MM”+ºaôlè(–B? -=ºf•ÓûRЯó‚Ήßa°:Úped=©ìÞh§3îc=>$ª´CÍÝü"Ø~lgÅD%%™ÿ» -‚Lr³©¹Ð4ˆ)w•Û-g#¸ÒŽäF«÷.Mœb˜þz!ºh~Šy`Áç[löç Š7¥Yï³?K$7%®Íë–%˜bš©Šõî0)òKÊv½ 5"Å£à–§…{s•r`7NŠ? -Œ˜É‡‰Þ‰ô¸Ggù+BòíœwÚ—ð†ø°ùAY¡‚ã¡8¾¢e­7£‡ŸC‡ÖÝöù…CÇj³PÏ~•6Ô}1U¹RiV-÷Œž>Lª¨qºß² ‘Ç@ D q€+(º %Kx}¹d%Àå½$à8>w¦¤:Š·°ª2R˜¸ø¦ßFBbøK îµ\ªøÛ,çïÔ§Ò÷{-,·hwÕß®ê4DãKSž}§»sWœ}š½xÒ©¸%VAχY²Ñóí% ¸ºìîöANkPà¥TÁÜ$™0,-¶OXm&™í6Â;ey¤à†}ãà[H.‚Æ¥# -0dNÐF¼“@™K6 åe Ô¸tÔ{’À-­;ê_9Ç] )¨:T‚„UŸ´¿×ÖÉ@¢Õ*ngÇV»¶ƒlšO—…,Éïš©ùÒNº’‘ ž7þIÄÒ”.Öl|æÍèPŸÐÈ‹Î1C%á]ØN®À‰Ôªó>Ï`;üaúà&™þ:ªZÊDïg:ÆÙd¼3급Z¡á<¸Á— ÿZî‚_A1#Ñ‚+t:–W—Ý?6rƒå!ÀôúpÀ”RÁ_'MɽJȯ€÷åI"猖ðà]8¸Ý×$.\¥^6Q˜ÐÑÒa&†ªàpE};‡ EÉmÄmŽ$`ݬ}f öÊÝ¡ä¶N'Å·„.™Ñ5… ;§48%lÆnÄžÚö M¶NOq¤ÀíÎ:‘¬âiF’$+¼r~g;”dº7ˆ¶½¸Wã2¦‚Xa±êKrl¥´§YBø çðn¯AŽ«€ì„°ʧ’ì}:ûêÞó™ÔÜø!(:”` €.OŸcÜa†ä‰€ãN8¤@ÉÞ -ѨJàM‡¹Žöo?TÚ*ïds¤x‹« >Œ£Ò½nñ¹}Í ,I÷Àý4oÒvËÅ -AËãð ãªÒ\á)`П%Y^ì†rÌP{[ï£W§±-=yÀ‚‰}·kc¿»úôow¶hI^}“i±ÍifÏMƱV‚ÄÌŽâ­åÒg®€=N >("³·N@žëéŒ,ô0Šil.›U<8ûc[|ÑË1ö~Ë)k3P^ ˆæ²Þ€ž›à’ê è2Nè5sWŒómAË“]V±YõÎñ­sÿ"Æ[YØjv¸Vv`o7î©gb*úA-’—%š53`ôDDQõ&#quh¿Ôr‰­®=#í’æCß#šžÛ–Å:pfä—uv;á ‡àÜ>ôYMpF|­•uЃ~\Þî곊^€\H³I$3[îm#$ÕuŠø¦J¾å%ñíÍcJLϘ}J8 Øš«ÏÂÍÅb®æBN¯@§UM©ÉËòg&“I¯iµÀÅX(¾ÑŽ¦gDAªZ?Ga¼PËY¨¿`xØ?\Œ¥yxϼT‘LO*]Y¡qŽlÊÌ,b§¼ÓõæËe¤}ú¨Pqݱ9TÓ‡r§û‘ziaOv_ä -i$ò€nkN'ä®Fý+$–{œi"æMšU$Ìæuá?œ®}¦•Iä†ç4/ìÝ„ÿoû@DÐÅu'œ‘¦ZwÑ'8ˆ1.…·Á ˆÞLgCp¯+Ýô¬{LF)S±QH~¤rŽ÷\ø-¼EíPAÄD[ õøÔêq a€B6B³[ÝM—â“’>6ÇÄ4Õ]Žœl?ÀÛç‘(³THZ¹|îSG};GŸú¡£=úÙ®#¢=ïظÜhöj#Àé€&oåSÝ Ó­¿HäDÍûìC;zFãžÑtÊéà:2TÚ7ú’øcã¤^—3ÃÈÒnlLã0¸LtdÊ/“ù=lŽA‡ß>ixTWž\5ƒ-NzÂâA¨˜H p€›Åî"ÏT2–_³¡mÙ/bY—ýÍ3W@ñR j@ŸTé…¨îfw ¬CÊçP˜J«<öd«ORq|ƒF¡É„¦Ÿýe²J 6žNˆ(ËXcºxtu’™™r†Žœ!ìbG8/ªAVç0×8ìÏY5Ç]†ä+™XlmñçcªKULr>$F*íäÌ ”n‘Ð4ht7\q2$çØP.”þ) Çö§ÖŒe𙘰ãÌê’hoBõ>¸´ø­â3‹Qb;ª¬Åɤ?Š÷!;¼Rðè&Þ"±æÈ -±O -k¤îS$§¸GÀ|:D<¤Ææ·Š.Ó‰,§“•I··ûëÆpiM.VÂæ˜@£bVå¤tÂÉGäôÙ£_FÃʬÍù a°”BzüÕáP“ý˜±ØB{šN-eÝœÑ}°DuÐI/p¨Ói ËŸKãE%y/“ ;p)¾isÉfþ›U«ž¬ˆ‚v¼°ýˆIFps»¸D¯ef;‚èÉç%­g3B£Lº+NÇ.|Å$ö°Ÿ´ˆ]I¸ @òµ…M‰æ!Àû(¡{—A -ë:µjLÇD7ªÎ6‚•hS1>ª6l²±¨„†A¹†óÙêÁ•²Cx8jÄ ²L€Æ{éà÷ŽÏW£Å2Ê”Ýhn%ï8%P¢ª9êàôyXƒE»£¥µXnëж)T@›Þ×=Q ùÖ¶¹õeC‹¼¼*ySx{馋 TF724•âÊ:ÄŽ}³qHtã`¶;¾ ž -%‚ ô¥-1ÛJK§4$ }¨ºˆKßNr€·tÖ -Ôhý7Ù†€Ìe‘á\;ä唧±‘Éx¿ßõ·OÉ—äÞ„ą̈ËíM!¥NØ̆Ów‡‚Äö|8“òòHË\Ãv ò- å, -eÉf×ݹ,$lA'Îe²¢3²ZMI P 艵`ÆÈs$W¹ÃSðNJï2qù -!,£ò>koø=íxÜ*æ× ÅðÊ° *š¬µ?¨|ëÄHe… Ê«xŠ&±%ÒûrµGšÙK"j&xW*4,’ì”"¤ÕI0{K¾›EË—s­‘K~ÊK Ý©ðÈÁ£,’<_¶­Äè´{c9½ò2zC¡ªj®›˜Ö’(±]²9ˆÌÖ™àBÝO¾R …¨ps‚®~SMŸ)ShÁb:Õ}d©8çå´2¿'dÝÑɯ^Žn†iBÿî¡ÆÑ!†IŽ±az:–H;ûê;ÏíÁV |,ÍUh|ÝdnQ£­0!ô+,âw=‘pÔÏT¢fç¡lôךh>{rŸms.B9ì3ï-+2’;öÈ‹Q3Ó`‚†ÓQÁÙ™>¦' ÑAdésàHmÞœ×0¶E{õ1ü2š=:v‡ÌD}ïÝYÜøǪ†²#Ùëö8£ùÞ–);j’MT‰+¡ƒDЮpz¶ MH°Ú Ñ˜ë*€žL\g|ÒªŽZ€‚£µ„‡(Û$'@×þ|dž¥´ƒÞ¶¿DñcikzñÉG±ÎzÒvð‚v³ØÍsûl.ªxYyCßô­¯¿Oåæ?üÐ*7ïDžFmäÿiúŸí8i†äQcÍ«˜‡Ç]„’éÄJå~'ÅK)>óᜥÉÅåGæê,')ÖƒÈûÃc #A[•0‘O€Œ}ۆɞ´ANt!ðÝÏl“k!Çñ"s°Š:;_;‡J‹½ïÏìrØ «1ŒØvŠ÷ ¦·*³5?|oÏÝ0:шªÐl¾Gj!±¬ªNÍyÝÇq_œ±Þ¨–Øû±óÙ¡7×™á!^°¢+ÚL|ÉN´æƒ §°¡ƒê=Ød·ØŒP)nÈW ûjr ŸlƒÕÜœËMž|QÅ\^ŸQoïÉÄÞÝ;¢DE:Û´¾·Yȃ›½®ñ™½R¾I^E–¾ öå+ +’Ÿ#ÉñöÝSÂf$*±œ]\•jçM£è÷tÒÏïpJµ+‚2ÑjHÖ·®A*ÙükLù8ã…lÈí“Å6V™‹×K$9A-6õj”ÐÊF¾`Fü&«*`#*üPu2ß·^n¨ËÚ/8Ø),]5|’^@…ܽ­»g§OUZàf<(鎒4¥ò”¿n5V £Rv gY?¢œáŠ - ³úHT£,‹Ô}‰BµA\dJ¡DݨÍ2÷IÇü–n…Žp;‹ºå%lô| Š®£¹*®F û<Ž¸ ÅN&©|0J*±mH¥ì -o>|+s¬d5I‚4„ðŠÆ{ ^ëÌŒ¡LĬ€ž°§*Cb^hƒ…Eß`~ÚïYÄ1#†˜Á:ð°Ï½zFt Óĉ½ƒâî?3:!]ì2±»÷¾_Z4'ß3†AU#`à` -t œÔõ±KÝÇÆX và†£6}u¹®êé¿\?ãïíóÊßùä “£]¹L#µÀ§ÑØbIŽ~m’Bb³Åg»Ü++HÖ…7\^uÙ¡ñ¬îÜAÏáóà:6»¢\yG!ŸxI¬$F Ì–Ïi€ïì!i#x˜M6ExË+\s^Xo9Fee Ž¬Óñx7ÁQ"ƒ²p%¹‚àƒ,üOÀ£,ßÊÉ1Ò!ß¼"yÙr1R'Yd%CÊ›úön¨Ó¶E?6gRüB„Õ¾ø•¸9ê\%ëM;Š¢Ö0ŽRl¢õ’Nß%m%£w(Hv¤­¾UôYhïeŠnkbŽ‚A¾Ô’ŵŦ÷ V ‚úåŒþ‚ýHÇÎJ…àbØ-ìÙ‘¶äܬ KîY£÷Câù¤øe‡PB7ß›ÏöO=èQvРly{»sú‡1Šì–hê¬Ó¡‹½-¼é ›ÔŸ«œõÆ’“ª7lÇ -¸dÙ¾}ô œy)0%k'ÕÝt¼ýðQ‘=œL—™p_mÔÐI2o°€…Z÷EÃ&KGH€ ¾/2!J|mÖpr¢XQ4²~Ž6]ƒqp1"“ç¨Ô±/N›ïysŸ‹Q„Po_ªü·Ü&7ÆÉqyݤ ìsFÜ`‡òê„΄—öi“ÆËžÐSzfΉðvƒ`{ ‹þË™4”ß•v!}g$Õï2R@n—\Ö³1#0Ùò-ìv ÷ ã¢Ãvi5I D+±ËÒåÒv º6‘Û¼µ*ô”)³#¾Õ^‚¯À¸7d”£·½sst9ñU1g$v“ÓTÇ6¸£g¥»¶¦ídÙKt“èc.ÂtQr—(yɼ(úˆ]\TûÀ¸ÚÅ> EŠ–O¦ È‚À'ƒí_ç̼^lT g“`jŸ[3AË‹ŒRp.lþ'€˜Kä)¶„òÏô#üÞ¶#ñes6ìÌ™zWcŠÕv³s~ûÄÙ: ¦ýN*ê+ßÒå-ò¦*qÉá²yogêùÜ\½!BM—íõ4 |« K5Öóµþå5kú¶Ñ6›1yíÙûQ>]Çt¯)ö,|(`,×ÝÙ¿Þ†9X®‘7töcoÅH“ìˆQT­¦ã³n`Õ´u°úå—ÐC*sø3ô¬•éÜÂ/0ÖDÑp‡Â’ÉÄÿ$Ç£`ðÞçs@¶B¤j+Àsù ÞOX™Ž¾–¬09/·ŸêŽ-$ÑÆ!ÈæwbŒøD>l¡ÂŸÖÉž‡ró8Èè¢_´ÒùJ¯†øQ]ãEÕ˜yš57+ò)ÀŠ= Ÿ‰Š ,Ss¿³‹¤ûbã ~.Ƕ¸l`N`&Ö†ºöèщgc¥¦ —õÐú44&'ë5·v§ÇèÒÃ.çÛ¢p|Ýoò?3•@Ä-^t1WÔIF&Ô‚¯à¥3‚ú–Ï91«ôÈv %êœÎ7é%d‹íê+^.H7& …~#]@Ä;0áŠ`’õD!ŠŸ24ç(þ¡EB2ŠÅ¸vPáå¤+ÛN¥&o5"*Ã~å  ^6W5@ÏíWkco¡áX[Ã_4@#ñ•ï =àÁÈÝ–DšWãØ(H„\–¾OÖ¢ÓrÏtau£»Ð—l²PŽæ¼€Éºˆ¸"jgtâÄc"e–²AgȤÚÔÞ쀑tJ2¡¸‰ŠÒ²ŠùêkAEÑDÕÜ¢£RàÂ^œm;hÒ9Û†yõ¦…£ihËŠÃíœwk^^ÓZ\Ä5ˆš#¡u¥£ æô¨÷ßÓïí•|úÃ÷JÞI_ñ÷*tŠ¥19ã÷l -S€D*fù -øa 5ƒm±² Wç1„€AâQ#¯ä¹ÕÉÁuà$# ÒYöÀø?*á6:âˆo®Ç8ee=Æɲ)S÷©(l)“±S'tJ¥© {S6Bá#†Ç–-Î-.V–DˆØ}²å®9d>¿s3Ò0íƒ CÓfgâŒ4”õkìG;´ž’["÷TNÔŒ¨7¦°]ÑŠnÕ;N¬Yw+QØh\Îüï®k-gÛ|«WŽPž[Æ,¾¤ -…@ÇåÈŒ šÑŠzeŒÕfk-£œGaØE?>é”2úEe껸ÎédX01؄нÚ.¼¯˜"›#ˆ:+wõ‰ D¨6.••d€¢ÎÉvƘ [RüfÀòI1úWÖ°S Þlx§ÓµòúV„¸~—çF]ڰ±—wJû½÷v -óðNAGW_•®;úóCDi÷®ê$…j>¯ %&VèU×q˜¹÷Ñ.”ǃ§Á§ '*Pî þv /ý½ÕœBKëÝ»ì¥Þ+ƒ>±Çœ§ääèò º•l ü;tä5H(ð(Ú+÷~©QAÓ±rûø²5žžÎž»´\â(Ÿ{Å'E¾bÛOV¤†ûU’ƒúCQôЂ{/P’6ãUÎFÖ#3%”­GUÚÒ0‰ñSaãŸ%–êåÉåÈiRt¨µæ겚KS ïý:õÒô#t<æ¬gÁåáakõvãhOP‰rÿx{féç@Ua‹˜O´÷Í@!MšN¬¥BÏ„`k„/ÏWf›:Ó@l~³œûÉt™ÁzBàMR>´ÇTéX«Ëy~¼7ïx*hâmïÕ{?_—I0ùù¢Fš\ƒS²a—êRULq1µ1†µ­Ü±³ó|µuKæ´r¨ËLÉæÒtÃe DÆöä£!xê³ÍC§.íÆþ Òzíœ9·?$Yõ®E~jþq‘"@­@Ü(…¼ÇdžÛ×GT–7ËN¸·ú¹;÷ª„*ˆ§[ŠÊ®è* U$ÜÏ!3w/dmïíߊ -¶ªXgUÈŒ‚(d…S£qNjÄR€þÓƒ®QAb̾ }ÛÁ(“Ãò© "•'†êúLÍÎ êsДÃ=eÝgeqnÛÐÜÖ¹#wçb@â™Ýah¯Ïe_+¡pjgm–E½MÐÂ>MSñëHÍt)ìl]=Â6º›~3òý)'û…¨kΉ\ù®^X–»}ûL -€ÝØÒJÎ0Vb»¥ÑÚðþ0AÙ+'\ŠÏ^ MygðÍžË:êw)Zo2@`óä8Ç©q\™e*1"a†ºÃ -˜9HþD„€o6ç6;õd‘tÖ9 ÄýÌ–&…¤!š7ûI,C,ÎÉoèÎÙ›¤}:îY -ëú²ð íìjÉØXqa›ÿ’TzC¤VZ—ìµïâlFÞk‘@Æ i³'«1ÃÈ.n\ÓDÿ[gŸÙ+ÓË Q2ñB»rŒ"€Z®ŠÛˆ«‚‘­9¸Ê¥Öì•RšHæ{ûm2ýmNΆ$ávXÿ•¤`8>†óhBÜS»aìÖo%Þž64NÇÅu¬´ˆ³‡ _v«RÀX)ºº†jÉ þdyo'ØÒêx -ãP›æZÏì5‘ÔÓ´B^hÆ>%izÉ.t^ŒÂÒ»S*u'¤ùéwÌ#›³ùzÛG%oÚöû®S¬F6ÚñJ ããªEvpÅÎ ¶u•L«lç}˜XGµóÅßV»íÒåBÚ(…‰ÏêÐU—Þ #§íßñ*kO~0¹™t× »©NðN• ä™~ -.tcXñ…vtÙÅâËq<éõÔMÌnyø.BÍÙdGDÔ¡sTMÐeœ"˺ïªQw9wSÝö iK‡ ²ÎîªQGX¡ÚÉ®‹ Ýæ8×PÖm÷?Öåûú¹W:+{†`ζ¿{3ƒÐEW_³ç!´õ[Ë…dϬÎVVÐ/ã™Í§¤U#9ÕD~aIÚfyõœ!Ä){Úô i³y]A‹¾+6S†¾¤Q—ñD½ºÄ‘*ø¨I› ¾/‚Ø{r -Ø[dƒƒ‰™ØlâéµuÇ9obG’`î¼Ð¾Gif')ŽŠÀÚ-–)O†ÝÎ`Zèéµò=ÌêPŒ„n°ü5œôK——DŒ*(â•î®E›¡ã}Ùã,e®Ïfg7sæÞž&v4¥‰Ü8R¸Ç€ˆƒÒªâ;ð>p6Sªr©óÈ䟡“žÇ…»×†ØƒLkÄ!Æc^\™^SÔ¯GÙ6_!÷R]ª—¦ç¶BQ&w6¹R~VÑ;dЕdž«’;C‡ÀÖ¶Sh¾«êÁ‰·G±}/´[ã@/ÚS“\í]/N fCXÕŒ3†“M ì=¬¥{»~´TÔb@6Hf€Ìm¡¶"vV¬”!À.Ny‰HHfl£ú[Ë{—JF“õàf,“/´6EÞv‚ µçPñ ’RÛ–ñ½YàŒ¼{4= ÷_£È»T‚"÷ñ˜œdW _ÇKt*6ì>”Õìc -´°ŠÒë®çÊ[ÁöyV6l…ý€*`•4T[µŸ¼H®l „¿ê - ˜xŽª/¥îm+I%·Ÿ®8ýÚ ãªnýR0˜ôª îkøð¢öñçŠòf€ƒJ´Ô‚¬Î `@YD±ÇzF²Õv@ߦÖM1ñܦw2em™òG¨í«îÄ2Ò£ æDYÙ° Ò§D^90aBªhàKÎ(zöÅÑHIʤҼ<Ô„Lk— –ê ¨]‹5Ò°B÷ŸƒˆÆ íÀß—º®Ñ\k-’¼š¶˜*|õ:'nOòCºÈøµdëÛOêc®á%?Î1.“ õzfp O´æ$ÑueN']Z®_¶¬‡•R(OƒÕÓXÀ›Ðš®Ô¬=œyHIqÚb8o†väHó9Ññ—«ðx\+9~ã©ùÞl·xa˜Ü…ÍõGuŠzÌÖ<½UIþ}¥ø¿< ïþò¿|ýÍϾ|ýú·¿úòWV`º’¡íÊ%Î ÿ„õö¢ËDÈÍ~»[R=lïþòg_~ñÕß|ñÍoÿéÿ“?÷“çOÿú?þö‹_ýÓ—¿ùæ¿ýÃ׿}oÿŽåûw?ùôW_ÿòËÏ?ýëýùíì~þÍ¿}õåçqJ÷ð¥¬EýÏ~ù£?+ï~ò·¿ùÍïoçùk,ÿ®ü¹œ`ðBz÷t 2¥ÞqóUV‹·ÿÿÙ¯eÏ>;Zùݧÿ"ÿÿ§Ü¤oÙ*fµôž¤mCZ猠ß[gnçͤW§2ÁMI©ÒYA"­ÂeÍ¿ø`ÛîÿÜt=Äǯþ=kÌ.âmgò!Ïó†—zÓýß÷è(ßt©oúž7½Ô›ÎìMÏ÷'´ûI—‚/‘rmýÁÍï§ì‘Ü¢?TÏoïÊ{fN˜Y¤ìí‡Cf°²&2Ç1Á}e -ù' U÷$Þ*1|dl©<ÄÀ£‚Y72?"$CÈÚ•¿œ]ÁÌJ½%óýÞäoÈÛI©9Zm7xãúÿà†÷p£¿Ï~WR„*?{«‹ŠYÜN³È©5ö[·cdÉné«ìweMä_·>QY¿Ç?^Y ;å Þbxç{þîgßöwç-éòU6$Óü“Üñ¾ëçø§´á}ç{óÆ~W«Õý¡Üñžö46ø«uþûݪØÚfà±°giõ¼ö;ª Ì`JÜÎ.©ƒ‘ äÕǬµ -L§¿©,¾•ZÁ–gñZVÈVfñ W§ø6îy}“ÒU«Çûð§¶çeÅ~Uy“tüûÛnz]J lÍ“Œ"ZrŽ9 2[ठKvîÅa•«@CDo9ÌŽÍB£P‡´jFu´¤° ƒÓ+§‰3|åÙÑceP^”fm±i:Pþõœ©’\Ì( Ò29óá>|‹íïþžŸýï)Ëû|ëÝï»?ÜcçXβq»¾r M®EE€ýgšfZ@JààéV‰Â­+ÝSðTpŸŸvç­€Á®Ë:Š|µ(ÐGÙ¬3G×Óšh*PB•Á¤´ÒŒM_"¯b€(½äABЇûðwŽ&|»|ó—hÜ¿ùOUµÝÛ;þ³üðÖðŸvG–†<½ÚP¯n -y ú³¼ã?ßøÃ.[¨vW*:jº%|ŸŸüìÛýäΓPC•°ù;ïßýEý–¾ô»/ü·Vþ‡Õÿ__|óú÷ÿù7_ÿó—oÀë“êáÆAŒüî?p/tüo`îõ½%®cy¨¿=nqùí|~þǼ֗úõ?~óËß}õË7.3†ìòÍß<½§ Y¢ºÅû{ûp@‹Œ¼öÆÁKpIio¶z_YzãàXVKŠûθŒ áõþŽÌXv»Nòq0>Ó»I4wجª5—EÄgaV<~îb<Îí°Ç…ËÆ%çp¹?oËÆm?ŒxFç ÃÓ®Ìe…¼¬—»s€ñᎃcYã·û›£ͧmߺ®šl0âz -0:Ržö—û×'9Þˆø¹ÃxžÚaŽË8V >NárwÞ>8–›þø™ÏÎpBw3`» -`•Þ?Úskrä8cñ>µ*š§z6^šA¶awØøØk^Ѻ‡ ZÆÏ]ŒznþÝÙ_îíÍT¸¯?×>¦á8µvŒ†WbæšyÕ±BÜžã§îåóîñ‹>{Øs±»¶üî_ÌŠ/y²Ù Ä”¯!¤0H¥Ñ£ß}‰ »ßýÕv¾.¢ò¼œkçÏ]Œë¼ùWó˽ùæÊ"lÚhüõÌ`t°¯váeÇ"Ç ŠŸ{¸™ÏoßãD0ò5ÔtûçooÿK˜„+_§$[9‹%É2“¸ïnUei†<³ÑKS‚)¨~1u…vÖ¨âT”¸@EBãhîU ©â|wbÌÓ‚ëv»!…š/Ùî™*ÍÈÒ´YTâ“a,[GdŒ -NØtZª K| ÚRX+ ’˦jv•…¹‘†Ñ2 -3‡1ìNû°»ƒÅø±È êØø9¥ûㄯž›Ýn¯Õ8®ååÎ×-±R2ÐtÜ ™i½ÜßLãž×¯âgÞÊ%¡ŠœTÏÓ¡5;iQ…Ïÿåj·W…gvËÇùJFM\˜¿~žìö"J·DÉXê«·’Ö‡j\Ù7Ô„Ãâfì&žæµ¾]¤('öů¶B=eä AÚ¬­ Y_ÝϤT¯ËDL3c3]‘7?"Û•¿Àˆá¶Gdž«šïY¼¥Ìòþt‘ è.Un“+]`±-_Îد¬b6ú7n0¹öÓÈÅÅÏŒ:ŽÃÅ•ƒja\ÈzÂãò‹ªŒÒëq~¾øä}á5½<ü›ãˆ¾¥Â²Ï›%FKîîíTÎv}:§§¤>ÇCW™>Ýp²¶†tI{9Þ‹—ÇS­Úf?9§µ«ý} ­9¾¯\b€ëB¾ä1gë·ë7_\÷EЕÏÂÑaÂQº†b®2edw’rÓ6>mÛ×’ÏB|F_Cª«]ßBs­×—!‰ôæ—¦k|xÊÿ³xÊÿÇŸ[ðýãÏ×Å;l#-T˜,sYá”ÿ²p^CÆ¡Þ?þ›dL«fĤ»À…IÎ4¸5Óø/*hÒÏÃ7¾UYØg …a¡úÀ†y~»ÿ=2ì Zr6ä~qbêÃXMýx øo ·ŒÝ -¸pÀûÃBààÆãRF4ŽÃ…‰´qÜ€tªsÐ:yáUÞÒÛÌÎýü¸ÏÍ…Ëx•~h&¼®õ/Ú°´t–b<ªÕbÌw¡ïT›ys·úè½êC;ÕÇïS¿K}húèêCûÓGïNÚ›>~gúø}éC»ÒGïI¿#}ü~ôñ»Ñÿ¾½h)ï2¿ ÛÐ’Ž×…–èë¥ÃÛȼåöŽY=éZ.<ÉWûÆt¶ò†úUG¡ð:û*Ö \Ò8ò-FÊo)窯ÊSæ|w7i}gwv‰;U͵(ÃJo±püƒo{0Zßc’IÉ+½+÷«ÇJÛV{ã (Þ â©3&ßm¾2½¯¯ U.{ãóêÙÑ8´ìeØ$æ6zo•Í!í:y³*‰¦§>ë[LaX™ÓNyÓètŽ¢Õ l5bŸ)sp®{a«“rk ¦bÙ[š¾£$i„›úvSæJ¾E “<ÂSsøpçÉ(É©Öl.Â5‚;CZU¶›è"'b.ÛÍáL4S .JƼCÜ—è7çÞ¨Õ\hçÀîÍëÂÆ{ÅOpK]±Àôð2cΤ3špF¹g¦J¦!¤‘BìçvêÊà¤L]áÀh·&'– -†ry#J®p÷NQ—(à#O§»KÒÑB3¶ses²™MP è$u„S m<̾BWÃ]RaA w0L‡h‡fhQu¹®v¸¤Fð–œ(˜Ø·—#ù]#k‘ÎMØÔù‹·ˆ-R%%› ^RÊà'ëu¯$0ªÈ<Äxö"…]_3I!à¡‚€Bñbº ©H´-¼ïÊ÷ì+(ÀÓìúÙd÷S¤(äV6IöŨ¿¯@ jÐZHuD£iý@ Á&ÚÖY ÒÜ%£$g×Ò?÷AAð+[ ß6—”i¹bµ ófD<}lvÆõA# -mÛ -RuŠµGx¤eÏœ",{›àôé¸CRBåe¼7ƒ¡I.Þš^*ccÑ{+(Ûp'+Ãåßždö˜±í^˜P¸V_AYPô¹×ÊS«¡ 免<dq5vånÂ7è°UÆqb -Å“FѾПRæætx“dT˜b'GÊt¢„솖ÜF¦1)Ø®TöÓ•~:òˆdˆxh…šŸº‹Dâ½(xé‚ŒBAJZÇšqÕ»Mgä™+håÉìäG‰, -ù¬GÏÞ¨*l]Ò>Í£W¸£al½vá²¼§›iÐeñQ“CD}$*-€^Po~ÏáªA#”9zsÈè(®ØGKnñ C´Ðä+ ,k!e´9bø—9(üú²x´»Ý¢×`Ð.ƒ!šÁÉ)5E²¥÷V0åíCe¢›RSŸnl ÆÒŽsPWh‰X³Wd/ ÷qƒT¿åÜò1¡‚’]dìv?àzêØœt¾%$4Úeìëb÷Fˆ­M¥(Á­¯¨evž¤h=õ‰Ã?Å”;<UÙH=.¡ÊˆîŒËPÚ9JÍbÞÀòuHƒ¶à ÓÛð&¨­eW¡œØè¬H¢(´II”ƒGN23SÞ ýWÑáp)ó¡ -''‹À¸ûžJØš É}Õ]•æk2ƒ3Bs Zg>øöÚ®`?¼5¨ÔK¡’ ßc9Ò½˜Ö»-ÌzaÊ¡¤Ïfœ3áÈ<Žèø¶•\´Y¿ä Û$®Ò¢$l§/ªNÆÝžìö:#9Ý!;pçXo4ÌI§ë”ÌÓ5ä¾Å†ÉÜEUì®|.` c¦Ï_Î=0x6²‹o©äB3+…öÄÔØ)ª3 -Ô8úáº3ÊÅžÓöÖ¥¤5y!àqôV6jb º‹Ç•‚ÈZÆ58ØŒ{²¸À›²5DAª+㮄äpÚԢ«˜²ì×6Ëæ4R¶XîXa¢D¢ÜTv ¤jƒäZ,Cη,wsw„À@#Õ¨dC¬)9ñ‚úg3ŽyŒ½Ž¶öÜ"–ŠFÓ«σwH÷»‚’ÐXíÀwÏ1qpÞƒRϪ¬'Vw ë˜2IÉU,á;t4Z‚?Z¨úI¶d+hèZ}àöªó wÒtn]Ü=aÆÌLZçŽI'l@vR·÷9°mpXªÌŽ1WMWS(¬’n¨Ï¸C"õA·€ÁnC3•(•¼-ÌfuÆH,¶3<ŠGª‹öB3ʽwÎ¥ŠQsr3:ã´–l&Üײ@kJt¶½./s¥³~ÃùR lÔ(.Un½?Õ/Ç ‘ª9&ŠšKMÜR¨’{Es˜rŽ-‹ºÔ£ §dmw †”U—”*Ù¯¤–üžf@Õ•VbÑû$“O]¡ü#‘š©%)‡näkÓ¤j;· #aü×u®M-i£"¸oáH¬0j¡™âÌûäÍ5UE3Ê„N¤y–‚9[¸ç&¾2ˆB¾²ëÃi;í*´@lóÊñÉÝv…C©Ùª³’À h*΀šM½æXaÀ%¹ª$‹. ¬€ -GÎ\*oº·sÁd(©Ñ u>ä Ü¢›ÓÙ1 ý%óŠ 4Ä8y»„3å"3‘µÁ †¸yƒ‰ÂR¨ÙIÕ2þ^G€c¯ƒÚ§«ÏR!A"i3Õjß·¤$V˜­âÉ—=(qÛÙC³í"®l¿Ãž°»$U‹¶ ‘%øq{Ó-FÚV·KªozwñvµƒÛGd£<ÄI&y.„}² 3Éê”ü€U$|±~“Ò1¬áÓÝ'Òc*^kK+ V -K³Ð-²å Óî“wi¬&E;‰`oÑdÊ0Öæ€Ø«9<’¹¤a2ò·ÏÛ}RwµjÐr»Sâ†ÊÄf´W¶«2±“Ç2<ì'ýTíSÿÓ8¥¾M•MÛD.V»Û QvqwJETáÇÂ` ýâ nW Ó–îŸtû ÄéÝ8ĵX³Èª\¦f4ezÍ òéÕÌË«^M6÷DÞáŽFaÆãSãêç -£#3ak]™:c´ e“m>i²¤Èq굞2V§÷˜ÔɃ6-ѺOº½6,C‘D/±®# $WoÃ~*«¿Å7Üà!Ý©>©²»O7#5³Ÿ¤¨û$­»èsWEL¦&˜kE|áÜÁ2šMnNÐ-Çe$“wUc)Ç -i›“îk ÛšYR[ž¶Í©ÒDšËå£ñ¿œ@œè$ÿR¤Š²¦ªu¥ü8•+ÔUÙ4Nö„FO÷ìw¢+i¶³íŸ‘LÝ>ÁTè|êLði«ÒÖM²D^•>Ί J¾˜0“––ê•îìÜþ²A¹CSÒ:Ä4»*‚tt£Ëᑦy$©&ÝÞ‰rz$ˆŠ?KÃ9N:çÛÄÞ|ßH/$ˉ 4ñâ@¢œ+öUQ”¾E³›aœ½’•ü*ÆÚÀΕý—Ód(x%Ä`v¾*d/ã ˆQs[‡ `Ú^âô1‰ ì  O1ã“0‚­9ˆ.ù -cv¸¶a6$e~«¤ì4&K(&àÌ!Ï”óm…Œåd^1„”ù)GMzÈÿ*æ t„Þü‘uaÔs4€MœÆ¼É<ÈùÒà±®¡+e—‰ÈK#SóGu,üÔÜÇ;l]õˆàlWwd×p°ÝÞ;ëÿÉ`ͱB¢E.˜é¯†'F¤Þœæ^ŒÀC@Ë]3Ýl Ó0–ÞXr*±Âd½iø£;‡¶ëåI­ØÛgÖ›‹mÍŽLîD}J•N[\:5¯îWí«O"0ú¶Ë€X©–ÝAU#_§¶iꆟéOXî—&JÅ®h8$ƒ hšá]êºuCfFÀ‹šÏ‘{.T5vA¼T—Œ¸YŒQÌÔ) 2ÈtßDò+ðN>:—ðHÝpHBjù‰lqî„=©ƒeYqRîJô8+t–ÄN‡ˆ²r'Ù_¤+bŸEé²ý ׶bŸá”àÄØ=ÊÖ(m“Éz;È@YÌùÄð+ú²Í•áլ͊Ÿ -SøÁšY™a»mrûÕ>ƒ/` -_jG5UŒ;&Òpc½j’Æ -­ BT[Nû?BK²×†Ió€WÞH´ÄÖzÒ–úà9Y¹À\Ï-Þ0 -€+$€5;Y…x5ê™^×.Hδ íï°‰Ã'® -$±vOÕ->+÷H ¢š¼Åä -¡-™Æ¼Y&×>¼A¶0å_ñý”9^F*@Ú&2b¢9›ÖÀ9QŒǪŠ˜ÑÇ33»}Lß)Xvpþ‹²mV/±Y=Nµu‚N|B&Âì(DhÍi‚#õŸà&~iãìÔåT`¯è~+r`áV=œ'Ô–¬S7.¸òyD«8’éZ£öÒRiƒ¶U—{ŒáÚ}DÍÂ_뜯¼s-‡;2’þ£‹’Ìአi ,{Û¿YØn`*žD>yÕL…çç¬Ì2ÇȺ0ØÛÁ’0®›V–N&žcÆƦdÙ§ÿý-•'oLuùôÛv„ygw“â„fVôÈ$ê$â]Ú^üHñy Ô«s_ÎûÔ­›iq_ξ¦~‡³Ûm0 ©±…ìðÆ*ž´25™˜Å°ò±y_ja,cwpw¤ZÉ° WMÇ1KrŠ>íl¨;9¨¥ø´ió”À[2šW.d$™™Y˜·vrˆ/∕:¤ ‡”¨KÙ8Á½:k 8$’0k?k#zt“b;‡yûuzí'š -A‡X šF=›È¨GYºeB´ãaƹ‰íRöÐñ-Ó@æÙ=€ö§2õšCš#c¼AhRS¸ï*<Ô’¦«j'ÿ B™:¾*O}¥¼X2ù„2õÁï5*ã%Oè…9¬qB%IóŽVOš’°rJ…¢äUæ;X×”ÊÀÓbJ÷Hô4HœÅrðç†Pßy—Ã%I¥ž¤õF—$Ê= 4J³ì.‰ãGû†–…Tš1= Òåàλ…†’¶.9y©äl_•ÓdÙQÜ#ÝÖ@Í»%5&²q’”r²# ËéX¹_.éB©nÅ©"9ËËý\™­=lËóQ·§‚£FÕ…¢1CPhaZ6†¢ÏëOcá3Dt¨ÄƒSyû˜sºý]·Âø¶ˆÂš5gÄu$Äþäy5’;®qWIûÈöL“SKJÁˆ7çl71Š•z(ÂÇqM¥Bªå,uuÊ/n—š@ëþÊ·Ã •ÖUÅ"XÚ®#8¼,ÇŠ³φ¿JǘƒËÎ$Ä2ïvDdoð,Û0)±§ô -ª˜*:€Ëzä»ÐñUc9ò4 -Vn{Qí5ÔÝÅ~m,âáîJx¡aÓÓM†ØÚ8§×d„`â’ä‚2بfÄ #l"‘ÑHd/ÍÔ -Ï¡b¦“f¦ÇªmrYÍuPLkXÒ±˜õ°0°4jP­„ÊëÝܸ¡V5ûQ /œ;(ôa­²MªÅf©fX}Ç_£ª+/ZÞ \ÚnÉ‘`*€h¶µÎñÇ›5.Ô¡«Ö1=¢ ˜‰a¶ƒâq5Ççlß°jÅÛ!(‚û(n\.È õ!-Éj@“‡a69˜zi 1uOT '‚K'Æ7{hü®'ªNZS•¬P¶Wߊ3 9T7Õ5¸.ÛÑ©PŠ3;¡ŒÅ»P©sO¤ÿÙÜ8Wh NK˜‘Õõd²Äv¶ú^c¥®*Ò©]‰Iš*ÌëFIH¬íP sgD¸4 -³Ã)MÁY%£5gƒ jŒ^ÿ°ÿ¥öÙ|z-çÁ(`z¯ß0XJ7=æ:÷“8BU8#;‰1yš·[a -C©:YB—Z @)æºx•ÞèαÞÈHÚ`k2ó}p¬m+"K|ÄôšÜþ ­3>ÀE=#Q­ŒÏÆ&ü1E.þ¬6T}6yie€¹`/aâ,ÆÁIïcbi”b G&I2Ú;ð¾è0 Û‡·ƒilx[+LgP©r¥Ó'0f†¬ºèQLÇØk±ïœOŒ„ëè\ðTõÀtJåvaÿW„¡9 =Iöàº-Íšlú=ëÐÌ«ßÈeqܲ=7KMÕM„Ö£6·Õ¨í÷J·D©^Ã9Hmx%6H¤;çf1h±ý-L‡_#•’y%”­µú¯42¼’@÷Ü)Íe$xVf¼åwðØ£L&oVÂ[¾ç8ê>V]T;ÑÑú_+÷wJÛPäùˆr†Sº½È€Lƒ&JÞkVÉ]O·wJu’¢£xß‘êøÒp€¶0õåãDv›Ó3‹_ƒ…•Š=‚¦‰#•Z>\Rf™Š=Ùéìó²óh¨€Ï×IÓ·ƒ{-ÎÕX´Ð¥=æît]F‘'ÆKÕÒ¹Âr¨É˜HxþÅ;ï.É:kêRΧC¢‹¯Æêì¤+‘GíG¡Ëª¶É+I–ï3jÈ•e0™Ú`xS¸ƒÌKû0ÆMõôhe£¯º’—®´†´Lû³xé©rÚcJBjé)Ö91ÖÞm<Ñ6VP¹(Þ™U‰u£ÎI ‰}ºCÖ̈¨ ­G -àÆÀ‰œ‚Á Ea"ŸRR+ü:©I*î· ø£6ÊáJëì¸ÍDnîíBÔã$e·¯Y–êVâÜ&OkvÜué¢Õ”öf¥€DÛ²°ðG8X†¼›ÒB”ÄXU[­¢•Ôp‡´küÈ«Lճೊ7ÅíÕ¾e$K¡Gš­Æz¨£¤ê¼‹Å  Qö™ =·Å®~tM÷¬Ýx7ï†ÌN]“¯`ãÂÚªer+O3cb€¤ä‚Iš”R×Q$w(Íà¿bGWV\’T -ÕHEqIÝ"”zô›%x‚lÕT)“ä[¬’ dD—.ií.búü›ºgxOB™F]/Æ$òN.ÀVT6}g >¸ë>¸–ÃÙ¼ˆz%™ë<9hÛÂŒàuewGµLx§-6‘¯Æµu@éV -ÚfÔ¼‚ƒfàÌU/g#‰=ät -±Ub ¾Ô}“æBþú³˜ºÂqú´2•ù!›xÔBýÜ9ü‘õ©Ê…_üêä„Z•Ó˜ÏFç/Àj™ —!O¤9—yÙ,á­u¬`¤Öñ9« wªíú‚i„è+ú'õ$ÂFo§ž-6š¢À{“ñÚcÈ4\‘ -Dé ºiØŽ=]ÖƧÍxã©„¢Â—OîZ=AÅü)Åø]:R5¥©2{uXxE]fí„ë7ã<üµîs°Ï^I&Ê×®Þ«_9œ‘aŽ”éö‘TlÉôK§fßÓ æ Kök X-åGmeë«qŸÑû2oåXh("ñ%‰Ùôí L8ÑJH¤ð4¢sV@ƒ~'’F6î¦Zb€qe¼Û}{T¢ôiúqœƒ*…ìfâgºçÄ£qX¿¶J±Q¹ÍkiØWè`3î¦Zç¾±aw‰^)\p*’Zaoª“¦ÕžEMr$o/«É(@=Ïsj´wGÜÎÞp9ŒH6>ûîe…³ÅŸ›ÿ\MÑ`#_ -ñ¬â’Æd;í#42Ê+¹ ^nmdt—´¼Í¾ ùW ~íþ`!±ª7…±XL\C\ "`ÔšLx”ÆÍ…jÛêfX ÷‰ÿj㋶¿qž©ØW’Y=LB®OÜÇä:°‘Ï@œHÌ4>СMÃ$ø4¼$¦Y±mk³*Àkpò—NÃgW¦“hL½âôB+&;PSŠÚ®éWî< âаž†ÕrdÈUµcÌD»%î—9§zïZwd<µEþ¥žSk ‘…¶ª$ºsD`â>e0XT—1þ¨Žô«mÅl‹öyð‡Ur†u¡»š@ç+ÆÍú+ªÄ¼Ð -ÑÄRÆ,¦^Ï\i¬6 à+ss=ì•gu%YrsO+]Ì:œêê~ŠäYšÆV¢‘q%£k¨eÙêXñª Dêö^˜Q‹ÕæŠû£€2ÒÒ!ýìÑÝY÷®¨â‰ßÓ´ŽÝ+ß p©I¾—D"XÑÇÁ—qf nfåKÓtŒþ¨±RD6"òó"”.Ãý‘†wzxù$C("e¾Nv€pR* úì(L„ïÞ`'ébu1)›¯EÏ©ÿD­Ã*öÕ+¦ ½ÑÙpÛðìÅB¨X¡’5€HxqµÀm#qÃÍ™“»±tÉÂ%eKu–· 4‡ËfŒa‡3›¬K-yØ÷höæ«Š«ó¦S~IŒ©ð #õTJ æ´oό˵üXYYö„Oj =FÝÈíõƒ«Æ÷y>µÔ>(á€gû àpµù»¬o ×ûÞÒ Wû÷nÀSüÙ»g#Úð¿O²áo)µ]j!©Ð²K$›Œé;ùówºÐÿüs=øörýâ¿Þ‘äõæ{sÊÉÿ³RKÏúŸùÓ[´uùO«ñßožÞúOÁ¡ùÍ›þ -ÿ‘?/w«—ÇÃWúì¯nÁøåOå¬ðëo\3…+\/š·—èP¥xR²ô²fÓGêÊ&û¤¥üï -H¯ÉÇlÅ'{ƒÄ^: )¬ŒbltÔ¹;{N¥:--ú -äÄÁœîØ'Ä´½¦ p¡ -Ôlñ UZöæÛ×ë,„Þná{-l,ir·Š•Í‰íîpftzo<¦ÁoãïýDïøæsG>^ôÏ>ûôõõwïöõ7_ÈÁ×·Ü~ÂfŸ(^þ=í3¹ôGr„–‰Óß•¼C ¥<ëƒëÒLħžl¤â 4G$ñœB˜ªÎx~“•»ÑdÛñ5HÿsB |ê›NAïb¨Ã1á9ÔIîÂï½Ñ4ÞâÄômïó´ïIæ÷o¾øê˧¿úòýío ýŠª{6Ac™Y3É'íû¨ËÈöMZZÙðâô;³rüÂÛ¼7V3žß'ú~~p4J§‘Câ¹_Xa?¬Ò­á«+{Ý«u…Óžy°J7>\ÙýMø}ïMz÷—ý›oÞýDžÝ»×¯ßÿË׿ûͯÞýOÙŠÞ½ÿúW_>|œ:–Ð1&"e}çÐg£)Ñ‘àù  –EâßK3ÎëMÛ„¹³[p±ñϳÿù8ÿ<û¡Ë-‡KÖ;Û+_Y5â¡tãä4mÃýòç’0´y=tÝjê›WÛ3Ÿìã¡åá‚vªo]»˜ïoÓÛ¶vwçñ^µ‡‡´¥Z‚‡¼Ý6î<þ|ø¡ÃnkoüùÛ¿® Ø»“?–¬w¿Žk/oœèÛ6^{ºþ¹bÝô­EmfëœßL_bì >φ¢ñgWkÇ -ï7“îãüÐ)Œ4Yâ%·g+‘÷íп¿{O`þêÎ<¤ïXÞ]mv»þ×ý¡ãx)·uÁGwvgISŒ;’ÆxÓmrá<Ø·¯zÚæù¥„yöbÔ)Ãt·À´à~¹? yœÙ -(k“j»Ãè ”·.o¬ZÞ>â'«-¦‹qÈÜÀƒñ€õc;òAî+Ú|Â`m—@#V¶·–ã΃ëqÃ#8zó!¸yæGLjwëßèÖ¯fWði¹ÎظÆ:Y%’aªþŽ?—@ }ËÌÓż¢|O±'ñåy|;LþL"Ý´Û´lWÿF‚¸ø·æßÞ -ý¶-¼Ìñç DuH-¹²õÅ¡ÙízÃÉ)õçáþ(šSÐ…§C$±½q×›+l³ÃÍN»3É1Tɺ"nó¿/oZßZ³~àhŠ+gU¿.W4pãÃM¨~Çæ´>£DšÍÂ¥ žËdãÂè~)?<0t¡Ëbòè0.k\ø»²Pd?,·ÉRŽ«1Ÿ´)‡=ÂA™}Ÿ1:2ˆÏq#Ρc\ôrpÇΨð{ÜÉØ­9|¬cã{_–\¨ÑÃ8M¥÷~™Y’ÚòÉ…¹{øvo|å>µŽmuŽ7÷Ê‘ÓYdKVñúÙcÅë?K9ì?½+ïþõGOD±AA/Ög>Í~Û0Œ9ä– -þüYÈû¯_üÓíRúÅ/ß(ãÅ÷Oúw.Ú)§áNŠö÷WmD<©ý ½GÆ.‡‘¤c0z÷ÝØe´8œMÐUBkÌ°Ng¿ØÍ>@+-‡^ŽL‡Ô‰™Ã>\ˆŒ8µ|ªG§±€XìË{djlœÒÀ@¸T3TóÅŠèc³B¢w+ìÑóç¶^lâ7tpY¶-Ä©íËý£R;j5NHˆØãQ*RÛcÓ^qp*8óÝÁô\®Æ~PÅœ+tòË7RM꺼:ª÷ít5W»܈ä.Bæ3u -¶W§@(rþ½Ðä\Œ(. ƬwŸF€Nãõ‚ÿÀÁ0êoù -ݤæfl:J}¡Óéqbñ]^oÙÕþæÁo‹“{ˆ«F[À9´uuÞ_ó&\®ájëØG[=¹e¶+ Ì¡p÷ôA£rx70ì…r ÀX Kçus‘b§l,}ée0ÚÏW¿ëë~ c= ¤e³M„ïøµl,¹×’ÑÄû)xÑÆʇ2‰×IY¥…3Rn\ÿ\Ù¯Åp·ë`åqNÇ—Çx9˜OLÐÛ-µcª¥FÇF“µ8žÆîty='öŠ0FHoBiŠ·±¼hTc¬»¬Ð]G²êÀOöexÙÓáÝîºê|qdN²ò· Ÿö7–á®… Ðd´!Š ¨™áŸ-Ì-n8gÉ †ù|J a…mó¦§Ûc+ÊBÊš À]7>ßÝÇãà±]ñb¼[ÖÏ!ì„ÕFhåý³Éqûl2?$©²žçp•>Ä^2 -•cžà´ƒ¾ô°UëRÿ/&ð’›°eöM e×….¥|8«¬c¿½Þ évìاq–èÞ¨H6ù@`ÿêÞ¦Õ¯XÀÌ»¶ÃnY•Œ£4>óuÓQðëÁ “‹Q(Î{y\á´£*uØ–¹ dX•ìcšê8…ã`ÿ:ŽU“1ŒßEOÇ÷)´¹@­oçã‰ïPé<ãu-à¿uûå–F¿5w+œvÅU~uwq;Ô/?G\F\1|½s(]ž+'”KÚ_W.Ž:–½‹`—÷º2ÉŽK;Vð'Ï##½®ìæ&P¤Ä›*H•åxEíקÒã]—æÈ®âCBVpq'ZŒtT`¡Ï½AØðf.öfŠgøÇ?f¾ú/_þöÝË¿ùæËßþæmè ':û-\KïT@Z³ñòÝ“XL,Ý2rèJ½÷0 ë•ßvÂCÛCCŠ›qÛÔ•…ˆÙ ä\Áû…9k¾:š©t¾Ä/ZßöÑ~9“¯P ù-xÁyݼ=p¦?þ\¾úî!mÅ £ìû‡3C DvÅ¢!ø(>®pRþïWûs Ö§Î*Ä‘;WÒãÄš‡‘§À5âßl׉…MÇš ÇÿÆŸÇÉžGÆeÅšoÜ]ãÃÀ«Ï~(˜çO>}yyó¸¿ùâ›×üo_öå?|ýÛ»¢Ò?7qÎ8F®g}×w,üp7þÀÃýÁ0¼èá~ú7GuÿlÕ%î{¤ëéÉ®>ìü¤¿“÷zóÓÿ¨ÿã?ûúè?þ“ÿwúÁdz²Sízê²f¥ÆÍ=h8Ñ7í–°¡4$»?à„a”ée×Có M_µÁr4Ø G£¿ )Õ}9XjoLÑ}ÙÃxžÂaŽÓUÏ {¼ ¯ÃédùÄyë -uÜ•9ê}ôÄÈ.N%œ¾Q%?ÒÅF©i¥a‘ˆÛøªr78"ì§àF/ C~#ÖJ$„·}ÙÃx9‡Ãçë«žöxîoÅääO®îj#)Ž%¿Ýëa·x˜EçìJaT2(Ÿ û,.ËŽæD q4:\-™o¬åV¯Ì`ÙÃx9‡Ã~œp,{\Úã}¸¿yF1PKº|ðñŃ.üû,üñ…Ó§ÔAázýW®×?•³úð ð_üŽ%”sÞPpWU÷xÍ o9ÓCíÄ‚i Ø„¨…{dÖÂne!òöÝYð—ÆÚ¨Ÿs­˜ƒà¨  À/l‘B{†êf—¶¤z_DIl²BÄWÕã\ƒµ†õ2¾"Ì í`l;Ø0»ô•;ZŸ» pž’?ETú7ÃKûç…i-µ7§£M圳åŸË÷à8gÕbsñä.ó9 îm/œ\y$Ýì`»‘†T£ŠïóTî–Fà:z­F¦¦4z"šò¨^)B4Pî f”ÚôJ%-Á†ô©*±UµŽ}µÁÊ¥ü<¾ðX µo7Té#l ôrfv¸ø0:Þgï”æΩV‹—ò§³oã…}¡çíÈ?gˆÀ×±ê¦6ýw Lçêà˜öDPÞkV5׊g·pݸٯ‡nÞ T ™Ýyç³bA…]/Ûµ7TŠu„@øtþž“¤zç¢]³¼=5qq‘`{aØF=ÉnTÑ–c¦Mè`®Ö<ÿÞê>„åU@)áùQ섬´úHnêï¹ß„®œrè¾0l"¢–f¡]0àä"‚°‰â¯ þ³ÈZd ,¾DËÑDš6Š«hó…öÍQæB*©cÁj#µ36^´²49¶LuÈ—©]òB#שߤŸ‘«õF¥ókÛ´™ŽT‰g® !Œ~ªê±ræÇ#m±*VfËKNbTÈ>k;ìŠw9ÎXäÖW”Ñ>¡Ñ(R¸–æTƒya4}¡ªß*¿aç&UHc+Ò8±a÷ýᄇAÂðè -dÙº6Ñ:!^$[ŒÊeYõIõÔ%­”ùæí“ -ú›¢Ê¶¬i²Ékµ³ÁÙ—¡1þŽIò^qü΀c¦#>U©¿ct G+>T¼¯zÿ?{oivˆ©»G"Åa‘²H‹–eÅ$ -…­$þ}ÁVÈ{a -@¡€DfÈB"3+—n6sÇ#ʦlA‰‹)‰#Rô˜’EÙ1vŒ-Ù¾é0ã¹ÚÇñEáƒ}GXöÈï[Þûÿ\ªºª› ’Eàýo_¾}‘t«I²Wä+1((ñ9¶ #É°Ciöv çÙìù(caÒ)lA.dëЖ»EiQBBNEìpTc†Ž4^Yœ\‘Ƥ”<€¾™›uIØô½+ûÀœsT®¹2ƒëI©¢J0l)Â×Â<" =52”§bOÇQî"vÖ[†`‚ -AO°§ÂxM(†ã삇ò/‚<Hÿ}Yc°ØsÆÐ9ë8º5¸Ê‘n+™a Šµ"e˜¯‹ø9-ù3y2½#³T ©81˜jD_f=m'£v‰s‚ŒNÁ¡ÜßÒÛS™hrx¢rS—Áëe¨&“bK…Q)"ŸÉ‡PU§LÏ`½t˜Ñ9Hš?¸çÆ"à -Wº%Êl½. iã\ª(Ò±B9q(ÖRÇRÁ0õ¤ntãÊ I¼IP¨)¯_t5¹\F@“‰6©²Îq}ŠÀ@…A ”‡™<7s ÃÍ÷¥è§u<²× “bz@H¶+ ÕtÇàAe&I}  êÜWVÔ&°GrËf5“3²¡£Í½2³ReÉd«l¿€öY]©F`bòÒ9œ˜.´ô8 ƒrˆEìµT†í¤üf¶!Ø!M`ac˸ïPni’ 昜h°LX`ß—pØ ÇçQú;eÜÌ$X*:’n0M™ -N动@—&“šm)¤¯SxM¬ì8ÊqCy¢•¨éºj‡u%B¡ä Œf§'!ªP›O9l"DÇa^pʧ»#7wšæ â31Ù†<<Ÿ‰NéHÉ2Ðâp*¶2[s)3ªÂŒšn3ïQªdèÁòe—â+á[2oU)›nJ1¿Š£¾Lm M[Á`ÎðP©Å|rã¤GÆY!_­­ž£'Ëš¶@í ô@\ <˜Ë•|ÓìmæÊ 0™ózS)“µƒ~È{”2b©Ìha“ ¼Ð³Ñç-Gj7!Q…E¾±˜T@UÖ i_+p™,”º#Žö¦€«KþnnHÜæÊ›†!¤=•›„ÍûMŒ&•øARZfúÀ•'…Œ¹}ÊßBÑv(Ç7;–³dÉßLêAN™ß¥í‚R¾Ë€¾ÁŒOMW%£®ÐT¡o«Øº´#GRCqO”V¬éRÜ-ÃØ•Ž -ý øª§ £ •ÔwÄ…`VWb/v•Äȹ®¬@Qò¾äMÇ&•\‰³©PRÝ5ˆ•hsr¶Š•ˆ¹,‘r}™cK×\ ÃPŽÒ€NøÙJ÷åRxÚsË’É”[‚Îüøš¥œlþ˜3V‚cù㎓¼nKµ¸4t÷(ð0b@¥v=I5” ëº:Ë× WiæM N\N,­Þ‚±æ2™ ˆ=tƒ©™À¢„³hrÈ(e;©ŒóçÀˆˆHŸD@rО ÝÌ ê=d<“‰/®§‹„ååå0s<dèÇ•K`9 <_"wq4¶'¯gbƒ¥d„ü •F‘Æ›ŒO@„`J L¦NT„Î&Ibe`Ó®Ø]C—)…uß’Q¬õ¶e¾DCIÏ ÒŠd%²éßàpnw—óΦ$Àr ôBÙ MgŸeT“EÇê´IŠÆ½rŽf¶ºÉJ1»nÉô?–D©¶<h¨DC‹ 4‹ -N,3¢A˜MwÁÌX,à¶%Ôq¥Þ¡Ì4ÇÅÕ93¢ NœCõ¾´ 1…l÷üPxcÏqd"S-À™6…„ø$“e!þV'A20 $ÎÔµ+­Ý(=Ž -ÚÂÙb,Ò~d•zƒÓƒ¸K*ÈI€…™ôdŠ,ÔýX’B¥æp…½ŠIÍâp -o«R,d_G¹¹ê,}±xžœr&¥îRË]_féÂ̱j t0¯LQ娼d> £¸óöùáÔ E!F/ž0†9Ω ú¥y™”]B7)ûG° 6æk™µoËÛD€ÁAé¶ÚºMˆ<ß p˜aÐpå>§B‰øáuùR?Ä)œuTì‡04é6Ý l¿â×1»´Ê>Så³i,/sN"&Öý ¡dÛEäjh¤& šÆö1+’¡‘Ǻ¢THäåºÎâe]†(C%Û8Š‘ù:èIù’”u1Æ”«ØÊ:èj\*Ô9§¼cv8ez¨;Ò|ÂNz®&EÙLÆ‹ÂPĪ[:SQjÂðt©bìèr6Ê  Pc1*žÎw•‰ ®öøžJÁ-H*,¯?b -îÁŠ)Íà(éßÁ’é4eè)YåkLH¢‡§²µt™™WÒ³ N1eš:iß mtføÚQÞö&¥9E¡"2®Ò˜©pM]ÚÃÈìß°î 4/‚lf¶džzp‰s-™¯‡už`-ĹÕõpªp¸:¾Œ»Á©|““¼‘úÏ–®æ‚«f ¥«\Ñ°g¾„è>ã ŸãÆc!kÒ0ZµÊ'b…\öAv'c™™LøB!«}¢?ø(mÙ*¨Ô6ÐíE´$Í…L….]Ê\FGÁ*>ü¯aƒ9­ °ŒÈh) jnƒRXMsBÞB– -¾àA²7é¿È÷v¸:[p…‚øBôP‡‰ ÓV‘Æö‚Ê$ÔD“Qçê„TFíst]Õš’ðTê(”úOÈÄá(>SE±8Êc)Ý2¦*>)g¯êKWšúÒvÈã´Gˆþ]v§¶dLZHU%%L!¢ ­‰~Si81@‡ë±)‡ïhRPlk>›$!G²xÛ’.ï”a¤]|ê*?HCâZ¬£4=+¼D¼s–H î,Å.‡Øf2ν+)@LXHó=)CD -]yðÒ@ÆeúÒ‹Ã2¥™ «œ4@Íô{Qƒ%NŒ.}JÙÇ£H(§.÷¡$62¥ VÊ7¹L<.6âqTª žâ£TP”ë2r -ÒÆy2[!:X8R¦S²€ËŽÔyJ{\È‹¥³á#¬Ë2 ¶ÜE÷ ÊD¿p!kAlf©±eÙ Åœ¤aêìVâû†Æ ;•U,]¦ý†ÂPˆfMž$ú[êF[†DZAµïqž Ô–ÚÊŸB¢hRCKº/ ‡¬‘ºÚ’3 Ýì컊R%çÖ×kO†¬q2‚ÖÛ -“¸{ô¬ ›æš”‹ÝpYN…S°Y,Š$€·)(Ä|y -×ù>Jëí dm§X/6¬$ÕDlܬ-æ~€b™ .¢DzÕ8'd‹ÑðAM7Ìјˆh¡dõ¬°Udq_ÙÛf›³¬ãz¾Ë3“™Ä€=Ö\9À“àQÚiÌ)iñí ¦å© UPH¬¼(4Ô&Àí&¾£˜‡«Mš˜AP8Jê° ‹2´Š¼"ŒlÑcÃcK™z`ó+´ËMx)€¨ñ°èÁ’ݲPõàêÒÉsÈ1 "]ÈÓA¡g³Þ]âÛˆrÝôX_æ0ˆY¨b¸²u èY‚–Ñg­‚Ô=ÛŸ}Yšö-õðÞB¦’Ö9ù?²¬E—æp”/`)Ghh“÷$Ød¬û›äH’”Ç\†A -#%=µÌmè¤'ñ9ž#3à²øXgC[àpÿC²O$mu[½£RxDc`oz¤’B91ø}ðöe ”;Mq|6iȘŒæpe>‘òŠæv5åý–¦”ìq‚€ÎQŠ@²gk,0íRz ¾@îXÄfu¥?€$ÿ|É°ÅSi Êôeìmva9 e Ý’kH*Ø°tV0:N(Ù¬k©4ßPˆL'Æ!£P ;=ƒ-®0ÇfVêS}Wã¨@2F&•ÙÔµT–Uéè0 ßWV’ýLƒ—.û梦ŨՑºO¡ °º¶ü`lFä.zÖ{óc1eŠ7TzóE·Iû§ˆ$Α -öžÛrÀR<ƒBwlïÕ†0Å*Ò¡x-6¸Ñ¹M¡ZPݧ³ŠÉ'KÑ4ØžÅ?ŽLñëKÁ!dÅf€ïù*X#~¢ÎÁÆÇ’¾²š„î,É# ÝMeˆjº”]€È7›@¹D©2l²á£B–Ä,¡>Xhì·ã6k.€ýfH‡ý¢ý­-ðqÓÄð† #¤5@$¢œm=ÈÉå *”t¯4_.ÒbžŒ@˜ÒƒdeFBx -‘ ̓ï£m¢´…ËÈLжˆn BR„Âñ!)Ú A4é’†Ö¤ik•Ð6¬"… ¦yMÊ>D W´ÔËrˆÃp×O1ôž¡ϲÓ/Ë㘤2Ãì6#iØ ©sLžä7¡+Û’úmcnzÈÊH_!ÍçMƨáÐ<#|Á¤¦ÅTiQ€s™¤šCŠB!' d r-6˜É#­$bat%Ò[ûÒäCÙ›H—é:EU Ë•7è»"‡$e˜©Fž´‹><×à‰Wš÷¡ºš©¹[Þt¢úîNóÝ™â»3½wgjïî´ÞÝ)½;Óyw§òîNãÝ»;}÷ÑQwM´fz¦abœi¦…›«D˜âÜM¢ù¤0JJ 6~6kŠúBÃ&"èxE5:ŽÂ4Wy6«üÑñ78Ïgí¾ÅÁoQ{(MV4ÏReÛ‰j -”[&›èx2œ ðò¾LQÁæi؃Ԁ‡”x?l6–Âà|™Hz])“ÁªÅ*V£)k<ê²p<2Cc¸ßÚdÛ °Š" ØÝ…Òüø¤Çeëw_fˆgÿ(°øAö/Ï“öîZ@q`jkÏ’ -"å­# „@©Öòbȶw·åp’>5I»ÏXÆö ]{‘_3V[b…•Hïƒr°LVα›&š®!™©‚âÀ€±ÿ(õ]I”“[6  Î^ƒ…h ‚ÕPø.ÍvØ_Ã1$³% )ƒœ–PÑ+0öt·<¤ÚS/ìø8Õ.ÈÜ5“Í£Ñß]¡%Ç IeqÈ&ô4åДүÑCb’#Ay– -“êiÊ­ ²ÇÒ¼RZUxtQ¨PÏŒ~L/H¡ç“1¡+©á‡¼Ð[JhìfåC.#©´º uñLÆJR²‚ªK*í}M’•ùÐÚ@Šè¡„”úÛJ5ë¤t6$ʲ$^s=Éyc BÕZ†b¹Ô!n%©…¡l‡@¢n: ¤QI—=Pz,"Å9(ì™%ÑÇõƒóaêZ£õªë`‘@ -Ð’ãË+îÁ–¸Ê·¥äM¹‹ … ñ ®?`(–fy”³‚ð’¸þûàaÇì‹4¨Ã°„D88"[N …CÔd4ØIƒ*C!š+"1Àù/Pµ#ù*t#T=X¤/ŒÃ‰-}M:àÑ[z[!Ú{‡z0ØDJ`ä×mûdôÕ4G Yoƒ+1Ý>'H3˜˜¬ÑP…ÅŒ³0m‚B-AÌQ™ê¼g³«¢4ØÀ)hlã†æòjÌó¡èD¹ni¾t“g|8K»ÁoAVaˆ1Aï -🣩Lr¶##æè2ŽL[ᑯh eåPÖèt¡ê"c9¦y‘'2¥/ šB3@àBY‰íÀ×QgO;å -ñA(tOx'èí’5qÜ'°Ê0]™â7vÏ?j['<¡ 6£f¥¡²øÐu“b·+Yn*?(&` ®e+±¹&ådž/½¨Œ ­Á¡¬ÇR‚(Š§«Puù¼d4}T=hl í.ÚÒb -Ý ØjEH›2£1´êÁrl圩862Ô!̤„Pix„™l&È‘Ä»XÙ”üMá5€ó}Y¨éÒEEl -­8d‹‰¡#|Éžajjd¢d½»(Ž¯Í}z–àÈá3ñ¡©øž² ß—vXâMÚAÒ- ÖhÊÊì¨ÊRÝšìýkÐn¥WhÉ—…é ES²À#Ø!Y±-•ŒÁ(ÍŸm)7[t\ ±-Ü;[vÀ˜w Täƒ Öc`Œ(¥8^¼#‰-¥ÀF§<·FWw!HÈ^6˶݀ÂB.Â&²Baº#…³lýjkÁVv3PÓ ®‚¥Ð»¦°(zFÛŒëäsI¼€‹À„¶ -˜šË¼’-µSžLyÌ¡¯Hd¶!Û®x¾â¶¿q¤Ý-ÆI–Ç‚|Ø]Ÿù^Ç´ÃxÑ0¸Þ•¬Lœísz)‹btß–&+Ž#{æ0¸&‘i·±gK(äO~,hDâ;Š]±HW¥ºU=0I˜ÄóežpW…¥À‰qÆFŽ€§ÎÂñ4ŽÒ`êàØÞ [˜©‘<ч+´ÙÒwNÆéQA©"!ȱà6©ˆ,·8:™Ç¶£X(ýÛ¤ZÊ‘-Äq¹Šl7 ¡K&%Juw™dQáS䬠Ïf¤„j"Z…M¬ƒüŽn)˜IžÄ6Þé„• ©—rã&‹NÀ*È+_Ér":ÛH†Ð‚ŒÌ!‘Hx åĶ)g2Ïdr=]rF¦éKÏË•hÉð,éÏb ê ÈÕ”b(p¦‘®~ž¡¼µm¢r–<¼ÀzÝt0&…r‘щØ×ggA:j´‡¨^¡.CQ¢¤_I9–R´8Sz=€@î o#²:ì`‰ú8=0×bÀ´>;8lµøÊ·Ù PZúèärx¥ÙaœÃÆru©“V»ããB²ûBte†`²a¹l®ç9ª² ¶™æ•¾;ž2òRÚÐC¸ ïm+Ðji -B…’”¨Ð7 ® œê‰°þQ–4ÛòYR‹Za[ÚÔIsAž¶BM–6¨¢£ «94µ ¶Ôq&þ(Ô%÷S(·”ªÍ2\CrF¶òõ£@ý6gZS˜I eFB2º&hÌ=Ép™À€[…ÎLBY H€;y\…ð ²ÆgiK\Þ,½Ñ(/½MŽÀ\¦ÛL$ø’~ƒŠŒjBdŽGa×°\jj°½Ëæ*:Ú¹s®‚§è*†hɶÔT)ú àfé×HQ à*¢ 'hÎg;p£ô”—ø<¹ªÄ̹ÛÓC\ -™’QÈßW“õ8§Œô+£zó9€i -Ýúa™åÀa€Žq̓4› h8æ²$Ÿ{RG¢é:ò.:D˜'›ôÂv¹`,ÕGPhsr •É[ùêƒ^ËaE–êD f¢³=WËSKaW}²Ù :0<¶Ö‘ÆÔp—mO:ÚhCsH&gÑ ' ÆOâ$i‘M’¶À8H)´E˜´y´$Ǽ™„c&sˆ|Bd™trC‘«K’Ã#Ò•–›2p'9s†Q -[Ò[¤)ƒÁñšÌéJíO—Fu #»d›¤^¦B曑’"-´[ -ÌxÑrÓf«%¥°“R¨å_¡É´Åg{—€Ùá`T.ÆÒa,C’0`6Ù-çéMÐ`l àLMéJeH_%®ô8O$9¢èZh ìG‰¸ÊWÆ5šµ -zÒïÅ÷B|/ûúaÜc% ÕT”4T—Ò|›gâùli•dùý°¸À£çX’œGB"`:u¢¦ å8Å•\26ÕùR!Øñzš2„Ñœ-‘¨¯4C®aKCv‹^ÂbeűË="%Sb°@ƒJjQª°¦ô^¤ÄîõJ\Aì’'1K]³Ú!`Ä.°b%d‘m¨¼¶ K&€jãK4‚‚ƒøa™Ï’ =ˆÃæ(6Ù¥›Q9>I\éxÂÕ4“íB1;hÐÜu-)‹4‹%ÒÊVî=ÅPC´Dnk­XÉP|R'KVêäv¬L¾¼+wpV.¿ƒ+múìWeñË[¯2Àºƒí*—¿¼å*—ßÁnUnúË[­Jºå¥mVÍÜÁb•*ßÅ^•i™—·VeÊéåmU¹ø–ªT~;U^ñ¬Té:ÝÅF•Ëï`¡Êåw°Oýè¬S?‚|0öëÌ£ò»\“¦õfÕ= Ûãz ‘„¸:zkH¼Ívçå¹aÐ ÐàGr0HC¨[×QckPO8@*ÁMæDÄ‘“PøÏ"¦5àÈ\ö&&•ó" í4ÈØ&5D°L“Í- Ê¡¨IÈ‘Y‹›lö6Æà8VØBLgÇÖÔ¡ŸãH“ÏaØ\ -ä¦VÁðüü‡%´\=7AfRRjÈ$Œ,jqM‚Kã.…îÓdà–€¿|—!¼ÊGãJƒ4X±UpNN|!Œì îqD¦yyk‰Ùž¾ÜZF´À„ įði:í'ML'åFYáB BØÄ\`&ÞW™´¹”zœ"1rŽ øMƯЈ`Á(žŠ0é†ÆœÕB$Гôië*K£O®´PH a–Y”j”¯‘®.ó×r¬ÜrSŠQC\&Ç`#QßádGXY -[C+9c(Š†O¬ –ëÒèRò(©ÔQÊ‘±A$éZ!¶”‚Á€ÃQÔ=Fß`?n•QA¦yÖC¡–ˆùRIAا×ó¤5(„Î`½¶¯¤˜oCÅ©u¸+å e§B¿~’‰€<žæ€¹Qˆ……”À¡€ø¶T¨c*ßeÌZ¼G0NÛeã`ËðB<]º}[¶Œ"€Ra/”Ô È° zi»*€!­]‚pÀ(ÈÇÁ×Áw$ÃŒA(ƒ4»@fQÌ 7Ê;NÉyf|J–@s¥ðŠ6…¬l[ mpQæ 6)ÙÈÆZr(†”—Y|VB¾l†Àj‹Ñ€(2¦Wµ‚U>;…ì9”Ë[¶‚勇sHåÆ+3d!ʳò28˜ÓP‚gAþ‡Ï”*]"Ç0Ü'ˆ.R!ˆ\˜ìÕ -ò:ìñ¢\HL&ÑÄF¬h UÙŒ"ÀÄÔ’×<¥$Å‹Lžçf°“2ŽbQÖƒû&;{¶”1½ˆÏH؃€ÚÖ“2T—Í*0àªÎF(RŽ[ây’¾ð•z ”lŸå¸õ³Y9LQÞ'Ìf”Dˆ2†X}4š®)ÝWÒo1öLAEI¿ 2¤Hȉ¹±`fÕ•/q0>ž-m‰e¤d›„WêJsš-Ý L1}ü[g;}*$©(ňôCº -à ÑfðH¨PÓpo &é R€bp¿Kœ,©ü5 73²À-…ád|xv‰ä=rt -”j&¹‘¸”Fƒ<©10U êRôpª‚5[­1v@ÀàÈxÄøºU¶z¶¬‰›@@ÂtOæ4‘0Ìêa°µ6ÆeÜd“ý9%*J‚Œe€ñ*dŽ ]†ghäê!:„r]SŽX$^õX¤ÅÄÐ8qWØ„Ú’¹éÈMJrä¾Ç¡hP²Á„!EUÙŒ£…è ›Då·†·ð•!;2ÏkË>fe:Ç—ê- ›¦Á3XÄ0R®ÜbÒ.¡‰#kÂ!ã-Å9!-¤%]âH¶ÆµT”6+°Ûµ¥ -WæŽâqúŒá$ÎAõ´É=`¨Z*¤—s0ÝEÍúm ³Æöµ c3¸®TÁP¾t,н К`0åK¢ ŒÁ†ÊÒ¨&?â$½âtfzÈ‚™I9°OÖÙ¬Y -Xä˜Npl·òMùRÀÁJÇ“Ö:° ì>áÐ,¹ H ûM IU ‹­™«#k(‚`dR.I¶ÇR(ÑoJׄ˜‡}*=I[»Òè ûšXr}é}i!+'ŽŠƒåì Á!=f;Ë•HÕbÊ€Y¬„¤nØw 0p­*¨ì:ʬe²½b|dNÞ 6W¦5”Ë ül¥U`Ü!t¥V2–—í„’F>Ro+³€’QÆ8\QA”ÅáŒÍ 3J€hLDIP¬Üü ?l¿îÚ²gMŸ{Ò>Eú 07#ÚÉšMŸE¬Æ ,)N³CДj’ $† 0ê>$þC¿H¹C9Šui?‰l§\¯0¿ÀÞE>_Ì^d -ÕH,›Í×j2 pšÎ7b´ÿtQlr[¯gÃH\#2 *KPnû’nv OÅV¸ã‘”™ ™{p•Ë9£/ƒô`úJzJj´P™œu¬Ê‰.r¼P -LMDsM5^Ã2"ᙩB†xr%ªœ³õÉe‡: ö'-\Æ3KtÙã¼FÀ•ýœ€ËP’''î‡}œ.ó“ü;^•ÍL­ž¯Š«2Ä'ó÷>wÈÇM¡Gɬ/r±¬ˆxeâœ/ºV"ªFÿz …ÄJ¡¶%þò½5™©g&#¾i÷>÷dñs?wûŸ¿lùßÛúÓ:Ï·yÞ×ÍõmšóMçú6Ìù¶s}Ós~Ùù¾©9:ß×ûóé|_ïÏÏÊ|ßäÏÇi®òçã4Wøù8Í~>ïëý¹ \{Skú¸ÍùUÍ÷£šó§ó}ûçùºçûé\ß¾¹~Ô?¯c__×ßÄ\_vÎor®/3ç7=×ÛÌù6}}\æ{Ûµ½®9¿Loû|ï²ÎW=çWu§îÒÿ'a¾ÝÆ~s}UsþË[öõ¦çžÇ§ó}½ó}s~•sý¤Ï÷¶s~wòe×y—yÞfwçeöç6ó¸éÏ«¾o¯ên½é9¿êŸÓ\_çœ_÷ÏÇi®¯rÎõÏÇež~Þš9¾#~nXó½ÏÜ»÷™÷nRûÝÏ|iÀó¾ô™w¯¯ú÷û¿ù›‰ûŸïº |¦oç?ýoÿÕ¿úïþ³ƒáÏ_Óó;_˜þ­¿þ›óoþæùÞ~ßgzÏùÝ/-ÿð_ÿ?ÿößþ¿ÿç¿ø§¿pMÝ/¯ÿäoþ¿¿û»¿ûÛýÇË¿Ü{·ª+æð¿ÿíßÝhbmÿÉ¿ü¿þöÿ¾ÉÚÄžþàý?þ·~ƒ=û¹w?­þóñ£ròú³ø¹Ÿû{¿º÷ÇÿUÍüò ÎXìÄÚ÷~pô~áFwçKK¿÷ãË¡ÏÞ¤î;_˜ùúŸ}æšý⺟zþ'¿¿üå¿÷.ýô¼öïýêÎüááà¯|~ù ¿Ðc‘bqðÿèéÚcøY]°ÿ½ËÇüý—?úÞw¾-~~ÿ·/õÏ÷¨ûÅÙßþëù_ÿáõuÅËü¥±Ò_ü³ÿðpíº9¼û™_þCã‡øGGC¿rÍÚÞû|_ìà0qø½ïïýÚÏ÷Þ³÷>?üäûm|ûOž_srï}~äé7ÿì?H.ýÖŸ}ö—Þ{7øiíýÝÏ?ýæO¾UxÔ7~ù_üçOø4àçK_h¾vï|æþ“oþäwÆ¿ô¹ç?ý Ú:‘Å©ÈßW~ïKñ¯ÿÙ·ŽFî½÷Þ—–¾óW?¥ þö·¿óï|÷÷ÿ£íð‹z糃ç?üÑåø½÷ÄUs?øö÷¿Ku¿óÝ?øÁÿéŸÿfüKï…ºM~ã/¾‘ü²(yç~Õ]”ã¯?¹¨–ÿÑùÃóAµ1ï|fàüŸþ„ïø»¿ð…_æUý»¿f>-í=ýŸ~#©:WüõƒÍ¯Ðßï¼#7ë½/zþNa¹ô£PÇâv}ÿ¯¾1ûÅÖ}çž÷ÿô·Ö6;Ôñ»_~üýŸÛ‹žÉ¦_ø!vü×ýîŽ~ýçÛóçýè¾³>”þÆO¿‘ú•_üìÏ¿ÓýùŠ~/ü{Ë¿6|þ£?¹r¾,n(?߶ù¾ûE,ÿw¾œüÆ?ûïžLÜ{çõãïm|¥0½÷•ïþøùàgqðü'ÿóóG¿ñè—ÞÅçûƒöÅaß]ˆð›?ýÉïUí{ïð¦ýNêËÍ¿'ÆÆ©½ó™Èã«Üšû«ð¢äýúÿ§xBUï_þè‡gâÞ¼û¹ÿ`äþWèE È»ÿ­¿ø=¸gêÜß»7rô­?û:]›wáá½wé\õß…ûûåÏBÑ;ï¾÷Ù/ýîO¾ùä>_ÇÐRð ýä÷.SC_ùâgþ³_üÊPòò[?ùæÓŽ*ÿî_üéï7g‡~}hfãù7~ôgß|:ÒÀCåoýÿÓOÿÉ7ŠG—_ÿÞÿü‡_2Ü ˆG¿ÿõòÓÿñ¯~òƒÿù¿÷õ³x_w´!€ÉôfñßÿþwÿëÏ7fz“ï~F¬iféñã¥éÁ¯|ñ’öê _ðY¹›=«¿Óø ¤J9°Ï¾÷¹' l).J¤xZº `È=ÚB-`ê +òÁ=ò‚ÑÀ3Œ"}@̱+é2ÃY_ÀmRÕ¥÷;FbÃrô,J//7å²ÏSQºÛS¦'ŒWIDùV³cO ÜÀÓ¤™A$*vª´)ý·r(’妘‹'c Ûä î¢äæ”)GeŸ“Um -€ÔÔg¨' Ke¹5LKº¦r¯ºFn8M3…ʉgªZWÐmû&°?#n&ÓÕA®ÇacÜ vÔÇDÄÖä -dƒ­l¦.¯¦Žãb#K™ÈJ>sªF}´UÞÌä -qy·ê™j¯NW™ïi:Ÿï9tñCˆeÕŠùÖŠÔG¸úbé2²UÁ¯½z…jÉj¹"êPXSÜïµÅ: Õ]Ï—²uhëðZ™j¶œé]7’näòjðÙõ’â‰yöîl>SÌ|õCY‡úè\s+[-‹°šÈn¦ZÈœóâXKçõ Ùz÷‰ú(uèA¼âñzy\ü_$™©]P±U¯–/óÍí¡%õÑÚ~-sÙ^µm·ËÅKùZïXéú‰b¦V+dƒm¿n[™«r¦$-Ê F¬¨м Õ~ ,…žüiD&$¦z¼”ˆ.Þ+Äf`¼cˆ³ á& ÛòÅstLÔÿ£Õº6zå›àËDŽ!“ ø„¡ñ]ƒ>ô^ÿí×ÒôR{¯Æ¢å -|ú!…åj8ƒ›º)È6X­B !ŠÆÕˆá îÀ¸- !$þá‰UÂÿ Ö«^‚+T¼ªÇùÔZ ׂÿ™ˆð B{¯E|ü¯ö:f&ÁXÏÝvy‚gÇ7ÐÛ>øu‚¶ÕgF»ìXHiJ»ìÀ¹xz`ëÇ|={‚Û-‹±iWi¢ÜsŸ2ZÿÇ‹!f‰>àòêÐ¥x7=ŒçZf«ô Þ©Ü^ÞWƒ~ér©\ôë'úªAR7AT ’(ü ¦í 0‚ÿ55üŸ¹Á”_vø€¢ñÅ‹w#– ÿ…Q_çØaRŠ¯E,±fþ÷ºÇ(Q¹õ¶.´ñz‡ÈB^¬ÜÑd¼ñ_í5ŽÐÔ7±\*P¿@:¬©Ú¨× -¹¼|v‚EëIíD,[/¼ŸWÕ',ÒMŠÀXL%Q(E¨ -å:c› î#{yûf7-ž4ÔFüZ¼¦IX0,–_®oæ³åjN2|…x"mZÒ}Ãðb9,™ŠÜû\dXuŒrq1¥¸¸¢‘áZ>õ~¾´–ËaùTç™M&Ö3ÕzÇUb‚ƒ;-{Ö©Ýp]¡õ=tŸxïUÐì½ ÿ(®U¹òõ+£ŠÁÒ”B^oWÈëb©ºXªÑa©˜i¢ùC]ßâ°åR®Q¨w[á-6ì•{sFWyì¢Mê«ùlæB±‹v +•Ka(´U¸ª(z‚úK>ÁuEê=ç/6ò‘ùrùí†oæ©Ü|kßÀÓøH@ým/Wü4@ñ 8¥œ<¯fr…¼¸y6PBUâ°B~zHÆ y÷,?éc)8­Úþø9t¿*äÑ{‰‚Éldë"“+@YsB›8úÍ*⑽Q3åsnêab»P/Þà -2p3Ÿë¸(W¿6ÒTò~¾Zģ́ÅR®¹Êi±Q¥*š&Ër™ê¥lF%åJ&+KhÓ*™Bõw”vˆ¤l‰rµ”¯ÖÚ÷¨és÷]jéå¦û¤Ûr5p§µ7I)Üô…¼F”‘ÈPíLå-"`ßu™‰=>š6Gž‘#ÏH7"¯ƒÊyóÄœºÚÛBͽn”u|ýÚÊ'à,”Kù³å«ÓÈV¡xùö€œWÄ3†[;;«åë˜@¯¿…>vÇnM=Ü· -SŸÕå[²äªX¸aÀDÀóR½òVÂ$ÈE+þ±zÃàN×öeÓ[³r‹ #4bäCºTHàéø7@Eo>¿µB§äŒ0º ¬44Ã~á(Rùä -¦¼×ý?œe'nR7FPö%ÈFê– æ%>Ø>¿9>ò“ˆö×/2¥z¦v•9/WÁ²ömAûŸ -‡>Fü•È”v 墠¬RæQ”dC*þ?ˆ\§=jAV·× ^÷›×õÚ²¯J;ÂÀ+£9Ä ûÀnBÚ6Rå}¼/ÍëÄOa$"E$Ÿ’¯’Ø0"bîÄêþò§ÔÀ§ÔÀG -âuÉÚCRp׆ot÷†ÿѼÿ×ýäíO‰×@ ã­ÂúÉÌU¹qVÌœçßjIÏÏ ºoÔê…,˜¿=¸þA«·GW÷ZEÁ¬×hÔ‹…R`ðørª–NnªÝ¸¥‰ÁùܶÆð¡§Yµ¼é´L©a©¾–oÖ¹äꙢls7®ir¡XVdNkåb£žW_T§bu_{YHò©zõgÒne«…ÓÓ⇑tæƒ×lßøs³Ûž›®uzotIjW ?½%ðà=ÌG2âzlÏ\¶/ ‹»/‹[ÝØ(IηPiZ¤2æ²;sQ›L){Ñ\R¨É%4——õ›ñ±â™ÉVGsÁÂ@§Ôœj ¹éŠ!­×‰!?bB ‡jÜ}ktÂkÕ ƒ$#–íY&»f½I/ƒŸAÄS( -ÐÙ`§ü‘"ž…)é+‚­×„øi]~—ŠÝ7¢½Ax7^%ôŠ=à´[ûR0,ìÈá!6Ép²P«3ÒŸXob~íôù¦èf2ÒÔ亞»—‰9 ó&Ý’Âø$œ`¯ã³>=¾·÷ø¢>X”A¸;©'Û_YÝ4Í^Gê~Rôm"h>å’?"b¥|VWªVÜlÞ©ä§È7ÃEøŽìƒohs먄Â7é«ükÔHý69r¢HWóùˆ@/õ2ÈIZrøkw,ÜÜÇÙÍS²©jV#dV¸ð}ÈxZ¨PïTSçšM}TÓ°pa§>ÍN5MªéQÛÕU¿¹Zçj˜~T·L#ü…;÷Mñ&t=ôEïÚ¦}ꢰ}êPØ6uQØ>u(|ÿa}+–ËTÄ_Ç<ÛãùÓâfû]˜Ï4j#/6ªQïô¬óehªö"½ó2­Çb¿‹\¦žÙ’²Ë‰xA¶m%=;)úÈaÿ}âçþÔâó‹Ë¯Å¼ìÎ}{#‘Í@aß?œ…½À®Þ ¹F³{ýšãŸAò¤ž©Fâ*øð|D‚”- 5:;TtA -~¦¯ÝÁ&Vºù N ’¾RË÷d dˆ±ŠŒ`¥*Þ+äXÈ/]›x"­ò…ó‹zs·›ùbÐ>\ªìËb’m~Dž;ÑH¹Ç¬`‘«ôÈö£‘Á¿Ò'°]Í”jgåêUmüIe²=TÛ¡.nú -ÍS—m9$R­ùJ^•ßÏ/¯×;ñ”W‰r¥¯I}4–V -¥õr¡¤^+†Í•¯$B -iªë™zþ8™?ÄP­ã7 -ˆÊߢb.›)Š©¦3YA?‘òJkù¶ž¯fó­Áo+…R¾s»=zÜíÜc5VëIÇÒý[“–ëÒ%êãÅr¦q¹ÞÈ^Š_Uî÷„kÊžnìàé™QMÓÊèø,Ø“›-åµðQCs6PoâåSøð)|ø>Ü ->|z×Õ]wz]v=ªY®ÑãÆëÝï{(ÈÎ-.¼Þýº·vøºïûëA"Žƒ—íSìñ‰}QfOôµ€_û‡||qÈë‘7raÛ -£.ÿ«C ;(œ-sÞ¾&Q9Èœw_W¸ ëda­ŠÛ,¬ÕýŸ~Ô:ÏcA±¥Bî<›qŸHÍËϸt6œ1ïSµñϬÚøm´Õx£H¢ŒÖUI÷¤ªŠŠ@ê*¬¤¢õÑõ1H_°¬e‹Õ¦ùgkÕì›Ó¼ÑZŒ7 Ey¦Q¬Ý,â4Ón7 -:ÙQEÐ55ÆëO•r¡hýׇý_½`„h6ë§4ügøpS|¯ ~ vàÎéI –Û\|ïsëÙ¦¥ ï]êù¦r¼wbßøn®õð‹§ D:}uð«Óå«…_­._ üj´}Õ%ù<¼)nÔê H öáß }íè]à»ö@„ꊢ}ñO¨¦ÍªßK´ï“õlèÒ÷ˆV4†¬i¨ èÑP=FeÄU¨5/ÂR$1ãµL0êD´ÖùɺŽÖ4Ã(&¬jš¡¬i5Ï1jD´Ö)ʪ†žd í¦CmäEØÅÕpw¸…¦T„YreQº:cºÑ`šjw‚yr][Ã] -¦ UõP]#è×€~u#Ú|@r;×~ž—§Ó|àfû‰«ê0ÑÖc7ZÏ]ÕÆm:z½ýìUm˜l󀺾Z‡hâmðƒí¥ ;-û«ªãœWgœðã4¬æMV pëÄGU›gݲѪ>N\¬6´ÙxweåØ×Õ<ÞÝæ[š¬¬âhÍ·54=YÅj¹¦¡É*FhËÕ‘ïç‹E¸C€¡ùŒ;|j‡ÏMÇØôãæ ðc˜‘à¯sT„æÊA7˜r¼ü<ÁÊ”c¸xmÏÚ4Í3Q®T$òíÑWkj -!kNº¦­¬×uaád×ôªÚ4—mAŸA®«ÈV£$øþkûi­O ¯æsb£ªâYæ3¥È¶ k7 -œÐ±!÷¹þa5sUÈÝ°#U›[ß.Tg¨:·_j”΋èZ^¨Üt1-m¸'za›‚p¸a7áÜÇ-ãQ„ëSëñ€–QËír­¢¥‰Z»×}é^Køf¤{­®]÷ZŒïµu¾Jr¯ƒµõ½Îù“îµ…‰¼×:¢Ô£Å½d’']£”³ºú99ñm¨p t¢…ª–kµÈB¦ž½ ¬Ç‚â­a¶ÁwƒM+ ¼þ¶î–\DÇW›©ŠÇúWrí"O1$*èoëBËyýwã6ïéí‡7ß±–m¨}ðf±i­XÈ~²P)®h«Ü¨fóqPq½Å‹k™ù‡×ÏÔðô(æâ%-Å[õ>ì‚9¯_• ‹rì·rU_í¼ªț㺕ٖgöV®ìåÒ¶º öJ¹nyºïD 30ây«Öw¸Ö´-ð´\$ÚJþ¬¾V-œC8¬k—*õ€oÕÛ×ñv¡nß>)˜ûÕ"­W·Œ¼¤ù¢Æu=²^Í×òÕ÷ó‘íüWë‘T®PÏœŠ…ºÖŽm›6ï~lÑdªõÓr¦š‹dËÅr5¢GªŠø½¶*ØXÊU؆exÝ+¡~¯­î÷ÚIœ·êÚŽOÛo ÔC#ÖJFIöC1x!QAŽµ¦í•{)ÔÊÅL=/ºÌ#™ß»öeIpåF]ô^nT‚º<QUÉÌMÞ¨€Ô9ÏGÖËÕÀ ̱aÚkzEt¹™©ÕóÕÂ×PƒÙÌ£AZ¡,7P·›­æk×6麇í«ô#3Ö -Wb&ÔIÛµ–§(:’ý¸òr•B´µïL±Pk-»ÊÔ.åf(ë¹J&— žGl1kÔËj -<‚v¡qZîQRu:ˆ¦}UzUõHˆYBÓxy|ZäLU­â¸ãïçÁ¸5rš)fJÙNw)Ü&[,Tă@è«â¡œ‹¹µ-½¥I™£ÝÖÅ3¿aՊïë¸"Hùý|µßZxÉ´å—±ÅõLUì†Xjm«q*6']57á,ç%°±B‰76{£‘ˆYÉ¿Ÿ/¶B±¦®SW§ù\¬XÄ΃~;WÍ#žUbó3kïx½Z>+óMý¶WÝ»(d/:Uí0…õd,íÄ.4ÝΕ¡¦ØìZ7Ó‚·òÅ…L]ÜÒ•r6S„ÛXà -Ѧª½€ÅdSÝð÷m¯ÂÐêÛDØH¨e^mFD×—G0೉ìUT^µrý"_¹QÕìÕ‡o7\·š«Ö¢$ 6Ÿ.m[5yékµƒcMAçˆ-ʵ\“pµ¯V¢Ùr ÒjºkAÕÐãE0Ý©ª@†-àÙÔºT­¶Uí¸ö -­üšu‹Zâ5µT a Öº™\¾š¿¦Ç¢žÅçÑ»V¶íat©XÊŸgÀ<¶G­³R=š+Vªgå9×p~u½ÊT/kå³³h½\¹yå¢ Çƒ)t©-îO>×Üõ *7wݾP1ói¦Úsï¡b5djv]ÝŠ > -¥³²¬¶Ýf›ËŸ‚ ó—Ãµî” -s¤Ó+ÅfÏ˧ -endstream endobj 220 0 obj<>stream -u0½Ez؉¯›ó‹í¸ÓÙj. -H®˜©Dß¿iE¹@½óK€ªèÖ£z¼¶¢ìÑîùD­J¹V¸æÄ š8‚Š²í^­\…$#×]l±Uøÿ”¬ozV–°¯R®÷º†âÈ£Øg¦vZ¨_eZIáŽuËל·ªxÊâ¿ž5sùZá¼Ô²ΧR©F/Êèÿrm½nX¯IBáúzÔ?Ÿ•¨\¸O0J ¿„EºÑ»v5Ôg袪`HjAL¥Î•C`¨òƒŠ92¹Ùc®Õ‹ü–+•^XêqÇAÅô-*_‰ÏÅ°xâ­àå«ÍB žs¢ŠÃ™.÷JÀkpâ0ÄOÜÍ4]£3ó)(ÑÀ : ߘáèV4²—?$Ê‚·ÍEžoí­­?‰¼o\³$ ÐÂï´ÓƉJp(7;$»2¥R¹ú#*®QÊöæñz #¨¦Ðqw¡«Ê•\㺵kûÈ–{ì Єł|‘n'\ ª´q“©'2K×T:Åø`=îk!ö¬iU¬m=™>–º£ÐP @'2R#ÔÞ¾µ#™j>R¿ÈG˜"Žˆ« j‘.ò¥H-ó>L+SŠ„§tb$SƒbŽN‘L+]I4²SÃ.Å¿Í}XnD*âuEÊ¥Hžæ…CSwçà]hh,"SMK¹Gêeè"›ð²g"Å̇ —ÉT*ÅB–ô!µFö¦·XJ"¯tC£•Ä=kˆÙ•Ï‚á µH£t žŒÑÞ‡wöZt­*¡ëx "“ IëË…*›–7T2Üph1g±é™–uÃÆìçøaGJ§ÛˆóQ«ÐÇÉ!¶«â{Ji;¬d½,þÃVàÞc{)xºÈGo®­ë,Û•[²Z.•³ÕòU>)nYwÕÞu¿< (ÕY¥çÑ´/ws¢ËÂY!à†oÓMÛŒn°–ˆ=(wªµžc¯v<Êb)+ÅmnÕ.ÉT{q­4&ØŽÓL}%óa¾§xözåÞ xg=_7¶^ɛ肻4¦eÆaŠ‡ÙµÛsಯ@?HËãÞÜBK³í -ÿ˜NáèÔÅE -"äòÆ;²Ý[ÂßTwó:‰]ó49\GÙŽZÊ#ÓRÂéƒrõr»·>£k»ðônײéZÜ®ih•Ýô²ívµpµš©^îå¯/EvÐf;08êÙB0:‹!MHª’â½51²®À‡0‰›T•‹l¥8;Otg±ªÜ ëF%¤Œ^.”$Œ³:j%íD´’âØiùý›š0Yh\Ãvz4´ý‡àºXwô ª‡–ÇÖÁͼiÃðüŒ.„‚j×k_znjsã›b÷Mo¼xko±ŸŒx_bC[[ÞxG±áKoiKë[íiKÛÐŒ{b%T÷ò§»…ü797@ß™z~û¢quZʊפF—„°l;,<ì$É C†VÔ©È°øD7¡ØEI »n`M'8×¥òid 9–Z$tUzæš°­ ŽNïÍ MežŒ-™ƒkãñ¹êüÕÅäy©o)Ý76<”(d¢µÎÎBÊ韜ۙŸ]µM®<Z«6²n:e¬zºeõkZ-ù¦=˜›z}87=V©ÍÕ– 1ÌÜÔJ_UÖZªÇÏ6V榭üV¢03›MF£Cçmc­äöÅ€n2=0éÌדÏâÖÁøX쪼R‹-nÕ/FgþF:i=Ø‹?/í‰a’gÚÒiÇÞ¸þ™»»qø4¶ˆîv5\oòhnú2}47Y‹^&ÇéáùÜ™÷+}"hãäÙÑž/ΟLžÅ/ê‰ ÷@oÚ‘“ÁdV_y17ýhh:“®%ž?+‹ß_$s‹}ñqïùƒØÖx‰&ñ$“kˆaüçãÙTÖÞN\XÇSÓ±sp4þxìdt.1´“Nägw—ú/¦²ÙÌ%üVM­\Ðк6‘q«…'“…gK¹xqàÑÐxuôi#¶²5ø027µtaŠaœ©Ý£¹X);t5:³:5á^=)¸îDíÌŒU³‹úè央ºÌ&—j»bçÜ¡¼»gj¹ÉBb"#Y_ËÇ‹îú­ae`.±8Ý¿—ómÍ“\<³ µò–Ù}ñä1n·`iYÎó<ÛN>MžM,¿He2CâÎéΆ¿>ðd'¶–ˆ¯'϶ -/æ^Mž‹aâÖþö1mè“;H룻qëIl-|¾wœ(.j Ü'XMx«–VæcÇK:Þ›éÑÊÔIzøl9Ó¦·Œ‘Ϧi&Í;â46ý|zx°2’¸p6/S£+Ñtp_Å;Ø/#°ÙJåà¢Î‰×u5(×?’8¿HÕÜ©ìÎfÌ=0öZÏa}¡¸ÛÔùýùÔøØ©ßéXüËürB Û^Í -`3ë'ã+û—æ‹UCõæ÷Ý3ñxR†fÌ[«íק¾žY/N¥“ö1:;Ñ‚¥‰ueÏÒ©¤íÆñµ]„=Q}aw GMNœTÆŸ×sWñbi·Û¾xò@ô±üPuPI•éÁq÷0¶yv1$š=ŒåÊÃx7ÔGæñXz¤>‘Cˆ˜¢ù‹ùù#Ÿök{åüÂÛZ:œŒ6Õ;½˜ºá¼ÐžŠ)ž<P @U!™+ÎUûŸÔŽÇ"k):›í¥†ŸÊ^¾äýÚ|Hð³ëW€ÐÅtù¬c…êÆÂãض±›¼÷Ð_Œï'N.“sôµ¾\ŸI£õØVãA!uºËÜ;J./öm©¯êB×WÒ+¢Ö2¢3 c{þ製ÑgîæÙPÖYì›3RfŒ–“†ÙÛ˜§ùÂT©ìø 2Ë[Õ´#T/ø{ÃãÐ&Ñe579\ý&»äfMâÝ€³év=ºßèӕк‚ûÒa¿ð Ói¿p¹´rGB«†Ê÷/Hh;äªMkY84âUÍÓ ½V0`0*öG£Š¯¸šàÈš–¶ºÄú°ž ¿Lhï tU±S¾TáÖÛ}Ý¥Á]Ç *Ü4uúA#Z¾Äe¤c‘ ÆMÃ7 £§ý‘5þ Bk‰ùÑ·­ÑBL ±² ákÃÎìŽõ8æO½þ¨¯,®ÍUëÃOSÙF¿$ê  µ¥yÝe è?‰o<Õ$‚ÙL§Gú.·=Lž<"ŽIJ¢T®šq`S½óì -2YHu¶òYã*ªé†X;=~œm–F‰\uöi:åm.Kr§VÒ1K 3ùXOˆ[ÛiFëŸÛžO>.çú7g¦Z¾Æ‹ÅLÌÙ;<šL.Íô=haÞ˜îz:¶ÐDÜ6ïͨàC¶_Ëm£@â§çÉüÃÔf/ÙÜAvs=níS’ls‹;}:¼pêLÏU«;ÖäêÞ#$s=»PuîLæ"ã!z›i §“E=®-Ù“âŸy­ ÉíÓò)w1LÓEu*Fx -ØÞK"xOÜá~ ±Jó•û§Ödîêò„Î! ›ÚPWlnÏâÝž¿Cªó¶,Þ­ù; ¡;gŸvà R§ÚôÃd¾ZÓòë3S꼚·jáir9î ‰[2rŠ·_3ÍÉÛÏ;7íZžc<˜ ðvøó‰¬óu߸äwð$¿–œ¿È šxcÎhMílr¯Ü:U`c¦kå³D¡Vp'/$.#b–«'íý¶±\åüþ›'ùåäÄ“…GâÛƘ9øxoƒ+”5÷²qº®­,ŸV7º¾¯)íÑÔ p$ íÌO,òhìÄÖ*ñ¦×ô±šâK¢âlŸÅü©åqõAÝyषæÅQ]Z!ΰQÞv禖÷ï‹'pÑ'Ù(8‚I¹¬Å¶æsÏÓÓ©™ª1·ÓçÇ;ö`âpf¸aäã ÛƒgôAñ¯^1Z]@´‚n×J›ñ–¡ùy¶Žþª‡ÃÈ›éÄEGO£j7ýìèa:Ujœþ•tî¹Ù•¥øÆúܺ1²õ8t·vñâñ‡½ç¦âÖŒñÉrb1Y|"îÈÆxl;±³“ÊœœŽ¦vŸ,È0_Ÿ?˜8)§‡—ç púKÚRêE¦c°Z ΙƒøÂV‘yuÉ &O­üÝ´¶{ãÏžÍ5¿äpo7|ÆJ†ýº—¼0ž\ª><¹þ‡fÒÂâöŒ¯_Hi@¨ËùxÑ9? ^\ ¢›\2Ƈ[ú ?ãñÃMµ¥–€› ¶K>tÎœ5^9Ž?›Û}P¯ÓœYÞ~‘œH›$!U¶ÅÞD'š${«y?Û˜¸[…È?9qz¼M¤j§“cÎè¤îõ=Nì¯×Ã(l/7ÂZm/¶¹=ú4uâTêðÛó0eCð›XüsBჇC‹¡OΪa|ÎUGSÙ‘ÎeD£ÓIÍœÚL¦'cY¼è „Æ×—OséTrÄWun;¹TÛ›:[8=Ÿ›Ü›ØC™MòüaÌ=: 0„`œéá¹ê¸ßHqª¬ Æ~èa‡éOJeEôòtu+9¿?w–\^ÞÖãã“ù -’< - - y±=ø`+}Ü?øLœeÌnu©‘ŒnæÆç&?¿ á;8/ç~º”`±0—­Œ¿ØšJ‰ë¶rèdb¡ ô­<½®«ã^ P.ž¡8Ú‘óÄùùùi̬÷­‹Ýx¡}qáz–?]‚+л–=pÒ¡Š/NôM² ‚#„)¶Xpê~ܲ'_Èë›ö»Z‹ÑlÏtêtâ Òá‚2SÜßéQÍY­M¦–ç¦â•ÙÈ×"1627u´³NHz¼Ü~þ°¸-ëÏ榾éyÏÜV2¤WˆgR'ãçEt–£©g™­õØæYÇ‹øïžgW§öPaãçÖµ½ùØŪ•î¹<ìXÅ»˜z’Ðw®j£3KÙvè_ÆRÛ1×ß<Èiþyly/¾Ú>Œ¸2ý‡pú«ñ«µYûfkeú¯¹—Á–žfÛÓà›ôúä¥<­…ñ¹Ýå'NΟŠÛj^\5îcöÅ•xqç}s/eóM£5bÞiå<ôæàݺÕÕaO 3?zh†Ž`fÙÐ秹ªÅ£Úå±V<žÜš©NíOùOû+É女˅™§–ÑziŒáBlýpö)À´­Ævƒi8gCKe³³z¼øïUov58[~ †NG; }onº˜étíU•CÖ] »ýFÎ×áªùF¦7 Coj°QÉ#ߦ- –;$å@Ø~5ì•ãÅhªþ|}.¹˜Û¨'—†‡Óð´çv·3p^xÓ6 -¦…IߪTûsâ–XcââgӉ앆¸KzWˆ+†™Ìå²Û“Ÿ6Ò'ÏŒ+±ÉLuíb[§•3æ3ù6ð»°½™xœ¬ˆO-?H>M¦cƒKsÓ ‰hÓóõŸö Œ÷ OâÂC”“–€sg•Øfibpæir²ì)¡7¦w²2±¨wyÞÒ Áféé„3yº6óæku2^ØÜΔ¦ç‹%q^—¹\h æÃ᧱±ùDìùÎÈ:S1mvé*ti$ˆ­1˶>8*†™™¿ðÄXcóóÞöS3b{És{°+_¬= 8°$¬R0ŠF -ÑoââpúE:¶>«™\­5ÊÍbQÇy¡û›Él"s™|X˜ÈºÓf*Ÿ:8[L)! VÙ´ËV:=§Õ31oñ‚+€(!•mÜæ­-˜Û¾9¶4•>Ûl{A¹Àvª,€ãø~ËuS$Î/ÒCß•½N}ÄÖ*Î|¬ü¢6ÑH €2vN¼gíáäRfw5Ø‚&1ú† ¾WÓCóéAp&3‚Šó±½÷ š\í·ÃCëRÙÓ±ˆ»qÙÕ}PEÀé'Ï´ƒé&!Í‘;7õl¼üű@+¹A³Ç3±r,ŸÆ âì¨#s86ÜRÜ--nëÉ£ó#ƒHîêØzN<Ä´XsBJ¥çW*mS´oÐßuœ¥Â¹³=¾`¤úÆã¥\æ¾W“]€Dhq=Qè;J>̾HjÆK(zÃØ}‰‡º`J®׸¿s:ÂËÝü‡³÷”çd³}]3I}à#E†z8¥LõZÿÂ]4Evn÷( e8kIàƒ”ÙÔäGÈE)>„‹:›üÎÚÉK±ð“Y-7¸5‡Îú ž̸gzd]LŸ¤Ëhêj¶pœOT«³™Ò|q÷ùiüdu#+éGŽ9\N-6æáU-L¬¹‰ú䨰WÍ—®´…“õ„€÷uSløÈš5½1iºútBÓFx@EVgóOûbk϶wU`=§¯£+µjÕ¨eúÆ'†6¤ºLö äuЊöÇÌ•¾±Õ'+}£÷‡úFêñ‚61³?¢†Ù°jFmõ.‹ƒ=‡õM=Òw½d®‘J&žé‚f*ñæƒ 9ÕUÖ5e>ڮlj6 ÀŒx*û³ê«1:³é\ô U¶_ô]<_èÍF`5cǹþ1#½Õ7¼Pƒ?÷£æŠ/–­>›Ýë<êãøHÿN¥¸ÒiÔZÿ3'ÞmÔ…Ù ·´Kï¦Ãr­‘'£SÙµÕN£V'“æûN:ª¥µGÓ-£Êç)vúxSg~—Q÷ŸjéíøFǵÞOW&Ö -«›Gï/±Øe¹NÿÐÒŠµÚíhwªO³ÆŒ:Ò~®÷÷Ì»>$šYeì‹CG;ù`–G]j9ZkÛ/â¨âU¦šG=ªížnvuòà÷Nî|"84ê³ñíÇ]Gu'ζ†::Ý7R­MŽÖ‚QÉZZ ¼î>“׸mÔÚÐì¾ÞeTûbd(žŸï<ª5r„,ãÔUçåÞOgìþNcµÓ¨Zzy#ÞeT§ÀöìGÁ¨0LÓ…:ÖÒåííΣÎ?˜\É_ìtu~ÃÛí¶Ã@^ Ž÷E/hàÔÓËtÓ&ß© Íá&?luáøÊ~ñ°¢‰QÝJë¨+‹xÔýña8›æåºv4zÐyTë ®­\m¸G]¼ßðVö³^§Qجó ÁÀ-£.G_TƺŒz8ªm­¼htuÙ|¶’N?êÃQ‰ iZîöba±ë¨[«ÎöI·Q“Ú®öÌï4ª¦ve¼;wüpªã&ï>›©uuw8\é6ꪶ7þ(Ž£âMkYîJjtoΫ&:Žz0¶ý¬ë¨Ïïo¯Ä;*†?u´£ÌÉhçM~¼S¸œx<ÖqÔgÏžwµœ4|Ž£‚MQÛrŸ®j'©•dçQÓ;úý'õÅN£V«ÇûyÔSs$ 4¼ŸQÿaʤåfî×ç›!Ôdµa&4u¬mÔµ™áÏROæĨ3Õ–QG'Ëûc8*â›KÿaË«8;¼Oè݈ïë‹Í€bSK=>œ‡QÇÛ±ìãñ%sj]Œš¨£Â0¸É©Ôó(-÷Ñpj¬.åFB™&ËÍp1?:ã=>„Q'ÚGuîÏì/°/õµ,·Ïˆ¯]ð¨“Ñ–µ>/Ϥ.iÔG;++Í;,®Ôó‹2bY¦]›H£~ÕgL–N[*ȯÁ>3wUéüÕgÖÎwûZų9]-t©°¿®¥¦×Rôµ>8˜ÑVæL¿¶c™ƒGÚÊæ# ¿Â…n¯ÓVrËN·æ mµoÏëö5¥­e7[¾›fk[‰Ëz—æ‡cÚÖn_·¯Qm{nu¸ÛW†Ùé{í\aºO«6ú\þÚµ´Ý¾úÚúܬÃ%m÷|ü‘Ú´ö -+ÚÞ?Ö­ùcmÏI%º}]×úÝ£–¯¡M;|®=9xØ¥ùSW;z~6Öí«¯=Û™2»}ƒaŽc¿K…ãª}¸lwùšÖýcµË×Ó~=>ø,Ý}ÓN·ôåûK]šgËúãK£ÐåknDß¾<ØuÓìg¥í©éúAçæFm½ohdé1~5†f‡š¿Æú¢ s³ôµ -u@}ÓÖÒóP…ÄøÃÍ06œÛ—k gmxŠ‹Û—wâ½™}¤æytzû‘»Ÿè0€‚«^i7mæIÞÈ¡€•gÓŠíŸ(ÌœŽˆ·t?Uó6&×›Àoõ¾14³>Nhø ì j_Tn¢Óp`ÕÚÒ}ÔûéÜD×Q‘j•Ø(X¾‚Êtõ¤Ç¨óã~hÔÜà`0*òa:ÍlÙdà ¦ä¨óÅð¨Ó÷‡Ã£Z[‚Q˨G[Fûâ`“7è2ªÓ¼ÁÓΣZû‡]G;|e4ÓiÍËEÞ ë¨À亚oU ¾P7žt®; „Æq·Q7ˆÅm>ÚþÉ1^8þÆ×}ò†õ¦:Õc)GSUëéʺ´FÖ©Á cÅi!…^0^ètC°äC‡‰@žƒÄÁ¹¿ÁÛŸÓÇvô1õÏa˜§gÑX%üªNFK¼šM5 ÁÓ –a‚‰@XÉÀàH÷Âdy³ŒOL' ìaZÒÐ-ªY~g]ü98Àÿdž„¨é)ž¨|˜ÔSGµùЂC3žM¡ÁïnÚØj™6ˆ¨z œƒ5ˆ{˜hÚÃðîÇ'.òÉøG\ËGÚb§9I™ NKÕê2­±ÔýÃ[ªw â®7Zv=Ø´¦Çx…È~w\ázßõ+Ä6¥ «û1 -š^\3ûSÕ­,µÔݳ{æb!:TWWêúu}ŽÂ_sálþHc#SŸžÉªvÂ|&ê‹Ùe„£o¢‚HøˆH¡‹Úg wþ©R(Lš·p"m_¾SŸªLÞŒ'ßEí;4œèö$¢žüc“ÄZcÈ׺:-±„8s{R×&ÂnðLÚÚqru’ˆ•NnÌô¢Gq#Ylï¿%Ï møíoZboðr6ʔрƒ‚:C‰6í­©!XªfƒIÜžü´é²·Øû>iØìã24u_ ݾ ÙZt÷I$`qè #îä¯!7`p°ëoÚð 1›à‚v¦ÁÜ©¹ªÌàÛuùúgu+mIm[À>`GÙf‰Öj«e{LþUÙ¶ÀíºøgM¸dðíÞAœu–´,ê—'©‹‹Ãz1ûÉ’—W -Á¼Î!5åžßðY“Þ"·Ã"6¬¦+8)Œ.òC[º˜îŒlTÙ±ÎR½îÊ©Œ÷ЖWY›Lí鎈ÇÖ{±Æ™cò–/´†Ä“Ž]Æ—‰Dkcœ{ ÑÐsô Ç2&ÓKìÝvO˜MÑ3é,­=÷N³ÌÑÖ‚ -f”iþ™þ:Ïh‰Ö^f¢ý™-ÿÊh!é–mšv̉Ù|/~EðnåÕó›°HÊr~ìxšß•ilO#^gwð„¦Ãiz²¶çêùËX.Û³ƒ'([Éœq§c“b”‰¹­m¦ˆõ<‚Deð cÍ+ t­žwn_‚5›dñ@öMê`p$ü^MÌH : £G"3G°:SÈ’"ÂÎãì—§°Bæà÷
ãGr¼Ì_r~Q'c"qpŸõ¼òà¶Åß#ü!_ÞÃá¿e'IXåy#Í Œ‰F9˜ÃúÏElµi‡(xÞ`Šf\€9Ãïêtù]aë`†D"ʼ 3©Üü–fVŸ×m«sTÖúËÞ™dG:ÛÓç1\wpŠÚW_ÙéE¦8X¡ôʸÙèåítí¥Wp³ Þfw†ó¶ÜéJHØdˆE)³ccéÁ”)7˜¿ Þ6\Á,Ü%ikŠ3˜’È…ÉIÓÌÉÙÁ”ôˆÊÛ¦²tz¼3d Ä ©*Ö—8jhº9ýˆ›-fɘS -kYÎ QÓ–¤ÍŸ €"H„„ÑR£ƒa¡ðüƒbÇvÂBÁ–i¨DÐÒ^šÝÿ™ÙÊÒÉ$GüÑgf³÷ÍçÖÈ16Ž4éjOƈxUãVX/Æ°…g¦¨ÆÏ­ jrß,,Tx%s$amè?&âŽô‚½^"º0û” ¤Ž* -¶"êϯo2Ñ&¤ùbEAÀÌõLŽ(‚f.ƒ@\fî4å´ñi_f|Zƒgå”@9ŸŸ{~DânA§pˆ€öþ‡ús])á-l3Jg‹„lhm”]H96Ä'¡YW®RÎÄø~ÑjhfÔDZ¡Ç ¾¨ú° Õ8†ƒÝ¤6TÏvn£m[€´&ŒÐZ0 ^©„,Q*:ÏC'ÃO@S1êÇçâfòÌp` §FÌ“B†e4”Ù‡Yñ†iTºù·ç4¸6Z%$ÝàÙl¬…—IºÙks’ÃÙ-œLéæ tqï±µÌÒ¥o°µ¤ÛàEÉC -à¹>PJ•Ñ„Ša†C•çxÄIúpØb„ÿ—4Ô`ºÿ¿Õ‡‘"öAa¯[5!¨æ?lx¶‹‘ì<2{Ë G4ªãcžÅH?Ê]ƒ/6úi¦zºÅv~Ê+qI&dšÐ=å°ù“%®OBck#'T´/>ãj â±kÓ‡“GrihØÈžßa' ICêǘE«'Ç¡³ëÇÙr-¢g˾•¯fÕ0’ËoŽ¼,’ïew0I0[{­ jz;3á|‰œ‚ܤ)w“'+ž}ÞísÁ¡ìî¢é£8 ††=åwgbú<.æHµJÏØ 2Ù)'[ì ãÁ¡©äÕó‹zHSE’18âÐLMu‘äÆñ¤Æã0¶¿Ìv€š›lMPrKíÅÖxT£o’°µ‘x9D´‹±©,vG8×Ñ¿šÑLߤvƶ¿$eúúÙÂû(‚ +PΞÛ‰õn,WÛë@ïŽÙûÛ~=½í’›bÖ­‰å›õãÅýó%cù¨¾ÉΗŒå£žtp¾d,Ÿ_ߌç«&bù -.tqD8ŸÛk,–ÏwÂ>œ/ËWðCGó1{%X¾º˜ΗŒå+ø¡‹£Àù’u ŒçKÆòÙûèp¾d,_|0e8_2–ωr$&@'ðñ†g̼gƒ‘¾˜^‹ ÃJËßùàÂ*RnòŒçIsŸ\6ƒ0›TâýéLùëìå#©ä(^R…”4JÏ)K¥q¥üùHåo*äß@ki<Ê=C?‚Ï–áIòΗAÝó›„au“«$lfR¹|~ˆ²tbL'Äl2E€¶x³t‰©ž€‡«äcÛ é›!!~©×ž‘Ù¤CüF…dB7ñãÊdI£M€¥à0§§ Î9MØÆ®ÕJ9>“…g)ÁÔ|aÿÆçP"óâθÓöø‘y¾ð3m/dɹ‚ó²'Ã&#ó2$ÃŽ‚Ì äz༼‘yQ‡³¡lȼ‚{}{|k9!ól™çåÌ‹‰Ümú% ó -ák üÊ,?d±ÁC!óÂÈÌ´„öéÇÈZõ]#·Æz ­¥ˆ‘€HI½„ÖØGBYRâgVŽ¸ï'a±Û ÂezCñ×od;,& o9v^¶…Ÿ•¥!®ûU ÿpÜÁ±–|Á1ŽÁ;“v÷cëjq&¼[WkÉ4LIèðXŒÑ÷ãŸéø ^ -þKµùS¡§¿¸vPP¦1S¡§Ó|J  ¦JŒnª#~1—«ŽIC÷c¬‹K}?ž2=îˆZKoˆ¹¶úã…ÍiäNœ´‹²’ò%`†…˜²ð˜éygq»u8ÈA¦å -’=Ë${–Höê+¬4VÏ$ å’ÅVrÉbC¹€dIÇwÑu<Œ.Â’plz6Tx?vû¡ÍH»éöóÙLPž-Ӳⅲ‚ò¨qË)æÊsˆ–ø6”—!Ö$Z6 S’ï™#(/ÁÈ”GlT£qdPžmrðe&ƒFM°“n¿WÒᜋá ~Î4_ÆÒì4Þ<2lí‹}~äBrž±µo’ϲ¹_¡<äÉÅÒÝvOØYª\7£`o$è@‡-Âé£Ià -]iž%s–„Tmuáô«ä’˜ý•ÖˇVZ?ÂâñÛ¥ºYï–f¶æ¤R­yxVªÞa­õãÒÌñŠ^ uØ÷ñÕµR}««‰óÃÖO /þA;ñ© 쮜PBo¿!†’a¸Áôć¿LlvW¾›8|aÀî*W‰`¿±õ›`ÁÖ ìnUßcôª°Ya°ßM2د]Òؽ¶Ûý ·×0",ýVð!½® hˇ¾^C°»¹×“]F¯Úߙ峙Ï ì§^\$ÁîEf¯âúu'ì7ùÒ8½cõz›Ðk[œeöÚ9¸ÀŸ‡Ð«ñïí÷8Þ+`Ùê½…Ç«ýŸîˤO™â¬#&ª³ƒá·µ²§`msp-ÉíJÏï ·ûSo¡#&º=gÃik™â>.¸è“¤ -žxøžìš^ËÉwQÇŽ).Eq*µD dÍ3ŒÙ]C—׋³¢%džÓËëq‡íö§Çò!UÜeéɹƒY+ë%‡í†¯¬Ç;ý )©°ÿ Ù'¼|hN§ÖX‰S4üÀQTLÛêUè¤+µvت|¡qÀ>¾˜ÍÈÀ>÷eªÏ%Z~À¾¸ÉQ‡=W`_ÜHìö<}qSò’“rö%$øç ì‹# ªç -ìã¸Ì$`¯’Ø“êK wì‹ Éþ‰ŽmD`_ª‘54 -°/Îb g åì‹Cõ9¶À‹ì‹“³¶G'°/nLŽ¾É؇êóPyûâÌV ÎØÇHµÊØ×ÔP‡ÅÉÀ¾¸¦ -ÉxÏa€} DËØ—+ÑØÀ>>¢ ì‹;…‰Ï¼ ؇꣉c¹ûâP}!%°/ÕçK¸Ì Ø×€sXÌhc`_ª/‡ÎØgè${ ì ‘ƒœÀsÕ³S„ÓG,Ä_ÖœR6`;e‡å¸‰Ãûˆ³ƒ°ˆè¤pRß𘾀Kú`F}Å fD~\“#¿*~)&G^UüâÄ4 B2H•RÕ3•Tþ62È´äÉ%ì-ü3™eX)ü˜c -›êXr/©\o–1©¦:'©RËô†…M°ô!ägÐ_B(É„õÒºL›a—)šÛÄÊóŠÿ”jÅ_üÏÇÐ õÿ2e=& ›äú¼“cÿób6\˜¾<®g×ÿË4¥¸â±¢3 ø_4Wÿ/9»…£ø_Cså:¦ÿ+Ģ𸎟@MŒórD}G×VnO¬ŽSúL.4ÑW~ƒKÝc"ÄôeÏp s),|luÀ÷äÃô “iÖžçcg†ð×3ä€Çñ%©! Þmìø7‰õÆÊQwA4_ÒÙFõsÁ—©_¹¥Z ·T+r=Áèœ4az`ÇÐ1JÀ¿ÉØP*Ð×k¥À„`ACÃÕÀ´û#qŒ£¡T˜½kª§%ŽakC¡}]%Fû>÷Ê´ïs/å4*9W1¡5.‰}öÜ›‰d?¤+3&5Þ9¨Y×ÅMÌÚ>žã³ô”í ÃÎDQ„óQ†Æœä!=ɵ¸ãI&[ -œ~ŒRÜÛ;VnFnˆB‘zôMÊáÚШ¾i¥>V12› ( -ºQ2C(’‹Á&‹îGx–B¼÷•þ _ælFf’ÿ~ä©û‘iÌý8RÝ?/£‹Qú/33¶î_ø"½Ð^fHSÔÅ •þe^‘kÚ†mˆ·î_jT=Ÿº~Ç#¶ôßÉ V‹!%"V2¢}¥1.|nÐø)ÄߥŠ­\_ ޛȈ™Šöå¹£‹44rðëœúž9 }Ï’“¨üÞZzCì»íR€Tþ\uwÝvØ1ú!€T˜²c'Žù±TÓ 'ÉHÕí'ã=“°TñÈ´T UÁwK|–jzáŽY+-Å»® ´ö—#'‘ H5½ð·=9J’s¸øܾg·Ï•1ÉR¹ñ4,-É¥â³aLÁpY8üw{9»%Ï‚c\<w»zþðÃb•0è–CI¯ æòÅÚiwƒÜŠaBSÁ¨33Ƀ»½pݪÅgÙ¬ Ü!M¦q€1˜}Àçc£^0u`!ŽŽ»…1q²…?¤£.¼¼¨í¼Çvh¯Ãö ß—¿'l´à¦u8Ãcüg¹T½6bˆÙj((ÛÖ„»‚S¡ÚŸ¹þ@šìû7j°4ݘè&¡ê zñ+¡ ßú³ÄìU\ÿ³{ä´Pi:i³{Ïêõ!©4Ýê‘¯× FºŒÿí…Áy‘¿&Þܹ†y6(¼ Ah‰, ¢>>qø&ß°ð€lì#Îfl} 2§+¶k¿O™½N÷ÊÆ_PÕ C·§™½ö'‹%f¯¥åëúq`]{–pþ°£²öëá-îÕð{7?oï©ïéã_7­ó½ÀãUí¯Í}¶âDˆÎÕJÈu¢7å·ˆ2]ÿé‡`ÂÉU~Lÿ*hÈÆ']6‰ºæÌOKR×MôÇÖ)V0%¡X`zâsLþ|fÆÄ-6æk=|P!R(€ó”«™T&¶×†wºlfJÜb.192%n%Àãf˜Þ—àÅ%&—xˆÄËgüŽG´µ¤4°,3¬gLQLۥ怂•Ë†•šŸ4&ßQ‹/ ,}LáÚÀ¡—=¢h èŠ¹Ü󦕛vˆ–Îû­QîÙõ<‚‹Úw²qˈj]†=áu“[ù]Ô¹su’ŠéÙa°‘âiXhïü»tw7$ŽE`E`€^qwÿóÇøÀŠ ÆÓ_ÌÏp]pLr¨ìrÛ“n'™tmqö\è4Š—˜rC6¤×]–«Ø »±¤\uS=0¦¿L„À²?rˇK ŠNli¬õÐŽ+ü3Üö#ù£µÆQ=Ž¿µÔBBñMbpÒØZš/“a`h"þÖ’O@³-µ¤P&¢% ã"(f¦ÙèÃ#úôÍ0Ę­‹G ¥ód…$ò"ÝüæàD†˜ŽàG‰Cg(4È´:ù ‰¼xÄó .H"ï*Å'ÀpCyñˆ§e§H¦Bƒ±Š€’È‹Gä÷¤YGxÉxĽ“`î òG±BCç\¬0KØn„b…zYcº™7Z±Â °ù׊¦HæR¬2tRaÀ\ŠÆårü Å - ŒÒa9+Œ±F,VSï;~˜ÖtDiˆeÁC–Ó­Vñ³ʆ*xC´Í› -2Ĉ]í°0:<.eÖN2,䢗Zð0ù¬,¤†/x x¤ÚaüÑ÷“[‰ t SðÑŠí£%9áµðÓ $Ñ‚‡ ÑÔÞ‘ &W;t»µà¡²‹3ù -CÀãRÛq¶~ZÊZð0¹Úa¦úÇÒ<¦:WÁC.8öèVâñO…ìu -‡ñ¸Ã¦zLÁÃL% -Õã]C<Œ=üÕ , fÖ‚‡£É4ÉÆÍi£<ô ,Æ÷_ð0;w¨‚‡q­xÁ/& p6Äé€ÒêŽÕÇV -¾Š˜1çÏ™€W Õ œ·Ä§<¬&V;dï3<Œ^1Âv~‚f-x˜ c‹¬ÍÀ«„j‡ѸWñ3Ä:ƒDËVð0¹Úaß“!ÄÎ5oÖÅ”‚‡É£#ÓF.x˜l1†N -‡/xCM_µÃ؃•a -&O³ü²}R -&gG¢êÃ<Œ%š‹PH>ÊPð0YÁþaãt]„$OÁÃd]QðÃJG)xÕ=ßq¥¯›Þw©‰­&RnfÿœÌ6Â7bÁ3)Iؤäû‡@”³ŒÏPÈ‹F ö×<‘Ußýt ø‡u;ö¾f“ÔiÍþY··Öï/>-7¾ç7W$óìˆè›Å±&y Q]êñþm¿4yU*MÃKÓ7¿%aáy¥:·øeUçç/ªÇO/b«õÜ[ÏõYq}ë )®oÎÏ8¸ÄÒOíSÝýM–…ðVÖ'ʼnÞ<ÛÿÉ’pª¼ˆqÝ.ÕW/T_L»Ââì*ƒ^³*ãçKü=Sé÷wëUo®ÐMdºjå¼:¯L/‹ë«[«âúŸûM±½·û6¿ÑïL[²;\üjUÌÝK±±Þ-!Bò@l]RÿPlìõj!o ˜'huªþ.¿yQZßä.§_Äý/cù¹2a½}‹bYh?QB–íOϽøE§B šþ™þªâŸUûÏÙrÿ¬Ûn« Û[›@‘ðݺù²Ä†¶!®¼}lV¶ÎήA|[öPŠ÷…‹ Uß·k ÎkuòtC¾“W,9ßm4¼Mö¸â|±'¹_ÜÀ¢M¾ŠöÂŒ÷Ìßu{­æ}DóõÞÞ€æµÐmWUhh¼"_žà‹C‰ü©,”àÏýe¯ñ.±áÙz _™û»·J¤ - -Eë¶IºÛƒõÝßk`DºFt1üyBÚ¡ ÔØ¿T;G/ -üü–`|~¿­B›ظخ»½þvºù «¯ÿª7·óèFÍ>¾OŸ¬Ï·Ôg—¡|hûüÀïÝÆy¦ò¶åQ»¡Fm}“­]GØ’v+›æe¶×—§{ÇÍ»†'Ìð\rú˜ÄlšµÉŸõrgcC®¼vÇmv»¸U]:ÜúÙín¯Žôª…wøó¤asQºÛÞ¨À§K‰Æ»yÑÚ?ÈlînòGP+®ùÕ p•_¸•S €?lâ?KTÔ¾>÷âEA¸Ôpc -'W¶Ý ØöDöz3dG‚ú=š¡Ús¼†0ãW¼ª  j"iCY:kÝ®w+—[(ÜØe*gzƒÌ©îÌØû\kÈÍúe¶öBÍY”`BÀ³5ÁvqÏ©Ó ÿTlZ[oÄÇQ@F8¬‚¼á0l^µŒ>l¼ryÖÙг3d®¸oZ7³óÎãe²ÅÐÐ8ü‚?×OÀ\ï^V_ÇÞ×¥ÚçšØÜœÿ£’½ºÓ˜°´ÐŽ³68øæ›oк¸àNm7)Ñ–äŠD^•Ú'¢2¥t6O5cNªOltãLåäÆ¡å h¹öË°=]ìÝ­ÏJ÷ÆDöô&7—nåߥúz|n=!K$.";†VíÝ¿ÀžB%Ý_h<)@ (±7¦5¼ñ’g“ênó@|˜|oÂËýª_·›l~éÈ×ÀÆUM6€—2,žtgZŽÕ38 Ü)A-qxfþÐ -ßS¿äMŸ‰Hn:hÍïy DøA7ÊßFgªãßìê½£€è ò®Œ'¸:Uü$¸Ïî3Øsµ#àÒïrŸÊ-P¿¿ü¾ç”;ñ¿3“ó¥ß¾»"lsŒ–ù¾‚åSÛð…$„L×4ºñY@óÍÁ‘iÔþ!÷RXã1¯Öf0¶þШÆß8Ñ|¡§6nup÷î‰KJ4ß3¾)]ö•;gJ³«>~«_ñ#]5ò½øEFGÌÁßËJÕ«Í ôúð߃½/xm¸WràåÖ˜=õû½”•c‘»:ª;‚ã{FGNzµ£R^º¼f,Æòs1B+,»ôê\ÚÆ•¿¹·C·ó„Õ¤w}Úƒ k“0FW_™³‰´Ñí8r•Ÿš.Ñø'ò—±"0ˆÀ¸b-Äû]߆›ì¹Ã'7àØï÷3¿t£÷?JÌ&ùv0H~§¯7__‹û`ÌfñâÊ寋+ÿ°ìzôŸ¶Að½TE‹McX6ƒOt÷®©ÿ ïY[[Kr=‚Æ]}d›2 Ô-‰³R&†±cít¿Ñ#pTù•mskj…äw[h‰a°1jÓŽñ´Jº?N¬üǼ٪ã‡hÏ£ç¸X»0„‹†$ˆkEƒ¶^høT(~ë…DB‡žÒ”®§›|VŒçñÅóšSO—Mâ%T[§çbæÍjýSIðê¨/·+¦¤Ž¾MoNÒfë´VRVæ ¬j¯W—*“?r÷~&2€ïÝÚ¤G ;’¡¬Ì/íÒLÈW`ÞÚÚªÜÉTªÌ¬ÖJÕŸY¼íý±;p-òþã¹ü¦•êGK$z£ ßÞ×ì_¶¿¶¨Wß? ʹH‡ž'bUm>e÷ø”¥ÓÏUÛ7Ò¤2…3+  Ñ4c†˜mòõÏüq×Ã%q¥Úv#@[‚O‚´·ÇâÚŒw~Ù÷e?ÀNFUÃç+GõÙ…«Õ FÃüagîÿ*++­Õ-òB)`ËìÓ/Ø7ŸråçA%Î.¾/ØÎîɘ@~NN -½ØŽjñ‡pbb6ñ=}1'f±r°vÙÜÚ(¬Xèôû‹ wÍ¥êÑqs­suíÉ{7ïp-x°ÂÈOüë¨DŸJÎ`Ú«@¾D¹˜*Ëoçú!ä"FP.rEè&].V”ɇRSj¯ÝˆD’Á6¾i)SOO‹4k Åy‚µ…%“u¤×LãIÛî(SÝÁ=UkÉr±1ãrŸÐÒa}žê**¿ŽÕ9©ýø¶l|gÂÞXX…d2&è† 7Å9Òf«šƒ¦ªŒ}ËÝ×mëÙêâ6…RËþj‚§#˶“aßüTÆ”©Ó·9¢ê¥ÎÒ¡…·@Ð_à+`=T*hÜÊÍŸË9`™M•JÞ©þŒµá¡ ·Ÿ|!9+þ9yX}ÿØ„y]%ŠàϘ…ûWôh#j§ dÌx=pÈÙ‚SÓ˵8ï’<º3Ûge*Ý<Áâ õìõÞíhßùK]îvj¸uèÂnº"›ÝŽ;¹ÛLDò'ìåe´gI\wÚ6¾´å:ýózÐ#±¥ieb~þ7 ’ý¹Y~„nKpË?ÔšøþÛýÂo^ÕÖ&ïÜ/jþ/N¤÷ ¿8­=.üñw#ú¾«Olüu-Q£Çå»uŸUýrùF¸w¿¨û¿øœñYÃ39´]‘ìQb%âŸTéHw7“nãUúÊݧ„:à îJí yz±ŒÇÜ}å^_ÃVD´FÑyßÙ#Oìvï]Jv0öb½ê¹©Í-WôY—6Ç‚_ļM¶jVåfyN<ðÒT¦Ùƒ!#Yî‘ãqƒ·É¸ö\¢šý2¥1>˜¯žÌõõÅuwŸ~(‡d:ÌúRö‚÷“¡êz!S§2íÌÇ2r³³€¡‰3Êäró׆D7@ó~O³?½žÈö§ŸË²ÓäVå¶ëên!OË…’$8[  è+°ãàÏ‹>¬œZÆP–@\17"\4N;k¿_VPøl­ölYf‡ÐäŒI—EjŸ”ÑÐyܳ]›•ÿ·XøÇ0M­hj¦Qlþ¼öú{ý§Ç§÷b­ðÏ\áŸÆʆ$¼?|¬÷{½ãÞÿ}7?îÞzïßÅÙbcåhmcÃÔš½û‡^±ædFÒÑg¢jõ_úÛ¯ùúïõãL¢'á·ïí×Óç»Õß;++µwéznI:5›ã?¨ôˆ)C(“d!{ŽbóÕ~éŒ.Ü6ÿˆ‹akzúóø c´¢'Ñy¼,Õäõ£R¹3¨‘SÑîà DÐÐz0"|Èt§I¼xQŸ\ûiþZï“‘¯]·Ïõݵ‡1rÌ¿Ü<Ì¡±h¿ì·Î–•›¹_Ûïࣜž_­tôÒßa'g†êQ™XǸ7ny´óîÙ‰®šü œþ*Ø'-v£½QPÄ9ÅÞFš0í|’Êh„–m¶ÝJ•åH°^èVA“š„3œŸ­7Èž³w•_CÔ¦ÿºÇÁ[ÿÖ·+É·üjLzWMlùÕ„ö Ýl5üß}®=º?’üºeõk††I|ÏNÊ®ÜõëÀö£êÊù]‚œ¢‘Š‰e‘î N}õ®DµXLJ8~q÷XEâÔlÅ gH÷õ _i8Á é~iÖÝîýÁ iWñ±vº}z²-Wê*Š½ãºÿøÑ!9\}Á/¾ÿ³M<ÀAd}Y†¿—ä Ê¡³>ŸÜd\{…h±D_“Û Ñ8Žù¸rô3ñÔúõ°fÀ±ä±1à›e[ª]Ü(îá«<|m..ËœÕmmt°†Gg []jgÐøÝ5"ØÎ$G“œŸï?)ôS0§ÉUáÁì ŽxSÌ^ï}”[g«;›«•×þ>ˆoTYm‰ÂqT¸"ÆÓvºÅŠ9möЉìØ[ñü…fd D‹{ÛŸ"^%ÎF, '-B ¹‹Ñ`¥m‰:'/Ðw¿8ÅUê$ÿïH<Í;„ïw0ƒ›±’Áa”)ŸŸIlWÔÔa³•l†ÅJŸH‚-B¦jÃ9YÝ]M’:ÕþØéx…Úÿ¾Õw'vwÌN=Þ0ô(²3v}Jg¢u£Åõy¡yP÷õÝ›[¡ãÂRé»>aVv«çÅÀ¹œÄ}ºCnÝŒy訑$#ûŽ¢ì£Æ«0§íÔ«£ï’ iNÉù{âá-óu1üw ^*„Óh³’¯å³™[§ ¡ÎnœŽAPaÃjC«Ž6ˆÙrÍw”<\kB—šÎQr¤ ’ZÓ âÓ·Àv‹'ZÉYÕÚd•«É©ÎsÖÉ3¡ö܃q?©ø£’ÝW»³êõ…¤úò½º¢âŒéY¢,`¿Šy#¿íìL0šåÕ iƒ|;²½^pn"úwíu_”úß´×ý£Ñ^§kãž,þ[ö:é†Ä“þU{Æãíëíõˆ©þïØëtmŽÕÏ^G}£yI Ò³ç"hqÞléˆÙsicÆtÄ칈DBgMG å"b ã*ê¶Þüa"x< Žzß?Ÿä­»Ú{|zß¾ý_6­T¤ÿáRQ+ÊšV4,ò±¨áÓí»Â?eòvQ¯·ß¡‘nc¥ÿÝ|ºÿ~úx¿íÿ¯8KžïlŸl4‹³EúvÞž+–aLb^‡¯*$BÕÅ‘v ÿˆÅüçü¿…¶Wí‘Á@ÉoëõÔ¡JÎPáÿÑ‘Ê™F*sTÂ’óñïÁ?‚h™EQPuÙ€ÿ˜¦®ÀDI3Š/øŠ(ètØÐÈÿðÁ&|z†)ü·¨wŠ—×bñ¡ß³«é†`hК¢Y‚hJRø]ÓDAÓ­¨ˆ†`Jªó5ËÐõ¢lh‚©«JQ5dAW £(›Ð‚¤XÅûÂ?ªb²­Á?Ђ®UY4“´/ -üUTK0L >ˆ²  É5]°LQ+ªš"À¤Tò{~oj‚,™fQSTÁìX>ÀÏ4CdU“Šª. š4^Óx"‰‚¢ŠðÃÈ á‡XkU®ÃÏdE—`Gßý§÷Çbyuuå¸ûðãû_f®–h,‚$K©ê0ÝL¨T– U‘E˜¼¦% PRòI‚dhfQUA4,xˆ%ãrÃà ÖÚ**Bµô¢DWð ¸hh*@E‘¬Ši Šl‹DVVeKb!uuA7৒ÍÃÛ*,¯fÓH²€ô¬“® -ªeÀ€ð-ÐV QÖ‹ÑyåL[Á°€eàg¢f‡éúJ0)]ÃI 誨SŠª‚ãŠj‚¡:¡(ü\j'‹@?IÔÅR‘·M ±jŠj°—$©)h*J'\«Â¼ÊE†Ün!Óš@(2O 6€%ª„e _!Y-ZTMX!UE²Âî´è -£ÔMJVI0ey˜×Bá‹lˆ"4.õEØÌÑÙåγŸv•%Yd Š ó54BLXvòÈRmã#xKÔðLÞ4¦lä-MÞ!$HºCÞÐ `‰5ü!.ƒ›W}ŠÂ‹´¤Ô€(*nmSþÇ×LY!2´¦E  ¿ªÊt!‚°(dG«ªœMG!Ê•„~H)EÁŒšÆŸÁ—:n^7u öK¼ ‚hÐ ž¨òšAž5ÁÑqtœ6JÃ>ÁуDÔAHÂC$ ‹-"ÓÈ´}Øܸ{%ØA -²ˆ Ã0l ·6¾Ê„ªØ·|­Jd>þUU™0È5©&áK¦ Â› ‘a†( %Ø"04­³È&p-Ø8Øø7(̺÷‘a‚ -PÖ@Nâ*ƒ¬Æ©¢0׈L‡MNæ lŽ`‰$Üð ³€;áVSa…,d‘eIdµe ‘aßb§ ålG†ÙÉØ°Èox(K(óa—À’ƒB¹æµ¦‹÷oªE‹÷oŸ?ïÅÁßÛÏ^ñíã¡døORuŽ"DÑ 9[QÓM‹r½‚Ÿa¦ÀlðA×@„ˆÈmJQQ€Ëtø ÉH T@]à ‹,+0*¼ZÆ.«„ø@:eŽ¢Áv/Z ³EÜ-À!Àzˆ&£à†y›™°$Š(ÄaûàÈt €D(¥Â—–¿C½ ª&Ê#àx²€QQ VÅßcS°ÖTyÀVTD¶“Ueý Í ä[$¢êG1a)Éšâ¾q2°ìÀ»i-B®í™$£}"ñʤªq$ ÄÊaÄoTwZšÜœ.éȃ"nrˆ$Qès2e¢%E&›AÂ"êðµ¥*tö Pt -¬ªŽ“À¹’·`z2LC´È"„tÚ(J"Ž.96¢N·@K+&J)0i$4CL\= %h•0EÕaÉaKI’FŠ kDÌ*<µ_pƒ€bÒ |ìYSQ/ — ÅAãý |òøÅ€!jT´Fh–ï²ÀÞÔ è\Ñ,Ð;. ÐÀU‰ð­® 1À0U ˆ5ja -2,¾!ZtA@„Ihé¤Ãhq  nEÒ:hnSA‘$U‰êЇj‚(Ð5Bx0>Èj t׈ìCíh‘Å€ÒL« -Ý› UePD§‚qdu”OD‚‚‘ d!`M,Ý€^Q˜oM ¶¯‰ªCDQ¢ö LŽn5Í„\Gu[ÕÒ‰T)ßU«ôð¢Š6H"ª@÷Ê ÛTXÀRÐ~Ôp -ºn ð‚q‰hWÃàU4Ÿ×¨8Q-ÚȆLåˆqªz%dph$½FÕ ÌK+Z¨šaÑPI`ÃІ4´ú€*FªºÐÀ‚ET/ò¸#F—@ÅÝBlMX"D¦ý3[÷Àâ*Œ¤.Z¸:¤uØû¢J¶.ƒ˜TUÔ\m,L­|ã¨U,WŠçgÁÏ’í=ƒ„ô?Ж¨XÔÔ Hב¡u4ˉˆÃñË&>'|>:û-Ô:Ùu¨XˆM#Zô¼º;œ3«ØŽl¼Û­frfUng–ú®žúHI^ª »,LXddJ $Í@fG»ÉyøŠtrÉh}‚ÜQãCF*nýàCÁhb*Àpà-Éä!¨ -·Kàa¸óWÂMh#) -ð\E³«h¢„öÿ¶ŽhˆÁ‡Š„%$ÈNö+}ÞžhšÁ7ASYj¨M¢LT÷NçøPCm­Ó‡DßãC’‚Fˆ(Ô|äH[ P NéC7 î$42,adì&Ú1É`s‘÷Pè‹j ë(1(‘€ñÁäGþGç þ«VDo”5î2%›KÊЈ§èê¢6qb¯:êª ƒ¬àÌÂbñu ¢Uü¾~‰B6Hv ‹àSÁew†¨Gt©4tÜ'÷Ø'È$ bø^ÃŽT•0išY)E£Üíˆ Ž~ *,Ó%"iAa9| -sƒÅEÅh`½, ¸‚vÆÔÐeÒ‰¨$+šLÉÂ_â[ - ù–Œ˜•(A)L4jì÷”ˆºt_‚ŽMM¥ÓVP8bDF&P¾š¦ôw°-€Ç[d…t^¢ÿ‘•ÅHøBTá*&Y9hºW#n pb$Š#ãÄ2!°ZA€ ú µVBŒ2\¦>ÚÜhð:O0F¤bÜ xÀ{M6© ‚ˆÁ!p=È,©LgÔäšiX„P2ŠeÔjÄNAêh¸7UÜù@Uï‰ÎQÛx¯¡‹…Ì«!™2¡†;0¤•$“]‚±M³ôÀ3à<4Õ"T²ÁÄèC0Í‘ÄÉ$-ŠÔýÀ‡À¡}ÓfÖUbL@‧b†$ŽÿÐ^HÀ—Ú²$$µ‚.eopI â…ëŠjzOèêÀÚø^B™&:°Ž -"@|KÄhHK¥Î6ð=ð'HXCG]Y߇åÑ´‚‡%{Oð‡Èžšæ Ü}â,©`ÌÈXèr« -:`ɤáäÓ@Ó@&¶˜NÚ7èr+Ôäû_ ßRA¥¡£hj@š«–a¡> -Ƽ€~YXüòzà - -n ÆAvO먋%x훎iÍ.;j=6L­dÒì -·f'I£x -€-gŽ¹£˜CŠï“?oßzï½ÿÚYýÿ¹ ½,Æyç¡ð´»2AdŒ!Ôrü -Lîß>öŽû·O¯HÿÇÁízÅÛ÷w´{ŸðUñ±ß@ë½âàïÇñ þÈýÁädkL¼ÿÚ+X -endstream endobj 221 0 obj<> endobj 224 0 obj<> endobj 225 0 obj<> endobj 226 0 obj<>stream -H‰¬—Oo]Ç Å÷÷SÜåÓ£™!çß6n piÐEª ÆB­Q ʧïïðJÏŠ ]†%ͼyxxÈwýîæéîq¿þîmÞ¿úÓÛ}ûú;~\_v˱ûó–÷±êÞKÝßèÇ»í¯û¿Ù=þý‹¿î¹÷ç»7ï?ݽýéÃO÷wïo÷Çûíú›¿äýÇ_¶²,åÛKö”ÇÚ-×T»í·Û()6Š%k{©ZŠǽïÃR¾{^œœ+™ÍÝ[O³û^êJ¥•ÝgO}Ô½tLrÐGKm.”ÕRåïž|OSnX(=lû—îßnÿÜr9YîüÌ5Ð(<Ýnœº—ˆÓSÏ…8[}FœV;qŽ4e:÷d«ç$î¦8[Â✩ñζIØ°±8FêÀä¯xt»­š:놇ĢXWoÄ -Z¬=§¹Fõ±–4ë ÖœêšÄê‰U "ù2€ˆô’ìZj*g'Îà,áXì,O“›Ð-Y;ć¥Í¤:ÐHJ!qEK#áO dÇJ"I2@h —Ìa†ÒÅ~»-%¾t<œ÷€È‚-´×x0Ë  9¥µ4ÍX7 ©ºÀ'Ò8'g× !Þ¦¹á+Òªµ .„Ý É!ÛL|̤¡qBÁÖE•% ‹et.JëÊ› -S´'ÇTLzŠ´”lCkèA¶½*_¶Ë#Òà€@÷Æ®)Kð3‹$Nzê$M4ü°N/”SÇå0 M:KÌzÕ ÑÌÁ‘½ò ~+(¤5p³.‹Â¤Îê.,•… dL…¹Šà¨µÆ[žõx%ŒÊ3p"€VêFEMÚR°/yó™UEEc-•I0— :¬2ýÅ „‰» ÕÖ(#µ°½ÔzDKÔ)…lMâ@f­*CÄd”—5Ø×+«™:2A(U%…W³ ’Ì;.Î -‹S?ÊŸ¬â!G®üdHe*[0XKâu@‚³-+¥…x\¨à ‰†V”z - *dEXtÈ@¢`ã=¸H‹J)Qÿc†„`q5í€JW†rÛŠ’LI¡k.2 ŒÅ,_ °IùºÊ Ù犷3ÈØWóð-¯ˆZ‹ªB=»N $”n×™© -T%R± ©xŠ´²™SÛ0«aRAg‚ž¡ZÕEûŠÜ5oÈm°.+#"2¥UX’Ø*¡áÎ ,Š;i. ²¬vh1Pk½"­ƒ-˜nÁv‘OpPL­(–nŠ„úÎá¢%mD äaP!>áh¸sS;‘~H -ÐEébª”-HH%W‰ -jê”ð¥F¥ö¨À¸£è:Ù ©Èª3Û!G.ÄjJ:уvå?}QÙð5P ª” bÀ9èH{ñ cï*•´lò?NÃI -©ŠœTuˆj9²KчjP-¤a=+.,eÅ}0 µÞ¤€AnÜ‘¤ª*€‚ok©éŽ£É‚Nµcí‡L»ZÌx¾„êV%=4¯–£×é•ž=t¸W°q)V{Fã‹I¥“Ê÷ÿeV)ÿó¬RI¨©eº0qЮȽlÀbWBx$lÀ9¤ýw;PlR”*Ź¬ˆØìxÈ»ºi…ssØë[¤BƒÇeÃÒ¦ö -é‡ÇƒR~m[5¾üw—T]öù%vš4§ÇΡV %(Û -ÍyÅåÑDM8¹ÔšQ«èN¡Šëð*mš*†8¢š|õÒû˜•2…’þf¥±k蛤äðQÕ†’SuøªÏ/;˜ì*ÌC3ƨ¡3kFAãçþiên‡j,ã÷Tz<T³L“?¯o7)A Åx9!Ë零†€ùò”54…QaÞ/ŒxÚÐù¨œW/°2ÅAÄrJ}u6+¥‹ÛKw”mè-÷ÁP³¬rcfGœòîy}Y“&]NðÚlGXcŸ™®‡®µÖã,Ô˜LR«½ë3ÜO$GcðPR¥g¦öëDéLFèh®Àß«"pÝ\½i§OW¥Ÿnöo®ÞøéæánwÿÇ«uºyäÄ<=]ýpþvûú|Äÿýö>‡,q -endstream endobj 227 0 obj<> endobj 228 0 obj<>stream -H‰|“}PgÇwž5ôâj³„F¶—]¸Z "¶ êÐéEªç BEŠFÂËBbI¤R¢Æ^¬/T„X©X¤€­¢RÐÚzêØvÆŽõeì:gëtªs¿un¼ÍõûïöÝg~ßù}Ÿïïóg›ÕVb´ò+«ŠM³É¢³•èy>µ²’ÏuYùìk‰¥ZªþžŽ¬¼Ž·Ytú£ÎbàM¥ÿlj7ê¶ñ’f))$Õ"U„*¾¸ÄbÓIߊ­ÁªŠm‚©ÊšHHIÄóˆùÄR"XN¬ V«ˆ5D±ŽXOäùÄ‹.BFÈ ;ÑG\!“Ƚäo2½ì”ìW¹C>VöŠ¥i¨r ‰0Ra¶Ñ®…$æá³—Ä5öR6<=¥Ì8¹jln^1 èÁç7/Œp}Ã:®°ÏÕÖ~Ê17N˜‡m[Vµ'³8<¦<} ·pi&±*jaÏÛç ´ïMÜ°>`ïÞ -¶stŽqÂN–‰ä >u¬£¸25˜÷ì­æLxÚyø´k…ùß]ƒ%½Ü]q-¯Pôq¨Äa;Ù!.‘wDŠ±ÔP!ÜJ=‡ÿ«?v‚bqµÈ©ú^ƒ7AÅ8ÄòHïWµ~=û5mÅþ,»° ¿ƒS8fxîÅ¿þ4ùõÑG´Mãð–{„“¢Žª™a¬Üúnþ&¶ØÑ;zÿ*P?jõzýý/'p¡ÔNöC<äÃ<9¼ú,_7½ í®rQÉSïÌO`$ÝÛxgnæ»æMeZ/5½hÁ´^}·}üìYv¨³lâ,¬X,Ø;ú¸†ÎæCÍôˆÂ~zúëS²´’+_Ú¡/¬Ëeum]nGÀ}8yn˜9 ³£î¿óe^† ¼ÇãˆoßþüõÇ&µ©ðƒº0g;kÔ8ñ嶷³ÆÊÑ¿á ƒºA&í‘ ÷ãåjÇgëþÆ^¾Þ6xŽ›:Ý}³ýß‹±šàú̶å,°'ã…Ü¼Æ oýÌN }|æ×DíÒ¡øê\C«Ëò4sð \W§¼_[Àmí?óàÒÏ÷:ƒõn‰Áj1B""ÄËáÈS`C¿¿4Îö·Ù*ìÞêz—‡ƒ^¡ÎI”öm9ñqÔ‚Ñ%«óª -7Kì&` tĘýw>¢q¶äXk¿‹|v•tyS˜’ç±á?Q‰ÓµÒM„ÕâõØàñ‰ñ‚Íåë {Œƒ-*CYžÆ€Bõø9awÏÉn's™aHˆ< fô¨}üêÛçß"ÔxžP¨Ã8ê$lA;F¿e{?² -O(o>îDÀKyPKWËçQ·‹ÆÞ^½Æ˜^¤=U/œù3›žeJ/ä¼scÿM„gS»‹\¹ukðm ½(X ¢vU«¨b¤ôŸÁ*Ä\{thèÇûì¾}¾†¹nˆF»v6î`W¬Û¸Ràê)f ¥¯¹·©W!y¹u®”Rsð†æ‚ ÈT_À-|☻Ì5ˆPo[€Ò);–¡KT)ÎE»J=æ-Q'‹î}Úß²·C{òÖm÷Õ±†íGÚ¥:¹^HAO¨Ã C1Th=éƒ<3D[5"zóˆX«¾%†X -ºBÀRñØ€˜sæöÒÊÊÓïp_´A…††釅X,“¨ü%ùŸÌÀ¸Ô?êg©Û°Lš88äïÿ䚢™Zë+hÉÓ2Çø/!v†ÜçJC/Æ›ìÙ5Þ_7ÇC5ŸõžöLÕÁf §^Â=k~Íú9^ªù|ÓHÃDè5ô –´ˆcò!i¯GÓYM;|»ë]s¦ª -›Én¨³¹ŽãYšã{®™<ù«©¿_†HHƒ'œ@%aCu®Óà4J–õ=î>׸ íô?[äÇy­ß:ê§ °gÚäÏöÍø½¼±ýc~E¨\ú¡y¸6¸iÙÎÀse¸¶&<èT¾² á kS*•4¤GˆÔÿ`§Ìæ -endstream endobj 229 0 obj[/Indexed/DeviceRGB 255 230 0 R] endobj 230 0 obj<>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 231 0 obj<>stream -8;Z\tb7VW7$q)Oq',C:3#8E>M>c$-\+B]mjG!(U/PJ]SFJ&!W$7@4>\z!:X'SQu3O/ -I,#j06Orc)mgoje=#m#DSX#9=4%liGI-C-sY1lr[V8XV>V>=BJQ\]3jdq9jGA#Cgl -8UV=J9P2mhFuLBGT1D,Ien`"R41C@EoeCU+mCn5OkY/D(U:,!S1bHnnod-U0"@c`s -6J[s(jJTCYTW#%;TmOur?@8e(SMIc0s\d-bHc*om>*1g!a1p)M@AE]3+l=g^^7OmSB?_m^#:4fYE -o$amMGk,4Q9X4U"z!!(qI49kl+'uB;~> -endstream endobj 232 0 obj<>stream - - - - - application/pdf - - - Adobe Illustrator CS2 - 2005-09-04T08:26:13-06:00 - 2005-09-04T08:28:22-06:00 - 2005-09-04T08:28:22-06:00 - - - - 256 - 92 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FWmZVUsxCq BUk7ADFXnnmv84bDS3kt9Ls5L6ZDxa4kDR24b2JHJ/wHvm103Zcp7yNfe6bWdsRxbRiZHv5Bgdz+ c/neZy0csFuv8kcKkf8AJTmfxzZx7KwjvPxdLLt3UHlwj4I7Sfzx8x28qjUraC9g/aKAwyfQRVf+ FyrL2PjI9JIPzbsPb+QH1gEfJ6z5X83aL5kszc6bLV0p69s9FljJ6clqevYjbNJqNNPEak9HpdZj zxuB+HUJzmO5TsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVW TzwwQvNM4jijBZ3bYADqcIBJoIJAFl81f85F/nL5u0bzkvlzy5qLadDYwRyXrwhfUeeZfUCsxDUV Y2WgHjv2wMgHmtv/AM5EfnFA1V8ws4qCVktrRwadviiJH0YppPND/wCckPzHudYsre/jsNSiuLiO OaGS0QNIrsF4hk40PgadckJkciwMAeb2T83vy/ht0PmHSYFjhFBqFvGtFWuwmVRsB2b7/HN52ZrS f3cz7v1PNdtdnADxYD+sP0/rec+Xtf1DQdVh1KxfjLEfjSp4yIftI9OoObbPhjliYydDpdTLDMTj /a+m9E1e01jSbXU7Q1gukDqD1B6Mp91YEHOPy4jjkYnmHv8ABmjkgJx5FG5W2uxV2KpFrnnzyZoF 4tlrWtWenXboJVguJkjcxsSoajHoSpxVG6H5h0LXrNr3Rb6HULRXMTT27iRA6gEryXuAwxVJP+Vr /lr63of4m071uXD0/rEfLlWnGletcVZXirsVakkSNGkkYIiAs7saAAbkknFWJf8AK3vyv/6mnTP+ kmP+uKstRldQymqsAQfY4qpXl5a2VpNeXkyW9pbI0txPIQqJGg5MzMdgABU4qxhfzc/LFmCr5o01 mY0VRcRkknsN8VZbiqS+YfOvlHy4F/TmsWmnO4qkU8qrIw8VjrzI+QxVI7H86/ypvZxBB5msxIxC j1WaFST/AJUqov44qzWORJEWSNg8bgMjqagg7ggjFUj13z35M0C7Sz1vWrPTrt0EqQXEyRuYySob iTWhKkYqiNA81eW/MMU0uh6lb6lFAwWZ7aRZAjMKgEr3piqa4q7FXYq7FXYq7FXnnmfX31jz1pXl GzatrBOlzqrKdnMI9YRGnYcd/c+2bXT4PDwyynmRQ+O1um1Op8TURwR5A3L4b0+O/wAw/MH+IfPO uayG5xXl5M8DDf8AchisO/8AxjVc1Tuwx3FXoP5C+Xf07+auhQMvKCzlN/PXcAWo9RK/OQKPpxQX 3Hdx20trNHdANbPGyzq32ShBDA+1MlEkEVzYSAIIPJ8mSBBIwQ1QE8SepFds7cPm0qvbk9k/IjWX lsdQ0eRq/V3W4gB/lk+FwPYMoP05oO2cVSE+/Z6r2fz3CUD/AA7/ADeqZpXoXYq7FXwV+cfmr/E/ 5ka3qaPztVnNrZmtR6Fv+6Qr7PxL/TiyD7B/KLywnlP8tdH06ZRFOtv9avyRQiaf97IG/wBTlx+j Fi+IfL4e/wDNumiReb3d/AHUbVMky1A8OuLJ+iWLF2KvKf8AnJLzwfLX5eTWVtJw1LXibKChoVhI rcOP9geHzYYqHzn+Qfkb/Fv5iWUc8fPTNLpf39RVSsTD04z/AK8nEEeFcUl9xYoeRf8AOT/mo6N+ WsmnxMVutcmSzWnUQr+9mPyIQIf9bFQ+c/yI8q/4k/M/R7aROdpZP+kLvw9O2o6g+zS8FPzxSX0X /wA5A/nHJ5I0uPSNFkX/ABLqKF45CA31WCvH1ipBBZiCqA+BPahUB89/lb+WHmD80vMN3Pd3ksdl CRJqmrzcppGdztGpY/HIwqdzsOvYFSo/nV+W2nfl/wCabfSLC/e+huLRLr98FEkZZ3Ti3Gimvp1G Kh7h/wA4j65ql75S1bTbqVpbTTLmP6lzJPBZkJeNSf2Qy8qe+Kl4N+dXmg+ZPzM1u/ST1LWGc2dm R9n0bb90CvsxUv8ATiofUP8Azjf5X/QX5W6fLIgS61hn1GY9ystFh38PRRT9OKC9QxV2KuxV2KsT 86/mn5I8lXNnbeYr82s16C0SJFJMQimhdhGrELXb37YqiNN8/wDlbXrGZ/LWrWeqXojZre0SdBIX 4/AGjYq6gnxGSgBYvkxmSAa5vNNG8q+ddLtPN+s3VhK2trpl19QFVdpbmdWbkhQtyYFeg8ad83Ha OqxyxxjjO36nQ9k6LLDLKeUUf183yPJHJFI0cilJENGRgQQR2IOaV6Jbir6M/wCcPvL/AD1DX/MD rtDFFYQN7yt6stPl6affigvefzH1X9GeTNTnVuMssX1eLx5TH09vkGJzL0OPjzRHx+TgdpZvDwSP lXz2fNOde8C9A/JG5aLzk8QJ4z2kqEdvhZXH/Ec1fa8bw33F3fYEqzkd8T+h71nMvYuxViH5t+av 8L/l3rero/C5W3MFme/rz/uoyP8AVZ+X0Yq+Nvyh8q/4o/MXRNKdOdqZxcXg7ehb/vZAf9YLx+nF kX3R5hn+r6Bqc9QPRtJ5Kt0HGNjv7YsXwX+Wlsbr8xfK8HEsH1Wy5gdeIuELH6FriyL9BMWLsVfE f/OQvnj/ABV+Yt2lvJz0zRq6fZ0Pws0bH1pB2+KWoB7qBikPf/8AnGbyN/h7yCmq3MfHUfMBW7cn 7QtgCLdendSX/wBligvXcVfIX/OVnmr9KefoNEiflbaFbhHANR9YuaSyf8J6Y+jFIZl/zifoFvpn lzX/ADnf0iikJt4pn2C29qvqzvX+UsRX/UxUvAfPnmy782+btT1+5Lf6ZMzQRsa+nAvwxRj/AFUA GKX2p+TnkpPJ/wCX+maW8YS+lQXWpHubmcBmB/1BRP8AY4sXzr+b35ffmt5s/MPWNXh8u3klkZfQ sGotDbwD00Zfi6Px5/ThSC9M8oWF3+U//OP+qajqERs9enWa4eJjR0uZyLe2X/YgIxA9/nih8u+W dDudf8x6bo1vUz6jcxW4bw9RwCx/1RucDJ+h9lZ29lZwWdsgjt7aNIYYx0VI1CqPoAxYq2KuxV2K uxV8T/8AOSXmE6x+a+pRq3KDSo4tPh/55rzk+6WRxikPL1ZlYMpIYGoI2IIxS+pf+cTtc8zX2m+Y X1bUZ7rSLNrdbX61I0npuVkaXgzklV4haitPxxQWN63/AM5L+Vda1a4h1ryRaaro3MpbzTFGuvTB or/vI2AJ60BFPHFaUY4P+cVvNeyvfeUr2QfZZnWMN82+tQgfSv0Yru97/Kry35J8u+V107yjfR6l YtIZ571Jo52llcAFnaL4RsgAFOgxQkv52DVbyy0/TNPtJ7oF3urj0I3kCiNeKcuIP87fdm47J4Yy MpEDo6Ht0TlCMIgnezQ7nicsUsTmOVGjdeqMCCPoOdCCDyeTlExNEUzr8lY2fzsrDpHbTM3y+Ff1 tmt7WP7n4h3HYI/f/wCaf0Pfs5h7J2Kvm3/nL7zVSPRPKsL7sW1K8UHsKxQV/wCSn4YpCj/ziD5V 5Ta15qmTaMLp1mxH7TUlnofED0x9JxUvdvzGuTbfl95nuBx5RaVeuvLoWFu/EHp1OKHxf+SVv6/5 r+WEoTS9WSg6/u1L/wDGuKS9/wDP3/OUul+WfNF5oenaL+mUsT6Vxei7EC+uP7yNVEM1eB2Jr1rt itI/Vvz2juPySuvOcNt+jNSvHl07TrT1fWK3JJRXV+EXLglZPs9qYofMv5YeTJvOfnnTNDoxt5pP Vv5BX4baL45TUdCVHEH+YjFkX35DDFDCkMShIo1CRouwVVFAAPYYsVK/vrawsbm+un9O2tInnnf+ WONSzH6AMVfnh5h1i71/zDqGrz1e51K5kuGXqayuWCgDwrQDFk+n/wAzAPy6/wCcdLTy5ERHfXsU OnS07y3FZ7w/IgSL9OLF4F+TXlgeZPzL0LTZE52y3AubodvStgZmDezcOP04pL7D81/m9+XXlPVB pXmDVxZ35jWb0BBczURyQpLQxyKK8TsTXFCE0T89Pys1zVrXSdK1o3OoXjiO2gFpeLyY705PCqjp 1Jpiry//AJy981enY6L5WhejXDtqN4o/kjrFCD7Fi5/2OKQwv/nFTyx+k/zCl1iVA1vods0ik7/v 7isUf/CeofoxUvsDFDsVdirsVWTyrDDJKwJWNS5A6kKK7Yq/OXWdTn1XV77VLj/ei/uJbqbevxzO Xbf5tiyQeKvqDyb/AM6X/wA4t6nqx/dXmsR3EqH9rneOLOEj5IFcYofL+KXYq9l/5xTh1GT8zy9s 7Jaw2M73ygni6EqiK3b+8dSPligvSfz3/PvzD5O8z2/l/wAux2/qwwpcX89whkq0hJSJVDLQcAGJ 677U7qgMb0z/AJyt0+/RIPOPlSC7SlHntSrgePGC4Df8ncnDJKP0khhkwxmKkAfez3yP+af5BnUH vtLvE0S/nj9GSK9EluvBmDfactAN1HR8ty6rJkjwyNhx8OixYpGUI0S9etrq2urdLi1lSe3lHKOa Jg6MPFWWoIzHcpUxV8FfnH5q/wAT/mRrepo/O1Wc2tma1HoW/wC6Qr7PxL/TiyD7A/Jnyr/hj8tt E0104XUkAu7wd/Wuf3rA+6Bgn0YsV35zTGH8q/NDgA1sJU3/AMscP+NsVfDvlvzBf+XtYh1fT24X tukot5B1R5YniDj3TnyGLJL2S4dDcMrsjPxaYgkFzvQt498VTO88y6hdeW9N8vM1LDTZp7iNAftS 3HHkSP8AJCUHzPjir6A/5x60WDyb+XHmD8ytSQCWa3lFiGHW3tqmg6f384C/7EYoLzDRPzZ/OHWt csdKtfMt59Y1G4jt4gOJAaZwo2p0FcK0+h/+ckfMx8v/AJVzafHMzXmsNHpyOx+No6c53NOtUTif 9bAgPnD8iPKv+JPzP0e2kTnaWT/pC78PTtqOoPs0vBT88Ul6h/zmLqcpuvLOlgkRKlzcuOzMxjRP +BCt9+KhLv8AnEDR0n8067q7LU2NnHboT2N1Jyr86W5xUrv+crvLnlnS9Ts9ThaaXzHrkrzXTyS8 lS3t41iRVjAAUEkU/wBU4qEB/wA4m+VjqHne81+VKwaLbFYmI/4+Lqsa0PtEJPvxUsJ/PDzQPMn5 na3exvztbeX6laEfZ9O2Hp1X2ZwzfTiofRX/ADiz5X/RP5cfpSVKXOuXD3Fe/oRfuYgfpV2H+tig vY8VdirsVdirsVeSeff+cavIfmZ5rzTlbQdVlLO01sOUDu3d7ckL1/kK4rbwDzH/AM45/mjo+pR2 kGm/pWCd+EN7ZHnHuaAyBuLRe5YU98U29M/5yduIvLv5deVPJlq1EqgIXvFp8KxCv+s8ob6MVD5k xS7FX1D/AM4f+X/T0jXvMDrvczx2MDH+WBfUkp8zKv3YoLwn81df/T/5i+YdVDco5rySOButYYP3 MR/5FxrikMUxV2KvsT/nFK2v4vyveW5ctBcahcSWSHcLEFjRqexlR9sUFm35t+av8L/l3rero/C5 W3MFme/rz/uoyP8AVZ+X0YofC/lyfSLfX9OuNZSWXSobiKS+igVXkeFGDOih2RasBTc4sn1R/wBD dflt/wBW3Wf+RFr/ANlOKKb/ADB/MzSfOv5B+adb0myvLezjeCzBvUjjLs1zAGZPTkmqq+p9+2Kv k7S9Mv8AVdRttN0+Fri9vJFht4U6s7mgGKXuv56fl3Y+SPyn8q6XbBHuIr2RtQugKNNczQVdt9+P 7sKPYDFAeK+VfLt75k8x6doViK3OoTpCp7KCfjc+yLVj8sUvsD87fKs0H5HXuiaBGRb6ZDbUt0Hx NbWsiF+nUgLzbxpixfKv5WeatL8qeftI1/VLd7mxsXkaaKIAyDnE8auoYqCUZw3XtiyKe/nd+bX/ ACsPXraWzhktdF05GjsYJqeozSEGSVwpZQW4qKAmgGKAHtv/ADi1+XN5oWg3fmbVITBe60FSyicU dLRDy5EGhHqvvTwVT3xUsc/5zB0O9M/l/XUQtZqk1lNIB9iTkJIwx/yxyp8sVDA/yG/N/SPy7n1v 9K2dxdW+qRwGM2oQustsZOIYSPGOLCY1O5FOmKlin5l/mDqfnvzTPrl6noR8RDZWgPJYYEJKpXap JJZj3JxS+g/y2A/Ln/nHW+8yyD09R1GKW+iJ6+pcUgsx8vsP9JxYvlJmZmLMSWJqSdyScWT6q0D/ AJyi/K3RdD0/SLXTNYFvp9vFbR0gtRURIFr/AL09TSpxRSfaD/zlB5E13W7HRrDS9Xa81CeO2g5Q 2wUNIwUFiLk0UVqTTpitPYMUOxV2KuxV2KpZq/mXR9HuLWHU5xareFlgnfaLklKqz9F+1tXbLsWC eQExF00ZtTDGQJmrSH8yfyw8tfmHpFvaao8kUlsWlsL+2ZecZkA5U5BlZHotR7bEZS3gvmfzv/zj H5/0AyXGkKvmDT1qQ1qONyF3+1bkkk/8Yy2KbeR3FvcW07wXETwzxnjJFIpR1I7MpoQcUvsXyaP8 B/8AOOC6gQY7tdMm1AE7Ez3lXgB8P7xFxYvjbFk7FXYq/QT8tfLw8u+QdB0fjxktbOP1xSn76Qep N/yUdsWKv508o+VPM+j/AFPzRALjS7Z/rbK88tuitGrDm7xPFsqsftGnfFWIQf8AOPH5I3EEdxb6 Es0EyiSKWO+vWR0YVVlYT0II3BGKbU7H8gPyK1C1S7sNGiu7WQsEuIL+8kjYoxRgHS4IPFlIPvit spb8svIzeTx5OOlgeXFbn9RWWdasJPVqZQ4lJ577v+GKEr0b8pvyn8lXo8xWOmw6XPaqVF/cXU7J GJPgJrcSvGpPLjXrvTFU48/eVvI/mDRVj85RRPpNlKLn1Z53tY43oYwzSo8VB+8pQtTFUB5W/Jz8 t/KurLq+g6OLTUURo0nM9zMQrijUWaWRdxtWlcVZmQCKHcHqMVedaz/zj5+U2rX0l7PoggnlJaT6 rLNAhJNa+nGwQf7EDFUT5f8AyL/KvQrhLqy0GGS5Q8kmumkuSCOhCzM6AjxC4qzzFUHq+j6VrGnz adqtrFe2M44y28yh0Ydtj3HY4qwCL/nHD8no7v6z+gy+/IQvc3JjBrX7Pqbj2O2Krm/5xy/JlmLH y6Kk1NLu9A38AJ6DFbT3XNC/LnzJpNr5T1J7a6sYpvQtdMju2ib1rKPeICGRJGaGM1ZOw3IxVIf+ hcPyY/6l7/p8vv8Aqvim3f8AQuH5Mf8AUvf9Pl9/1XxW0z8ufkp+WPlvWLfWdG0UW2pWvL0JzcXU vHmpRiFlldPssR0xQzfFXYq7FXYq7FWMfmP5abzB5XuLaFeV5bkXFoB1MiA1X/ZKSPnmZoNR4WQE 8jsXA7S0vjYTEfUNx73iHljz75l8tSCO1mMloG/eWM9Wj96Dqh/1c6PUaLHm3I373ktJ2jmwGgbj 3H8bPYvKv5reW9c4QTv+jtQbb0J2HBj/AJEuyn5Gh9s0Gp7NyY9x6ovUaPtbFm2Ppl3H9BTjX/Iv k7zDNFPrejWmoTwkGOWeJWcU7cqVK/5J2zXu0SX84/J+peavy41TQdI4reyLE9tCSEVzBKsnp1JA FQlBXauKvh7XvLmveX75rHWrCfT7ta/up0KVA7qTsw912xZJbirJ/wAsfL3+IfzA0HSCOUdzeRmc UrWGI+rL/wAk0bFS/QLFi8Os9U80XFp5uay0TVIPMvmfV47aK4vNNl+rQ6fzW1hZ/rEZidEtld25 Ar8W/uVS8fmL+Y9/q+r2ukxzrDpljfkaBa2cbKoDfVNM9OVEaWRnc+qzIQnFdhQE4qs8p+X/AM0b DX9C8qyXmpW3lXRbqThcW9msKO1laRSMrv6fF4J7iWURl2IanduPFVvTfNn/ADkdPZhpNOuFkTTI 76stnEjvJBLKskLKYkAnuGVB6Y3WL4gA5wKran5o/OOP8vobq/sH1DUL2/Ny9rc2ACwWNpEJWhuF lt4VBmnCrFVOfZWLb4VQP6T/ADC886JJZzXN3qOjXOrxn62thGvpQaTB9aul9OJP923XCOFZGJJW m5rirJfLd1+Zk+v6HqXmmXVUt9J0D9IX1va2YEd3e3ErBoHiSOhmSExjgByBrxC/FUKk2t6r+all f65r2kaPqNrdeYRPPaTR2Iu7mO3sEWCwtXiKyJCZGeSZ+YJpsPiwqnOqa3+eFnqms2ttFPe2ukWt nepcraxAXUiWSia0tiIqSetdlnk4/EirxXiSMCpp5T1L817zy15wvLtriXUYkMXlmC9s47FjMtqH aRY+CkxtNJROZP2aE1rirCdDTzbpD3GsaR5Uunv4rO0tpdb1OyvJdWN9dyql5LxeRhPFCquwEcYG 670rUqraVr//ADkHfyzAS39pGL+G1szeaVCpZLi7YGScCFQsUFrAS7qaVcDlWmBUdqHmj89/0Po9 tZWtyLrVLm8d9VlsQJbeFbgpaR3EKW8qxgxjmxaMEig5KanFWRa1qmoQfmtZ3WoaRql9aaFpDpY3 FlY3EtvJf3fxXDrIqsgpDGEG9asR1xVgGpQ/m2moabq9rp13D5jttLa9heHTY2t2utRuTPeJMVjC I8dtGkTDj6zsO5NcKp5qvmH89tO8s2TP9dutV1Kwm1B5LPS45XtZwB6FiUCMqt8fKRpFr8PFRy6h UTr/AJh/NfTNB8xa7d6s9hb6O9lY6daPZW6yXtwnoLdzRtLGOSzO0gjCrQ/s9MVeoeTB5lbQo7rz JIDql673LWgVFW0jlPKO1BVVLeklAzNUlq70piqeYq7FXYq7FXYq7FXlX5k/lTLe3Eus6BGDcSVe 8sQQObdS8dduR7r37b5utB2kIjgny6F57tTsgzJyY/q6jv8Ac8eubW5tZmguYngnQ0eKRSrA+4ND m/jIEWNw8tOEompCiyzyp+aHmTQCkDSfX9PWg+qzkkqo7RvuV/Ee2YOp7Ox5d/pl3h2ej7Xy4dj6 o9x/QXuHlXzVZ+Y9OF7bQT246Mk8bKK/5D04OPkfnTOc1OmOKVEgvXaXVRzQ4gCPeEVrnl7Q9esX sNZsINQtH6wzoHAPitd1PuN8x3JeF+ef+cS9Ju+d15Ovzp8xqRp14WkgJ8EmFZEH+sHxTa38gPyM 82eVfN1x5g8zQRWotYZILCFJUmaR5aBpQYywVQnIb779MVJfQ2KHEAih3BxVA6VoOh6PHJFpOnWu nRytzlS0hjgVm/mYRhanfFUdirsVQ+o6bp2p2cllqNrDe2c1BLbXEayxPQ1HJHDKaEV3GKrrOztL K2jtbOCO2tYhxighRY41HgqqAB9GKq2KuxV2KuxV2KuxV2KuxV2KuxVB32j6Vf3Nnc3tpFcz6fIZ rKSVQxikI480r0anfFUZirsVdirsVdirsVdirsVQt9pWl36hb6zgu1HRZ40kA/4MHJwySj9JIYTx RmKkAfehoPK/lm3kEkGkWUMg6PHbxK33hcnLUZDzlL5lrhpcUTYjEfAJn0ylvdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= - - - - - - uuid:FF8F96D84F1DDA11BBE0D49BBEFDCBAA - uuid:112b4e8a-7599-4f4a-849d-4002d9dd1bb8 - - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj xref -0 233 -0000000003 00000 f -0000000016 00000 n -0000000077 00000 n -0000000004 00001 f -0000000006 00000 f -0000000127 00000 n -0000000007 00001 f -0000000008 00000 f -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00001 f -0000000015 00001 f -0000000016 00000 f -0000000017 00000 f -0000000018 00001 f -0000000019 00001 f -0000000020 00001 f -0000000021 00000 f -0000000022 00001 f -0000000023 00000 f -0000000024 00000 f -0000000025 00001 f -0000000026 00001 f -0000000027 00001 f -0000000028 00000 f -0000000029 00001 f -0000000030 00000 f -0000000031 00000 f -0000000032 00001 f -0000000033 00001 f -0000000034 00001 f -0000000035 00000 f -0000000036 00000 f -0000000037 00000 f -0000000038 00000 f -0000000039 00000 f -0000000040 00000 f -0000000041 00000 f -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000045 00000 f -0000000046 00000 f -0000000047 00000 f -0000000048 00000 f -0000000049 00000 f -0000000050 00000 f -0000000051 00000 f -0000000052 00000 f -0000000053 00000 f -0000000054 00000 f -0000000055 00000 f -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000062 00000 f -0000000063 00000 f -0000000064 00000 f -0000000065 00000 f -0000000066 00000 f -0000000067 00000 f -0000000068 00000 f -0000000069 00000 f -0000000070 00000 f -0000000071 00000 f -0000000072 00000 f -0000000073 00000 f -0000000074 00000 f -0000000075 00000 f -0000000076 00000 f -0000000077 00000 f -0000000078 00000 f -0000000079 00000 f -0000000080 00000 f -0000000081 00000 f -0000000082 00000 f -0000000083 00000 f -0000000084 00000 f -0000000085 00000 f -0000000086 00000 f -0000000087 00000 f -0000000088 00000 f -0000000089 00000 f -0000000090 00000 f -0000000091 00000 f -0000000092 00000 f -0000000093 00000 f -0000000094 00000 f -0000000095 00000 f -0000000096 00000 f -0000000097 00000 f -0000000098 00000 f -0000000099 00000 f -0000000100 00000 f -0000000101 00000 f -0000000102 00000 f -0000000103 00000 f -0000000104 00000 f -0000000105 00000 f -0000000106 00000 f -0000000107 00000 f -0000000108 00000 f -0000000109 00000 f -0000000110 00000 f -0000000111 00000 f -0000000112 00000 f -0000000113 00000 f -0000000114 00000 f -0000000115 00000 f -0000000116 00000 f -0000000117 00000 f -0000000118 00000 f -0000000119 00000 f -0000000120 00000 f -0000000121 00000 f -0000000122 00000 f -0000000123 00000 f -0000000124 00000 f -0000000125 00000 f -0000000126 00000 f -0000000127 00000 f -0000000128 00000 f -0000000129 00000 f -0000000130 00000 f -0000000131 00000 f -0000000132 00000 f -0000000133 00000 f -0000000134 00000 f -0000000135 00000 f -0000000136 00000 f -0000000137 00000 f -0000000138 00000 f -0000000139 00000 f -0000000140 00000 f -0000000141 00000 f -0000000142 00000 f -0000000143 00000 f -0000000144 00000 f -0000000145 00000 f -0000000146 00000 f -0000000147 00000 f -0000000148 00000 f -0000000149 00000 f -0000000150 00000 f -0000000151 00000 f -0000000152 00000 f -0000000153 00000 f -0000000154 00000 f -0000000155 00000 f -0000000156 00000 f -0000000157 00000 f -0000000158 00000 f -0000000159 00000 f -0000000160 00000 f -0000000161 00000 f -0000000162 00000 f -0000000163 00000 f -0000000164 00000 f -0000000165 00000 f -0000000166 00000 f -0000000167 00000 f -0000000168 00000 f -0000000169 00000 f -0000000170 00000 f -0000000171 00000 f -0000000172 00001 f -0000000173 00001 f -0000000174 00001 f -0000000175 00000 f -0000000176 00001 f -0000000177 00001 f -0000000178 00000 f -0000000179 00000 f -0000000180 00000 f -0000000181 00001 f -0000000182 00001 f -0000000183 00000 f -0000000184 00000 f -0000000185 00000 f -0000000186 00000 f -0000000187 00000 f -0000000188 00000 f -0000000189 00000 f -0000000190 00001 f -0000000191 00000 f -0000000192 00000 f -0000000193 00000 f -0000000194 00000 f -0000000195 00000 f -0000000196 00001 f -0000000197 00000 f -0000000198 00000 f -0000000199 00000 f -0000000200 00000 f -0000000201 00000 f -0000000202 00000 f -0000000203 00000 f -0000000204 00001 f -0000000205 00001 f -0000000206 00000 f -0000000207 00000 f -0000000208 00000 f -0000000209 00001 f -0000000210 00000 f -0000000211 00000 f -0000000212 00000 f -0000000213 00000 f -0000000222 00000 f -0000000962 00000 n -0000001037 00000 n -0000001259 00000 n -0000002254 00000 n -0000010101 00000 n -0000075690 00000 n -0000141279 00000 n -0000163833 00000 n -0000000223 00001 f -0000000000 00001 f -0000163946 00000 n -0000164319 00000 n -0000164578 00000 n -0000166617 00000 n -0000166740 00000 n -0000168460 00000 n -0000168509 00000 n -0000169023 00000 n -0000169529 00000 n -trailer -<<6900ADF75DFA7C479ED6082881A1314D>]>> -startxref -184360 -%%EOF diff --git a/res/logo/lwjgl_logo-with_jacket.svg b/res/logo/lwjgl_logo-with_jacket.svg deleted file mode 100644 index e97e236b..00000000 --- a/res/logo/lwjgl_logo-with_jacket.svg +++ /dev/null @@ -1,198 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/lwjgl_16x16.xpm b/res/lwjgl_16x16.xpm deleted file mode 100644 index b4fe9d8e..00000000 --- a/res/lwjgl_16x16.xpm +++ /dev/null @@ -1,141 +0,0 @@ -/* XPM */ -static char * lwjgl_logo_2a_xpm[] = { -"16 16 122 2", -" c #000000", -". c #010101", -"+ c #020202", -"@ c #030303", -"# c #0A0A0A", -"$ c #0C0C0C", -"% c #0E0E0E", -"& c #171717", -"* c #1B1B1B", -"= c #1D1D1D", -"- c #1F1F1F", -"; c #222222", -"> c #232323", -", c #2B2B2B", -"' c #2D2D2D", -") c #333333", -"! c #3D3D3D", -"~ c #404040", -"{ c #434343", -"] c #4A4A4A", -"^ c #4F4F4F", -"/ c #525252", -"( c #565656", -"_ c #585858", -": c #595959", -"< c #5C5C5C", -"[ c #5E5E5E", -"} c #5F5F5F", -"| c #666666", -"1 c #686868", -"2 c #6C6C6C", -"3 c #6D6D6D", -"4 c #397CB5", -"5 c #3A7DB5", -"6 c #3D7FB6", -"7 c #3E80B6", -"8 c #747474", -"9 c #787878", -"0 c #4886BA", -"a c #4C89BC", -"b c #4D89BC", -"c c #508BBD", -"d c #508CBD", -"e c #76828D", -"f c #548EBF", -"g c #5690C0", -"h c #848484", -"i c #5B92C1", -"j c #7D8D9B", -"k c #6096C3", -"l c #8C8C8C", -"m c #8D8F91", -"n c #669AC5", -"o c #919191", -"p c #6D9EC8", -"q c #8499AA", -"r c #959595", -"s c #71A1CA", -"t c #74A4CB", -"u c #9B9B9B", -"v c #77A5CC", -"w c #9C9EA0", -"x c #7CA8CE", -"y c #7EA9CE", -"z c #A1A1A1", -"A c #81ABCE", -"B c #82ACD0", -"C c #84ADD0", -"D c #A5A5A5", -"E c #A6A6A7", -"F c #86AFD2", -"G c #87B0D2", -"H c #A8A8A8", -"I c #8CB3D4", -"J c #8DB4D4", -"K c #91B6D5", -"L c #94B7D5", -"M c #97BAD8", -"N c #9EBFDA", -"O c #A2C1DC", -"P c #BCBCBC", -"Q c #BDBDBD", -"R c #BFBFBF", -"S c #C0C0C0", -"T c #B0C5D6", -"U c #C6C6C6", -"V c #CCCCCC", -"W c #CFCFCF", -"X c #D0D0D0", -"Y c #C2D7E8", -"Z c #D3D3D3", -"` c #C4D8E9", -" . c #D4D4D4", -".. c #C6D9E9", -"+. c #D6D6D6", -"@. c #D0E0ED", -"#. c #DADEE1", -"$. c #D2E1EE", -"%. c #DFDFDF", -"&. c #E4E4E4", -"*. c #DAE7F1", -"=. c #E5E5E5", -"-. c #E6E6E6", -";. c #E0EAF3", -">. c #E2ECF4", -",. c #E4EDF5", -"'. c #E7EFF6", -"). c #EEEEEE", -"!. c #E8F0F6", -"~. c #EFEFEF", -"{. c #EBF2F8", -"]. c #EDF3F8", -"^. c #F2F2F2", -"/. c #F5F5F5", -"(. c #F6F6F6", -"_. c #F4F8FB", -":. c #FBFBFB", -"<. c #FAFCFD", -"[. c #FCFDFE", -"}. c #FEFEFE", -"|. c #FEFFFF", -"1. c #FFFFFF", -"1.1.1.1.1.1.|.Y t c f F '.1.1.1.", -"1.1.1.1.1./.m e j q L 5 0 *.1.1.", -"1.1.1.1._.w &.C 5 i [.1.", -"1.1.1.1.K } ; 1.!.4 5 ` 1.", -"1.1.1...A = | 1.@.5 5 J 1.", -"^.D %.O T # H 1.M 5 5 s 1.", -"z . > V X D h < ~.1.k 5 5 p 1.", -"[ W - @ , 2 U <.N v a x 1.", -"* & +.. / =.! 1 E #.1.", -"8 % : r o u + { ", -"1.).l R ( Z _ ) ", -"1.1.[.1.S ~ + * :.& 9 ", -"1.1.$.y ;.1. .3 h Z Q ", -"1.1.}.n 6 B ,.1.1.=.' $ (.", -"1.1.1.>.b 5 7 G '.1.}.P ^ @ ] 1.", -"1.1.1.1.{.I g d v ].1.1.1.%.-.1."}; diff --git a/res/lwjgl_32x32.xpm b/res/lwjgl_32x32.xpm deleted file mode 100644 index 99cc36e8..00000000 --- a/res/lwjgl_32x32.xpm +++ /dev/null @@ -1,275 +0,0 @@ -/* XPM */ -static char * lwjgl_32x32_xpm[] = { -"32 32 240 2", -" c #FFFFFF", -". c #FAFCFD", -"+ c #CBDDEC", -"@ c #93B7D6", -"# c #6FA0C9", -"$ c #5C93C2", -"% c #6096C3", -"& c #7AA7CD", -"* c #ACC8E0", -"= c #EDF3F8", -"- c #FCFDFE", -"; c #B5CEE3", -"> c #5A92C1", -", c #3A7DB5", -"' c #4585B9", -") c #A1C1DC", -"! c #FCFCFC", -"~ c #E2EAF1", -"{ c #B8CFE3", -"] c #AEC9E0", -"^ c #A3C2DC", -"/ c #98BAD8", -"( c #8CB3D3", -"_ c #81ACCF", -": c #6E9FC8", -"< c #3D7FB6", -"[ c #72A2CA", -"} c #F5F8FB", -"| c #D8D8D8", -"1 c #313131", -"2 c #242424", -"3 c #404040", -"4 c #525252", -"5 c #656565", -"6 c #747474", -"7 c #8F8F8F", -"8 c #F7F8F8", -"9 c #ACC8DF", -"0 c #3B7DB5", -"a c #79A7CD", -"b c #FEFEFE", -"c c #686868", -"d c #000000", -"e c #B6B6B6", -"f c #86AED1", -"g c #AECAE1", -"h c #D3E2EE", -"i c #E1EAF2", -"j c #282828", -"k c #020202", -"l c #DEDEDE", -"m c #5B92C1", -"n c #4886BA", -"o c #F4F8FB", -"p c #ECF3F8", -"q c #6499C5", -"r c #D7D9DB", -"s c #050505", -"t c #C0D5E7", -"u c #397CB5", -"v c #ABC8E0", -"w c #FEFFFF", -"x c #78A6CC", -"y c #7BA7CD", -"z c #9E9E9E", -"A c #E2ECF4", -"B c #377BB4", -"C c #669AC5", -"D c #C3D7E8", -"E c #397DB5", -"F c #B2CCE1", -"G c #585858", -"H c #A9A9A9", -"I c #BCD2E5", -"J c #4081B7", -"K c #EEF4F9", -"L c #DDE5ED", -"M c #1C1C1C", -"N c #070707", -"O c #E7E7E7", -"P c #85AED1", -"Q c #CCDEEC", -"R c #BAD2E5", -"S c #5790BF", -"T c #D0D1D1", -"U c #030303", -"V c #333333", -"W c #FDFDFD", -"X c #FBFCFD", -"Y c #508BBD", -"Z c #B1CCE2", -"` c #CACACA", -" . c #373737", -".. c #616161", -"+. c #A2A2A2", -"@. c #DDDDDD", -"#. c #E4ECF3", -"$. c #B1CBE1", -"%. c #B4CDE2", -"&. c #E6E6E6", -"*. c #232323", -"=. c #727272", -"-. c #D8E5F0", -";. c #A0C0DB", -">. c #666666", -",. c #060606", -"'. c #272727", -"). c #D4D4D4", -"!. c #F6F6F6", -"~. c #D0D0D0", -"{. c #979797", -"]. c #5E5E5E", -"^. c #040404", -"/. c #C0C0C0", -"(. c #A2C1DB", -"_. c #9EBFDA", -":. c #FBFBFB", -"<. c #252525", -"[. c #5C5C5C", -"}. c #EAEAEA", -"|. c #B5B5B5", -"1. c #E9E9E9", -"2. c #B2B2B2", -"3. c #BDBDBD", -"4. c #6B9DC7", -"5. c #DBDBDB", -"6. c #838383", -"7. c #5F5F5F", -"8. c #0B0B0B", -"9. c #767676", -"0. c #B7B7B7", -"a. c #F0F0F0", -"b. c #F0F5F9", -"c. c #4B88BB", -"d. c #B2CCE2", -"e. c #9A9A9A", -"f. c #C5C5C5", -"g. c #F7F7F7", -"h. c #1D1D1D", -"i. c #3C3C3C", -"j. c #DFDFDF", -"k. c #F3F7FA", -"l. c #CCDDEB", -"m. c #9EBEDA", -"n. c #72A1C9", -"o. c #4C89BB", -"p. c #C9DCEB", -"q. c #565656", -"r. c #0F0F0F", -"s. c #F9F9F9", -"t. c #D1D1D1", -"u. c #8E8E8E", -"v. c #848484", -"w. c #707070", -"x. c #B0B0B0", -"y. c #F9FBFC", -"z. c #DCE8F2", -"A. c #F6F9FC", -"B. c #151515", -"C. c #4E4E4E", -"D. c #919191", -"E. c #BBBBBB", -"F. c #2F2F2F", -"G. c #393939", -"H. c #909090", -"I. c #4D4D4D", -"J. c #101010", -"K. c #5A5A5A", -"L. c #090909", -"M. c #323232", -"N. c #B1B1B1", -"O. c #A1A1A1", -"P. c #353535", -"Q. c #F5F5F5", -"R. c #131313", -"S. c #454545", -"T. c #F8F8F8", -"U. c #2B2B2B", -"V. c #BEBEBE", -"W. c #505050", -"X. c #C2C2C2", -"Y. c #868686", -"Z. c #D2D2D2", -"`. c #010101", -" + c #434343", -".+ c #DCDCDC", -"++ c #E0E0E0", -"@+ c #959595", -"#+ c #C8C8C8", -"$+ c #888888", -"%+ c #292929", -"&+ c #181818", -"*+ c #4A4A4A", -"=+ c #CFCFCF", -"-+ c #F1F6FA", -";+ c #4B4B4B", -">+ c #86AFD1", -",+ c #90B5D5", -"'+ c #EAF1F7", -")+ c #787878", -"!+ c #1B1B1B", -"~+ c #969696", -"{+ c #C6C6C6", -"]+ c #C3D8E9", -"^+ c #4383B8", -"/+ c #94B8D6", -"(+ c #F4F4F4", -"_+ c #A7A7A7", -":+ c #858585", -"<+ c #9D9D9D", -"[+ c #FAFBFD", -"}+ c #5D94C2", -"|+ c #4685B9", -"1+ c #98BBD8", -"2+ c #EFF4F9", -"3+ c #9B9B9B", -"4+ c #C5D9E9", -"5+ c #3B7EB6", -"6+ c #F2F6FA", -"7+ c #2C2C2C", -"8+ c #8FB5D5", -"9+ c #4A87BB", -"0+ c #FAFAFA", -"a+ c #6E6E6E", -"b+ c #85AFD1", -"c+ c #4D89BC", -"d+ c #A8C5DE", -"e+ c #0E0E0E", -"f+ c #B8B8B8", -"g+ c #FEFEFF", -"h+ c #B1CBE2", -"i+ c #4C89BC", -"j+ c #BFD4E7", -"k+ c #ECECEC", -"l+ c #939393", -"m+ c #81ACD0", -"n+ c #6599C5", -"o+ c #6197C4", -"p+ c #6C9EC8", -"q+ c #F7FAFC", -" . + @ # $ % & * = ", -" - ; > , , , , , , , ' ) - ", -" ! ~ { ] ^ / ( _ : < , , , [ } ", -" | 1 2 1 3 4 5 6 7 8 9 0 , , , a - ", -" b c d d d d d d d d e b f , , , , g ", -" h i j d d d d d d d k l } m , , , n o ", -" p q r s d d d d d d d 2 b t u , , , v ", -" w x y z d d d d d d d d 5 A B , , , C ", -" D E F G d d d d d d d d H I , , , , J K ", -" . > < L M d d d d d d d N O P , , , , E Q ", -" b R , S T U d d d d d d d V W X Y , , , , E Z ", -" ` ...+.@.#.$.%.&.*.d d d d d d d =. -., , , , , , ;. ", -" >.d d d ,.'.>.). !.~.{.].'.^.d U /. (., , , , , , _. ", -":.<.d d d d d d [. }.7 |.1.W O 2.3.b 4., , , , , , ) ", -"5.U d d d d d d 6. 7.d d 8. .9.0.a. b.c.< u , , , , d. ", -"e.d d d d d d d f.g.h.d d d d d d N i.j. X - k.l.m.n.o., p. ", -"q.d d d d d d r.s.t.U d d d d d d d d u. s.v.w.x.}. y.z.A. ", -"B.d d d d d d C. D.d d d d d d d d d E. z d d d ^.F.w.x.&.b ", -"G.d d d d d d H. I.d d d d d d d d J.a. K.d d d d d d d L.M.N.", -"!.O.P.k d d k t.Q.R.d d d d d d d d S.b T.h.d d d d d d d d d U.", -" ! V.W.s <.s.X.d d d d d d d d d Y. Z.`.d d d d d d d d d +", -" b .+++ @+d d d d d d d d `.#+ u.d d d d d d d d d d $+", -" j.%+d d d d d d d &+Q. *+d d d d d d d d d d =+", -" -+ s.|.;+,.d d d d 4 T.J.d d d d d d d d d M T.", -" >+,+'+ 5.)+!+d d ~+ {+d d d d d d d d d d K. ", -" ]+, ^+/+= (+_+:+(+ Y.d d d d d d d d d d <+ ", -" [+}+, , |+1+2+ 3+d d d d d d d d d s @. ", -" 4+5+, , , n m.6+ :.u.<.`.d d d d d d 7+! ", -" 8+, , , , , 9+^ k. 0+x.S.^.d d d d a+ ", -" - b+, , , , , , c+d+A. b Z.c e+d `.f+ ", -" g+h+i+E , , , , , c+j+ k+l+3+W ", -" k.; m+n+o+p+8+4+q+ "}; diff --git a/res/phero.mp3 b/res/phero.mp3 deleted file mode 100644 index 208fe751..00000000 Binary files a/res/phero.mp3 and /dev/null differ diff --git a/res/phero2.ogg b/res/phero2.ogg deleted file mode 100644 index 99cd6d41..00000000 Binary files a/res/phero2.ogg and /dev/null differ diff --git a/res/resources.txt b/res/resources.txt deleted file mode 100644 index 983d1ac1..00000000 --- a/res/resources.txt +++ /dev/null @@ -1,11 +0,0 @@ -The following files are included in the resource archive: -Footsteps.wav - from openal.org cvs -ding.wav - from openal.org cvs -left.wav - sampled by matzon -right.wav - sampled by matzon -center.wav - sampled by matzon - -optional: -Missing_you.mod - Missing You, by Doh (Nicolas Desessart, http://doh.av7.net) -phero.mp3 - snipped from unreleased Phero track -phero2.ogg - snipped from unreleased Phero track \ No newline at end of file diff --git a/res/right.wav b/res/right.wav deleted file mode 100644 index f23dbeda..00000000 Binary files a/res/right.wav and /dev/null differ diff --git a/res/spaceinvaders/alien.gif b/res/spaceinvaders/alien.gif deleted file mode 100644 index 19bf8fcd..00000000 Binary files a/res/spaceinvaders/alien.gif and /dev/null differ diff --git a/res/spaceinvaders/alien2.gif b/res/spaceinvaders/alien2.gif deleted file mode 100644 index 199b211e..00000000 Binary files a/res/spaceinvaders/alien2.gif and /dev/null differ diff --git a/res/spaceinvaders/alien3.gif b/res/spaceinvaders/alien3.gif deleted file mode 100644 index 30358685..00000000 Binary files a/res/spaceinvaders/alien3.gif and /dev/null differ diff --git a/res/spaceinvaders/gotyou.gif b/res/spaceinvaders/gotyou.gif deleted file mode 100644 index 1c373e2e..00000000 Binary files a/res/spaceinvaders/gotyou.gif and /dev/null differ diff --git a/res/spaceinvaders/hit.wav b/res/spaceinvaders/hit.wav deleted file mode 100644 index 33dc4bd5..00000000 Binary files a/res/spaceinvaders/hit.wav and /dev/null differ diff --git a/res/spaceinvaders/loose.wav b/res/spaceinvaders/loose.wav deleted file mode 100644 index e11886ab..00000000 Binary files a/res/spaceinvaders/loose.wav and /dev/null differ diff --git a/res/spaceinvaders/pressanykey.gif b/res/spaceinvaders/pressanykey.gif deleted file mode 100644 index 72125211..00000000 Binary files a/res/spaceinvaders/pressanykey.gif and /dev/null differ diff --git a/res/spaceinvaders/ship.gif b/res/spaceinvaders/ship.gif deleted file mode 100644 index cb1db981..00000000 Binary files a/res/spaceinvaders/ship.gif and /dev/null differ diff --git a/res/spaceinvaders/shot.gif b/res/spaceinvaders/shot.gif deleted file mode 100644 index 7a76f2ea..00000000 Binary files a/res/spaceinvaders/shot.gif and /dev/null differ diff --git a/res/spaceinvaders/shot.wav b/res/spaceinvaders/shot.wav deleted file mode 100644 index dda47d2b..00000000 Binary files a/res/spaceinvaders/shot.wav and /dev/null differ diff --git a/res/spaceinvaders/start.wav b/res/spaceinvaders/start.wav deleted file mode 100644 index 3cb25b92..00000000 Binary files a/res/spaceinvaders/start.wav and /dev/null differ diff --git a/res/spaceinvaders/win.wav b/res/spaceinvaders/win.wav deleted file mode 100644 index 76250e41..00000000 Binary files a/res/spaceinvaders/win.wav and /dev/null differ diff --git a/res/spaceinvaders/youwin.gif b/res/spaceinvaders/youwin.gif deleted file mode 100644 index 697318ba..00000000 Binary files a/res/spaceinvaders/youwin.gif and /dev/null differ diff --git a/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java b/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java deleted file mode 100644 index 0e2d0165..00000000 --- a/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.lwjgl.examples.spaceinvaders; - - -import java.applet.Applet; -import java.awt.BorderLayout; -import java.awt.Canvas; -import org.lwjgl.LWJGLException; -import org.lwjgl.opengl.Display; - -public class GameApplet extends Applet { - - /** The Canvas where the LWJGL Display is added */ - Canvas display_parent; - - /** Thread which runs the main game loop */ - Thread gameThread; - - /** The Game instance */ - Game game; - - /** - * Once the Canvas is created its add notify method will call this method to - * start the LWJGL Display and game loop in another thread. - */ - public void startLWJGL() { - gameThread = new Thread() { - public void run() { - - try { - Display.setParent(display_parent); - - } catch (LWJGLException e) { - e.printStackTrace(); - } - // start game - game = new Game(false); - game.execute(); - } - }; - gameThread.start(); - } - - - /** - * Tell game loop to stop running, after which the LWJGL Display will be destoryed. - * The main thread will wait for the Display.destroy() to complete - */ - private void stopLWJGL() { - Game.gameRunning = false; - try { - gameThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public void start() { - - } - - public void stop() { - - } - - /** - * Applet Destroy method will remove the canvas, before canvas is destroyed it will notify - * stopLWJGL() to stop main game loop and to destroy the Display - */ - public void destroy() { - remove(display_parent); - super.destroy(); - System.out.println("Clear up"); - } - - /** - * initialise applet by adding a canvas to it, this canvas will start the LWJGL Display and game loop - * in another thread. It will also stop the game loop and destroy the display on canvas removal when - * applet is destroyed. - */ - public void init() { - setLayout(new BorderLayout()); - try { - display_parent = new Canvas() { - public void addNotify() { - super.addNotify(); - startLWJGL(); - } - public void removeNotify() { - stopLWJGL(); - super.removeNotify(); - } - }; - display_parent.setSize(getWidth(),getHeight()); - add(display_parent); - display_parent.setFocusable(true); - display_parent.requestFocus(); - display_parent.setIgnoreRepaint(true); - setVisible(true); - } catch (Exception e) { - System.err.println(e); - throw new RuntimeException("Unable to create display"); - } - } -} \ No newline at end of file diff --git a/src/java/org/lwjgl/opengl/AWTSurfaceLock.java b/src/java/org/lwjgl/opengl/AWTSurfaceLock.java index b0935dbc..500ee2a0 100644 --- a/src/java/org/lwjgl/opengl/AWTSurfaceLock.java +++ b/src/java/org/lwjgl/opengl/AWTSurfaceLock.java @@ -33,7 +33,6 @@ package org.lwjgl.opengl; import java.awt.Canvas; import java.awt.Component; -import java.applet.Applet; import java.nio.ByteBuffer; import java.security.AccessController; import java.security.PrivilegedActionException; diff --git a/src/java/org/lwjgl/test/NativeTest.java b/src/java/org/lwjgl/test/NativeTest.java index c9ff73f1..ddb7d41f 100644 --- a/src/java/org/lwjgl/test/NativeTest.java +++ b/src/java/org/lwjgl/test/NativeTest.java @@ -56,7 +56,7 @@ public class NativeTest { public static void main(String[] args) { // try to "load" awt - work around for headless issue on linux Toolkit.getDefaultToolkit(); - new NativeTest().invokeSys(); - System.out.println("OK"); + new NativeTest().invokeSys(); + System.out.println("OK"); } } diff --git a/src/java/org/lwjgl/test/applet/AppletLoaderTest.java b/src/java/org/lwjgl/test/applet/AppletLoaderTest.java deleted file mode 100644 index 05ecfaa0..00000000 --- a/src/java/org/lwjgl/test/applet/AppletLoaderTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - -import java.applet.Applet; -import java.awt.BorderLayout; -import java.awt.Canvas; - -public class AppletLoaderTest extends Applet { - - Test test; - - public void destroy() { - super.destroy(); - System.out.println("*** destroy ***"); - } - - public void start() { - super.start(); - System.out.println("*** start ***"); - } - - public void stop() { - super.stop(); - System.out.println("*** stop ***"); - test.stop(); - } - - public void init() { - System.out.println("*** init ***"); - - setLayout(new BorderLayout()); - try { - test = (Test) Class.forName(getParameter("test")).newInstance(); - Canvas canvas = (Canvas) test; - canvas.setSize(getWidth(), getHeight()); - add(canvas); - } catch (Exception e) { - e.printStackTrace(); - } - test.start(); - } -} diff --git a/src/java/org/lwjgl/test/applet/ControllersTest.java b/src/java/org/lwjgl/test/applet/ControllersTest.java deleted file mode 100644 index 7f39ad60..00000000 --- a/src/java/org/lwjgl/test/applet/ControllersTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - -import java.awt.Canvas; - -import org.lwjgl.LWJGLException; -import org.lwjgl.input.Controllers; - -public class ControllersTest extends Canvas implements Test { - public void start() { - try { - Controllers.create(); - } catch (LWJGLException e) { - e.printStackTrace(); - return; - } - System.out.println("Controllers.getControllerCount() = " + Controllers.getControllerCount()); - } - - public void stop() { - } -} diff --git a/src/java/org/lwjgl/test/applet/GearsApplet.java b/src/java/org/lwjgl/test/applet/GearsApplet.java deleted file mode 100644 index 63b646ec..00000000 --- a/src/java/org/lwjgl/test/applet/GearsApplet.java +++ /dev/null @@ -1,405 +0,0 @@ -package org.lwjgl.test.applet; - -import java.applet.Applet; -import java.awt.BorderLayout; -import java.awt.Canvas; -import java.nio.FloatBuffer; -import org.lwjgl.BufferUtils; -import org.lwjgl.LWJGLException; -import org.lwjgl.LWJGLUtil; -import org.lwjgl.Sys; -import org.lwjgl.opengl.Display; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GLContext; - -import static org.lwjgl.opengl.ARBTransposeMatrix.*; -import static org.lwjgl.opengl.GL11.*; - -public class GearsApplet extends Applet { - - /** The Canvas where the LWJGL Display is added */ - Canvas display_parent; - - /** Thread which runs the main game loop */ - Thread gameThread; - - /** is the game loop running */ - boolean running; - - /** variables used to rotate the view */ - private float view_rotx = 20.0f; - private float view_roty = 30.0f; - private float view_rotz; - - private int gear1; - private int gear2; - private int gear3; - private float angle; - - boolean keyDown; - - private int prevMouseX, prevMouseY; - private boolean mouseButtonDown; - - - /** - * Once the Canvas is created its add notify method will call this method to - * start the LWJGL Display and game loop in another thread. - */ - public void startLWJGL() { - gameThread = new Thread() { - public void run() { - running = true; - try { - Display.setParent(display_parent); - //Display.setVSyncEnabled(true); - Display.create(); - initGL(); - } catch (LWJGLException e) { - e.printStackTrace(); - } - gameLoop(); - } - }; - gameThread.start(); - } - - - /** - * Tell game loop to stop running, after which the LWJGL Display will be destoryed. - * The main thread will wait for the Display.destroy() to complete - */ - private void stopLWJGL() { - running = false; - try { - gameThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public void start() { - - } - - public void stop() { - - } - - /** - * Applet Destroy method will remove the canvas, before canvas is destroyed it will notify - * stopLWJGL() to stop main game loop and to destroy the Display - */ - public void destroy() { - remove(display_parent); - super.destroy(); - System.out.println("Clear up"); - } - - /** - * initialise applet by adding a canvas to it, this canvas will start the LWJGL Display and game loop - * in another thread. It will also stop the game loop and destroy the display on canvas removal when - * applet is destroyed. - */ - public void init() { - setLayout(new BorderLayout()); - try { - display_parent = new Canvas() { - public void addNotify() { - super.addNotify(); - startLWJGL(); - } - public void removeNotify() { - stopLWJGL(); - super.removeNotify(); - } - }; - display_parent.setSize(getWidth(),getHeight()); - add(display_parent); - display_parent.setFocusable(true); - display_parent.requestFocus(); - display_parent.setIgnoreRepaint(true); - //setResizable(true); - setVisible(true); - } catch (Exception e) { - System.err.println(e); - throw new RuntimeException("Unable to create display"); - } - } - - public void gameLoop() { - long startTime = System.currentTimeMillis() + 5000; - long fps = 0; - - while(running) { - angle += 2.0f; - - // draw the gears - drawLoop(); - - Display.update(); - - if (startTime > System.currentTimeMillis()) { - fps++; - } else { - long timeUsed = 5000 + (startTime - System.currentTimeMillis()); - startTime = System.currentTimeMillis() + 5000; - System.out.println(fps + " frames 2 in " + timeUsed / 1000f + " seconds = " - + (fps / (timeUsed / 1000f))); - fps = 0; - } - - if (Mouse.isButtonDown(0)) { - if (!mouseButtonDown) { - prevMouseX = Mouse.getX(); - prevMouseY= Mouse.getY(); - } - mouseButtonDown = true; - } - else { - mouseButtonDown = false; - } - - if (mouseButtonDown) { - int x = Mouse.getX(); - int y = Mouse.getY(); - - float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)display_parent.getWidth()); - float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)display_parent.getHeight()); - - prevMouseX = x; - prevMouseY = y; - - view_rotx += thetaX; - view_roty += thetaY; - } - - // F Key Pressed (i.e. released) - if (keyDown && !Keyboard.isKeyDown(Keyboard.KEY_F)) { - keyDown = false; - - try { - if (Display.isFullscreen()) { - Display.setFullscreen(false); - } - else { - Display.setFullscreen(true); - } - } catch (LWJGLException e) { - e.printStackTrace(); - } - } - } - - Display.destroy(); - } - - public void drawLoop() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - - glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); - glRotatef(view_roty, 0.0f, 1.0f, 0.0f); - glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); - - glPushMatrix(); - glTranslatef(-3.0f, -2.0f, 0.0f); - glRotatef(angle, 0.0f, 0.0f, 1.0f); - glCallList(gear1); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(3.1f, -2.0f, 0.0f); - glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); - glCallList(gear2); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(-3.1f, 4.2f, 0.0f); - glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); - glCallList(gear3); - glPopMatrix(); - - glPopMatrix(); - } - - protected void initGL() { - try { - // setup ogl - FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); - FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f}); - FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f}); - FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f}); - - pos.flip(); - red.flip(); - green.flip(); - blue.flip(); - - glLight(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_CULL_FACE); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - - /* make the gears */ - gear1 = glGenLists(1); - glNewList(gear1, GL_COMPILE); - glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - gear(1.0f, 4.0f, 1.0f, 20, 0.7f); - glEndList(); - - gear2 = glGenLists(1); - glNewList(gear2, GL_COMPILE); - glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); - gear(0.5f, 2.0f, 2.0f, 10, 0.7f); - glEndList(); - - gear3 = glGenLists(1); - glNewList(gear3, GL_COMPILE); - glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); - gear(1.3f, 2.0f, 0.5f, 10, 0.7f); - glEndList(); - glEnable(GL_NORMALIZE); - glMatrixMode(GL_PROJECTION); - - System.err.println("LWJGL: " + Sys.getVersion() + " / " + LWJGLUtil.getPlatformName()); - System.err.println("GL_VENDOR: " + glGetString(GL_VENDOR)); - System.err.println("GL_RENDERER: " + glGetString(GL_RENDERER)); - System.err.println("GL_VERSION: " + glGetString(GL_VERSION)); - System.err.println(); - System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix); - - if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) { - // --- not using extensions - glLoadIdentity(); - } else { - // --- using extensions - final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put( - new float[] { 1, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1}); - identityTranspose.flip(); - glLoadTransposeMatrixARB(identityTranspose); - } - float h = (float) display_parent.getHeight() / (float) display_parent.getWidth(); - glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -40.0f); - } catch (Exception e) { - System.err.println(e); - running = false; - } - } - - /** - * Draw a gear wheel. You'll probably want to call this function when - * building a display list since we do a lot of trig here. - * - * @param inner_radius radius of hole at center - * @param outer_radius radius at center of teeth - * @param width width of gear - * @param teeth number of teeth - * @param tooth_depth depth of tooth - */ - private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { - int i; - float r0, r1, r2; - float angle, da; - float u, v, len; - - r0 = inner_radius; - r1 = outer_radius - tooth_depth / 2.0f; - r2 = outer_radius + tooth_depth / 2.0f; - da = 2.0f * (float) Math.PI / teeth / 4.0f; - glShadeModel(GL_FLAT); - glNormal3f(0.0f, 0.0f, 1.0f); - /* draw front face */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); - if (i < teeth) { - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), - width * 0.5f); - } - } - glEnd(); - - /* draw front sides of teeth */ - glBegin(GL_QUADS); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f); - } - glEnd(); - - /* draw back face */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); - } - glEnd(); - - /* draw back sides of teeth */ - glBegin(GL_QUADS); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); - } - glEnd(); - - /* draw outward faces of teeth */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); - u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle); - v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle); - len = (float) Math.sqrt(u * u + v * v); - u /= len; - v /= len; - glNormal3f(v, -u, 0.0f); - glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); - glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); - glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f); - glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); - u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da); - v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da); - glNormal3f(v, -u, 0.0f); - glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); - glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); - } - glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f); - glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f); - glEnd(); - - glShadeModel(GL_SMOOTH); - /* draw inside radius cylinder */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f); - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); - glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); - } - glEnd(); - } -} \ No newline at end of file diff --git a/src/java/org/lwjgl/test/applet/OpenAL.java b/src/java/org/lwjgl/test/applet/OpenAL.java deleted file mode 100644 index 4ce774db..00000000 --- a/src/java/org/lwjgl/test/applet/OpenAL.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - -import java.nio.IntBuffer; - -import org.lwjgl.BufferUtils; -import org.lwjgl.LWJGLException; -import org.lwjgl.openal.AL; -import org.lwjgl.openal.AL10; -import org.lwjgl.opengl.AWTGLCanvas; -import org.lwjgl.opengl.Display; -import org.lwjgl.util.WaveData; - -import static org.lwjgl.opengl.GL11.*; - -public class OpenAL extends AWTGLCanvas implements Test { - - float angle; - - // create 1 buffer and 1 source - IntBuffer buffers = BufferUtils.createIntBuffer(1); - IntBuffer sources = BufferUtils.createIntBuffer(1); - - public OpenAL() throws LWJGLException { - - try { - AL.create(); - } catch (Exception e) { - System.out.println("Unable to create OpenAL.\nPlease make sure that OpenAL is available on this system. Exception: " + e); - return; - } - - Thread t = new Thread() { - - public void run() { - while (true) { - if (isVisible()) - repaint(); - Display.sync(60); - } - } - }; - t.setDaemon(true); - t.start(); - } - - private void playOpenAL() { - int lastError; - - // al generate buffers and sources - buffers.position(0).limit(1); - AL10.alGenBuffers(buffers); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - sources.position(0).limit(1); - AL10.alGenSources(sources); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - // load wave data from buffer - WaveData wavefile = WaveData.create(getClass().getClassLoader().getResourceAsStream("Footsteps.wav")); - - //copy to buffers - AL10.alBufferData(buffers.get(0), wavefile.format, wavefile.data, wavefile.samplerate); - - //unload file again - wavefile.dispose(); - - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - //set up source input - AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - //lets loop the sound - AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - //play source 0 - AL10.alSourcePlay(sources.get(0)); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - } - - private void exit(int error) { - System.out.println("OpenAL Error: " + AL10.alGetString(error)); - } - - public void paintGL() { - glClear(GL_COLOR_BUFFER_BIT); - glMatrixMode(GL_PROJECTION_MATRIX); - glLoadIdentity(); - glOrtho(0, 640, 0, 480, 1, -1); - glMatrixMode(GL_MODELVIEW_MATRIX); - - glPushMatrix(); - glTranslatef(320, 240, 0.0f); - glRotatef(angle, 0, 0, 1.0f); - glBegin(GL_QUADS); - glVertex2i(-50, -50); - glVertex2i(50, -50); - glVertex2i(50, 50); - glVertex2i(-50, 50); - glEnd(); - glPopMatrix(); - - angle += 1; - - try { - swapBuffers(); - } catch (Exception e) {/*OK*/ - } - } - - public void start() { - playOpenAL(); - } - - public void stop() { - int lastError; - - //stop source 0 - AL10.alSourceStop(sources.get(0)); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - //delete buffers and sources - sources.position(0).limit(1); - AL10.alDeleteSources(sources); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - buffers.position(0).limit(1); - AL10.alDeleteBuffers(buffers); - if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { - exit(lastError); - } - - AL.destroy(); - } -} diff --git a/src/java/org/lwjgl/test/applet/OpenGL.java b/src/java/org/lwjgl/test/applet/OpenGL.java deleted file mode 100644 index 59d3dbc3..00000000 --- a/src/java/org/lwjgl/test/applet/OpenGL.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - -import org.lwjgl.LWJGLException; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.AWTGLCanvas; - -import static org.lwjgl.opengl.GL11.*; - -public class OpenGL extends AWTGLCanvas implements Test { - - float angle; - float x; - float y; - - public OpenGL() throws LWJGLException { - } - - public void initGL() { - glMatrixMode(GL_PROJECTION_MATRIX); - glLoadIdentity(); - glOrtho(0, 640, 0, 480, 1, -1); - x = 320; - y = 240; - glMatrixMode(GL_MODELVIEW_MATRIX); - setVSyncEnabled(true); - } - - public void paintGL() { - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(x, y, 0.0f); - glRotatef(angle, 0, 0, 1.0f); - glBegin(GL_QUADS); - glVertex2i(-50, -50); - glVertex2i(50, -50); - glVertex2i(50, 50); - glVertex2i(-50, 50); - glEnd(); - glPopMatrix(); - - angle += 1; - - if (Mouse.isCreated()) { - Mouse.poll(); - while (Mouse.next()) { - x += Mouse.getEventDX(); - y += Mouse.getEventDY(); - } - } - if (Keyboard.isCreated()) { - Keyboard.poll(); - } - while (Keyboard.isCreated() && Keyboard.next()) { - if (Keyboard.getEventKey() != Keyboard.KEY_NONE) { - String key_name = Keyboard.getKeyName(Keyboard.getEventKey()); - if (Keyboard.getEventKeyState()) { - switch (Keyboard.getEventKey()) { - case Keyboard.KEY_G: - Mouse.setGrabbed(!Mouse.isGrabbed()); - break; - default: - break; - } - System.out.println("Pressed: " + key_name); - } else - System.out.println("Released: " + key_name); - } - if (Keyboard.getEventCharacter() != Keyboard.CHAR_NONE) - System.out.println("Typed: " + Keyboard.getEventCharacter()); - } - if (Keyboard.isCreated()) { - if (Keyboard.isKeyDown(Keyboard.KEY_UP)) - y += 5; - else if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) - y -= 5; - if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) - x -= 5; - else if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) - x += 5; - } - try { - swapBuffers(); - if (isVisible()) { - Thread.yield(); // Helps input responsiveness on linux - repaint(); - } - } catch (Exception e) {/*OK*/ - } - } - - public void start() { - } - - public void stop() { - } -} diff --git a/src/java/org/lwjgl/test/applet/Speed.java b/src/java/org/lwjgl/test/applet/Speed.java deleted file mode 100644 index 87317da8..00000000 --- a/src/java/org/lwjgl/test/applet/Speed.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - -import org.lwjgl.LWJGLException; -import org.lwjgl.opengl.AWTGLCanvas; - -import static org.lwjgl.opengl.GL11.*; - -public class Speed extends AWTGLCanvas implements Test { - - private float angle; - private long startTime = System.currentTimeMillis() + 5000; - private long fps; - - public Speed() throws LWJGLException { - } - - public void paintGL() { - glClear(GL_COLOR_BUFFER_BIT); - glMatrixMode(GL_PROJECTION_MATRIX); - glLoadIdentity(); - glOrtho(0, 640, 0, 480, 1, -1); - glMatrixMode(GL_MODELVIEW_MATRIX); - - glPushMatrix(); - glTranslatef(320, 240, 0.0f); - glRotatef(angle, 0, 0, 1.0f); - glBegin(GL_QUADS); - glVertex2i(-50, -50); - glVertex2i(50, -50); - glVertex2i(50, 50); - glVertex2i(-50, 50); - glEnd(); - glPopMatrix(); - - angle += 1; - - try { - swapBuffers(); - if (isVisible()) { - Thread.yield(); // Helps input responsiveness on linux - repaint(); - } - } catch (Exception e) {/*OK*/ - } - if (startTime > System.currentTimeMillis()) { - fps++; - } else { - long timeUsed = 5000 + (startTime - System.currentTimeMillis()); - startTime = System.currentTimeMillis() + 5000; - System.out.println(fps + " frames in " + timeUsed / 1000f + " seconds = " - + (fps / (timeUsed / 1000f))); - fps = 0; - } - } - - public void start() { - } - - public void stop() { - } -} diff --git a/src/java/org/lwjgl/test/applet/Test.java b/src/java/org/lwjgl/test/applet/Test.java deleted file mode 100644 index 18bea65b..00000000 --- a/src/java/org/lwjgl/test/applet/Test.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.test.applet; - - -public interface Test { - void start(); - void stop(); -} diff --git a/src/java/org/lwjgl/util/applet/AppletLoader.java b/src/java/org/lwjgl/util/applet/AppletLoader.java deleted file mode 100644 index 83690e2e..00000000 --- a/src/java/org/lwjgl/util/applet/AppletLoader.java +++ /dev/null @@ -1,2264 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl.util.applet; - -import org.lwjgl.LWJGLUtil; - -import java.applet.Applet; -import java.applet.AppletStub; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.EventQueue; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.MediaTracker; -import java.awt.image.ImageObserver; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FilePermission; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.net.HttpURLConnection; -import java.net.JarURLConnection; -import java.net.SocketPermission; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLConnection; -import java.security.AccessControlException; -import java.security.AccessController; -import java.security.AllPermission; -import java.security.CodeSource; -import java.security.PermissionCollection; -import java.security.Permissions; -import java.security.PrivilegedExceptionAction; -import java.security.cert.Certificate; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Queue; -import java.util.StringTokenizer; -import java.util.Vector; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarOutputStream; -import java.util.jar.Pack200; -import java.util.zip.CRC32; -import java.util.zip.CheckedInputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -/** - *

- * The AppletLoader enables deployment of LWJGL to applets in an easy - * and polished way. The loader will display a configurable logo and progressbar - * while the relevant jars (generic and native) are downloaded from a specified source. - *

- *

- * The downloaded jars are extracted to the users temporary directory - and if enabled, cached for - * faster loading in future uses. - *

- *

- * The following applet parameters are required: - *

    - *
  • al_main - [String] Full package and class the applet to instantiate and display when loaded.
  • - *
  • al_jars - [String] Comma separated list of jars to download.
  • - *

    - *

  • al_windows - [String] Jar containing native files for windows.
  • - *
  • al_linux - [String] Jar containing native files for linux.
  • - *
  • al_mac - [String] Jar containing native files for mac.
  • - *
  • al_solaris - [String] Jar containing native files for solaris.
  • - *
  • al_freebsd - [String] Jar containing native files for freebsd.
  • - *
  • al_openbsd - [String] Jar containing native files for openbsd.
  • - *
- *

- *

- * Additionally the following parameters can be supplied to tweak the behaviour of the AppletLoader. - *

    - *
  • al_cache - [boolean] Whether to use cache system. Default: true.
  • - *
  • al_version - [int or float] Version of deployment. If this is specified, the jars will be cached and - * reused if the version matches. If version doesn't match all of the files are reloaded.
  • - * - *
  • al_debug - [boolean] Whether to enable debug mode. Default: false.
  • - *
  • al_min_jre - [String] Specify the minimum jre version that the applet requires, should be in format like 1.8.0_291-b10 or a subset like 1.8 Default: 1.8.
  • - *
  • al_prepend_host - [boolean] Whether to limit caching to this domain, disable if your applet is hosted on multiple domains and needs to share the cache. Default: true.
  • - *
  • al_lookup_threads - [int] Specify the number of concurrent threads to use to get file information before downloading. Default: 1.
  • - *

    - *

  • al_windows64 - [String] If specified it will be used instead of al_windows on 64bit windows systems.
  • - *
  • al_windows32 - [String] If specified it will be used instead of al_windows on 32bit windows systems.
  • - *
  • al_linux64 - [String] If specified it will be used instead of al_linux on 64bit linux systems.
  • - *
  • al_linux32 - [String] If specified it will be used instead of al_linux on 32bit linux systems.
  • - *
  • al_mac32 - [String] If specified it will be used instead of al_mac on 64bit mac systems.
  • - *
  • al_mac64 - [String] If specified it will be used instead of al_mac on 32bit mac systems.
  • - *
  • al_macppc - [String] If specified it will be used instead of al_mac on PPC mac systems.
  • - *

    - *

  • boxbgcolor - [String] any String AWT color ("red", "blue", etc), RGB (0-255) or hex formated color (#RRGGBB) to use as background. Default: #ffffff.
  • - *
  • boxfgcolor - [String] any String AWT color ("red", "blue", etc), RGB (0-255) or hex formated color (#RRGGBB) to use as foreground. Default: #000000.
  • - *

    - *

  • al_logo - [String Path of of the logo resource to paint while loading.Default: "appletlogo.gif".
  • - *
  • al_progressbar - [String] Path of the progressbar resource to paint on top of the logo, width clipped by percentage.Default: "appletprogress.gif".
  • - *

    - *

  • lwjgl_arguments -
  • [String] used to pass LWJGL parameters to LWJGL e.g. ("-Dorg.lwjgl.input.Mouse.allowNegativeMouseCoords=true -Dorg.lwjgl.util.Debug=true"). - *
- *

- * @author kappaOne - * @author Brian Matzon - * @version $Revision$ - * $Id$ - * - * Contributors: - *
    - *
  • Arielsan
  • - *
  • Bobjob
  • - *
  • Dashiva
  • - *
  • Dr_evil
  • - *
  • Elias Naur
  • - *
  • Kevin Glass
  • - *
  • Matthias Mann
  • - *
  • Mickelukas
  • - *
  • NateS
  • - *
  • Pelle Johnsen
  • - *
  • Riven
  • - *
  • Ruben01
  • - *
  • Shannon Smith
  • - *
- * - */ -public class AppletLoader extends Applet implements Runnable, AppletStub { - - /** initializing */ - public static final int STATE_INIT = 1; - - /** checking version of jre */ - public static final int STATE_CHECK_JRE_VERSION = 2; - - /** determining which packages that are required */ - public static final int STATE_DETERMINING_PACKAGES = 3; - - /** checking for already downloaded files */ - public static final int STATE_CHECKING_CACHE = 4; - - /** checking if any updates are available for cache files */ - public static final int STATE_CHECKING_FOR_UPDATES = 5; - - /** downloading packages */ - public static final int STATE_DOWNLOADING = 6; - - /** extracting packages */ - public static final int STATE_EXTRACTING_PACKAGES = 7; - - /** validating packages */ - public static final int STATE_VALIDATING_PACKAGES = 8; - - /** updating the classpath */ - public static final int STATE_UPDATING_CLASSPATH = 9; - - /** switching to real applet */ - public static final int STATE_SWITCHING_APPLET = 10; - - /** initializing real applet */ - public static final int STATE_INITIALIZE_REAL_APPLET = 11; - - /** stating real applet */ - public static final int STATE_START_REAL_APPLET = 12; - - /** done */ - public static final int STATE_DONE = 13; - - /** used to calculate length of progress bar */ - protected volatile int percentage; - - /** total size of download in bytes */ - protected int totalDownloadSize; - - /** current size of extracted in bytes */ - protected int currentSizeExtract; - - /** total size of extracted in bytes */ - protected int totalSizeExtract; - - /** logo to be shown while loading */ - protected Image logo, logoBuffer; - - /** progressbar to render while loading */ - protected Image progressbar, progressbarBuffer; - - /** offscreen image used */ - protected Image offscreen; - - /** set to true while painting is done */ - protected boolean painting; - - /** background color of applet */ - protected Color bgColor = Color.white; - - /** color to write foreground in */ - protected Color fgColor = Color.black; - - /** urls of the jars to download */ - protected URL[] urlList; - - /** classLoader used to add downloaded jars to the classpath */ - protected ClassLoader classLoader; - - /** actual thread that does the loading */ - protected Thread loaderThread; - - /** animation thread that renders our load screen while loading */ - protected Thread animationThread; - - /** applet to load after all downloads are complete */ - protected Applet lwjglApplet; - - /** whether we're running in debug mode */ - protected boolean debugMode; - - /** whether to prepend host to cache path */ - protected boolean prependHost; - - /** Used to store file names with lastModified time */ - protected HashMap filesLastModified; - - /** Sizes of files to download */ - protected int[] fileSizes; - - /** Number of native jars */ - protected int nativeJarCount; - - /** whether to use caching system, only download files that have changed */ - protected boolean cacheEnabled; - - /** String to display as a subtask */ - protected String subtaskMessage = ""; - - /** state of applet loader */ - protected volatile int state = STATE_INIT; - - /** whether lzma is supported */ - protected boolean lzmaSupported; - - /** whether pack200 is supported */ - protected boolean pack200Supported; - - /** whether to run in headless mode */ - protected boolean headless = false; - - /** whether to switch applets in headless mode or wait longer */ - protected boolean headlessWaiting = true; - - /** messages to be passed via liveconnect in headless mode */ - protected String[] headlessMessage; - - /** threads to use when fetching information of files to be downloaded */ - protected int concurrentLookupThreads; - - /** whether a fatal error occurred */ - protected boolean fatalError; - - /** whether a certificate refused error occurred */ - protected boolean certificateRefused; - - /** whether the minimum required JRE version is not found */ - protected boolean minimumJreNotFound; - - /** generic error message to display on error */ - protected String[] genericErrorMessage = { "An error occured while loading the applet.", - "Please contact support to resolve this issue.", - ""}; - - /** error message to display if user refuses to accept certificate*/ - protected String[] certificateRefusedMessage = { "Permissions for Applet Refused.", - "Please accept the permissions dialog to allow", - "the applet to continue the loading process."}; - - /** error message to display if minimum JRE version is not met */ - protected String[] minimumJREMessage = { "Your version of Java is out of date.", - "Visit java.com to get the latest version.", - "Java or greater is required."}; - - /** fatal error message to display */ - protected String[] errorMessage; - - /** have natives been loaded by another instance of this applet */ - protected static boolean natives_loaded; - - /* - * @see java.applet.Applet#init() - */ - public void init() { - setState(STATE_INIT); - - // sanity check - String[] requiredArgs = {"al_main", "al_jars"}; - for ( String requiredArg : requiredArgs ) { - if ( getParameter(requiredArg) == null ) { - fatalErrorOccured("missing required applet parameter: " + requiredArg, null); - return; - } - } - - // whether to use cache system - cacheEnabled = getBooleanParameter("al_cache", true); - - // whether to run in debug mode - debugMode = getBooleanParameter("al_debug", false); - - // whether to prepend host to cache path - prependHost = getBooleanParameter("al_prepend_host", true); - - // whether to run in headless mode - headless = getBooleanParameter("al_headless", false); - - // obtain the number of concurrent lookup threads to use - concurrentLookupThreads = getIntParameter("al_lookup_threads", 1); // defaults to 1 - - // get colors of applet - bgColor = getColor("boxbgcolor", Color.white); - setBackground(bgColor); - fgColor = getColor("boxfgcolor", Color.black); - - if (!headless) { - // load logos - logo = getImage(getStringParameter("al_logo", "appletlogo.gif")); - progressbar = getImage(getStringParameter("al_progressbar", "appletprogress.gif")); - } - - // check for lzma support - try { - Class.forName("LZMA.LzmaInputStream"); - lzmaSupported = true; - } catch (Throwable e) { - /* no lzma support */ - } - - // check pack200 support - try { - java.util.jar.Pack200.class.getSimpleName(); - pack200Supported = true; - } catch (Throwable e) { - /* no pack200 support */ - } - } - - /** - * Generates a stacktrace in the form of a string - * @param exception Exception to make stacktrace of - * @return Stacktrace of exception in the form of a string - */ - private static String generateStacktrace(Exception exception) { - Writer result = new StringWriter(); - PrintWriter printWriter = new PrintWriter(result); - exception.printStackTrace(printWriter); - return result.toString(); - } - - /* - * @see java.applet.Applet#start() - */ - public void start() { - if (lwjglApplet != null) { - lwjglApplet.start(); - } - else { - if(loaderThread == null && !fatalError) { - loaderThread = new Thread(this); - loaderThread.setName("AppletLoader.loaderThread"); - loaderThread.start(); - - if (!headless) { - animationThread = new Thread() { - public void run() { - while(loaderThread != null) { - repaint(); - AppletLoader.this.sleep(100); - } - animationThread = null; - } - }; - animationThread.setName("AppletLoader.animationthread"); - animationThread.start(); - } - } - } - } - - /* - * @see java.applet.Applet#stop() - */ - public void stop() { - if (lwjglApplet != null) { - lwjglApplet.stop(); - } - } - - /* - * @see java.applet.Applet#destroy() - */ - public void destroy() { - if (lwjglApplet != null) { - lwjglApplet.destroy(); - } - } - - /** - * Clean up resources - */ - protected void cleanUp() { - progressbar = null; - logo = null; - - logoBuffer = null; - progressbarBuffer = null; - - offscreen = null; - } - - /** - * Retrieves the applet that has been loaded. Useful for liveconnect. - */ - public Applet getApplet() { - return lwjglApplet; - } - - /** - * Retrieves the current status of the AppletLoader and is - * used by liveconnect when running in headless mode. - * - * This method will return the current progress of the AppletLoader - * as a value from 0-100. In the case of a fatal error it will - * return -1. If the certificate is refused it will return -2. - * If the minimum jre requirement is not met will return -3. - * - * When method returns 100 the AppletLoader will sleep until the - * method is called again. When called again it will switch to the - * LWJGL Applet. This is a useful trigger to start the LWJGL applet - * when needed. - */ - public int getStatus() { - if (fatalError) { - headlessMessage = errorMessage; - - if (certificateRefused) return -2; - if (minimumJreNotFound) return -3; - return -1; - } - - if (percentage == 100 && headlessWaiting) { - headlessWaiting = false; - } - - if (percentage == 95) { - percentage = 100; // ready to switch applet - } - - String[] message = {getDescriptionForState(), subtaskMessage}; - headlessMessage = message; - - return percentage; - } - - /** - * Retrieves the current message for the current status. - * Used by liveconnect when running in headless mode. - */ - public String[] getMessages() { - return headlessMessage; - } - - /** - * Transfers the call of AppletResize from the stub to the lwjglApplet. - */ - public void appletResize(int width, int height) { - resize(width, height); - } - - /* - * @see java.awt.Container#update(java.awt.Graphics) - */ - public final void update(Graphics g) { - paint(g); - } - - /* - * @see java.awt.Container#paint(java.awt.Graphics) - */ - public void paint(Graphics g) { - // don't paint loader if applet loaded - if(state == STATE_DONE) { - cleanUp(); // clean up resources - return; - } - - // no drawing in headless mode - if (headless) return; - - // create offscreen if missing - if (offscreen == null) { - offscreen = createImage(getWidth(), getHeight()); - - // create buffers for animated gifs - if (logo != null) { - logoBuffer = createImage(logo.getWidth(null), logo.getHeight(null)); - // add image observer, it will notify when next animated gif frame is ready - offscreen.getGraphics().drawImage(logo, 0, 0, this); - // in case image is not animated fill image buffer once - imageUpdate(logo, ImageObserver.FRAMEBITS, 0, 0, 0, 0); - } - - if (progressbar != null) { - progressbarBuffer = createImage(progressbar.getWidth(null), progressbar.getHeight(null)); - // add image observer, it will notify when next animated gif frame is ready - offscreen.getGraphics().drawImage(progressbar, 0, 0, this); - // in case image is not animated fill image buffer once - imageUpdate(progressbar, ImageObserver.FRAMEBITS, 0, 0, 0, 0); - } - } - - // draw everything onto an image before drawing to avoid flicker - Graphics og = offscreen.getGraphics(); - FontMetrics fm = og.getFontMetrics(); - - // clear background color - og.setColor(bgColor); - og.fillRect(0, 0, offscreen.getWidth(null), offscreen.getHeight(null)); - - og.setColor(fgColor); - - // if we had a failure of some sort, notify the user - if (fatalError) { - for(int i=0; i 0) { - messageX = (offscreen.getWidth(null) - fm.stringWidth(subtaskMessage)) / 2; - og.drawString(subtaskMessage, messageX, messageY+20); - } - - // draw loading progress bar, clipping it depending on percentage done - if (progressbar != null) { - int barSize = (progressbar.getWidth(null) * percentage) / 100; - og.clipRect(x-progressbar.getWidth(null)/2, 0, barSize, offscreen.getHeight(null)); - og.drawImage(progressbarBuffer, x-progressbar.getWidth(null)/2, y-progressbar.getHeight(null)/2, this); - } - - painting = false; - } - - og.dispose(); - - // finally draw it all centred - g.drawImage(offscreen, (getWidth() - offscreen.getWidth(null))/2, (getHeight() - offscreen.getHeight(null))/2, null); - } - - /** - * When an animated gif frame is ready to be drawn the ImageObserver - * will call this method. - * - * The Image frame is copied into a buffer, which is then drawn. - * This is done to prevent image tearing on gif animations. - */ - public boolean imageUpdate(Image img, int flag, int x, int y, int width, int height) { - - // finish with this ImageObserver - if (state == STATE_DONE) return false; - - // if image frame is ready to be drawn and is currently not being painted - if (flag == ImageObserver.FRAMEBITS && !painting) { - Image buffer; - - // select which buffer to fill - if (img == logo) buffer = logoBuffer; - else buffer = progressbarBuffer; - - Graphics g = buffer.getGraphics(); - - // clear background on buffer - g.setColor(bgColor); - g.fillRect(0, 0, buffer.getWidth(null), buffer.getHeight(null)); - - // buffer background is cleared, so draw logo under progressbar - if (img == progressbar && logo != null) { - g.drawImage(logoBuffer, progressbar.getWidth(null)/2-logo.getWidth(null)/2, - progressbar.getHeight(null)/2-logo.getHeight(null)/2, null); - } - - g.drawImage(img, 0, 0, this); - g.dispose(); - - repaint(); - } - - return true; - } - - /** - * @return string describing the state of the loader - */ - protected String getDescriptionForState() { - switch (state) { - case STATE_INIT: - return "Initializing loader"; - case STATE_CHECK_JRE_VERSION: - return "Checking version"; - case STATE_DETERMINING_PACKAGES: - return "Determining packages to load"; - case STATE_CHECKING_CACHE: - return "Calculating download size"; - case STATE_CHECKING_FOR_UPDATES: - return "Checking for updates"; - case STATE_DOWNLOADING: - return "Downloading packages"; - case STATE_EXTRACTING_PACKAGES: - return "Extracting downloaded packages"; - case STATE_VALIDATING_PACKAGES: - return "Validating packages"; - case STATE_UPDATING_CLASSPATH: - return "Updating classpath"; - case STATE_SWITCHING_APPLET: - return "Switching applet"; - case STATE_INITIALIZE_REAL_APPLET: - return "Initializing real applet"; - case STATE_START_REAL_APPLET: - return "Starting real applet"; - case STATE_DONE: - return "Done loading"; - default: - return "unknown state"; - } - } - - /** - * Trims the passed file string based on the available capabilities - * @param file string of files to be trimmed - * @return trimmed string based on capabilities of client - */ - protected String trimExtensionByCapabilities(String file) { - if (!pack200Supported) { - file = file.replace(".pack", ""); - } - - if (!lzmaSupported && file.endsWith(".lzma")) { - file = file.replace(".lzma", ""); - System.out.println("LZMA decoder (lzma.jar) not found, trying " + file + " without lzma extension."); - } - return file; - } - - /** - * Reads list of jars to download and adds the urls to urlList - * also finds out which OS you are on and adds appropriate native - * jar to the urlList - */ - protected void loadJarURLs() throws Exception { - setState(STATE_DETERMINING_PACKAGES); - - // jars to load - String jarList = getParameter("al_jars"); - String nativeJarList = null; - - String osName = System.getProperty("os.name"); - - if (osName.startsWith("Win")) { - - // check if arch specific natives have been specified - if (System.getProperty("os.arch").endsWith("64")) { - nativeJarList = getParameter("al_windows64"); - } else { - nativeJarList = getParameter("al_windows32"); - } - - if (nativeJarList == null) { - nativeJarList = getParameter("al_windows"); - } - - } else if (osName.startsWith("Linux") || osName.startsWith("Unix")) { - - // check if arch specific natives have been specified - if (System.getProperty("os.arch").endsWith("64")) { - nativeJarList = getParameter("al_linux64"); - } else { - nativeJarList = getParameter("al_linux32"); - } - - if (nativeJarList == null) { - nativeJarList = getParameter("al_linux"); - } - - } else if (osName.startsWith("Mac") || osName.startsWith("Darwin")) { - - // check if arch specific natives have been specified - if (System.getProperty("os.arch").endsWith("64")) { - nativeJarList = getParameter("al_mac64"); - } else if (System.getProperty("os.arch").contains("ppc")) { - nativeJarList = getParameter("al_macppc"); - } else { - nativeJarList = getParameter("al_mac32"); - } - - if (nativeJarList == null) { - nativeJarList = getParameter("al_mac"); - } - - } else if (osName.startsWith("Solaris") || osName.startsWith("SunOS")) { - nativeJarList = getParameter("al_solaris"); - } else if (osName.startsWith("FreeBSD")) { - nativeJarList = getParameter("al_freebsd"); - } else if (osName.startsWith("OpenBSD")) { - nativeJarList = getParameter("al_openbsd"); - } else { - fatalErrorOccured("OS (" + osName + ") not supported", null); - return; - } - - if (nativeJarList == null) { - fatalErrorOccured("no lwjgl natives files found", null); - return; - } - - jarList = trimExtensionByCapabilities(jarList); - StringTokenizer jars = new StringTokenizer(jarList, ", "); - - nativeJarList = trimExtensionByCapabilities(nativeJarList); - StringTokenizer nativeJars = new StringTokenizer(nativeJarList, ", "); - - int jarCount = jars.countTokens(); - nativeJarCount = nativeJars.countTokens(); - - urlList = new URL[jarCount+nativeJarCount]; - - URL path = getCodeBase(); - - // set jars urls - for (int i = 0; i < jarCount; i++) { - urlList[i] = new URL(path, jars.nextToken()); - } - - for (int i = jarCount; i < jarCount+nativeJarCount; i++) { - urlList[i] = new URL(path, nativeJars.nextToken()); - } - } - - /** - * 9 steps - * - * 1) check jre version meets minimum requirements - * 2) check applet cache and decide which jars to download - * 3) download the jars - * 4) extract native files - * 5) validate jars for any corruption - * 6) save applet cache information - * 7) add jars to class path - * 8) set any lwjgl properties - * 9) switch to loaded applet - */ - public void run() { - percentage = 5; - - try { - debug_sleep(2000); - - // check JRE version meets minimum requirements - if (!isMinJREVersionAvailable()) { - minimumJreNotFound = true; - fatalErrorOccured("Java " + getStringParameter("al_min_jre", "1.8") + " or greater is required.", null); - return; - } - - // parse the urls for the jars into the url list - loadJarURLs(); - - // get path where applet files will be stored - String path = getCacheDirectory(); - - File dir = new File(path); - - // create directory - if (!dir.exists()) { - dir.mkdirs(); - } - - File versionFile = new File(dir, "version"); - - // if specified applet version already available don't download anything - boolean versionAvailable = false; - - // version string of applet - String version = getParameter("al_version"); - - // if applet version specifed, compare with version in the cache - if (version != null) { - versionAvailable = compareVersion(versionFile, version.toLowerCase()); - } - - // if jars not available or need updating download them - if (!versionAvailable) { - // get jars file sizes and check cache - getJarInfo(dir); // 5-15% - - // downloads jars from the server - downloadJars(path); // 15-55% - - // Extract Pack and LZMA files - extractJars(path); // 55-65% - - // Extracts Native Files - extractNatives(path); // 65-80% - - // Validate Jars // 80-90% - validateJars(path); - - // save version information once jars downloaded successfully - if (version != null) { - percentage = 90; - writeObjectFile(versionFile, version.toLowerCase()); - } - - // save file names with last modified info once downloaded successfully - writeObjectFile(new File(dir, "timestamps"), filesLastModified); - } - - // add the downloaded jars and natives to classpath - updateClassPath(path); - - // set lwjgl properties - setLWJGLProperties(); - - // if headless mode then sleep, until told to continue - if (headless) { - while(headlessWaiting) { - Thread.sleep(100); - } - } - - // make applet switch on the EDT as an AWT/Swing permission dialog could be called - EventQueue.invokeAndWait(new Runnable() { - public void run() { - try { - switchApplet(); - } catch (Exception e) { - fatalErrorOccured("This occurred while '" + getDescriptionForState() + "'", e); - } - setState(STATE_DONE); - repaint(); - } - }); - - } catch (Exception e) { - certificateRefused = e instanceof AccessControlException; - fatalErrorOccured("This occurred while '" + getDescriptionForState() + "'", e); - } finally { - loaderThread = null; - } - } - - /** - * When this method is supplied with a JRE version it will compare it to the - * current JRE version. - * - * minimum requried JRE version is set using al_min_jre parameter, if not - * this is not set then the value will default to version 1.8 - * - * The minimumVersion should follow a structure such as x.x.x_x - * Example values would include 1.6.0_10 or a subset like 1.6.0 or 1.6 - * - * @return returns true if the available version is greater or equal to the - * minimum version required - * - * @throws Exception a NumberFormatException is thrown if the string is not valid - */ - public boolean isMinJREVersionAvailable() throws Exception { - setState(STATE_CHECK_JRE_VERSION); - - String minimumVersion = getStringParameter("al_min_jre", "1.8"); - String javaVersion = System.getProperty("java.version"); - - // remove dash and anything after it (letters) from version string e.g. 1.8.0_291-b10 - minimumVersion = javaVersion.split("-")[0]; - javaVersion = minimumVersion.split("-")[0]; - - // split version string into a string arrays - String[] jvmVersionData = javaVersion.split("[_\\.]"); - String[] minVersionData = minimumVersion.split("[_\\.]"); - - int maxLength = Math.max(jvmVersionData.length, minVersionData.length); - - // convert string arrays into int arrays - int[] jvmVersion = new int[maxLength]; - int[] minVersion = new int[maxLength]; - - for (int i = 0; i < jvmVersionData.length; i++) { - jvmVersion[i] = Integer.parseInt(jvmVersionData[i]); - } - - for (int i = 0; i < minVersionData.length; i++) { - minVersion[i] = Integer.parseInt(minVersionData[i]); - } - - // compare versions - for (int i = 0; i < maxLength; i++) { - if (jvmVersion[i] < minVersion[i]) return false; // minVersion is greater then jvmVersion - } - - return true; - } - - /** - * This method will return true if the version stored in the file - * matches the supplied String version. - * - * @param versionFile - location to file containing version information - * @param version - String version that needs to be compared - * @return returns true if the version in file matches specified version - */ - protected boolean compareVersion(File versionFile, String version) { - // if version file exists - if (versionFile.exists()) { - String s = readStringFile(versionFile); - - // compare to version with file - if (s != null && s.equals(version)) { - percentage = 90; // not need to download cache files again - - if(debugMode) { - System.out.println("Loading Cached Applet Version: " + version); - } - debug_sleep(2000); - - return true; // version matches file - } - } - - return false; - } - - /** - * Parses the java_arguments list and sets lwjgl specific - * properties accordingly, before the launch. - */ - protected void setLWJGLProperties() { - String lwjglArguments = getParameter("lwjgl_arguments"); - - if(lwjglArguments != null && lwjglArguments.length() > 0) { - int start = lwjglArguments.indexOf("-Dorg.lwjgl"); - while(start != -1) { - int end = lwjglArguments.indexOf(" ", start); - if(end == -1) { - end = lwjglArguments.length(); - } - String[] keyValue = lwjglArguments.substring(start+2, end).split("="); - System.setProperty(keyValue[0], keyValue[1]); - if(debugMode) { - System.out.println("Setting property " + keyValue[0] + " to " + keyValue[1]); - } - start = lwjglArguments.indexOf("-Dorg.lwjgl", end); - } - } - } - - /** - * This method will return the location of the cache directory. All the - * applet files will be downloaded and stored here. A folder will be - * created inside the LWJGL cache directory from the al_title parameter. - * This folder will also be prepended by the host name of the codebase - * to avoid conflict with same named applets on other hosts. - * - * @return path to applets cache directory - * @throws Exception if access is denied - */ - protected String getCacheDirectory() throws Exception { - - String path = AccessController.doPrivileged(new PrivilegedExceptionAction() { - public String run() throws Exception { - - // we append the code base to avoid naming collisions with al_title - String codebase = ""; - if(prependHost) { - codebase = getCodeBase().getHost(); - if(codebase == null || codebase.length() == 0) { - codebase = "localhost"; - } - codebase += File.separator; - } - return getLWJGLCacheDir() + File.separator + codebase + getParameter("al_title") + File.separator; - } - }); - - return path; - } - - /** - * Get path to the lwjgl cache directory. This location will be where - * the OS keeps temporary files. - * - * @return path to the lwjgl cache directory - */ - protected String getLWJGLCacheDir() { - String cacheDir = System.getProperty("deployment.user.cachedir"); - - if (cacheDir == null || System.getProperty("os.name").startsWith("Win")) { - cacheDir = System.getProperty("java.io.tmpdir"); - } - - return cacheDir + File.separator + "lwjglcache"; - } - - /** - * read String object from File - * - * @param file to be read - * @return the String stored in the file or null if it fails - */ - protected String readStringFile(File file) { - try { - return (String)readObjectFile(file); - } catch (Exception e) { - // failed to read version file - e.printStackTrace(); - } - - // return null if failed to read file - return null; - } - - /** - * read the HashMap from File - * - * @param file the file to read - * @return the hashmap stored in the file or an empty hashmap if it fails - */ - @SuppressWarnings("unchecked") - protected HashMap readHashMapFile(File file) { - - try { - return (HashMap) readObjectFile(file); - } catch (Exception e) { - // failed to read hashmap from file - e.printStackTrace(); - } - - // return an empty map if failed to read file - return new HashMap(); - } - - /** - * read the object from the File - * - * @param file the file to read - * @return the object contained in the file or null if it fails - * @throws Exception if it fails to read object from file - */ - protected Object readObjectFile(File file) throws Exception { - FileInputStream fis = new FileInputStream(file); - - try { - ObjectInputStream dis = new ObjectInputStream(fis); - Object object = dis.readObject(); - dis.close(); - return object; - } catch (Exception e) { - // failed to read file - throw e; - } finally { - fis.close(); - } - } - - /** - * write object to specified File - * - * @param file the file to write out to - * @param object the contents of the file - * @throws Exception if it fails to write file - */ - protected void writeObjectFile(File file, Object object) throws Exception { - FileOutputStream fos = new FileOutputStream(file); - try { - ObjectOutputStream dos = new ObjectOutputStream(fos); - dos.writeObject(object); - dos.close(); - } finally { - fos.close(); - } - } - - /** - * Edits the ClassPath at runtime to include the jars - * that have just been downloaded and then adds the - * lwjgl natives folder property. - * - * @param path location where applet is stored - * @throws Exception if it fails to add classpath - */ - protected void updateClassPath(final String path) throws Exception { - - setState(STATE_UPDATING_CLASSPATH); - - percentage = 95; - - URL[] urls = new URL[urlList.length]; - - for (int i = 0; i < urlList.length; i++) { - String file = new File(path, getJarName(urlList[i])).toURI().toString(); - // fix JVM bug where ! is not escaped - file = file.replace("!", "%21"); - urls[i] = new URL(file); - } - - // get AppletLoader certificates - final Certificate[] certs = getCurrentCertificates(); - - // detect if we are running on a mac and save result as boolean - String osName = System.getProperty("os.name"); - final boolean isMacOS = (osName.startsWith("Mac") || osName.startsWith("Darwin")); - - // add downloaded jars to the classpath with required permissions - classLoader = new URLClassLoader(urls) { - protected PermissionCollection getPermissions (CodeSource codesource) { - PermissionCollection perms = null; - - try { - // no permissions - perms = new Permissions(); - - // if certificates match the AppletLoader certificates then we should be all set - if (certificatesMatch(certs, codesource.getCertificates())) { - perms.add(new AllPermission()); - return perms; - } - - String host = getCodeBase().getHost(); - if (host != null && (host.length() > 0)) { - // add permission for downloaded jars to access host they were from - perms.add(new SocketPermission(host, "connect,accept")); - } - else if ( "file".equals(codesource.getLocation().getProtocol()) ) { - // if running locally add file permission - String path = codesource.getLocation().getFile().replace('/', File.separatorChar); - perms.add(new FilePermission(path, "read")); - } - - } catch (Exception e) { - e.printStackTrace(); - } - - return perms; - } - - // allow non lwjgl native to be found from cache directory - protected String findLibrary (String libname) { - String libPath = path + "natives" + File.separator + LWJGLUtil.mapLibraryName(libname); - - if (new File(libPath).exists()) { - return libPath; - } - - return super.findLibrary(libname); - } - }; - - debug_sleep(2000); - - // unload natives loaded by a previous instance of this lwjgl applet - unloadNatives(path); - - // add natives files path to native class path - System.setProperty("org.lwjgl.librarypath", path + "natives"); - - // Make sure jinput knows about the new path too - System.setProperty("net.java.games.input.librarypath", path + "natives"); - - // set the library path, useful for non lwjgl natives - System.setProperty("java.library.path", path + "natives"); - - // mark natives as loaded - natives_loaded = true; - } - - /** - * Unload natives loaded by a different classloader. - * - * Due to limitations of the jvm, native files can only - * be loaded once and only be used by the classloader - * they were loaded from. - * - * Due to the way applets on plugin1 work, one jvm must - * be used for all applets. We need to use multiple - * classloaders in the same jvm due to LWJGL's static - * nature. In order to solve this we simply remove the - * natives from a previous classloader allowing a new - * classloader to use those natives in the same jvm. - * - * This method will only attempt to unload natives from a - * previous classloader if it detects that the natives have - * been loaded in the same jvm. - * - * @param nativePath directory where natives are stored - */ - private void unloadNatives(String nativePath) { - - // check whether natives have been loaded into this jvm - if (!natives_loaded) { - return; - } - - try { - Field field = ClassLoader.class.getDeclaredField("loadedLibraryNames"); - field.setAccessible(true); - Vector libs = (Vector) field.get(getClass().getClassLoader()); - - String path = new File(nativePath).getCanonicalPath(); - - for (int i = 0; i < libs.size(); i++) { - String s = (String) libs.get(i); - - // if a native from the nativePath directory is loaded, unload it - if (s.startsWith(path)) { - libs.remove(i); - i--; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * replace the current applet with the lwjgl applet - * using AppletStub and initialise and start it - */ - protected void switchApplet() throws Exception { - - setState(STATE_SWITCHING_APPLET); - percentage = 100; - - debug_sleep(2000); - - // set correct context classloader for lwjgl applet - Thread.currentThread().setContextClassLoader(classLoader); - - Class appletClass = classLoader.loadClass(getParameter("al_main")); - lwjglApplet = (Applet) appletClass.newInstance(); - - lwjglApplet.setStub(this); - lwjglApplet.setSize(getWidth(), getHeight()); - - setLayout(new BorderLayout()); - add(lwjglApplet); - validate(); - - setState(STATE_INITIALIZE_REAL_APPLET); - lwjglApplet.init(); - - setState(STATE_START_REAL_APPLET); - lwjglApplet.start(); - } - - /** - * This method will get the files sizes of the files to download. - * It wil further get the lastModified time of files - * and save it in a hashmap, if cache is enabled it will mark - * those files that have not changed since last download to not - * redownloaded. - * - * @param dir - location to read cache file from - * @throws Exception - if fails to get infomation - */ - protected void getJarInfo(File dir) throws Exception { - setState(STATE_CHECKING_CACHE); - - filesLastModified = new HashMap(); - - // store file sizes and mark which files not to download - fileSizes = new int[urlList.length]; - - File timestampsFile = new File(dir, "timestamps"); - - // if timestamps file exists, load it - if (timestampsFile.exists()) { - setState(STATE_CHECKING_FOR_UPDATES); - filesLastModified = readHashMapFile(timestampsFile); - } - - // calculate total size of jars to download - - ExecutorService executorService = Executors.newFixedThreadPool(concurrentLookupThreads); - Queue requests = new LinkedList(); - - // create unique object to sync code in requests - final Object sync = new Integer(1); - - for (int j = 0; j < urlList.length; j++) { - final int i = j; - - Future request = executorService.submit(new Runnable() { - - public void run() { - - try { - - URLConnection urlconnection = urlList[i].openConnection(); - urlconnection.setDefaultUseCaches(false); - if (urlconnection instanceof HttpURLConnection) { - ((HttpURLConnection) urlconnection).setRequestMethod("HEAD"); - } - - fileSizes[i] = urlconnection.getContentLength(); - - long lastModified = urlconnection.getLastModified(); - String fileName = getFileName(urlList[i]); - - if (cacheEnabled && lastModified != 0 && filesLastModified.containsKey(fileName)) { - long savedLastModified = filesLastModified.get(fileName); - - // if lastModifed time is the same, don't redownload - if (savedLastModified == lastModified) { - fileSizes[i] = -2; // mark it to not redownload - } - } - - if (fileSizes[i] >= 0) { - synchronized (sync) { - totalDownloadSize += fileSizes[i]; - } - } - - // put key and value in the hashmap - filesLastModified.put(fileName, lastModified); - - } catch (Exception e) { - throw new RuntimeException("Failed to fetch information for " + urlList[i], e); - } - }}); - - requests.add(request); - } - - while (!requests.isEmpty()) { - Iterator iterator = requests.iterator(); - while (iterator.hasNext()) { - Future request = iterator.next(); - if (request.isDone()) { - request.get(); // will throw an exception if request thrown an exception. - iterator.remove(); - - // update progress bar - percentage = 5 + (int) (10 * (urlList.length - requests.size()) / (float) urlList.length); - } - } - - Thread.sleep(10); - } - - executorService.shutdown(); - } - - /** - * Will download the jars from the server using the list of urls - * in urlList, while at the same time updating progress bar - * - * @param path location of the directory to save to - * @throws Exception if download fails - */ - protected void downloadJars(String path) throws Exception { - setState(STATE_DOWNLOADING); - - URLConnection urlconnection; - - int initialPercentage = percentage = 15; - int amountDownloaded = 0; - - // download each jar - byte buffer[] = new byte[65536]; - for (int i = 0; i < urlList.length; i++) { - - // skip file if marked as -2 (already downloaded and not changed) - if (fileSizes[i] == -2) continue; - - int unsuccessfulAttempts = 0; - int maxUnsuccessfulAttempts = 3; - boolean downloadFile = true; - - String currentFile = getFileName(urlList[i]); - - // download the jar a max of 3 times - while(downloadFile) { - downloadFile = false; - - debug_sleep(2000); - - try { - urlconnection = urlList[i].openConnection(); - urlconnection.setUseCaches(false); - - if (urlconnection instanceof HttpURLConnection) { - urlconnection.setRequestProperty("Cache-Control", "no-store,max-age=0,no-cache"); - urlconnection.connect(); - } - - - InputStream inputstream = getJarInputStream(currentFile, urlconnection); - FileOutputStream fos = new FileOutputStream(path + currentFile); - - - int bufferSize; - int currentDownload = 0; - - long downloadStartTime = System.currentTimeMillis(); - int downloadedAmount = 0; - String downloadSpeedMessage = ""; - - try { - while ((bufferSize = inputstream.read(buffer, 0, buffer.length)) != -1) { - debug_sleep(10); - fos.write(buffer, 0, bufferSize); - currentDownload += bufferSize; - - int totalDownloaded = amountDownloaded + currentDownload; - percentage = initialPercentage + ((totalDownloaded * 45) / totalDownloadSize); - subtaskMessage = "Retrieving: " + currentFile + " " + ((totalDownloaded * 100) / totalDownloadSize) + "%"; - - downloadedAmount += bufferSize; - long timeLapse = System.currentTimeMillis() - downloadStartTime; - // update only if a second or more has passed - if (timeLapse >= 1000) { - // get kb/s, nice that bytes/millis is same as kilobytes/seconds - float downloadSpeed = (float) downloadedAmount / timeLapse; - // round to two decimal places - downloadSpeed = ((int)(downloadSpeed*100))/100f; - // set current speed message - downloadSpeedMessage = " - " + downloadSpeed + " KB/sec"; - // reset downloaded amount - downloadedAmount = 0; - // reset start time - downloadStartTime = System.currentTimeMillis(); - } - - subtaskMessage += downloadSpeedMessage; - } - - } finally { - inputstream.close(); - fos.close(); - } - - // download complete, verify if it was successful - if (urlconnection instanceof HttpURLConnection) { - if (currentDownload == fileSizes[i]) { - // successful download - } - else if (fileSizes[i] <= 0 && currentDownload != 0) { - // If contentLength for fileSizes[i] <= 0, we don't know if the download - // is complete. We're going to guess the download is complete. - } - else { - throw new Exception("size mismatch on download of " + currentFile + - " expected " + fileSizes[i] + " got " + currentDownload); - } - } - - // successful file download, update total amount downloaded - amountDownloaded += fileSizes[i]; - - } catch (Exception e) { - e.printStackTrace(); // output exception to console - - // Failed to download the file - unsuccessfulAttempts++; - - // download failed try again - if (unsuccessfulAttempts < maxUnsuccessfulAttempts) { - downloadFile = true; - Thread.sleep(100); // wait a bit before retrying - } - else { - // retry attempts exhasted, download failed - throw new Exception("failed to download " + currentFile + - " after " + maxUnsuccessfulAttempts + " attempts"); - } - } - } - } - subtaskMessage = ""; - } - - /** - * Retrieves a jar files input stream. This method exists primarily to fix an Opera hang in getInputStream - * @param urlconnection connection to get input stream from - * @return InputStream or null if not possible - */ - protected InputStream getJarInputStream(final String currentFile, final URLConnection urlconnection) throws Exception { - final InputStream[] is = new InputStream[1]; - - // try to get the input stream 3 times. - // Wait at most 5 seconds before interrupting the thread - for (int j = 0; j < 3 && is[0] == null; j++) { - Thread t = new Thread() { - public void run() { - try { - is[0] = urlconnection.getInputStream(); - } catch (IOException e) { - /* ignored */ - } - } - }; - t.setName("JarInputStreamThread"); - t.start(); - - int iterationCount = 0; - while(is[0] == null && iterationCount++ < 5) { - try { - t.join(1000); - } catch (InterruptedException inte) { - /* ignored */ - } - } - - if(is[0] == null) { - try { - t.interrupt(); - t.join(); - } catch (InterruptedException inte) { - /* ignored */ - } - } - } - - if(is[0] == null) { - throw new Exception("Unable to get input stream for " + currentFile); - } - - - return is[0]; - } - - /** - * Extract LZMA File - * @param in Input path to pack file - * @param out output path to resulting file - * @throws Exception if any errors occur - */ - protected void extractLZMA(String in, String out) throws Exception { - - File f = new File(in); - FileInputStream fileInputHandle = new FileInputStream(f); - - // use reflection to avoid hard dependency - Class clazz = Class.forName( "LZMA.LzmaInputStream" ); - Constructor constructor = clazz.getDeclaredConstructor(InputStream.class); - InputStream inputHandle = (InputStream) constructor.newInstance(fileInputHandle); - - OutputStream outputHandle = new FileOutputStream(out); - - byte [] buffer = new byte [1<<14]; - - try { - int ret = inputHandle.read(buffer); - while (ret >= 1) { - outputHandle.write(buffer,0,ret); - ret = inputHandle.read(buffer); - } - } finally { - inputHandle.close(); - outputHandle.close(); - } - - // delete LZMA file, as it is no longer needed - f.delete(); - } - - /** - * Extract GZip File - * @param in Input path to pack file - * @param out output path to resulting file - * @throws Exception if any errors occur - */ - protected void extractGZip(String in, String out) throws Exception { - - File f = new File(in); - FileInputStream fileInputHandle = new FileInputStream(f); - - InputStream inputHandle = new GZIPInputStream(fileInputHandle); - - OutputStream outputHandle = new FileOutputStream(out); - - try { - byte [] buffer = new byte [1<<14]; - - int ret = inputHandle.read(buffer); - while (ret >= 1) { - outputHandle.write(buffer,0,ret); - ret = inputHandle.read(buffer); - } - } finally { - inputHandle.close(); - outputHandle.close(); - } - - // delete GZip file, as it is no longer needed - f.delete(); - } - - /** - * Extract Pack File - * @param in Input path to pack file - * @param out output path to resulting file - * @throws Exception if any errors occur - */ - protected void extractPack(String in, String out) throws Exception { - File f = new File(in); - FileOutputStream fostream = new FileOutputStream(out); - JarOutputStream jostream = new JarOutputStream(fostream); - - try { - Pack200.Unpacker unpacker = Pack200.newUnpacker(); - unpacker.unpack(f, jostream); - } finally { - jostream.close(); - fostream.close(); - } - - // delete pack file as its no longer needed - f.delete(); - } - - /** - * Extract all jars from any lzma/gz/pack files - * - * @param path output path - * @throws Exception if any errors occur - */ - protected void extractJars(String path) throws Exception { - setState(STATE_EXTRACTING_PACKAGES); - - float increment = (float) 10.0 / urlList.length; - // extract all gz, lzma, pack.gz and pack.lzma files - for (int i = 0; i < urlList.length; i++) { - - // if file has not changed, skip it - if (fileSizes[i] == -2) continue; - - percentage = 55 + (int) (increment * (i+1)); - String filename = getFileName(urlList[i]); - - if (filename.endsWith(".pack.lzma")) { - subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".lzma", ""); - debug_sleep(1000); - extractLZMA(path + filename, path + replaceLast(filename, ".lzma", "")); - - subtaskMessage = "Extracting: " + replaceLast(filename, ".lzma", "") + " to " + replaceLast(filename, ".pack.lzma", ""); - debug_sleep(1000); - extractPack(path + replaceLast(filename, ".lzma", ""), path + replaceLast(filename, ".pack.lzma", "")); - } - else if (filename.endsWith(".pack.gz")) { - subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".gz", ""); - debug_sleep(1000); - extractGZip(path + filename, path + replaceLast(filename, ".gz", "")); - - subtaskMessage = "Extracting: " + replaceLast(filename, ".gz", "") + " to " + replaceLast(filename, ".pack.gz", ""); - debug_sleep(1000); - extractPack(path + replaceLast(filename, ".gz", ""), path + replaceLast(filename, ".pack.gz", "")); - } - else if (filename.endsWith(".pack")) { - subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".pack", ""); - debug_sleep(1000); - extractPack(path + filename, path + replaceLast(filename, ".pack", "")); - } - else if (filename.endsWith(".lzma")) { - subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".lzma", ""); - debug_sleep(1000); - extractLZMA(path + filename, path + replaceLast(filename, ".lzma", "")); - } - else if (filename.endsWith(".gz")) { - subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".gz", ""); - debug_sleep(1000); - extractGZip(path + filename, path + replaceLast(filename, ".gz", "")); - } - } - } - - /** - * This method will extract all file from the native jar and extract them - * to the subdirectory called "natives" in the local path, will also check - * to see if the native jar files is signed properly - * - * @param path base folder containing all downloaded jars - * @throws Exception if it fails to extract files - */ - protected void extractNatives(String path) throws Exception { - - setState(STATE_EXTRACTING_PACKAGES); - - float percentageParts = 15f/nativeJarCount; // parts for each native jar from 15% - - // create native folder - File nativeFolder = new File(path + "natives"); - if (!nativeFolder.exists()) { - nativeFolder.mkdir(); - } - - // get the current AppletLoader certificates to compare against certificates of the native files - Certificate[] certificate = getCurrentCertificates(); - - for (int i = urlList.length - nativeJarCount; i < urlList.length; i++) { - - // if a new native jar was not downloaded, no extracting needed - if (fileSizes[i] == -2) { - continue; - } - - // get name of jar file with natives from urlList - String nativeJar = getJarName(urlList[i]); - - // open jar file - JarFile jarFile = new JarFile(path + nativeJar, true); - - // get list of files in jar - Enumeration entities = jarFile.entries(); - - totalSizeExtract = 0; - int jarNum = i - (urlList.length - nativeJarCount); // used for progressbar - - // calculate the size of the files to extract for progress bar - while (entities.hasMoreElements()) { - JarEntry entry = (JarEntry) entities.nextElement(); - - // skip directories and anything in directories - // conveniently ignores the manifest - if (entry.isDirectory() || entry.getName().indexOf('/') != -1) { - continue; - } - totalSizeExtract += entry.getSize(); - } - - currentSizeExtract = 0; - - // reset point to begining by getting list of file again - entities = jarFile.entries(); - - // extract all files from the jar - while (entities.hasMoreElements()) { - JarEntry entry = (JarEntry) entities.nextElement(); - - // skip directories and anything in directories - // conveniently ignores the manifest - if (entry.isDirectory() || entry.getName().indexOf('/') != -1) { - continue; - } - - // check if native file already exists if so delete it to make room for new one - // useful when using the reload button on the browser - File f = new File(path + "natives" + File.separator + entry.getName()); - if (f.exists()) { - if (!f.delete()) { - continue; // unable to delete file, it is in use, skip extracting it - } - } - - debug_sleep(1000); - - InputStream in = jarFile.getInputStream(jarFile.getEntry(entry.getName())); - OutputStream out = new FileOutputStream(path + "natives" + File.separator + entry.getName()); - - try { - int bufferSize; - byte buffer[] = new byte[65536]; - - while ((bufferSize = in.read(buffer, 0, buffer.length)) != -1) { - debug_sleep(10); - out.write(buffer, 0, bufferSize); - currentSizeExtract += bufferSize; - - // update progress bar - percentage = 65 + (int)(percentageParts * (jarNum + currentSizeExtract/(float)totalSizeExtract)); - subtaskMessage = "Extracting: " + entry.getName() + " " + ((currentSizeExtract * 100) / totalSizeExtract) + "%"; - } - } finally { - in.close(); - out.close(); - } - - // validate the certificate for the native file being extracted - if (!certificatesMatch(certificate, entry.getCertificates())) { - f.delete(); // delete extracted native as its certificates doesn't match - throw new Exception("The certificate(s) in " + nativeJar + " do not match the AppletLoader!"); - } - } - subtaskMessage = ""; - - jarFile.close(); - - // delete native jar as it is no longer needed - File f = new File(path + nativeJar); - f.delete(); - - } - } - - /** - * Compare two certificate chains to see if they match - * - * @param certs1 first chain of certificates - * @param certs2 second chain of certificates - * - * @return true if the certificate chains are the same - */ - protected static boolean certificatesMatch(Certificate[] certs1, Certificate[] certs2) throws Exception { - if (certs1 == null || certs2 == null) { - return false; - } - - if (certs1.length != certs2.length) { - System.out.println("Certificate chain differs in length [" + certs1.length + " vs " + certs2.length + "]!"); - return false; - } - - for (int i = 0; i < certs1.length; i++) { - if (!certs1[i].equals(certs2[i])) { - System.out.println("Certificate mismatch found!"); - return false; - } - } - - return true; - } - - /** - * Returns the current certificate chain of the AppletLoader - * - * @return - certificate chain of AppletLoader - */ - protected static Certificate[] getCurrentCertificates() throws Exception { - // get the current certificate to compare against native files - Certificate[] certificate = AppletLoader.class.getProtectionDomain().getCodeSource().getCertificates(); - - // workaround for bug where cached applet loader does not have certificates!? - if (certificate == null) { - URL location = AppletLoader.class.getProtectionDomain().getCodeSource().getLocation(); - - // manually load the certificate - JarURLConnection jurl = (JarURLConnection) (new URL("jar:" + location.toString() + "!/org/lwjgl/util/applet/AppletLoader.class").openConnection()); - jurl.setDefaultUseCaches(true); - certificate = jurl.getCertificates(); - jurl.setDefaultUseCaches(false); - } - - return certificate; - } - - /** - * Check and validate jars which will be loaded into the classloader to make - * sure that they are not corrupt. This ensures corrupt files are never marked - * as successful downloadeds by the cache system. - * - * @param path - where the jars are stored - * @throws Exception if a corrupt jar is found - */ - protected void validateJars(String path) throws Exception { - - setState(STATE_VALIDATING_PACKAGES); - - percentage = 80; - - float percentageParts = 10f / urlList.length; // percentage for each file out of 10% - - for (int i = 0; i < urlList.length - nativeJarCount; i++) { - - debug_sleep(1000); - - // if file not downloaded, no need to validate again - if (fileSizes[i] == -2) continue; - - subtaskMessage = "Validating: " + getJarName(urlList[i]); - - File file = new File(path, getJarName(urlList[i])); - if (!isZipValid(file)) { - throw new Exception("The file " + getJarName(urlList[i]) + " is corrupt!"); - } - - percentage = 80 + (int)(percentageParts * i); - } - - subtaskMessage = ""; - } - - /** - * This method will check if a zip file is valid by running through it - * and checking for any corruption and CRC failures - * - * @param file - zip file to test - * @return boolean - runs false if the file is corrupt - */ - protected boolean isZipValid(File file) { - - try { - ZipFile zipFile = new ZipFile(file); - - try { - Enumeration e = zipFile.entries(); - - byte[] buffer = new byte[4096]; - - while(e.hasMoreElements()) { - ZipEntry zipEntry = (ZipEntry) e.nextElement(); - - CRC32 crc = new CRC32(); - - BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry)); - CheckedInputStream cis = new CheckedInputStream(bis, crc); - - while(cis.read(buffer, 0, buffer.length) != -1) { - // scroll through zip entry - } - - if (crc.getValue() != zipEntry.getCrc()) { - return false; // CRC match failed, corrupt zip - } - } - - return true; // valid zip file - } finally { - zipFile.close(); - } - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - - /** - * Get Image from path provided - * - * @param s location of the image - * @return the Image file - */ - protected Image getImage(String s) { - - // if s is "" then don't load an image - if (s.length() == 0) return null; - - Image image = null; - - try { - image = getImage(new URL(getCodeBase(), s)); - } catch (Exception e) { - /* */ - } - - // if image failed to load, try another method - if (image == null) { - image = getImage(Thread.currentThread().getContextClassLoader().getResource(s)); - } - - // if image loaded sucessfully return it - if (image != null) { - return image; - } - - // show error as image could not be loaded - fatalErrorOccured("Unable to load the logo/progressbar image: " + s, null); - return null; - } - - /** - * Get Image from path provided - * - * @param url location of the image - * @return the Image file - */ - public Image getImage(URL url) { - try { - MediaTracker tracker = new MediaTracker(this); - - Image image = super.getImage(url); - - // wait for image to load - tracker.addImage(image, 0); - tracker.waitForAll(); - - // if no errors return image - if (!tracker.isErrorAny()) { - return image; - } - } catch (Exception e) { - /* */ - } - - return null; - } - - /** - * Get jar name from URL. - * - * @param url Get jar file name from this url - * @return file name as string - */ - protected String getJarName(URL url) { - String fileName = url.getFile(); - - if (fileName.endsWith(".pack.lzma")) { - fileName = replaceLast(fileName, ".pack.lzma", ""); - } else if (fileName.endsWith(".pack.gz")) { - fileName = replaceLast(fileName, ".pack.gz", ""); - } else if (fileName.endsWith(".pack")) { - fileName = replaceLast(fileName, ".pack", ""); - } else if (fileName.endsWith(".lzma")) { - fileName = replaceLast(fileName, ".lzma", ""); - } else if (fileName.endsWith(".gz")) { - fileName = replaceLast(fileName, ".gz", ""); - } - - return fileName.substring(fileName.lastIndexOf('/') + 1); - } - - /** - * Get file name portion of URL. - * - * @param url Get file name from this url - * @return file name as string - */ - protected String getFileName(URL url) { - String fileName = url.getFile(); - return fileName.substring(fileName.lastIndexOf('/') + 1); - } - - /** - * Retrieves the color - * - * @param param Color to load - * @param defaultColor Default color to use if no color to load - * @return Color to use - */ - protected Color getColor(String param, Color defaultColor) { - String color = getParameter(param); - - if (color == null) return defaultColor; - - // Check if RGB format - if (color.indexOf(",") != -1) { - StringTokenizer st = new StringTokenizer(color, ","); - - // We've got three components for the color - try { - return new Color(Integer.parseInt(st.nextToken().trim()), - Integer.parseInt(st.nextToken().trim()), - Integer.parseInt(st.nextToken().trim())); - } catch (Exception e) { - // failed to parse - return defaultColor; - } - } - - // Check & decode if the color is in hexadecimal color format (i.e. #808000) - try { - return Color.decode(color); - } catch (NumberFormatException e) { - // ignore exception - } - - // Get the color by name if it exists - try { - return (Color)Color.class.getField(color).get(null); - } catch (Exception e) { - return defaultColor; - } - } - - /** - * Replaces the last occurrence of the specified target substring with - * the specified replacement string in a string. - * - * @param original - String to search - * @param target - substring to find - * @param replacement - what to replace target substring with - * @return - return the modified string, if target substring not found return original string - */ - public String replaceLast(String original, String target, String replacement) { - int index = original.lastIndexOf(target); - - if(index == -1) { - return original; - } - - return original.substring(0, index) + replacement + original.substring(index + target.length()); - } - - /** - * Retrieves the String value for the parameter - * @param name Name of parameter - * @param defaultValue default value to return if no such parameter - * @return value of parameter or defaultValue - */ - protected String getStringParameter(String name, String defaultValue) { - String parameter = getParameter(name); - if (parameter != null) { - return parameter; - } - return defaultValue; - } - - /** - * Retrieves the boolean value for the parameter - * @param name Name of parameter - * @param defaultValue default value to return if no such parameter - * @return value of parameter or defaultValue - */ - protected boolean getBooleanParameter(String name, boolean defaultValue) { - String parameter = getParameter(name); - if (parameter != null) { - return Boolean.parseBoolean(parameter); - } - return defaultValue; - } - - /** - * Retrieves the int value for the applet - * @param name Name of parameter - * @param defaultValue default value to return if no such parameter - * @return value of parameter or defaultValue - */ - protected int getIntParameter(String name, int defaultValue) { - String parameter = getParameter(name); - if (parameter != null) { - return Integer.parseInt(parameter); - } - return defaultValue; - } - - /** - * Sets the error message and print debug information - * - * @param error Error message to print - */ - protected void fatalErrorOccured(String error, Exception e) { - fatalError = true; - - if (minimumJreNotFound) { - errorMessage = minimumJREMessage; - errorMessage[errorMessage.length-1] = error; - } - else if (certificateRefused) { - errorMessage = certificateRefusedMessage; - } - else { - errorMessage = genericErrorMessage; - errorMessage[errorMessage.length-1] = error; - } - - System.out.println(error); - if(e != null) { - System.out.println(e.getMessage()); - System.out.println(generateStacktrace(e)); - } - repaint(); - } - - /** - * set the state of applet loader - * @param state new state of applet loader - * */ - protected void setState(int state) { - this.state = state; - if(debugMode) { - System.out.println(getDescriptionForState()); - } - } - - /** - * Utility method for sleeping - * Will only really sleep if debug has been enabled - * @param ms milliseconds to sleep - */ - protected void debug_sleep(long ms) { - if(debugMode) { - sleep(ms); - } - } - - /** - * Utility method for sleeping - * @param ms milliseconds to sleep - */ - protected void sleep(long ms) { - try { - Thread.sleep(ms); - } catch (Exception e) { - /* ignored */ - } - } - -} diff --git a/src/java/org/lwjgl/util/generator/GeneratorVisitor.java b/src/java/org/lwjgl/util/generator/GeneratorVisitor.java index 98c933f9..aca76220 100644 --- a/src/java/org/lwjgl/util/generator/GeneratorVisitor.java +++ b/src/java/org/lwjgl/util/generator/GeneratorVisitor.java @@ -238,7 +238,6 @@ public class GeneratorVisitor extends ElementKindVisitor6 { } JavaMethodsGenerator.generateMethodsJava(env, type_map, java_writer, d, generate_error_checks, context_specific); java_writer.println("}"); - java_writer.close(); String qualified_interface_name = Utils.getQualifiedClassName(d); env.getMessager().printMessage(Diagnostic.Kind.NOTE, "Generated class " + qualified_interface_name); } @@ -249,58 +248,50 @@ public class GeneratorVisitor extends ElementKindVisitor6 { } String qualified_interface_name = Utils.getQualifiedClassName(d); String qualified_native_name = Utils.getNativeQualifiedName(qualified_interface_name) + ".c"; - PrintWriter native_writer = new PrintWriter(env.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", qualified_native_name).openWriter()); - native_writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); - native_writer.println(); - native_writer.println("#include "); - type_map.printNativeIncludes(native_writer); - native_writer.println(); - TypedefsGenerator.generateNativeTypedefs(type_map, native_writer, Utils.getMethods(d)); - native_writer.println(); - if ( !context_specific ) { - generateMethodsNativePointers(native_writer, Utils.getMethods(d)); - native_writer.println(); + try (PrintWriter native_writer = new PrintWriter(env.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", qualified_native_name).openWriter())) { + native_writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + native_writer.println(); + native_writer.println("#include "); + type_map.printNativeIncludes(native_writer); + native_writer.println(); + TypedefsGenerator.generateNativeTypedefs(type_map, native_writer, Utils.getMethods(d)); + native_writer.println(); + if ( !context_specific ) { + generateMethodsNativePointers(native_writer, Utils.getMethods(d)); + native_writer.println(); + } + NativeMethodStubsGenerator.generateNativeMethodStubs(env, type_map, native_writer, d, generate_error_checks, context_specific); + if ( !context_specific ) { + native_writer.print("JNIEXPORT void JNICALL " + Utils.getQualifiedNativeMethodName(qualified_interface_name, Utils.STUB_INITIALIZER_NAME)); + native_writer.println("(JNIEnv *env, jclass clazz) {"); + native_writer.println("\tJavaMethodAndExtFunction functions[] = {"); + RegisterStubsGenerator.generateMethodsNativeStubBind(native_writer, d, generate_error_checks, context_specific); + native_writer.println("\t};"); + native_writer.println("\tint num_functions = NUMFUNCTIONS(functions);"); + native_writer.print("\t"); + native_writer.print(type_map.getRegisterNativesFunctionName()); + native_writer.println("(env, clazz, num_functions, functions);"); + native_writer.println("}"); + } } - NativeMethodStubsGenerator.generateNativeMethodStubs(env, type_map, native_writer, d, generate_error_checks, context_specific); - if ( !context_specific ) { - native_writer.print("JNIEXPORT void JNICALL " + Utils.getQualifiedNativeMethodName(qualified_interface_name, Utils.STUB_INITIALIZER_NAME)); - native_writer.println("(JNIEnv *env, jclass clazz) {"); - native_writer.println("\tJavaMethodAndExtFunction functions[] = {"); - RegisterStubsGenerator.generateMethodsNativeStubBind(native_writer, d, generate_error_checks, context_specific); - native_writer.println("\t};"); - native_writer.println("\tint num_functions = NUMFUNCTIONS(functions);"); - native_writer.print("\t"); - native_writer.print(type_map.getRegisterNativesFunctionName()); - native_writer.println("(env, clazz, num_functions, functions);"); - native_writer.println("}"); - } - native_writer.close(); env.getMessager().printMessage(Kind.NOTE, "Generated C source " + qualified_interface_name); } @Override public Void visitTypeAsInterface(TypeElement e, Void p) { final File input = new File("src/templates/" + e.getQualifiedName().toString().replace('.', '/') + ".java"); - final File outputJava = new File("src/generated/" + env.getElementUtils().getPackageOf(e).getQualifiedName().toString().replace('.', '/'), Utils.getSimpleClassName(e) + ".java"); + final Collection methods = Utils.getMethods(e); + if ( methods.isEmpty() && Utils.getFields(e).isEmpty() ) { + return DEFAULT_VALUE; + } - PrintWriter java_writer = null; - try { - final Collection methods = Utils.getMethods(e); - if ( methods.isEmpty() && Utils.getFields(e).isEmpty() ) { - return DEFAULT_VALUE; - } + //env.getMessager().printMessage(Kind.NOTE, "methods count : " + Utils.getMethods(e).size() + " fields count : " + Utils.getFields(e).size(), e); + for ( final ExecutableElement method : methods ) { + validateMethod(method); + } - // Skip this class if the output exists and the input has not been modified. - if ( outputJava.exists() && Math.max(input.lastModified(), generatorLM) < outputJava.lastModified() ) - return DEFAULT_VALUE; - - //env.getMessager().printMessage(Kind.NOTE, "methods count : " + Utils.getMethods(e).size() + " fields count : " + Utils.getFields(e).size(), e); - for ( final ExecutableElement method : methods ) { - validateMethod(method); - } - - // TODO: Back-port LWJGL 3's generation file handling (generate in-memory and avoid touching files if nothing has changed) - java_writer = new PrintWriter(env.getFiler().createSourceFile(Utils.getQualifiedClassName(e), env.getElementUtils().getPackageOf(e)).openWriter()); + // TODO: Back-port LWJGL 3's generation file handling (generate in-memory and avoid touching files if nothing has changed) + try (PrintWriter java_writer = new PrintWriter(env.getFiler().createSourceFile(Utils.getQualifiedClassName(e), env.getElementUtils().getPackageOf(e)).openWriter())) { generateJavaSource(e, java_writer); if ( methods.size() > 0 ) { @@ -324,10 +315,6 @@ public class GeneratorVisitor extends ElementKindVisitor6 { } return DEFAULT_VALUE; } catch (Exception ex) { - // If anything goes wrong mid-gen, delete output to allow regen next time we run. - if ( java_writer != null ) java_writer.close(); - if ( outputJava.exists() ) outputJava.delete(); - throw new RuntimeException(ex); } }