colorspacious-1.1.0/0000755000000000000000000000000013023030663013070 5ustar rootrootcolorspacious-1.1.0/setup.cfg0000644000000000000000000000013013010731600014676 0ustar rootroot[bdist_wheel] universal = 1 [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 colorspacious-1.1.0/setup.py0000644000000000000000000000176313010726072014613 0ustar rootrootfrom setuptools import setup, find_packages import sys import os.path import numpy as np # Must be one line or PyPI will cut it off DESC = ("A powerful, accurate, and easy-to-use Python library for " "doing colorspace conversions") import codecs LONG_DESC = codecs.open("README.rst", encoding="utf-8").read() # defines __version__ exec(open("colorspacious/version.py").read()) setup( name="colorspacious", version=__version__, description=DESC, long_description=LONG_DESC, author="Nathaniel J. Smith", author_email="njs@pobox.com", url="https://github.com/njsmith/colorspacious", license="MIT", classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", ], packages=find_packages(), install_requires=["numpy"], ) colorspacious-1.1.0/MANIFEST.in0000644000000000000000000000011012545654606014637 0ustar rootrootinclude LICENSE.txt README.rst recursive-include doc * prune doc/_build colorspacious-1.1.0/README.rst0000644000000000000000000000556713010730472014575 0ustar rootrootcolorspacious ============= .. image:: https://travis-ci.org/njsmith/colorspacious.svg?branch=master :target: https://travis-ci.org/njsmith/colorspacious :alt: Automated test status .. image:: https://codecov.io/gh/njsmith/colorspacious/branch/master/graph/badge.svg :target: https://codecov.io/gh/njsmith/colorspacious :alt: Test coverage .. image:: https://readthedocs.org/projects/colorspacious/badge/?version=latest :target: http://colorspacious.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status Colorspacious is a powerful, accurate, and easy-to-use library for performing colorspace conversions. In addition to the most common standard colorspaces (sRGB, XYZ, xyY, CIELab, CIELCh), we also include: color vision deficiency ("color blindness") simulations using the approach of Machado et al (2009); a complete implementation of `CIECAM02 `_; and the perceptually uniform CAM02-UCS / CAM02-LCD / CAM02-SCD spaces proposed by Luo et al (2006). To get started, simply write:: from colorspacious import cspace_convert Jp, ap, bp = cspace_convert([64, 128, 255], "sRGB255", "CAM02-UCS") This converts an sRGB value (represented as integers between 0-255) to CAM02-UCS `J'a'b'` coordinates (assuming standard sRGB viewing conditions by default). This requires passing through 4 intermediate colorspaces; ``cspace_convert`` automatically finds the optimal route and applies all conversions in sequence: This function also of course accepts arbitrary NumPy arrays, so converting a whole image is just as easy as converting a single value. Documentation: http://colorspacious.readthedocs.org/ Installation: ``pip install colorspacious`` Downloads: https://pypi.python.org/pypi/colorspacious/ Code and bug tracker: https://github.com/njsmith/colorspacious Contact: Nathaniel J. Smith Dependencies: * Python 2.6+, or 3.3+ * NumPy Developer dependencies (only needed for hacking on source): * nose: needed to run tests License: MIT, see LICENSE.txt for details. References for algorithms we implement: * Luo, M. R., Cui, G., & Li, C. (2006). Uniform colour spaces based on CIECAM02 colour appearance model. Color Research & Application, 31(4), 320–330. doi:10.1002/col.20227 * Machado, G. M., Oliveira, M. M., & Fernandes, L. A. (2009). A physiologically-based model for simulation of color vision deficiency. Visualization and Computer Graphics, IEEE Transactions on, 15(6), 1291–1298. http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html Other Python packages with similar functionality that you might want to check out as well or instead: * ``colour``: http://colour-science.org/ * ``colormath``: http://python-colormath.readthedocs.org/ * ``ciecam02``: https://pypi.python.org/pypi/ciecam02/ * ``ColorPy``: http://markkness.net/colorpy/ColorPy.html colorspacious-1.1.0/PKG-INFO0000644000000000000000000001012313010731600014155 0ustar rootrootMetadata-Version: 1.1 Name: colorspacious Version: 1.1.0 Summary: A powerful, accurate, and easy-to-use Python library for doing colorspace conversions Home-page: https://github.com/njsmith/colorspacious Author: Nathaniel J. Smith Author-email: njs@pobox.com License: MIT Description: colorspacious ============= .. image:: https://travis-ci.org/njsmith/colorspacious.svg?branch=master :target: https://travis-ci.org/njsmith/colorspacious :alt: Automated test status .. image:: https://codecov.io/gh/njsmith/colorspacious/branch/master/graph/badge.svg :target: https://codecov.io/gh/njsmith/colorspacious :alt: Test coverage .. image:: https://readthedocs.org/projects/colorspacious/badge/?version=latest :target: http://colorspacious.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status Colorspacious is a powerful, accurate, and easy-to-use library for performing colorspace conversions. In addition to the most common standard colorspaces (sRGB, XYZ, xyY, CIELab, CIELCh), we also include: color vision deficiency ("color blindness") simulations using the approach of Machado et al (2009); a complete implementation of `CIECAM02 `_; and the perceptually uniform CAM02-UCS / CAM02-LCD / CAM02-SCD spaces proposed by Luo et al (2006). To get started, simply write:: from colorspacious import cspace_convert Jp, ap, bp = cspace_convert([64, 128, 255], "sRGB255", "CAM02-UCS") This converts an sRGB value (represented as integers between 0-255) to CAM02-UCS `J'a'b'` coordinates (assuming standard sRGB viewing conditions by default). This requires passing through 4 intermediate colorspaces; ``cspace_convert`` automatically finds the optimal route and applies all conversions in sequence: This function also of course accepts arbitrary NumPy arrays, so converting a whole image is just as easy as converting a single value. Documentation: http://colorspacious.readthedocs.org/ Installation: ``pip install colorspacious`` Downloads: https://pypi.python.org/pypi/colorspacious/ Code and bug tracker: https://github.com/njsmith/colorspacious Contact: Nathaniel J. Smith Dependencies: * Python 2.6+, or 3.3+ * NumPy Developer dependencies (only needed for hacking on source): * nose: needed to run tests License: MIT, see LICENSE.txt for details. References for algorithms we implement: * Luo, M. R., Cui, G., & Li, C. (2006). Uniform colour spaces based on CIECAM02 colour appearance model. Color Research & Application, 31(4), 320–330. doi:10.1002/col.20227 * Machado, G. M., Oliveira, M. M., & Fernandes, L. A. (2009). A physiologically-based model for simulation of color vision deficiency. Visualization and Computer Graphics, IEEE Transactions on, 15(6), 1291–1298. http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html Other Python packages with similar functionality that you might want to check out as well or instead: * ``colour``: http://colour-science.org/ * ``colormath``: http://python-colormath.readthedocs.org/ * ``ciecam02``: https://pypi.python.org/pypi/ciecam02/ * ``ColorPy``: http://markkness.net/colorpy/ColorPy.html Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 colorspacious-1.1.0/LICENSE.txt0000644000000000000000000000211012545654712014724 0ustar rootrootThe MIT License (MIT) Copyright (c) 2014-2015 Colorspacious developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. colorspacious-1.1.0/doc/0000755000000000000000000000000013023030663013635 5ustar rootrootcolorspacious-1.1.0/doc/requirements.txt0000644000000000000000000000012512615253160017124 0ustar rootrootnumpy matplotlib mistune jsonschema ipython sphinx_rtd_theme sphinxcontrib-bibtex colorspacious-1.1.0/doc/conf.py0000644000000000000000000002307312616042440015144 0ustar rootroot# -*- coding: utf-8 -*- # # colorspacious documentation build configuration file, created by # sphinx-quickstart on Fri Jul 3 22:45:20 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # To make debugging on RTD easier print("python exec:", sys.executable) print("sys.path:", sys.path) print("current directory:", os.getcwd()) try: import numpy print("numpy: %s, %s" % (numpy.__version__, numpy.__file__)) except ImportError: print("no numpy") try: import matplotlib print("matplotlib: %s, %s" % (matplotlib.__version__, matplotlib.__file__)) except ImportError: print("no matplotlib") try: import IPython print("ipython: %s, %s" % (IPython.__version__, IPython.__file__)) except ImportError: print("no ipython") # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'IPython.sphinxext.ipython_directive', 'IPython.sphinxext.ipython_console_highlighting', 'sphinxcontrib.bibtex', ] # Undocumented trick: if we def setup here in conf.py, it gets called just # like an extension's setup function. def setup(app): app.add_javascript("show-code.js") app.add_javascript("facebox.js") app.add_stylesheet("facebox.css") # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'colorspacious' copyright = u'2015, Colorspacious developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. #version = '0.0.0' sys.path.insert(0, os.getcwd() + "/..") import colorspacious version = colorspacious.__version__ # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. #html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'colorspaciousdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'colorspacious.tex', u'colorspacious Documentation', u'Nathaniel J. Smith, Richard Futrell', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'colorspacious', u'colorspacious Documentation', [u'Nathaniel J. Smith, Richard Futrell'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'colorspacious', u'colorspacious Documentation', u'Colorspacious developers', 'colorspacious', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {"python": ("http://docs.python.org/", None), "numpy": ("http://docs.scipy.org/doc/numpy", None), } colorspacious-1.1.0/doc/Makefile0000644000000000000000000001520612545654606015322 0ustar rootroot# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/colorspacious.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/colorspacious.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/colorspacious" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/colorspacious" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." colorspacious-1.1.0/doc/reference.rst0000644000000000000000000003424113010731474016335 0ustar rootrootReference ========= .. currentmodule:: colorspacious Conversion functions -------------------- .. autofunction:: cspace_convert .. autofunction:: cspace_converter .. _supported-colorspaces: Specifying colorspaces ---------------------- Colorspacious knows about a wide variety of colorspaces, some of which take additional parameters, and it can convert freely between any of them. Here's an image showing all the known spaces, and the conversion paths used. (This graph is generated directly from the source code: when you request a conversion between two spaces, :func:`cspace_convert` automatically traverses this graph to find the best conversion path. This makes it very easy to add support for new colorspaces.) .. ipython:: python :suppress: import colorspacious with open("_static/colorspacious-graph.dot", "w") as f: colorspacious.conversion.GRAPH.dump_dot(f) import subprocess subprocess.check_call(["dot", "-Tsvg", "_static/colorspacious-graph.dot", "-o", "_static/colorspacious-graph.svg"]) .. image:: /_static/colorspacious-graph.svg The most general and primitive way to specify a colorspace is via a dict, e.g., all the following are valid arguments that can be passed to :func:`cspace_convert`:: {"name": "XYZ100"} {"name": "CIELab", "XYZ100_w": "D65"} {"name": "CIELab", "XYZ100_w": [95.047, 100, 108.883]} These dictionaries always have a ``"name"`` key specifying the colorspace. Every bold-faced string in the above image is a recognized colorspace name. Some spaces take additional parameters beyond the name, such as the CIELab whitepoint above. These additional parameters are indicated by the italicized strings in the image above. There are also several shorthands accepted, to let you avoid writing out long dicts in most cases. In particular: * Any :class:`CIECAM02Space` object ``myspace`` is expanded to:: {"name": "CIECAM02", "ciecam02_space": myspace} * Any :class:`LuoEtAl2006UniformSpace` object ``myspace`` is expanded to:: {"name": "J'a'b'", "ciecam02_space": CIECAM02.sRGB, "luoetal2006_space": myspace} * The string ``"CIELab"`` expands to: ``{"name": "CIELab", "XYZ100_w": "D65"}`` * The string ``"CIELCh"`` expands to: ``{"name": "CIELCh", "XYZ100_w": "D65"}`` * the string ``"CIECAM02"`` expands to ``CIECAM02Space.sRGB``, which in turn expands to ``{"name": "CIECAM02", "ciecam02_space": CIECAM02Space.sRGB}``. * The strings ``"CAM02-UCS"``, ``"CAM02-SCD"``, ``"CAM02-LCD"`` expand to the global instance objects :data:`CAM02UCS`, :data:`CAM02SCD`, :data:`CAM02LCD`, which in turn expand to ``"J'a'b'"`` dicts as described above. * Any string consisting only of characters from the set "JChQMsH" is expanded to:: {"name": "CIECAM02-subset", "axes": "ciecam02_space": CIECAM02.sRGB} This allows you to directly use common shorthands like ``"JCh"`` or ``"JMh"`` as first-class colorspaces. Any other string ``"foo"`` expands to ``{"name": "foo"}``. So for any space that doesn't take parameters, you can simply say ``"sRGB1"`` or ``"XYZ100"`` or whatever and ignore all these complications. And, as one final trick, any alias can also be used as the ``"name"`` field in a colorspace dict, in which case its normal expansion is used to provide overrideable defaults for parameters. For example:: # You write: {"name": "CAM02-UCS", "ciecam02_space": my_ciecam02_space} # Colorspacious expands this to: {"name": "J'a'b'", "ciecam02_space": my_ciecam02_space, "luoetal2006_space": CAM02UCS} Or:: # You write: {"name": "JCh", "ciecam02_space": my_ciecam02_space} # Colorspacious expands this to: {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": my_ciecam02_space} Well-known colorspaces ...................... **sRGB1**, **sRGB100**: The standard `sRGB colorspace `_. If you have generic "RGB" values with no further information specified, then usually the right thing to do is to assume that they are in the sRGB space; the sRGB space was originally designed to match the behavior of common consumer monitors, and these days common consumer monitors are designed to match sRGB. Use ``sRGB1`` if you have or want values that are normalized to fall between 0 and 1, and use ``sRGB255`` if you have or want values that are normalized to fall between 0 and 255. **XYZ100**, **XYZ1**: The standard `CIE 1931 XYZ color space `_. Use ``XYZ100`` if you have or want values that are normalized to fall between 0 and 100 (roughly speaking -- values greater than 100 are valid in certain cases). Use ``XYZ1`` if you have or want values that are normalized to fall between 0 and 1 (roughly). This is a space which is "linear-light", i.e. related by a linear transformation to the photon counts in a spectral power distribution. In particular, this means that linear interpolation in this space is a valid way to simulate physical mixing of lights. **sRGB1-linear**: A linear-light version of **sRGB1**, i.e., it has had gamma correction applied, but is still represented in terms of the standard sRGB primaries. **xyY100**, **xyY1**: The standard `CIE 1931 xyY color space `_. *The x and y values are always normalized to fall between 0 and 1.* Use ``xyY100`` if you have or want a Y value that falls between 0 and 100, and use ``xyY1`` if you have or want a Y value that falls between 0 and 1. **CIELab**: The standard `CIE 1976 L*a*b* color space `_. L* is scaled to vary from 0 to 100; a* and b* are likewise scaled to roughly the range -50 to 50. This space takes a parameter, *XYZ100_w*, which sets the reference white point, and may be specified either directly as a tristimulus value or as a string naming one of the well-known standard illuminants like ``"D65"``. **CIELCh**: Cylindrical version of **CIELab**. Accepts the same parameters. h* is in degrees. Simulation of color vision deficiency ..................................... We provide simulation of common (and not so common) forms of color vision deficiency (also known as "colorblindness"), using the model described by :cite:`Machado-CVD`. This is generally done by specifying a colorspace like:: {"name": "sRGB1+CVD", "cvd_type": , "severity": } where ```` is one of the following strings: * ``"protanomaly"``: A common form of red-green colorblindness; affects ~2% of white men to some degree (less common among other ethnicities, much less common among women, see Tables 1.5 and 1.6 in :cite:`Sharpe-CVD`). * ``"deuteranomaly"``: The most common form of red-green colorblindness; affects ~6% of white men to some degree (less common among other ethnicities, much less common among women, see Tables 1.5 and 1.6 in :cite:`Sharpe-CVD`). * ``"tritanomaly"``: A very rare form of colorblindness affecting blue/yellow discrimination -- so rare that its detailed effects and even rate of occurrence are not well understood. Affects <0.1% of people, possibly much less (:cite:`Sharpe-CVD`, page 47). Also, the name we use here is somewhat misleading because only full trit\ **anopia** has been documented, and partial trit\ **anomaly** likely does not exist (:cite:`Sharpe-CVD`, page 45). What this means is that while Colorspacious will happily allow any severity value to be passed, probably only severity = 100 corresponds to any real people. And ```` is any number between 0 (indicating regular vision) and 100 (indicating complete dichromacy). .. warning:: If you have an image, e.g. a photo, and you want to "convert it to simulate colorblindness", then this is done with an incantation like:: cspace_convert(img, some_cvd_space, "sRGB1") Notice that these arguments are given in the *opposite order* from what you might naively expect. See :ref:`tutorial-cvd` for explanation and worked examples. CIECAM02 ........ `CIECAM02 `_ is a standardized, rather complex, state-of-the-art color appearance model, i.e., it's not useful for describing the voltage that should be applied to a phosphorescent element in your monitor (like RGB was originally designed to do), and it's not useful for modelling physical properties of light (like XYZ), but it is very useful to tell you what a color will look like subjectively to a human observer, under a certain set of viewing conditions. Unfortunately this makes it rather complicated, because human vision is rather complicated. If you just want a better replacement for traditional ad hoc spaces like "Hue/Saturation/Value", then use the string ``"JCh"`` for your colorspace (see :ref:`tutorial-perception` for a tutorial) and be happy. If you want the full power of CIECAM02, or just to understand what *exactly* is happening when you type ``"JCh"``, then read on. First, you need to specify your viewing conditions. For many purposes, you can use the default :attr:`CIECAM02Space.sRGB` object. Or if you want to specify different viewing conditions, you can instantiate your own :class:`CIECAM02Space` object: .. autoclass:: CIECAM02Space .. attribute:: sRGB A class-level constant representing the viewing conditions specified in the sRGB standard. (The sRGB standard defines two things: how a standard monitor should respond to different RGB values, and a standard set of viewing conditions in which you are supposed to look at such a monitor, and that attempt to approximate the average conditions in which people actually do look at such monitors. This object encodes the latter.) The CIECAM02Space object has some low-level methods you can use directly if you want, though usually it'll be easier to just use :func:`cspace_convert`: .. automethod:: XYZ100_to_CIECAM02 .. automethod:: CIECAM02_to_XYZ100 .. autoclass:: CIECAM02Surround A namedtuple holding the CIECAM02 surround parameters, :math:`F`, :math:`c`, and :math:`N_c`. The CIECAM02 standard surrounds are available as constants defined on this class; for most purposes you'll just want to use one of them: * :data:`CIECAM02Surround.AVERAGE` * :data:`CIECAM02Surround.DIM` * :data:`CIECAM02Surround.DARK` .. autoclass:: NegativeAError Now that you have a :class:`CIECAM02Space` object, what can you do with it? First, you can pass it directly to :func:`cspace_convert` as an input or output space (which is a shorthand for using a space like ``{"name": "CIECAM02", "ciecam02_space": }``). The plain vanilla ``"CIECAM02"`` space is weird and special: unlike all the other spaces supported by colorspacious, it does not represent values with ordinary NumPy arrays. This is because there are just too many perceptual correlates, and trying to keep track of whether M is at index 4 or 5 would be way too obnoxious. Instead, it returns an object of class :class:`JChQMsH`: .. autoclass:: JChQMsH A namedtuple with a mnemonic name: it has attributes ``J``, ``C``, ``h``, ``Q``, ``M``, ``s``, and ``H``, each of which holds a scalar or NumPy array representing lightness, chroma, hue angle, brightness, colorfulness, saturation, and hue composition, respectively. Alternatively, because you usually only want a subset of these, you can take advantage of the ``"CIECAM02-subset"`` space, which takes the perceptual correlates you want as a parameter. So for example if you just want JCh, you can write:: {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": CIECAM02.sRGB} When using ``"CIECAM02-subset"``, you don't have to worry about :class:`JChQMsH` -- it just takes and returns regular NumPy arrays, like all the other colorspaces. And as a convenience, all strings composed of the character JChQMsH are automatically treated as specifying CIECAM02-subset spaces, so you can write:: "JCh" and it expands to:: {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": CIECAM02.sRGB} or you can write:: {"name": "JCh", "ciecam02_space": my_space} and it expands to:: {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": my_space} Perceptually uniform colorspaces based on CIECAM02 .................................................. The :math:`J'a'b'` spaces proposed by :cite:`CAM02-UCS` are high-quality, approximately perceptually uniform spaces based on CIECAM02. They propose three variants: CAM02-LCD optimized for "large color differences" (e.g., estimating the similarity between blue and green), CAM02-SCD optimized for "small color differences" (e.g., estimating the similarity between light blue with a faint greenish cast and light blue with a faint purpleish cast), and CAM02-UCS which attempts to provide a single "uniform color space" that is less optimized for either case but provides acceptable performance in general. Colorspacious represents these spaces as instances of :class:`LuoEtAl2006UniformSpace`: .. autoclass:: LuoEtAl2006UniformSpace Because these spaces are defined as transformations from CIECAM02, to have a fully specified color space you must also provide some particular CIECAM02 viewing conditions, e.g.:: {"name": "J'a'b'", "ciecam02_space": CIECAM02.sRGB, "luoetal2006_space": CAM02UCS} As usual, you can also pass any instance of :class:`LuoEtAl2006UniformSpace` and it will be expanded into a dict like the above, or for the three common variants you can pass the strings ``"CAM02-UCS"``, ``"CAM02-LCD"``, or ``"CAM02-SCD"``. .. versionchanged:: 1.1.0 In v1.0.0 and earlier, colorspacious's definitions of the ``CAM02-LCD`` and ``CAM02-SCD`` spaces were swapped compared to what they should have been based on the :cite:`CAM02-UCS` – i.e., if you asked for LCD, you got SCD, and vice-versa. (``CAM02-UCS`` was correct, though). Starting in 1.1.0, all three spaces are now correct. Color difference computation ---------------------------- .. autofunction:: deltaE For examples, see :ref:`tutorial-deltaE` in the tutorial. Utilities --------- You probably won't need these, but just in case they're useful: .. autofunction:: standard_illuminant_XYZ100 .. autofunction:: as_XYZ100_w .. autofunction:: machado_et_al_2009_matrix colorspacious-1.1.0/doc/bibliography.bib0000644000000000000000000000277512616045306017010 0ustar rootroot@article{CAM02-UCS, author = {M. Ronnier Luo and Guihua Cui and Changjun Li}, year = 2006, title = {Uniform colour spaces based on {CIECAM02} colour appearance model}, journal = {Color Research \& Application}, volumne = 31, number = 4, pages = {320--330}, doi = {10.1002/col.20227}, } @article{Machado-CVD, author = {Gustavo M. Machado and Manuel M. Oliveira and Leandro A. F. Fernandes}, year = 2009, title = {A physiologically-based model for simulation of color vision deficiency}, journal = {IEEE Transactions on Visualization and Computer Graphics}, volume = 15, number = 6, pages = {1291--1298}, doi = {10.1109/TVCG.2009.113}, url = {http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html}, } @InCollection{Luo-CIECAM02, author = {Ming Ronnier Luo and Changjun Li}, title = {{CIECAM02} and its recent developments}, year = 2013, pages = {19--58}, booktitle = {Advanced color image processing and analysis}, editor = {Christine Fernandez-Maloigne}, address = {New York}, publisher = {Springer New York}, doi = {10.1007/978-1-4419-6190-7_2}, } @InCollection{Sharpe-CVD, title = {Opsin genes, cone photopigments and color vision}, booktitle = {Color vision: {From} genes to perception}, author = {Sharpe, Lindsay T. and Stockman, Andrew and Jägle, Herbert and Nathans, Jeremy}, year = {2000}, pages = {3--51}, editor = {Karl R. Gegenfurtner and Lindsay T. Sharpe}, publisher = {Cambridge University Press}, address = {Cambridge}, } colorspacious-1.1.0/doc/grace_hopper.png0000644000000000000000000231307012547112470017016 0ustar rootrootPNG  IHDRX7gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsodIDATxd=$nYfffff%3I 133X1(m~%}{ٹ^UJvx|NWv8,rlZ5X66` ZbF jdes*S^e?*8C`Q f̉ɜel0(,V[GDEDt b,Hn_53)d%Gpyp6sr$3lUjvbyrlϬWN8yo|0|O?@NTFRhfAZcvJkh`e0\ bKi&[ W: 9NT[Fhvމ"9Wj̭f[fwT1LFyr2 gLܳOoٺv{|q]'qM>Zyz3V_<__<<|/k;mxswٻ򧯟;LJTUJQ669)AR3ݮ X2M@)4 j-fKՐTBB.LiI?1п^_|ams2\ͼtI2>-Vs\Rg퍂QZmbSP[#cE򴇅EtbQbwRx ^zߝ:ҡS)!(]4]݁}:;j?Oj†P׿,n^Tթ2צw~zⱫ3:d,_67}^ZZ_M^ڵ kAl+1M/,J\ұ0y _FY27wYZ☆Wb砞޽$ŰW`8 l؅3(.m~5kQ3,Il3x݋VdD}Вж oEtq-[45*}aZϲ9hO\L%k :Gֿ]`/53hLX Nvmo뼬av\ӫxv|DJ*<)uT8y}+ V.O-Mi^Kmյ${ifbETbj^,Zֱ0w.JjѵsWqcE=oܺըdĝڍw8{q9Ckǯ-^`lq< x;О޻'Гv8SB)l6t'Ty 'nDgS*t6|,ޝ4QpBض%kyڜut]mrǮ?L޸5Qw.[ֵ7 ʧnT2i#W9,gpyFEYKq6:'Q9uw_o?nZ+'{ Q r;ZiJ= Oꪑ\Mb-6 LŢrdSli}9K}%[]k{ Tc`0 N`$Yu{${>#9_l쭞~Gv=lڂ n%1B|#{~8wg~кy++:􄈱2P`Hu`1c2T**r(#*Ǯؘ޿9m`sJ2[^,~``ENϒٽK aٷ\ hS 8E|Ȏm-yCq(F9+Q p,{ ;p΅Mh[|\n:(IY&PdO[PP<4Gt&ܭo)F@?cpel R4C(]GqآLBsqÄxXzp oO:` `%&(G[H x'x9C Ј8?a:A98-F"4 ip W({D68йpf)۫fqB2 *E6_ wEV[Im ǮK 4&rƖ Ưmaq8!xԂ;-mQP۶A[Zlf/8h,% 4˲XX.lzU blx9ճ/{ǿnQ4 }!5PBX͋dfGݒ] dD;ٕGpT'GImZᆉmxk 0(tX(3t-14 XO U}<d0%'"3b/!/` b!;4.сN>hGRF#K1`gو 2gj'!"i@bh|!D-8-:汅?o솢['mG:,G!? &ZlS:g,T4a=^4qm̭ kOc ''.΃S72VzfΖG l sNno*Hx 7x_m$y&KoVzY'MJO e&3',jw[8+a!>_,7RR$+j 噭FKKa a0e-VB]NR _: 攻,LZa|)\iE+8[g\;=٧0I=b;Mƒ%ʤٸ,Vʵ V>GE JTjFtRP.߀+pPqPrSju 5>2+s _7};.ə͓{=g{顷`/V8\=k~bn(?{׾z㛷k+L8c%Sl20 mZU<]Q!f^񴸃{X2 )႒e1dy,) JwԼXv|Iu$H (!P 2颜kwj +\r |oƧ'NuDžy[rK,m> ~W{W{N=~´>)q( c.N}.GcWZxh<&lɟ f~WR[疌[S8p?t~S6D@,пSt \@>(B`"9FPH+軰%> D7 C{_5~hD?эPG2eDG dNaBDԽ ' HBGU FU@lh@bAlIQ'pɭ]5~Lx!xpN|(%EN>v |VxX< *ȌLr"<ȚMr-G_!r8wU)ҺWdc{_?U&? {Yj7h,qwuSʗMB_{FLT܎$(# c[.]Yd?/Fb|!w7T{7lSW+uTൗ@^2ۼ[}Z(+v{G%QVdV|˷bL.(9e(-\aol\$*BX-GzaA~\S3~֓>{‘\z"+YR"&RI5Y,\2XӍlZ/e2V:*;E;ۨ@9ڼJGm*Gݼt˞79~|O}od7ڳ}'k~Gk|k/zĻ~GWY}z]ѵ~Ȼ6ynRsGff+yMX 4J|C(v5;NOmuvM T8mb}&rnsrCdEݙ3+v>S9T4 lVJJA!sPx窫jߦ&5Θpct`bqA݁r)qMugu޾}=pw=>0o*Owy[RVud;Rkzty?_JzߪΥ)Ms+^\:~mr@f7Lශ_ D@J|??eNJdS8B&0A LD; ,h(u Ys'GO sab|7?58 h0G>k9.r'!>b jC'0p:\-ʺuEj"*0aݣ-9vp)M:k8N]ӷD0yW>\PF,t @PW?CLJ&"Tt"NE $H%>5ÇԣtQHu ߷vQ܃>[h 5 NxTfVMQj9j2Y FpqY)w'rr  i 59r)Wm(9HTҀlUEv9]R'ȵcƤ1l|ٖ]E\+ vollk<#err/pK]Vk5!կ2e9IK_^u=7NuЛ>&wNp[d 5l2l%rFEV!@xK Njb&Sݽ&4z,Ŋ5?WX6셥X7Oy 6mǯxop҇_{8|nk⭈?RA`H=%AĊک3ۼGjKǾrZs[Uس*saVעW^6m. {`YR\@B-s`4(_ PD?*ْQL62zC( " jĖzhoJhGnŢx .ZƚYkgkTƌhG ګ݆3rb5Wk^WвD]ͪ ?l7P,32g %9JxJv6UK5/1lR!JNg"|pU <&bjAx;R&S ٝ%geٚW+ uƨϩeA8C8sSɝ+_[w㏯s>8UyM.̫ĻdQH@3.&rUel/JI*XYu#?AA`Fl1XkKkMn)/9 =?{u;V|s7'/}/7o>ׯy7ܾo~o(=<܆[ϗ|w~`\oB`t I>{1}4Q ̖^b RW>-`U> jlkq"c ~tUo|5%Zx.!&:=fpu>{vMeY۬di^JĆi͋rzPPv/j!*+@_޳= p 00d25}">=q:IhY@bjHU|'O_xfaa 8ȎFrSōKz`NΗR΀]> $2@%AE;}>d%e@amY#}Ax{PC D*c'8S"b 83%O=K4汥uМ @j"PL=Eq~ r"Qk<- *Ew 鏖:p3z<|GC5/H\ٷ% ?x|(䨁Ǘ, E]Q4qMuض< ʧm'>6> -ݿ_nP}01:; Ǖ4ǂ8_2s&\JaHTGʲ% Sh( 7x9UB KbvKr=WNܾvbXl[ɚ`ěVȱ2  `Z\pewbG3lop:;3V߾⍣{\K~gx C&`mLS-|+hATEIimC/z>0m˵"WZlk@K+nxb#s漳v׻6~cm;Ꭳ{\8֑杛v]ͫ>+[+OL),PMvb"Vm6z#C*Pu09%g ptrEؽ=j ҧoy~s%?ϻ*袌ON-p\l pq,Ekw##j5(d0'ށ!A<6!jJGf뒂ÞOwo9'?v>z}oncl|lvC})Oްb {iVz/T-Y KKX_0eYb+ //+6ئ G'uӶdo~GԼ@BCx,R0,h&A.oRz|llu\ko:t0ЎF5 dc(*PГJ0'PHG/ЌFP4K1;y` .dzZ&O#?9popB>[) 4C1cl\ IP:F=@$A TOh[ O [AkxfizNK"dL/ [ackwhRBh)2(϶2ZHx9[T 8(4PpNOYLu˞R#oYI٥~c[_xĪK3nk?|vo#+]ȴ3,<P+] _]) 6KK] [!1VO-R" w?PWɖTޙ{y^řozC{qߧk$C;X;ɷg mt @dʑ%ōI >Cx$l!1MQ 9NK~|$<RXt)$T薨LZN&n!GцZwR3{gm-]=f'Nĵq+aW߻5why̭Mכּw[͌- wN4=fCQGlx]VUMJ^h%S[u8ڌ"b R cX"-lɴ%Ivu$G qtj{SaR30Zf#A JPPV{|] l$I#l" $b:+fZ~`Ymĭej^ `9{E X `'{ KZgo\'~wEqv>c/l?gJ0r ##RƕH7Z-L-J3j.Yrt`sry8̖[rf-1[SL tDd5_/xs^{oߜ;+o\zCp;_7|fǍwg_quK֭7:n/7?7RKEWq*!ܮ6{\uR Sn TܭvW' *'0a~~%;9[6ķynQK.ʱe>&SBp ifS@rVF9$Tٔ_Vo@xX #T{=Öy"xxw<շʾN }_yw?yKxo\_?Wjڹ"{ 8P8V3vU͌e.d-AIZ@ٿ I>yi\t=KO,B٢Db`6gn);#ʠ '7X=!H݋)@.Ŗ4%y)>ZX _)D;yЍ"$ȡOb JLrd5/Kԝm dFSL'& $"'W Y{Q(u­汥4MqdБNGX솥O~\0>uxMZ%K3G{"'^F#F e֠]c p _/mΞ߾Jۛ؁]uco=Qv9\o${$ B=ex!lM%w*"T+ѥz+7d$E@ظ+r ؋u:-Ps,Wr^5asR#d ,ٮ)w =bblF؝+k%G=:|uW_{ŎeK9`zec$l+e h/k$ƤrrzVldfk$0`ٟ[|VI2ƳHr"s!i5CmCדOYv,<Ƌ{޼ݛ _? c.|lEꥍ7wzO_nq|q|}ofN)]brsTJ5nw"Hb^+5&|~WP-< @02nNNcYhyc5~X)!B>o.飍^- jI7č1Fm)6 Vj?w6[ 7 qFtGEtxUg+%Ǿϗ7=Oz[y;7d8ݵo~y|Ιsw.?/wSNdQEϗO^?;`[.-gIVע%yQ&ZA@&)> @|''!q7zç=&'8ZEF1ϞY6mS@̲ܱhY^:K Xb/ =Qƭnљ<]h &~SЛx6=5Xsz> lO iKcPi%xZZ$:@1;$}1H 4,9 a)h=i k AXSNmџAz?4z臓!*IO:̧(2IF*H:@Ѐazo(PާL60˦n_5s L)Ȯ_]3kKxͶGv?7ЈB>}O-xbhSo`/p -fԀdVWM$-l先h`xyXټL b'.rr`pEc@Pg-\,Wv]"A[~s9[EZ ^*09K6+ؽWc2UP&P%/ӏ!:Gd]jUͰ9~Ļc,|#fYy\?t!ǨKW0\ #41-l0V5ce-!Xe3BZclPꑢ[{j͛>/?o.wȚK'_|vm…uWv>ӧ=_c{]3ں`gge-3nw^-+aMAjKiS@FS5 f V?-^[R@U?qu3b&h2Ɩ !yRl` &;[PLl쪉IhW.oEhx[W5[WO;WO{ӟ]?ŭ_޹wouǿxb[>mo3fP7scUػ*oh= sa5}Ws4ᅱ X=i=0KNJQD57Y"aBV0YdB`*Gv(G1(ӱͯķ ;ug1WP#5>ƵA :S4$%`[LpМ ~A#ҀF$@Fq:'a8&z>B->v7)s*Rtn4@)[䄁 OR.H qZ2ÉThSQFա{ "=]@DX;`&LTG^&J? !ѤF }K`__4qMumk#'(V^h-pU0l]nK[YIyIa>6&ߐ`0q{d2GMk&dP0@It7rђi(f `0 3ARm1X,6[׉V;+A@.+1?pR@68 X*MmbR_yTp7x=>m) S^+غ{gk_]Enr8jS=@Ms4K<<͒'e&[)0|9(h4`dw #ZjNC&&r(v mh>?G$U= Xqu'wO.+;ƌkϮϷ|?=ɮONs:v؛\&6(%u#zC-2֔Y%`r1@ep_>|(=Y2*ϷCĘ؈_v]Q?hRlY6> O639\\M+b‹KJ' o9};y ۗtsypooq컋<{sgNns][7Y;){t䇭9XP0t⺴ E@ "h' eS6SHHuHL@0؂X)g$S2b Co&%0awl%b/ @PI(݀ Z = yAN܆ւ#Mu</b#=Jp䒢g$= Ʈ))u.}D&F~sr+f 4o "LiȓNʹKSʦ> tf] :V S>7 dd' > @J|A\([ E vxTL\;{yQR}@>VN[Ў߾o~flݿy#. E]jwt@ߐ 4Zmjcќ iߍ(cwݮP)n_!a+ ,_ˉՊ蜏Fj9 B(KdM&ulL f[",LF1{ӈXqy:-f.يXKztJ kE}O=r?S X퐤J-fA>ʥl66Skks*U %d-6(._?+dg7@rtA8+uUZ2Ul q QB9IÌ/voO}3|K×}ww]ّsysM?|]?}z{͊W>%->@\ l nJM=!}ϛX/X ݩ)P_#kxQ+r7vCկH(,Y6mHW_9Js8.][ayYYbo_:p7_\={`ߺS]9zgy;W߹rn=|[=Cublz8)gVNŃ ;) Hk?hh꼁 F4,H0DJ saS %c/2c!>b4@C>t &Eewy䋧 }- ~'_p-PG|C<6GQЍ5ՑϮ LN4DKVQ5sS7dxlnBjmD Z6 :b( <`2\ْvW5: Dd#P+piVKŒ Ղ kV N()UTj2uOQ 0+ 3T\-GCYiqe`Cp?Ƨl4 TVGʖ2R*r Sl4Ȏ*O`.V+,Y_|x{mIvhz:@6g!ߒ`rFs4W)mZ4Xw@ HT; G:b+Jr[r^QuZoPd.SRUp_S|{=Gqs.}<59ޛyQ˞*<@} p/:@ @V{!`9jƮp.%$s(bC>|"4& /lwYKWRÐN6>7>'cOE[0'YEGFn45!>9 OعȞ=v>oZ@|Jbׁ u%2 8IR y7 O)SLrPt _E\B\}:U  琠p4ݕdS7 Ӎ]=(`k Jld|A#|C7I04 GFnB)O߽7/v?fo|tWcQiy`{u36=:Z78{KV:maF[ 5Zm0GKT0hI1S2b[ X J;^rƤ0c a0Z8QU2Q`@v,7inS3j73.KuVm>$(uE  *uVPX$ڠ@KNGC/̘9*UCͅ[1btMe)03y@\ifAX4{|ڤI-.߀42k8mwֹM_ajɣRVpERY*t)v!SOv9׿rg~rn?8VVZu[FsmWo]|6}k[Yܽ'zD[(b-T\BO0lHhoq0b].1uԺ%})آ]4++ ds]b=/ir &@&:T.)!n}8~'}OO_8:Ǿv꙯o\ݥ_:7O}s8w'/;{7Οt6oz'R~ΐzL^jjϼͯMX[ ]B#[` U ٥>D3ɷCu-&c0KipٔӶ%q  FR;u|VM &%Mȕ;ɡJ ܁Kߟy(T@^uOQ_r8r iC @(@M7Fß6u%6O@O]BO|R4e#(h\4!#͹FMs]%\| 4jLO %e>DR=:cHpyo4-ACu6IJxX:f[J)W~cLrn]>xnwn߸uʷtWo^vǫ'pֹ÷g^=_8s_}wiϥN{W1+ҙrx)RZ˙sK']׿Vf_B LJ 1msN^3viFܡyK*&-dhU yKsڗV ̭nqv+}M>qOYֿ6}`}j)}4N'MX]<*-A=ed} ssɊɡ&Dah"){?DH*1$=yOOE K`/%YD Nz@y4X4uLI6PN~k T^1c(6@~!ߢOI~~_ddD˾wUfu=+ !9I3QUJi:{wgI=Ԃ]PToGfP:qmM4opJ̍nj{`{ZNTgoA{ohi暩kGR' J]  .IZ? ɜĊ) b2L sќ&7\6jY:" p)XA5Te-@5fK`lkEnpM{;(D(UXX5KY@0)Y[&s1IkF-7+T{%!f-M_#Ka.g;h@EjCqB#'{|vW3/3&1QwQf[8dRBv0fχ1X rY JS}z+ y9Mo_tW~|[.\:sۗu:>/kR,߻tNj5w8[G޾5ɖzkqkm(ΕW?s#yw?>-I4gL$GOɪkiϼC&(2wq±rWd]ֵ<MFfjޅYKvYy_U6cS5֕L^S8aeմM][6aCzԦE}J 雓||I=/ɜ cԡE=z.O]ܵ"w9g챫P'h-yr{&dʆE ʧo&.>/ Sa/C݈(D & ^GS`\R?Pb41FB+i"JU$7AOH~!pNWa8rgi|:Q MDAfP"=<^i! ψ\^4/?N;2 4.R6' y˧o'p- ; gU@fHswf$Z({@h#~gla掇^Љ}T+`Sր؋n}ӨM$I0fڊ`ܩymf,()6Zcx.Y,qZHPo\8\lͮMd &1Bh!aA>__PА#m8]4sC"ɔ'J^o7DW=-ˆ`L9 Ya I]!~Vs,S)K(6ET;IKb(0Zb%5̤Zl%r-0ES)Nkp Я8qLThJ7dktfml qT@Mgƥǿᣇ>?SO۔ ~ڐwsE?@߸?ys?}ˁ^ͭmYm鼧ZP\m$Ey|u|Ϟ3_~rn~v'_9{ ?ݸ6|+Z} )lo/BDͳnB.w_\L sb1T׋ؼ' ;^-X?`<@iz炑q+3!ZӻǮВi14{‚ 2;[?q]zK2 'Z^4Qtf.d +/́ RSIZ:0waz"7]ڿ p59V@ ۜ2;Ah 8|8h3S)~(ۇ=`;7ˁiC ֧'9'g0E%(G#if@ AS=u4~Ktϸ[ эi$zT)E RMK=׈{)MwHg#@IGœLV4qKjNZ= J."mAi?Ay#(<[pv:(p8"{]5s3qWNZU?c0I B?~t? {I6F)ZAfNInwV8pjs,l4DG>9htRbeRQ>o.A 0YN۳"s8:{61<(Lr 2@8@QF( wn㵄}@-@*vX5 h L,in b@2cw=&,LIP ?snϜ`ͷ 6jmB-+6B${m`p*-Ml䘬Y +dJQl6iU2_ʘ܎k^}v5w'?ظlĶP/e}2sKW_9QiZ{?|M 潾|ʓβX\T3r*jrxg j *PLV&~L_[OrϪubREϰ15EK"bSY.AqMOm}؇_#\=zɓ_Ԭ7o^qeEuqyWO 8#A^;.|O߹fÓfǸ\֨WW*-ZHfKy]4pڊHS65 ]O O .g?P9?n%A8P¢goOX5f<Ԑ)jHݷ{JR= %qFܡV_^08sHserFbdh/l ~O^^J' Ur CP;bЂWC`i8>.p@O=Ӝ<6|4X]R,}şO1DjR}>v\sd]Q$ȍN>"Sit>30&nF0z#y芤u*fޑZ  >\HDKс$&i- ,A#1g}*k1ڙ[fm?c f>{ӈ, yl78}PG!M&^o&᪗XL-`ww! //R[ߑ#`ƟlvZ\w9 dSBfwr(:[L#49qQ1 "+ XIX`"Yr8"@o@ 4R#t@d,>o6sLTQAV6&usR@blB54ҠAir`6*0QJʭQncm%Rk;AS$0)Ac\ܟzk:>jwx钤P1_#Y?-?<њ(źHW\flvYf`K?˚V[1繅>^²)NO/ ƣ-Ep.m\&bj 1ْ-/‡* 4/”-O(1*[iwXaU9W9!&%'$44?:ֹzs_x̍ox;O _<3|#[o맇op8hکډ>x HG.WK|X4f%+}~^߲qk&ďi//\Y<"gaeE 族_TjI+ MZ^1eec&nr.@R\mʠU-"_E6<}pUuCoH_Y+ --tm9'STejhJ(:eXLENH $,ɹA %<ɠ&Ǻ D9@L"r@-DD-t*ir%s-B/S%Ha=9{IFl@+㤅(G9r1YuP E]y4t6 gjsW^}iK'R&?>9yy@V?C( 37VM^]>a pd.8]=^_'Õ@5`"1,hęLq  Wv,&izSkwxsܾ7>}ro`ţ(?^=>|ONn?t^gp|X[$+!JXVM W 띟rV竨dw=bҪ[~⒊W^?q4M]\94~҂ &- WڞKi7$мlƯ$?sp̱ڇtevLq L\Lc]7ZfK!G@Id--0`G(k>a=,t:f>%p<9hFsLHB>"8tH1GO0;Dݪ{wO__P( K"-H^N3W):Msdy:P$Lh|"_製FPҥ'$ZʱlThXA6"}"OKa @1u0ָՔ=5`o.xꊩ `aN[G> @[P`t~⨧]^`xqvGɒk0q}NLfDF9 h6Y,bmnjk4ka夻DŽLF4[|fL-^otIj-+x.bN0\:b?WY,n7Ċj()ߐ!He[Vbwh L=bb&|PA1> 5  H WoH4LFK4eXm&g%—@ĊK o& EFB\od*oEjK n{&eM%>{~z=okzoc=a|ܴy+{)ys~]0 4:!Нg (4aG&MiѠ]3:hJR_ ==OO[ w3 ^Śr\B{Sk~ZseQy);m&ɶJQ)TQsg,+(h3BY%YSs#3'e6L|mwwO/|o:c?^>7Oqj߷ _;9|s|{(]?y?^Sǒ O-?6srBδ?/%m~q ^wq^kzʢig-`hAVϜײ{dt-Lk_ڹ,gmNMc7ݠ"[d?%{`qF";4veUc,; MY[! C4:*4|PNzW_FAR^ DQ' 8P[wT4|<eݐׯ_`(D6A D] D-46\@zdXaWc]_nB$6'f"._!( ){VD}M-@y]/OizLʧo9ΠfshS6NY_9Uާ-Mmo1~`:80Co#}~B(|]=_􏋿=&VLIMT0jcmVsYC,N(jCV:8jצjkdʤ"eCd4?i4x\(V M۠-n e14P@1bF^9 sm~5B/Kfs9T;8Ek925V\qrX|v¬8Y$1l$sG&GWNGQ"E"iiWR̦b/5&9SW⎼T6|͓?\88{`E+;{{ SO!\2iS~> xK5w ɏ]hB2 L# hV.EI=PZT.#®+u_<sz8Vhri+TL߉ V hnQ4v$D)@_LWb7V~7+>V=xoGO? Gހ2 (7oSrFPFΦᵚ_K䛵I*I)\\XR$_dMʗ\ed% A%%ƥew3"BrÃs܎T+SmL/1Ds\Ԅdk'W?5tyޙVUе,օگt+&̘fꆙAe .7N[5rĸb= AVv/1M/'u#>  >WBC az(Jq 7XOYR?gyBۇlyt' ֗3:@|5t,9YQiU\=,"Fp'4쥫=Ө4 _و^ G=$KJ1z!#1z*Q 9HI`K ۣ0.e#HޝgIv8Rȴ *oۭ׿7fm.X4w(z J/?@['xb )S3EM[a{%`a&byk٘0nqnUܑi$jd!`{9!# lr,NJe$m874XR9OJeYL* f2-% @s|Tj'9~LkmX򴫎V7 LsBe̊]Nw l)9?0%>+h _r!ĔmJC@`fqBwࠅm0dV(J$R wmC7RS-K}'w_;oaSNLZhJCO/8|Y߮(>3ݿMzT9&^,-,q-9VZ#sA'"SV.|!¦ZSB˦$sĭ9YYwE*=|k@Sǩr6Fo t*(9 tIr4} sHv  Ra#'DIΉ+}bxs?\: p៮.[/_sҏ]93{tomдG}j,c$'\ PC+bem\d\BT1>:4_&EfžȂwJ+99<5>$%)<=/,?:1 *4'<8/4(_RBJ>8s7Nԏ޹pcߝ=;|K7~xs_:<}>|֖y)!AY!a#f`"Uof']d#y[G&EBqX_b=mqdO|=*-0)LqŸCpgd7(8>*(33:/ *!,(;:0>4.4KΚ#RcJk~W&-.`甏]X1aiݽ뫦o(le9MX0ecєZ,IR!Ԁ^< ip!^Zf`d̀!w a=A? %,â'Y` 3YSuOi@-: țOPKVO =!DW1?";V!4VGgJ wrUMY 'l4Pm6q'! AbA? h#"!hHkzj6[?nglڑl+'H/@I @(VLaQ#+8]=.w٣h1`]rRj. QdI 0{mLbokX`nj@2k & @Fca%x\.Ntj2҈l1.$U [&m`-[iMjHK0K!.z MbZ؝-[ pb5@AfthAδi[ -y|( W+Fkd0XjlY #PuI kTfĔؘyCSy\TS7TlC-MnMZWr5tb)"ir hi'A.yvRv5Xz _lJK+i!߷q~n՗3/KZ?WEDڪ`ц|&C:@{W\N-)1JDQJvgȰVZVg~}Ń_:yGtt. _9٣7O:Wp+o ߹0|ص.wĉg.ÿ?LZl8!E:E36:&/)*?.<31"3*0)1,yH5%{XW=4A K Iu{\&niٱ9Iű̘Ҍ䢒츂\nwG4%gTd@4'Q' h "=&!5e^ t+@YzGƦnn\ .wDC)C:h {eB$R9 *&1aMMq ǒx쁵]˵aCS?CDz(>5(~ս;ɡpIKo)u$v Mߜ;|@`WL\ 344k3󪟱jiI@h!.@(ǛmlI[1D{&d fHaa Z:V[##+v5YmYD@Lⲱ^-d 1cY&dʳYy^EQ/i"_l1e )VKٚL#͖,Ua# V(rwl  ա@__ΫwAvkj9 Ɔz@{D'&P t;%HrE{y%sG 6p!6G; ad>Nu[/qF'R= QYqyĔܪڂȐJQIc嬰߶M7{Y'/d`^CKrANP0esM(7\R2Qsڐ-Ocz)`ֳMDaD  1#4d빘N>w [:.(x,ad6vXмXneG$y )[!hO'-J\k+Dm51_Po`pӁ~cD1ѠZlnlEleql$5;]0%P! %<ϱ9,N#MT˲%&s1ժjn$2^#IiŻBÇ`2[ AV.;;xߐi0i i`d MlU(6ERid,%T PQg7% PTY`jTm,44 ^6(U[ՊܤJUVs2 -wC2mc,ݡ>`P-0I]zUeg$a]a2 BS-V|5Я:*FqVȮ@\ 5փxj-kg1Fl0wQ"7zsIʮ,ŴO@$SɶYL'e4^8+xȡ8rUԀMvuJjr% !-M-k .|3|E׏tyO?{O]+?w~;ߞm3zۣƌ2 !"f aDu9w{%jSBb}a.%%$1G*1q]nHnwb)!qި10;2803<(!0&;]_YKTX;;(*6Χf.on겆kA]'6}4Am W:_O:I R4 Pn(M Af>;Ky4\}hA@qMI9P@O"&G>KF;|5* 20lWqDq|@˨GթD 46 gΫ4,+k~3H]);ObP'wӠ|@SA[L~|;z踯't,#*BusǭHJ #j L^W k`⪆Y[&d|hBX ,G|@1- T흴 UY"-S KX ~ *&_GLVa2٘& KJŚi0Ǎ XA<\ v{o2TⰗJbIEђM9h*zC7i IDATA)[3N̗xkF8VrZCa0|${'ZR< `a (+KK21d1Ryn
/TL\Y>a3ġ^5y5  )40b(TnWiS*'elNL8c`C 9  m `lP,~pM*h n)a%1O*yajy^ˑy4f 钠/ڠP1Bפ|=vG3'"Q P#R CY@P!acɈUD v 5}튽j$9?% MP3X*|hru*Dg$ "u?*!~Ri\3Ddd[whȀ1骔Wf#d[kTԫf&ۛ⯯ߵ+W,ra2/ޒ) y6>XsXrX!8=<˥jP;Ed-mBX1j-oӬKbnZxq~yW4w'${іE- Yv)%gمTMQ\ rvJrSmH5!JMeƴW~ܾ=׎~y\87./r@lsWvfr GB+%ڞGa ȸl =Qv x`7=40s7ʏwn@?w50Jx'$.ur ES v5'.:%4(+&:)8,銍pl+(And©[&NMЂ{#Y@s .|/NK}QN'Yǟ-A- `[ʧ5Ot,n|v} ] EOpO_& ^3{'4(Z i\#m-`B8Q>OeQ*ɑM7FY`_m֝ɛG_Ym>3@F/居ά{x?_MԇO3Qr(w]'Mۆٌ#*gy +j.}~+Uî .WOYzU_(6^߀vI|̗RχiWLX!JLc6%ƷP [\6)ZRq.ƛ̬,qB䵘b(muQaۛ|Ah,5Y&pxϙk*D/U8mΠN^LaJ&m^kUk^, D{jTo5{9:I=J.+lԯ|x4g7Y8+] Fkɖq WLL;GyBb+9/U| dX<nR _ RW`^XҵW&X,Fs Ci*P'y-+I't}E!两<Ŗ 9"|W"^.HRIFKٽ&|T;RP KV>a5ħъm_4쫧.ͻ1ďkusq (< FK&xhْS68G6%&\/WJFqV8|%'kaP_OE1p>ᎭWo;/|g$wK,Os*d 1NÛnP;e AeG$g*n`ܢ t;F5_/yIƌg84 pk4|3g/oߺ_#:,&&4&HBᡎpGQ5*)$! YI☼ʢȼH6eMqYAޚ'{pknߢ[Jf3iSu5wTOP?nڱJ'x))Kj/y9y()=6gyQI[+n*x±k+z5SwVLZ4v}J،SWLT>mcTذʂœNZ7Ƅ#[i(䂧qy>"]^#SnSUTES9t}`6ujX4 nH˘ڈJU݋(ʛMh, QhLYLjH%SNZ_2msr\ Ky֦lc+UWqe~G^_6DXL൰Bϧ,ɆxdƑj[CR8惲 ". Rv*BI\(Ưx/vq嘶׵s_޼rܩC[7looEKG9 WF;EeFQͼ*ڭ Duy8zI $G~1j]ʊ{;ۆz4ËN TdGz#G }W.]iO= qWc"p!E[w+}$&&1(2#<1'*-V ϏʬI-M$դ05'Szb n6wh97˦oc-] V4nAneUM[U:qYFYQ(~)Ӕ|A:S>De%P&p]W0n} %֡U-vZ fWC[t[*Af҉kA[;kgٔU3^o|ߩ{wݞ~E22 -f,vlLį& B$">lX4ivJQ(IvGi23V` 0B% %Vk>5 nc+mrU̳qY-U&ʶdP\ɪ/k.\0Uu#Q1VFhrVN ^m=vWvuǫG͍>;Sƻ|jl,iaB!BRG =id`t9 h[_|S' ; с>QPIe7$>%Jrs7^ŋ??/H{D)?9571Y2K24g?>ʅ[[dz"$G%fD&zCXWfhbQͷbiy ۟is4Y?fm+&8XAP4v9*ؖOZ;hDlҺq]?k{#SWNV1mk-k D kGNY_0~.MU4nHdz# &a4B7,4M?Z BXOCvi+|^ ]62(,t1 ݍ ħF0-8LyD$$#Ƨ3p.>ڄk6O ?? |2"z,rit 'q/УL@pNT>yS-5ӶA lqƶYV?u%J (VL__8ny񄕅cWB=N7O _3Q G&q9)IjʴFG Vs(*06m%lI6k*勵y`ɍ[%@x)RU{1A,VfSy1j 6vVܔ0]wed|s;|s r{|O 63jTzt|maivLUҲSS3Be>Uvrj6^z߬E$ KmM=unqk+MK?&)l@fK ')vdW176wpM P p VC glzG[q^0HZe1333K4Цmmq1(j%ju<3*>⹤6hkW8aEa4NhAdGbHj@>0U`(fwID(kc Gs1P 82EPF3_"gljXh#{*ȧ/;8YpFWpLj >&Pma@+DڨYy\X LP0t~[ gm-<;+h_uy%;[n^s򺃨=UhwT,ItCo5խ<PXݪcED.PI`'LCir0K41eQCVȉ4'NhA %LNghh`A#H3[H/azk20ΛR)}rHPRpHT@,aT<.Io.1y]'Y6 -b#gmU\Sm#N~LW,j|p"-Lt1x& l'P RI uͷf[]t>j<L&Y9܊p D[I<.3x%,8b]*c腸 ^)+rl|a:Z./6kx WΓZ 9C ZF+WPV6_3(>ȧ29X)E^쎹g<0!]I`2/5љ^PYz*}% qmrZ,K(*I[3˖T`ںwns?O_wSvRi5以Xw}dw٣yF+Kہ"kld3vta\CmM/ڥz~oP{Wc.nv*q0AnP}@Y>3Ü1.tanRGj_;z~>`omk#lPI.LIIOX]ZUd铕i]a֪; l/X-=ѼGkYr|% 4 _|gukT\|W*@4?2s΁H_|XoDZnAi /ܮ-݃F1V8Xp!h՟4e6X)_|UXx ~0s݄t8-zMx6-xk̇#@pp ?'p 0LP3OprLrN׺q#&Sk"C 5<+ ZTZ_88H\0s @%375 # t>X|/>,V.nD㰀ojV'! c>KV"J4dt`.G`\L0L: ŜiXfy  ,樰X,TҘK#$$DžPr6[sdLY!ѳIp+Qe&/0|*Mˑdl)@[z%6|+,pCPH)ŵi͢c=UvNSĴ'F[P4bHtئm Lx}. v&ZC@&@UBiP3)~"P@hj09!l%ip@g [dȅ')SِIRȤBX(I U.|:J/vl{Ҥd"UJPKJH>R oQ\@@FQis9o(\+; \ %`k-yu_=7󮖊1͕ڔz,I+x6OH'@KaHJ \Io?6Cl|O]>Oڅ_Og 5l\8Qme Rb"JnGUV8KE+lDmm %&+@~>;8:8{34 +uy B8;$8ʢ3&ᄃ Qڷ=ʖoaE<[a L>&cQb6SL+\NG5/ R]%Yˁ0dg s).Ta3\byǶl>5ѕd$ǁA$FUAY8 ʇYy`F9X03} U@kW=Cpdh`TRUG&÷_o>K?{Q`?,P?rعuKR\:]ZRr"KrÕ抌i `^λ{Wʍ3/Z9іҙ**fjJn+z% n)XWM˶[1}+Ys.QhGaD_D~;($(%+,"Ԓåk3Zom]uk=?1g`J@1$ߋiRxǸ?&!2G #hb.7F@S>o?HC=fڕ2U=p!Pmoԯya[YzŲC`-o`~zxCSS/vڔJM{1įu$`ǓаJ&@|ZjVbŻɟ{N-_4o[% v,?[AL0pJ 0,Sg18muI"_`')}^&j!(*49fI=>jFsdv%cƆ:&BcƘ2)@X ,[E@\jft3Ug-9t!3 4֔f2 9!"FlN&XhjLp*xXA;Z1Th&f&R3XNөA9 7j`c~!|Y*dž1@ye-LamV6B/ 6C Q0e,l1+cYqX+d#b ~-I+|uczߋ'n~ve}hra RtΒ  eRks4:BIY5#SnR%WjmseT?ޒ(JlSׇ__t졆y)T\X0>$rd X'c&6s\@^(ڝՄR29[3gEjysKw#_w7{SCe#ѝgES22*9 Va1156V l__V~AI( o;zށ  ɣ{0jda{pn v۾>`?vdٻsWUY-]Vk311aX_ѰcJ&>\_żg[m.\5CɬW Ppk|2djڕV&=uwmGWf4P@m mϝxN0 T`gò]7ҿ:XFҌs697L1~Bb)ˈV z[5j6/}[?BZCX(QxXǩ}"L@`c '}zRɳ8@3ĢO h~C W,;R(x`gؒ6eC)ڙZ9)J_`{ʘ>s| `10Ђ?$([9/U:$\i &Jfl&^t6p_}tNּ޲: xUX:Z(D%61q!$1$8XBIH8a2?M3$)[DERH@.&a"*I3LffDE BN Ae|+Yiu&Ωmq&j3_K%P@-A) @'66U\=TkdWR}FT~[Lt@-E8\@f6XfZ+S඀8'St{hzqkxy@T L 2F,_HkřT]jTBIof]~"exky?X̊PR| n8@(+V̹f Lq 8 n5SD wVjw{oLyѐ1eɰƚ3TL1YV)n6ڭ4|c.WHB5Tq0[kS!q¿_>z~8xt6Uο''5/4 `stB(beLvQ) ni(OauopqQRVC; l0XWa]tak<24D=,7;yzz!BB#>گW}#~ٴ37ưD쁕$gP&SޒcfJ ۧgKv%$9>Ldofb`!@K< Cnjb0 !f ͈-@' ^a%yTOq%PisP\RZ`< KٜKR mK}/' <8#7C@"WX%\\8M@bZ{5;*Rkg9JLBtaXd_X%s}T<4$Fڔ:N,lA <Ɣy,I1SAS. U'@8Tkr _|x|SEʮp)|r;VeKM<'~IQ1QV|UD:1Oq̅@s_P;==$\Wtl%#C^ogxhv `΀gzg(q tw2{}H ޞW~ 9?{ϼx[nȍϊs&VM~غM-i,yfc3~\1oC͒]{X3.^r-U+/@ -^pKт@y鎚%;oYzՇH@i9^ h~ 0*  0£Vʩub. ̡h3j?6o7$Oz#Xa-ȎŠXNY37qe aᅈZ ި Z?o.p^0`0mσzZF-w%Iޡ QE!9,]upk6$\t_# +U.|?:*3eP_J|\erl,0&"+hLp _d ud&0 ؜Rk4ō24@^6plT? H-_(1ft62hlu7db2MoD11WZi)R);'ܳ)~ 7NhmmDߒ ntcQ0eI\`V)@ iy4fVS18J7 Ĕ V?ŕ?dAyz%_lȎBoI-?l(S_KZ߻{ё-mώ\c,fC6M[m@ղp8+y{VR+]&YrkE3r9{ # <[ | zg79J\&/fŚk6%إbBGyTج0LEnmp(+lT:R開m|zNJs<w-_t|C=E'w.'5ǥ8jѦ:2N]w^?s ,9@q/Q `wמcv^B(hCxbK߀ ~/ uuw uvnhp{G?U7%SٚYOSn_rYknk}g݊_ZfΊ o(_lΒEHxʅ[kd$ @=%vBЪ` ?G5P pc(i(1RX)Rm*& X5k1p5[LJw᪦;@h6uKhkH=|TkFU0$ˀU+S A%ސ5}=ZE>x=chΛk(0_/&Հ_E6X2w[M^/EfDE{Kү@ѺG*Ô G+ЀNf8sXLDd@@b0SY@`(4l(;\SmErBɔb0ƙ- !&1%n"x.Mx@yQ#Q#\j T:gLY,"r@LhuM6Al#M j2L8@ʊe4:YSc &' ֩zK1[qvt2U< 1X )xܑr9z3Voݓ*b> .Il>89<-r6KJ-'U2[uX#E4YZlf_g+S.V&: , Q&wNO(=Z;N]^Y$E5"OLcNrʤhj/&.r nGM*XV"&%Eu*l|DJ{w_MlgY#^;~~8"D%+,yeSK6ּrkϪ}޾{_%4I/?ꀸ%t]/v/ށyUAPg~xoϋxkWȑn)ԁw8+&fs>Ox?ٶgv9݃1=নϯm ɕk ?ep]#?^?F EPnQ,XBP4o-VȏXm`k9ad,^_k ?$t3w:-zΆpт}@@ k rRaiեbFzٖrQ۵ft6En-crX&ПeR54ktHr L&ڝHfs*7XP HopѐX$, ȭL|-)%0$$Nn@" "3\ M`k15z&˓i@1yzc*'f㌖T# b`h1?DZ  ,\\gt XgTOKMPi7X;%cLfB t)Gs\6'(SR&81yH}5yܟk\#3y(@3PrRiw1@B:\%88WceJ33Y2Ȝ 4$ON|ey lɿ)k;P]厢Bl/[D)by!Yb\'qM_O2FfKXI2tgƾK=:2T˗}Kv5V6Qo 3~< ۳{Wo_ԭpMp*$;͚q7%Zʼn֭o}̯}>.oݼm-.^vw `78ӷ'RdyF~嶧yhNWZ%ۢYCn,K'=녿m? V)͓T[-f'F$Mc>}m2F}##!_ AW౏=ݵ0e٣u3ФO/[MV蕺?` n*Y2'QLG ~ðjVb,]{F؍X߂"59 z69q UvR ^h:<#vC' 8?mkL =/F`9}s]w-@h{.7d֔P8PϜ3PSS}e4P\L8˃5ˏxǪ/_ ׾ Y/@+_qj1B2<EƒH郓(KŜXɀfsɒidST*d`s4 `j`"B !f0B) FrMB2@\h"#[V(2w<!2茜nsO@CȟYv2EP&sijx3׬8g:3$ 8,_h2p<`sqd\H\ f&Ӵ@ H5X6d`7QUc2Džd [ 38Xnf[1+Y*b1r1xHbCwk%W:I꧖ՔF*+Xa˚ (SUr}X$k`k-rfmR UJ껈g8c83ck<[./(iWH$+x!|l N7 8c2+㙂FPJuA[-sbc䌈8G7Njlao@7 oD }zS=ه;g?[߾/SVnj۶N]sNcMiSɛjѢSlɖj@;_- ?@ꃨ3JF[sfR1H͚c8 C@AFIa}&8QSֲsƐ:nG NP p#%h= }Y; rv;oN˱<ܭ8vPoj;Qj nQX ́ѦNbOέ,KxKm߄dt ׭|ߛh:TtᏊ8a͉?F[,;TpO鲃wt[:u!TYvMfRڜDpde|h2=h* rWh0T+4FZ @pHTp)Do1xA3Q 'K [5BʭԂB\)@s '* )a]% ȃ/$U B7/O`b\ dtQ@J /0iA*0A<#U fb:FlF Fh㭓q@?YQH4`ajzWe4_Js)D"9xr%d ?x<X]SS*ԍ/el 9 9֧T@CRS ) dDY:'&Vd3e6kΕx~bDG.}:@ٟlV1d8g(15Ƈc|ԧ?>c\z{}vI^t|ϛu:ѠKs͙Rv3w]ӫ;r#BȊ,h,mOq .P\wGuxa wwW՗[7PO}FkP0{ͶuuI֛tXwˣԁ3=߽uV&0TOM`n^G+?yu|0ʹmfkZD̖a;ûw-!l>3D>=ԁQ"2~z ^oOLy~SongÒӟ._cU+wTUy@ ˶.?X%v2}lA̙ u>33r6/ }-7"TYx vݘ(?X?C1'iI]:nd kop틠i)=he@xfc>V¶rQMT'>Q r]< 7FzlfZVB"p?Bɛ< U]Hղd;Ο Kʣ{v{tv"AR|P%D_̒T2Ȗ3yXıyV[uXDF&S$eXYbXNÇvQt$z ^!HB3MYFKŔ&aL4 U.1hJqvf8çp|ieS`);`$$+lslI`^,6`6eTF &;ML=pF `3dNJ S8nXa J zJ$[:)2["𓊶| Xv=q^AFl~9Dڜ(_VETdwR#5N@%q!%&P>Um q7'D Zv))WST$$6Mqq,+_" @`S>Mv[%mIwۋN2a͡=ITǯ^ã~RwvJSB[iAcɮz .D'lՐWg֍ƚ :4~|b+~>U=zT=Ԟz>غiaōoA:xK$6ԓoW{GUߥwt_SGś^s+N].1?ڝSZ9\޲?wwl}wo=?rkUe&3uZ(`dW,@31WZPe%ĺCgMtA#]i>ҚDi8{D @8Cl>7gͶ~nҺ]M+T^fOú}D1"@ +w NF1 TdWт 4M7LumZNC!@@XJdXXfQM y]4Q!mkp:Z)Ui@7Kߋ f܊5B@F!K?gFҌ;8Aـ! U;}8@_Kc`U."EvVPNPBm V+]tYq{jW/^E ^ @kbcJҤ E`̆$bP b7D1jJJ+Mń3t( R[Pp M [`')R-cxAYorI֛i(.,2]}XRK3!t)fsX2+7X˰5@Ė펙&sSo&89,_r23[ 6 [e2+RWZ`+Z8BRRJ%|s(*F% |rx}r)Mo6d4i0X T3)TP(y s|B u ET`.5BH%9#XJMPT*+d0RϷ6!>պOy_ْ8=+ Tp$/$ՂezhTwTAno[%k3YgR*YN%"ϠbNX'٩ 6wC-,(cCtII1rM`JZKNj0b 4Jn22:z^G?X>? ^"ТjapxCtKRb qnZ%)aO=jjWߦ^?;M}w7m\;^9{Bu [uX`uO_]=tƳ_} 93m^߽{w}S>G{eDOvGh!/)-\td&J JÝv;-DR^4F>/-7vIޑAq{'l{mv,zv͋6O^{a鞂d<ֽQ9/.xM-[ ~ŁU`[bc}˗ FtP6Z8' ik.؎j-_jEDr)4*Y #wy[W89c=\7wKmn$ } p9l.C`c36s`J5iޚ9mfa58apZ0'` $cHM͚R'.Clm62` S!eb4>6i |DM|OHRGzVv 3huN,e`"@!\^%p1jncŜ֚ER\hUCCɈ*̖V:e[DlLXx†i\l ͥ|*hVIxVLɜO I&t9Gof'Ai2 "ZhZɢB 0iHLFJ+dw@i*hH?4< /ʛƎ J6f|xs1R 0x,X\u7WWuM{o6L}ߔ;4&?$NҩZ~;yck p5 ;{A  Vs)j}[hke`6[(&h ((,,hٲ~𕒼n#&"2[QX:GRA)D4]#Do 6،PS 1kEE'UL"36>8 p P"SV_Cj%e3W >x4C-խYx[m.G KHrlvE;n;\0~ ke H"X[7@<=Hhԓ7 ~@X~Qp`$r-f 0=- q ڀ{{%41{i.6z0 HKGA|ǘ(wv9PJLj#u5֩4[ hP̖0wf: ]\n@Y,m:4 )%k,j$%&)aլ,| 8H5d$11OqL)f+9c,LV18`HN73鰥\7ӅFLW7R+n1,$J [0"_Arb-@?2a@]%3?B>I1|&+0r/?mɶ+d on-LIqPH1XX!@akT{2,d%kU)5&X&XL(KX Fڼ͟J r+q%lֽ o18172r,t /eqFSn2Z )?<ͅ#ߺF,n\0s.ˤ2\!!n9BE [ZnjuM`:fX mHX|lt0I.gz 䔵 kټ0/dJZ22$4p9 @)$1k39zN* 2ҒЏNH`9cNP!F"j: TicLZ:-515B%/W;! 9 |;`K3DXN@JV9)=;sCA a.ҼeeI y2dR&| `wtk%V5`%@ J&# [U[?_01&츽#.~k/K(.GK+FSTaɷs9.4w*} 5: @%(w=ު)VhʰNA ͤX{qK11iP7jQ}'9u 'Rɧ=Pum:w;O^DS+WNvt“xztv_? 3T!AH_kGH)ȷ˧N\?^߅O_l):KXj9Zt$f$:#ݱ8gL+6-*%+.5"Eh^Nqףbb` ~D;{}}jtEy!)3;ߟ?eSR0ҀVH0K @p:p >.`=^&`8@Q~cgڌb$ oD֢%؉,8A6- i ֣{ `@ Q]K~GAѼk-`}o`>-vi1MaHX1`'ov] ! ]  `̤aSb>Qr|??ӗ?o]4Sub2Of2EM`wPp$/+,Dp\&0\1s,@Feq hVEe)$u,M2)l|D&(g4'i M@ !*3HPfI6RBSdç'"RQ @r`bfL|,LDU 2LhkЈf <+ŜP?Qp!Tb`r%)o+98rnj;玵5C<(048%dzbrN 4b-c]Q\b' 3beLrӳ#OXe ~Y^U7B~zOo=ən_+<Աi7.Ҵzw*pW.Q Ԯ,FeDKX8EuD³i/Gz֧]zCEX,),Aa|Q(ʵROWk[mcbܓZktboz_˛ C tZȇolkb -};cN>Y%!)VKޟ ӝ;[CҊ{ :.uv{"C^"'@?:L0J`w!kW/O0FK EڔPW5:uRT-!ZNFv/T?'𵟟; N=#gԡK0N#>pR>pDz}AhG]RJُ|[h϶ /띿WG>yYV]Zh,@FDIK"N]+ZEqPkDE*Muc.zHU?7 2t^TQOH (t+7nmgsxš]uK7,\|wêUwxGW e3OHQXH:L9c=154~ 3`%U97EHXiS_CmgL hJA8pgM߈4~jo0*ohbc ,zFFF1`ɾ;X8A1ƒ4i~*BDvA71ÌKcPG C[+Bei]u ֽ NZ17}(e1tJrR\~ᜧ>YvEJ4&zRl M77ś ƐpCpXH`03sbA`2[*$CʘqqCl;fsee9f D_h42f| ;TZ8p:d܈ՁY1SH1K6SI'P46֧i:aqAY`u,&#f&4i %Ao"S$L)͗[R @%;.G,Ql>#T({ڊm>nKz!5MLj@n nd*:m!r]3Idj\ Q*HDȘ*1-Aٱ.ګž){eWYL,JǗC] ;&x9?:OGauk|zbtH@Lg!!OϬ ou\,: `iEpIxG #ܩ x7#g&8XP~ssu`:|O~߾~?OQա>OOJzм#WC#ap.- ;~02HrWtWաNٟ>9|>r{H}׹O_zұO=QU\[^WU[X N@JXrRq)dk8sȅg1 p# O#Yu7|j!_nW9y}ز楯6,ynl^2Ud`冀IF&l} wXX`*;}h>xWrfou 'JpJq& ΌȘv^9c#jhTcHߗ`\b.Elj$ɜޅEP|8C d/&h1d S HKHh;F{py ukGt2fb8JI~4[X9NlLcvs?}+/nh2f2c[͖TAq1o1FQH)"(ȭL6 x<X7IBlFzt< bkvfYm3]y2 lSBLuzs#ȎI=4zhZ GLD =UM%Rqr{`$d8.`[̙ ?ЀќɊ$m?L̹@ʠF6]M1-4uiRd } -3X XK{%x` pYx*9Ý$qyKG]ٿRn,Cӥb'SbstĦܬӯ]p3 K%dm  W>::fiЈopx qcBMBnQX@d6:86L&% (96ѕcόJ K9q]~S cu>ڳO<^ݾSU+5G>Tߠ7 = i ᡁa!ãÃ.o_wdD(CCdӧzOͭu-{fy݇}?~>ϝ*LL ˎKMʌM/*O M/U2t-Q Hܩ@0iFj(w}Ƣ NX⬻vܺjg]m-+xp0ԃ)߆5G_7]yd h1}P ihc>;@Y37`ߋ~LۮɴiohkUv"hb_wt4фm CX" ྖX ƅ#{Dp1vc];AHCL[2+PJJVsfn#uCQ&)vb(U ճPIrd<U}ۃ|Wt^~/ EvW]d"`^&*o2QpfDeɡ ]+ @"5z `@7PXа)e6Aex2',D5 B,uϳa?Orr 2T$`dtSŒ&94&r1%dpnaXIT2FIlVQj 6$ 7[p$rBbdmt6YB[edž3Vl7u W fI,{+|.F؃VRt CLŒ'@ʆ%l)38$fBZhfNfLL4Ccx–rbb!`6e"ڒW(ZV*ё O7%oT%ͱ@V%WχkBx*ٕ o]\p/b+՛ˡBSmя-j)^׵=>3(۬8F9,OqY؛u¿G= @l@P`;Ѱ.LD]+ХjIuYG{=ucu?Hcu )Y΀ %9ѡar~&N M1- W=NOF=2xzsVß}_TOσz_}HPb ӥ ʿ\3 47s>#?l:Mzw ԡCZ^KQԈԨ9"ѕPS^TSVQryMt80pQ7*!X|oucF[}iZwf3@#9  bJ'&6AD ( cdM߈#01XW/G~h \ k{V+3Ņ4 蚎LPZCA {2mo@&EJ`8RT)E),  "vV{|˧=W|G?w_ML(/ܠ! h2dzTmvdYIdU`Y$eMRPl&D2XA.: _ODuz^*f@)]4˓21HXetsNXphD <Y*6wIDAT7B RFRj6e"Q3@3Tgc3ufEqf]xx㟟dɯvDY6d(hg;f ƄJK `]ԫ_Cߨ/kGWv}u u೑}>/>|;wl>xxǶMam߲~k/=ꭃ{[rRC˖}~˿\w|㍷_e1:pwU2bhAvbs뛛y & r#6B+5qr ہ/vR=:Ak8T2@Fc2e|m}*.!`(d .H|9hhz0D^ˋビ ta<*"ʱ_1v\m)2nZ y)jה{[2K,$ l*M%Ӗt˷J6aktXVf[ :I&QjP:\&:D@LQ[71*~n~I+9ecb)BwS巏t}Wo$ }äD=С<=ӧ{F'@yMs_sG;᳻/~~ѷ?q SFz 57~dO>޷c[ܱgw9o-/?S>c sƻV.>u򋯿S sg/ _ WV=~rK/mmNJ2X&c9^$EXbђObJ5Q9&LR+ݑ mc50IR#S>6$L+^iD[G`VLN/lchrc2`DژI J N؍N@!{\Hdm$ aJU.M2}7RQ + EnGh02Tiy[s?Uy"bTg);. Kٲ~]JUV vLW,jVo@Q\g$%l~~;UxG^ۜז4FC\N7nΒe׺P`IP؟X6Cb\U3sZR}sO2禼tWOu#L{+_Q7T[#/QNgnjlYɡ*!Va$&{t%1N&Dyf}Ǘ_zvW\;7yM% ߃: =^R}].|/#ڍYS}_c+Æ/66^m94.RQ1V%LEuFD-J$ZH栏>>:<(K9X9XY7n4iE7 u<_@SwX G;mY\-mHW|7b+Aqf?a] D(u¿'K}RNԁj2,0{QG- F7b4Xp-B<^HHQ!x$2mjx4y8 `>iZwη0Y ~6S 0;d$*aQ Gp M̭:I 0K EKpK(B 0wm~/_97psi{3xypK{u%QpWN^NӬk۷9;UM s ElT6X\!)h:`N(`5eǞgL ,F@U dd,lW:+Hf.XÖ4,'4MCBBHOβ9%  >,w }֭36 @"(Syi*t+b3Sd ]T-X21 L@fCKR6:p>}Ym_~.gոcydd@2)  Pc]v@mUl&8wlZ[BVb2L0lj>гȷ9k'>bHK2|@?N9;VaШ xap5ק=>޲v#o{oJa\U=.|ɏ,A Le:EщwQbf0H>:f#sBSygAxtYl\[u /qKA-;Zc0i3Hhk I/bdX+}ګZ,kהP  :R9wU@SiXcpqMrGD1^iB`E) c5 ~P^a9! mG68u4MvNAU8--8ha Ȝ ^Dqt ,[%@zc*oK*[Kgt\}vs:MwdTN5uڤO{g~u蛛7^J4|]!jYjùb~f\' +$[3@LكngJ˓`CUEp@;pBOउu(\WKr(ŹZ.̲'"MSKOHɔP#/f xK c*ϐ専 )!TwXUe8@Bm}Řp4w3)SSWJ%u𕤋/V[ۊ0x&2&Px<-R EJML`UYW=xǕ qL2L `΋L >tTuwMI_9AVzauKW=W)W}9{{UՑG湞 GdɝssO^RՁS{Mun u6..pQl$ouQJL--rX+2a1sgZ;GUi:}tl?}c#}D3/뽾h}wt ]3`4vy|g`U VgU1xRT.9lN[UjFw hFH3Q)TeaY:t_~pr˟<^QGt_8xߺܪb]VXhNDdn4x-b34Jp3^/)vl79-lq,M75˾fJ_ֳx}'ԡ_ }?9;鼪×:=wTgaPA3_y$LLH߀{`_/imCWpe U,U`}ׯ>\<;N@/Y'o[m`+@ԡM V`VLhv8^4q:^mM8[.DDxuv Nd/&~1i^`t a1=&v QG Ńy]L mhS։/ѳ (`ef๜[P ILJc_s90wW,;T8\~8{V2~Ѿ^ׅ٧G٥f\2<K.Ik+E&/^h:pE !oC.ut`u/CþΫ^og'~vztq%cnv|Ut9]vLHԅa,"GJ' t%r trv=w߁3q\qIfS%ǵsi2ZYcpf5-XfiK,Vۭ&f[6K<ޒk ,BKoNb-ff-r#%&onJ@\Ihc)OH.|#N̔4[nT)&rY1aX6CKrU[r?9+NJ|[ ՝'|G'x+ (C,aR m9kMɭ4ۧ>]_6[, =t5\#%4ã ́Ӷ|P~^#Rȋ΍ʏM9cS23csңCY͈1-ʍI;診/:4P˹ؤj_|Nz}WT?0Q0Ň ߫ y Ձ0<04>ů=#fn]pǫ^8?@  T|d@` ]h|U`eW28NQG^w6p6i 5=1'dM <^m$ָ3UP[l~$ kh! 58I e#IkR:(@ pCsfNߌsV ̂ϙ >y`NӹmӢf l9,K3BaHp*ebE,j V1wR=wz,iTIroEOߕ] xzra`ӟo><ȔLCpV^E8s-g8&Rt:X4bS)>z UT8"jgO^}bΓ?ΝGJn90ax2 UBdO2xv re*R+32h>/Ȓfr17`HeWdi.bN4G82'ٜjR##&Nhvjj-mL UPE%LY!CT dk9ŔRt11L^H,Y*EynAex7ۋ67|̤[Es`p i)ɢO"F֚؄IvWbkHCUhk%u|)cUB&$ʖB.kJs2MqWv@cQqwH3xs}m^ V F y黟[QI7-ߺ$r|vͳ.}jRC3b[ݖ86r."DGt&.B4E7ɴ 1gX%*J E2- VJqzOߨy˪?.Js';}72~ߨX~[.o=5+?-,Ol6I,O1ICest,Zo۴'}Bau_;uꙮK5uoyt;^3#!_bÜŴ9K9cYK=kE'M$ oLTZ#8 6W^>mᭇ}Rtԩo8cHR@1n )Wg*$H-FS#Eu:7,\|`:Q&4O0) :ޔu8 $)RIDC,EԄ9ѡL ͢ I2uUi6-5:Xl$Is $Dt9I H|Ò<1+w]-<;)ds ?~Z38cDy,WpKJQ:$\x$mRĕ"ZB2S)qnk"%)[>h1}ZNmnEKꠧe0)?D<}$;tqH/_P}WH }(CCC~yFU/k71:}Ã#@';=?Ꮋլ cmoE@8 #X^ZFFN`RѮG@}( ,z pDXwMA^>{n(o1RH Xy,hkڜ48S4-O\2Z~ B#|BRxf5S̈`;sgoW p>n}x h8SG[ _ Y6Rtl(%+@u"9?sy|;/{He5:{?g{rP9^#CIU[b"ŵ  gs,-Tr"XMLl\w_|5tӧ֬ޒv!TK > \o mZ̴J^EΕE)N0^ZTKh(.B d Q)hR:Xd.6Urhb7R 6q|Eט&K1|6@bq:L\ϢK\YI7-h&DkЦT_BDTʁ-|nFIU FQga XSxaJ C*tS'ShzтO_Y^jnwpsէ x/ ]쾤zP^ήk2_}b]9oٷ"u[n=%-:6tɖ`LqfZi\ngYoei(N@|f-MQ/V;?n{J30[ =ѯzT& xzaO ⎏|3u+ȼƪ5DZF2wf@5G0-hc(ewj UZ)Ax43;AۇA$XpXQAtL0kf6BͷGKB@ YYm.֒j[@ƺO}M5u~Pkg8'~wo_?涵gƦǸ2VgKfaN6iMhgR. Ֆd29@. NZ{d$ESWrg_yΜxEQmTe3TDƽy^5E=?9)1n9&DΒ- eS"U30elay&KbTӶZX йZ2yKF=.ͧݚ']U#/]rjH=pfpkN6M+Cٻr6,|U8/*{GȌez7^ܥE=WϬk_:z 2F24pxԏ}"nHB^"UMW?=/j+Ytޢ%`aVgބ/nF@ Ƹ+K0b7"> GĚOF-.ϜhL|mpDihpe)\cq'\ň*,l]x&І?Ghމ成$s@;0iNENÈG0p@ɢ}:s=LbPb$.2G \l~^âȓ8ׯ`P :}G=W2uv+<_ώ֖ga1άRI(D- ovE6sT idlZ([!k#)w.~ =׾=\:vڐ*pmaۄ SؿT3jX)|ʶ˲I.|oqj[-"L,-&H3_d$t8ڔj6a8SA!/Rba*x*՜՞  1e"* XTr U"UF:Hr,HUN.3ޑCY/rm}ŗOw^JrTCHPD$E,P5FK./)jZ-)uV[kI e~=_g)PKl*C%6EϨ9POOo֪'W~Psg.v{//sQ~]ք6D^Vx{Ô OeWG̍t s1)7qA+EF va jkcg1( -(&8eI-ъ:%GYmfWR}vq]t[S֎wաOO]y]er)FKm`?8 @gץ^RURGP} k&/x;#a0E Y6"MH]@?QJL+>u}. t"n@`j0.!~ Dn2@ 19~ݦw-9THҝa` _~xز?*-7Bxvw̌ #`'spD>d# YF Eiz}0TH54(uʤ?k kk*~Omro׎*Ԗk)h(˯/\n3׮\1gfOtC`":4GHԨdHSk3hn14:{R1a{ׯ?a9&!o0aGLRj1Fq,#W$pc漾-+|6⏉A G S$Ɋ0ѲY8(|Bim,ET&<\T@vDĬͲb\A0% R}8FA ZD"|/0d.e(:crt\hbSj]ٴyo7;&sxO%@,MzS2XmS0Ѣb1` L&˧^ga2p?253nGݲ&ߣHEG5-O4vK-URePYKñ/FiaCL7n.Ya08UШFW`|ʛQ *uJ@q  4Ux} oQFFUo4$yF%BAQCQ⤦%櫥76ϟˣ+쐽:NU[}Lj*}((%z[{{z:{現|Ί E6JGsǾ^XvV+zrϓ-XkqH3PFClA~:p9S5Ԝ>+gL6Ѐ vx9<1ߞw%Rqo=VvC6 uro_3T/#6^-UJmM ]Oφzu;wC=07~\aK \s0=5G(zun" dABƣWAuLv!Y#GU(gu|x.׃j??]i\1]<6ܾeoGM-rgGO#u=-]M͕?oNL ЙAE:$DI gr*0F0X!GC$U16&m5D"Ƙ,ӌFÐY^=\MѓO .9ܧ2Jfa)[죍֡!8$*q)zZ{['t%1fxVVj\.D1Z>RJVFHVjq:bU`O}ySo.^D 7MLp|J2IAƒ|:L`9Brx: AzOiTYPyф2Jܗ DJT0A\O~F`La ȫ)gDiE"iwPUbhpwɎo|$]8ѲGύʏIMzj۪zI͝r.E){z;*ZnT;JzK5ujNu\nKm.ua>b ՛Ͳ #_NM~!f zڂ"~z/*4~Z2?儓?2OyW݅Tw|=RGvtK-VKU5UYsmS Sxk5H(cTL rYPu4 \&%J !jʫ?_9 B*u^*24oM:BCBHMDJXJVx Nf@MLH]\]_w3ŀhMh?Lrta( `c0N0PaHSd h&.MTlj$O1:tXTwgʨT_Sq{REVggD oM7 d"T |a O#E^CZ"|}h~icN zZoHfΏVY m9fuQ3qV›9ҏ!L}$\sˡӽ;wu/IGo^}M]F`X㍧sZˊ֦nPm[,WjkloϠjk+,!U{`s-G޼[.uowBWͱ{"l8ßm$/Zd߯b ;@(%n7k48ȏ׉^%X Kb͊6 %& xXXl\/m][6\zz:{뚻榺P{sEk]UY_xQj(j*-_ySkO;dO >={ޑ]!eW"9Ya䀤.9c_GWY`(#;@ȝu @9@Ws!o0ZAw$(z/ O\ lE: %yM( iJȠBHw wQr Ir2E )tȟܮ+x鈻*> d>F_hO`6luzIigMYCUoW<|pdQ9 _s#nJ4qysc\*-XSV[#dY>l" "9.zc0h#ѣ"Y>x-C+Jf0j;h6άˢHD8\g77Z,3LE &[fi9#$=㳭 i/zMcm*ul|\TWQUUSQ]Q$uv=jly6%a?>7ift1;H1NeX^E*5A4魤{YZBðZ適ضu=[pخM?ΞC)SHo]0D2rY):=.b{zhTOɥH҅=;k66(}澾<ɷ%l?yקD17[jS}uRaܸm3&;ߺ]i;Xx^%Ex榾gs~Nv`vw8F z#(QvW %6 ?LA&go™#mB&0GiPy[1/ 6Ie[NKqO6_qN&ݕG v!P.ǭ-uMOJj =JFiK'MykKbz4~ /×]oC(v9#r(mw+|t rPx *Kowwg$SFH@9ܨU;}wb RԄ #AUR/ܹ`LKȏP{J @a9WnG!@ `w"E!w DQeՉId ~}nU޾yGWon,ih-m}\$vGu m5U_;yi0n66c'[mӁa4 Sjd"ϧ8PX/HE T.I:vP٣Mﮑj]3' aD1Jqt/5($h3bdqѮΩD֙H!R j#4w_o3Q&`heF8=QB43ؑ#N3v.?zޱ5 NlY&8!5K}@lmuͭUeՏ_o/Rrq~cm]$#aR*=r~IIDTK렖(nK|z4G@vupG Ui Qn3 DE~)&EgFt/g~XғRCXj~RQ[W_P}Ng7K6t>f/4tJ8r: 5aȰ<@DMBH@ыBP%df?*bk(=* 7Փ5Q=)i:h<,?PTlMZ`%9 /B a\qT@KAsf:it;.;q{w>yKU*k;Jʞf9@w{O{K{ccSeMţ'\ؿH pX<Ԅ @lja|Dh@Q7`S:xKFtHljLb05 #3Wz[*ܿUyz[nW\?s˞N]Q$ǵ%5J/_''Vu(TIgQFm^" 2F.W# 8r _s;?[zNd`X:I+w @8@:1f1FCΐGXHsGҽ1usvϹ, Od " Y~0 %^0%zqY2/ft ACb~}yguš֦ΖRǃߘ66n{kgE_Q!V YMfhHڋ =ƬFJ $nĵ 5!5> ՠ'Ű0ëR_AuHJYm!9XH:7l fmZ"Lt0e9U~~zJ=g$zWq~Dj/uz/6@RSxjcmERkcUѣokk(y$ՕImR]Ԑ|\GI{Q(:9NJ5-_~90JL| (!iX 5ow3X]z3kMJ Zw@W TЙÇ,Z?~X˞?wٓ7V޽U_xT詖4z{{zr]u@=MROQ[V[[|9EgL?ܐ,:DAhlԙsX1cX2#`DLAfM4['M##,5e=mURmMm~^e޵Ƣ沼押+7/(XYV#&4HOWk|XZT_tp['SXws\(]}@,?On^=U?JN 'W?Ǚ_.|Y/%F֍]o7㍩2Q.nw"m6'yѩ7eX :]~2w_IuJ.~af "dV˜k5̻6P@̬b& ڍ jT)5 alY2읗cӊqo ZZ*닪][kzx7^[9v_70}#^:%rhU}zFpn%x 0{;؝fFYaBچrvM@" 5hR -Euוs7jwǏ}(&~yم“Z/|(] FՄ9`"WOBvTG$#k:LNM7n_ZÏ֭}HM7<]DꪑJtu5tvwtԠY:.t!}}UM>~Ď}(Ã2MJIÏ t1 7 2g|2 L@GdK5r-vdĠq_x쩋 եRoTSZ{*4[X$uVɥkʮU]nF7=7Su9F0_&Q%$ aTeVy)D,&tF@ ?̐9S9y[ՋwK޽և/}'F:ƊlVLq>YA?Cz14kT8AϤE7!#^xFf.S{Z@"?DC814 Q?@o$@ l5N7"LLH00Cf}rٵb|܍stVזTՖ4ViQaJz0`ֿ[ĸAX郙R]|@ycFڇ*:}`0;Ç;iё0(&H0Zl,#j\>X ӝl{s'Sx־=~cϯzu7W}oޝ^wEZڊ뛊[ew_'o̙8l`B2&Ow~pt_jm<-u_Y7)n-;奵Km^~9G>lRv 4026'f=О@ d`=` =7>G+G0!Fs^i!vf g;UZ`,7i1 Z:"<&D)F́>^Q60Ҹ*;Hm1%I-5eRS}CQc+{W+[K*fw))7Zz~}~'W84t!/~q_(mwQ:܇!LGR< **R-Wr~N IHGA>n}QϿ#8Q;FݎJ8/i> J+ |5G$p#] "kqRAG0J'P P18 Es0qFGEGO\8i.V}^mQ W>~qHe젅Ɍ:W8|BiV8 E$@f yxGb}ZmʑEssM%%ݼu?La&N6'Bctt4 aVΠӘTOg,_WR"uWݽ.u69w\b̰Dcf0:Z  (R5Зh)=Wd+yӾ#K%։ lݏ]9fq7{aF%(xRPuR#|C(E(khCk;yv\=?Z8>)# f03ycIv+Yj8ݝQz|@>.*KRӍGg%5JWOeO0<{rLx!8#6)qɹQ)NS+ E*ծg%V|gqv 'lzxT,I{KG=RӎgF)Ca!^X<$8Y9sf\Dċ^J3]>3)C|0S`ؐ$WG~zR5'Xn!U+Y8_s İzE~⛙~ߚk3O** ^VTQZ|M~x?qGcltOci-:y2TB(K&/>|a}L7,dD6ZAҁjҏDi}YBk$_EB)TQٍb_>wd[-e5E׫޾z/jqf~N#ɤ*%J~J{PA~:k-*.pXX13\Z.)C8sfM2 u$'O2lB3URs\' ЙF#\^@1) "Po6ŻǐȨ'ݏ5WՖo(+zV_vҲif M`G T{T?E9sưck|b$7lZ^/gԞb`q69?O<%: Y8ouV5ިx|3'$< 3< سR]:jƘ=?ڮuVWKRi9ҿBi=0B`6qNƒsh*

(6 iTy8oqleIA_W$uv6MS;;{;jˊJ*WT߯~7:c_;w?{"IDr|N !M0 ɂ6utfK2/~oWev5H-%R[QWm~]UZ jKj{+{*z;kwՕT?w#IbxH%cFSVTy<(J143ũ Ri2TX9LTrQO2:ְ^~3n(iX|w\0t Hdь&tfB" )9|vSV O{6(p`ȥ#n1-O -ndßm~ayrRXkN- Uq*LM M:4,GU,I!$D: 4+j_}oR_R]^[W[RW_#~ڋ"G'F8hL z)i m >P`AX?Y6h[.[v~biRR-nc-?4wtҸx~YBŝMRw޾kWͽz񋾎{;jHgjI祦#lmοc;O?4+bNR? b J3` Q#q:양a#""3Bl$0-Dg  iA!YavsӒolҬ\(=8D[=\4pq2$]='~4? yzgڛn^=q҈S~`霑I?Ljsv yRG^w9IB|Nj>Tw*P|ׇ.Lzaa,V96 DR$j?^tL⪏IeRǓ-5UWlxPUrޕ֪7zY6i3?#r½CY|(} ~tpO%ٝw#}NwY^8 Ct/I 6'.AAXG:\B: <dr{$z"BLwY!dAB^nFNfFf@kQ!#$5D4w),Bfw;\ (QGiWs[Dvz//|GCȁ];hc;RGV&L?'4jL#W8^|j־N ƶ%W_uFA޽7=zes[|a[ʁr91F0g8&'b:4^: ?x[=QS׮ڰsgSgL7qr.D=5^~𳕟z6"x4eg ]M%mܙxM(mZ"TxU({&!۪u 8l3  #XD 1z1zk3*o${_MRK"-g Jo| x{RG2NŇD[)KOY)K?ML2Jͧ60Rƍ$Թ+륦|nw'{ȷ'[[j9&Qiu{kkeMH[|wAh)KjYwJ}/ntq$Kg\37eՐe\5P>eI.3%IzW͒`5٬{iv\&gX- h 3ۂ 31vsIiN&՟ 2kX"YNw;;_+"IץRe}]WzIjH}`v4Uiuʶw0w+@ wNWvlR>[7^R~E޻vyF@,F@l6zF2b-gW\7;1Xbx2S gAȗZWj-iXvcö»y*96yoqKw nإǾk2cM@ґ,9`΢nC o=e-ڑ`KM)7胰`K}0dhE@@@p;#rzP8ԜuC#SԹۊ!@; T% ._o:?hDqnF4mB4㎵E/X@y@H!@+ CEa0* 2Հ ñ1$Po 4j ]bqΟ-{o^o+Cww*Vɩvm9pxǯp2#\O3)j,EYiQMj4?5x9y:4 UG(oU`oҬQB?~[߻V_y_DZa3PAf:4m,{yշ?]֝7l]ߋZ0nLyX JN?9֯8iˊd@]G21Z&Md#e q;5rty<(cA`IId.8zzTo>|x~ߗ34sXTHDbDdbx&uj85JaUJJI()-w|nڊ'U -׮w_Z77_3DŽ`є:3utce :Vz*Q5o>|5No,먭kj::YjKZ*zTT:& qÂS{|{Y6a:͠FReGq> RDp}I8 >̻vu GW[K<_^ľ2Ǔ,3SN;S;\9CwN=i2"n,BZ_W3ǜz7ze0@Aekƭy6"PijA D- S2$Q&0D`w1 wYPd=Lz 'ۃD1,oPjdC?ff( cV#pW#2|U.s|?j"9gd0oRNjTw N~ >7幏o^Cߚ|r~_??.VcYVjVԴ%_=q}o vׯK[v G^z_I=:]P `~&+o' UFՠ!Ac%%%G; ;x5Yxsҙ"(5%v[6ѿm-uܗ ]MUzu4ָkc}ڊJ# _iP}J6՟,+s$]zH5GsR循so#o+*n{滶~[Yj_M_/Ͻ0ʔ烿']KՏHŦï.J7kb(Kvb&99_J7'r_'t5nUVH˛SJ翟5y730}c}>fƷS|G䤰v<# F]ڛ܎yA?ݷad-ܞqEG,?d@a?\M@p#3sw~w;P}BGٽ"PK;*&Ujiat5T6̪ymu;HfaݼkOg2s-dO t) ;Oeop<"Uj*VI1d7 Rd*~,r{H2Tq5V\ /o^+{TYT^vޓ?w_94>W_7)~{<ޭ}O A&0q<1L}۱5#ԭ z̶e 0['hx&BCDLZTH<2-F\AO)f(t*՞Aop)99$;@t^ z0a^TEnE!܄Ty&GA濕dB"?,w4~ >e6E g#lc(utD,JtP+jm4-j4F #raLtpqi]qMcIjjm.kop`Ǐ/2 G4fL_)2lK7' d@ df׏>;5zx3'_۷=uɕc7W9^yTU7kJ4wu5t7T5vԗ4WV75WhawG;gfͷzXSIbhi9@!Z?/D{{"\AV+}bqmJ&g)sѠ(P"L1a ?|ݣw j+*?^]^PYRp}ƿNJ.wr[n_e)zQh""LBɐgD[?M)3qeSU#gHQk RlQG2fc:l׏F9`VFxgAUPZqrZJIb+%8-A4AhRU(`1;4ZJ=pY=09GI%I oN-;+;3ꥯN Pb62&yzå/=m}џ߸pڱgR;y{֕vVO=ubѾMkՃUjR]i>*5z8I0`BaPx1sE 6 aVX聘gPsݓRG~ypzOǭ=W6om[OuŚ߮$7m%jDZg|CٸIaRYD+OX:'>X$uZV(&cޚ2RcP^V(6H-%yy[^{.ЖhM vk6O'ω׍X|/LZE|,ܚ̆!@s7/ďR}$=!z* k8 x 5* kWݽe@X,@ ; P*-k+Pkw'9Q(ډ b7 m"XGQp:$%?Q1xݸOMx̘WORB9` aN><4I8fL&RoSoW5hm׮\Ԅ)F>Ţ43t0D:4P5 L@dpd?Snn~˨ y~F}>bt3t\QP{7:  C4jJjWj NRk)!p YhFO0JJPsfheP8 j̬EEJaFnKFF2c0,P=0˰^^WɆeyy^j<-U׈xo|צe(D)Xj;Q[j9ӴnWޕo ^T(M-lZU:&uU*?&_+?p@CǗO_9s8메 2 |v̤yqƔ_{s÷> UI5w{r|#_sҳ/hs+Rkio{e[[UcKeC[MSGMs[uckyKmiGceO[UO[p@Cʒk/V_m 0{21О!`#1 {U{'\9W}r@O5DTr帚ӯJOJ HҩlͺblIKGݥ{޼f5A4d3NKٙKFF CË|v聯voZ~{\P*])Un 66ش|b b}YY)5:0@Vq"hr^rg3fz7&?hLFk0I>9fuJFaI `Ou_=be,3lž/ɐ%I@ X5wS"4jԟ$#DNEv,r͢~`u7G@G!Yu@c݂yb '@rwb]W:u;䤁~= p3G K"1haLє*P%&!StaߣYwtԁky"AJH\\rH",ܞ216tKy?oԣ/ K{v&SdVq򩢐.pmʬ?>X9SS"xe8m #?}qѩV}Јxßb" _y%G"tJɇD^<~ڏ^()miΓj/Yn ]+QW>ŗmkAva>XN}p~}}bԮ>)IUW>Xz1LϘ .5&(M ٸ륏5I/ өNAnІTK/8XA0%G=<-(&KV^P*re@8%*X m 3$DB\ {ߓ͞伸;@%ߐpsΒ^܃L@0w _ Q+y2Wv+P#0ZO9{Q^#EwAF80 dw>enU8Ɲ \}Q 9_n/ @Nկ-j2~7KAu@9bn7(. \43eti,XuGBHO-#-f4AhF?h(kkl-~71FqJ;L.?(J#za(MתՊh523<+}Glϯ}𠪰m z֪okx₻Og9q]b ҳ9?Vb0L%\Ȁ@jBquF+*"T{ЪHZN]ឌNϵew d/|R{+]sܞۇ+ouWo?i/3Ā}veL4:*Ț<3#eǻ~hѲ!ij% INO A}dg4bȧ\^f02Fq>gI¦Q PzV#JRP R@ _`@qJTBPkAhp50@֐fcm5LA̩DO{_wpkp޿>޷ScrPy{jON G/͔jowWZ/\K8-KR#;֒HǯM`RR!$U:U&9ơ1q)=m.dI  bܨYY1!Ƈ:2!83OyI,ο87wwo材 m~3'w~)y[uל/t9GTW\zBg1'7l0N~Tr%ߞ1xc\(kU ҙ"y% k")ᛞoK'R΢c||'sͲ+RcTtM+ Iq#3&Jn \FogVi vY-GćXLa9:d鎬[3mV `!/z~Bp@|8@nT B`BB6 )o_ $#m̵qD͇ќnq#BMܥ ނC{#TN<ّ,<D_mGG| @D $(p#K-;jGM" l`=f0s"%UqeI0RѼ:PԚ V5ey0?8dڽSYm*0cLNBj1'<@$Cpm8Agt6Ceir`Ibv+H2z?ّuwv'ՕuWW>PS  g&ɣEim|X^Pq~nR3XErL6Q\}HǤ T,ppR (PQ8HlAsF.ouj E0*^){ۧ 츹oՕ]^˵N|h_8~T'H>N2SE DTL=$ďXwg7q>Țe#  H L>ˤ,,Ju 'f zC8C5J0)PQlU&peTJhT?оP)ԂVQ)hFi۴*NErZ@M~F'&%-j0!ӢH 2R1b5[u`X=GRzenҩKפˏI<ՃG'ELtZ*ˡԄPZΚuh_(gdAA, T?/$G,:[,.g㌆d93șjO 4ڙH ee3] '>4H^1kH/h?yO.,C*!Hڒ滗a fJ9 Ŗ m`z/eVc:"Xhʏ91J4` Eόpp;omNJյgyNxS"]V  6!m(pj<Vd b1i~y5#&1\vji>g7f>y'uts#lJ!12jhp'&}mA)!'3å)oE>^w)Q7+ 3 ?_OL|o?FG@ԒZ*u1@0Q|/j,onhju޻}2g4nh5 Z0OqLID*|-S! pOl5 /4ASD9T7çm{g^VpvM郦{ ʞܭ,hi*GKH*uwvWUnzrkGnA)5d2cYr@ $!”xkUvN s؃S"㇧0{ߞ޳ɣwo5?,/T\wGm[{]:ЦMo.};!|4֜ Iz:nR 6I0);?xwe|Жu^{'yv,[0 UQ@ 2WE tm2暍#fX-KEprZ5 WQJ-jDm;&DA,3dL$Ҁ#YZ9$ZB _[EacXͦ7j`//IKL8DiZ<38a6IgMq90ԃ !Bp:gD"HP9y]T93GO%o^tBSɭƢ˵͍Ozޭ}]2ttJm}-=uU4ެ+ٵ:uLG0ls9jDPZ+7h}"1HMl I=>`_ڳm.,r=[K>Rw扇v^ݹ̆`\癭\ػO=ϚŐ<5dB&ET9b}X8T/E _ Cxxi_F1 ]2)c,\(KL%{k@$AHMl.W hu HOoWoPW*<}|*Q` Uh*`Z$i dP@*ד*P\4Z\V ROO ގց@S1Ҋ>hnYHtZ\{ҫ}/̟QpZ (,6{~:`$>D9q X3D0p@/Z̔H&Zo;/;v3mpV3c 4ۣd- O tGT9$3أtAgIM1 Iϊ,QZ`~S9҃{f[*-UݩqX*9)JwkG]qח@9mh':izEX?\c}xm°)dOuW/\Ӝ55-'0*B%D v5fvto0& QxVVPyz+X4a %A)z31koH6mE[rZ=r-ڒg6$wdA#u&r % t~ydP57>$#*܍B$sO; 6G`ѯG._}wX J ށlhaA 5q/?FI ӏ3'uy+̙XP+2j aNaNmWiI hCp2'R4nO-L]Ɛ q2C\KHzmp!6),kɟ6 iSU"XEY!uHMu@-%j/5_+^_KX"=F$,N@u@YIs3FOȝ8}ܴgg<~ݵ?㟷Oqbwӥ5=,Qqѵ;g_>| [~>s-+Ol/9</n/ Y6&:r25 19yQ~YX甇Y*Ł8Vki>,?avG{é=I !HJzk@^JjЈBzIʅD 3;uAɬ輘P=&vLb22ls̓4孷SI1\L(XͬRG-:Cs!KO0&]RS Sv^kfch9Ot v'+#Md\ JL0L-~D}PWܨvD'N*Ai!b׫h?B {땘=;=k[CR] ߖZoVxeF-SAVFe&#n MVs`Sb :lSnY!ܗk~ZԨa-3@V1i{ ?4K Fܯت^gx'4>C;!f}I~ٳ;޴lKa |||YaG+ `M>™,+dWX ?ꑲg+\.S]rbC酚EW8_N6ߺWh) *-EJ_L :# bAp e_4'::]pa<<< h_`(5!,?g=vAFDhL ((9E]! rhft6hLh8D3lـ \3 l G G NngPܿ^7R:d-6j CͮWH=0 rDRCFdD$EC[T1.>ŮGV}cHgk]«ImG3R˹gT* jkZcW3S* 2[W~Q]ͫ{0nHN+.!،ղ"qYnw, q d-/3ʮ}R~4x TP~j1i2om­ -ٛ®+-;٫r>-c 6@$. 72#5; @o@3!d6ДaN(o;ae+GҞݖhװeGpy&1!K漰''0tAmptaÆ os_9 p VnmpDp/lK]p;<y< V &p Yx><a^?O @erlx|}\ . qz] `0:-x?c[+k-_[kS+uwVlP|ڡ֝ө[~(KYnFPS> Tɢ@ ):cLXwf2︺"JIĜLG )hj2GC++4,5H&TZ9 O/ @~ׯiմ((8U 57 GvdVa8+ha-jGT A-FI5VzbdǽUFGrVBXfA^So0ѼՙxYgfӨ;`45BmrACj`_tzXKp[FXm:E D-VdaR4,ЀKo085wm!&glt;#L0AazG#$8HAaSlR:hukˤϟʁ;mrG閆5l.!5U\oHza4pIqF?o3NN bFp@Q`ZtdIY0M& j6\(|9P*|@_H J_AhpuAu0khqO2mg7 H^+a֜@|n3CSa!1-0YE ''e>%F7e4GHS56 b5@?A {Pޙ<SoI]v4uQb@R@X@U`=pcœ X: @138pplCB4w;Bom p {1yN74 *ZHa8Tũi8h~d]%e7~Fob7l} 0D&hSK:p@VXfE bS&^68Ȣ%q&ӥ !>>If$q2\qrǾʻWΆ>(tZpmk7l9s@ Ktu?,+/\zޝv-xf&MG RZ.WJ!1љL~qҏ[ՋK~{Go?{~Ԇ/ZsĮKGo*V[|ѝ Jo^-t5?ߝZ/>!;QEЧR\o`4dB)Hm gL4Zy5YwySH疤.7)+ֈ+r\<#&B, c7 6yj4dO/_hIPU^^^K) @dyl@g` V@dWaQ 9"#^1-z3h( Pt W,Np5 h"pcN$RS>*NCg "I=G 0@r47LhX%+0G0T$`S$ (` |]Vh V og@ h17U#A PBwLjeâ0۽{e Kqa!zOvTnϻ}C.j_íҼy&zzN24f E$I0+.A{V;XMKAx^Q 48hBQx*A|} "߸F9MxR2F<ݬG-ڔpS[boJZ%-ً}a;EP5G?ef )dqݥ:eˇ (jҠHO=s!J3Wa'D: DDPM0){+) Dhz":AF5AG Ë`܅v"=&6q H'Q. T*D0jubr&&LJT I 7` YM_9^ab-|S?icftӭxZ7 ZHjTjwiP&VL繱 u g%yxGY2M#\|io'7omUMOlYYGfvwVݹޅJ;+ګo^*q.ԙ ?;.$ dlbS(]*"BÂ~:w1gK|b/Q/Ⱥ߯zGNV_|x59 o֕.zھM'zl'p~|،T›~&S6N08ZO5yJ_/Z-FfIPZ q9L@ o#1Qzi+@ܵrvߘ`cڂ 6d,؜p{9jv2#S#(Dh-㎙Aj\MudTqpP ؉D.݇dAB4 y@ሬC,9*a?; t;d# D$tP0x ڀ͈ v``v$pi'Q tB.ˤRD7ci*c&2Nf O)XM[|e#{1Ciu60c(hR=c&MS̶)aI?\`ӁK*ҬZNTJB8v ˎ\ CQ*UlԄLVr8[;c9f8uWѵ3mzImuOcrD] 9y/~6;nYóg.޺v^8!xץ%kX `0wd6GZFN`f}Ɵ9m^>ŒE?0Q{iq݃;g\ޱԺ_NU[jFPUNKU(fSi,1D|$ -'D"n}@a$]4)`XmV T!JMVKEj*q8e8 v`Ood?瑅&xdp&a37H^1H҇[ N8p >x`8录p LpS6%tFz!hqh :͌2d'VES$ a FFt̜*vpNuXm0UXaי,N؆&XzM.+o@fdJ5HЀ3X !Hp2&+,fS\b_eޔa& M 5埔vkJ= =Kj+i}rTW-Vz':ooiҩAa ւ=Gh3$U /h(}hM W:ӆaҡLmImI3㐝064iaNfN6`SJRLgwػ^Z׾^ϑt?`V&D27m^7yԖzϸa]?xc,/ZNZh>|8U`p~Z 6M@>LcAU8D(:P(* }?:?K 5 q A@k!؍-iLz"9ve\"ӈ'(ħ+H dkIqixazx|(8bj~?}^տ2Ց[Ƣј4F6^=Wx鷞}x~_}֍]+juQÒlC%P!JDbhvqeu~m߾{~s~W_?~ï=p\÷=uMݱp<]*źH${5b),EL=1= ~{[[~xe͆~VnS+qeLk8if{F];dRMD3;L "4P(<3z( k{t1DOAR?m@= pp@|^q9.3y^8bN,KEUeTI%X\mp [[<"p8ܱ.l;-BQ @c[.U\A_*iXdTOE !p@ʌg; &6`0AJJtbLmLH˼tHkT6c% ׯc:[\/o1>y:x=^mȼt#Y)qՙeFgĴQAqͲEI BG4A K@_j@p0$F8״,@A>"? *#鎖P%;oFM3VnotmܻGZ7YIF, /PzVFm{)ECX\\% u EPR-=/P 2Q :.<t1Kx1I&cBx_b2Mjt q P 1aO-p9ؒɠ1ҸO^&3ya)[: "* EXb,L$W”ӼvmWﺾzf}a|iIj42fcR;NbU đnfa5iZ{ /3orªݙu{+3cʼnަsT_oW2wbi']sG~#Oji:Q2 ^]ޑuH$g /Yڳ䓯<}^W~{ ?{w+}÷=-xe:U#]ǎ7)%h $kUoz3n]sƗϚ|ykٯnѕu/MrrR)i,) cl**[L%tY2A1,FT"rA~$۶ AXWN W .$m>OF@z2CXD`""<c;MTk)[|gO0i{^̲@0\Ae ^モL\QL4S+0mq4[i@f'N:1pļv R*>YLiL,u1˃R^8!c/~ңsk>qX'ݔnOʥ"'irI4 i=e8R^ދ?}?O^iL3&J1oao&CjC~ԹC r=I '0#1p 7ta%X$A7$ &{R .  c;|%0(nKf3.ДV][X4BΑYјOD lɆPuھnաX5[M=q ',s aFiA:=T}/Q\ntr_E ruXfA^OS lpV}O?}U達ٗFRh6:V3L+. 5W/:u]~ewӣ_W絛Ӝ\!s˚χ5aW\—iBJtR- Od퇯=Go˯⟾7'rO'n[yuӳfIBm,,Y8l5iv%6ktg~کmɔss~ꏮ)Uk#|F-l9 s&\$2ר8rKzv"[@-јmZȅCIM`=@pܿP ? 2C''`szA0V>X`k*C!Q35 Ľ4PL)7^Hay8$qv% NV~W00]>?>)bBDl:~$CҰuZC ,ЏCq; 2E4lEi#k!;E % n\fLWb9B;E4 >T&5^^w]{4L&!gS=1kſXN֦̕imY] i5E"?[ffnKz4Ij2MM3NC'?yf]ԓG1tVĭ dXONF{*c-mn>{hU'{N[sVcDS"Jjht9p91U y%e !*2O?n~'~;ۏ~_ӯ~O>ӧ?O雏?v^c~vmQsYifqq{ԫ^duYيO춡}󛪾{q)-%ݨ\+G bUZӭqڸ3?jKLAqi#AQtV!Ĺ>@3ty1rQ}, g2ntzO yqI`@0=sNqAA9 !L2^GtYeFe$JY`Cr`f$TTHa9$b0Ai<[.aEek Әq;  1d @.`אuHX pHKpBv rt!DLb% ;)F-%KSVST+xTќ$$Zh ,4U Ne4ҳ67UvĄj|.gU5 ^Yf >dST1̊ɒΆbJ9P `pA|HecH,'`Ѽ,;?־ӿo3PL-xtqNȅ=ڶ1qD6ǖ_*S"&ܼ3  /zb>Yu;z%l1'AL`O*VD<˾c5&NLV%+VH<'4'=&:HCN:I#<99<X= Y) xɾDaB( I\띦D"Y\JgZ /֗LOqMJ:m bcKbn*5e!f䊄7I[Q{0-&܍ 91P4N;vZn@DZVf٨smt,T|4nu;N_؃~O˯ط/;0ڑvxIT[;O$cPsh5yB2Zr`Ʈkj$}6/WeRk J@$PP(DJU(5Q|2MM=~CVo~~~ه__'o~o#wrSoǠbT{)PcPxNn,H\6sG?gxݬ+k<+ED88sR `=NBB@I5Q x!V"Dh lzfTby0=$!&8s@TLqA<ބQ/cI4Y0.%H #Y;(!8#s_ S-Tf* s˒euM er#\t%(qtCZ\U=IRG}B"-*($2ؒOc򲙩lz6ET30f;VC~_|'_~}?y֯/?K~ /3lͅ,s[jZrDGQ.yw)s%˾ THC]ۣ`R8O `Nŀ A&69#dS[XbAAup -IpcVȞE0b ]!KfRY7|@'cRp, jpZDeTm !AdV[<%ű+*NYLK`#+d>뱄\%A&!CU+&قa:FH9=Áp~[ @=G2(hߴH8hsOS_str SP1|T)@pxpR{h.\H#nKO~_ iL1H!+F{ Xtض{tu,6j#@2A` hJ}2ёHRť**tIOoJh݉h?@^p*9HFSdQru6ڋHYL7oۼJIP>^hYhs BHœ pL,/:cݞ=gه_B}qf$_=%[FY_xb4S*.=}^Ն54ڢM1_,VP*R%12X4ʄH*̢TG|k[g([O=cG{}7_?~sGkNXzO^`qm1,gV]FMٗ]ο>Wl]cAb=5 mӜӫ%N! $2Q`zF,jDC-@΁D-a K.rWQ\3(W T"߀KH {0K5\`*۲BMj2 xMQP/ "95ױl !ȁtQ%Z@ۘ L]&>e&sh`!:]]u!&Nz@CՈ5ΔBG{LnmH&ޔ, \bƒ +6p<m_ +C祾ݬa'6?ֽmGm9r$S}rşjP Lxso)j+bx(̟)D~` 22Q8)=6Kɗ M=dm]2ŐO^?L!qV?O# K?dޡO{ƈ t:`4Fsms%&2!B7O2llii'fkRwExl4H1x6h5Wfmx O=}_]xmEd {d,"\nfvYvO"9ΌC 0!IY#)o9Jg6X}`4HBxtfjZ5@֫%J1 EQpPJ2YuN_ow^'oo??}^xr=OzѻS?p^0f./ •:BGmioK FzΞo{6_m>Y3Z7QϚvmfRJcL 13|d`EUry=dWؠ_6 ;x OH2&zSt?f?ޟDX!=CIՑf( Q$I4%LpY$X!^ @o>#@e01Iscͽ _7}J{ Rt2`rBS7rq:de):}lzJ( 9 z`.8 uÄ-e5u. DE(,ءr"92K(`=N=`90ra<u#*49+9%%[ $ux/Zڏ'CKi1D $%d_EH'Dd"dT>Hx65:M ,0 UETz x)/"a!tSfK'W%S8pUIlr2g:M}!%)zST#@ZltvjW:Y 5@0x;>hhs\?/}ɏz{65;ήJWSc1N7ڝʌ$îۗX-gǒѸ7ɁXN4*BaUT3YJB|)ПxDSJ=|Sx~GG?=Ƕ\4>~E_ow?z_÷_|;nre"^!37;&3%^7-`KyG?73Ԙ`pE IX%#i]MW8ՐG4]Ёz9\)s¶*C ,?M@D㥌!,3.3fR)!  5P0@f%|#/y5&cpi, d. qrY̵3Cʡ!אuJ<.$M@Oڶ  i'4h x'D/JcR &3ݦO~]K>6IYae*@ǤR8׮ OEY+'"kj-J2Mk)kYt)%R5ZT ILXƐ @Y&Sl|<{j]ŦDtm6"|*"y).A,:YYiKMseuvj6(<]e 5=WjXTբ[0*^P?yY׾>ɋW]ql2Ϟ}rpE4>)\,eF!'t:Tf0XXp"3PX8B%vK%{92K52jAʙ@ -EZph羗=}O__W?ʅ{.ZTf久bPȍ\ԷyǿO<^إRz346%\D=0˗Y{Ηw-璵54Dr[mEp6AJ8 `GXK.bRaϟh/ jC5$hc U fJJA3 J]P4xY!LιW%0 P-P൬@B HKir)x ťH1'JIBBޤ MRU x:yE9. ?#B,9b< Sf`u1K",L3a1* g9%z0xa^hKK$[T=EiK:GDg ?H0CAܟDO8̾RUWOO"?8.Gcm]7xڭ'q۞^Yp@Xg>:<ֹHۦ;( D@v7u zeh BiTB>DeD)H|O`J@W%P,P*_L`zWB3}s?Q"~9L% }~8b JC."ly5sӬ* ȳp+%4~gdS9Nfו+.YLFaH%SRjJ('&=c:[ODӣ/,׬:X`z܋yϮؿk/?/?vņOnt؊ѾhzKhb^Y(i,š"[K,Ud/ʼn\;["ZMa>(TG@,!e\q| 9G59q%WsOqx" &CeYo=~w}_NU5ďq'0,I2:љ-򬦛2 JFg8P>l P8?,a~ YPKǁ׸ /t%ǖJ<& %@>%0-+LVQs'JI|ٞCR`J/\H X9Fpo0A \#1Ɖ /9B33yF^Hr:'<s^^ qZxVυ>zHDtj 0 t"1Xȡ?zϾ{^-Ӳ$[~G>2XgmGرQ@#}{81hgbH'ID@|``NGإO2Q@Ofqp]Q*@:ERsjL$D':Sop*G3P: %{b;zP x /I%=("A}hOԵFMyr Vb-fK+JΩ<3[m@h$nZM D<9KL%ӫ'^VxrkҍـF-c4,TVhԜF=\( b"GoPRtx*5Z%uUc{+ym-MdUU6>˔unrʊflѪDQTvbKTM%RCbqDYPq(\ls#IA+W^Hբ2*"ǹ47pmSz{_חGo>iWB0JG2_iUý+w#ߺϿsz9u4vbV g-ZfҢ;^h'# [%׭o잞ok_xbs[E@Yv%"XNaEaeh!@@5fGN1܁ r\-,fӅXRE|E2|cI=A \2+ T4 [IpVD*=o=չMǖmx}ݭտ]x|ڲ t|gױ]gm>ҹmO?~*poT!C/@@&wZN}_dtFB0ps_ˉ'k xx4N@ ",:}wv-v7Y 2:aɖ>Ґ(Yt sh V= +{"1~Ek-.ZYCZFQgHm7"Mi$ ONz+]}JKZfvVfvLlњu٢ҙ5Iת\!*YAFxGV 0CeYˍ +bI0 q"Kb42ntCcW_t}sêӋBEY-\a{ӟ*ZϮ8IV~'RXrT5NuIU,+Ͳ$GJ4}VOX _ 9Qw|?w?:ͣ1uV˜ ]s.̋ ]0giS\{vz]s)UW2*yqK]ny4Pג.heW掚w.z-eDN H)Y&{, !j!PW.\ i P|~8: * NeJ/bi z|DTc8y~ CL*9[@9;FУJOGObV-'1AO%N 6n7ѳ|aY&/(*3_['U}EzfK91/YHndI 2S1q[ZѽO{<ܽh )a* mK69M?X ~?U}.@po+ɥPQqLI_9nHeUU .}%w_T?%-՜m8ē2O9?xO3R3oC!|]יZ3H'3ˉOAmo<~iP8"ҍĜ'#S*J4hcv4hGk:a3p wncǣ>ְ͏wCh=폁e]ss6 `c}|u<'a5ec y&7 rXj2oNkMځ{z.{ܘlJ1yIZX8Z߹wkxaуbi0X4a'r*QuIs(7k?"d E=| ' ?Ռ~+"FHp:ം@sه%}1o#Wm:y||^G胓gA (Ϝ`7ZhR/eo 97h9(_~W?!9 ߷s_lý;!b?#@=O@$ZTVC` /Ń4*DFc @Qr>s@7' , O LL󍟄LoEAD!'rĴIDAT`!k`7&89K4D H 9p\E@?Y AbU^ĚM6WAV, ፤S:l8źYv&Rťk7 9)^ּp(E9&)qr뀨.5.YƻR+"p rn$&⣙µԊI+s*ˊf QeyԘ *f [q;>&^r9+r}&Ae KD,{BI J keW|RRHjF7z>;uכYJ"! DZxYQ$AU\0[dV]mZE)rͨ#iEͳ뗖疺b _{TZs#24DR0[4d2O@vJѢ|Qf*H8N|r]B2VN`"'2P h:DNL徳eOs W$yyBaA. 9DPd]l#>ql'BCAroNYrd ?7(j%?CAI8P"3hr᚝wMx鴇oن6?al=l=x}`IH⏁%,K4l!|wRЧ_@pr}JU(So5S >%6@Z  " N=^D6@#>@@G?~UA&p! *&1mgX 0fia vØ Z9ӓQ&Tp,9h{=Dz԰{7b9#D@ Dj,(͉)UOnE"Y]k-CQjn۱v; wfnyЎ-uVttGSXS ձ[Ƃd%G@wcCCsNbe D.Zid H2Ѝ.Ql&Emy4G@0#)e I*cI|"T\9@|iwp_}}w[YZs,}ƧNQZ(HĚ.szW+T\f\ӨY[Z<+mșreFZk?{மYȕNI2K53N\j![WܰXڂG>P6 Bp%>y>B3)v~c/AX-S7tUPl )>0ω1]XP%ɥDEȀNbtF q9=99i}5 EOG>>)@DB@:bfA>|0XB|1q"䜲$Re$ 4Ě7+> f; ~@tm`!C"bb~i:`$i#_ ș;< w˶<ԾX8ইot6=1cDԽ,-҄,ľNv "C V(>9d"R8JT2 VDYOw`o粺.*rBJ->xٗ@Џ V9an`UsVLj6 <u# B(β#Km6: VMDzrKWtP5LWC@jjr]KiNp]UX @RKZj-ҜdrI"԰ClNw˼T%k%JUHgd1N45-[gY8`X}^lvTzRӻehe:3:«lu5:/ E2^ ǂK*,j \B6gۯ? _Еu0YYKl4mfZ3 @?f-5glݬ͢Dt.lM7} ~ۼ_3﹋6/. )Bݙ˩沢ļ)h dhqRE6A $Sa\ȏC " Cd!a?"Q1a!\[=1t~tX_'T  \ +(b~)=NO4'?9Df8ASTs-&H \-v ,[NRy(2$۬| əAdN[y;t囻-qm ,siA`}Yyp ՚yŐc ~t{_͉] zgR7mG6?ұe߳(.9a폃 H'@'hC|V8UI`LAX=I' %BJ^L|4z7 @/tO?Pha$ r@?4'Z32/X 7ڵSւ@["gQ*-AD!07)6~_)P%PyQl:3@ l><OxvdӋW>龁,p'z6tƶD#;uHv|NV:bpӘ}vqw? [0qB^ $ힼn2jQt?Q5D~zO ;`ۯ;$r2810?*rǛOy VPuMpX $St< &L:9J9VG2 E˜P* ]{i<ړIfSQ{PT[%Mۜhn-M[Q7:%p ?ۋ&J,-BF!:ӷa7NXпEC$f{^-%x2@&9u)*Api4NVkҙ(DjE r=AJ'KJ(ZpTmN>IЌ>6Qv[WїJJ /-v5qzXn Bcps4PT*F1ԍn%^tmC9!#|JҊ^łṖ`. ŝc.8mg|ma͘.L:nl]j{ˀa/[R/ՂV d*C#X4 j&Zfqk~婅X49t{wvJrܬ9Q,*J@xzX!XTywriZ.j8$}?zPPy)*S"}2N@p)PY@TA0$ߕ$Y Ӧ]d$b14!0 v Art|uܜ}B -.t[27͜9Dp~HP8_0=:XXI1Qt\-hcCs_/nLr3 gA$FNLOa9}~?Ӎ?~4#V;}5R (Hi~e&&"!.!5N~']NZyp&9fL's!wW&q0m{AR?V(nLC 'L"A?tb `>PfHDG,8_vnv:1PTs Dr펧S w+4ǴDu;O.5TWRRn}'(r#̏ȵX:;X 49nw6:aC\֖KLr8Ň!컉q79 'UևtݱTjE"9n;P-òvn6FnfA jSŔe8J@*TPlraKĺU/;Ӕleqqz tF,5 "nSZ-e!!Q!H%"s'21Rs$B*\nR΋l^ߜX__%fI[M1 \+|pV4=A6`֙E3;} xdRsw09}__[5$1Cb>C1%/O[ nm6|g{Gv ; lytjǖo}kD =6v9Lz 8`9µ_d@)]we!hlADd&y@4-APgSh2Ԃ@fz%3ŘVSA 7xyoC=@2LF!ܖD~ H,?8F4|@|β42Ė ]hwAH>4L$Tfk  } z[wm~l%/.aav} 2BjIƖ>ɯ{@+{LIÐp&%-gLF@MG6?4Xx3{_h=AlW60zS॰NC'0¤"KP^q^]M`g,- gmk$qQģ]1o9 2Aix?@ 7U[[-: @2&\ELk̋k"\1hEKz0K\VS} u|vDS^]r|dj @5֨3#Qw`6IoF]Y;AEӯ՟2#3}pDja 2=jm4;ә~UoTP$h%>Ӡ1Y !\&qx%\;]UMbi)L0j᫘W+"Re\m%*WfDP|[n K /_? }޽?n5;b3g$*ݭ缙HԴMNɎ $ LrGoK;Q7A!@! O`D*B:1uAJ/F*"HG_2ÐuD~4s>a,6ɃJytJSO6!=d^Wr?@~@tPxoR&!1QüC`X\v 4_GjBaӃAI!e:=tO |で0"D~1|MyJCuUVxiW8S{gӃ[}d0a z|`ǑGw?1G1w>|#ݛ8K$pjE2>;_)B)'9CRȗK2>T(DWљd"#@>[zgۓw `=b2gL'juvS*/ R% >g "F,N=4]\V_U9*eic&bˡ'<[Uš2/>;:kVk)r9:ʂ4#*Fe kZd[ @w$~.@żTbI&ٕviRtrFeXNf*fS*>N %#x<5&Xp?[vJhzM;h|%ƠDĤ ^?2'09/B^sFM1vvl,L`&FX45X4W5,'KPQѺӳܴME!ʗ$'g#b |`Ux KyQպ X iڤ"MXj^+#ܫ+dQk_ 'EerR:\CcsM{$,BMFApü_쥕ܿ}cޟ|ɽ 9e%))*D C0".U'OBѥ8X.1ʼnROD: s!A1 Kyyo0 T /CPH L'lMP0;0=??> <5R(ڝ?XIQPMJND'rp븮 A-$(r o0YT3=z&R#Q`s "n\\G{ʪ1ver|ؚ$3_zzQ9_"> *n s<CR?aMXb'j;iُX xjc=塎͇Yн/@R}Ol}x1?d߶cu ߶#&< z^S]6?$ShYxȌCr +` ɲO@2>U{ƮK7 J9pj\ta؁1,>*8>D`w@Ā9Ɉx B?N !4?,(1{mfɫZa,ԴXuUvmT:}y":z&Dj*e)`~O&$cctb7zMP_…'ǘeʵq5f-UEl. Qnz($kV4c%2eŢcdi UZ"d'\7լh%F jnfY. H#NPd6/^R<"3vݯ55{djlAF3,,״J0'R%\t9vn/ %}kV\1J)ˮUOHo\TfE43yM ~_H>?CHzBY !>dɳeiB^㵨dA苉Ҋ73 R8PAA 'c1Aڜ`96!Ja)k+T!Z(T([J^ e(q\4g )f^D㜐`k9*Gfʖ=1t5hZT;,A %d ZnJ0-Wv Ny-$ye=R6WH(!/X(Dx™%`Y(\"CV>\x;-—r:,+1‚rAC:əxkًhѐE#TP(/S %ز>'X x`N|C5 v]w;Ptm=}Kwǁg?Ԟ~k};jгc=4<9w9}o'Y/L2Vš}O8n꟧ul> vx38ӰKp&U=vn>z$\uk+}엇=;3~ Qˠ\E" TH!,BՊMz Ea|>) z9o@'[K؂AwD V߲U޲:"MmP&^ꋻI?fŝdl$qA+k9#@['klcGms)r$FBH0@jKX42atDFM^+ E1϶cKkY,6zTvЍ Ofr ܝq"0"?@R%sNA1^L`E: +ռX YAePӼBY-24u6G}iY:"Klw+j.ͥ@fViNHr54 +6)J9~ I)2ݪ"o0)ΛۻzO_Pj8Ջn8yqGY  _Դ@JB\)Iq@X"sj1]#:jDw!;KSu^qfDʺ%*\AUDh !K'3ӵ"eAw0@S!E暌kAc5kd㪚 S[ᢆdK#LJ)J"?p8VP@V 9=RRA9A)--Z`(ozeAIfD 829&^*FZҰ M JjbR+uSf,i1^hfZRҲŴĥpZ j+3L$PȇDn*.H2z ̕:"s$VkTZ ύ\d׊B5Ǖq+Ŕ 9a9G8‚hANǶ `8]m"!Ȃ8UO$Ab/ɖj"p 9'EGxP@~`"b EYuG{|g`\mr;#U5qa:Fx/?,8v-#U1+FHA,"^?B}R.1S;>U(QIVg 2k(fa5v"@ \PDdMr| #YWuOR<^V9HRVHNIBR| p"J.R*Lc, 38Kf)fqH( p12P\TnjzZ eXw4'-Y*XKe] DT*TGtQADX٦W#br ZK#Bl-<ב\ofO[3Ĭ{NW\:nKm,weIJM庢zgjZ!P#G8l]OCL55PU2s<1 \dE.En QgwFzQOP^S- !O$|o sv dI欑.]cg;u{$3=D~>@yM|>(&g=7q@jHfx HK@r=vq[ Z 7y/B q8ӱp0KP%@{rJS("O"?HoLH.$oE~U"dd8"J%(4NKlj\SW[@@^ŜPy8{97li%  -,ZUQu:kY.4S҉Ѡsx GB$0J]㙋,qYAmϕ<!,'Л4c (-A+ r'触4x1h^l '!0g)Ja.y,NVYZ.HEDE- R=4DbPXV~4 ӍnhP֖k76Ń*s@xVaHR,U),{ZTxᚆDpC{R^SB{=Ke|~Lnq!l1D$ bMdSvCUpə1<\W/A0 I G|.PZ+l8- B~W4agrY Mbdn>?6iB:zYxUI-Dai:c]*YgKbE$ ) V +`[ V\aTG愅 rU DQ(<>wL͆ =i7c:x;YN:kJb*n):mVfMEtUwҬIsRUהX+Rwuyl,kvǤΨԕ2<ٕZ[ J0&qQdU#"AA  $ 3 @x_iup ⷨDIDr&إ u)pΛ[:sCS"`Ɇozdh=[Xtmy(tlz+P ݆j$8J ޱ%N#e7!渼gc ( 7*Qmpw(Y )I"iCYM dW} EtC2Pc05JIHCT- Íz5/፸V4ADl0 ʁk8wgȒYjgKFk(8HM. F5Tb?K|$d$>0 1Tf* <]EӖZViw(| ZRr& b#DٰX hOթhlCS†;ɬG qavJ@dzd"M/BIBLTR(c0-V@HG4o`rƱ>\K4}$7|NUX)JOY$REʸH/PYTzS]lr^uxה۝^==sEvi1`+)FlA5!eA / PsD g1KeHߥ0P hgRp@D Dfŀd%拁.66g^M.xIj/\2[*n*:ܶ;vn*پxCmru5YbLSh&mfWB>q(/e!q8s1sas9"*Ki`k jc.$ bvnXXD>2q[ x|lS[HZ98czy=O2>P@z:pX> ?=!'gd9σv% K'n|=u$œObrSP2 U3ByLT|m#țMDydVb~ Udcp@^f (a_ט]Xp`]Q{Q:m+jɜ %,*Yx#9x5Xl2X{l~0L-BYڌ*i/olJoL-5xkEz{U>qջJ7UgΨHHL٧VOLNuB)uIH+HLp!OH)w4n !O﷕^ST"=85ph,a{0خkΚ֥S|RB=4*"֡40!]p[@r@{9vy9`ҽ5 _u ~oRӂs^:&p1nEi~)ye.x|D*~D,r~ RmDHU JHB.Ep eqm&ĩP=*iNsς ko}VcŅ5_[2ڋ[jj{]¯/ok]VkOͷ6E_hͳ.lj:rMTlUWcNz۬䖪vzTm(^VZ89cKXG7U֗D1)]_"4""]?+=T:>s.]TyekYR{P] XC 9܀qH÷;+[\ئgw?}3yn9y01_bO EǙ#:v𕉳^r(@џI@y,,"PUPkQ[]{mFoJG1fs#%&,g(]<*ASo$9++ŀqq糺uX_$(9T-0@,•@$\njBZFG\Rf v炿eK2?ʇdK\  1bsΜBU_4O-$tGYjBP05Me>l "&D(ʦ ZB](R2%RM|ő0N)6\;ΚM,)v`޵sok8+~{ekz_Vu^{7M=w#+cyuojٷۿ9;S]lꮿ{!k7^=slqyK %4^Zu-_8ܒͺea¦/_vŠkZgc\PzuKח;/ain{.ɶk:8O}G-{OZ| gCw>w ~ho<3{Z5oh6vxkܱU=׎,=:`Bi3Bb~qA^ WBv($̙ T'ż0(V/,JNy kwE|RQ!N Q씕NPŲ L@P‘RݓOxa?q͓6{ZfJ9\##Bb("+ZDBJgXjC_ s5E<>iez@p^^آɇ`tTb_Юw>ٵh'G>{{cӃL?Y;U 3`1 еQ;$&4lNaCf)3'O@OX{1dUzfS4rC'~{ zINFy?7 J"#%/dD&`Le J1.xkEPLق(}̯# " 1\1 ]SuY޵ cya@WQ)v@П @ wÙ슢UXbESX(Ȁ-xFɾDrjBS%"L5Yͱ\g H:Pw pit$ǝ0 ~,1 gZǔ/:`X9h鰜Vlگ.!8@ՙu$0G,s4&xF09'0@[8AQ@6fB#EЍtNS"ͪu6-j^qʼWM $zXT{V®:bPjsbx}~O'zB@1NDJe}r0H<) f,SZQH. p%`&tGRsUuQk_ my6t+޼`իgOx`bgz}*[Ny}S>t;K3tϮCN}߽x{xv3z4plc{<ٍ/n~i3g>~JѵK]x}-ߙl}hՒV,g cX5]ہ @OA?rʲ.; K=9#@/Xuo?N{u֡S_۷l߽p'=?j돯ކ67/X9Nּw_qƏޥ7o]pw/;Kֿro^^޻捳O{bk~cm5#-.XW.Ns D2q *'zs* 2A'/Eп~ $n8(LZ!ToKTߎc=ql9/{ۣ3Ѓ( &zrcB"iyh\s "0:ق(gc0Bd?%Vn;A D_u?Y?ZVhϖ|~jy@OB~K =wo _SL{BӐKi=pkgS*b.vfI5I%XPV ZJxvˡ|$$Ϊ1GPaѪ8ٍd| 0.?/ȏJOP ˑ [[YMPu2%4i|hFf臬4E["HlowJMھJeX4 HY*П01H2:`Lh mP"|JQfR6W BV("HIU-kuV*V #:N@7dMt@Yi *R-Ǘ4d5kk&3/_^[__Ty{ʄ<-$e2 k|jR R==[.i4Ct0P3Xxy$z8hf  P&O-+0zy<; b &77Qvw݅}s[-ˏ>Wa/>Oy5=g;Ny9O_𪖇W-~j}s=sØiGM޻vw/?Wou[?eOo7{/9Wnƙ߿j{Wlu;~pə>rW}rC:m&KS|[P"Pyz(dF" P%Ȓ(,q$"R*$Q~=6uͦjP$WyS>V<3[LzasL?Yz!>J._ѓg?Oyo@6d\Xݕ翺ױH\ SJNNgx1ru,JI$Shla.EM!V/dP5J8! JLWb.ib(JwF,0PE[ EBATJ9$f#޵.Y[e5?no\sv_,5df~@U5͔B3br"xe'd}(ZΆB%Ďyh0E^H\x.# y&$-ճv}mdk:<Ӗ=sWyɺ.П3~x_q.]u?Oo{?_?{)Wwo]o\; ࿺իּ}\w;?]; >]z&Au?zWmM?l.8啽Om}ꌞWwC9xn[Wb}}+5+Զrp}/e~r^s׾OoMg}C?.˷{ٖ7>Gu;rÞn~s>i_;05?a8?m߆~v|}߲|xͶy|'w.wj좘^ I.H^̅y?S" Uz̃R "V裎n \uG~hs};zt =OR)'WU翼<3) `г L?E`qM J 4L'K^_u+A^w#Yy1? oGI'?S:e`n(~%өܿ~,U#0JsZحPfnҵx03ٽQg jzZ ؋`Gi+X{D21`h ,+r@ZuZKs5a*52fMgq E/, X_` SoO&G@5-x’A<v$ngx< C7XQ L; `uQ!_дvhr\j&>Z9yPbx4;A>#:f9#=lhr,J %e ՅrYIT*DUe`%) ^)B`K NZf޹ߨstE՛S:K[d|r115m(I^1R$ X\P[; T) B?ѥ Ϣ9#Ѝ @OD‰`0 d#93D-*?rOV^Vv޻yUOZ䁕/{l[p_ܴ>mCc损߹ ]^gŭ~|n?p]v+6C^ƽ@_{ѯu>W>şz7?D{w?iϧ7m߿ :׀ ^?>6|p9_xWl?d="V0~tٙ\_[Y+^:8.;+O?~O߆Wţ se?<҇7>o?7]ۇ/_vwtoU~p͙۾&>yoѭ^n{S߹\\z3gΖObe֗+eB 7 L.4S8V eeN9n:RZPgOz1i&x>t_]SbA9-B- @y CL@1B؎e/mљx'_) ȷi4(d[ȪCmg1?'ߵ@Aѥ 'CpսIdePGxJf̚żn@[IL`j o$zfv? q@Hs&tfxm۬Hg"a U2J1HnW h@R">\ 0Tf[-ҚɌV? Kd=(z 3/p0G( [ĢULjLQ0 B@el@`ܤ(*}mJAjN`@\V R3/4f#&f@uc áb.RB E=)jŚZ* mK}_QϷ ޼lh_GQ9vX0ҾD)irRF&I+~?uˢ.aX?`T^Y=0sCf(hB0`2PP Wr O[]6Ɠ{:s]+_bWm]G7g~vY__;}7l𚓿s/o]{ 0Ogrɟ~֧yyUzJw/>}rٿօk_sc{/W+~{׾<`|t^v~MXgbt5[1͟\ OKm]gl7va|~p\wu|{対ugw]}tYy֗_gnӑk>n?aǏwwIo^{ຍ޺[7.Z%k{?q]ݺ7n޽w/9闷o ׽z޺gyt{6NްvEg6Tz< fAa(P eT.pQİ0O4@ ?dıcxƶtJD8-,U[oYw豱GVύy0 t=v 'y(BB)a-ڻqJLיfPL T[E)I 꽗>|;:s̙< G8e(?EP{`Bp"t/vݏFD[: CE#(nLk(?˛iD"`e42YBY\gc1=edY* TְYt"&KYhHCVi:["RUsUJVP:W򿫖smO%hH rx$ #2\) NתP(ԃv%pDk@PP1೔4)DbGiH|AD"L\#iR(c~]kmtG{oאr*ZY䭪 ɏ>iN֒1Ns737=-uý/jTzRr712v]-x֜`Zst}./25=jH_@ۮgsզfMio{s?/[&[F,y-/~鎋>`w? hxXt>k弍W 6]/v*a}؍ʰ5bn nN9mõ%lygv=]F%l|rl:(ŤޣܔSyAgU0@Bb1Q\十cQx3Ba䞋;~oitx(| 1KqrS45ŝQʊh !VGq!q-⭪.'qLY#p-f/VI, 6ӜN6́D<;C lk3>g% E2*d fh,frX+(ԕdrǠ.y22rثL"{&Üs9 V3X4*vyEipBÈQJ~>P>>,5\SR~$y4 H(W0|-+(ƒ*A䟙3%Ѹ|IIi0!@Lz00"4*&# G$s]q3 MUm]۰ˢ;HƆim<]ik땱wԥ=l||%R|]Ky;ؽS*mS֛}Y/rV>RPמ-/^7gmYKw=/[_w~,{?]o٫νh{WhƏC:^ܑ>/uS;Ż`'cAlÁ|=1Eݞ_7GkKԕ@ӆ8%@տm-ГX_ 'hُ]6Xm`\x7Uz/Ck-^4!nE}ox/EsՊ5쏻UOk|͜Y;oc\@TS@] e'BلNѣH 88yJ4=It@z<}4*wI($i>;GH8 LC2Y5W]QIȰRLdiYT*\|&0([(p TElTlEV|gem]0%k#b1dVg < Q_Nb N{4=|\ˀ6x3 ZRD"2M mE|ӚA1˹0ft1OhX D(.u |1XVl,4ܩ+uSVwKT iLe2MPwTty:SUCG&.'al+Y9WoOlzV ąt}d1UtgN'9 ENEyKVZZDKe0~ꢷ_/R0 2Cd8TLI!SI ,)"Kcqdh$LJ 4#rdt,@(!CA`r66W3ii)LJJD$+)Jhd6IʀOP`kE[륹jֽ~$vmˣLv0VS慊K1W*D-2UM~-Ə8XG_;<}p[#Qc뎽O2&,[`CJ?s]oɧC{ߵ}s o-iS ,xݙ3]WoW|>X-wJ?jxژ%CGΗW#+,u硚]%{+L5p- %MV(xsbΎCᮃlaQgV2%s.x,2q0.?U NC`W"A)<0`&Q,Ҝ7OEU})WP ~ȣ#lC;vwt8}M=8i41w=୛ ȶ#F6>4>+Ip{\9*'Ey9fP E 3Eӊлh"p(k3xН1i@EP wPcGBѲ3x&@6U\xlU*o2GOQT`ȱ Y М0q e38 |<(V!C_apX <*U8F@!\PJI͑@ӡqO|%20k <̖WBRFT4XY@ը XO3-,c8 s`0wYʊ˳UPtۘy6|%(:ct|*@+ʐd1&DȒ(:MFQcҗ 1EcGaZPlh01T)O6  gad9Şf2 4l0g9+~V-z[qPm8 Lyx!O bq,,$T97/>"JSgJH¿^&ML"K X*0hP迄eQy υj$دj=s,y+{ԧ^IMc3>6e~o]Fi~pοǚ?}/9RՁ pSe^~+8P Ł̷]9DiMxsl=TGkIDɋژEKB`;B_6')Wv8neՂ[Aw+OmYv:mM'#NF%o5_m|gM%}ТQtyK,ˤ/ckt!ƔgP$Fq<e!&٘hmy[SmN{G&;M;OD滺L@apx 0=! CREx Gz0YtWNug2 ,T8q qE),D5 QX 60D*pG K1(wClrC^x- jEFYcƷl7OQ[ħ͖V+ l54d&)^8ijlP8, ڂ`Utb (:}.>_ZZH_{%##X ^xjU4Wwt)(݈4hΗ+ЀHލó8hJ e5 T=]c6٦lo#RΒT$ %iBS!RHd9P4* FY/Pc~̚D7#PMfq2؏]ٯ1D>xZ|_½q%An ;A7KvMs@`oD 8t0hsAu! 4G-4yN m(qn@9ş@q'|:U- U55'ώK1U᙭vw1T* i*=M%gבـ 1L^`3`LV PɶwQQsSQPׂhuRҳ$5k>f03+0>c ,!]VkLc>RȵmNp:03u-j<Q1t qz.owwȈGQ0K6NJI7]4)r$ qx Hj̚1Bҥ grm,K&H ?gk|1ےBSȔdbEG5K\m.eUdL/Rc4ssa~ܺdMFbB!JgLI.( P@,&MfZ>@ HIfJk)R$$tmm+˕yKKhZ( x6r,ٲAnM۝zwO8\n]7cԥoμߚ{)eoö\eS㦴gR- p7d͞^[6Y>YuƄWukcƿK{V*sK?cWɛœeG|H/CUS_U,1\W??۞#B5?Se 5-~]s8~)8H?Ǜ'hxӑ-O]{:ZsHߣ~n8e54THב=zyՖv67%%ȫiwcMzm窬SSSUUVSd0,!CQAIa8Ғ(O,EMMfJ  L2s |p<4+gސy/W E"('b@GQ{JC"[pe ]+)c"<F b?u#b@&^lM(c:! .AVܯL:r""XH:>ٖ,ZMyKwQ;/QV.PrT:&"RAh䪪ꮨKlg+)z#wEVaPp8 x%4lZ\8h2c1̅\SJaRME|Yo'sTP՞?|twѶ2 : DZl+Y#2e;Y@"OwpgsAL &H" dj<*J53g;qeP J(+@@d>XKgB 陠y$<s#+6kRuTPleglPf$T %%3&-8jxu׀>/ԴC?c2dD.x224 ;;=]Uglt 2[!۸@e\=zZ:w􇹏Dzq*uł;/F a[>9/ fݩK[ &~Yؽ␗$}H}1]s"ٽW ɯR7$hHy٘sgœ h+%Sx ,D&riPJhr!4]*a!τS(MڅuM{xuϠEAT|{$_GuݍpJwP r@#KD(vrUsGED(#n#7!78$IE>vuKĻ .IeP*QE}5t(Pm!~1 |y>fӝTQT;12[ɹ53WS@0qe7@a30d;پJ"Yg,w [J#kD%C̕/%Bc2 ZI:K@-oZ8&\̜4g3,Kx)8(x(@q*gX ,聧d9@lPVlu.JėM8<- HJmGodP vl.Ui h03L@01`@`d I@L *tl) Z`d~gi:_L>(=f$%AEc D&LѩlmFW$Δ"Ϡex?M @`Hdp(8/O Xoe~T?DW.PܱD=lf", !n!C].forIx 7jSnէiκRp*YgޓYwkWG?ߗZ޷&nI|{ \GՑoZRHsWoZ޷m =(hϱ/9qSƛi:\ =JNvPh@o΂|+S{q}6XC5@8GApï`h}@|M*<4p͏*P ?unkH-ws>o _F!ߦO;reW%>mN~qOb h(aM֔U[6D_1Q pOO򿘳tցHS/nٳǻ'zCWԦ{ z,Z\{u "&GpQ0IQ|6KNil>WdY%;CZt^H!Dلt^GA=_(+ =͠И6G|8Z!s(X@?b HGGA!|t!~!x_%rՑ X|a"H(t (]Z|%u!6 q E[Qm*LW p+ Qc| vR섂Ѿӣ+ٚs=4 i(rrH;ӜY6"{0e7&tR5Wl|MJUceL]XaF,!nzd "][Me"̈4,ux 氭4C*]#0Yփ1XɻLPZа (*^Tռdem`! @ 'CЕId9)4F& Y uk>JV`af@8sl|(5$dz& PE Α#EҤPb4U\Pԩ 1Jgg9,y_q;_HP&(2UH1)TKF@NiFb2D)&3DL ǕIXs4?̍N[WjjD]Z пǼ/X=b~!lAԭGyx)nSYbDޟ>~I݀PM/'[Mkx۞Psw}:X~MٯZ w_qNtM홶S:_Ǜ5R54u`%x>C30Ȃrd8P`C~׿,2PHӧ?p&4Xu_cMǛQh}ǚz}xP%Ci=X'9G8ɶߧ;‰~;zeoɫBOC ^gj|Ҕ>dNqo){?ESܝn]em>8HD {]:CCB܏dtDnelj+Ý:sD mL4IBd/5!!A&22L"A&1$g@br(!%g9?a5r|z1j:!#t?B?| xKQ ~T@;}q&U+Y-p݉kFb(U v3A7FK+̓zP_!U@{gz<U|tE|t&aٚ'^;w~#)"xճu4e4yyG5E_YWpU=Uw pLl%`Q1,,<_^^ 3K08! :ux7`AV/عl ڕFۜw{ v?y(zMi 4?hN{=]F pj˺G%!j7D=i~% 龸Mo_x?yS꫖7zK9cH_mpіO1q_;R;uѺOCS'Zve N T\*\t}?k{u׼j-zYjPC5_G@ st CUvSg:dԹN0U?* _45qpX7~ONO=4un (_6y/@9Z9w3G<xP-z֖ )A}Gj#@mKxs 8,TzP7n]/ 8bSF> fZaQ0a78 pG|PyRHLH ݿ+4TNTE+h"BQ-ͣGQ{1=EO-^8ʄ{;BЪf4稻$1fMS~+=e8F,:!f,`^m~lэ[ RZǣVk`ˉ\ՕrJ"u1& ghgf!/Z *$2Jf0x+%$.alL @a,@ fwO7e͹<@|sP<h#P/xbN P(Ƶ'წj%E%wy0!R@b MDpKZCx _5Lj,Kǒw' ;bP c:j D]Hk) (E|rY<Q*/gQX*αUzB{z\zLHK8RtJYL:A@ěw$)LDΘŖRf83%, &wY-fnEOg"HcSW`׶ա?}<~Hx{17j2V%_H^ @ُc}?neǮJC֖-A}ȗRvejKlOx\ٯ|+hԱSNDןcLi|sM_wKN9>5_F%g}+9R "'|u{ʿ:kkO~|C_>T}co~m>T: o9T#]o?GZ792uw_^v>o/<Փ}Uo3uױF?F?*{ٙ[6ެQ|:A'xq]%;.os`;sLx*u˕Ou9:u$ν0}vEƩk S]8]7wRUe%&KFB%Cϒ HcT*͖g0*H͜oa0D3vi2F{]'lv9FLWOi&V@cAQ98Lgq;b;◨pD!~ &@Rh ٮn@y4d8У0 C -7x%7*s1rQp^T3u4X!@($tDuh%f(V/:A a. Ǥ22 jdŧ~yotc=M.D̕\9+yYS|П1W 'Oy5ESe9#@FeES gXݦ۵Z I$UA ry@ .HVYx >㘲F,1Whp/+ Џ1=OhX>*Nͳ nɻ(x@,l /3PR3Ձ(T MRqY u m *s\9G-Z;qli P \6 @t & axI(^ġk`2@*D\&dZniݲ|N|ir. \-*E!KcD>Id]Fopg_)?@-/2fs8slK͞z "}7qؼn9~kY fWmu`KN c|G7ݨY7o7?h|Ԓ5 G5=ڛuS׎|?W{sP{֒{" ~1p}[eh֯G ֽ~=PP%ɓ/~*`śb0 cU/u7]UᙀVux(W} :?vW OqhP!?q!_`!hſ~]PÏ}?ޗ1EW75ĭ4ˬl[6lo5sf+[$$xd:uY/$B!*(sAa (j\RXR^4UL£cfp(2B2K |1HiH?NK%&D YBB/vw-ݓo@eAeݚ`+#j5V\nkPiYc57PX򖱴Jv_\p*Vm k5&>iNGq}w_s?ڕ=ć @~(z/@9@*h@pȮW Di8m#5 O{Օ 6[yG1ǚuMo'c|:X 6u 9scg붢UF~}?Td%cG᏾K޷ؗø>2TeUẋ)~]g駞ɖїn1a}ʵ+QwkR6dީM{֖`1<Tˣ挻𜻵 7+ݩ:0>r"e.nw[e(y*ng3_ppM`6<3a0n}sC~xu9>[=-MX/ZWOS* "E%0̔PL&K$Qx\&+1Cd!{g}hSmt=j) 隟Ag=~]V&@ ݼ2P+`u~0Q?JBRTAG;9( *t2!}JTD Ņĩ >Qt2}D7p3 D~ R(-Vգ AS a4]A׊t+V޽xñ?\x췗/=c>4GI^W3Sـ(4V5T]˦Ηe-a:+b ;*K(nc&Q05lH-cs2b4w 0a3YtSݘ0FcxN* SFt gɗ`q:(@|P䤠&+rd1U|)ieIA$+!A))4&-őɧP FA,eIZK\g0h$>=;TFf.CsD5YlY6z&YJm3%`._v>(Qm&ERL&Jq,IU+C9ɠqh&'1sd$i%$lW ulgvV+/u֞㪣} +UotOv(DfxΕ^*Yx:ze ԝ OVF<~є%C{&|(:Xt?.|Iwco_cM~;b@ճRv~,[ob`@ϻ/u'&j:ъL4)}R:5Áb +զ>k̄_@՗ S%MsӚw PO2oU?Gj—m9s_ȹUspÚO=/[z?NYɔ3WǿK]q.}Ǚ "$?NVy*veܣ-Yzӑ9>4b^X0CN^r]ٻ|Ky[աw*nv $|{ŜwˣNsY'="b:/ > `Ӈ+(dFA @p*_0#PUً\C+hV}n(dC ˣgP$Bd.,DB ɈoPO*W@eI= h}$|j!G`e}Q co|}>~x "lI)g};-)LHc9Ջ"ׅ. ]ˢqMVCa7 E{ 2xej&ݫK|POJ|I9+Pɧb8~*<Pd_g͙my:~Q +Q%yg{M*4$}ё'r0@Õ@/~m@ц__wmPݷ_ʾvipOE?ʿuM/g[Ỻϭ{4d~,m:[_9h4 &[3o~ a}`UsO$ޠqʱ=^R] x6yɤM#Ge*xZ1NY=糶;p2Vs/nGp!g+k"z\>nE(upםr|cڅ@UNo< v,k4X-bd۞ced-bj6OR#M撙,2EHL)2$D"X lJ˜.qx-sJ8wA(?j w B7lv#OA*De?6`th << ÎsQ hGo!G@&=Y=HbFH1oiqj[CcP6QJl4p)x e4L/"A]"୒R4k[>]5y{(m/Zd~?aXwʾŋ2ӹ_pF>,05GO/ejzӒ@ǎB; *Q>Mu҇Z~h~?{>wiyZO;3=(;0}c.'\ml2`=vNc^\77f945l?s*e#pa@7K/@l 9oQREo l%^E张ŻA KVSu;q"kӵʈc=q~1zSCwOpHI|+ AGʐxd:MD&Qd2R2Dd"!áy7GcxM̠sdpG܈kaT#B+Aj0M=Q y(&= X8g+j@V tFq8#'-4%?B9 1 JB]hh4 Ϡ1]&y ME"apR!{]JSGm]nBC_L}|w>8r~ǖs50R>[W]A'̖g/0s ly '=};O&vm Z-'2`|"}._`WD"CHQѕ <The*UA[F\-Ʒٲ|GGxOc6]@ @`R2u)ߟCPJPkh91JV֟:,Q=lڽZJL4IX,&MG!  T*E"$!W3'{N{ >VZ*+w](wƋv[ 7]h[og־պsىX㱞QΧR}Ogx|ש-'3v\Qu"F[eaIm {._*s2NC̗]oz~ݑ1Q}ێ䷃_F 5u>@].l/JlΆ+_{J>,O,UɲQPi_O-ynθ[ c-wFܭ >?|2x66m0f7:hgp`΍F ;7a dp>sۃ(iw>tƖO;?1;.Ox4~}P$wˣLr,TSƒ}&zoNV;{ f@vtWZTU薼MŁ^>+4bopr%ʪ 6K,%äNo#H "EfG4pO<|)fbD=}h#0I`4#a B|lwD/Tݏ(F1$k+@ex وxq< `pVq䌋K3"!Q`"= @c%p~. EޅoE5Q`k &!+Z *oWZ'?__;'y1שGg](:\w4߿tǓo_Zdcl$TX+Dt!'j~ĕ=s#ƒ6Ov*;xz`_W[wPO~~ Q}w]I}sZ2w'Mvs?})Wc?+G__5ʾ,Wϡꩡ꿺K*uiiߛr?5d}nFGwѓ{eQĂlw BfmYz.ksWg=.%{e>`d5O:~pau}[͆w l ?#7NQ<b_7Ϧܟq4BζKyۑ8D4h@Ѯq#Qa.Wv&sͧ364~(D9[jCׄn߳!:=ig}ĦO5t9>kiii0.M<&$HNPsMI#.G]O;ĜpO_Y ~Ro/yXzlǭ]Bl;rylyN;w Lx#x u9`ӳ|``XיMǢw9GIz8y}uI`Z2t}S7@w"> ! !6P8քpqx74ox.„+w>)Q+\ߘuQJ\<Ih6I 1W!qp2=0= Q=2@]$ϖcŅF_sg7̓?"v;o 0LΖ{Ϛbֆ߭ [FvKNg?wղ]=fow#GyOp1+Nɞ8w݅z?CwǞb08yߚ9is&J,mڦ|(` FGv_15\@!Ӷ*Ԙ1]eƤiM2~)k- /n7+| @wnq ݽd־.]6<dӉ[cOgl_67ޝg^ s!V}ԋL-CNl9rQHc7z!e0+)a6y5cϓ1cǢ]=7֑ԖI%5o5]obZM.!@QMC^]ciLè<) "Α-X8r!-y5iz[KqӮǝ"tubg8}-q5c<jN@K]; A3 =/z 8ē!ijżA'W=H" ?yQ )L:7u^O; 6dA[q]$%< tMY_OR: "8>#V+p/IH̘泗heY*ۃN s|n~so>vy9}oG\|`|dtMUSPc3iA!JJΔΒ$łd%/\㶹k>XTlb=kJQޘ\cnA!f`Skg ZsDlY{u@Fb9[>c6ՌA1b@80YkxVNnt8_hϧUD 2p 0S04ZV˘!b1{ʓux|;4B^ɕ/8<9Z1tAh\B>{.>wa>$F^P12oԾWhZ:ih2f1iLPHSf4 I 2I)Cf0$8HA8|$a>hbe9 Ev\̋$گLsի tPooYOD/~_=(#clOY8yق*#Fޫ\ Ndt0`,sá$ϑ4[G܇b\ACtZ5o28hHaA=캷nf90 Hx:mm'7,%]&ic2_wOv䁽=X@ʷ x? :C?{ؾ[O٧?sdԑ_ TNW< \a/cdMV>.ŗ _r6CGʣKYlRy;/lFnDHNA7 r;]NC;֫ephgǮ#F6M$oXqd=6ެOQ@ެ9ǝ+ ^u#Fn ) hxeg2u&G(4fQB܌?X+n>|zpwY3NacaZ̃m»amEA0 64 L9'$M _ %~ER ||D (ӋnW #JESh0M5G.4D x5 x =%=y(>È!1L xq@p@"%V k%yZ֝z 7z}oӿ?ݫ/?yKO>ѥwμ}kܿ~buAL^l/+g.`q1 BaPPPYkKh˧^8qС$ŕ4& fJ.4 h&>eH1xVL@yry.fa[cY  K&c^l1Oh2ؔ5Ǜf9'&tj*} MGHHIP(,I%gXSZg0\`REFY,pӯn_Pݦ3e ʣmՉTh7 x/0PIgl\u*lQ#)}.ėG^ ;ShO[Ox^x@[kG < HS[&=R i;&ݎz] _~9kD6Ir0 Xcx2AC8_? 8j8ۖ@֧y{ ߷d|<5 UO5o%S#5SGku佨ZeyԧUQK\t9{=v\ph׍_N|6tjD=.v߳;Ǹ}mVO+;}*4 3Vϫ[WhPh[jWe޲Ѿm`Ɖ]2BF^(9[y8zu裖)/Xxnxp G}G3<:"lBn:?Xk_ ߎh`@.[lm Tͫvo]m[l,,-5rt S-˦Ak**s130;x9Gu{'OlHs!!ט6׸a@=mpaL⷏ryt9 ~R\2xRx:傸9`8B@( w+F7,2]||q'JFU`pg(@,P+\ٜs~S9E$tz 4c'K8G !aA8@ F"r[SRw=~ϻS'߾9[Ǟ\>GW.v7wn Z6ryKx¹<Qs9tm e9k$9:7=xz퀫:YWS;檭Wbҭ K|І6&0֑Xt9g!xʋe 9>`(br,*^8嚂-+g%s0#:63@ AL\$"KhBeBì3~:Rhf h iᙲ؆- &!eW)Lb2]!Ւ/bV*+Lj?+նmʓvV,e ,OXti>!SDL0:@I$p2 5 JH,2h-QmXmfQm~ٲ,ý ӝV7[?hP (W@Yƒ_K]1!v%-Zlt m~ >4eykfi5\HwK)"D'RIDf'*s+u!ma '\#9vtuzpqgNb@ 0@ч :EQX ]A7#oAp#$= @῍fc['yp/3|@p}dȵGoEOHp8<K#sm6Vs{_ߙ;_gyS_~n:oQ_)8 J"i /%IpD%Y*2_yyVlʥ7O}z$'d*.`ESsR%<=kN i\# Lm((rNl;. #3)͘2dzz pY }M2\$o+0l @)4D%0 IF$5Ʒlxrh4$SITCf/5aV(W/Qset cWKQ3HLRXuǎ5c9 ZY24)MEiIu&m&2M!Ș^6GK$bϐP&a7~seJ:"  q1k} ,JM]{œyځ8w2mӥgr;]3^z0RuKaB/v:q{ړR{՞lʥ{]- = (ܣߴUǨDxOc1nc.gR21y:c˵᫋Bo>ޟ1  <ٖ pCe9ZH叁?OOܑ@σslH_C5p|վyߺ~nIC[̞V>( _x5gÍ`pr9^Ꭻzs"q면=:z-*\xAFTj-j]8h5/3թ2^PoeWvO-vC.Q~Sw*Yy97ryArwOr"~=#Fr/ ;0$!{A)/AXK&"^q }D&C$0*)3c(n~zw@m8A<@? 9h2BANAw3@87AHH`:e6(* 6{y6Z d-0:k9NU(J4l2UHR!@ :9Fӡ3W)&vf.M'E(B%[` fd ( DM2]IWeP 2 :QDUi(O6,}ײz,OcQdRL]d/# :cE$̑!i0@q4Tc}EZTM_Eʯ﫴_5.?bNGbL ,|-MdA"P:M[6gB"M=Wo7$zճ#oM5u[.X_dMN0-M68_ <}$XX/Px;R7u*z՞㯗],ǫ;x.FeMOm8˪ea;{lXٲ~]m=MY nypӺ 316^L;1|6w,m"byw^[YQm҃ꄷyz6&N7i~^_ESӆ{OQ~y侼!{|{'.Q[ƜWkR\N<]p֎h6{}3Vf(s(Xo_ɵ>dSzGE\ } U=ݥs/[وdPB<$4ȶc!-ۋ&|ڇGyŞpq貍h[âmxuD}!ۈ #QC@@.cN'P5 (G@< EW.XQ(b@O@a,BBYou(NJ-HFggwώt o<PHN6fE)41hfک9.1Gvne}+=puXBщyon(+=>ک/o~yzwwɕwνuߞ'W;/=~fU) ʊB?w,,} " q̅+%8_^ũ7w\;{ރEP㬚*DZ|{>/R0eqϐT i-vJٝ\[0u[<%ba)G%8"=ialE$Xl us:DlB :@^ZRH&*0s6{)KefMT'ƶds,HuhbMk(|*u2WRJURJD`4Xd<2}ReDEk ǢY#ָ-x[Ώ&ݗ .&[@#ʒB:+pdI #JE l6IHq1Y|*Un\AF܍f1+ GUxeheoLw/d{0vs{o~`S[;Ý&8 8}$Xe!w#U_/ <=<e c)'Ҽx j赲}yfU5Nִ:j0_Q:.Kq=9l4N @#;BNF?tҦy=%q}7RߵkIyZt7jY_+9Pć'g(xך{[o֛;%`E~h{Ypp[ofm}!\ױPVLyr^bͲJEk4K-XZnauqT%S`Em>omm۷ٷowj\oQ䢟m*aMc(ÅqKM ,M6$,:8LOnoG<[O@G'͍ΌFsѼKuCᵻ<B*94Jq6Nr4,ְ{sM.kCmͥUUW\$VG{\.B"8fJO:]cg򓻊NE zFu{& :tŏ8Dwkx Kr{pME jϠAA\ Ψ U8L%hąQ F"~|$ O# uG($MP2%M-L'rkqe' ) DU~H *A(9bJx'RC( CQ6:_b\sĔ=w.}u'׿/ |{v x`_'7>>ޕw_8VWXek]>GF]CA^npLhRRr6$HrI6Ca{3ɟNMսgM6~LMގ6YˉL|=5<6_0?%{_Չ/P4@Mhc`QzL >HVrs}ut:݀1GI`J(dװ+"2‡BYj,l6N"+HL5ӄ;e4*6ߔPf7E%E3 EB2y ))$%LsZ@&2sh4^AVZ̤[*܈xc}8d.ѦS2<9&ߋ$3 d2l"It)$eIJ,KF{,Ռs[R&m]m0!:kS| <vml p$~}K_#@`׋NoO?VY1Bfoo?;r"\Φә'}yp %uSd]īgv|hJ?kGσ?tMd9Xm[(M{ eM_px;rolj=!A=tkeVZՂrڲi Rj%,gjFޢL9f'٬0\MWwl F%3 m*.QL2Ye/fstX"&K@Z@ .RXtn(>GɌǰ`lRs?g^N5 6{ V4XcgimeghPnhj!"-(0љRCM c(qٳD4YRչ&[jg|]55͹6e?!ijG}JNM=1@O36`чb:'&; a1( 4IEK^@3J@擆~08wOu?H ˃QJt2W /cb)g@96*d3`q)T]*}Lɹ$}QچU clu6iX-dqiӺpߊ-vKכGY?0彻f1-h-cߵ$- :{>R{%;켔|6>B޶E;N;u8̱o>[|zhT븸|@vFzvݒR*;\< [mu::ݠhh[;o캖p=gǣ=kEnMyP~T|3{#U'kɟ*{pl Z 'zAO=7}݃_^GܽUw/|uۯn^<~r*6A>e!`;+6)j88+'h >"$Sg3uONrϏ~p?_~{wwʳ(ˮPUXM#-X9fb߼޹7.\?}:`+Sz>D[K.rWh:ljyA$r}dx|(M“Jg[_~:--*#%G&*ey2 U8PYhs,mj54#ӔJ_`(1@h ܲ_J$QH鰒:%kct|O/Q`Ǻ[*<]L֥7O]o~]ey;]Pv:: q?JAȵ9@nq^7?(S<ǩk>/h {gn>neka" H8~8HWN7yu]QbcmgtNF~/Zv+Z]ֵ7[/oZ~imɀYIѡMnn{:R?o= ۏ9s]}ܭv_o㷾2/;YSo/"@Lkwx 1v;o2_om {A-6upgce T-\}&u5-sp\,U-Mi-ài x\~ #b@i'Q}jcyT ~5^zPD$^:gW'^q}bIgǟ^{vg>?g}'}}u4Pח7_9hwc[UR7b|(Sh2RB"P,H"Y&;1񁷏N|}qӿ'N}|ϻ޼vBlpIACiB}7u䫻WxO=uhNX%j%!_7%e "|3be"i`21T$odO'4dMBR``XP,,GSȊT 9W'4`r $7\B_ٜut x&HVΘ/) ) = F)I06LĀZr4"HP԰7c\7IxՖE9s8 U$L2I̒ ),AJBD,d%fjRfn0*L]TfZb^ͪ5zsUO^^A^ykKĆ`} =.maUݡ.Gb}NnܿZz7mbCItAa!l]`;%-5M6l݈{ܝ(@B JKۼoϹgܹmy '\}zyN?흿?>݃//n{t홧7}mUVڎqP|(;њƴBbd#.߅dP|J"i?8.-B; .u`Кx*(XOBH4  F8PN aq]p${KrW9Ɏ4)XAatPv`Uq(>,ԁ=b01$Aé"279 N-@Gu_KޭVvO%Hp*BC (8PD x,VDX-#1*GYrEAkʃryMk̶7˰3h^޴ʼsnͦ;3*q҅vh<調WlMLñqS5+Dd58 EX}F j'd镲6 d1 C%:/YU38!'ȚHЕz6  ]@9y~ATȒ;a9tr_{]@Xr X_0o `q}@#^_}~8W]~~uݽ3_\͵?/|yϧ'Ǜ;{ѵWξ?ϯ?}qȡ,m#&AGqq<;Pv%h%$4F1X5B%S^=:ܻG3?o_o^9saY@Su fNOܻ1痾ޟ7piFj*`5I fP}}:9XlڱY.͠ 4`yndM+f0"AM[_}1l4#=XTq8u^4㠄1Wؠ.)ZȎ,'&L Y"$b+*@D#004`B&p@S#ai)PH'-ߗ\~9^VfXuD&!1t RPBH بh"SS9ϴ#þ;â.R{EВ R7\G Z[]UeD:y.;P>R;@Nj@N%)<Ӑ9V8Qx.TM Җ㵩SEWV6]]~pC)a=-!5֕fyZFBK*gO|{Bwȋ:$iTyʙkKK& "GyOv#XhuQ5a:/~5nx߿>l?d0`ޛ Z81FV/Lnߎ9k] `|8zo5֕Z}#y>|e%S'3|Og K N P /%*md83RH0%+zّ6.oɪH-.u\Ϳ3Px-N_u՗SZq].Wm-9$XnxuPnr[ N< UχɃrb|B\b3%Fb@K+0r vt74IsLJIDATkΊnω tNr7-QژۊUDfVzVZ'`TʵWJjS%r[P%SҾ~e G՟L8s/ʯ{}j_>T5?z *@Z 5FV!Y7xP:d ]C@4 N4mP011 RRtbY_C-M?t+ LAZ\z< d?0^= p XO?>>ˋ `=Yt˳}3ŝ׏n{ 56KkgXh)l'jJ 0h2WT`B@ Po_?kAxGW" T*ɀ0H DSr߀A۩Z5L,Kì,ՄUjt+sͲ5o TЕa^h=6}cⰉDK7j~lK0`V$).?U6Vt,PA m6&\i* ͕Yqr&Cyti̒KU*bפmʹ]3Wx*#|$)7+)?6LMe&89K&bi.A+R7_l}8vÒ7ޮ-7+ ޮ{؞=`eJw.ISq0Jcٙ;;nmNQfѱ44PgP*!@KY`c(:ڛjiUU) /S+_ `[VeB@izcZDJ!`Ź< Ubnz8t'a_\MSe+'c%֜L );]7[3d`~ S!#KB8MS#2- _Q :$ (?Cbo(zw,&F4G`X$u Kpz:x08F ʲBq{hAFEH0&2@ZTÊЪJ09,|~X ;. ~>~p?LJRxۣOo~xۛG__?|˻s/̾}xӳ_{{8aҨ7eJK]*4P(6o|wӃٷw=嗷w_ܿX盫^v{N};d̽ZX&f|Hًv%QX 4Fm$Pl7&ǝ,7"փIc2}TW,;v6ӍFqmHc R \4B"S8F #鋐%X-^/  O騑tUItS o@'Sfh! c` hh5J԰h Q&D EB IL foz߆tv)Sr\:NWT%72aTT 0SpXtʂm+lWoXXhdVꦻ0j[YR:-H4?0S/Ɯѝ7"-DKk\ܰb|HW``0/TDKwM2ߔ㩣P '_LX3 tGGQTqTJZBWĥ2xG*ԑD h# fdj&96N#vgeϵ_\MxQ񾬨Gs#*ouɾםty֓e[X0ևjoizgxၿF3aaz?~o:~sxGzn{ɖfn^̿^4S}b{~ƺՙQ1aVXcGZlH#:k=ԖEL5_λSǦ^чgzzKߟ^o|{u~?>>OJ]COn}ž.aL!f&L0J:ݨ+T(4-S-O tX G9;//n7}}:㳟n?bȫw/ݟ:iClP؏MV8DbK;#MP8kd4*K;IH#2(loۓp@LW@T5gVRŢ8&TPD+8"KECrP5$^HAGң Jb:H:<6"H͕K3g8W1*2 F4&bux1"1 ]ա'Mf6A6:dC+"h0 :t#/QtFR`@ctUE$K>Nsخ4_-K 6[ L(v1w0MhMLUMw. ph R`) V U:*T+ƈdDB[b E(*)qKHzdBG0x5kib>NW$6â*EL,  ,V4'0hSEy=Zon,NK'=7'G]SnCZ];#w.-{?ό%'+k3lg"4 5xZ| MuUbϧ(sT$:6AV9.uQ^5!> "M"L3"=)e[ʱc ۯn9?p~\e+w]?;"tјڱЊcR;ΥJbT.W (_BiHRK[Ku|2Alip*cHR'ǷuW܃ 8Jj 6atWֿ"8\ s@v d o7 1 0MpYZ,T[7!S s/\~ⳛӏ/vs__Ο/ ??~xͭ^ݕ__}wT4iڑ ŜE1!uQ(4<:,,1vío='W>݅/zׇ;̾3w?ؽO/]8?2TR!Q ]x4gˍL0[iH{X$4ӝtǣЊ8x)D hHM"RW`p~W@H( faAUNNjD 2j雚_T]_ГZbǣ0zh.g%JQX%` ђU&*POl g[O6ybNբa9T:OLDbA(BSĉ4_@ƥ>{6/OwMtT ǴӤ=ʫ>)UW:Ey8pbVmU clD-o5)GhEy.ØC0X6Fĩ`jPb2GDr1rBb"1AўSBX;pQE4 rDyR3xƷZ-}Ҽ7{fR&*v׻ۤh:q!4Hk63P[na.=rtSΩows5Df0|%]5CƇFR=r]*ݐv.fm򣶜/Jw\u8+pۻ/Yx|Ço,h:A^:Zd/PjhXii[qmxTJagjfଭTYܚYnef.8 c\mm܌꫆Ǫ&N&uLeΔMtnjҲI)WKGU$4OW,=v&o@-ah˙󿌝Sp8k>z R`T&wܐ6 B/jYkO0hd 84p%b찫Y{5Y%hX@C6o CM#PK:W4/8a]cvvGsn|}r7Y?}YJ TwUٯ^ypvnƗ<H@7XhH%V8Tgش񹉏}A ~"@1u, &Υ1n}-VŎ9*C7MB[´(S$A*T a@Zh h!P΄EIz:7e §R;3n~e 3C v.mGׁ]]\ܲ0]*_/iu?!{?jٺN/ - ݞKsC#Q*`= 5YqcM%/-;X$;pKiڕS.W2`7)wت7) DCNR[e4v\,ߐy2JI쇁|Uj\Ypqkn^^xZeϞ*+"L(T jhDΙp0'I{6]B#NzC>u!C|`6旚6!*P jdH h7@V`RvqÝ!Kq`1$/ ;tY8Ra\Zй$u긺zZxFe%W67X50}dǽs?ݝ`^-??Wݝt7.޻<7;~rur_g2jpHZl&/P#-B(a>;:wlypfÍ/o֏W?>y}wխc.x{cݍS/ܙ>wh`nb+ %>Tt1aK[cd a%X`Yl ًIch4/"ёHv2)t'<ўLqҜ83F'Ib2-2Q K#P("^,:9;g4t\elm=^2M0)jѺb%h= V@) (eVGa 8 *քR'(mGy}0U~O;y,o2R$ X* IND,Pr6W1fcL"?5[R]cw't%8nK]k"˷6ȲӰ6!ѠǪ9D;8܂!thK5eu*^B.$!.x$ZC/FW@hqd F@` 1׷uho]{螛Gv4OU][<߶@ӵWZV6מ}9f{וe4':بJ3)bBf*)VHף7i8iJx겇k+yMm_8{afI]4&/y|Ňv㷃?/wdڅMyʒKs-͛(g.@DĀR$UY 8Y4[CnУegJF2vF؞* BGnI-F†21tE_ "IX"QQĴ*}A*BY(S&T7N V|*B~觝9g Vxي>:8ŏܹ?m0(+@M!R32Uc f&d{yHL l-t5lum}}휔Us\woNک,V+uuMTwLvKko*QZʒY[k=\JKQ5«p!XXpxHtD|_4'„ ɚ0 -Ga!&P<`8+U )05A--2*6Ta'Dje_ 4  <-K)TءOI*$m_ zپcp%|+ Khh :NCg,0s+NM9m_g~{^}toοw<>!XW/ 7Y"ǥphw\rđ3_\qϧ?ܧgo o>[G^=ֱ?{̓oU dL 7ƆLS$VG2%R-IT\^H{to) oK:b1&(jT&+5uIe|@@PP99:f;tTT]}S96?cihv^dXk^NÓXh9bQ^",w/xܽɭo/x{ڶwtӓ_>xu-|zo޻paU9,HY@}شiܻ?}wOf~ܜޅ^bwG<ʞzuٛgNq<;NCE'; sTL!J)x}O6!P, G6ׇ aBh ŗF"\x{n@H4g X9MĪ1#mӜU A`VUUFƉC8|OV87%MFBPDtI,NF+`PBi+ @WDW&H(eiMbQ-=Z7h>ݬ~ֺ9XQL=@ՠ0*@+B).U)h{꘡U1&}I1 ;qqz)8+Pc#;M4"g{[.oY&&(09)/RWbI"Yb݌7 ycv/<ًO.'nuzܺ䑆[++ WWnh>>X;]6:Sw!i$D޲ɔTzэ# m@ǵIS-FagXuZh( ,X~%+Dž0 };OC$ ;2<0]R̯i2 t!C e vzdG±̳ qxEǤ,  |,a C2 '!YH@ ^COx;g\;ޕOp]ቍWodpej'oϞs[O/]9|tϪu6~t5 /+ Ow.~yIƟ^|wf>wF_=ɵ=oS4&|N KeCH7eȏOc#g'X(Tt?/F gP}H$ 'B8@cLW ْӣ5(~vR[;+MLsezQ[N-+.~vЅ#{n?qZe^fЊT6l#Q`Dp(e2*#1zh8c RLb4M:.d7.>>>ި6`gK35(j,}uHFcHW5dh 43#I)mQa+Fs%kKX"ݳ5ܲ[4^#R5 $܊6eHTM: 2$ j":"T&1DEjZSEwEJE ĊxSнgߵg=;|cc7OM-<= RGb|78,ᡋ Aބ+ :T-wG9mÚF ϖV_x9bC힢'kEK:Q=_~xeҰe'FK}Ɗ8p82u|s ׯ;1#EY"*!L n\yix?\r웫oW'\=]<ʾuٵ{0?gF &Dc1r /M`1<6iA \/_FH ̃"4'c W"ŞL"5 h!RHݱiﺆPCDmek;&-?{ѝN2~lr߮Rp)C1VpZHDPG) (d6I @T:B$Qx6A+e4+~*>dps9o&ǚ$و-9D!1 2s Ns4h\f8Hc-+R]WHu46,u[h3uk3SMMq('>Cn٘iGML]iJt ggS-3M͛=][\f'.O$I :+Gl\RTT*rKNӉcIQsgӻƲ'[ǁ24\r|XLpr'ZIDK/$teW&0G&eNp 0ὲPh1@nd@zx @ arB/@mY>`p9<֡#:´Qp* v'A,"\ޑI`\8T{e[kIɝcoO?q-{ :FO1R z"R5' lYʑ&ܙuԕ6N D&1.HطvġWξ4O_< Ճ3oL}z'G;/x{oMM5SyNq"T2tj,Y z(Tf0hTk2ŎbK FO#{H.?,@$!aVDEB)SQ meqrxK;ʻRl:7դok)^rjhpcG?/_]U!dsFIL4Q:6n\qagCk;qSwd v x0ɽ4A3B50$H9H᭦BDDaq|6᪫L2%2KАWXȎ 9V1e}p{]G[VGyo[ѿ.;`nԖ82mN:Z]-d6)K""-VNd@X/FQQkԅߪ ޝ)vgteݞgK&rOڝwR{9zjW}I?7|Jz:~^߇}|vzjqAz۫*LWt3iCu =m+DT'/, \3S#ĬJK:q<ͿS(LYj{ 9=u'IDe9y=6'30Њà$JrB^]zQ %GQG!y6jT7y-h0V,7HSejsYlMfD'?LD#&uFz,Nb3" <7i#' #~3GcZViz6FXm7?7U=W~sƂKsj\~~L;|?dKy=o:v"e @Y}3)ɝgķv@sIәsgbN mSu`$~L\X:KUW^$d bx @Cp{p 0L7d!C_l`ynȶ`0z~d@ %BFa ,Hwe=iDw&с3V3o/2z_]xu' G:|oDTd 8DijPصgU9{}Jd='apBAJxக=WG=>sᷗ&?G=>oݘxz/3N=>zm+- LML8,f F8Өt5eKSht4xfE2tÐ$[*Ŋ6!*D N]mU+{2MBڒyb}/ ^'R f!o _E Āh1)b$bH(4܂5T J|Z@f* N\ڞd;Folk%ɵ!Xb. 1 7rdjkձK kuFU0i,fU4u)kR}4S,ճ% lggwLUD":/dȡ*ڳ+Wt.<[? 0i"i``&dj$PJ6?aW#`iD/#02@|;Hw:,O Љ7tV2Gx,*szyʊd[YYF?^пMX" ]Qd8L$Ő{dHNT[`TFuJf/x|GN']IH3Aʧp ' f HT<#}C #C u,$6N6+k&~bϝ}~0Oz4'yvk#gw_ooxrԇA2bm؜`J$DPHJ`dK2 G$X0.=9AH2Lw<KuPTg"GNjh(2찪$esu@NdS[*ļ-ymYSN :k=U~43 >1Ģ X,Zh+)pR X Z81faI%:PUFCF){ t+ 44و%~FXAD#Аmmt8d]TɖTåݛ$ev8FBb1N6 &N\}*I@<Qh,4N@0QX!biJJDdWzhqTvɮnW68u3uVIms4rUeڼ*(O e#8]"BU: IE ,Tk:N@8~[zUg 'sU%E 9otS_a&菵z{J7=o{~S gwZsk¾Zyۻ^W6ۿxrR=~"@6x Ǜ^ ~ڛ+Ԡߊ^y.oT']4u)bS(J"FPw)`"0D5'*z, i@&X3H6T"] 8 ()PUi{&v}ZFj`dU WHV;n0x \ouOy1;%C(Dw&!쉈x=?13".+&b 8=JK* S&<Χ?LߓvoE˃ص.19~GVxTᰊ0Hn[bes9]}3{ΥuZ?#E}fC;~Y( È.@sġWFz9 P}ʟ3Z 3`[Йb.YXɑE}!=x/>3qMNy茂OlJ34; @iwV=ֽCDx&ơ  Dc0V lLP+D&uTpl< E1a+wm3z3_ׇ?o~{sՃ}~koo~s܃ 3GIUb6WU& dǘ2i8 dfȎT+C$p,tC` ℣9c.8;[5's5W+RfD;{mݚwjSĖG7mY:6FɫPI\3h(lw"DZYEZ1%tgyhmHDRj « c݁yaӷ-wWδǘhh$ʖfb =Ȑ5ǫ8 |‚ ʣ&l^(Ye?KkVFnJ!/Rh$̰Ս3UMЌ7VVjB 5չӧ4i u*j\<(>_])!7Yo1:}$^] z]վEZ,!5KHXp.AN0'LdM*FOsE{ɓQjDc1 #;`|t㚣V4<(&_b={+AO͖sKYNQ.L KNF7B?Y\eYoaF9YcKp .&qq6!f!2CP!"Q( J^mQor|4?h8doЋ73e>$ 0n00/0BSLrKBY2.P0|#П XJ$>Һ`!C%]..KFdRd&dAD&.Ӳ\#p/  9A" d-sfͭ\ O֙>޽vgzN[pR]4UBD@[b2Tw|Sf=h TZ:EIףS5QH:M&a<2D(2h{gko {9ws]zv{3miC?~ݓsnO>xSoL6wmʮA7[?'d4a5ۈڑ5ê푧rm_Vw9V<,U6_XB||c WLoZ[bwnhξ@'sO ޼_7.9l'h2ZIxV'C,&#O JXK"8Sj܌r ] QN2g GI"+ǂI`y WGU&l .E# xxb:ӈӮMjPEw萗[ ͔=j[S|ƚXc&.4d,erRfLSaFO{]USu[y#KbnOu?p4XQm]*LzV9iS歎=m}_~ݦ֓ѵ'!W絟.4Y3=t*u*c:{r@QK+~uM[NIh+z/u53mg2~z`%,<@shAF<f|H$afG VݲpS/AR$fCN!Ї0H`X1QY| hȡx7@ cbntt+~47=`vd.߆CqU\?6[ bL_+p=|<=f t^$Z#+4AXPe9:ۻ8zgϧ >o}I`| ʻ;f'++u,HG Ь xs hDX)-2),p{\`xOdzܨ|?@+bO![ad<8k8׵őm16U~z~:K|emIYiIjdHvd `ŘQHPJ: bJ ՉD F@?$ #qD}5`4(e$X䒄aCݾ-7yJr/he[V" tCs5+}K$@l)FLqڔᶴ =y935QҜ3[ꭷ5em]aUYG R5TFT3HYJGzpnLb˺@ M]XhU2>V:#ݎDΘI=U}0p{!P+v[6=NjcQ )DHsc@BNRQդ`(),)o7mb yp8 کbq~ ``[6{M >{vT,Gu%>_ztB|rf%W M6iv2Ah HX 8D82)>hp-LɉX!#b&~XSt2hۉ8ӱ7C\M1RV!jhuƞ$ 9iE3(D<_^NL'T 8]%y@8aBFL8DIP! %: %03`=k2.AW,S<3|ˌ]}[L +b2d_Yz"p71FhȚl1j7"I47,}vq+'.[ó3]X^pg]*݃HqBcФx'Wol\"86 hJ$XP6,(T$ hG@Kl'OهufP=BaDM`y*l1k2ɂ (!XlE{ۺp@}@XU1++6R^qh "*ņ3X Ej.005*U1X<OHxM2Z  '6 \aN6xDZ0Yh~ZV1X%bSjݵALpi\l$b{WƓ+S \  fqF[xhObPEX^@2O I7סxNKMy[đsIgotqS2>6$8{E ~* =6!55&QGEP$B@62lL7crU*4d|.P"ի:Z?:^WNukV2]qbQC4IV*A{K;mmc-4b0ph "V"*s():L=L-<]a+SYig눊4E*=jkkA3w6{­:1,r\ ۗ=zcQ'XXM M u wtkk n^8(֚URZh@ģ~෠wS1[-t.%ꭿsͱMY僀rgh@BغԎsKπ/O˒f:.Its@zN w"^u+I")$@'CbNY)|&YYA<ܶ6il)p`Ɂ{~! !'0,< =B<&ÌF$qH{"҉u-ډ~{Vv:{٣3'VWi u<ʱ|VPl/:Évbܩ gřӽl+[6ÙI'S찿R3P*X@%R($2MF*3| mʜ=]tҗg^O~~?<{<QA$`Z0zx!m/4D(Pخ,7H";nNQ~:/ASX@D#EXz.ua#'NYh^g4V:dt ݪk"ƣ 'y.Nܓlc]y;X?Is|D=K9#M1zwa{\xñ "G 4$1TSأCٯO?`=l% =vHؐQݝl,494>#S)2i11Ej= -IW\̢fQ-Vr-/P핰WY 78-7gmvQ*jx8boɶPZ%펕oMݓ)|mk)c V%?hEggmAA@4^}NV-4Yl3֡ɈAF,a/jPA+ADÚWu޴+|t{wf7uV,=q$s:|\dlп$WORY0Ʃ`@x%Bf\JD p#x66^< փf iE@zfU8cp1<YA3 [MȨm *UvӀr̾€EdAz1h>L}  +@Ce"4dJ8Qn$ o$]wqtޣ[&&iN*H՗NqS]$2ՆDC,)4W.?  \_2юN' $K, @bh@ \bId:Q //yr(ߟ{7\ǒ(Yp(=+=6ʩD Ѥm#V(*vh2[Lg޲yWxݸl\ܞ e}%ݳS <S⯌)Lȃa.X<)X>d@ +dzLfL0t37(`t$ dl `d_ѿBv+`ph1Yf%" 81X-X ҌFtJ 072кK.Z“a0ٛJrQvOcS|~0EP6X!o,QQBS0hYn?M~l=oRR9lĖ&V^:]M]bGԵ[]yDz|Z/}S@-+Blu;l$bZio\@owY(UɊW$4ىuI!CruCl9,uҩѤ 8;GpY(S!GS}Q47Ji1' ,Q˰ҋ3tWQQ5BM(ʩ**b$B5ʊ{ψm},gXo덖l#WDUR:&{ݵN'[ :htnGl`Aَk/e^-us[s[9柣Fܷbc}X|!^eGu=?nfe҅ji6U>˝4pN<5u>u:q&xNWCƛ=Mv:pj٠y\LHTmAVr&COЪjQe6\cթ/%vEwz 2᫹M҉=XdDžЫO^ wWڙb-Zo敾L`vmOhImJ=^2v[qnKmY[a!a,rx!BU (F!)Jl.W3)Knj>]7]}:|^%ۦʇ lCdvp 7ʨR \q`Q|h@2 &2zaJ(4pp' 7S` I02O5 V05#_],0 /Z@,zdes@bXSI@([T.I=~G4v,xƤ1\TiGqNf2}@Y)d9(Q +BDS jll +ZYW_Ox|ku7V߰gnl׷»>{?9}rdD^L*]*IFfd#1^bqD!qN/7XDX1II F|-$y'EUZhkcI Lmt0L A`P 4c^Ɠ$oX-$) h}&EGSiyvLN6\-5Rų#i\uАenbbY_qv` n}ZE~7H}i^[bvv/ph2K7XvG{ۮI u)+1HEA+Ad53?͏6Qh镣[Ck4IY,os vګ%M%*c˧Eqȡ |(-HPhK7c9o%G"DCE૖: |4{Ω>caNQ.́4VmW%i3֙ W0MhUUG2O:^i}m3 K];MY8Ȋ>O[8}ہu.[8y/@ EWUMf,_1g{!m>AQDþ!VG͆\4WZ:y3`[YZi*AV]6Z>O^*5m0W0⭲Rchh0x+ B jM !@|$X ]@{ ,A`ej6rfKR7IZ>`ӤDXn4S^rFZfJX\b.Q.JązjʹfM6m=;uۖ53~8s2{4BlTxo0rjFkD ݾk7,s?rxpxd<`&҅_/>e…O,̎9M o0ۡ+3dX QL}ϗFڔteֵ%󕡯zve^+Vz97vix}#V#QV 띈<nKڞ3hhե,qP_e6h'u[)q୲oUj'dVZg`"i*l |өvM:Sv&|eRr˃OD6v)roBoHmܮmCy6xlKܗ+{g - gz󛯉?ZEr*I;3dx lzyg󆬖Ѥ֏' 4N&4>_xXU{vKv!+1}AuPN\*|;x2|/z 0f 9A/Y0D, 5S`"@V(<Gh @3aC:, HV? #Ѳ0,dAc P/kN1dIDK%3%y 2ށM깷M`[iîU6cDKe /Ce3l/ݑp~yn fD `F+  A 3NE3QdQվwf6LOPï0T-2Z,1R5h2j2 :M4Z$=QFVݖ`9A[c8nY뮳KP@jtg]\>|1lFd1W#/-qݛh>Shyk3v#a#톈U ~Xi}-y7b曢nu<|ܕ9fUĥ9syvGBLN%8Z0:l.e6t(au68I 4`Sk*;.ڻuv?`Y֩Hs^gRr/(tr*~*ruе͑{5L],5aWX}}i qBv* [=?pWA8 [6ouk;dmٺ[mW+GmsP<|^ʓ;Zf7_?擙^ԟߚ^^zQf @{e2u^ӗ=Ez忡@k<,c3:2., @1^zM&X::p3zLA | }pWfߥ" 8^cD'6فO5 ˏ+)Ϫq%#x.K 1\_>ׇJs gIb Q6h*9RrqJ]Hqtgk>9ޥ&wm)wgF+%!^6Ll;rmxܭg͏.mp6"Xy.)VTP( `: BEx9dÐv"RE 85`Fpjy2㳦0Hgٮ #]b*b]$n*]Ræ(>#D)F@ٟ X6Rc~mj֯4,;ߴ/ѳ; hܛ,,|MLbfR&Ts\d4U'uCDUdzZ րlo6 l5 -5u8K4yz?iqjL:zsR-v>FUBΥ,j`.7Q[a>h\s'!_:7J$+E%Է vOus!s>jQȋ-OZgܪNzԜ#v[ʵ[}V{kffת ISB=I,oɶJ 92strr~ B6Lכø՟A &e^ >G"$3kIěbUr43`[-ҍ7T/+ kIiJRbycmM^IyhEm2FI BK=hB @?X& -Mx(K`0j( NaLyl)s$Oj[~۠{eeA)Y, *jhRپҌe'sRƹjPCanzlJ\it Xm5ݻpil`q+}W&/qrXa;7@^LSDydEŶ%!cMd9 74ɭ*=5:"!DTb E,>H p?WJ )Cv}ڌ!.?U,w92tUvqQ7mPNq>r:n2fIl| IWUQ[OjmnzъG -|&aҭzU;}j~]pϫ*&6u|=9cr Ӈf[kƻ>9gy4^}*SQCi%^ik鏽 _+=w*#.Mv$ESҭҐ{UϛS5$S5as{S']Lpm bw_^#ѻsz oKxnoրt;(  ?Uu+Q_%W C:62t\V?t|Mqq5GFRZg. u0 q\慇n0s`9lzCg C z``o q{ Up,, 6G;ucIDATvP.`/UB  tE s@ËN"YD}0SBPfKI󪶕em)uk`I 1`JQjOvIw!}P֕E0}h47Íb<'2юu&atx1%B&l,IP jmQ̎ƌ9J;VTdn;ط13,PC((-ItE8F5"S XNpQ'rxu6BDMHX$1u0,>/yj/봧jHXm'RAg*N)H<3jQ5{kJ$|>w[(- n✁S7¦7ڮ7Ʊ'Υ%̦9ШWy␣UgZ"UE6'^ɸڝ&TɎ'Xte:ւ* ƀd̩7`WhPJD uZ_F@SJ)S+lG_@EoޯJL04&"*(H () "]JwwttM(u]ksΞz-,+R*ݰ[ION=Z{χXhw3;wXIJ~թ:| 0UܣҼoF:}iL~T7f|?>cC!O<l0lv;)GjIF"ɯPgsֻƬ5+G~s nffʱ?1xoq{}<[3HX "at(ˋn7 \4/y9E$Wo^e}/yS,Mi׺T-{d0'bUE;,~')O_tF;i2I`cPl݉q |w\{^H84fr#Q|;w f]t3t>6dk&f3G68鴹tٟKrO^&Z㔿鴷@ VF7NdN<W^s2%62*v<0awr Lgy6ʃuṒ[t<8UBgx\E w=r/#W,:jxܿǀ@ya!zK=FbN:Lup|@z?SQd0@? %%6KNW^LbtL-!ڎMk)o4޶njaU v)a- "^I͢rz,& `Ja0 DrLDEMɤt lQx#ďq <]P `5[ygCKM{P gJ K09 a!um _K4:hk_vÐovpBt!}Ia 6GT8B=:U Mb6, p*[uGf}芟 s`G?l}%j͕P!6R<>%cP5_[4ە5uGLn,Z2\I0֜>Ӕtʯҟ}5sUN`㧰;-$<gJwR6.D\fԽopk-/759+p,~*;S6c31SS~LR*cy%3@yz1t5s+YaoF?Isz2@rOMu[\iN2FBصl[ynӝ.\ulp[bc1gqm'5OyNs(|2n"a*ʐE-鄑ND(5EXܩ#9h?hijB]ܠs~ipGCm˨ yP*@?!se"z9QL4 c(~R(#2@ $>Jx 9Py&ux4`7>P>@=r.a^R:>3;T࿅`dWz#nőTt !. !B+X eq0Ggu)@L-Ӝң3$ۈ471QU bXB&QYd(ʯPZ'ٶLKmooO?xBLy!q#QQs}?mFa؆l="z:bZ" Q +ˬTY+Rb;Jo6cR5LcH@OP5B:B"Ylm+ --e2l#={$GK_ m\v)[evKnK()kJ>dAV.G"h '?^@Pz9j~=F$#eVI7 -W`,[GYKR'^']p ^X㖮dla;w9 9wV\"/d"m~Rh&g܍s+G6tk4v[h:kV18m}h:|+SVC!F>;oYcpj{ZBL%ɸM±$ BY/^'+$U .,tZwYS'a_BFhJ^˟Ξ^,xIo>=o2'I(iQ1S#={W8{mּ?{vtd>/`u7htm%+>wi|mS㾵et-_ W6ӑ:1םMc=MMަ\ZCӱIjNuh9y юsy!X]:VU<^F蓢%)kr~K92ۘ6הW3#?WGnH\$Fq}S~7]ӻ~7`$Y˷co=9I}f;|hݗfLZ\H|Y&.HyR;㺯 g-T\=?2vE>/jz 5teo!=U(`_mܔޮqE^qg[?H"[NA=߃A` Ȩ 0PP9 =-1 pe1ywѨu(2Qoy.~;+B%cJb ģas uEn} BE^֗׍<K ďS n#P(tu&CNTfqHJlVq+ jaݢl!."Y Ll s9f;NSeжIU88(!Y((Cm)wĩgW_ 9*^AQilASRl-G MHd05$WJ3B ,&a*Qp=|/W2h}@BRlGgǘ]8-t2 !IB)egejJr{5l}]*bBZ2*NM+22Z/$U?RK%I sTHdY}3Dr?]@ZIe-g5n9g9QO&,ass-o9cv+I:+ԈZʢ(_,&wR u<`pZO)~ #b -gǚb-*)hɵ:6;'Eoc5=X젛{Ůr*Ww2O O}@(GoMgpS'b\涽oWQ?1N C8qrB[Wm*)$*B _ Q #M+QU_UC޺[,=bz/S]&í/9Nq|5qwsnz͟;}~~3дρi+6=4a뒈?[jl ?$nC&kOmug?y@Jz]!q;W{|W!_ /tl˙FbcdJ3kKvj|ʣ3'4%4} yq5檏FC;8{|~d籞c;_rts)Bx1ˉ戮@̷d.ᖡu1T2y(q/W/=?2y y5yp| PB0^W2QGu%!|G |3y+|Pi4%a&[H 6b0 h =:uBJ ^Q lc(%.J]en¢B,[X."JdRmFeB́ꩆ’н;qߗJI4yqDILE&[  :s=,/"XG%8*ye0'Vot?5{':Rlq8YJdlYRf_[ΆurQR IBڶ:Jz;?yH^VD@VNj YweȵQͰg1xSHtDlWRG[QOj/͟W~=E?"J ]߀a:2Qct~#_QE%v :7yP'#a}S!.,|Fda3uX*4*t?;"|8rDW3HKZ~sg##(]L(g ,DD,XBl#(ېCgw ҕaH$<@?d 2YZ{E @BL#gwR)dv| H8>)lMrZ;EHB 2)B0H6zœݳ#Oe T.;q"96L~T9sm!(LX`iD9a9!AiEĖXVGR"R[Jj%+9$k)%gIBL/O\Rh~3u֕A_!5صBYVQ:e|WծN-&vEV;Ӎ噫t?xârwZjq厚ө7r>(|V8IH>ɣlu8loSi4W3ЗV@&*CQ4CQ8F"\*UʪS;׎j^raec2rTK_~z[*wO% }>W͟) ye̡{vw֞r־wVQ!V/ ~ϵ^jSc¯?`6\ T*і%{fk"1 ~;۰W@|7.kMcfc4%`gs~ƽ acqywùr}{5[3[5g`mh%#WS⏆3I?N}|$V$g=w|p5РQylf.}&eL2dԋb)b̮%Zr|r+~B)V1& )֠n/u-TmiaV'zGͦBMx]4YUejB^׆,n>~=䞥n*F /ФHn"S,/X~%x& &-VWwQ.O &( ӱ0n>ב{I x}xay`x^ &lG~#J9HH  S*[80Զ%#>L`yQ(^^R$XB!pyAXE)|tV! Be* bL&( [MC >3?7_@x)?nRA"BbKeVl n=Y8Z[QpHǎLTVK'2oFBC!,n:IAe),LSh AHB )ҙ¢L.nBXh%FcS Xt&@,&@`15t2!Qp^@\).jJE1zQ"! ˨T(aj9=n}+rNe$z$iڊ60,n"a@?OZE4*iݿA]Plo5$&H,%k J*}̥-J7U-=iB,(CmѥEIu˖*܋?2ꠟq_'At_b%~| -5v֬<Fnگ%n"%j.F&c]}0i^<N{W5Y]5n2}=F娗)-yjRIYe:2ջe VH8"Q*Y%=l2be8s؁fO]?~m:LX*nDvg[>T*|swϗdg7=&ɵ˴vվn,] X|2ncFk7wn>-S7{*GSlll\OB_@?_S>qKs/5jJ;~Gp@ ?]1X @`/ At ֞3_?i:3[D)]1gűe?盓ˉw%_yݍyh(ښAg^GםgUƏ]Uri,9\,p%Fʡه} Tt+Bŵl.]Kwt>~<Ԫg^zшiUQ< yLשּ ^l!hm/ >4jr>nnvUZ!>=r/Awy[C. dF_ {0/uU?.w ^TN32@s^/41^-1J!5riAY<>;dQ'8x Fb44 @; f 1pq4(^*,J^EfVq"Yt0 ϑJa֑jbnVCHe2)y!Df"i#  "#3pe|+)Ȭ%L ScnMDś~V{W(|7sO[nI- q EOڋLq !HivZf_i R=N}OixV;囩W;6[YioRn㸥r>@(t }Qv$i7&؏z[;wXeіM[woQ(X[-SEsY[.ҹ{La _.G4}mHOұ|6;ؓRyn`)pY7[75u_+NۆL',8i݊U`XG?ۏ8,z߽gY:F~dad ٳY}dg溎*VoNgj-`C5 -Y\}NfaѷlȹQϳܟeΦ::3 '?겧8βzTnϊ_=x%j&);s>d޴Mt$e'e#1Wqͫŵ8օv6GȄApE;(W-'*#@(1 @܀&hgzE X-W(Dy@nq0" u[ `A>:!w;rc7IT |Dp KE*B,52QFF!q0p/]O*pgДtA]F,mP2YB cjsIIQ1*EU3XӰ'?~ OYO\FXN'$Ie4'iqlʹL c3u:Cp^q}08b0CIJ42{"ETRiT:s'?/"dq8"" .`)*4*'m36'$􁨘L,he| dIb8 "( L#^MKu'kCOKCo2kt4ekT95d-&mn%I_'H^%Dga((NbK. )$vJm3k*9%zMI-lʕ5IB /{7(SKb(!A"X<8Iw`=jZnQDxӶy*{T 䓵V)V:HMr}#Zp2ҽd~DIAl}:lU[Ͷ)Vh7V~?1*9{'^)vk][Byņ#u XC!V`'9G6ת3jP.=kUqߑ%GS|{>6P]W GK_N:;2Surt0&mqK#K^&8~u+Ӊ׭LF*u!fdVkHxm!G˘C_Իs#z7=7&YA=o"?Yxj6]7?)(1LѠ!QsiSQëX@=GlP#(WXGY^ń= H`(쌚ғ[ 5eNCJPϏ PF)b$D@d! ="hJH:8y0bGa8č9%Lz@|nePcqVgߠ&eu'5T`Xvp ں'xhh;7b.Ku>a!;~`<ظ]NykdIS^{Ϛ*wڤREV}Umf] =9r%Ak~"ݺ|z?NǑO-AN=v]FG/|D&6xS ~9;[+7hlǛ$˻!vNk iIu֙vY5'aM)S`S6S UTwj+ڐ8 CWə +S%;vo\GپN&=S?5_!Ks?mٯ b8j3o޻ut h5}PByfEݷ|/ֽ5ecBDsN5뛵ʷROH]3Vt kJź 5$* r!rųGUz>wxTv?({% LE]z)~*v,z4z2ɾ7@۞`\t>CB?"gc܊iS=o}P힯yW{AbojMJOTHhpWܰ}Yy. Tk˽AEⴼNA&(^A` ӆa WJU#@h'"|#⵲C_/  p;^r"!ob#܇@G0`_A<|ws$/ *68d-W"bFt67aIA %V+D ^9\kmFIQ 31Sz6zcI$yi'C#-\ahG9`=+y*BsV#}, lMRL!o)dSJoH]._SA<:_gW`Tɫ\wb]9f a۝k*T%Zl=neeZs|yv-[{7[)Oy' j~"kqT_wVlfVl0q+ `m3@Mi=e;0X _W1Y2ۖ%u[٧ʟeX5ukJ/:zUgON˃?zDI4?.3y ]Xg|sڏz }zm[L7魭ݽ~t:0J8eۅ+U+ijӚ½Fg.FYiv50 7/ʏ)b{yhD^oPӑ@ E0h?c3grYBX׳j'6k\p{yyTW+>{[4V ˼=ȫ8'y\mOthD`{m9K et?r 8FEt2Ga(Όn!/h^5#BX{5u@=!x 1xݧ:Y0}Mn5k|^˗і#>3|dіͮN;|F˭#73]|mv:M Pn]^{Vtx}d:Bpѹppnǧ+.. ?,д{C^u| V¡7EEZd,6RtmwAjWRNQc@1qöiϣ4M(-z:!A;uAFqޑ?Q=0y. Gyʃц@4Иyd/l[tW[+l抃E;H V@"h3 B#W}0G"Gh M@bZ­ (Em̯HoT#% pt u*e; -+ pet0H WܽZJKH#ʰ9l!a0hZt&b< nt- a&7LWQI-v~hdڒtQF _Ӥ+7;`|1b胗M^es7fݥM暥 JbyZ ɦ鮩SN;|Vםl{7[w֘o 1-RaWi6-{]w݌Po`cΚ.-vOkw$e\w6[+_r5dتetlLxiU 7j=*Q.ufφVS['IuX%kh:MvtO}X6K]\-+ѬJ7\& S21۩د?۳O ?17Xc nl`@÷zl;{;IvFԞտJU!O>^k9ae a E@16p7,ksSqjDbh9v(Z\kOb5Xy\I/c|Ls-#52ݯ%:8|7I2>-><Cu4hJ Ѧ]nwn&^>nq)|WRL9L% ;lx**Z 6v[*M}l#Bg9Gޗ݉?T&얍 wBéž)g-c']cb''|R&3&dO-@wsGd!^10rBĈQ <@P*$F.)|!EBy>^MJB\@`ɼP|BhAi#ɒܑ]|{ nX|`@Fa 8E!ȧck2%A '"fb ewRʠ-*I%9d2<~A&H:kJUӕY`UmT T57\13\c™ּ׵*6|nJ|]"c6̞][g:cu?T6w-{lvjffniw*W:d慡Fl*Zr)Χѕ|hM]82[]ķdl)Y-zwjF͞/bNbɪ_}Zs'Iѷe*cT|YO꒰DD|qv"-^zd1sbߟ!K=vy݉Y.sy_+KگJ^;w"b(qvS\/F_sx* ` P9S8e%Y UJ"V*n7#K:t3^0jTdpw?wlwrN MM8$sS9{ctP nw6BPvT۷[-m(AA`@v x!EB"X$[h,C"ɓI[iT5 p FqdP,@!:Z:wx-^KZn=itDdl:{NSrkw9eQЯujB_Tz1@Lg0XML3<5rXkQG}seHhH˴h۳ܡ-]vvzd|q9{^͝72nVzMU5XSBKlk\wNmf~Б˵}9 /Ke9=3eK8'[Wӑ?NGkr:/ͩ?gg&`[ͿGO =X0T_p ; cݕߎrԨRqu,W!vtNJR,ܜD9ّEF+&O&7$]q77QA GF;ވrx/fe?afwMٽrzw]cjfZք>ol› oejiw1fLG ?f~)Ѝ#l&MFOź\Lt v5=aQ- YI)^*\KW>uh3eڿwnd5itæHO|ZJOڠ-W%KӾ )c#9#n<(GV9NG(ͼ||y$s!gZAkw7!^ńy=x1x7o ^װu5F?{bAy.2(wQb^ ^(y?x%09lG>`=&C bIݒbpAHHMt*7kJ' pl2Eӗ.%._F$ iADVMЦP54u^C`  ya!}1qċu@M:tL "k1[?죑u$] !7~rm|J`i*Dyn&a/(%|l󱈠Ĉx)a[[K[.?|Qf@Az2E۫ʔ[rUBkhB28ĩ7魽LCڏEkŨ;ȪQجUd AXG$ތ~D^DOF)n?~hu;Vݷ+4i֗-Tdm`T-wbb\f cnq77xlX;ܦ:mFp5b1&Md˶l*kT;-My Ȏ+^T}#\о5r[&"/ٞXU֜7f͜) X|?j }bn@9.Skoˆg^_sQdmhPut!cC|{ٴ_e#uc'Z? i #s}D׎U Usg;3|,կ5Y?삝MzW **`s=ş[s/9PcW׾њ?㵳U \58<.Aq؃`N(@FtyjɵGYNJnf46 rfÌBB_ 3?f2or1n,bhx+)^֥*@EXk9ZMj qO~OsevYoza?|#xXqlBi ϸ)QCVCȖ͠^: w*  2r w,)u:DT`S@d=&~GYC70jY; >7򮣇^ݐGrO\ ﷎@OGa^j!oE!xy،|E8RRg Ch^*m ).Ҷs=H$ *Q'@ R)d&G["/Jrتb9$ =[vbi#X =} SP _F x<"a[D&\)eA\h UP 0i4-:SDA ogqv٪$* @!$قB$( ~DЀ LD4zU b( 1r8,R۟@$HId0" ʲr@\ M*FT("OX 'Z1EkSfV S('Eaѥi˨7:ldFuFUuJszt'DI֯]8`ke[VVߣx||G[v6*'`'Ɉ =} }Anx%:_ nvtp֪A Zׇ^GKd́N?og_Od$J9g]13d2vԸsoAK` =v!ؾN?E#"**Xڶ}]ʪ/}{?k-u](TyQG2B*j죺lλ\I00d2`1lp'A3EzQ [QhmG:2ybHg Vx~%TbO 5= ǿ39Pv! Q<=â{(`X/xAQb)B}#xܤ0G qcn=|a c' 9PF:-@? zʀ@6c5&d PHD:5E\CLj8*saLAZNI߁cFR`ivX1@O5'wdvf}oؔ5xa;{;ǁq@uH=6yz~ف?uP-6PbC ҏL>HֽnؔSkΜA&_{~͂_5[9_vCOnpwnWOٯXlS֗{6kiSaC }W}uۚ\e2ۖR\;Y-e9?+j8Aˈ^&fÁf\.$5r!©Y?I-*!Aȓ 5(8*ݩ#;ai/+A->-pv]{?bϝxϳ~*r[ڽ2'l <.y$Nwru+:weA-o / Z s `ףGQ-.:r"O`+ud,APD"ڠP `1M/6&*0=U%J"n * }I"@ZBܳҘP0(H$'Qq+@x''NK""$ ǿ??|(@0  _<F ,}54Ƿ/ͤ 2W 0{^NȔ7A%"^1c歺7l%Rl!хit:u;Kѵ_q\َ he[#v;FXIz{&y;{;WGoEC'BYl؉k]BH# P!?{OpDaW.zͽaw,?~U9GWΏo]9:rt|hS:3P bwOB_u~/U"Ǚ'>TF{7yۏ'En_O.t$hz\~=qϧ;^LE8ez/a$7Ro;]K}0m߰Sп{c&"l&\e:N; (Ғΐe.f,ٳKv`먩Ϋ{yo>[뚟hË5^AA%i)}G /8 ' 9ō8E-!~~ixJ|'K!/d`p#F +H(xEw;o@d^xo}א A߈ <:Fwp JxP>( TQ Xi(ΜQK }"`FÀ k @@ Kv X/) sT ϠLP UJ"/ $#l@ `15ix?SPN"2A,_J ʃ Y^A%0Q#&lN«SI\JX mP3P+}(@$(/fbCEd:L!m:KLW$ 7  DJD8A6'A%dPW1)I"s|4j2~ NPD\Ұ @Pp{EB#62\y# 'HI3[M3e%;D2cWV09ԥ r8Og~/ePIM_R~~Q8ke -[m4Wl2Q3ҨՐ!>yDqt7EO3.=op@tTuJ c˝_NrGnDZTqT*M}ݹsA|)17TMOc0iN~(מ5S{/yNg|9.{}ҏWn%~,wkcل ޞ&D8.FJImo$;]Or>fo,`AqoI_Hl[vC1vj+EcVjUZ=n2o䡝w/ ?Snև)K}cRkb<& ʯDU +y3[Y`^&GG nBhu&q|!^* r@V(4(yJxd. @(Ԁg5 "Gi<>uB]"À9{EGXɡA+#ȅ`0>V@XDair)4X,}^%0Q1dyIDR9<9P:(dv U`q}C `k/_.DfryXd+ &Cī]eBv@3EnGe$f"u~0.D0R^\DNNZEAKQ ++I d[&Qt0@od Y2y*&#NWB_D&,,NY~)_T_得_H)vQTGdI<{ɒU-N S.wfWi d.{$r-_9]73n֦qt,ir񎵍&f]]m#;w?{)A˥Hs`c;nV2aEDž`^Oi#Ӫ/3lܹC-î];"w_L]`|*HƙS&;׉_/}h_g~ {|K1?y@՗Β m *R}n5`M᳧#}u"n癔-fv)Sso-DD+pj? #?j~3vl`3Xo[}5(96E\Gp]æ -c`Sm؅Nlhמm[>6?.c}3s) }/E_<8ӅYM1+u%IHXI6we8]Ou詙_?{;M88&NvLnhh;cho6Z73XM6>lQ` |{Bl8O{ԯָ_/kT̶rB ڹuǔ4Ϗεc-s}u}'_S&Oύ};0gXO\SM[ &9ֆϞVQ-i3]yD-vv v 3鶅zl$(?C5?ۏi~U:įu }cq?yߓRo~:!e4hѠ=wRd8`}5b4R˭LvF~Fcnjtê:SM 6?];6*(_Ҽet/cE[\ :c,->/07"/a&.(*CL]x][„K*EV;UxNy$x鞼Zܿ+nhCk0s@2O=І.$;x +`Qh!G'D!P QWw7geɹ}@eAP@F%pol^@ BXPXx/\ qI q F//||$~>( deEۄY4&S)"I"p=B@H |6p07oGUXo9NxBŤnt. &Kx`1Ձ@D Qz98/F".WPkXLZa r1$BX%APmLJ#V G7#.De*eё4e?*\pYz3|thO;kT)719 ϐXd]@S|tkgf_׷ Zܝ Н 7s';8fz}v>SkdZ*udۭ&| |=m2ܺEstY[N _^7o?r`~%i۽,J><*H(=F]lsu⑅7'N;B_msgAߗ\;7<7|6gk,_?6{eB•K5>s g ;] &L밖?]a;KSOMNݞ{ l6rjnania,`6ц5r ` Ν;uHZng N~;g1=ϩ'7R}SGo)O5O`:sc4Z.s}oJ> IDϵ'=x%|cMx#n%zx#j:d0|$̊xZ=w7 R75S}8#|@UτI.h: hw:X)]p =ߴly K0w;(xycAu*Eϣ$$bx+^2zz]G@p?/܀ ,z^h e밡w d `+ : maq ۈBR:B;"'l\Y^;7e(2_gg3/?97n|Wō1v.>z=~4>75Avc =HsS[ta}9B#vwnD۝xo*鲯Qp*7u^ܟ= ޜWs3im }e `q n{G?C ;*zkb#v?GN289;TM4pSQJOvU&R57 ұa dzLgx|<ɔۋ_w~{,Ql_lwOٷ3>{[Eϧckޖdȃ"+6/'ZN)v3tfSFWn'\|d$$GM;7n:uPXg'ïz %q& |)Wp;vZ_ok\߮Sj#ۦ,wxt0L&pJO ʾ2eSZz. k܄kGܸW(,}TNT] Ȯ@B0䨫2-x|-󷣆Kx!~yf>b&Ew0H'\IA;7* Ӏ7NtxGϣ1Qa_DmP(9P'8@-awQO"(X(ȿNf7-:UYTx<ɿl NQbi2zd6bs+$LDJIiSi4f0d r`-38enT!QqDY*e>=Iq} ˆ,u;ؚ۟JFq89~>Y2i+7%&­St4n7ѽkB:86 "QRb mdq|"Jbr1>qN@rr%K˗KkquMBQH" 28nEfa"*4<|-L]ηJ@p-d`AjJ:mFf*ˆ4y{dzx%PKRGS"V?ê4i('C-Z{nd|k[ݮ~=Gtt4Շv|Su=bA_6's&87Xm-3.߷RaN]c-_(|Ue,׍>pw_#6ڍ ͏ag'fΏ]}ybfz ؍]Ο5}ъi} 53y>Wg}+{i֨'>9W=0e]쯽c[tdc}EX 6R j`:D6caqn}+1_:fMWYh%ϏYcp>[ULN \,ttb.JPCbU^j?}[wcʼM;}2\L%廒?T<+~z%z"d2 3>cw7ϰ7̬7qQ_/ s   =c vJ\uwa-Xh^gy |ѯMǏNyd\pOvIv;O;Əӏ&` y|n27s(0_;C]W%X/q#poσ އW s!,z EEo/( `6QۄԁqX0Qv.Bdq@tnYJW xJ"WD9|D6 OQQe F=@l1I-":!-*y!.8?,& A+h 5J@4W1Q-x-2äXL'(sk@81<Xj="C%#Wp+HU0p\zc YP0X<RBc04fS|b bd 'g+8^f IlPy=a%FpGӏUx=h& ۃOwώiwy=vxGkUЯSnF܏=8ooeon޹塷r}.^ V^n#Z~{ovl6_7a8q+Y땘;oUwjհϞjk7 OG >)81yskƙΙ?ӓ؍L\uaT(vsvi?f~/x֚9a(]5s7eye+s<]\4}=:6Og>6P-.3UWOk{O8 04?43~X_ʹ>-ܞqU9v2d,kTZ}~/燵a)Z'LL9-sK3C7Μ }<zno,: ב{oD٥ C7K|>$ ެ3 jžqdg ȃ0&"LǏ5;j6|`<@a^a1}@ }R{*Aeԍ XKan;5&촆̶Ok:]K5T{<=_seRs~W&s>MeS\S_"ͻ:Ln!F <+^+< Ln A<!%•޺t܊uT?H ,]B@ZyG@U8e_-Yl iIij%Xeڴexwǵ m+{tн[M_4v{^s:ߛ~3 3t% ~ i=m';>,=)ai,kCVZtnW[1/ -fN)Ih5vLZL?f2hsoϥHNc{h2qJِG==}[cgױ13; w[ -㵟{?kHZt\\Us֜率-7l&e˖Y~`"EoԔ9[Cߝ]\X诜cP\ݕ:` T3؀5cb[ϝ1~p 7x{|wBq~W>8ʒx-bp'8h?tUBaXS<֖ub]Xw֝u$aXk,5 0^L{Y2{~m֕9۟=7ա˃^*y7Z-@XxT(_ɐaf]gtG'-Fo_r˦ )wBUGϝ͛iH{1f8hyi%g ڗ쵦r:▛ %)5!mჀ6i'=.'ʿsHLK<9{!)+2FGc2@t@sG"x́ `pI``" P.|/D'/Ӏh@#P Lx"x%t0/ +hRG.=v1 v-@.P A`hՀ삂v|%/21{ T@R면4j i%|5rI4f"M6a&{-eõ E *T Jϙ['^tU;h6x1mi֒(N}t]GG5& sYO®x^j3lo=`rBL~zy@ &c_?4}t f7c,?b]9 #UcpŎ+}na/?;wj4XzI[G|R,smܙTT 7s73e˶QJf~0cUƴgs;rB@Bl {Xp<3='~up~Oa#mX+6qjsi=z~0Ve̙wEmkKŗVjXi 7uQ 'GFY=Ktx!Sc_>{~.e[|(oZ8>6Zs9[S?}[2]EȋBYSn$_>fL&LGFo>=zp8Ң/l4rw˃P_7'hJWuxЧd=Ot;wQ=ëZ7_u|aq[VTQJN@Ftp_ܤw%!)ྠQyW㻏$eO{F,kdh#ʑ&@pFϓ+hDd0E n&H3 M#<|}d#@^@gܫ$`wA(fJ1Xd}NОv1R<O.~/7+wUd#?,">@-Y=A M @L O* w) -e0M M !(4e~~CHHl g9@ x<L\ɠ}DP =[j4/%aLj.vv&m9 U n2(0jdndPGScVn[v|"Z(-qӽHf7]6o|+e[%OF}yq*^YcA՛wudh&QKF5@?ѣ{Tq:\'_>NxjObr-VƄ/g30Trp7of^+:65|d0f~lW!XK&6RY8"9fH%yqh/c% |${m" Bo៾"T0TfO4s OcÍD76։367k`J oe\8z5}E̷ k2&;AhI"{уʓj=Fr#vN:O:1(#z5wS2d0d媗)_}ڒ%ϞՑloiϤ~9:myl ]sh,t߀^ 0 Sn_NA{w%*{Vuo*홤[KC.R.,>$+ @ aa(v ?:<QŢQI7n% $6z݅E@  0 0 *^@W@a`ҕOF'p1TM E +H[m"lJ e8!2@eIt<@`PH͠":{D8_!i,.o_D*N`W"/=< `4-*I.?+ā_@Fo6SGPV8r+?p kpU8b'&*ULVL6a\Voe+PE|+n CqI+`ȄB)˙8A'Օ-;n+^$O~*º"ZC#Ǝ^=pwPɑÝ+Ֆ4xjǚX9q0;fp-vd/!7+h*ОT̃uvmnZg֛4 }/i4rt؁n7 C~Ę_2Y7^SmVc.jvZuomz^yOpTc^}.9nBx&v=;i9'.ŊMjESjRq"K"\t?e}-Rm҈)w_џ3]s{Il? 'nޓX?Sp`@pD)hvX?%3Y_%*ĊC$1O_ŗW,ڦ-=beL9C& }6xVg={Z6\Ѵci5:ej"ZR@Nq4[M/uhlG ^?/ |^tV(0(cƽ> XK@FC 28j<ks-~yLdgoD?s$%Ob;;mtRe|%o㭟F?_Ҕp8*fpĈMС۬#9S6~B.gye 8 9C;KPE̓<P Md:0 |Irzl&. ly {?"n0G[L:[Tx7LqU`T8A` 8@TpO&ׂ@@WV ,_.Fz$/ A42y3%KVpE$dA Ȳ!YoGa 9~-j@zVЈ+d墢q:XsY*SĿpj{Ūcݙ%wZK6 9`3O wfzLz8? N5 ^{/ߍyqM1;RgF=6VYHCwȁ# .ݽ:ʍOwRfv9¢iT1@.@ qGd;LGO{j :(lr>:>b'ޟД9mK۶*r6]`ٌ? }ye3i(ת-ݩaHOWLV1C']~BuI3sf+Ni=p7@wBI\oLwϞ3 `>sx3ܦrsgsfpO[,~L.: Jr*}{eL-T`nug$j;W*zB^~ȩm'ŀz7_:{w(79*F|Z&uEʨϵ:kbޖ. y-i2b$t<\%Lgw1`8d4|8l(¼;Ȥ;t<n.cvI}ݒdwyGE:\wѿl~n[.Y)OYn!fޑ#*gSǏ;GXZuYw:qqhT@ְOΰKБi2mPR"^llgy0//} x7 V@ă}9O 1\jYLA8G"GQUZ"Ykt@ǥ3l6><)#-Zq=Gv]v+6`#**twwwmŎ\wsL8brLrH|Gi GD }c\||@y ,F2? @ѦS"@ƦA'# tmϞ|go؋ ql v7'ɴHgbbp%qvwvQ9ۄxHjJiJ?P _ާߙK?a8<ޭn5d1PwKEBCkKDZsuO.G?[kgJzW?yrwyoyAm'ْU[] |*~/>{_iF7Sm(5#3exkXK[YMTWK);❪FMm9( 9)lD?ů> v6kI.ɮ.N6~z -:\Po~]eO @@KgfgN+O&ͥ;0 [}5 |KC6+JT6#m}tg ]м:ue%wa:.r}.w}$hDFv7aml٤hӃ"l(+046y ~y0 : ?~MxGy]@("*B)k0eC_#dG /Q}1PhgZ4zF89x.eA+|C8*B@3P'm]P (* 3S.g'Y?$0&seA0i(%~:6r.!K$c5<@tS tNIPdUH'RxP[A;HM$it^):纐-螻h+`Uak$8(_Yb2<75ש~l|8+J;9D%q @Q TAq$V2ģ $?E "$/\iDQzs_4|tx*LK pPiDi%\2UՋu+ 2MPws_Sw+6Oy:˨#imUSKO_6s. `Hꕆْ)g!/ ,UG^( @7(3 l_֟{[z6k=sS[^dL5gl <;=7Qg|QKTbl۷[&Jd[/4ji֓hӗj8=l}sΘ 6?DZhͺ+{3ު)U%wJٽŗEdV+,*>'gG6miy^6cZfӟu\$y>2/ ᵖ[}-Y; Xen)ws5ҿ~o,\Wc^T K~*l_j"{Ge~sH| s5wV4np{ViTOvAm/K<}*ObgV+~[LuZf j3h1ʹ Z[uX_]]G6l d'`yU @Rc oZgApOtϦ8Nd-x'9OX?Թ6+3'3~aN;ץJf_0+!?ɭ78Iz QC1!qV-~V (.ȋ`ENyvp۵G<"T*IQAe1z,R(/T%PFw@mTX%P{jU&@#+ҰQX? %X5`7Y@|HKT B%V "0Fֿ j 㡟 `M =M!_ `E<7px "E~'=N <G @$N' Xs=%1AfB`k i5,@9, o@j[b@uD,ǒUh )*$xHJ=m#!ĹDq〽{qq,8O@"XNw p[s g; 7n?&Lpw0V6J kO+ _J6]k~Wo2*5.j/Ym̟i,h{40t1o Z7_K5[I6H0RpxBɥVY{{{G_)ҕ3=wGB5ɋ?;R~EfHTK喝$%N p%p[\44l 7 ޗbZV~N:˰?]OVPkuΟXygE-yٟE~o/a ޑ4pT0R{Y ,e;Z[zwui\7[wV_QћSטWww]tQs/I C~%cj|RZr|tdlbTLhH~z @7@], QK7FzO&m'bSR]fCM5dTi^3Uֿ:$ -ֲ^q.~.!a1Ff}~-v;u°W#8("-+;X FD@~Qdt"4G tF eǴx>M!(izEÂ]Ԑ=Qh`@g z~ P bpOH2B6.#7V ˸f%^eHɠ0k V~.}2zJ:xΉ(\\;I@\d." O  PX4x%/`PHA6祳V׿Sy7v| *|B ^?^f``k(|L߱c7'.:/Q 6?OAgʯ=۝N05⌰qF`@ ## Cw<]uS쩌ӫUk/lځFO/TJ KbJ~v}_`O=ËLd_ݕs?0)O;[Mʰ%A }?z- .g;$Ynd9}+^kKTINk#&74z K-Xzh/P2XM WݱCt!e'IxoBQwR%(4I2 [Śvq .%!b pwn"DDO&KT5kV4'_B'6GrWz$.:m ŵk/'~ (V XGMU5 %1vrI$}͸![~.]5ҰϨ*#o4?jeBS|wl߫K/r7R|i=~e${}_kL1/QOub-׋}>V) * NsK[\3Q]m,]wS]ZXOLu8_hl#^h's1KI[ӑC*þG<8\iT:֢xꫢgO-+z5yR>޺^iޘw\t)[x_s,oفW]/~2uG 8`1p%d9l6~-]Yqkіٞ6}!)7Taj'*Oѕ(Q9Qqvmr@COz'#VSdOEiLNȿ6lýCeE$ JJm#ީ6v#'LRة~Kjʅ'+eW:RtuOqG_cl?XKsWirRLBD_CY0[_5קUysi_u9e^(saɿW%|*X|W KEا ,SGeor6lM# ׀~ }ަzf5Y-w6zyQkqG 0<*∷)3~/0cV7`܀^R\ާ:HssU՟05Spypˣj}n*4JxI'q〞( 5r~[ᄚ<߱m4i !{.k&VCF%_{ kT `" …'JbPЎ1hC H.>H"^4 J?CJ;'$1)J$g^*Q0dWR) fV VN7>{V8SPb{M_O|/9xz?O@FLIb]J[@dOk˧My+ !~*Un[c>W|"SƐڤ֛֬hwEnLP<`78<i >c*ݿh~VGFK+׀$r 5&=e,$XOENE-ǚlęlF/<gr]sS O?Ӣ ծtUSlјҬƪqk);ϕ.>{,Ѧ)]p.,`9Y>EY/FXm$8溙%m۷\_0ߥ{~-2{c ~gm&WMU)_K0V6Mzjl>s=fIwH[X4aOD/$-,zlZ{7ʟ=䐹bꄗᨏJzV~%k~I^[Yso6d} ؊wZ ܈3_ 5rך֛tVvPuUTvW ֙ 3 }"xK~wUhw}X4lO t1~.]w/˿ [U4h7hr`ٻW>F!eN6Q-& HpQL_Yƾ6m1b9 cذv<H рPNc( %uY(ҿ?"C)d.A?zl@|~BNJ8eJ? \~q6IDp}̟mLx@ǧ΂N _bx& P$ F_e0n ޥ1n0 A|Xx.DO@$3hT |p2UH9'.,tc i!׳T pT "l?%PdPo!?A%KH 7XYU@$" !BE`ՀGeHSX5?R؈P`pxF'y0Oܽ}m? "b7ou?oXzY<]q+i-~=CυMwm5i_˓>~)2[i,o! 22=7@L&;~*4Dk@Xhpӑ@^7QIgg ӻJdNthm7|8=ࡿ뼚,kuuɟ+b>U[yȯaD%}=]CjZRᄗ樧戟FLtQ2n:d5 CIrG0$h0t׭< $e_.cNC.k}Kye9ϩ J=*3.9jNk~+ :fqYà^0a;@֋sEP}`?ooa}Q?[=Ϗm\K ym&ؿQF F#GϞ8h$ ,Q93QǁiP("4 h2Z W$ AŸc7>&!*,`:kX4<Ƶ( W<2XE ->;DU: 5qqc#3 "  d.KG}(4I w !$EuEO_g b OJ yTl5;kqOS䆭 D`Dgl3{,o<WS7RW ̦L@'^*}~z.-U&TMsb$%Sm>c>^K-V!_ ,=/Ϝ?3m0?߄}yeaek9n4 `;>f" L<4oqzswEp{"f3\ugVgݴ?riUm-PS_;kǨnF[wy̷Qަ4F=&5@N/̘>qaiEȅh'@;=VQpKcE%F("?oA'vo*eW ^VaQ f|? ;I~f%~Aܳ7(j;ӠIV0lbG%E{`gK&TˆÝ knA<(OBP: *&'p [X[n5/@-kh䋜scNԽ$07'c;~xNN*PGX {.* FW22þ=yo/"tFZ(Kp W![ ,] x"ϓX/e!i:xL?A=IuµC#d1*\1$NO&SvSd!<(]òxIn ",6k'F 1B4.:x |ᨸEit̳iÍ-,e_M=!Sh-۳]j4Xwԥy]=dg -u O}*Жg?wTxWcerLpݾ Ṕ8שּ)g3ݵIKq2˥F,.9ȼvmsjɅ.VmVW= y>Qq}n'j+h&;b<=f4;秱4ӟ{2<ﯾo>Pl-]L\o G>Vb?1hKVB\"R iIkI{F}DaTqN}Riɘr|>ړEmDO-lidgaoyA<]$9m$8` ɎK6oluփW .l_ȷk3zn,?enدQ/Qs mjn hO^>{l҂V)^[@Hody-}tY>_|{}N%Fz BBb\xGe0D{*d:|!f,uvZ#&_z7v)aݾCZ=.*~z_ٌ7籕㹞[U$>-zg=W3Ss=lb-"^K5 xi86jfa]`&!aVmv  ޵x of]QcAC3A(ƃ(~FAQgB0 v-[^ n`ds" D3(Pd.~Ə=?jv3Q?pA#Q-j@7GƬ@ 1,C߰.v2qp',qLR82rrbL<`R|BҬWH < q@:ˏ-F^-A enNl= ()Lq `6 I>H>D~o]D ;?, e:xA:  D;Y 2, ?XJ O!^$c;P$Nb94aP'8.y/l0x pJP1@:N৞N`U@xʉ;p9=]|daĠp>OY/ۋ[Kb;*V'*lg?DܵmeM(]noXiomZl.{ P`}=AdB8~)Ny[˙ )Vc>mj:nW9w"̤K7F{ն+L/TK6_hEtmVW {=xA&nj>KLp 76zLb1Mݧ?+BU6b)mq|/oFMhZ++=;˜^Q[VI3C^=& *ZכMƼ'T{ݕk[ 7y`6a3CۧT j<$8فX-FDNDY{c5T]fr֏{4k߬VRxN3mz-7.ƞ:/yD^Nqu)M11Q]5 *}eگ[EX ~d9k߇T7q?;}uX 6_ \ 1 0T S ӛ7J4[̰`AzgN\䟹? ֙rWR"|X/v_s@d.gYeJRZvHW|D) @ 8>P$AM p6cd+܄>20 jdi8kMݷK0DXhr;^F @?Y9q?*LB?Q ;dPκm`QTd}P{4Tm@ὀ&!]FA(wpǀ8x$i *;8"? @e%ӥ 8yDt %(p҅xĄ ]'OPy贽\x~"Qx:!*&zBK%O`E3d 'nuo(ŕ!.Rh,tp@`h|O wMpS.f@> rd;N"6IAˋMRѨ@N'#\@@ =%p\G@P8 YD'I{3iAv u;slAuiMYIEEѠ䍗,,g?H[ŷ2ޏ^z^z;pr~qvy~gO Se3"ۛ@OfgFuh.;} Rקo\'##tT?dKs~ⲕ<iMzdVk]7:md]oU~v"Wo)0p&@0w)To5p=L#c߅?NwO4}y0Ցߊ?a73fg^|Q.4GF ;56+_oPy$t#R% W_ԸAٽ[fw 9) 8<rQq0==`jffain<?=7kKv[/e7ޮQ)WV[ Onb4]tgQ-‰{.rpҷax <ğ{E.;6k曑6ol#7cmZעgV@,a0h8&=  hG1K 7 zzs .>*a V}4X{l,i.%7ϢeA.$majߧ OfCqS23<;Coqx p,38-8 ODF$ gc=;N=7<)C$4HC8#`ǙҨ|OQ@ m@v}@v0AD&(8 }r0b^0EeDIPdI8($ nSKTT4\O- 4#C_x0c<""F&>J&SygXFϲ@sr`P`d,wM`> <_|k=y lA<"!xhW"I:E*Flgb#Sq""رs\B. %H *q9c3(g ǀMYC4>EɃۣxafh%)+6Vd1dzlfSVRT]޵ɘ@ ZLǡȕ| : :\*µy?.~Df*z3k*ڪEi!߫*WM/eos" Cc,"͖&s>-/[z<-Օ5+Z̮8Ⱦv(;:va.4{j VnBRZX ٌ6n.c*f~r9]jVFV1SZŸz&ekG I4ppTݕ2xTp5ɌS.9w cbNvɜ|x@FR[Z_^k3c-mҰꐳڰ˓1)YI_AÞJNzmX4ݤuR|*՛9$<$%n"̸gU.cbg3^*&Ӓ @%W.}}AG^LO.i5j_wKc[k1h3mF56'zifn:4 Ҟ ÚŦcM'cu'MGt44|Z\^,[ h7,V:SxAr!Gv/ ;ߊ6}g\fbmZm4W54$(+`^ó6.[`X'8  . 0챸~H <ݯpn P5 dle"NJB[ P,}]Djǰg\ľC(uA<\xzLi3lcFS{ǐ|d%ݴǍM8qr7 ^$WsП@f%y.C<CEE ^5^e28w&nM8h+\uHxq@1O'L 2o  :!x| 78mw@ țqwg*x|FU⩒D8`/unvwo7 a!e}N!~n[]沯LotlӗWXrlC/?|/Y{;~mpPFz N98IFsˡFo"¿O5( 0әQI\)(dxӁPh'J=^*l:˃J m0,-45ƾfK=>>'m鿋1Jq 5费.g8Y n>p* П- Pn P|8K}b>%`0  hB^?P>(f!hehczD ?~ |5ZS ӠAc2HC5q .N 2~OϒHx1n/EV%4D^+Ty Q Y:* tAl]HՃAGm,aٍ UW2z@4H_miw}&Xpl Nדnw@nGK3^GӁ VQӡaa vKabւ,U4eSʔ'˺tUΊٔe潨KG<Y Uvpq͋͡;"Ɣ({PNחn2\RzUj3\yZ8؋GN5?$Gk̕&]Gre%lPP!q1;]y3Ǭ|B,ކZn1͗ 4ugA,/3 WC 7MWVS~:LfLB\ZpbbƂuz<ڜ,ntz(DLy+ sQB= g;Uu2m"OqkOW$uf0[G&g>+܃?{p M(Q2}yp4~QU{m$"D>.i/H`;9̞c"$dG%=1@J@ǑH0,";Re 9ǨG)x)ni*WGwq[jO;pNg(S\CTDA2C;@+4\'J&?aME@&D8IqPqvyD8ZrsCW(չRUC3; wi- \mXz ;SG 浛KKv{]}TfSc!!+1fK1֛Ѷ.vnPZ{|#'wp#+}LqEo-m\K3"U'?cpjNû"ΉFKJr(Tkdz˿@^X|TóO=X_{OsG}K~:h*h#a%n,tfG;ZqpBbcbٲ2̿8\ P`;*+,ּ64TQZ5Kp a2P (֏Rl`P(-z7`^tCc\Y]~ 2@/@ɠ(?nٹD h#*@|qf5B!ч J؝(Bj4wHG=٣}d!8 "hC|^(^0M*qe( ^qi=tD8'8練-"EjN||x0CR4T "WA"_ bxn~K%I0c 6^$0( FAqHɧX*N%cSH)tEAa!Y4<}Yqi|<,&&Bs8 yluD{5Νqp>&*zG f\Xn߉'a"PσkϵwUHؚ}@XBŢFpg};y Y<aI( $&GY GNviAI/sÛscRc23_g'&Wd x.gK:%Jj]T[#+V;*f[暪WZ-,(ldݭsSH7Tjc({c\Uѭ}WΏGCuLf-ޅλ+T;uQ0)>$5EZ,S6gWmnM6,[-d^vufy `1\MlkW`v{=C;N=nG,D/GOyd13l>Ct},< &m]ytn;㖊V&Ϻ,jO{9ȿcswEqAaW{5d9hOk0:0phJ DLlHNRN_.# r'cM5z}&BfC F'!4XvU\O]6L4 [ b)i%l>p5Mńڨ^lԡbGD̶qrjM9돹,XN̴Yr\5{Rr5јoxԮP7$bO; u\h~'$y$PA0ϓxM܍w9k!JE<&v?N<W*˔=*s,YXΝsw$ /ik5Qs՘ www1r7o4TI~^Cg*!oEOJlQ5y0c>8=ԟ2O764VjVz=@u2b,t JutVrFVM㗆2M{T˭iF 3=6o$".>( -6?G}3@8 (]l7@8l:=pEa P7D>0;C> CP/1qO7G?q( `'E[vp2wX#H1V!n8xqPxNQ>?1 ˊIK*Mjɏx֚39^3؝00<8?;j2m!Cu5˒nrQ4Z=Q^6V^0[_Нؔ`2NIBBS^omS~SJO>zeFW{]M_x`&u]7gko6ҸTV"U|wN#Ë/}rAwlCfqNk6(qoaw!7.[fmV=Nl)$ݽybNTxP.{Y5M7I6MG31w/uDҍ z< {m՚n7TwZ5Y3qvќ75vfnaFQe2jnCOϑpG}MiWk%HO 8`Smɨ괿\ޘȬ0h˙8HC RT{.:L{e"f0x4|:MjZݻ,(ӱXI?17Xjj}RbbU:VTiXn?@(8* 8pZP_ Fagc=2 f{G!Va'8Cυ#((Ď죜j#@!&vOzh(2{#nzL4.G(@<32b8s1uT=B Z t^"Qቧ`0.)wE !I&cN7vFn. '8(zN>ŚA,@VB2$XdpAz ?"pI87gmj<)(xq.pwI.`yNp(Ǹp=^GY .B G%O7O[Kً:srr pqP6 DO?~mUygK䈸욂I1sBK)H͍{ږ,N)L)JX(YT[IZp]Oqמ;]{*e4f*qxln~6;ۿ)Ѵ9Q-H)I/" ~-(C$h.FwbkR.hJ /mE][F`nOnhP3Gz,ovmlq пv4l((P>_͙(#>AoWF,ǚ̆`" REEoF3M|=4gݵ߇o9iuiߩ*$wP؇gő)uSѼz_WDٮ/Jra-?`O/ZXLxMZ 4jޏ9LJ3xt^!0|7^c1?t'שWTj?7x=g:dIuK{5pWw#l3hI})7YO ~>[[6K턛N~渳CGpX]ig\;@Փ[9)λ*ZvWy0hUyWޠl&ؘڨڨkG#S1@#azQF!5\̶gGҬ=*J|3{q|Q`G\xҠoeyugťE8Vwo(!H +%xj@9/8@@%7 m7fv g% cP;qv=^va(8s ػ QmD`@(jϞy%8*B-AB 0T/ LXnE.?fg&䥥G`/{Y!>,AJ"$ |gxN%<3RĄG]AMAu%Iۍ q;܂G"ApqѸ8J"QVDL$B >Y@p%SWJP b-e<8h/p?ٝJn`lڳ{/~M~:" ,DzS8c$8'6 tvDA.۷qqQP)yyg.fLH*,˫N-ˈ/ˈ.͈ OiΈO.O h+.XVȺKϙ{?g]nrv|XM 䋢K-  k Α6m[,=} x+iW p9h$r1b5z:T-]D {|-{[佑5<iKaɃ;}. ]r@fkR#b7Rb '´cM'}ԆUWLc6@L·,3t}ttsnH/h$@t9v>?Ph*J5E3I5KxB[դAUwSwEmEeGkO{݃9U~;q)w9o%Ig~k!{~;'JAROh798DM"'eIxXW>[&ҽovkQսq'YoY'ݖX>`ɌƘʄߓ ?I\RT0SD``qg7S93nkUYk_#sܗ3]flSg#gt´bVW?ux[?<)2."! `xbM^( pĀ!ei'Ra=JWf5bM>(C"\AƖ]αvo%xqovƠ>B9?'~?(: "y?j8A&Ш'[: jPKp;'D& @o}\\;}D0P$Cs[:vA 9%EUyEU99ɥqѕ1rCs#K+r*2KJbs#2zKr"r4]VxϢ#F^lsQn?R5"gxy!BSl]nOߋ>-1͉Enm;k^eDOfُdXͥخe:e8ry岕!u+kUךRlTx>KgW^;;4"v]`oA~Jp9&M-2@TB  lE|@/P 4AEuQE&?J0lq¡`(L*Y Ih}4%PI(г̉g)f2gp"l{p,6 `Ub"D)4 !$\B˻n CMy"D&8>7 Lvө(ģ8c#8ſ7Xk( ?K\&.c|)@|K^^S(gPE\/3IDATo:J&f G Gԣ\}T6TG+sJ @ .9uDb/υgp)=8N2!SEĎL̫-.W^WPZ_PXW]^RXڐњ[5V?V9X]27"'+t"i%WmGBk9 Ogn@[ gK[^T $&:tĘuDęwzldsUqFg>Fo8XBlttJD,S\֘Ҵ悷ۓG cf=rBtMcŽ8mjWmV6\"VbWg=Lxln,χ-D k̄&DO8HtZwx`?=:kbTI:AXع}xEBxS>NcN{iaRҮ׼31K{)MҤr61bOlWѠ愯.<99:j6?l1hLH#V698oQ]w]>Q~\ŭ% mӸԩ{XMڀڔ@]׶ALD-&X'Zntyk{kZM:m0K>G [\pIvX n:h弖3XjZ 9?V| B`@CIGJ`E'aAa^ʣd*K2`O`f}g;~8G>=LeRA;jG@ QQ`= 7GQJ`ρ`G{Mh30F@<{uQsр 1T8TYnm~|ݢIDqA $pv"%J?A<*@>WX>NV%tFHaq=?mgHT.^IFI`DhrA'O;zAdž:`[^QCZċn-% H`8qa3Np$ю!Ro. 04 MdH=X Ed7@E& Swrr sĈSSr J)M-}ZWU[XXR8YA@]~RuNpmNXSn«޲∦⤮< Ք3s]r|]:'_N5,̿.MjOvyb:gieo<ټ6Ѭ$\'~09SGAJp\SR|,Y \^?&CuVY|L+:Kl]y((vg`03:g4=ԚQu~hMa_u#d:H}.Xs)Hg=੿ڐ\l\D~;xXse^j^Q^33_ҟizTdnjH^zHHN˓1'zj6Z}ZFUj #Nng~!^>{mRtUR앖udl贖PR 0iob;m2Jc>:=A#1Voʃ?F fYZߛ4zޯ &"?dXK1Z_ͰUL&Z.d=xFz'jF"#CA n~ = 0Џ20`u~ {}ڀSP1(ǚ 7baph;0 "9}]0JO`q1"P( 3ngy4B~VC.?9Ѹ|_+xH61xrU1%SMMEjwD]"W%+I 8q* ea$8/7גb(qBX.tZS /_V,6?*ΰnߙjәTWQ.6rfRmW*|V냦s] 7>V),eg!sjBGz':wyZ겿N|N;@ Q`[6OD讄OjaH*MNL{-kmoOZ*\nZ\̓Ibah:-u|Baef9ai7l1iC] wAacic 8;k<i>i>0a.RmI6r%MłѨFrzZr+s.KN [9We/qL5RޘJ/.Wj1V{&L8>u215h2f5b=hapIAD@?lK;v ;znoYjpJhD֕Fm{md_ Mz* >s741i`jl3"`.b`2ĬG@TrpVSmZҠ%ASq6>1˩6:~2nm?j3k:h3֝tIQa;(Öpu"@ P( lӇF!5ڀ z@M"TR@/ UЈPo0q 2 fa7!a4@=5y(h}pu1A4& B[|%_G(-if04Ǟavbfm&㣃c˜]0~TB+lhXj-LT%ϻcB;<3|"g""bT0t阄C[;. Oo0pJ:DN҉"4JH ~g3Ȥs`<Ů')CA ^$N`SD,GH;Eܧ#ю){qĝtC> DM&!{ă||͠`%xwBA=}M7⪚*UgU+(ϯϬK̍m,nΏO/**+L,nH~(a$f6m6Ui9Qj#ȧd񏩒7CnԹ}n>T7V_4dhERWhmLS}[ 8IVEi%Ίe>ZOU,}]-[+]XqTYltJAJ^O?:j+ת7D|*\˶Sho]˃Ng~G<-&j583|g\"SgOmCy]uS{M{VmBmPMYޥ{S%8a3GB˓뛾Clֽg4->Ǻv]Y4 3H^I7 ӝ4N$t<|&jio>aJ\ՀhztE6O@HwVCTF|CBT}TkLh) );((|A<'(긑KKX{ezf~{i?%t΀\l\\yDRN6Î "Ҡuћ!%6 }fMCtܗsj% '32"_::7#6mh'c >*@F](d ќgp;7gQPa+*A9^4UsvO4館?{ Xt#BeEǘeD?N$A*AP Xk(g.A]`@hro -f`T)d P-"  4.c*]gfGRkċT?kNjGo%t9[t~_l.{ddͣc#Y\WpL!o"}:ϥW3yﶙi7huTxi{SnAc>j:KQV`3fqqzL@ N355GF\&]T&TGLuiɽ|t湒RWOeX8<:9f誻ociki!]p0888Xp88d$ǹxDǕ$(07ΛK v6 1qAsLSlpZXwQScJ( Aͩ0 vzNzhxjM3:cޚA>zL !W1w1w^ 7O8+ppS [^;v%_*}Z@Cwe;n+Y4΀|݃!W@P ?ngI=&SZs*NJj;C r}+B?7~[4p!e2v%}>ڨSi&(a5]Շ߲>ٍzdƹZx;1E!% P{ЃC0o ƚ {/.ew#FACQ .A-Y8 Xx30Xfd"L8A~z,ĎYzrm_-ǽ&x2Hg=Lǝϑ4I:z8CHa㿏Os@:ȻJ%N`xie8P\'q$l|G:##غJAxwO&x"\?Q'/f]YiK[ҊgeO1߿YI *)+AV}9zZ0ȋ˰L9ӟ3/ y+aOnWas~}zl=xmx[^ʍ%WOH ;"dOȣzmUX[/lX,m$XߛdY.!|X[$Px˷N_}~)!]tXX(~I5y9X8`[u%crᨷژlLZ6Sz^qCsWo=`6Pw.p5b6dp!j.jljbd˺@)nS>?84p,iN{ߙzrOġKGU:HEj.Cn*^R[ 3wWnR U 0ldAṳH՛u1b?Dn,e8 ydqbxn1"~ /al$.98!pӷD :xG#=&yS]{˳ʂҧE O+j늞@O-̬.Hyߐ27=/;Ԝ&t; K2N-[wvۏW$VdNUar< SmbM _%KcZ3>%Xxi6Kzٔ洿VcAgQQ' gy5C@I_ՙ@p3 Hyl||Ռ٬yJs5?2-.xEi{ywKyɊGNԸa(;oyg֨bܨJ頧jn pnB(PnwWmn-O?D"GN@kyFDUK)[Za:-Lt:-?ByTˏ+0/#7=*Ǎ9(;A0{3jkB=\ bEuvvyb c'[U@"(PTB9M$QM'*A^?rQ}P$ )׊p`Es֦,M7eζ̿.yU9Rא_lcsfyN}<=ǟD)b041?M9%!ϑi 8|J=Df p#@XU( \d$?n&ʻJ5S+* U|^TSVSUXRSRiCyM}i @u~EunܜڂԺ܀XWpQHI@qrwq0 ΂\x,~ܫ[oEYM'N L,j.Zh/|4X4Rߚlݞj=RoQ]+<(|]Ll\ߵ\lLt' _m}W~mL9?j]{af͸p3۵2,[o<{48pO}1t1h&Vk>Yw*\}2XR^wAc^ }6{64(\)v:|A]qwT9khKzRZJdtfDۍ(8hlCVh9Zj,|9MZdGdoRV7ݾ^!s9zi1_~Wsian<7kQa]m`5x-Mp`^'I?pӥH8ΫvL H`Iw>6yiGx͡O뀀>^oabQѢGeϼ{J'.zw| "*tސϓAx }@vO>']ͮʣQ+¿ƀ}4kMħЭBt1//E_ʂf͗b?FƚFEU2lYvO/{/>Z݅,Aoh*dT峇3"aޠ`={+/B|4:;B[ CZzP+ @7_0t@gh0:& McoB\?nD?|Ggvğ=Pea/ 5~B^긅͡Β񶪮e!$9^:tXu/ D(נkgS J 䦜A:$Ri;ɜdWn. k*?{/ es\\$ 0* i.~DJ^A"|:=wi$ I"+ aq QpxY&A`nDa( 'H8Eɔ}d^KAF's2z|[-:89; " ueU>}VyUUYYչiɍ)().-*M-Mh+}]068 9{+sI2j\d'f&Kʦ[{*Zǫ#G˂Zl =+cL ܕҬi^и#Ye0v9M< _j¿FnUy2m!ᯪ3FVTjn=5k{c!*L~_NGN4W, 'c5S*SV yA[unjܬw!x@QΊ)Ot 97e_Co@7[)Kqqo?$ٽ|lg9u=v5 ]L7I. {tin~4s^ا_ rfUW^o޿ez"{YTIlii_Y`P7a"?maj c_f-v!|9b3]8x8gݿzPPy;AW^ r13ʮ{Ƒ{ǻ=5:`>`>h"To(@`2ڴC+@c8#? ^&'ž U*#ߖ}( X,p-ӹ/H{ևdoE>osb ߥ0պ;F{eYUۂ cыվ?NA>@ PnUp"@ɀnwj,,S'P%o8< R~eyd?LED(͋ z.ch 6{}飜0 GlN±!b@_=1}6`,QЙ9Xn|clli}ѳ'O>&㻑zLdIai^*.ߤ "l#A>E(ğId"#⸈x.2'e ):UB:^9pHDCz>IE ~6v@@$cϣ^_wNCHxx$+N<! `-ȧH3Q l]vN9JK'c3t2s r NN-Ȉ/̫+ix^XU}9.`)eOs srҟm{} XYY\Zksͩ_b7R6hb"\Ɣx3 vwZ<|;12b>=m:h0Ha8!Þ6oՔо]~\ci S!oݠ,;`:d6d ~6SV3d~Lw%C,Wn3=>f{}뷑2h ePqY8tw+wHq#Ipwwww %N\eS<߷Ywݺu꒙>/h^ ( 6S?UDgT@xos^s?Wm$8,{ v]'9'ؽLr6Ľ-Sm\^>}<+NL2YS듹84 |i^pgotA=g(i? >fy+#`7̶, h`DmUȠѮS0 N` m X@~ư /B0&~j1qpx!]`;|4lM>V`(w?0ݞjt`/?mM6FDhVF{vM%$w#He)7w(|'gJD p r~@X,„B1LT,e'˳H8yJR8ؕTi*96KT֫T-V;"@m$@mtq"UHA=8 {"Np? p;" T,(A0 yp(V(/4,Fb;E"1Q ,l(;*]M퓃 r"κM7?^om鬮묪zRSS[S7Аk1g1o&k8fY+?˹qo,Q B"@7 t8M3J5[5^5ڡ/%-&T8mL5J6Nߎߏ5ӥ4h|eLDp7{ShaN+뾖^At/;|vP*u/yAO5aߪB~k\"OC&y˱vK1.nn*"~oN>cuoMi?&֖6$ڸ/Uѯr} RrkY}LwHwyun=ŝD; }r=>x9nŚoǚnEoG=5Mڊu-ď?͚%xY&_3W}PJJ5^+wl3^Y 3܌1d=d `&bYvjZ|堏L뒈Sޕ)ME- "s=0tp^}插#ʚ""wi=n7zjn0Yye R B^BClɳ8G lsDp(уJQ 8e'(j  C!D*iDDIp 4|\Z]{8뗿 9 ;89p;#_߇ 쓽0ђx0_jj?Ts}5Ҡ'1UQ^⬧H2l9ՙ WXXP/`lD0ΆepIX $3 #ŽG񓱢lYL4  ^"bƮʦʪJBׂfNFE$w( G2298^PP( zG P#Gaʬq%:#begSf* 8gb"(x"y8pxfiǃWSs+2J S SKsj++uv>izoN: t?|"꜡Ա쩆R.5Me7dϴMD繾(7PvUΙ_}yq$|w؝iJ6+7z 盒FB {]# 3n]9(pKrGoՍ`)^i?$}jX0:rpRZfpv2m,˱ܢ,jm$H3j*|7LMK[SSyVpk3;DuI;yW55 qv36c̶,e:lYmgۿ.zQ"hqoK/ g{;2iH|뷗4b'eA৪_ZR~}K[o9?.ImYKS* ~mMsS*ŽN-_"~oJ!Ǫȃ|^r<ҝi.Ky|Y,w^ py,v'^NVZrFzs5q7ΓEz4.vR(֭yr6snt mn7x%n!t?m-m>ne1lu6t'7CM @~o*"_Ԗ\Q; Kq ).;A:& Sqf+a(c>1QiH=`'0/y9^8GMO[Dm6,p cp ň3Ӈ,c%}A x?Z@HRI(8YGC>RŅ'͇%p:a:eHE  w"P FP.g}=[vnkd7s O˶KvJ^ =/ZkK/ piNy]ˏ@KTYo3.IgO$1("q`100Xhv'Q/FŊP0$-Ȇ=EPeI+U:|Ox RqDzR8(t8<^ID443i*ڔpP>G)u3+/Us<^xⷊHdypR43\[ kQ۱;/CytKRs#&z]\MaO .ԨK_ ݏ2 5Z `,v>D\NrBl\BlbXI͝'з)o+4UY%az~jTNZչܯu}Sཔ>ٔPQI붍OOqBG &f#˿UAgjȀwpԋ9 Sy!e;ps/eޅ(,B&@`J^Gpp |  x>-7Lò-R]P pʛE a~/}A ,>=w87ABЇ`d}#`yM^NVx6VvbɊWc%'_-<-jJM+E+J~Mg"c‰3cnaDa!#&nS\8>23;/ #tu \٨*T*xLF_@"PΒ) db>rDl/ p8|zG3ep]/A1T4H!D8$ DDb&ב;vVٙSTޘUTW_YTIކ'}m=m=nnmW__W>XW8XW]kV7Z떛 W?֐U2OSoUޖܞO1l7WRjI@Ɨ۽ h vr!P0e|!7OWIy }C7Po+EIFۛP@{ElO'.}cڳX :L7.00\b`"2jqh+Z)fEkmfZ~z[᱓e5kg5v{|tL l9Γn 6F sn&#;ޟtX 6t|vN ok"uqnz˻?[{  ?Uf:km·p;rGk/ҞQ_$ꈃ;iue֞{[O ?Weߛo˂H*]ǂp|_{]wE>i{i6qzlE믅kǘ<贽:?r0&)U(RQE'=kDYW=b,o*@[n(NI>s䧏@O>|\p(=5 Yd1aҟOd#2G`*0ftV*~4w'}9n2d$u\W}gT9P<$vUn{$ <2!JgX"ld*Q8 QxfN 'p]!%xQF7 *+<" yOOsD@"U<靦x*G,A@9+`tq73,(Q)BP4 ` 6ֳ<(Ja#KiLx2  3,s:Rjw ŸgefVTTvu7 u>inhokhholiiinoPS__S?\KB]ZS$,Vi@'?BTǕ;uF?xR0S8Rћл>4@1@C"\٠;bƧ(w9TxTW[y3<]uԿ{d|M[bG10\||}2PUMNZh&(_N4_KȰ͵=(w[enVVj憿榯VڙF5kbD_2;!KBctp^cEsᴻz~=u`4LG7T?(|]BzlN=V*/KM?~KZ:֜'%kg?{K+~֒s;'Yj8)gG/MlO. u?X&m_S6Uϯo e:'Z$&[?;l)<=rƀz`(:X^< "BM#Xn?z+|7f?~7ERNb-b4ZuK 6sqQQrQuz>9d ,! (!<0"M!iD^GDQH/{7I1.fBG^ a9`馷 fֿ/]~;7L[Jk- Ώֿe "MTb/sWcq*h,+'P)AV7Ŋ2 K",lؓK=ΥtmeEcf>.jfJ. $YNV5~ dE"Q =QH'R( IdY=Aqzs1ziVi6 6;9vJ\^z9y<$ƚ_ќP.G5]+>xW~ɼJђޜ0#|;qf/Rmd;/xﶗ鸕fNs|2Ku[g{}* 6ᗊ߫IwSa3/5n&دU)?U&ސyQr]/J8+㢿:s9smr~>=󧊨7՞ J>loz7jltD4N6cL6wL&|R,WL 1vu 1UG:5;iOۈX _ K&y'z?Eg8n`9ak>c6ao8ewYŠ cʎQ4pvX2KӒN%aVRuyWQ{]wksoqRBnAcpz&n!>GFayL `.oI)I|CpB޹͇,vcbȪwLp18`?@D`pX yB# p? ! [B>ׁ0#g}#5'6B@k鋝q;CsQse (9Ne 76 J! rXᡒXIX,p<*~YV%?+dˆȢH o+|9βSQp*k KDe2x@P= +2" @9qxI,NOhxH~ H*#I Z nƈ%(x!3رx"$,\U/?Ԯt+qui onKdf=.oyD]͍-]+7VWTVe57L7-׀jkLcxCdS> ҸRUf+oZBu?dܥ(Lx@J7TnlT Vm,fNV' ?Nus+)z_6rZ"kdFZ5p<ջ} g­flJ.zs<3AA$-I@)rPDڼtC Hq9H0e/EMY_#^d})??S:l.8l+=l/>.?(:1A_gB2]nW>dN|)/?~,_cUy~⇂Y^^x>r2VjFѳ$t Rw[,"͇-WmWSPWUe2i7v1DǫL磒 Λ V3BtWLZ\d|Heɭ`E!m?12CI%RN8W`|G_`%MY-]O22rC#]3#2#rӇi0@??G6]A}A`75"͝0);칄 0,9.d 8$@ "ؘtL_&s|FpV)v#H(׏u ad {",8  )Jw@8  x\F^V~7ZnpwDi[)]u5SCiₗ8rT27:=*"';IDWŢD>a1$B°eOPV|x+$?ګ69>)88OZ<I7U*YH_!U@@ iYGcFK)rQhyH:I0#ȀE +YXT)2I9O``'saVAND#n(23(0-tq hO),* kPk@{Wo[殶mm]0WW5PS`:g1DHZ[|KdS.S6+arO 0N2yo4n"f%wfo~wN 쩚9^Ձz #彮r"w.A 1U_njB'Azm%,u VcLwާ;.x/Yr;msM]M]/C8~C99 g16kA^C^[I߉1v}F^lR^L.kf6> DlHOEAw\^z=tKw9hѦ; mc#NY_5Ot{w@,MA :{Q6en'Z !) M*l7@3V^d\Vb- bJ o=cƁ# p ryJ.w#vE!M3Uiφ7zi]40`좖 1~G{| 8V@2?MG: jy,5^?Dvz;p#2+D!^tXp{&a'(>GG=t|OLC~ ˏEx"kaH  # ΅yg-'pTUo򃡺w,]n}=Yٟ9x)l)z&Iv@C۽$y4́Š"ġΊUeße#Sbx } G9X E `'qKݹxZ~eAwsnd3-"*trbfGYj0N'X EO]cHX]GJb#qP Q3^![qio%,%&FVnn Q J 7uv 1U1k;Vd7S˛Nx,EY 5xd572]^Ӝ7,wm6Ì 7B=u:iz[t3X2Y2^|8gli*kF?TSI?ks)K}Si5sw<_g|d93e:M%_`ɮo?Itxok洑h x3n+Ŗd,EvrtV~v够$ .˩lw;hZDX=Orxo3)79nxt9h.F[C04dQ-LĔjĆvS(qU&B-lՉT墐míu!U1 lMu)LO-(Jl2ipI}% B?pa(bR4VX> c0el8 A "@J0i H'D1P4@KGB@OV=Z=FW&;L @:RE?Wm>l=B-m7g#H"aqZWƓڷfN=K^~513[2YEkL1SȊ`Wd#*`(lWy^BRqN 3+=Ef'd&&fz]aYԔ\sCS[-N$c1g99nGNk"YdeSdcW`cdDI V9C$_4HdY@0OeU1;Y69Z#!rdN 7Q,˄=̀̃&RODgReš`,[ёBR=[bli`cZl4;/7q^PE@]HkXF`OZzz{jkWV V VUEV%MT-Vl4nԬm/xZ9Z֔Wl2 >*ɽzi˹΢'euWﵗﵔ.鞍R"~tх⡷KGh+i)_r'覰yn'irz.33caP~)v^2rn7`k1 =֒,ݖR,^x| |Y[䰞i}+yLYn FWLC5=8=do֒@_00I+_)p}ifafll~]VhNsI_ƣ{\k}S]g^.ζow8;6kl _suXzX~?lhԚ6[V/W]Llflzuo=XZv113fro`^{Qgx]ß?s؉] 3y츟hkmk9pvɔzRJ"M04loXВ~k$IXvdۚXHʼn=N!. FO2[H HGd5C# 6LJ6" C}8+Syl|$dN"&71 H#φ7#aa`iyHpr,b8/ Hs'"j;@:)p% = ;۽5U;}5/ֽ{5Vb8qlSxuXeTMtMfKbh ;AxBF&` PD$A< q<,$'X TK&% ^O'#җ DH\)KTepd@\dasq]{$X=Y- @D/;}Ig,?ɥ"q"z*%IgLXN" r(E5hGؓr" s.{K@-A~I]iʺѶk[iok|R]UQS^{Kךeϲ\^oھ+O/RVmƃf3<'",mz"l z]sQr }4G3N蟫spx$m(3;!q@G~^VsynY^ӐIEi!λƏ [Hxv^N:ҚlD~"2E!")e8#, e]'B HH< G$q; JA#1B&(M!M=u\Qǣ;'|*d<|h-/6k}3zHBKxupidubS$;#Q^)lD%*NΪƨRpxaQ!yة(6P0|b`dyE;F8k\*'Í0gWY=hCcͭv=Ն wnȖ_*V-8wluȕ+\ovJ9rJ%jET^R9KHl jqVYCiSOs&re((S8S %Kʓ/Mf8Õ%e@oܩ"9Śn)UnЬ8nஷefonbyŚy?h˿ }ǃ{]%;GkuIVz%XΆ,Zy>YIq6"kYn[y^˧IEk }v{yhb{zW`n|ojDgWIiNż8ܴ'Q.Q c1 ;2a:.DgH{%C|YxLvmc 5Pk}B6 F  )/DM"(8?I{Q}>.MAׇd zp 0}7q~]Wnv5&G,5 &]?{I8Eg''c/p1((0x9X ""Jc`2cX%8q2\s m5( qqr\^?|DK2I6(B^&ƞ$ȀB%#L JleVGTRdIPbxiV4U .zBd*c.[M7;#ő,+UxR FG&ώ֤9]uͣm:Ckjhnoh譮*{ZS:R]26n&u.r~nth1{!w2c4?b6e+_EW9gI\rSkP?ߘ|jsfjI^GNkVCBH^`}8@5Kan8gs)gu#ܢ7a(h8IpjUdfPY W12%'%(JL Z˒-:~zO}X4x{o*Lw3d>=ȲHX4ͷ[ϴkua _;o3R0gIz>C f}9^܈4] 5u~kyYBm쳧3DҤNňP$sdEh%g%JBhX NU&GʥE8k\׺=sw!k>pVRt(PX\TR oiL!8fpf..'%ҧD&,&F;͑,BI9E-W9pC3GзzZxk쯻jgCaO֏5f:r~i:d1M׳LH×9I#~f|uw2VS&#;v6 o󚊳:( ^%-!jZ`61֞(-`(;%#֫59>ϸ0&(3b/m3s.u"i"&LCIdD@:#=P<\Sn$ H+'iDFW밁7 'w;6H<//@pOW6„e\o Y N @@y8sV]栘|zp"> pFNyeطK# Lv|;lцBa) -Nv|Rd&6E2< 4JJQw^O4ŎC``3I$V><^B0P2bjie{YaS3$yv2+s\׹n\E"E] U>Lʼn?$ZBU%7ϰEYXD@L20 'p8E 7.ȟ(+YpZVy}SoKdģĞ@-t f澚꒑ͱ*Tro<߱%R'F5|کDsN7EIǘ*ƙ+Fi*$]hyZ&\W=+.qbEIplv5C|ͭ1hvsQr\A0cL Jʱ|Q 8uA7GsAAZ?{$[>1R1isu꺟֊;z`8cuv 9ÄcDyDB))|2D˕$ŋeOJP.=ÚE)N J)J*H*>tvεӺo_u|VˈVH>>^%+TTx8  %pDx3y(dw |X|P l'QE|r R.wug]5;y8;p0xÖ4c]F/K03f#R,","'R:C̪R-;2WV~%Ĭ3~'|wX2ȸ}Ϭe(& {C] ӷ?`@P\'%`p۹w;wZ0ط7c+mq3IuIOCRâ/bGq8T%NUCAS@/ωF(<'3cxV"~QquYaqvAYZNCXi|aS|R4>>=Kb !sZYSnvR)W,VxSWam){/Sxv Qt(9%"bDgK1K/|6inӑ_MNpzjUls/A5)`Z#4φh H]W=Һ7c(-ı&a&u8i^tWoi]_GyvMYUtbgxK̸}Uuy053=\$-#oD %Odcd 'A-C>00e%OIC?1 Y!$u_Gѐ"|%;FHo*LBVin^e V6 O'R8PYٱg(yV EĐ$p3Di*Fcƈ0\"l.A&* A/(87 IJU35hpwm 芉KM(jlXSrD5-}u =UF ƪjcFjgjj77*ך[Fk2'3f˼$OYb2e^e_XI>yw4f6nQR{QNۭk5i3*Td"txQ4SXc3S 1K+Md8d9쯉Z_>cq}%Msd[X{~^tSiQVT:/0k-]gB{"bMkNGjo,_:*qζ~[[Km|.X0|pؙk^VNb=. =m@C@ 6:{xŝrb>}Υkm>RSR ]I [.FΆol~vOzЏQFZOT57W\5ބ/Pe]c%p/3ϖߛӜB~9MfתgN;i&uVe{e9ndN8< 2yfkyW) p @5 (i}M$lnW/vl>"ŒyO@j2̅H#3RC_H~"2B`؁W aoAƏW/CǷB a`/ dPw& A azwQ22߂2A%ZPwYd{r_Ph\ձ?vZyeBԥ権Ǖq^2rI\d*} Ŋ`P|h'́ea0H|$<';| A7SC/_ž)dE6KWhYvlln4@bP23kO7ӻ(TY2EpO<ʦUz9TX/X${,g£O1aIJd1 .+-X$3%CaN202Q|ׯZt:? 뎉K.(o}Gj[U7Ձ5 zxdx!~>m>jnft` XAbJ/U7Hx! `#]m4Ŷ*@[]vsV+s[|)%jT^m׫R/tgxf{3%As6+NsKi_q*e}IPEꖬ9]K&D N?1T/-O$%GAUަ2;f=TVҚ}&`)l*Bg%Mbe) >W} Zs-ma{/e ؏50|t[ d_wKk姶Zts/$+yp2~Ϡ@?Au҂;9SOKQϐʑ.R<'Q"Y{^|s* m)fpg#&qR,dl+!"abDr 7k+f[1Vo=(~:t'.jd ?E~r\VnPYnO= [We=.&r25"w4!cya45A+-9SUy1Neqe-MI5 mIuiYQX.XVE <>e>/"MsV"~quIDATk; |~჌TDg͐`!>!xf\H P6"(2fN sAp,{kApp !QD|eYX?&i}њsWܷ?ƾ?z1$qҫ<8>\APrW-JĢN#`$ 7^WD㤙(GY N%LQh8xm.A(B0%q(4YY u=#BGb" tfVU4 t6?~H hmqb"-.3<2^NˁgK'6{GD~^FճlL癖[f[4OUk6vC ^G?08v/Ȱ,Ռ h}!w7kMMрv>X2 Dk66I NKi^s!N>Ʒoz^!sL]XC{K}jC ""&j'3GZKJ"+iNiKE@vi͓@_ QA^`!bB7ȚuįG(qOdv~ g]w#l{UCBp !qh# *` h9\iy a䝳 FC$"a3#`? `q dF L ιz]S@d̴ꁺǽOڞ w>mm)zZ?V?X9R8Y\SXRVܚ3V:^CH]wyQf?+~P}_xe>rO $pҕ@{OJs7Rs{nfɥiIiI'kJY_pVKU"keV)3n nM~>y>YD&9 J~ȅpCuLR%os`%9ʴګ=0}o,H~#p bu6 6LitXK}0]㯶D\~*ڎw:q]̈ʚ+1O-p ŝn a.?6֚pp4uty"UgN/?Dy{.CAӆͺ ]/Ǘv<V,̀9[8 x {d|OVeUWIҧp{p|1-?.>y7d-X۳Hݵ9חՖn͸\Y\ Zz"d[?ci*~oygC?@p/ תoU!ϳ\,-&b&&Cmf2);+ 8+\-.!gt~NYaYE]tUTuF_^d_QX}pcʒ ZnOզL1}" xC'[um RE N\qED(| nT迃s}CDO }yH7',Ï# E#s`Bx* DRO.=@p*qGUidü A̮IXOe쌖MUNW4^y6շ;ҷX'o'?]/*v6斦䧰Rђx-X , 'G y6v47wMM2LDi^83N]*H駀@?.$#?48 |T *+`h%"Z#ΌŒIqvAGX>F{] ՜_gD`p>hJMVVh4quruq L)+kl=58q_k{_S}OMioU`Uᚨ骬ڲ֪╶ܙڌ򔩢Bb%/ .-%_=`1U6Y.]YݚV8(̲a#YeT9^Q8x\;Eɫ[eN?T?+A.EFR0rhq Ny6). E_ϰܒjNi?Yi3hS39}wk`=Dm$i`1#cY·f#H$' 0@20}z  2RC2Dp |0 H @z@V /1İX ")3&( v;v/ ;a s J3'hf6?=;taI۷{K6z& [2o^d0pN $&F 'K<24NDA}w$9>Mt7< 2(<B0( tTU" (,='&q AkO~T 3IcA*(gbfga\ԓxF&ÆƇHxr(%`^,h:dt'dܝGz ggUUO4Muw wuuu>y\]"*gX$$4Vt#m2iILIjn曂s wٯ /sίx>h bZD(hj\IMj 4@!T\lLLhMW*EG.HMVN崙܄T92Ai~ea wRc\qWĸ $@ԸKd1pwaﮥX=uZM4 ?jne "W%nߔ{ -] 2Q>˾ByVWKޙ-߇o>&njMZe2vw[sXW./cG9s~jg mEoΔ悫P/~_ ?,I>,D`Y!9d7KzĻĠOa?fFEoRޤ{!#MJNrcN >_~"o^\?ΰY {|oYe|I^fN{_rTX ۉ1}l7jwuYmoe?ׇg6lcEak:3cL 4dKsLuZJ_OwMrqwN+sNջuWU}ɖ7i.3Bg k鋩3&;34Ҫ+iI~UY1 ̣YΏb̅PX-|GDR_ 4DO`),K@DF"d )BAzl8= dV||="%!fpm%  s:rg"Hx bfcl]s--φo>ijH_xT<\QlXS-"baB3sda A<<@ 0h;xg(X l*(γC=g:^pupuv@0pAѰ 0աhM(acd:u-„?ş"EB8fAIDd!+u \@ 6HF&g'*,y|lRTdhFdnDqDEdC䣞юށGO[7>oj-Ul7T6Ul,7gO֦%=-J/(|k?k>ȾVYM DőY}J Zh+1IvrT+L7ٜoV4>Sfx*K[8^].+ +~& A<  OĈd)5dȋW-'|U玘 A$M>oB7Fvݜ6LZ7x0ro;YmR5A?5E~ I6-NVgǝ/+4DLux6qc^JƤP@ /bm&ؽ~a:m~傫΢ɳPhӂ̍-+Eϛϙ17#-y7'oSdE~͎%'cf{Z;ZYUtLwc_uiN6CLw9N/ӭ&,>܈M0;㯶rw=fN^nV4ۗ6]փtMuМ?XϮ$:u 5>NIw2~]?8_O]MZJr^yM: E9=qIͳPVkґJ&R/f;(yz;W.ѽ3/j8{"c1I]\MiLQqnbvKdm%k:}ފ6;8 i5y !)RSE6&"sD8".W/Aęt<8b!@& # o@|y$|8L `H81 $?x3f0f{8呹};6a쎖A #nbpp=-)dk[lJT|SEz}c9Nbל4,S\CO-?k+/K x E,DA±cXxIxAH8>3qFTM>U>"/U (uG B;=I G頳t n??M}w=⠰,UHһBh , ^@fDRd"`9ތLXlBy2Q@NLL`p`R: 7_cægJJkvw<}u%>!ӊɊꢭ沍̉䑒2:Fk&/"\>$~M y< =e߇~/O8sn/yQjhVRcaoq?D }:}FEUQsؔzؔæ?"dyřoG=p/YFZzfn4Vl)N4{f%ҀV=G&J]~ Zo'YB*C~ g[vjśBϗq Hۡ$;e%{4έ?ҹ+NR<΄ܔKйm}3fՅWJ-:rZ2;J+2RUGU&=rsI]uزXɚrɟrsJ|2}e ND28\ҁ;̖@T#˹_A؏]uDO2#o$B8 >dFA`9!_H3Ep鏲Ca(zՁ`(D|d0ta'@|d0 226yQjr`@cio k82'$A9aы93ͥ%9%NĮ` "P ь1080, g=M*b]r"ʣ3}= ϝdb$Yfi$T:,G*Rt@{}G@7X }B)@)bV$"NĞ3 "Ef?Wd"0\y2332`]XXLN|JNn7[ KN%f/.v.v mjyV_I]vO]=t`D+-Y a gUYS+){Cnƚ`!{Qzg9ˣ's|;ղ/\U(1;wk_u!1k!/PthIK4[T`rwVĽ[/u/O ZN:l R ux˃8Wі",wl;:HwJFV^Hqfۍ6؏5ڋb-kABXoEVW?pzָr]VR^z-?ߊ[lXإ9Afz|lldX@CqV^ܔπ l k>I,T z GjR۲#ōT<.Jk/n((̋KvJYر\͙tɟpNvNMoQA'=^EjHuIS;.H\KtE#s|q'y1nEZ.l2F^4BH!BL@@$wV,\ \~z<աmրY p8j ak" '{pQ'-iQ閗 mSKJMH (S 8d TjH-N+-j*M,4{`'2QxLxX٘OXxHX(LL3*:h $Eyz^UP'Hg9"qv/+W<)rh PB@t\s4 q8Fq@X 2U;M`pp,dS+Y0 ge R}hwf&o sEQ,6'l9Uڌt=WFҒ&KgZ[Z;=n})!g&j^X-ioj-\mƪRǍde>"_d~.?R'З7,5ӷB.զ̔Dez(wmp%bl zS r3cݾ\/t]Jl?\e>KdEX>, ᧒%xyY8Xe\le3\ "9m$'atWTJu9]z)Qڳa7Bo/h`dTPRWSvpYs(qNY1{Wq<&Fѽ6/Q⡈#P\ ȈSyr#uI}yEV:*l"FKVf_>,/H rTe*EH㤀Q } EG`0*8w 9E"Ia0gx)*E'TY`x=(ˆbı"Bl3l1"J,aBu&ǂN ss3x32ERDDbœ=DKpBc= !i1%9su-MCmm-͏:k:+4(o,NLY-n)k[oJ, _8붓" Je~,V|{a%@p Zk]Io 0.gq6D!L!TPFnGu1ZܼVk{ 7aΠeʠ&U(rs) 8 US*CKʜ3T.y+"WyI%i[,Yܜԝ3Ro3=m03?=e͇殽o79m`6Nw)[S-^[)rI6^ʹ8(uzSz_<]"`ߋ[ "r;p+VC2<ێКp6p)p-Pg9@kOsn/Łl梨?D} >Hy_ X&w=n9b!tKo)|'q-m`m_- _U/OU/P˭#Wp3tgU}Pݵ`Y3>,[ן! ?gZ:[ptjK,{ ً2O0./5Z6"O^:RrvZTP`H{O{]s |>E}nȺ^ ҹ쯭jﯣ\o[iQВԜ^RK ͎+̪KwJp:g yx&rLOpvZ4@aF& Z  ޏNg=H7B#UV$ Hb : >8NOsYόy蓽䝵pH_#_&p\ d. @%w-#@P(O( F'Ӣ.ы]5+OfJ;  DTٮЊxfY2NJ8J q0 IP{E"T +r> pffL "Icͥ3ͅSմ78x\x, -4 '#t8 >8Gx0#3 ɓ<89 @LX11 }=/](,Lbc$20Ir˂22c`"}r0bl!x#Cpg¸0ŅrsS17y8GKX*H_,Ι/+\i[hjllokmojmhio뫫--)JPSTے `>n,z< !o/@C~bCy u Jh  #~Af5ZŖ*yJuݎ*3>'ÿSu׉2r._{UpcX V}ބq[3Z :~Za&ϒ^`yKf0/^&yN8XP`A3Sz8?pYwZc6} {y7 {W̯ ܜp31`5Hk7st_ Y ވ;ȲƐ\;`2,>3hsn[eAߠ53>I:(qV伔n|w.F4xi oPpHxӧFQ֣qnEzw䃮]Լw=zUg5T{16Y5^u!`h2ZbAfAbZuxjwrcc}k0KKtdNӷBpJ; \{w'v7AB[ rTaO!~H''`@@_dvrzHه.܇Lpx Ȱ E` jH L GC^H`p;<pt%pxpV䴭ÊڅȐJ89]&(xe6 N#M:PR-Ha+_Ǝ$x, rCq#c$ ).O eWZ+Rk|ups@%3  GBID.slJ()ffa2YU'P(0{>E`āOaϠXЬ6o&dZ$|JbKwykjkyq&];CcGk_w-t# س$ɮkV롎ˁ ~V'= 5{,ZqQ6gqfJV-6 z39lsgaF[\sTt;t, [ Qzދ$iV)pVⱟl,AJZ&IkC*Jr_B?l? o[/vF<܎5܉\2֔lTDb|hPhq5Hm9߫Qڗ nW4c~<ج6Qk]]~EQWV{zTPA:VS3y!q&q&e%spc]]s* +\8 \0=Bt{p'# xpnpi@W-BN8"B0wf{yp ;8p/&`?$/"; p26}Ϻy;&A~@ U"~hG Y˞"ye.1HppݺY6V5$;VztWfgJU&Y)2$qċ;V2;22}"Gs1$V"njX+fF5vV,4V=l!Bk6@Yӭf~(v>(t|U`:s:/iH4pB_dX$hoEI61[$ӭH-p|ioÝ@ xqcu#SF]&=^8i:g.۝7[4=T֢u\5{MUɖ^#\8N}A]__O5:ȴ~Cَ5!Δ\Rtio#V/Bs=U"^Թ`~/XJFNYi.( ̔rJǞttJOsgSSF\2ל33C0~ LD?LێsG9L }pI# % |x+p=8Gx '- 8e3P;M#_H^ )0 Pd$ 'B`X酡QyvB xADѿ~ &|z1#G]UDP&R)t 8(AJ`N 9cT ^%9Y13,'O20RVdM委߽/BFgq2`) %aD "QJ $ 'F&Kc0XX3O(bT6 Vp$&E|x$VIdD& E# S4@,x/f7 ޓ `> ,@BrÅ純WyY9 3%s5S5k_]9R]>ZU>RY_6\1Q7_]ZQR4_7^;Q2U>WV "g?d Η}{q5 j@9(0Aw* R0t0twݭHw؝]ܵsy>z=?w&NN_8qb5X@e Nn>ӆ][b?^8DkVTbΓ1E}4gZ1J O7=+4y\jZQCbE€,O"I/X 4C6s#M#O ۵`˶V)w9@2[:<8dairU*6 Tm:׏I,e "4E0&fSl`C3^z| 6y h!ALGBYP -o˼Lzoz2g;A,%80g[ NV cv1V6dd3![n߱:fz>=KmʂmB[\íBj%-άMj=',<y6"#bf `ւzUHЦGV&LII)ɚ22\ E-`篓d `9E]殠QT)D%ULQX.G 5$%4_e9@Ʊei)\/Š$8@$IKU.oXL}\7W?Y\8VQ>Z_;:zmɁSm?p@g[Iw[Z 깓%S's'NfL47lw/¬C`ё`w3H[i=+lQ_`1my}e(Ǣ@PԈ̤ʋERg_+ -( , -u`6e>yBdr*q0 AŰ> ?@3GD"N܏=us pE) \sP^"BBgTgFaF ycBrTv 8 _3uVw @he~"q|0g|? $Oa?T~97^Xa9|4r  e .mE9C:UQVX-!A%,gX*I& q4W_J pe[b;u25_HB˜A߫(K߯m&lPC3鶣6s] D?i"M!?i"ϟj٭>a"(]׵ OeX̤X,y}R'.s^. |[$ "(Π}qvch7v_ܲwH П'NV īR3WV˖mP[vf|@˖[.Yl>fqV6c&+NX}j{W=W点Aa}^۝6y획O{?|d1EBO 7E^l{w\sZ=)88{K6(SI\4C/ Oi*A"(2Fjn{L*JSsBmW3W YuLZ`0YJ4}65"|v]a0t V<2P0I }22k6(+og9AW4e"C@W[NT$\U eT:ߛ+.EΡ02x)jE M!` /SI,x+@ͥy m>z^VOΝ=:sc;qh{'ZzT>Q;R=u|DTkѴVb  e F+ X{U6.6,\iX=y*)u2C{=\^7s5:VঁpÙcl$0|>",F2GİF3G&pNW$T0Ac2Jk>}˃|iL ֲ=/L .wJf}<Դn=,S,̀/j7yp,t0jP \,|燪Nc;/OsTYȲ˰Kf"UcLlקϋ|_@n:k=c52켘<7h6`0ڡ[sE~m6\8b|-7LN\mZGwأwlnʧݲt|u+û\ulv:{*t( : O~2}={Mh C)f A(0c:q S+ޔOX>+h5 ~:w{{z=(Ite+l]aL3,s؃vF{jc\BOf)t=T\^Uq!nd=AhdՔ_G`@8I acG~c~/OCXԉcBJOhu3d`3V!Esx=?RD#@sy81ӂ 0xQ/ ;(wBkܣq_|4 q.DTJ#h!0R F`$P(B|iǴhr6tK u4^KPTt>XC`R::s#4k„w0[Yak)T ̓ZFc3l&2\K"2)4&Gm uNJo*&Y+"KQT&/g  j!HkӨzh XuG+UwrxHs2D-CEG*ӦBؼ4zQc>lPXd՝5TT.DB-3cLf{_sޝou^BM)kLꢎMv ZSӝF[JrHΌ-ͯɭo+I*,U%Ecy%7Ƿqa  w'ᎏ x pWb^P* LQH^?0@@aX HA[N;QЖ+$U< y#*ǀXfr7ʰ6Rh,LXOѴ%hTe IFZE&id)I#Rd&" <̥~ѷ0tO O5aQ\$ur(uq A0*UFӁO&1`0MmX@NU:E?MԠyDym$Ӓ ˄R9LX$M|XNJeiܸ/_K2,9$LO纵Ńo6WM՗wW j8{S-@9uDʩ `% 1*{*}&aՓu )f]JdvN=]p~BcQ:DWmyoo侩\-}ћf6\Eٟ$(z)O(΅qBOb8ҕx(!EA8g:5ǝQ}Yxˋs)D|exvtADzNIĝY^gwu]kv+d`x}O̡3@hнw LfO ޔ~6뺖mK:?ֆ+zKMٷN4D˙Dt"'xYkB%ޖA40q,x۞qv=XT\t2D .3)0,o8tmew4 /Ymfk|ݖv:;nacxtESNgP_qӞ]7<7t?o:xx"bo &N7=+ :\~9t6綋N.:8{h:ǽ7VQoÛlrc՚^b)<o"¥:#PT/򴌪⢖SY%bKB ŢEáUeSAcQe3a"L2d̿x$t mVyĠxQE\k܏sQ\+h`4pQV[#oOmx1Ψ@WjP' ` |:A:xV 6XM* $"KxC؁"QHY\E?{1 7ъ`Oa7,L剒?b>@_ $x,uUEioהYY_+_*`95D eF<:Iɕdjkxdw +TCyZ ȣyLI"~E^NLf*3)-k(9VVyDw[(`jhí]uY]YuY<-[D]Um_'tRDkO5%rm~5>`|-hcWD.wNE'ʧ j#NbB”?{ԋ4H{/)]h}<Bu֏ $ Tiڗ7kpj:v/IU)+J8Inվi՝fgKa=l,f `Hp@!iݡ&W=m7y,8vo9"uۚuAB/?k:s?xW11G̞>wy]k mBg^t =0yx"/t8i4e2c*8ہ#-9b|o_F iڷqփO[=enpu耵R3;O!?~לL[ ]u5axwsĞNX̶;0|ۆվ3"|DZ4Gs:Xi5~]v?QA|Ywƞt˙lˉl67c\n -ߝ|0|׊TK|m- 6'3=j%! yAޮ!y'JdWH*;Q4i NW`R3eSA9cMyF(/j.J^CqA,Q1Dbq.hX%(MoBTN04pov7>$ H׿\0.d #|1/B>'Qw`q0"@2R0 0" 5#u FJܵ\JYj!k@3#ҵ L*>c-U@ pJҦS5Y - Ipgx\EML$"` "IDgR$yGYaWOA`jK9-lzYHx9ٍ3 =5"Qhr $Eb!(H˭9H1Ӹ$H_HeQY4N# 3%ɑX=A,I!J r;r?&iNbQdqv_Xmuw[j[m9Y6prxXḴ'KN8Y+~U ׹Jo uNN;؞ 0Ғ7}jl9xkȻ"M<ώs/l`b8ӍiOqU:SYX۝(\q|̰eē~"ASZ~q@?{֋o%̀#sJxRU*pqxSwh$3T|י "̻# OdX$K<ܓl{%Z˅p2CB wh $۝>y:7XFȩAiWelX^hHR@Xf(CؘZp!3Y훪M*!x@Ys:~x>6 |`D"{Yc/yg倝w l8n06u< W|8JmWϝ6F})/&pt0g1J~B̋$I?ڈ;aΏ5F>!OY0/YV̖Ȧ4rjJk~3]o=1  {0hI/ >:x4ۺkVmUmf}cć5݀>5G}:cLPn} gR/O6[Hx(I27t>?roGȮ[~Ʒv$Z-=) {YÉ̿.-]+J^t[E(XX[G>$p*K\-r!mixң\ȃ큻:M9u;`'zvJZq|UckmgcҴ=}kP;a1}}ǺlD#w9i3oaz7tWH@ˍ mA.)cśn 5ы\■%\O[/@KZй,иČ洲;%ׂEXʑЪa!Lǭh0|*h"4+=U Ԍ#Qꏣ ri!0@Y Z}PZ=ԒPBt_6f Ԍ߂h}|XI0bځP|&P|{P;Wv*HTRF2x\ྫ[ EaZ=wyn㺩7pDŏ1KCOTmƛKTaۧcQF<)~U4IӳLBy)wL40bB~*Pwȶ6C}ݡ{:i* ~8)ߗ nWsk^/XWם?qK}G:in7Jͩے:9~:ͱ7uOK=wᦛP^և}9{p1K2mkԛŮ/ʽ~8=kdƑGE/+={$ue"0ޛnFtc8pWB1 S0Lwɦ݆IۢMޔmTmښr<ë-;6tn1aB{oAJ~Nf]lF5 =7ݰȒ lߧ=///l ,$t l _96\A,0; L 6@0rT ^+Fm9'DrV C\Jqh/2#@RLu3u" ,.?@?܇Vo' nl>*v 8 5\[/rЮ`'#Wyw-+л@eIl>fI]+1&K!`e lmiNj ,i]*,cbRD*IRUdLb 40&Ǔ$,,-Cҙ+L134T5UhY lfar|Fe#Eh@|UOJR ?Յ HR&TTm&s *ǑK["pHJ̕24-r2Sc K]oJ GϑJ^N̤0Yt'̈"R#0)2\T  BPIᕑ$z#nR⟕>o().)몭誫kj:vZϵM@-cGKk5熍kv-i;gԮ=~9C`*溿BXөtۡXӻAV)c)zLt_͎(Jػ%dcȃS]oX4& M=]Q^S^vAXA~9=9{` [=#9\~[\V>+̛h)hi(kl }Te|MKƿna鮞{GN/94{a!o>m)T̎;fwv%pוmEn 7ie ΛXG}N^( ZAG`p OҬa(oғ:^Oxg}x\Tsk_<)SIJX\y7}$:ë+hWVpToO$[G8mwvգLh qgn3lxqo["{X<+ "G-LO9]m\:멄W~֣ -8=z\U\w?p"Y?_+^ҽOJ?|hlϗ 8ts^Lʻ藵?N.ϓYK/]*\QMs⧦5o_M-SߝL- ݩϦ>o^ |ր-|w,o \>Dv6Iz!ibєVw6 \.;z@s Hɨp8a`]p#9TޒS1&{8mox8̳,&HY),ON%jrO%_)^p-VTI{xQDn|`:J*.rQӧmG#(-DH [(rD "7_cNdQ~ x,v&f:0/ ~,x(t$a$?0|qA$҈Ff\,G`:ҡ藣 O֢p$r&lBA ^"I-@#m8|  (3SBTy%2FZJk$iR4*L&HD$Lb,JN0(R8t\HTM:Y㿆},#^LCK @u]j4+%-ӄHDQpKѥKl*k%?AjPj`r trk\SDx>3E6*F@H ) !@͢0L:+N@$$4 =D!1Ȭ"2DT̒9a봔wejKGKG&ZkZO90ruax' & 5r;k :&7<~UCՆ?K +\t: 5G>8V;R4^>Xz'|޳'6 w;|OGވM}+X/u%? }8RiJy4Bi!7BpX ;A~!;˄!ܨ.4IG-#FZ:ʡI%%J+6*glָ?k*s,|:7ƙwdpibHkG[㬽1K p՗f=*t{Sp|?i'] N'[Kw!O \fls^-XiNty?_rɯWK|D7~< Tfz^[k҅syOTFpO{QJo+9]tY@s~GϣTf}9, 1']cv#WNcq ,ݫʷ&=氿[68d9t@&'-C{l9nrm|?N]mÃ)#s&& @We>xOǢ^W>*v͵ϵM}"!O-)~+~]pc%]f<~)dIDATlc_07Ѻ=r$`^Xa`mgcGUp 571/_X(HM-Zz;3'?/K@ UP;& &jDU.sE\qH 7x 7?yCD>٠ >f|"b3a8?߲A p4>\>  2;@ H0u!9*_tG)\ <r8A 02p8 jH3P(֭|na%bPoiY >ZP`dt>d1ʐ^()%-I\N"4LPh p| hZ` ޿\U8EBGOJ`H*  @PuID$YHV&`hDr o']ΆU`xiTN&M&"aI 3D%hh!LIf 1Kh*8BVc^Iaݜފі֦MG{'Z itTf5Mօ.ֹm6ew ^}ٚFO+/k ;:}ljxDcpejw^НLǛ)}tpJqw-2D@'ar•fyv>ƛ'Qs oڃ0PHH Z!'ޜ ڂJN&TXKc6rR=nV)Dhs ѷ#ʺWpp(qem|m6p/pWo辮];Cwwn㻱/|ǚ)$\';P{fҏޏ]f3l؇2[>ckE.YGvϧ9=+Qhʷr?lZMܥnzY.vE%@ҿGtYqddzJԥK׊RNgbv.oNykߞM\C_7F?o >QBcW{wȰK#l׵O m?yD] .8oINt:gq/`iHOeZa_jz|iXhZlbNW{ha\n0lUQQY#sFtc>/@Sc8>_ Ο/AQVW /*hu CAxR_ih P?24r&z.b-G5@yѺҋCP2p([i*Ġ+\:UN a2# LEGT"*HDUqpLlIբѱ\ Tm$@&k+*nw/c8!Q\:&s,5"UZПC[1VRث}>YHgdU "c9L`D&xTF FeHbD:]@"Q(TI@Wc4@b09-zڭÃfG*&654 oLkKkX=aߧM5q5nxZq4o@DCXKܩ53#yB+f6N8m=Nb?ܓe Q`z? E2(@pg1s)'c*=rw/HreO\ޠ߼^#]Ǒ55u$ɵ~Ά/uGwnL.? ஷ|Roj_F }&z,ެ3xbʀ7e vzdK7d2i\Gt%cC0 siG^+{S}[߷*[߮qÉ'RQ۵/,)]v ~X][ҍ?ωnpJ_lt,|?&ݖd)*BXHT⛦H@Ov!sK7~=s6۱? S6w·ߍ5-o}yBk9>kwg)[^A'OuY3hkџWv-?J%JIMiOI++g c+sҎUUܭnHͻ~-4V+K}`eSAȋGyDTu3IA!8.:>p@3YGJWW@D"Π* P%*R+Tt~sA-64S`/?_;|` +IfwУ?WfG@nZ*Ԅ:>aD *V]LxNDWMh ^~PPF[-CiEka!(>")+KQ[DHxDUYqzL@)T2JHIDG5 J">@*8@ M*MDV!-/-*#ߟ]?<04\u[FU&K)$U$m.m`& =2Ke#bqb+MJ,r [>W^)fh GRL: +R4tz4%- A@ e(?sI2\1+MZN̒&)\ر}c.5n sX_9X]8P]WY8T[>Z"iIhLms_:f4h٢kӚ6ٹ;{'5ծixoWr˥grA?Jl/gS>Dp2MM\>J/$%uEHB'|Guͽ{b I 0i}%׽ދ(=Ӓ)ʊI?.HhJk*L )J + 3Έro?/u:ޏ^. (F9}pdOr^Uֆ90tqɶ'p\F- شH?0[7E9/#BgPt y GUd !G>>J|Q 2%|$}͠Q|"@ h#< x-C @!>ڴ]QXeS7p\*.E.ǠQ @JĤLMJWPY\kR5GcW: `W2<&V?Z(GVgTJtie _(UHZ. LC%qZTy6I^$$NUN`qy e~%QL'ELl >P(q4Z!- /hT1d r|+bֵkmc֖h-+.h=^w p1gA?ڐ1Z8T8><_P?oA#WH |2$O@¬p;7?01GO /JH|/A/ByB|~R͆+qT@qZ XI$hʣmp@oU+Ƙ/CPQdex|Ġi Sd hS5^jt&j_$M@J!,@!"IBU%ST  aH`j@,X'ZL 6{%@ M[Ǥ*6mhJaTllM/# RBeYJU$+^F @%P Ҥigp <*IF+_[wl2<}e릊bXD4\QP\\۔W_9 nrw(kMo m]ۙYtpfé,ufCEMI S-sGFSo%y_ ?r- Cw +6?Dk,Pyȓ`WnSÚa^?h7_<V7c['9܍2;ﳽfcɶ֍ĚaJ 3_$>ʴ \pcǛَ͇@ (U4xAaRk\F#[H:۶e?>W: KKe?rg]Utӹ+B/'3t2Cs'3~< s" ;+JoW ~8ܥſ~>MCM@?Nz[MA`ՂvО۾  6鵭?b4N[F{|0dˑ#q]!fw| j`KD ²au%DCe79ɉg[NŦ^dL-H*uVLTUυ.DVOW U" * (ꏪ+qBX|/#/MGc> w&z#}f\Q5U  *|1ePyS(?Q^|̋z@ @xtm(&@֣FxrV6`sWy: "*f*@.l9Yc0(4EiBKxtDn3YHRRrp[I",2i$YYGd9l*"IGC鐙+Y<,US]!AFm?Kٝ"KyT~$s%3KfI(Rlrd@"K&I,HQRq 2=Ρ0| .$1) *赊ʗmv"x[[2?'3+aP8QYTQw*^4zhDh8^ը=cuݟ-XtYm˺y+׵'|М0՘1ݔ;^_דڙy5s6_v3|W{] Bƃ1xF8Xe[ǎi.(\dv"toE۫E/K=Ã,ɸC1"n5'r6?K%J?|{"?N{X0!_"csڋuE*#>6%{ߒl _.tQA_e}s;zmĿla:~8;To`k2#붱sB-W^vui?X ػzSVB]m`Fy=D^ ƱȔ IbF G΄NTM5 (AP?W@؆Yx7x(kQE GЉ"InY2ڿ{fzE~\p% >Bs з y8Iq ܇;Q:\!2H=1Ad8J[H?U0iq~9ƅ@W]~zA0ϋ;OwpgDۀp@T9D$SpjHZz0ćCF]0Uqk$)ʬM$0(<QŋQBRaR18?C0^(ˬBi"E&5TMCOg h,lEӔI+/X.6r &WE7J3%utJ1%)P@d$G ""k%Tlc̔`E`: a#sȠG{)w+Utt65f D'ٟx/RY՚.nZq;ϳkoY}?K=Wjɚܘq.Wzlns6M{&9KzQD(L'/$ y\ڹLIIȐSLVVdR# M  AESw#L*i\k;:i4{n23h;\>bE!8n`XL ^x_h0s_{-؏7 7o(Eϻq_MD >| ԅt*m}i~৓9MА2QQӒ,la4'z& y?z>LBoW!f_9]k_>5G}lxW:E2tLJ]!BMol;iӇ;骫Fw {cuV56:bn1W9j.DJ$+@~M?&$}"HN-b"$KP:D\laY#KKʱT,àɂO&1t@#J HөTYCJS!TY]OqhPIXX ; >&OQa W`~[GKWd8TeMERO0(T]C%r)*TU!Iq/iFbQ8 ,J[HY&}lQKRB)#Dn*ؒ89F$b qDx ɣsrH $C_CIʨ{vw؍'Ev'FKs#?2kl>6|4=v%^ Kw,u/-u溿.tlCoyEC.C%aC }%q9I^"33"ٸ7Hד({8DiWˆ~ǒ>㯰t?L >Vx!,Viēv?7^ }6<7ota:˒Iq0hIJHi)_I.(ȷ{P4p(ŮFDQ=7Ř.ozn8o\p{BwA(;dxY4^F@EoJ} &x$i!n1IBשýCwMECewϋ>y]}] l EY_g?i'6}jLA:YIl|'_O hNT7S^7>|.u~,廣ɟ>G_l<,>0ϯ3pcW`h9GꞳsp2ݶ ۵whv/N=㾥|Fa166S>Suj)أG'"sUKH?Yp31rx@ԳQ ꇢ+z}rotGԏOԌX #uTbEIQyGw(xCBO h驉3-bE@}sW!x'|(?gB B%_TnTMNP|iY$zXH-XW j#+QXU9v@` pfP'+㳾HS٤!15z"sDh""4hd-CKb",%1[$F Rb[wIXRxVpVB073vA@hXHK`Cp]xUTIL{1SɞHoo\sw ^tumk(wҮpH2yu憵gފsl}}v]};rObPmOe%1|UobmKx, mU̇Z+Vs2f"v4vNdv/v}}!u5+; ;No*٨VYˎXo Kr3ݼ'v'{  =TMF-XcHh(m8)H9&!*I?|2&p@d%Aѝ`MKV W ENWODL5|$dQu]KB!&RO;?BXv3W?P Zԕz1Z@Xx < @MHnYL9}>3_S@P7[=F ls@^?<꽟kߌ( #@ 4 ? O`h!gfz rGH`,A 4 XϠF5 rdWrتt 4* @'S($*TQܧ`ss(U~1 Zت/ 2X(<@ a~J$)a9JP`PCD*ͤsI؊GmI,%S9Ĉ&) &< H+#Ӌ IS Ȍ 3J2t0$"%@0%?FDjKaSED@v=wHaEȓ$nXsn.M8kD8S9Uq0~N4ullx`2c =Pbah K;.n[\Yϩuoi7]7|uoEt}#vύhKf7.xuqϭb &rבx71+&9>@OHsp>TB) ~^T~ 7VL2lAIH(җCPizdT[t~@٬AR$զjmNmm|g[g}v E_s<| fo䞞Knk{Н'-g;/z%^DNϲ]ebVy|ױ]>[W4`1AdTg"=ߕsKY_Wž(y]:MYlߩdd7a/|_<h݉-o/"UGy^"mM XBtw3ۮyhZUYd$WgEgw_{pVvf3}k*LV6o=^`f>+'XAn_~!h㘑Su/Dؖ,VXӟQx'vzѝI'2.܈.Il-,o/hC4R1T6V50 W8#b3F\DW|笀wuFPa x"U>'| ABUezP51wN'j%y쏠j`M0`L'ub h현P*J*pFgQZAa 2P*`5| (J(,@P `1+|: :UǁTiTy @$0(HP4 hT.$ABSgƉ!HE@8U@_@&kP2d,!>[>DRPU)P;\KW-S)Eʡ32|~:ARԒriF]Lcc; x*5@:H a$T)r&*"2 l6tnp!Df|)-,DPlq`*>IqòR|ivg`Z8\<\_4X[0ZW0V6r'l#Jͥ5\kihM\U6KnO|3ܸ3z8kW"ly{i[y7Bލ3?D3NbΟ,By'u3nG'w!Le>Lqȓ6Mx(A#MBYu]wBu%Uu9\=pΈ:8AȻG?)h<64oA?Շю{H00ʣ. 4" U"+k3\c%" ,@B  Z`()1.g#u`L^j4 ȇШl4@ u}6[VU!@Z@,18z`\ Y# !{t 2F YAa(vb3Yt]JVS1y I&LU\PRd+yj*/','QŲ \v*!bsR &\De(q$b X/E"'(Iip4iP#R%'"*Y2 ~-LT.'JJgD|vfvoǩ霤1Q]aPyxC`u~ehuxYXnXg'- ᜯ :Mw3d~צk\a egm]v_;d6gYcpe5]}v5咓@A[xow[CwOqx^!q|2/4vd6z*b=z78h=l5x(;jeO+^ƗܷfV\RM([rHl]Uf U!l%/yFz5I;e7ߍq~P(ArΏB "4%$$5_Jhh''Ǧ^H^^L>s-9@t+$zP֭P@A_Qw~OA/p"}z#<>6\U_y,8}1oO@DC]@h 0fb*gP'`=pG@y@QsODh E+z!kUCrLjdJaiC Lk|.Wbsml^(NNf 3or(0iH]!֒5Ƥ+(rHELeir)*d9>=OGF-DNnP⫬e"+[c'1T*X(d@)DC' Ɍ_^& /1 "-@CrЈ**8ḲdN=^Ce J}]>} !݉a]IaRҦzsG'+3Q}+.ZB,u]K៽.h~EBJC/|aBDttCi֏ YM6st脅xʣmL͔/8wCwN4[s^L5HZȲo<y͋tG3_uF,îgֱ0)noCgíƢlF{t4mrkl47T,Gl_<) 0*u(D@s|&cG1bޛ.{n9hx}`G65Zn\`K9ҀK#d`p&[A-@1x%?hY^CsHV(Eil|ݳ*w'b;2$h }em* &d\Mκ}=!jb;IE]Ѣ!;y/pltpgbfQ:,_;Lx u:0]"꽟Qp+81/?&h0>. sϼʠ_I(LAjl M%?GKC0Rǣ6P4 gbӿ}(+@!HD nTϡ`Q c8e/h;Ѐ  @sa/5P>K!ka^UMi:m YWrYtm0],'-ɐJKQL~ MZF!l΢k0X'äG9NG*U[JJiIGjD &Cb(}IѸ|5T/Tv2KDIä R_~/E'KQ2hn2jrj5STF &3ɔˋ.t MKɈOk.hl/OJ-؞_qu嚥]tm}h}۬MT~om'^k,/Eٶmvd`p䤋y7wEo4Fo DWm%zݤ^i՝𔽼GbZj֛;ϟ WTK՜KR{,Y~(!gAe}ɦ[( x_J9Қ|ϗ.=*.rK?8iX`?#K>hSOKI8etC>mlYi=T}xeSƍWlUۭ}+6.Yw-M}&=;zw'N8)y5b;j7j;b7M0MNIv[H^Ly|?j*t{πp)>Blc]S|c][\psg%}Q Org<d, }Qxdd}lxP`)XO;;{"-O;n>lƸAwKب'ذ*iqܶ7Elg``a)^Z'EB#edR23繿 ,Kj.ݣ)deJ/$X:FQŠnw'e^0R4\:[TG :*#"*+Gj3QE 3QbAހސް7pဋ81 >@kP^pfn PX_ wO#G @OУ/CP%0ި \#i|wu%;ς/J^4zFQCs@pK.GY 4g4 w~P4,v.3 h=>p*n3 O&h3i،tZA\mD ZIjJ-TP  t2N%DQN%q8L5UƄ,:92dm&s%b/ՂS_&"Qd,eE+IʓcH*rTUYӗRYZLCǘUVZї KMs$Tdpeyr`l2&8@/ ҋ),8i`dF.MRTF<.aN IJ'јB&@+,UUt^ U@c3X@YTZ嗙Lf7E?&dďg & [ ;k5‘:DY@'SwLTpݰ볶'ڬ#j`Z\4ڬ:j_oӮK>{ Ṳ̈̀XH3Kx)soUgdN42b|,j4He]7MC.EK3)Ju~$Jth`,HLӴ~2Ѷ/ ϭW6w E<w<#WXWc%d},߄N$YH(6/_NtbqBb邠yślM CsD)y%M#Kaؔ3Sr:Ro' GF*Ɠ#=3otbV:Z0]:w.y~)~@d\ ҋl .a1;%JHX8PF/\Z1IK}6fo8j'/΁BP.?DdP. _MJx  ov7jRB*RD-hd~@?x4{ NY FZ qhl6db>; F"SȲ4,R+ PtʢS,"6] s!h`@@ضH GOb3* 2 A&)p0|*q lckRTtȪX:]W$'@d?`@5rJ2$F Y-uaB $0 T-H#QcIh fQdJ$FeHSbl MĮp+i2:)bs l},AJ@I~OsEqS@w}vh1g2q(˚sv/KL覥-_7q ]wvFlm6tࡣn GWVxa"-3Iftd|ȃ^@HWq+f /F<ў U Vy8Ye;³$ΠQ2ӑj ߔZ%oɓ\)-P!KiiR cK=cÓ뉶VBC3y.BXnƑ:}]W)jn]J)X9ZNJ]͋^]mQܣW[lMUt[w5_ph! 4SF#F98"88*0Bnzzuo7پ3nZmi]]{}L:l0*{8Ω7Ҧ7f n6mQ܋˾@({/;o(ӻ!{qݝo踥35]vnc9Og^&2]&%K0iLW,/zkMÊӲΦf_.LN-Mt=4+/?a&r$l'k, +(,OV׌TVႠ+c:A#hF(D@Y\ 2}G>>[QP;ϵӃD߂o#@tP8|.gpUTT[O֥mK[e?6^LH4 w/j͙Sn^Pifb[A{o[5Cp$/!UWJ:2CRJ)TNVNTO/#=axv\P?#hn Gp@U_KAȋ-;JLZ@5$bE\w?㔃tI`v'nKi>W a:+N``!>HA Bg| }&EmBd?";Nx_QRR(PX?IZI[ AuXt}}~Y9+3t&D*Ө@h"@" RD4Jb3ilLP˫)(rAL6f،X , 4$OZƥKr*,)nnt ;8\q{n#9r]'-/;;5vqe5wYo9g˾F M,XoE/iJ7y*IO&w`#PwpX+ʒ-ƚ͇ Br/v9?Z,_u{Q2um|IXYh]2_Rt"[Zb*:Mӂe|IujQyS ^I,L - , . kXQ)lq ةG@~C)xT F Pu9(@!1J#Մ4*x2EtE))4 gAߎԉWQ΢.Uo?7\۾dwq뒃'96xwO.O|dQw/wiy۩!Gfwtn컋/H6.!s}ăoڛ=ħ?ogrئm!vm1n ߐ{bc{BI)Gf9>w#zuۗ:|!)[&v:lSL2.'9-)oLtcb@meoa[,-vߜ]FeAҍOtHݡd: p\Wr~._3J@B@Q?jD1 F/[{ q!#x/*} qO7hCb0"} I"L{Im<E!@;IpZ@˻s^ pW\ek E],=x+z(7-Bc"l<6:Ơҹc m͙ F\ʔrW&L=K:# Q"B)uC 8VMVjI[EpeSB2$Oy_SEp{V+uEk)HMkXˈ4Dz*4DJhg="яޮξ6FkΕ*W?n/_9Cc N T_W:aDwnd<X"?Y:jicl{ay7jfvkҋk(1=hhbzE(XhϽfGRm _&T* n>F#5Mh8{w/0 gR[s\Vՙ+E w5?Io{en׃RaJf+8ȹ01RqgL{Sz *T#tmSA}HN;PL.6Ȼ_,7}( UН}3;$️¨ (9#e2@Zjh7aH"|(/&ȥn/&A'j8  / !H c5aLe@"(\`)Ch†H=D ?iMtgT}\$ոY4Jm8H`f4j7f7A&6R45; 6zSV4hR)d8-jG Zm-Ԫ֚ Z*ITEPIij N3i`\X +V6|oGo˽Tt\G 7V?h)jλn x}r_g#__ׅeϏ}/ufޙœq-إI߻,yDS:SJg,^e_,=[}c8Y*5_KU_ )L/2 $ 6V}6//^/ߩ6Zޫw.9I08jvξz'[I0jI"4Q2M,߽Iuܚ 95W2_<]Twwi'v ,f~7r?;rrŐwQA8"tcɆ'*;jA-jB!QLP' @BQXVKoVTDpUe$ULH f[гG`@򛠼߻,=@? @Hp"BrN hfa94\pw@ @bnF]({b*W  @& 63Z*j8M Eh)(hAϘPO/xo%ޜ80#KJŸ<1 IY;wuQ4,7b;2N M&f+V(V5kEC Х37SB޶^BF ![X:Xs " "Z(:f YVڜJ&J+b)9?.ՙrjZ\1ZR* !ݫzN[+ݕ`zi  ,(Qu#ds<"E p|0yY3{H H.C@~c$ Zn_u}\Hpe^i,]{ N;ЀPpdH?Q)_iU8։ @37,ʳu- ܭ,ʲ,S1h@ /TPjQѴWghD~d j c ۀtٕ8[F0KݟMQY,SVc!(iUD@Q֐l*"SRa58^'0 }3$1;H8R(xLxV8>gxޮ\<1(ȸkf܋;kc+vwnT\aT_l-W%[RSPÜ,P#ݨ+%O{@#-у/|K>2K -`QT%U3uLFO*[  ZHr\ @CG;N}=%j(M( Eh >>@rrM:4kt)^WU*kN BDXG҄p4 6P8A`/ItA@4"pn(I#K EwH`8 \eK$5i !Q:HO=|Γb0 ECہOq4kò&3 )gNJyvŢM9@-sNQLӝzh*)zMW&z~|=)4& B𭌶0YOqK@re4WL2 <ň"t{l\4T5BpPIURIVT(:h੍bNOWq:[Koީ:>$]É+KM?Eu,a p;ip~ɝɾ;YIrƿg8exn]'f-?~ǵUͺj\̝t(dքiceM43~+1UMr6(=1NjyFh[-nS慆#,H#T$$h-><ϫ5$AIA1PP'eo~ {ke}sn,=lBE-z\ X+$~ZE$!/P|Qۏ<\o .?2TF -](8kbT@(ѿE! <,[jG'rWnBY4և9jAQ&EAh }p>= rCr4@?\N$0r` ֎&}?~6PQjQ(ǸPFE aHB9=D ")Lƍ iːG}hii_f `OriqR?iғ&[E08M$:SJ*ZF4bΦSk%V`(h1|F&F[I7Kc@d@r=fĕXp4߆9.s'bY\oW|R`h1~Z{.Sbfv͈Hbj3+T @V4$jg׿W_n]ܾ0gX%]W,káv /ף&%o#@CX TBLnC\UW.0rk Ҍ&NSBă L(X!W鄠?| /C |M3`){Mi9V' F IH!eRv,N(1E)ҴYiGG 3R6c%K+uـ^d1Q\ *2_+U@5Ǟ@/glV3a`R 8`P @ X!tRS`YC : F%mjXIJuN3LBRuu9~l+_s>f{؝k!A{q$uu7~) Rs$C }{iҾCϊ4%go{K̎;DK[:AQݜ˜.ӝ_fey৅>ڞHx6}`=IpVQ*7"8(K̎X92boI[) U 5C}zW2qmGCW#^6jy굕O:_4FSnyj֙w~޲ۋ?EO{ʖ|rh B!<0cI׊&Q0AjE#1gR1Vjӻ +)|Aw՟^^u~Ɨu7Kz^>j$~+͑P/rA^PIQ M{ɽ&QpP^ ׁ-6x ¨+9ܗ9tj0 1UgU䋆!>BA(0㢧%P;p@0GK͠0<`y)l۪?{P_O eXi8CN*5QS$IH8sT ֮ælݶIi󕲎z^dz%t\E5@(YzHK?ɁBIbEr(̠|¢*"}!eCMAOPIw=FJo~NS H#8J`'xT0BkBu`} &]!ll&%ILH`YhROH ZRjIA6P39 G$JBi}o(strt`m?na4vY{fur-Եzڸѭ֚llxhQoZ$9C' ^.M4QR(F!@c20,+0|ARCЬ+U R5BT%jjc_dVf\)<MIxrG-:Vj+>\ͣ;cN|}q#Y1IL; 음@[R&ujwqbyCd^0Vማّח=9?Lq$eEϊ?-ʝNV|dŕ֤[5ݒ1gVMP3dcOUN`cOZ<ʸ~ f||j_f͚pJPaHNO )[+FCQax 5"gXP`nQAMOJ:?,8B)բ*g,JS\ D |HM"E2R~F4:\AG$q H^: $~ur4Zf,)!4G݊/Xl妗( ef:}2qjO ƽ(k >t[D-XEd;dl+&4`b*ar1 !h2D=&tz@7xD= 8+4@@= })  x@e4@kqdJx(2kz=e@m8ͲRm7Quۭe7ZJe)HL'\˞/'~] Vß }8Ժ_:`gw߻ rxh+!hK{f©d .zh4{G~UEI )>+ܻ:DdS(hk{@fm0h\MɈ8m e'Rjոo?_^8׼j+^hscIp[ &o}>D^ҩ's߭up챌+F|聥ߜSƸ I\YT?4~dd!ޅI~)BKGE .MϦQ0fi:407Eۅ|A;6'%/ڵ,kQGL{w[kGے7$vĸv oJaJC,Kx;+TwG,s$U>rghsحs6,ص,Lƒe ^?ざ %z NE jW⬆FZ3H`:h鮰rᜓ'-mi6>X0yqE]ϥds P"7wQ uy1ys(dDH7^J6;'5z]F 4s$b*Sf4)!u(5?qҲIiߤ(C 0bܑV蠦Bn$-Φi.O_٬hVQߡ7uͭa=%omjgv4pAt/#3.oURݔz% PGWBkh  O\]TYjUZe zHej >(N1YZ0d6&s>ű7+W^Y{"}B_mAǧ`Oʍ|};= ~}"o~}({_Lo:=|h߾mk 5Ɩmcfؓ9xs#/HgK]q"^}LJ׍TShҤ( ݀A #8h1@zas$0 ӨԴa@̅3~?|3Wr A3L[znڧnϹ\;N;ߪrr#挻zyǥUF_>\˓7L ) Q^&MS=ԭ>ٷ$ :1$(';==eaXG. P=%Yܕ% ]/ vzMW:nw_r7eAKY;+Z=_ 8C Phj)erϑZoߔ@;bQXnY\sa|9Ak:\@T@2ˢv4 X͆p "-e{U1o7 @") .:CZᘧh0[qWZU$S :3yij'WZ_yFmI v=V'O+l:YA>zWԗ >RjvͰ=8`О)>#\;Kp22jwJf\uaciWVMbdD~9aä- lt!p8Kih;NkqNj!v8NTOϯ??۟?{b}e?];Q⧝yzS ?NfF\5Ư*\"9) UF4& jRZ9ĩyl`ϲa~BIj)#\ qbHQ*WZSn̒v nCiyQyhE+8 DfOD2NBjxړ%i68*'3\Sx0ĥehz];)ѻf?>gg߶iQ#7><>λ<@Ķyoe;R8LŌ o,X+x\Srk7k -;Į+y&5{c4s^zޯ sgȧ/f%>ٟqx=c{Ɔ[noSbp廊F/{4Dv; 2t+zUR35tQ̍dNL~oc˾/z3u-y>E»3Oe?ba)G+,nwΉOr- cz&~y #.ScZu_$Z&DV ˉ6mAPiAh3gNy'G9Ҹ4ۑLEj HP8!Uapn!Ft,oE =3l( PQCrӣ!2%|ÄP8>"`І!>q{f_4`z;ESO^X=tg͟pxI3gP1JM*R~nw.i͜r׿|?xr붛R0IWZјZ1҂n3 t:;TEó :/fK&rP 2)TN]似~N V2;mzY㣢l iZÝޗ?qO zuݑtڮu, HK/d7XeG9-7ݼ]z#7[9-v*.*Sh=f#Лoj;dP^ePRHn+AMQF]@#~ I ׄ-Og(@/7#y®Hn >}ЃD M^c!d'10L$($112@@Kv@ 3Q#D<')  -a/{p>jCZ;2-3knL`jFb3ԌD (q"zF[vj( ׉:Z;XUMhd!OIZ.<|P)0 N)b^ 4<Z&+U ~ |(om7 '4DE{*9I+nVM5qC[}Gz!ef\ߔdxü' nzTp8ngLa?>$U̗%Zo9wqbw-eXۨwbi;\BAb1QCxmM8P[Caf{/w몟eGex v%er5P~&Fnh6}ø:r8k)gWɊfiqvӭ̆Nrz"e \OFcrc% '{9)BuiTFwH.&ˠr;+7ȍKR[ʼ #84R@\F:@| @"T~(}@% @B "Fh\-}Isi7 ¢@h'$agNxmP  DFǓ: Jܖ&hڃf=>2Q,% EeKht&׹SMy mƘ:j *Evo5SZւH~^M0\3Ӛ v)z^NJZ8vSb +b |LK1rLV.8ӬMzNHYdkH䀖8m -4@Nn~;DBJVܭ.{޾nMycc:od^?ɯ`|;-15>k;NJ+-mć'FZNB/DYױ X[qMZ"wCm`Ϛ {PDžwJPSצDAu.H:|dWLKܷ ֪f>oXp&owf]||cfo-S}w @~ΰ j E5mᨶH \8+p3$]EΤPj̠lVFJPzƍݺ?Y;gn[*,~l+eV^ wsndt_辴Β[-r>Yf-[t,Bm7;oy MUNT@׈Qi|/YM?#Y6dyS7> G4Tl# w2ҁC@H4}yO$r61T MՖQ"y+<GD\T!>T`8M/xiXAo [4497<ѧZAn#(VnU)ռBT\36z --ɭsJp Uxm7v~Fߡa{];z(xU(bc*փ XXk2r֥^ P5G*WP*uRӁ-j{^1^~WוI1ιa|ƽ4ݥHGbymC#=Cuǧ7Į!k#|BW2:bÜao̹֚{ZKΌ!V ;)u4Wj4pI%E<%4󂵚8}`_?? ήYP3ciM~ޖ-iKګz?\7jkRNw62cd8wII3F X:igy5{$ ú6=v봘6o61lBdݘHו#B8, t^2x(QO'haF!1FQ 1FҮFӾρ?e¨F:Qfdgl~N9!K])`[]j{Pt{]O!(zп{̑(@Eo.heCkQYXޜBpy:A[CH ʽIJ!fRwo͑HMA7 F~G+Л2Cei?;IZ`KMd B MnNpf@ SL4cKRnqҕ$=jgXҕPr)0 $x̨ŋ.l<3zXs@;nܦqFj4m ެmmƘ&L) Ym @kH +T,B2]͊]$C9c7!s JJMT|%P< XVUZL2I, H"*hHcJ ]$iq-k'욯W jM k`vgI?ZSQmɅi;|Os\^¸'q7_ `_ڞKā,;5eGM(Q%!>u#7̟td陆Sۊ=f1PaP+| SFH53_Tj) AKEzJ(9_~Ƿ.ޜ;'niP:SEk{]+>|M󯯜pcwFw:w©'?`fb ?lXׄDމ ؞NYCv͌<9bmS{GmeiMcC*xv-K["3-}tW$'x{:1Zb2F!<FLAX2D>g.T'Bhe0a5Ǔ]f\= =9y"]%m0sTP6O XP/@a~;S6M??iϜ= OMxd;煟zr5S/&?c1յSO,UJRa(`pJTF# >E (m ЃVwvBq^C35NP( wr҄izѰiU=Zn=}p䳁6=0f^d=Xr/qvǣfI\l]WiջDwd}#/^VC~y/ʱE77e dp|| ѪKY5FVH>$SRChbΛ>'eJ@DP.)u`^Cjm3ua9`ԅ#p)klv0o {X‚nKmGiB@FIZ[8. ۨ5680Q;I=]`lg-+;uf/?֣wjt{0a5ml5,aj%)DR Xb+/@ɉ}uL8 >V߆spi+jqHMj"-Nf!4J<[2c1M/_K q8g3FJ"m] M$imɠ=sm׮2 [۽>ɶy7^ob:񯷢_=Q 9tx/I<>ޕQP>/B/KJ0yNjdOr5 P@Hoo5ȑb@Ա<'8&:Fر:j )7ؽ4cg֐6}ڐSON ڒ 확uJ[RΕ*|$/x~2C=<뷗wϟ=}qן~c + hHBñjN17P^F': p%G9!wHOIq֊6*/ $ û ɹSvqBa.>*rÃYW[?)R@[,l 5굾4ZBQX'|P.XuRvaq4Kj@ $u4mREґe=x6Qi=|"Ff_mWvセyݮk[=4C…AT r@HA`{oj%u*r:P+5$*)Ko@MChiZTTeNXZ i~ /#8Kɱl1YDjКEr*M%B(±r_"*qk(^뀜(4je-z}ºG`g U7+V?+Jc{_Nzx pC^Jz5땁g'p{ƹuvTӤc|&0?*6;ޏg BxҫqAE*J(0agsXh'HV!U8Q@ '(cXB'i'b=|>//ng[l[6*Da_nr9/}1.O8>bʧ*w8;Hnr!؜mVia)>#=L :5bˤSό3=v胳7ψ17~Sj9 fƷ M qY[[mi4;!Q`FMډn]]  b0 Ql Fƪ8$-6@F:ldt/l|?`u=#w͈8!&ler̮c:Fv%G651Gwxʙ=;XЋ)F{*'n݌w.0sKG6>Ï{Ͽ}BAMaiMڊ"߁o0ڙ6 TO z`#Ej%;hambMThQ4`("ekJO4x|r#zIϋU[?YZw sIC>_}% ^ehsLNm`rϾKVvu@LsaG 6$zJC}TJ k]Dh8{8p̠D, ! E 2t'^DE>{FU. G? "Dj-&D *iѸ$-H5[ qGBcDIL`R/(-MԘVкȻse178OW8w캶klTvΦᕢU5Qn0Hskc -[`-H ZMp ',"nNi{UM#HX0s1 I84 p%:%x,$|j IC58_4l \ 5axkðVQCn/ZSHqnחZܟ^ǿvyzC'f'[FN 91zgĆYrF woBiy5(ZEF2 . 9chb`z~gpBQQ4MHJCS@)9Rׯ՗_veO>P7YՋ7}؝ioƋv.P4TycNKNCY-K=_BqrH{Wm"NSHpz&5' Ubbl`g(eyLvf?6m(;ۡfch8ccTHD#FK٩i G$=@-t4,r:gi}Ճ][ .C- ADź! l?.bSϖL=rٕS-y`䕲*'\9ʉzоbs~7g_ɳϾI( z 0-Kąx3C jAg ݆ZdMTE^?o ,kF~:( @"y<uKf˫(Q Q =z wU+mӢ X$PڟgL0>n&1v((!`X-)L4"GˢdUzuкFz36`վs{.ovi滻wۺҞ lY:R fknZkҁVLjtI2?ĈP;f'YE9^AAk(?=@+Ƣ6:B & ZN1L B Dc (ԲT%@uf=|CB*Y#hhZqGG\aEٓ;k.6`wۙF2Ios#)ʠw8lcgJ.=dZwApVZI D #zJkdf^o34E_zF4`EX>`SuEj FOjbA_Soܗ?}8LaPr/KoU-~XiӢ;US/zٲI ƾ|2'd~ʉQ ?Q0xƨ]6O 7?Ğ1~I'm mR؎){SM|`Н3Q3 0ئ4ҹ"Ƴ,ƻxg^{nۊ 4v' ٛfCA;68$&x^ *4#Mx#>F`S9,[n-ɐeW^]bo <9hSb-H'@ ݑs&oһ9͟px";E)'KR.\>^͌{kg^Z5̪I{3?~#;/?/>{~w** ( xuzKC?Y0$}0 K,x\'Z=F B Őc* <8'1W`**BmiAE*6 2Vzqˋν_ኺ3 J;ov_U:qF˽Mwr%{t'W#Gr_yS !ɭ(d%-/lp٦gN ˡR"RxTֿ>忺($/FG&aGTb@#bDCT)ݓsQ ([?-!P @'WS.B[thl5#CCЄR& j5Dz6ZQpVT7ٸʡz׶m;{sMTSnkV0ivv;0^밉o ݄(zRb+}-#r\IHESζ`H3- zy]?D8i VRn`\RPi PR\hrRkrp5@WR4|h߿zRh,Efb~Qm!Rg,.xPur·fEmJU+|S2S?v/vvpį&=_?Bavяe̓TB-*p*  Z;`eRW.% O! Rj׏\B Y HIȳYKV>&w}O_>xǣhݛfRBP[Z>%ݮz&? Sg?r`ܑ̉gKF-I>lQ[{hA A];GIskߘS#{G {vԘ듼k=BlVzN ,["539#iy`6S\S! 0f8\'dz 6fON1c.B!Ű\c_S^`S76sT[DBkF%N ]lS3ع}D`OMmӢ?DѨWMSzmNN=U7o >~wG?}/wJ1b0 ~@U  +[~ E +^o(F !@,+Q#FI]0 'Қ8b)]и+z)ቹStnڹnW}3g[7(yZÊ/kSyWO>@̌/Qӎ h<4nByTE9 /Orb|ʭ/QA. 9#oEeg2+j/!J@<9C9^y  uL=B xD-rjCRy;D<_gEh(]ZQj6Rr4a#Aj]iK k0Ypv0`ߖ;]ơ}{ώ+7xpMU3L]Slkpإw$Gmi#.ZjKwNT,p@hn5@͵S\uRu[`uVbv r:"Qw`!)cC{G+MoN[u w@C׺WDpۙg&̛pp© 'K/L~psnVϸjͦ%zrOГ~׿~~|g5AF..v+ Ai ݥr>E58#\&p^|-6 "VhE#z H+4 H"!1Ff ZM5fH^>siȫ~rǮgkzn^-jRzMdlX={Z ȋGQaY@B. ˆZF5PM\ B)(s߬ դ0܌*_0Aٞ7[HPjA$7H/"E࿛u? / +`*Gta'Le0l' N)k0s9e{;7uo{nzyS;Yj[mƢNmۮ'`͇(Nּ"@)r[-`jLI3^KkױzI[p`: "Dm8@kqz U+j XL)ZT.•41 ^M3H~XcM|#!4l5ňI}K 4kRw*c摾[D}g/Sɒ33Zf&&) WBPjLm` 9R(鏗) :}Z6s4 N HiJgB:((,8A': R wk_}Ͽ˯٫?_`[1ţ9 0PV]7kg=k[xuE#צ>{./☭Ɍ77᭹q'F[4tߌV,&o4iR֩#:{-ӇK\\Xj_ PW#-b s]4`טĥjgpKua74ә.,?Si{yG>ô&cM0Xu]6 >5j̘s {M;F5%x@4<}s/y,-Twǜ)pv3+ǝ.vuʹs.Tθױnޕm>y/~>|ؼTt#2̡@\4`:;:9<p# G6JӜ ~0eE }@UP P 6NFAh(`.uN"l)o:״Yޏ;|| AFK -+G2pjԑܭѻ,rɟ%KIm'R52hᾼCX6tsI$; |"@P BHMK \E$]~A2K/uzQ26 )q7xdhQmMD#'Օrj|oq7]{b[u;7^8mϊE=4a 6xn…ma.jD4ђjj If(b!nGE>Z("/ cl1-$5H<5odnB0B1So*c] #JbK_X/ h l_R<ijgdaf'3d!잙kFb0@]¶Lw#KOgOzkѰo/Vz%kqg'jXz9;򾼾_O~o?xϾG__:v k3)p?[52C?8 JłwO/R#%b uPe#J[ ?|@ʈ6F[#ρ `69IEcFx٨YWڛ4$cf%w~xEìG+:g&=PyŖ+~%o"2Bjx4%Ox!fK w"jX@)Jo*{&Kd]qGRIxG]0ڏA(;?$3\l@aGw@'Av6!,x) >-D T1X]ylPYc,%L;uu<~K{<=n~gK8aowն 2.ٟra֥s%&nutc[hq;oV0_^JAkQx4PkHVD3˵qBE5Zĸ^Jۦa I-֚<)IjOR* e:W琚b* O|([M @k 5Q2iLE4j0 NJE/~v+o5V_s™G'xM2M4+- [[1Ƥcp:5b A2*WD Ir@cJZZHl V8I,h?/gdI5!ENC0P1HiA5^3b֍/>?ǟLJ:gˊO0뀮wsVz^Z vg s_5/>?rS+F|"3ݓCώ=8# N̊?3!&n7ֿ3gQlqb)ђ´  w΍v/N+T"klA@e!.$d_e`P\aǗ vYk* wYYgW3<9ƿkhXG\@}{s·M?'$4}Z#k7 iM 8!%:,Rь wtCiW ;Q<ҔE#\5o)ܘޟ9ّ??ի?>o}{ma2QJ i$fI ZD(jj >p57H&a ~08A%)NJۇP9A,aFd)Y`1tfgt8x&{[/GAbSÖG_BO+Jr9OWU֗@r,f[: +ɹ{YM @ uF2ˡoFY^>{sWF}tjrP 9P`K Q !T ;D7(,:AR~k}Γ"I{Ko)8ҴIQ+z0+E8Д=9$ a q-OhJҖ4I•f^>oo ӿ[o{Ё[^ݶu>V`C+wה(ڲhQoҨv7V\?:LMM#VZ+l-eXʭUj2LUAl5pBǷBǵ3,X#I6Ts:^J2^>^rA2gc E(bZrhX2Π,*2!kf 0H٤Tx'a&U@M=y~[եt}U RSCu+4@ p`4opR'pK IhIM2+\;qlT()`o@Y8$V 2ڧwϿ럿ן>{w{tQFάP ?:QG浪qO&__?}}_Տs&­p-4@K]XQo21RVia "9 u5 OiR?*CeG: gZa@Qz1⸎ Z&bC7s5cRh Q)$L(XVm˞_UWWe=OrMY-`ZyV·}OvhE˅ +W%) ej.m2hpղiɆgonVkY-Yਛ>(yr;ޅRRfNz;dw2;M$w?ChG <$N^9Bb>h- 7 Pۏڍ~yX@,?Hgݴ$ -@ABQ9OG0VemԨ$!)=H㾴 4F"E@,ߟVېȐ[kJvםqnw}r={oi|`ǺܾW-^[xX]աm[I[nakMg ) `˭*\[QR3>NVJ#_"SBŵ,X'w|;#6Y|꿕D*\TR\%l%6S/db霓y SN>bľ4hZ[,Lkf4@g셀`Z$gn Б<ҷclhפu# #%G,, ( .X§y@Y^yEAnU15CWFگq(1TGX~ǘGv'xnJ;%zψ={xo~?OO~; qƨEFk5P@\-z0}0"IKO4mARt VP(B|x>:,>Eaq\e46` ;q-Eᡝh 1 sDsSr 'a?$3uluy;+.}|'vNf>_}~ݕ%7\Wn[J%m9m7 !>%{fI;&XB{}#>x<.L]r[ hɁpXx ݀z#o%0D=r*e{P?G/g%Txsߤ/CS+?D4 jYFZawv#HAچM4iiBѨ%AADss˝1}Oc[Omi> ?r΁w:ݭ/_iMt6>oN^n';m88fm6] DQr5Wcb5SHVs: m'…Qs`JG IͭSJV#YbRQij2.fldQtNJb2BJISu8'IAM4Szj\2:qɱP?>^%XU*0R6+0@`!H.6IW͢pKe[h "t\)Y fkINO 5iÛyᳯ>엯oGOMY +,'z{5c7Lz4KNO7w?lȮ!Ӈ[l8>a\oC glܑ2ʯ%9~_ek~MQGET% ( v p1,2GfxϷv) ]&ʧaXPᾍ#}xyv[dWl%9oPL<03nӣ^8`ߜ3u 2}H-öifDdf>=c揺T2R٘>nޡʹ*y~}OW?~g-?> OT(V@sp)W4ֲ(z- J@/XF A~+[e2`pqf@ *Trp`gv v,-7xтvQ^ ܏tƲk]_T-iVv^AEaF˝-|5k#Z -5aJ7>.h%m7$莇@hհ%s ?H/|R | P` ѺKis,ȋe.#SԒ5!d9 @t* ˒AF|=r %r g|hBz<Y'g6-4AA8S MْL`4H)6Rm7gy~{]=+|{#o{yǶ3;;Onn:[VKٮڜMo^HGޖ- +V[@ f^FwxuMN4]EэW&0Z U#U1Mw60~\߯mԈ`}J_#n }]mVi5ܐ5@1@GU"%i 7J9OZd*|5^$SkU:5W+:k j%:%VXIr%$S&ZGF ?TJ@TA:fGpS2@WzJ&0EY'x<}I h$,%Q4񇇲P;pDAҠ$ ?Vᭇ/~?ׯ{}t±):`OnL[=5~eɳk+y"{ⱬ,|&Iyki 8gGm3u[ ^t`^ČL ЖМz@$ҵ&)x0VF9G9]=$ ')͜Z[_?4qxhcB[}ZE6ƺw ٓ;sнS#F vlI≴a {Lp m3vΌ%-?78Ne}w=sϏZ6D;Uӏe}ٛyyނ:>:ח7}~__}'@'|c/W*J4*BJ j >GЏ1<+5c4A,iD` 1FePZTmA;(JOZ#L:,/R$m𪜎[r1p<υfInj2@~ϣa]fM;\t伣mdAA!T@'H$N^.ݦpO4@e@ s/,^@ ?I`=13Q "2L y$qaؔꕗvo3ۛix[nqk{_غvUn)۷>ogM֚mk u}lGӍUU-e;ʹM{HNRQk:ԪnJb@9Svt^Ч1>L׍:0]Zפ6i92[C ge ?}89ZZZċJQQ EFhUqu r֊QJm!o ,9& A*+N󌭍VdVEJƈZ%+0zksKčPYc"'gC p#M9(MGC pׂ4pg^oL {ɫO~o|So)Jc6Ji4fY7ɟu/}us>}Ւwl;+Ɲ+xpEg8,hsɛ'soω?8#j=#͍;tˇerlbvN';.9rdIe W&^|ls?VrbUs?o^~ݧ@|ۍWC) K BEy*j@ytQR/Hs{и?[$|&C{$,;gLC y&700-kmbL "eks!5z2ۚa ؀:K*]p-|UI溳jfH࿗xvoYÍm$Ѿ(ay :oe_u+vZ~  g8^FU  )`eK%ܾ'Q5dJeLG^ԑ'CA) D h$Bs$DeDQ;CoRC(VBZ*R_?h$;^˳/1|_yKbiڙIŒi MQ |i+A7gȭ\ۿ얶}uw]y`Cv+7wf[w9RVCum_WpXoә;z>l͚c'јv*}`A2q$QM0FBkڠmlH&}+´ݸMŴ)9Lhjٹ5LAQA1sUS2KT&WJڊhz ֮m|1] H( *IX( v'"vA{yֳ{g@fZ(2;z=H^ ku7: 793Xګ41bI55eF`' % [Ou2F@.(tvQ$r^*JF3Tc"?(Fz>@0\ # 0J 6k >xePT\Yt"CA <5׵ {=-*u5cNMxhT :ydl#blzlL# v ; mƄZ{D9]׳F{-h亨&^3j1ϜF~3#|yN q_y3B\#SxϏ ZUgADQ!k.m }UĸZ[^?Zoz35 %{ ~]BDTVCw[s ٭mMj{pHaї;:I&:1F635uyTWV>WW{^\e/J?ڻcVj+e*)jA3MUa$&>ZB{) % @X< Br5?"c( X(OE#rJ,ZY'7 o9=Iii5[tNJa e>RO3Gڵh {_]c\t˗9:7ƀcM&l=2LZ8*: `XGQGLx ;rF}1pk`ت` 9Bq ޅ{1@@/4fj`7ŏ^ LB5?$a8K74*Y!s&PI&(v (Y,qK Lj H V""J&iJ#}vۖ;v"}MKf&Y{nwj z!kө-NmO>u l%rO^9-wkN=eNӔCmoX3dlJbT;6%AJ*P:bʸHiX-kVȵD)!NuXHB/>t`Ph []8Oo`c[N>iƤ%Y-ww_+󡬢XW.)@d'h`h̎@r b=`.PG{Hx2(\vvCYG8ZHGʪӹKǠpSRj,&lQA#SZ 6vf+=j9 lmzin%oOI2~1+Iix5(0+61TM Uloď@D&mz&?|Q-@Uo^߻;WFx -9R4ʟnxikm\6pAc⏍;=ȡM;>9@ޠ'ǶȰUjO? УaNm; fg˛z͎pZغV[. ] HbgEzh5K$G MncƄS[EuHY MJk+-cuysOv:|dHtn67ɎnaimjݳaN{,_Hבq5:0$f7;6) fu875SzE,~qӼ7x~ŏzWVZ,~[X ؙ&-#n@ R <@eqo!&S?^*,%vb,$FG R)+*B8K5(FtpMr'ĺ9hM*g¨i bZ%aJx;(#-8:_Rvw@V[/>jٯN\}})A&Rܜoy>6ވU7'{4iNZ`lQkHt F|0cWL|>pa 8^3|Wa'gx/,.<Hx ?/gg?Ə|j> pY4z{VLܷv΁-ft6{-6&7#{- f֐k0lft+mĉ f`D1MÒ˔,BJd(hUJ:Q^V/ Y 'TCdTd).JNtNZ3h2y2ЬkTԫjTieT%7V^a l46v Ʋ%4(kVR_Q\Iz6+EF09GGG2@ħ\kP;;!78[Fv&oM*@#OyVr\݂{JJ*|-{ߏ+^= lHN&CZhq{ܚ!W 6۩q59:4:|[qfRɱ-vۿNmM=7i] \wo{G3rK::Im8kuBpr۰U-C- \ެfGϮ;-mz}wgG, X"6dqCu-ojsn_{}Kߝlm[{}3mmk]^DZx:Sv n|laqlӻAq9=~o7>>&¸3cl• iU}|pV]Eyqw^#/?wo/XAmD 4yS>4}}a`\n( DG$eY݈^l2,k]AZg(t]qd0(Aё iZQf#k50ɢvs1XgbMT,}v^IֵuLEc]΢M#IkM&>ٛ_OH~81єuO'>xgщp˨kS7 [M=BoX5i:>!@\:)яwi}ǖ|/i1|` 7|~M>a SC >d$ xr IPn@C!E"'A$HDDB-M^LO)XR(E"[qty+n?=sYɧ2孿|h}n'̎'vܾ ,SY3u L;~+L=Lnƅ-G/Ȟ:6Ca\s=9;Tmz~Y(SMQXGf0r6IFdI!1[E2'k"n nBxv`x큩d2߾(Ε*T~kiiӇ?]=sX#(ݴ# ouw^KxQ{K\ڬN6?<1GG6Ę懆o}slXSC;ȠZ7[a{m䴾c,2?ou|.l\{nDa> !9 ,kYHbk[4Oo[?uwtֶnF0uオȶV~joO-֮N92:fv7!Q{Fgjs(A>IRHTv~fBsfS qFF_㾬Gu7O}~zË_=\Z7ߖ.}B/߽/xv牟֬1;)&e_H:^XO@ZG /`@ _K}4`n KwD R(; iAkp6\Zط4FXhUZ5 W]Oy(8h]jgJf:DZʘ @\4 l4msRbXYvibOMy4a1+^qwRYH{Y/&m7:C;.hS7=8 1% Dw!Y -сcy `7EG>^,[:cNBusy3#oyDX=`(1\(:kվ\ P-9j)^dƒ<{Uj/,rLUȴBqMA-'2nKJ=7ml+pٝ:m-nZtb#&\=u9ןܛqz_=;H?WG?ԩFQjpphv0t%p/W͖糆*yP] maU,utX[^欮7t-ւnw4ͱLJ5Ti#cm-ܸCc׷Mḧgġ1MkϲXfl0+hVg~Z˚MswMBխ,h3zz ܮY33;]N;:mo.ucSNiq{Ga{D5ѽWϯܾ=61{5ݿQ@ћ6|z7?VT(~UeI})1O%/ϗKk*H)X;[1$+| yA;[{bc/Űa4b@DQ& Bs3ʬ183%cX2cBnVhP>[!t3ƬMZ*Aú>*SFZK =ZG Ĝ+o-J;wݝIw&,ڤU.5vŽIǯ?rٍ+nNM}[Fqi`/%zC($(P-:fC؞R,M}@X8a|JODpf(W. ZTHX!%55s墳6ٚZ|SY)m"Xypۗټd+'_9qҬ[W۝vr2~2k빌3[?ZZ0w#"dlŤ%%2ҏsBPm"`+ uLQY/V$jDVm^.a3iDa82MPaVM"akؚl z[XhٛmjJ[JVC)rX5eb[LnDdo_ӆ JV+m%L._b/Ք `?!eD$l3?`2͑KS JG,F1 0*@|  !A4V`uУɛn_{ZxSqٷe謹T=a? PCQ5C?GV&v7σ}Hsjs]֧F68ev:1-SF7:01AчׯQF|d|Zۀx_06t5κA;;Fjӵ6uwݡkgueg<6ĺl6Xaw=Ȉ8vt-lWݽ#3-*{}0Uv`X鉭NkqbD^#2&vvY77/T<{PUś"@wޕ){^?|Q:/cP`ˊi\AFϰZZO;IÃտGt]@ J(S7~Qa5Ӵÿ#@(UZ4 Qh@ vf'J*j?6PMɄlA!rTS3*C Л ut?ėuj?akw>It~IˮwaVޙxoJʃkN_pCW ;~lk ? 15 2P"ov08}1鏱?Es~HO6Fݟ>GG %kj+^[VLP.Oߨ  @,v$^ +`hB2RcZebh-!% '푵|ͩ@7x*+5?/ $KyOgI9+TmKl}4,ԄsSb_ܾ=vO\gUsCwS6uW4\<8Uu6]&nZF;6X 6uvtHoký2Zloն.^Ik9/#!$mց[[gv׻!"Fh{[:ljMf΃%h ?aQf>K~^<>ޏOos%^(/*oۊo+<~PM՛hwBpZYg:b 1nta 80i j1^@ X<H/h`4U`V`XD+ Jwʕ% "Jg:jph T NQ9eҙUy>b@7vsU[$| Όs7ޞƄ5'|e\ &ޜUcn{,C Ƥ\TxK!pD #[sc|b!p7րy >W/ a|j mQWb _&qNf| k%NRg$ @&!} PzE5EAe|R :5Ogmoە#t g6$Zud[0Tʴs^غ|K.{p}9uȓn;wG>Y@]WRB;ZeaJ?S+Ikq)VIVz!@;k%W`tR'A Tmh=-!E>.a&f62^QK!bPRbPƁypm'J G#Pr!ũj'8+TRRIKhQT3pǹkx| c:  ;|a.'F$O<ł{>t{ϟVӻUxݣ߷=عnx]ZH-ܚ~bPOosij+[ܜgGƝsyl}d8=4܈8 o=}"uWm;$Z㶾Su7vHm_ou`6\6ruY =vSfsl껽Kݽwvwo̱r:۵-[.h[B67_kw6u>2<6GF?*om]k廾oF B2oudx %}迣wWoVaQpϞTy[mջE %/K(U [AmfHyZA:KpMV9-@o'` w|o8:@Ij6K$`:gc4RjT4isӪB G(I[Cʬ8D#W >lprq49Sbʬ1[:2HEDbIґKL غH(o3Lʞri;Kw[6dxk|oNZ8`z[LK 7}˽wo7j͑)` #c=B?%EyƦGӨ5+`R?V3ph + аd̯NnȥzcZU\Fv2 DaUv,a/ R5B=\얛r֎s6]zq泻6X6W?ܮ̕{v.?cmwni Xsaˇ" (HE+UrF|'N3:{F[C> >.!'v\/ p!_B=15aσ!EHf83^-[sʓ7޾uw_?տxOAݿ NLRi׍, >6dW:h?13Z"fe$]}t 9ؿanphwlTC6HGCq6sEx5񾛺_&dS׆'ܲnjDn(V! xϮo]볽smmmr_!-wo|o68 Chf 1 @9v ١IgZoXC2{FOoW0۳^VאC@]We}۲&';͓?yJޕ-)y]\URO^*x~evoQ]n Buz0hvz@yD9NLQ&ǁq  Bj3j@j{{(sU` 5^A)5T U3z0j-&GUjA2E SZFwM.J%5f³j,DUj6nF c2;98`$T5xwl8aECuoE9/fm#SIq7F9&8&mǧr^vRo_uu 7QiO)wQxtLP؟D8v@s,&!O E炡A P)}UZje RQE-Z n,bՌԱ6ȆY@@d!JL))E!3Y+jEYIffطS޺6\s٬s9[θg};nqck9do<=ض3;֞ڞ|4}-Iir3{;Z.\}Jswzr #v݅~L,d,i}գޱEjPP2Kѱ0R;J* mV1&cԁM#)0Xjg/ɕpp4-5h-^NDU^F7:")_6[ZooU;}"ۿ -N;鉱m7u Ml]k]砵 9ю zel˙q קu5ձz77{-=_.ws٫/ޕ))y[ }Mѻe/JyEūҟC(j)-R{m^s5_B) [^Ȑpy2_V^KPd8^[ a+#VkAdB'h 2䠹Jh(Y*v1Oys6q ?gp6{㉌'2e;35~>g]e;t{.޿zA߿~rv\[4؜ i:S02Vj; UFd_*5kkn? @/I~_jZTSP䲠X+h@pS-&{[!\1:U0iᦫ`÷[׈|&!y9E:؉Aɽ8 F`>8<|Cd|, IHI @P̞=/^s?w(Q oVWEc:1b@6GD_t/CC舘}#Gzph {5 m&=<"~রy`pa;al&VrBкa+JnSgAmB7m>2}v wKmQ;{# mCz6:>١ A[㹵U`N@Z;ZlĀppp-?$.o`1n-4ߖ>uv oݽbr47$ޗ&vxhP^V8ϷҪ~w/ŏ+m7o_.~O%KW.Ż ¥RB 0(d2..@'E\r2pp }D[d\1Vo cRc; .@Xp(rp p ap| Y+V4\ @* j+K9 -륢)] (@(Mk":5վ皱,Yw3%eR֫;_pw㓮MX[0|!)wFnx8jaF>ȔG O;"Ψ$ҪzتM$H;pjʫCA7Ou!\<6Ĕ_ugc/sQG!k[xgda+/S3V~<@&A@v)'JJH}YiVfY @!w .< %mILRNi_#=iwo +{3 m{ù]dZi 6X •ܭR/[ܹpŋw/_wGnȻ+ vwqa0$cbĊP;oZd"LF0&r I<*\SpSb]^N.#Z\ ǁ$T* J{w.aU?T[[{l p Ïwv@C17';j>vM0 0/uG]Zb3WԨJe<=[<}SuK-ǧٴk\\0S5/Ԛy#.k?6Ƭ.ZspjlQMsWXn; 56&o@ԞQ9M͝;[oyS-Wn4:O8`]ԄœuutX3;u_^ jC--%6}DXPÃNisqj3;oKZ[%$u'~禴;5QߘkO_{y2ۓT,.{"@@J^R3Q %P)$Dc>D߷`F{;)I>` YX`\Ӡh4 EUߑ{Dc2(@+#` G`4Gz@+@h )AШ`(:> @*jUG͸ Ze(eTZާ$TmsV7zB+Fڷ`}Sv?O~:{ )!K.\ `GY|~+#S l5bm&Cmz8q=ҭz ]smhke0!nOXs d|zS]|Z %p18~F@#S::Pgd~_bYo%墤hNXѵt E+݁r',@4*-OJVh߻qe;z>sMNvnʾu`4}+m;j޶ۇs .<~ΙcϿ}p@wNz|=S_^뚵5uP1yմԬъ-`(ez(dJZ*TRJ" LZ=nnSVT{bd01M$a*=MST1w`0^}^ }$|# U~4X Z /|`L YJ|0+ HE\Omǁ[_ܼkw>|+>VTS=/yM'wua;z懘oziLKc[LptpImNkvldci[0pAICh7 MeQk.tE-6[ܮֶ ["tsKzwN7;zo:ݥ^NǺiM3oo5>`K m-rE a-'u:9~Q6)dGzk٫3oX֧̄Ƿ>Ab=s|űmo>=o/WV(WEE%}U.Oh%0AW^?U;J($` -$X $PLRF/NaL #ĥb .N`~kt% ;=2+M/ d { Vޅ@hp)g/Pgz8[wFc|,`>TME^5kA+*sGk:w3dqssRِb]e欽9$](.+thk. M6n9/i(u7G2:pKø'ߘ|cbʟpϗt-x ~=%~=>pà@@y@-B+rWb0. *]` n\$Y!sJL2A)'FX )!\E׮#ZV^sSp~w:@?ż uЎ[{qpuAK _ڽ ̽ \ɿ{=w?޳oQ!aQ2e{g֚ -WRRFK (FJϋkԠ q#ЕPVNSRBǯ r%yuZ|`dH`UXxb;a~hCFi6t^#>H, >`=3?>B}"m ;|PQJ@ H@B"=-Cr֯/w݇nPp/}+X%=yn!^)t\ n~adڟ`n;䘦&;lȜ>@Fpt֧Ʒ;1͡aqz5٭>@b37Z&ހ[{7+:u^C2{5[{jaslGXEfu9Mq-jlJMn {5>20@C@H=lL#|ms ^;.dž5x̞ǴmM 7Zy`ѹܟ~{~˫'U\YRR񮴬][|S}ѻe%(E})#ɄrLp=Vd@v+ }ROi0›|.)_ πe89y1+@d28e6=M&TF`X/k{ GtÕ&F`x1=^ ЀJ+ F)w42Ep)]I` q4Kv"ثPTə@c|X!'Ztt7ݞ|msSOH&c ROǬ1fC!#RP8a)/ cj c`")0,8*?Nf􆀲5f_O"#ь;ú*7S\@V,8Q '()BHۚ`p)gI`pp}.foD#@?ZPp0ơ[=}޹Sw#+/ܺ= rlmlvXHW)EZ^KR%RXP *T*{l1͂R^LRjր F-Ýf $)ݯf5<,Znѽaau>7ه}0JS3AӇpauaF ``$8wޞ?KQ>|1sI~,Lx!RZ1+u<<'%{'7޻vɭǠV.UVY?WWz򩍣L>0*Ii칷[䙁qǶ=}wt;36k:,9i@*Ƶ>966&wӯ@vַЦ!kj/\, uoƮ$tn}ϕ1A;z4]9.m>263 v}=t)?]((2kd6D696Lx 7w; j{е<Ǹnu~nLc#Z^]͂ Ftۗ=O*^|/OX`ȿV/Fh /S$ZAz@&h0_$)!@pT,,b?8@jrTv p@3pFIxnҔ/KᶷaWvЌ8"br@s!3Q5RAdd܍Ug} *?ІRJF vgAY7IsJ %m':hٙ^YvߚkLYw{"7TI׆'_tyHk.H:nc!ȘF$]xaTř'A j2~$z0͔{#]qgGbp:J\OvP )0i?Ci0dG Df.!J?*%w4Xgy:>>`Hi!k|sH\6j3;ka^^V(}gw޿~G(}[qi?TUP]Oo\ߑL7)k3[?(N%KpiJµ87!vǹH7McZ`WMrz7Ro[뤶 % =1! cxzp\PNQx,+.{N@ߘ=!~ȬNٝ k$l٦vuwui۫84<>w@̶nR NqKr#5)+5<=Ñ#H)+ȯyO}yKۏ%ůEq{_T)xUkzF3z@@eF&+ `: 1 @&}Y(ş J"EZ™ 'ht , /^ ٠#pvPk<}B2 a>j1xѤsc)AU98Z<Ġ&NZN&Z19묎jE6ܝ>ZVUbh1S^j*8 mjC#S1]G/z{EF'_Sޙts\DR0"U%_z}Q׆&^KSb`r'Z|I0NOa.[yLK4d%R# 15^ N d@I G%֓  /di7 P_UqeL9LL>r6{]|.g7d>u3oە] }pgm$_hO;osy _?֩cwNuݳ.^q{/:R*2T@XkHe"F`IYRfJIsHS[?q94& %4_$ZhGRw0 ^(VbLWd2,ɂ?< >=rNgkIr~Z$/p& ᏏAteϏ{? @!! siRX(RX& Pw ?z <G_߾総?|(y]˳7EtYU/Jm q[dǷ;?yvu8=ѡhoMj@Zsݴv-|׵ ҭX =Һ4Xo}@`MXذʦ6\o`BZz;:5><[ԁM3Zgw[u[nٶ{7ߧMOl? r5ҽ^K: &E:7y_a&ީ.RA~ꢗVx_Oe*JA[Z]ū ^yq7_:jH`oX(1|1jB9(\bM|e^_ `=쳌N6}h+ nX.[\05rHC @$f0 h^~> 꿣@q]`@gk=<F/VQ8^㨢MV1 kޢ fwTeMoILjvPXծnFo'PbNo0Ƹn@ʬ ){z8kՉ+ 19 wn j8LR0:p0"dҕ 54wI=+Rd KOԠ`I7:oDy8k.ۤQ(<7X7҅ V> s,VTXBBJZAPJ!QB֦8{ k/J=My`q}϶9闳oϼu0bSמݹ|{\;Sp47Oy_ZPxEMDOJ PY 1( au2=EKՌL+Ik(YSh $A`/Tẹo/JE6B66v?yt''`?5l0*DŽQǚ[,Şؒլ~p  ?ًM3o>pw'Ƅ z^g 36ld: dIq2W,hfOx,4>)w[Jǻҟ?|\~һsjjqPu˚ɱ`䵯pr-LK4qO80 CClw`}#nyhXё-8:%X[wRos#VȕhuHbДa^]{IX ˢkcdv&{z49/.s9ꃦZuSZ@ ў)7 Z0CZჺY0-m|4;c]ᢺNl{a@Ӌ[juj11 7F@fЃCrz%t`| h`c#[o`Mwi]pJԶ+|9Lm_/c.$6ju`,j?Ǹ*6xk"}6k}vX[:@[vt hW, ۽QV00z6>406'Ǵ=:*b6tY'%/1{k [ga =D̩羺 ^wߕ,.xS\?U|(x_Tu)p7dײOwj!ة$ XVqϰnN#1ah` (C|3v9ɈH.WsU`:bx̃`X.VM.~=*?=,B@0=ЀQF ?RRRr6dA+"](,fMjW m8988 z -Ud^ӆTD'ִi뫠,1u{Ɇ;KM5wko[?z5It.Ȱ^c7~?9#C>8t8Hеa+_io3Cjh?CF(Xw0T*?5IQҞ@\87qa)[`15! $c F$t- oCYijdYl~=wc#_9D|(xVգ{_:/<|RɜҪ5BPĠwp093J T.eD͊UAJFDÈ(4Q0v2 o%`ɲ'~v $ܠǒ7)gљG/= 쪆܁ jFĀ!,+l I9W tRGgG:YBaob`(pL'WOeXdէJ^<{~ ~gyٗ/?>#U/}Y**Jޔ~,*\\GufZ4#È}׏ucls@G?h8d|A bB V$V(UX9Ȍ08"F0jܹ|k ),wTA!FЎ(ToAg2|ILk@τ:0]EGxs4h-`uWZLnd3<ԌV  |Q `uҀqhƍZάҍUz1roRUb嵔boQP3DnZ/z☙Wl`}Uǯ8zqMJ=y-[6eIkK!>B_lM IӺ#Wtp]A`1x!ˮł]GYfˑz/SRLְZ:XCP 72)^NN Ɂ.4h%i2KĹw\MtVҹ/# 삼L 뻶^ݝUwwwv<'j) SvVM8K8@(׀~$+8ݟUibHBʸ8J`:L]>`OۋJ>?Gbο+tF3ҟ\LBN©|6(@]SE?_փIz ,{;)+-*EԥKVV(zQ=~߾|s߫|{Gv. wbQT@Vz|-sfϖ$oѱv r51{Se᎛ZM*8eЖX>2O30nkNak,#YЦsC6ZYƾP0Y[Yiﮝ)*+R7̅xÎwa'Nm˜^a| Y40̀whџe6b0TjXJ P$qH}c5`i 0B0]`B@t:[I%w`FL,qWYAn:8]p蜜LnKtN*'UuѰ.* D&*z" EjA?67L;H;UC{(ZTʓ;QL=,FHiE:y sR,|ݛNY#,YOf<He#">=D>,'8˞ā-~)A+H| K1TUe<`.Xm :/f> Ŭ!^gD'%` ϼXiɴH`><}qiٛ2 _s?ŋO%EW_}﫫.)w,n&@fLJGԨ':5ل#z{zG?_g&=1`lS-vZZyz=˲Zk;CXռ&&8m,*`I.1;Fokչ愰M&M_{{h1>49-CC[lkڅw ѩzq >UquvWC'ʹo^(*QxgNx_Z^YZVhC{2 PK}EM[BO)mcX+֙ >Aqwv#8CWE%J 1XdB\9`p4up 0`0^"cyh%L$O ]8i)+,ގ/ IK;Ѥ!&WJ@0=WRj1jFՁhf!ujS˺UnzEjV#lVX6H-z &-.,vDsf\ڌkV^xkƧS_p=g)fmJM +5SK(%pVku`` ;*w-QZJRa)-׊Ʌv_Ec6Kݴp+eWwܝ{˺sȅ]O(p䮝4dR@"(K5EpBP@[VPFdMMmMNcԫ ݀ M/cx&}ȈLx)u?-ϸ&V+w̼$y$M\,#aN1Ahʃ>*B`"[x.co 0 p[[j[H 1D@k)g @W]TmT{SYy(z?`ϟ''#^0!qZ1cÃÏ 2Q8=!f_{Gc(~=f5pᴨ cB809ymBܷkeM-$E%Fyl$愐)1>i侵uvt?>4`fO?g`ӌv5 YS{M\Z>.,;y/̡‹{z-r@" e woJ8ׄbW|9s OVC N*)@j 4dQ~`a|% 0 g/pJ j3p2ȁL;`'> Q`S ܇ !,e'X[YtiTCb0{Irrqp 1)ߨwdpZŠwkЕd:TNjA:t¬,ƪU Z.SDz5j0Z 0 :HشǨML~9+ 6<.8;b6PQ#b=Zr ?H ]˒f(:(=uQ*uvJև}RqWaSB*NdGM*;ZkuKS΁p`}츑y{o >s)-ꅲvd^)kF5FQ/7Zg[0~ w~V >JD]C3U (B34`5 ?C,w0x >Muz Zh2b; %:1̷0/`7A|G~܇0| G>Z?`>e¿$/P&Y6sJ&H=Z];}W~(-*/zV>}Iѿ?~}U*?+X7"̫vbEn@g6pyrscI(W;6,Ȑ`SZ4w uK@ ?uIVA c4]oji&ˣu["l]ɱ)Mk/o45yfv#`Y}j-g_{s iudh+ CZe5 vo[$FmҪZLͦm]:?~%o?},]ϕ￾o>WUTVW+yMmyEI՛G/ Ah,] zis)H#D H! !fh-" >D7  ƈY@SNj4;ٝaL` O]@pL@L V@,T!K ޅ*?:B= Ur3r"*usVfv5K-U:nN΁FBbtv𳚼93?giIXJ2,I6հ& UtINF'E.HdF_e H<r8ӹ׸7?\.$'V2{xPR܃G~8;hۺǰ,"IlհBBPydR&dd*dz;xPj`h=7DA`05J[ `۲i糒.N:sթs7^;Ƒ7ܿ^ݷK{֥6_+w1jhbhHVbD4#TEz,Jt=^"@*?#gI{gЩ:< .k(UM])ԅ]S bN*єUS13#UJ pv\ [{9/ Gw?V c #?*|G ~/01ZJm C˷п c^b/v@$6v1MNOR/KyY͗eoVP^UWc={E<&01-?31mH"MuE:֬h֭ar=֛U߿A:8<ϲ3WF&% Z1/ز@Ê-CW5t<,T.a <9PNj16Nk u>f2A-Xֵ?3>ݺPqJ[ϟ~.-ˇ`o_ W\Z=&6zT+WKl$US%Mao'DOL/Xc>(\ dWԬa8hV v"Rq > D"Pw , H J⍅|7$ bB'VxKDj8o21ls0$Jh=Mjw V7ѳ8@G,4&$͌A =mEQbVG'^Oƨ6ҌCUu2vJ/W $VF; 536=1 3bwB BGWN* kI&͢7ꂝ#EbW =2O6-'A 8֪9NA*w5,]"V6,'J;53C˭^޵Rv=mG36]='+;]GZ%|Nct8c3Ri2:P QP5EX5`od|&耪zh4#b}ۈL |o~"5tDso变ǁ‹8h [ Vn|oN X|/Õpb~''_~"\zp%p0A``q0:PC$$CE6bL /K'OUV͗򪲢wxYYQ⪏e?W}3 ڷo_}}72;Û綾rk䢟۫171/<+䌸{~^ Soxss#orfbSbgl\/m0Ӵ:Mj[ f7[ۡlaD-0ozAY kWgy&I-W5 X{Rq]Ӡq]8puC484UnϘn{4ٵΖ> q[$Ăqwzy9^aՋT\ׇ ?AO@}˿_BXT@/{ j"FJUziM!CBVJx4@&“/Ek@Jh|Q7x{ 5xrέh.Ikp}HF!q͟).}bf4aZC쀐sjM&8^JZ8 kd: k+Ű[IRq:@d-)Ua/A ;\c5yY jځQDEYAh\r#3.O.NHA LE6jbp+u0ܜXMҫf kNNQ={]txᆂ&.8yu5F/5|+o]Y0pI2h-U7&ƀeWAq"0(wF1|UŜ];Vٹ[}@'EWy+eN er(>Ǭ Ѳ~*IƁq#@"wdbPn+ j:԰O okȺ?έ7yoi"ڪXQB4h w[LwA(fO΁C2y\{%Yas u޷ |#|7t`9Gɛnޱnw1? =?ğeg+T>HTp3iAC"l[WkXI:@q8doZ^Qeś7%a]T^]YɇA=!߿~ߪX\]6%:@װM.>m.,jsaaSӚ}~T[c[?5ñ '8 H800@y[ [[g|]e3Jhu\2ӜH;G$&JiY5͂7[wqǜ`湵+xurx㺞m3:9vu4@`r\^>SzG^},.XQ׊J}B8_}(kJ0Pٹ'"( 6&[V  <8CӈŻSEo1Ed @?OR 0hap3pR-ЀdEbh5I-Us\ `xbzj``',Ɛam1yb0 PYp } N);Y| !@pKR?q@Oѹ;ht`0}׀șHI1`lh\V'$(Rf5U4pl4ʤ^v.CxXXS^JtlF?Rxg]?(}V_&@;Do]]2bQI&1k veN۸p@fYGKM0[SPH= p…PΔh֧| ("UCtڵ=Ywco錔'rsz:Qcd;TK&RFQj/c8l#TzTmHծ?@ s?AQt[usW`S##cQ.wbPOMx O|LDSnP=0a-|σ1r ùg6LZ8Bn``࿀!%u$uJ$c21nҲeUT\^URPRTϠҒO??VYeWzwj!^&u9+`kZ~rBSc,l{avQ1ǵ,\&Ʒ;:Q 'F>>Qm oW89u-32GZ5ߕ碘\:ǜH5״YhS,Bg9,oXkQ׼A֙u][=Яѝ ?:ʼn-5lW{G-02V, 9[œoW}-/\YKՇן >;р>?窯5Q'g['Y_t {FT* mSLD|>bH,AG @,QݞAgUz,M &Vgp^Ha,,%ٔjq@p\IlV3>c@Wr3qHTVgdj3 ZӳVQZl:c}!p~vv^҅)',0vѥ + '$^|nT╱ׇ%]5W& L*Ddؚ[@#n>X]H\@`L-D8 gn?mIS;( OEyjX}Wh*,NwF`("Q.1R ⪓h .A+WB{55cm\Y{!+ vou|ϙm7|0{s 5WmzFO|\/CPm659 zx0Þ>qSVrYX``2jǶ bXQOG h4Lv}'2h=/ПܞI!WX#&p~?ބ"\*[lVx<"\E5cHߧ@ ALd'm$ Bby?򣲨CI@ PZ߾(Z?~oo?_T*gݠCgɞP&7̟kmp[)ãQ>Kbֶ 鶩SĶviu }Dz/42p^]E>W6Yᶭms۝&S ~hn6x ݺ\r(Ǐ>}o'*?@? 8#;0V(m%x$H#,6 1ykL/MC®!'5Fs? 7řTpQ8V\ՙ؇Mx/?@%$DX *FRZ S+&|urvW.ɤ`ְ~ 6nk v\voVMJ:l運Y?,51, _p8_|F'9@F*\ٳB֎ugrX]]E})JjB ?JCߜDHIEh\nSӢKhqkfp@Rpӻ+>GzEAkտ>Vս귏ݿet6Mܮֽ<&ڤ^ܼ`N{K[:ւ'u8=LzyrqA%OmE]믎XohAq ԛ^{j|mQ~1֮M׷ku{-9M–6h[DzcݣkpxPAL%ܾ{7k Z9-wV-T'@Xտ ?|Oޖ/P^\ ǯF ;Jgjn8XϗN)҃ ( o02{8a @!`M40AM>G&!1`T@ L%*鱋Ƅ ua`z\c'֝,>ƮYAhF^빏M ($:1h )`au btc.줢a1x '[˨m6N'񵕅ʝfm1|ɹˮ]soWx`V2lՍ+I=0`&(X[ٱ/%q!ìY-2hjZMI=2O5CHvf9qk7JLɭ-b - bU}E4圔ܵnr:w8"8qN ռϷm/|"7-a|J9$I/Z!&nrFq;cS  z{ B tH@B&%j:hWW>/}A&XFO~ jHY?[_DZq[SC G5vP;SLxß$-\QόN8;5 9#vjSNus5]6$UFcypKw6<{^MSC:'eItMIA]r{781 ,Wȑ gw=:Uvؔz=8']QWV|٣o[Y?@_9ϏϤ,_ _𡜤NUXO_iTT 该 š ? ?ɾJ 砛3[FF'It0 . bt40Y6`1K0 zVgGhA1 >X[Bs&@,fcS 3sљ64B9ka @p1:~?  Ǡ@.&)#Ouf`qj,zltk)NZKI Dc&7N,+{D>E׋3jN޼ק%Yzm;SRI5$ C]@ 9]qtڕǵYi j]Oy32Z*?j֓'"si,32SɤbȄzmfSg߹Rʫ{RnLߓvn_Ƶ VZA+@(5fYl~-}h>vP@Ɔhi DGccTM&`+1ҋ$~Z>bTC|Mt܄_/z|_i % M:83;2!_LSH1Fx 6:Dk P0h-2,\Vp69?qV<+.Qݧe/ǯտ~V/rhd/~6AUOeUϯ?ȗ]>xzF42&G]v/Ld0pnuqbcC[dW{6Lk|zBq ,vgV5X`F1)-CE&>"i`RSR(cq=/"/{cbHk[Oh?:R׳ c}{z_W߿4V"&/~~/@ `)Ty=AJjuKl5A v[.H8 p= oe@,7=8yncAbP`Nfph. V `4} *`jqv a6{bhAǵ@0ᨔe"@ g c7R  YoǨ& aXe6ydt;wZlgݪsAW)t |TAׅ"k"ZOؾ${NZpkbC_'-E';8ӹ{mN3(t OQ'4*/h;*efKX58)\traFA8y=IsIDAT?wOﮘ5]$X(%UNJ&דD28hp?q@n̠c.&`HÃnR\n D8HX;|_Uaa}>N*9a>p ;Tx#ol?氛?݀9hBD90G =?rv, T:Zf ,dV6~ĄVs @鳒gťϋ?rz_?+qG*}HU|I}7 Ry}wɭt./y}ـޝ?c^&:~lt룣vjgakL u٧]TƔuW'dIk[omXEx/YU{QtIAOݧQqצ01gle!>h ^Em:M7z]Q_~ _/珤`Ӈ`*WyQł tV{AMH*;1vƹqh0>œq&=`MqV G,1,Y W+ZL la}* S^T1+p`?pB!<&lSCp/`&SN1Ɗ}nO[^9cƨ/:v) \#b\MLDR Ze6_:jݯNL8`~qmO&s"$W-N|`x<@Vƛ: opmݚ s]w}z>G0fAV6Yo^aۅgt82ى7;?1Mwm۬h*{q?]7~?_տ~W}A,߾~Q  nv%6RqMQo{sްn~̘/GЏbx{2t`<3AQGy  ЀTd@lv5j3N _wد?2C z S\k '/8,ls@ J,vb%VcS/Q =GO;`SJ)\*^sR?];~ޱf]_@; 8~Dc-.j(hii<\GF /U"=*:r`7 f8<ӫ\C?# ʥ} b1L<0NG+|"`>;ŢQ|T;,l\C&.Ɇ<13mXprJ'&IJU4Tݞt\d;['Ͱ)_7d̓c>4nۃ3xpR myoچӗϘj/O2`4<OU<ڬ+ gߣdmdgt&?roOX؍ ]ſ=b2J,Q_Ty: 0 t%v  0C@$O4dK3Y\2 $/}=Q _"z Mcʦ8Gy +~&a)z!d|@??f$#2D<e¡Dz"ΊG%&ۅ_vC?r;~y7;i߷{+/}Ĭ4颎_熧[߸ywovfBuCX5#̍~?Q}roç?3=wՀ)5s>u鬛07/Yi_N./n?_}3n͂Wk甫ywu1]zQ͖ k=P[h?р7$@^xxo]a!֤ @ A-Mp~=UaЀlze|XZnJ2Y|b~$zt([">Ȁsp XAaunA8AN`/Uz@?@?A:ٞS%0`-3Og<>}l`v$vTXJƙ1FhgLE*BTħzZ$jwן-]ĵsrS5y ߽/Kn#~^l?uxSp]߸opA|ן=x_u`t~77WZ4UͅM{, }D+H Mǎ5mQܱE9R'"^nE[\ r~91'~!%d@f2F|/=K>Ñd$qVv8RH4#?؇s?tCgxI)b>?9a42LϪne- 4(LI.QMBIi]kJmsdD~vx&٫θ fb\:QUjWŃYpZaƅD(wF#$[TWRj8}e&S/;h^C{}Fn q[ N@AKY`7п->ᝉkgjԏ_8'oA?lS UyisY(hv w9$G%6f-ma)UË>e#~򰵳_Xք\*We!Oݸ9X(X!wc `+h+\BķY u.vrS CIj=r_.%&?x*!&@ p,@2xP; '|u @0Ox 9A֤~Cd-bo~w|j/w~SS8ZZ'NB*ih?Qhl>Z8~tOf=_n}En{.Xȥ[|c[lÀ[~׏s˸+߶a̽N}x{֏r>tWؿ9w{qn[e\53^y77篟yds7|ꇯYwSUfS~\aXX]AGN4ޛq͵r 'prskDH555o?ZSȱ{MGL@(ibIs37oEF%p<;ZSFG>\> laF"X ]88VOYՔ.(ō .DOOءn&bI+k-ԑT-~S8$M *8v A`)_چe_f:{T'3EިV,FArzF@`cHgR;P$ 礓|;`nʿv%S*O0x,?=F(7ko!@j$lh?\__8^RwBB힥>ٹu\E71=k[8Cn>7Y2趥o]=~ͺ|՟>p틗=.n/ϻ%_ 9/9SOkWZ5]y_?2/.JhÞP8ܬ- ㏫_Ҿj]7Xh=Tرڣ T_~w wxmCqo +U@qr0.6+«5A b_.gֆ2 $؆B3lwz*Dyp֕(3dU`=}:#_JCcia,uV2 $ GX *&?8uZij;W.?ss?d:jpq W~1P:)WDNDhy*C1Z2gRy+zf~x~6<4a[qMԈs2,ӎ^\=c`W7}{;s^2>%*c]cj*ԑe* mIZ6s\t9b6KP(Iespe_wzs>b%oNiŧC?q;ږ8#^#^buX_)%9P\78?)TÖ2+E;UsW4 4$B2E |RkCE pgiOܗfEoPϦ-qPX1$x"&G@]LgcT;Y =T`_ Ǚ VY z|'N%^&M>p[6+7}]5kTE::KfxSKQԝh_PpdW fqnÛS~˰;Wi߾okFԇ6NSZ9A}6 xWywusw.y캅}\̍aQK^uͿ[ʅ=/N~іwׯ_zsfkfqKgwv}P_injll@4̙>|7`7 xIJM籩?IHDU"•Xz!Gb`J(tQ!U#>eǗ"xj̀'UVE;:Cj a~~#6g7t=V?jCo-RCG9fi}4v6wykʻN-/VآU#t얨+N=ӓ xՕ:Uu9^]"y.ik8^sٯs{K|isVyNڜli5$!%_:£^تF<:[]6[;h*"T" {C,õzestupL-{w\komRv ЇA`|,rRI].瓪£$X{w)a2, Jᱩ UC!W4ʘ:Q[3O|owy{N˞)%_|/_5jڭ2jʋ-vwUX/?9xC}ssccwzͥ+x>BkȢa!◥  Œ' ۣDqpQvXI5 V <XQ1Fl8 _9N-g[|1$;:V5f]SYśM%;] 'eár+B qU8 Iya{R@T=nN9la*khE+MjRZ$(Di2mT sG܎`ȟȦY,5A,-϶$+q<LŢD< }h(ΤSv96GL _V0jcֿ?a{?}^?3=Jo&dc퓱XG7]k) "Υ\T4wKvkWJڞ?zu \72k6.-k!T5?v%Z~1K,a&cxSbRÂÂNqj[²$#V_O Ir2EH0Cf'C$l]Uet>Y]N{yo۷|ö~vu`M}ͱF+4nnfeh&x 뚎5,ժySw;7.憥O{C};Fv3g9׺eMۇݺ>ŏ^䩫?~}-wp×mzg['{u۰^AM,{_ߎ՝7=rguݢtM?fС-kt]'5蒞C((YZ6ԝ8zqK~[J].W2bbK"9 GYԠaGdN@flULUOt>E`b&js3J`X~"Yc_yp$c8t 0(sTɏ@ Y H&c@8t#H8-`'`LE@~aLH';,A7EFgfdX.)UGк9DD@XX8|'DCi'cy]h; 3]b*as`> 8.OJM&oe\ ;gV@QA=bUa+!ڴ?}0aͼqkK}eS>?fw^v9g$*}7>{ZUt >P#f+ߣ oCMpX$ewxvk:r5ճW^)+1\6WWw"fY= Ӫ@y!`'biXd' f7I4f L~̥W6eQ^?yB:y%bґF0cYHzA1.2E M@|Kc9<hVkREܡ3xh}u7@&][No%G(˽ 8Bh*dph:RTG7,)|c,wǯ^5\ ߍkǰ}ۏcO\ke^{>Xu/O߼gx;OU9pUZjjt!qybP}m =;6 sF2ůI/߬*n 6F "' 8ex8'<pQwq8-V0RK =P<[. ^Q2ou )p%Uuͤ;~6ȁ8*Vq%@hb[=̼q>ˇ8Op9Y"RjHU=#9xJ'ܧ~p\8v,]IrX}j_@0&S |`S#9xQ t',u#jGƮ9|mV-ϯgCW爕w[vψU=l0h&;~լqkߙq+_`W~+itڕuź]tX4f2>en5$Wul l59`{3g5|\Vw2p\!R"R+%-I-h"WíB s!-t+:B P;ED0NK]bD <~aL^!vK,6 Y) FrL)`ч' IjMEtd,MP& U T݅Kػ={݅8Q4׫$gALZ 'TPs*Ѷ&cZV\BݮB'v,}ɻȻbc|r,{m94Znˠ:_ri߫W>|žz޾~kW-_^;ל?Qמɀ[F.9}[# uX8^\Uxc1(4Wb]^[mL`u^m5G聋?_?}㪥ޱ=~̛\߿wop'oewGo\_yG^esns{_ʹ ;~# ͍'G?#uPUXmu5>{JL6,NIxm.I0$◙z  }p֛(@gU@ R"1)([ØN;^O (&8vp$ɤ:bbqsA!p¥h3%q$,v0p[l EX ?>_" }%["lfO,W&[ [,jU%<7pT=rں?6y]W!z{F;f]QtkM羴j L^;g׾=fk#>:t#d/Mu;PW5>=Y=aDa*2O+%2!U5"[q;ㆯ}g2yJB%\pTN% WCu/at.S 3y ܛ(a(b(9? IV*iˋ(М #1g30ˬ1H$UYb5bP0x 2O$RJ&y-`+PilC O0F@̗ 8[ UED>~S#zvPsHچM-B'4RQU| 4pPrDB_.1U2΋>v͊]35Z]mmp?xy3lWysgnx_\Gv_WzK^c^ӷc;u f9‘o~RWM- Eۿjk-wp\6W?xnX:QؑV\i3pGd)jgED`8{zo+pZjD$/8;8΅}z8aJ?[L';uIK>5D[ XĘ;CX Jj6s2{mc@:a!]m\>'܎0ͦ DBY;röj)=,^wwCV8C8GF.~ŭw \vא5=Go3v[Z^s {F1Ҫw^Z; s_4wwƬ~s7/}}ԢicGq9->6V_=_/qל3}ڤ^W~i3G|&}gv,,|qDžl,[NM8h?7oT*5974* 8|M *Pwb端zͯ24e3OB*Ǣ)kŢY,10_dHs\J N`A7 AE 3!W(LG#0]H8NisţUX;E[*|dS6 ѥe!pϑxc,| 4}I+ 2~$qЃ+ Ǣ8D(v؂6 @,TTwV}lBa?𕖘+M&?5vCcV3d#usڞV LpXUL0q΄uF1|՛CW5rü3=-7a'nI{ - V&m֨ O $ӣd@<*7J6o13a{S'umT*exRFMx 8?}ΊYKm!Tx4Y6@U 5g5+N D-`4 hdf ~iІ9 Ub2\2;sזH+AE; 0JQ)̆dBKi/X~ʉlS(:<]inlA@ j/3J@םO/,.<Y }?n, |ߠs-l*:ͅ‘FM-6ր/gՇy푫x%{}ןf؆~_8ׅ{ ;[(S[,]hp @~[F=]-LiH2ˁ ix=ʢC ﲇDC0+$DU&ٮ"שCSs OoغkoYhO8c)zὗ_}xa*7m[ &?T롗}[574(x{ǎԷ4z ':Gـ, > HR\:ŃNd/@D> q@2/'O}y7(?c8H)hMPf녔uP0ux_N:ձ< [qNLحbzpa\-e,NC)iXO?cy',A5thҶ pb΀$mh9L{-폛zp(½*E9p0ÞQN_-kX ?~C{|#W`6 ]q`#V9h85ʷ/s#@o5^=rswvue;fLЕI;򤭠W9=*hE];﷨ Qj6| *SM B@K';Rʏ1CnϚQ% z ub$0UBNkDd—`/Qz]3g'pR'"aIR8V(CCGy2h3Ús0${X(&R%l./ 9?#x,wBN_\_zڽ5s!]?[UyXNpff׏fK '~:qpsmxm?mM֮\rU˖hɢWN Ǎ~kO=3OYYs Yw{L? ?X@n`kj64 PhTzAǏPR;J*@[ ;旋zaRO4 kaG$6 A!x6~aOJP5] ;A':Q&@ghHQE+ij @~l\Wz `+@HWy~'YCΤ:, MĪ1"M]8V7&sQ8yE5i= r~{9Lp_<)%Iʺ8ToNT3`4g'G s75ɫu0D1O}6|u6̍YnJb0oRA$; ̪ci3t#\"1f!+[)!WT~Yx6E3 ~O? `Ok9|hmcc#[)W`q 8apjX-PwoO4oof6͖ٱw~ko/Yq՟/_x_,+Xe+,ys_ݏsS~o+NWޤTf1=SDMM-^omC= ?&ZiؼnC? (v1XZ* d7 }[umO(i!2 M?Sfi]`Ma`0$|a2+$0A8j |y'3XM#1(Z F .{Iîw9qR/B8w1:N-xÇ9NzA*g%UHWn"B)cH8,9b.5}X5VǰÖSuus^\7{2ٓ6ϛeMm5fguޫ缾i3s&sa3e"OG61;c_StffYֲ8`_Q m&t)QI/$Д@î]${">#?XlA6 //,(,ʖ`nUPkEp]9]JhK+>A'wW$6ce ES_ʻc1e$̎@u!3A|JtFt[l_&ziOp.1M@=о{wdC9tرcl%(Vd7+q9`fN:̆$#f;f5}v;޻ߑG Jgpe7O/m:~Ou[}dy{4kۺP.Jxagݽ;Ww:o> B):"[>λfbAܯ+@;}qD܍lMn`/o \ºO3l ; `X!`Kp8eGǂ,d!pπa,0%$& u՟R|/ˣk~ְG*OCw9b' V|(iřbRჭzPʔ($L/SLN@ߣ 4.79i'p?+nW(TbJlS81_0uzX~KHZ #9b6`{'l(iͬkߙaĭー¦ֿ=~ܗ͛3;+/MuL9)W4GSr8B0~@.Hdcv쐯6|ytϑ?Ws`׾?9 CǏ<_oVW"V ]\[Wh4x]# jgS <x|g]ak]>\U;o\2볇o]JyL9%ծܟL؃YNn ;۹S}och= IR8T;燦"9k;aY[J!ŒXDv`$<$WL`?|A  Xmn`}4f' p$%""-ɊD\gUh}4ݴញ_}*w}Ƌp#Y?U@D{, Xe:栴3! 2B P6vҟ_=}-1KCp>8@%t؇ 31H2XQ.'ANgVD]^@h ;2Oȕrʛx [cԺ^k5l2{z5~1\fzwM6owsycSx/$V_3dWsT㸊KpCnk3)kgwߟ LzNA3b{v&ZxVrDEDOڂ*pa 3닛x[">Icb ,).%ƮX] I180E ' 3H8(t"QWSL#l#L 0"Q@D"3CcD[=C @6݉*o 0}=TP,$'lbUJ`uIuífQ n2CQhpy<#Y{ xN7B/P>lG] 53/WOA=F9|mAK3l]6nΘuFcm;qۻSv?^+zq׾z7_bط?_lp@d}IxpnZ*%Q/ ٪ݑH_t:WJ)"MRT5C.|hac˻XßRD2y4TG_hS 84?X8B2`q',})Yǔ/G IY^TčҋKEyga azF(,idQ "%0 D8=?dR$dΌr6KVhIw02p[f6m 8Ⱦ>RWWРhu0 u\#4S-:SW(=q:%y觽}YKw0d?~ߜߝy;ڡn16~E4N+LgTvUv]F"fl.ҵE ;ۘڞuً.QuJMFoENrRwW G*z,]q@Ƣt*H$0YFgg}RC,?6}r@ aZ9&+ǖ? ͩ AM/3$;Mބ9k?si\*&d$U]ޡ2]:VtjEI"JX`*ዻ.xǢiO$`-QXB~%٪UKWTdBáuM}M{8-;啄& ~&aF)"y,3+H@|}DH4D2L)&A<*?~/>VFgZf~e)]YT ~$-L@> {)*O:Tyc@YϬ?TgjqJP%&a7An{˥$8c@eEe5bEcg:j󆝑dh8ǀ{Zg–^c6+9<`Z?s7ǭ~cڷo5y_d&>Gg3^=.멱PF`ܛʏsC6Wlɔ;ڬ]]MsܞSŞHĥFQU@ZalGE<\j'=Yö^`3b=<,Q`Z%?YY韔•Y,|V\Hì5+&?U@ ΣWgq)<?Fݑ/Q%PJ^-:8B2Uٌ Cl32URß fd:sy ~:WݹOvUR\<Φ*pcu׊\u2~,o. cX0'N\_Feΰ/jik}K-הy;b!~^-؉ {cv.' g51=Y 0h,'RHD2QXqB0p6 y#R)ĀCId!6 cqH(+u@++10]qَθ8a@O&~v=|$ǓR(] J3`씕d:N֪P.Ds7K,GρQMwg;6KI=g!O1l@ 0q&f &?%Uǣ \(K9+:Lf,Ŗ4] d}`%Mm"w=<2v}C=x7mWuŷ i݌ ~ oOo3[@?nrUY:m͟'w%g%9}28$jl*tS.wnl1VRr?Dp*!=bIJEK;`vZAVhyFI 7b~i1>#rVa&QŪ2,@&⁜;o eW^RRqx 6#,fɿ|IJ$/T!<;2&^IU A7 E WFC~O( L 80#pq!]}?۽dzO{{d# ٷ0cJJAU(OUҹNXgݑ=VпPafevx y}v_"XѱSe'lW+ @8?&qv`|JBOPLzI`yLd9\8&-sL j)}/F3'kj ~>r!wՠ%E,ceݸa;<,b#åH&@8 h#9L* W{S= kO˰ UY Z:ЖJT㰅|`V2{U|_8猇ݪڲѸe:q󞟼Q+k {ooԦ^cыLfM4{w&be Lovk#ñO7wGSSI.ՉUW:ƚ^+̦W;gR8aWVvP>H zr6&tp&f Y#2 g00H:gS1'0Q_UGVtX҃s GXԞ%gL`"@ DZ%0DJʃ?}&qfMթ{ ZkC6tZM쾱KLfÒ~\hiCM٤g?G|7<3^٨莭`;Y{N JZGzmW:Tly5uOfp `B) J=g|Nq$¡a&Ƶ0ߓ%1t#K)~a^<cAt Z4 Zrxx !eD@Z2 2ʈTqDZ@SC='xOePtPȀ~,Gv}F ߓ?R[{2JBC!K5>*[ G{Q{cwS)p3ϚX|N}d$St"aGC*q;m^SnDqӱ`V[7@x"=|auU/U`8X|*k9tcG@u|ζ;Wjk42*CD&&"[S-e^p vxjy^ S۠;?=qc!kzZ{/6:E yxkg]ƨb`'?7%S'~:iGNx+=}02;@ ^or8ܞ*'ZJTլJgw|UnWH2Ex KKBu~YYF9J3Wt1bاuJlC@-?ۧb T ۻnCGc^.h*ľvebNz6!法pRqjvX vxg1SW5.wBE Z 8 y" E$5GPUJç_ ^|:!  G1ٝ`Wy dz UYV#A?WZGbFQ ||ajm$Ԍqэ w{Coz-Fogкw^ L0i &BX/t3;h/~uoQ}u{)< lo1wC8J&(|Fem$ #_D2YX[R[3,v_{9Qtm>Ƙb*X09%ƲTyfCߒ0h2>8'gQNKC$-aZƶ^F߅=Hϰ812Lc2@ $ R] `qzQb#v?kuvE=~_]ƆM*[Ӏ}5M'ZƦc{w;ۘ&8@||48P0q8FEIXR-D,Ig1)sU@m\Zn'믽wc&?N# G7nZo8yCU<3bu%h48iD"X,&vbGF$, |L3P`2.t<}BUJ`V dNbt6캎<O&@$@#p1UuNاP&['&2{"^ K3ex/YA֌4!eʓn8+a@ l 90{% D!  ;j̋OIa"G!Xϔ2\ʝu|͛5&g}0xڶGlwЪ{9jQ+|g>8@X8GX4iĎyo~ߝ]%y-Umv񺻆є7c0U,t_2rM`O 9Hƴ0lNҵ~i8Gf>24Dg$`Fو˿e(542^,pNJN%e{bC~=RC_^ :EQԀ`XȨX-jl6f\f>[nWizm1mD8ewC8=׮<7?3=BS5j -?|(0Т|FWPSS{wL##RHS)LU@`ZGiPXlzG$r# HWWc ,TÖS8^U@4ɃJژ{Kyц?LCǀj{t9V PHTH$}iya3)1F733w6$Y s0vS2(O'T-`al>`,0A>1IULP"N1 &@|=qşPZZblP6۩ts }$?8o83f 4Kmy11O.xY DOE?g=(A :>wt@>"$JYRsCqpz/m>S3t6]vn}|܆^C1@ _z2wҗO0k7G{_7s̒iMy Ob}5M7~pY/yqO) ܧ~Ѿ/(@XC/ YV0Ǥ@zg`ԉcz\:t!I˘1DWш (J[P'<@ "a!eԀxXgM$HFұ`"θR{{~v)oB퉚}GAMJX}MCñf5 SC(*%1t+E@Sw7"2rqƖʺkiqN-٥ef[q&|ΠOi[c -xNW;c gqx)~gFҁÉl,UU2ڝ{ tq>-X{'%eq28%b xj RHm[{zI2#xmnK;VKC{/`:g6s}^"EY?O(IsSiĊXqFbQlF%tsŃ_^ =|cG'}o{Gw2@}Q~-73~1u ӉOa >q؆/Ve%nbI G(+TV>ADq?aXW%|=O5靟Ww^gzl|v;㱰G?e Y1}Y/~53>a~%tձ$].wt:=v]jds@j4U+HKjvbS.> ~!h"p{&MS?T.Ώm%JpfA4$J.Q bTR_Vs-}I3fD0#%],%Ceej&: N6\Ij %]`A a&Cd13 IA.UpPI&,0OH E"XΨ:禍5:XA47;Xt jjjݳgߥ]QZf3)ng6sU4lEІ/#ShӨWhX̝b5=KV:]- )\ uTXX\f=;W _sՍ6t~,0%(U2Cs,V),R$OqoU%4YLk@zdDx s b8PF0`\6[u O&m6|I%@U j1.ęTVy=) `%d29fϒz$H52;N{RgO!![ʼLH}|h GʚR!+]8v\ $xgd.?o}_xhCL~7اp ka־5aۜǯ|iԂ1?r߳7_}AܩPmI9,o_@O !E򾀖Q$Ģ?bd5dW?6'!2>8n*C(S{F%,)̰)8i`HE1*',G"_ؑ5‘sмHZQ mvҋ 2 @/⢌s)m:6AR*s|@ؒ ƎT ZBs2s 0ϯ:\TfvW %/8f5}C[STSd(%@D AT@PҪ/a?LT@)f*hߎ$F?CyH(Qp> /`tE3%L2Hu<{fn6T+fQnY'`(V۟vLe`7t/=G6׼5 [Y2m:rֿ͛1nKÖN4̳33:yr5i+;՞0Y̋/;,KjϟrQ%E\vkY#E+e#e?oOVSV?}d/'qQS~̩X4}L&a0N1.ǜ)y`&Un5k֗' f0Cؔs0!yaV CQv/czy{ޥ8PCÑF@st8g8pndjKXWM IHu?c)>8ML9ioYNlv|!ebc n`(4#R7N{>!w1Ì8D9?l'eq3p|/] "6k P;A)ɐUWYCI85Sggs@!`7/y "S“vW$s|U 7!W Ajfo{ә?i֏^w=8n˽CW̅?vQkGsqvN/Wx}ֽ5vTy^wGKӪ;\Y uƻSs;sQ%pOi?mw7@2N"VXJ @QCme}x$k)uUwڶBKƉ㦺+Jv~Zk?DTeLBYǪS ܋p ^.f` ,?gEN?@uxwJ~zQ- Y b^IDATFV"],gD% q+!gTLN*L`, ;gZbDHe&݉ ^8;~[> KLR<#Hr %,"܇|2*[XߩA$9&#pVl4XLԛq}N6Oj*)w4^Kw̦Gm) 7qpl×L`$U3ǪLZ/ \0wJ۟k{i@ZwǺq*8wV5:X5i5qai AF3|[Xg;,g#Rܠ`0x%@RK~0ytĈBegN.49p ?Ҁ&5?R$|9I̔*b \o^#-uJjPQNX*&'X@U g9𧦍N` OQ z)76Qg8k+S) pzcەp:blb'p6[jGc'3T,=iL 3F1*qh ۉuXͽg@01e`N{-Al,b?@uӁrg+Kl!os[Wgm2m}xd^Ŵyx`@|lqkì1+_ lI2t՛6|||3Aߟ-YK+`gW >8`3lq\>J"Q@p2Qܟ_}KR8~*;ܳ 9, q0X V`^aq'(iw) )BTfC[4gnl?&K[M~l)RD_gYZƊY]_^ *)bymmLe>yd}c.<;vRhhjjWp* `AXQZpAXZn 0_|iC)@4J=r`!:w}2g4EF'c?dC}6&|>WOL._@uL`|4d<O%lz'T+ey>&S5C>JQ5g:ya>dqSRPJEYv$X,+>`C@,v3كxq?Rd_q;H\{`!`gG:QP>, m8T G<ׅBo,0`_ EHp`Z"d5hNP4=L<`ZI @ O#ic29]虦OM{в}cȪc7ֿ5x:{Yc6ՑX_bS`>p9~+#>{yǓp os=9%m9?@/,EI# f ?FEK4YeӼ|?nU2 VX'_/lbN ]nmE\ *rIҮQ#3/gpByyI<8H)P<=pyzWEَ?XХelCc2vXo"Tv#shN++IXEBE/so9jܼQcǥNZ;B4jUPlT g+YRm*FN\zc0cƙC7=B6_ȍo[Ƙ5,//B,+T1L?/Qώyn_moRۀ&S)ahEƝ8@USlx!EjneħZnԨ, JSqLV-]OQ(Ӳk^U}L@P84SA55f`p8\ ʋOF)Lĩi:s9<^;N]p. x%t xT2/sEҡ#!#~ړ8 p2 dfQ h{.G,dПwÖTm S\zc?uaB5UE9 Ki]$*$XAɗTuz l,~i[v >U|0AiQХX  ܌ن' kn6jFmoe6g<Y#3v;61ޙyiC@_,`/{s<`#O'>gwynzU^xޥSJ(o=(O,yQPM[otx(Ƹ+ˀ~1^'9\Ӊh{tFy/́#ipiSaQN{e%^sSYe5\-+u|GR sE}(F;^UP *^j)fӝS@ƽ#7u߉L; 0c8`qfxpÛc,{i  rEG.~e Gs3w~y}?wɟ/oⰥK˒6]ƳкgX#-(m l#CZ 8 Ć^W@u] zxjx,3tA7tp琄j(X4S*UtL2lnPء'cDQ0$$u% P/28!_*yjz=orG)=c]Eq v{ӏ 2?5W `\A' ?7?_=5:%hUAwG5K)qFOs2l~mVڶfg_ϨGc0;>qn ygĪ139 ۭ9`G'd&|*P^^wX'~j[UzXNg U^ w ;8DxNcfj [$A 7]n ';r?sx^5[J mX_,š &U]ij ]4\14C+`NUi䱹._X#D~~(Mdӱ \ł]<N3hX[_ وUx,[ ֹ m&y̦(P#vk.L'XUu»u*Moy&}>@YKYNdӥbh_4y(;񋶄DtHёxYA< w f=bTcI٘$BoVe|)&yb[Gj|4=7PTզM%Zyi;kaƐ 3m3fq6ޙ >tK3 8O塟'x#~}>;FpMw9N HiK&> A2^k&L`0$p9} c؅k,-`B6:d?_N~THb F HFABO|fR !ԡG^L rW$dsʸ?=p5[Z~}!͕JX`ÜJ쳺76EBarp6=2q+'@ %"C[6FDrJ3G( %%p8MMiJFەSJ?\/Wc30}*l @e.QeBXDwۿᔀH ׹ , 8C@ U3UU,aOßxbFq$W }e(GqlÂ/6ˠvLbq;|3JГ9zVsXe%^K?D8b29e.7.i %U tLѩߝ3:uUqP);3&SdԨeϽ嗀ͳ l}g7GϞͱa^'N|kɫcO>y;<|<7]yN; ߶2V'! I&qplx 2bSQ*Xju^4Eb;z+m\Zh3 ,e"̰ ڟRN%%ez/)#*ߓx.`w6%&S[ yFpR@#"c$vRDk1Iv]"?2N@Nbǜ84edSUx?kW?ۘ*ʫVkj[bO4 !V p&xA9y_(X%VQyεW.?c5  |%ƙVͩ׵1* ֫7]ϱ`9x=\{NNzj>hSVK(kO ʉevFl͐^wm`a:ZԻfG1vR4$!gI3,:"N()ւQErڭ26da348% KK4ក=s+/UE+cs[Baեf-sld<* p,EJ8gē3,b;a1pKuY<җZwq[ݣ%pK1nAǧڤMΏ {X@׿5x[C浡 @^x`BE\:}ӆ/zighmƀ$ l#Cxn ڨ-"~ue`:ɝA yc[y_$*`CSJ D"uqBZ>`/GA_TzZP.KZqqxٰ$At2f /]QJ$ J~0ժM^`,-C. zc@0(64i)_&Z }!98e#1(*'Gj0ň D8Fdԑ\ k ;z5QI}8?Z}:סl:؊->qppWԵu,3<"roW|DX^>~&p2 fah0ST`WdJ&Ya古z|82Y%x kw9>Jp{5w3˙$XK&rźb,JHKh[UT9?lfqHuLPݘziG3 Y8rIQ0U)?U2 T$+KAh =1+Kse1O4T@F-9DC^2 ߵ[17b.EvTSNɠ~;N'> .Zx]L!eN5?@_eRGx >gA Z,8FHq 1"qR)a}L2s xP`gO`fJr'yRi2?AoMUjQIB"'ɸZu?H[TCODUEW[ܰ=u7ʁղ3tfw(a'np4IKNHnWM\~,T`r _[.u屻=JuګnWHyX\|<⏖,ә ˭Rp~/hċ|uf;xk6>`\H"]tD՟Sn4y6>0 @|q8}Ƿ2ǖV-@n ux6l>, e7.ibˤ.q!X?E"ٗKeB},~p,T\*C˝ z| >qGًH2! jIϗ̎B2̄aH >{H0_فl@w֩obtB0 <7%/UѾX ᘄI?@٭mKetvau iIE2qW''VU6j 2^ZB7,IcQ2kQ2X$Vu ov'LjP1*!4VP)qF ,2&(۶эgƗ g]wS%--K,*1XӃBfO8V1w^\dt"TQfZԍD(# @p|\5k*τ`(' '첺W ˫y"wCn8? E3x0ӰMeeJ = W@9̋7`P$cxDk}Qx!nƎS|ryJB\#?ph@'M~8MIػԃP[@~2ގ@OZٴiaG[YщDezqZ6T_ JL;(0!Ao1-aP251Ci6'S Jʁ0"U'pSaS]ސ2;Y`Si)2}to8cƷ^ BZ>>z_N|b?gdx3\\H)PJb8R *)b%[DM2βryCO Xm)w*P8S8x' ?a/F|A)mg6h3,2t<nQee)\D"Je{4'FoPtet^^( @I|)Js!.;̤کV W8z/F4y[Tt0Ύ{I",RjeJ'Ja}$+yU6rG=^u8vgbe‘\4V%8ҙsLxy$i&G$q\3 _0 PM/.`ohI+srL7 %J/xx?c}* @ 0{p @Ip-k)Mp'c Cpc9D@6aXaOٜАHZ+*ںDgU%e3paEf/yU>3Y`|UxO|_JzEC)_6s@QC*[e%^$^sqI;2F*ỸbNUV+9ɜ|~~!j%lxs,`T8`kNAX<c`=su#o_JZ-0`yIoq6w퐥ʌ1\֐ DLZFk "2wD`( RS J+88P.tFM%˓l&d1$#1 ሔ߭#DaEQO@A1BLc='N@BiҊ0%E>x~RƖTsGzLڹ}q+?@^E\(\2۾]e2 F&~(a#۰2`.nJvө;U.tzvgvꈛgu>s_u.sJ?~_9oOgꊋvoKdlV\JR=ñt$>@碕^i0e6V%@RCȏ苨M?N3i`qÀ-i@aG :EM=gЩ[I-OA b'-KöeQvYѮg̝!Q5.Q ,L{(CU{fS*+ONUb !/|%z#b'GBN8'c)ߥ5#_ KZ N(JZ-d&18/', %m x9c UNMwS9 3}CкG(Єu^9m<,6ꋗ-2`gLxӑ}?p{Oߡkriɤ[6Ʊ%;B4iKz@ҿGzw}^{r][n{ǭOwG̳ßx'ueW&B/Nfg, K6>LH"@,7b,޼/T`9&UDMr,)1?l,S!{0F3X!?Әž2c1P\)U9le}'q"VhKZy Z l=c0ٗ #sdziӺ'&ַm%I0O@ F*'T)wO+Y:$tI?(N (.Fp걭djs(9=JPW)+w̐ @jЕeQ+a`0=-&\'Щ*6 s 7Ɛ:<.zq6OFhpgv8#%mZK>ٜ1}+S+ fZ,x;kOS۶Uk gEn T' XnlwH= 5?.q $pW2'Lqt' p@եVƠD^!H Np/Ճ݉ 8'a5 FX<<}2Dt(a{/&SQŮ+iM&a>E].$aS.H5$:aWUvd; (랮 ''DƦX e&_!L)qn q.@iQ6SϵÅٺX|_| G̓Zo]3Z@j:|63~Q#T_dΨo ^ o8k7}kwn5f[#V:l+CvÖMa_8R^0#|6gѓw{n3@Y<#g؇*t}iV`y`W`(bpɅAj-uM$Q:tUGJĨh" bBa%X(&zT02Y4$h`>֪/}v|ҡtY=ߋȥIu<7s-¤"#|0e5lEefsRZ[[soPe0덥9 L?>j/x<d:};'}y#>=cVb5n߾ud߾ڃjj>T[x(:z{sp?;㞽u7ٰqMk7c^f_EjgUa-V5;GxJ}QVMTȈ TPS0Ut6)ӾU!#QQ ,o9a 5հ9_w(iFa5&,²+[&b"/)YɅ`ն /p)M ء"?ӿ 0˜Tp$%-菿XqDisLXZ/%c8Ƅ~:w>+5a=[XZZaIU6;XrµMp#[PQO=n X0',~f. [-sPI3 1A=;d8P'%ad´uصo ]u39rC ͳǭ1rkAX˧Y:u/ џOA uD_xM PeG"Z"'>a5I1rtb q pt ΔcX}PUY}T._QJg9`p4OTe"0?yǢYoʴwNYه+/رmZ MMX' HcBGWv=ܷ={~ܵ=@埯/ݟ| IbdK2>*AD{(HA SmSLnq찌/b `=c.%9%$$[@|BP r;Yy ~_p׌UR':$8}iS=_ ʲϳ/@^ka %9^O;TlTR@Vɇ[E}{͝6m[Vغaޝ?9P{|pIfd ǚj=pރv>r7ۿݾiǦ[=2W%vx~{(H1VRrUWoʫ-S'DȚO U/Vgp_qTd,'44VRCy$z(|(b$ QLyIcnRWSSƯV]}:"oFUթ0H@! 0β]*oŇz6(1I5LI`U$UM! s'„JրM 1^D&Z`ev[f {=)E$U淰wI ßL0jݚP6͂Gݎ,< oQg?3G~c4t/>^OX0C{}Mqgt]l*@H5'kDRQƋDAHd0HѦt$|AƋa![h ,J=h!hQ~GD_bCBW$0ܗۋ -i2Kh ' (eH4MY)"a!з/zƴ K+$h2L6hb`h". 0'C8XX#")'X[jM}yӧYvCG45֟h9^(475o,h> 78~X́#vΟC;ݹib[qb;JQ'M҈Peihsځ_rpO/R9s4ڴ3 =ei_B@؂zc.5WS숭mX*g^*s}fGi^fN[`ANgkw+(½ X&@π XޫxBqq¢E .b% MUpOyǤ7^yJLY)@N$SZ,Fr5f &[mԢ #sE٨/}5ʟRjcu1j?썢,E\<DlGOS}Xz ҧ&8A"ʋ$><ΨWKK9A(ZFS{Wo!m<"·HQ#nƾyJS[)l% ??@ׅI%zѮ`2U-Wdyq̗#|>gއo`Wڃaknnp?]445oojk =Xsxp_~_om\PØA>ފhHJl; wz\T1b(^q `ǒLAŔ1]'ug@%8*Ygx‹Qz8*/)a hD= zP$lZl'ψ ѓ__8?$[y0TT}X:CcC0t&bDSX{LO&A*t&.-JK$*ۤEpb9/LN  &I0zE DW1!Ѱ$I]tsACxwvp T졲a5dlALt&@' X`ԃtpgz} wti۱J>hs!.cU(kII@8Oq"V15D7~$% TETkm :1,#،9 cq^cO0{| w`YԋD O+LzjmGURoF VRwS pLW:˜)tcO-@P8q@C;6utϑ+7jkИ/ f* q~` N{i9m~+eHE@Ju0 0KB%$d|t$? I{ӎ > 2qyy`?r`8ؑ˔;d4DHz.Sp'QuZ@= 9'\upAEb3Cc&)[DBJv۟I`&6Hx6\ۑHN$T`>xx;z2u)գ佤5M<<ŢYlV:dȦtӟ{?#}8±.g=ھ2֦M ՜ aӿF q_&s<$@=&t1%s|&E^j̇+h1YD(Q]=g R#(@//IfU.4馰DQ,fQvI23XG+^HdƗ$,Rr`-Hμ{=J9{/TkLoS{Ldf̤dҫ޻(`A@l`ADT5ػ"|~Ͻygg}6S^WO\mٞ9i2g*SJtƑ0p ;x0ܾd9-z[B >xK]9|ƭ?|Б+/ÐqƦ@F%귚nυ`XMך~9pGvyw674GH$_jėb18ohqS ˬ 3ļ'J,jwB ; {|/g#s3 1 _Ga q!ϔ 08.Y=I3m|e%#E3"qq0\,%rN/+,V2єbZmqj`[\0܇OFZ4>Dye,ngmNt 3IgRɂ?Ôb%_Jـ a^?8CH!Ѫ"9a`q0. |!J̛{.p?kW鸝3~>g`کC.t\VޭbLוz*~[1Ҟ__*Sw(X Z. :2 ,NgBjVkj%xE N6+e]>u)?d,E/RS=.RTNJC8Rw766 T9EB|tglHeH"gdz[zZ۠*'GKʷ*k7qFx"*U,?%3*4c.ګUI:D^k$p/Q:t"()ݬh OQ]c)b\.{5ܴ|u՜W/<3篜tJ=Ln4*lD &. \n4ݪ)H@C}㵋O=}Ӈ~9Щ'<|ĥ=v!OAgc?M'Nc%@ @i{!μĖ12e "P#=|4 hVN/%dCyfn@5g?SXbG35xu i 73X̬&ӳ,g`MU59;65QOY $Bq q[VU1KX;Rc џe*Up)Lq[ՔeNY~oNL7p?D!dN)c kRIKVuc+,[2+'W]r9"p:bBUeU{Gx&5ęv #*@?p P+'[ً@Uzc/mao q;ꠉ9tbtNt~:`lGvd"|1Cn]c"g:Da&8R)Yg'XS gũ[|2I4riR9G ]k[Z!KRv4z&br[R?8x(UO_⵴a!<-de9$96L ,ّa(*an=BJtBbh"LsjpB$P 8HB d;)>Ft1 puyeҥ%,QܼpXOjVhnx֍ W/_zʩK?vhVZc#d}c QJڨI vvX},gz fj]"w7Ù ❬_J{TWL* -T6^P [.b%Cf;[9JŻzFia/%!F]LV9_Eae{"|CfCt9V$Hp;!Ag3$xa''1P0 |"@<<^"7eD씹o]()ON6mqN,:Q_B*j{q:l:r -A @Nlk&]2BW"GȞ~7:j58 axM 8lNFiO!'9ooa_M9"z]` |LoCʉ7&*n zO;ӹ2/5^ 9H{cH*,1cb fd^_ ԳZ 8R\TBϝ(|WtyPE #K8IKLY#`K_`D|t!LlS"qc*! Hn^ryTfe=~){g\X.PU8@hAgPݷ*NJnKP޽jlʑ=J{}Y6Ǟ|VS{|(ɇCsx2՞ ^! hbȉ؉Va I8(uؑ76'o[l2CLcx C@ҏO4Yj%sRǂ '8ecAtӖL3.^Gdw]AƯ! I3y ]8xjzE/~"r怡 b! -` +&K+LB atvN-^-W/X6o[OHxRT8Xr F~`D@>ssfWϛ\1| PLhqD})C?` }wjJ2*P~. ;ҷe(eܐ?.oI]5 =Mjb{ P?,խbx}ӯO<hЋsu`,4j)/[9 @hQ$ALa1ЂݭRx'z uְg! yDJl,ֱR")3Y-*TO„!$ZZ3<|'} uTf&%|`?ZmxWq_{pZxq>m^찉Z$' m>4.CW0؎A\J#~ҋ$ޞ2К췦r¢+w/7._np&|n{Y_. &o+?u܉sy-{O;} מx4z<6гf,eZ,HJE|L?$%B?`8yϲ!@t(Ul3!GpdN-#<  A [xmtˌA=&R;RseU g(B2X ;G%Fl6BOT$ )Z@G9]θW+ D6^kg(Pކ\ @aI Z~*|Țx鑐آ쇯a5-L~ʞ&G@S0àp.H& <ց?.Iˈ ϵgN,1Xg>k 8`!k'Z;e@{_ջ*Ҍ~Ɉnu_8};CmUmmL_w"ijeB SGGh!pa,ddZ,@^ՐU](E]ڳHqOũ0Zńg_N c,'E\FlHetY~.YCc?@HV4礮)0@A('bn$8>">4G Xh*w1F^YwA#KƵ3V}N+7}5ݲ쑟=}5@㍆7R@|sG\>yqݻ7˥R:]nXX`-R6? 68P?JmZBe0@R((4:(ye=(?BKi "OgV ZB|2LifpH",%걬r2v櫉QVʈ7VO,%R^Zܬ"OHSgI%j0's2EN  TH>]9Y3qZE20G(kCSI6@qXUlg*Q4vӴm(횼~Y?V)?b aF gmc=qj8a/?K·aBYĶa)!cAR= Kd@u  "-ZRY[#-r_P[+d@:(0YoJG"Vy\9n!'R vUv嗍}FIyh? )D'CѱP[5Z p,[DϬb=yh^7l@ UlEu)J C: CLgՌ7t%gX9xbsƆF_YnդpkN?sûZahMqneSsEYN)ԒP3A, eY_=!N'XO"rXS%p4'GuxD9@t&`^ g&l(rN=H=jjTM0 t αRD(V^Y!XFmV@mL1ivQيX0lԁ\ 2{,sٸGw[4[ň+ جIqRFntJпK3}9[MV di ~K/A!eq~6!2JF!rv my  I[N ]v0b,d3xe^6x2C 8rҋT}孊3AVH2y2$IyiYѡH8ۥ:o9] S`۩KIdOD,rIœ'Ϟ:uIiɮkO:p⹦+JQ?R/?J_΀N:qxyϧޒIҫtikz]:nL1Zpw&( SN˙,!1PB(:, a;95!*}l , b>@`|[j4GT 疦-Ff8%5NfE5< W|EKs)26BP O9>qfGaZK`?ꥄ @(ObrY#A<"E-@*Nd:I֔0HO'K:V'oGWm/0p~l[p/3L"Ǫ4@Ce9)!-½윒!u)/+ |7oHEd,/?A-ըXa]?#TrԜm|E*,dY$!eeV}䧓@sy mO*1 g%(Il}E۟m~*Bh AB#}R#%mڄiEyy g[lpM! v{57b@-K)Goܼt2S ɟOӡ7h_kaw!ȶXwOE ƾaN4@B.IP2s욦^`"'2K۟6 ۀteR?}r3DY >LVL ڃ Q38QrTƏ'3/9ZKLL>B:Ige7^C:X#2$ V!2`I DI>k~@k .cqaژ uJ~c>>Q@T<`P5޶t^JeFSqrj,U'z3@O%w=g9Jo.qVchт^?bCuSC=l_Kc*JvdڜW*w<&+(:G{kVpn/)g0+ݮP\[^ η {ʙ% f./-۵f/?˭M7hgIf+Oч("pͫ\8}/g9} `?vamSn7k퓺pj1^*LFDP[;@J~bƷe+#N~_}_)`b=ۀ#4Y&b˙ H`*KXJ& deȌr;Gי܎T,Þj6E\vnW{}B@b0d.8BZhDJ$)VL2,dx9ےjr$+Ɩfr M{";[YίR%ƚeH 琊d2#T.zJ؆-ItKisѨ X,cӚ c@`L[M:/o^dњlz8Y%v.8`gIζY VhX?u8.oHM^ʌ+2_moV jhCzwmc<?&26!r?SVaN cԈp 'SZ!|Ybć-#n:h$.y41bN>'8hf|_l)F{uNTD{*ⰝXx&@<6`͍NLʴI-]2!AL;TtAT%g$0_ckr b 7,d"QAϺlŞ`3Kѻ,vLJc\8uFU߸/g5n54IPpO|ڰs=W? }]mm mK36sISaeHp6e}b&L?s O,;  RBP @пh+.Wr{q7NNkf ay\)\iv[ tVs2A QNEEsTyaQhS!=[R JY%×~znJ"tU@0 `WÁwgxVNp'pd.WS!%!Ԣ@y fy " r&!OU=DmAyUIl!AUf`Q }ˑh^%F[^زz Z %t.gP;/;uɴY/+fG]4] 7hHSΝ9{`8lc{>|f[`X6N2\RF|WY>3L~/YorCtxOop͚t8i֐9"r KammR/瑑 npOǕ"sNcâ8 bN\w;[(oQEqqޜ-[}{jKlz 7 ¢/{S~C*-ldѧ|0kda(a]r=*(R%v ? v`a_'rofl׎S1|̰7~U 4vpA+ _JN{4j_A.ǪeS˒$PYHN)/T,,'YY`:#? 1 4L쳁tn/<EOܗ=њѶ?6@ЏŰȀip0 V?v_/#jT9ϰg +;p]A@ 1_q-$ >F˻OcP.aĵ>7:S'L?pSgV̚r-+WеSn^x(ৄgk`Nolhh_~̅㇏Vu{6bIENЀ'PT@ sJD/Ay9?(U+6p4ߒo5bGxAQDId2a| lpw:b`;0+:Xpt(D%EߨEsQ𐘅WA*d)PR#rurH 0&;>$z'jaL3F|'񶶒yhR(-gk=F0F(@Jc`qq՞l, `L@32~fX=&XٽvVg ٯ#)F*R#E~d@VD'x8 c82y@d5IFy[d0iqX%auxJeù ~=X*0Ogğ7X%`RbZ$N뒯Ä0'nzbNb6X4 >~);3v0ÞqØH2[,hLw4C@ JPɊVyRkaC&A(ÿ ,~&aL1+XЀa&;TR}YDJS Ȉ?s2ŘO|c ;)^^P(@&b:|v(! @|VB8}v/]'$ ՁfemyFcJƉ@)a7Twc݄kFw]1ڌ~9&tfOF&6`JHU=zׯ%h,=XBgT9F6j z5`7hbX AxJ8 xm[U h@2@qD0E|RۓoƎ}t 2(8!3+he,]`M!ˇf9_(|[h}e6hRJ]wt$IҒG:&2G-/dEX떯:]OܸpU|n 4$_>{oO6ص~Mk9{Sr^81'~)0Y`!&&v IGD1EXJ#i-VSsП1|pC@Y)nN`P <">=B&JQ 6v!%ҥ]򝩉cLhiK E2E $%.'ҶNSXb)^¬ֳA\-S.t6u{ Q~| 4e^ gҟ tj ?1p?@zih}eޯaI=JV"՟<"ʲ@N imYڡ-Hۇ'l0\"Dȕj3Lr~gJhTZJKVV)/YZ5ꊪ5ko}1tÕ[7ٷuI z xpgܹa~ay`Ʋ[bh'KfW E0C]#-R(^ s s0Gi] vG8obm roOMӬu`'-RwoDՂU*jRaƝ@d.\xƭ7roߛMn6[n\|sGNoXvߦvٲn\W2D'D:9ZgòRE܇J4 ;7-:h`(JpZcş>m6(y J|Ls@< `(fIk$Ҟ2 3+?W {\^_ Q2Fp%R]Cd րk~$Tz4# џ2O藱 $&vヌ` J`Zuǰ5Kyl)8}̑0W_jB5N1ݗktARU/lpΔ4f}t Ew +ѿAgvjrzGC}ޖ1FloBO6AS~Reћ &,( ^m$ԫd T#k!Zŭ[2: 8۞nB9'GRPLȆ2`ǂN΋TCu *xƠ3Cf/5vM9F\P8wa3TW^}?'xk 7nq5G/ {qRׄŴv&o^?{uW?zsl:oON&`{Ýf5C[d5`nYN0%%3lp?8HNUA sRÌI ?zr:+f^ N)@ )bSݡh,YUʟOu[hy{3#U= >(~Ir &W[upoƖ$SrLJ^1L?v2Q0fEgd)XY|vHqJ2A@ ӆ4cZe- *5zUe[>g`m%}Y!%Hqy$Y)UBIwRqԇC%X*Ew?Y,),< N OibDіA }#Ȳ z 1Ofs(e$ā~_8)1 (^, i֛ApmFܢu{҄ɳg͜4}Ii٢+ʗ-[zn输: _O j7\rsGNڱ{ڍ*W]R|ΒڲX_ؕ[B퓺D3Lti0B<\21EcRR;TN @NVa1ßU|X}/ZYxNILUD'gk/UJx[2 eKRD.-b\D  {pqZbb'/ue+Pc v0JJq!hEC'EVaV #i:N8ُ2MEQ P[qx] Ij-P-Uъ'C@BBIŋ$Mkg9@97>cCgjoQOY?el5vuSZD7o]ޫX;jX9;V8A }'fu[p;mHZ :W4ż] H݈h>^FVv QOP&6/_rPИp ne|*cA j (+2H E2@kώ3p$ldK%8C/LVs ^âCl[5c"e^F9 a9#v%_[:r94ڱC &R /+G(}~޷RE(t{{척y ų^Zvٚ5ug;}ܨol+'>/$V_~޵w˪5+k˪ΘtJ@ٴy]"5$w*<BdɕH9IBqP8Op:#xH HyLf+<W|HVy`SLK 3bPTLn`΍ožw|4g^EH@8FJ^S'vZz/4efEbxk?-uIlcT\EtOxF=;.g.m|lټ dh .qΥHk i.Fud`T_#BJ ia j*]cw%l6|AuS7pXNVU.?Q],aI XU*p !J@'ؤ*?2䰄POJB +KX T]U  C@ sb0s}M>N'# [(}WfvkMS4p>k'8y0X8j|ڜc֌Q{mvez)3ZȥjVkc9څB aRYE;,U="jh; V6N.azę8%ŀVap7pÔ0xդZkuqt˫5;5&A5 UբCktefg+/-4-@oԃ 8Y)BjcCFn;d˜F0!*ʀTvSB$ /(',>yZT';.+kK(x@9LPNp`C'q| _zNY.[~yMݲ=[v{؁cN~Jc nM` ƋxK$|ny.Prg.oXL-vaqvtgęN; ڔn.v{JG1pc_Qo}~Wm󺬰iAO8Kd %& S<89}^XNGȓm ZMNv]2imRblϡD`=dBYqo#lG5ƋGQv`Y}a7`; M^%hr%Vd Xl!iH0= ZN`89r'9W?g,3 $q8;^Еf륝?L=S r$21F'8@HB(ET0eg2;)@ĎKU0"s9znjQ SJؐ7.ߺ`IcY]4:7IZMn<ZYj1Oߓ¤rkcλbw)c/8-0kruepش$Oಁ Ygej7uq*l;_ XhsiVX*z&o :[ރgL'! 8=nmqFTU΅ەA!9/d]~zo`Slgc~A8AJRU4Aò`=.ǥۆ$Gh"gqK&++a)u&b?TVN-\\2wuE֪nڿm}G.t̕nܺ~ }ScsSSN~!{xKϞ?m޾zʹ g̘U5#c|~իIP@n‰מ =q̌7c?nc}InW;>o4:Szݬ!f׌j b |@aZpkGH_2`r*oW*)RfꡔH#;଄V& Qte5y/ЉQ:F͕%1`ME6Y ~g8OsR4Xf+pU_XͿ^4bXmIWD* claPgСyǾ-Y8N ~R` rW/4*[G-#JvmT}pl}H]+\ۯ&gmf5GNʭI': mƊh(ӿ,as 34$K}0[ф,%@a*/J*[-}&Ru4jUxʞ`YVޡt[N3.(.Ã\c<9^}ZZ]0%Lc7ټNW@C;Z^48VQp!᳴@/P$2RuZYlb p@l[ˁ }F1b=2?Lr] )ͽ-htn ):Hlp8se4XlǢE8!{-rg;*,ZT2y+,_zʭ7ڰ9ԥ߼zS$zjSԙ3Gs`mWhSGe0$WC'狮ɮMmq}>P(r9;slJM~b3-9J[5 D9RA#4!6g,zt-/֓m}0 kQLŽRGeXA"#bz9B$e0ߝ[p\0ŁeJ`viZkbw>[۬yX`VgVמp4nޫMpՊo׏Nު2l2XVGboىb .0ux^,/oj0h%!Lf[9a3ďq'S% 簠2`d'IL]2G\wPqV ;? {3-mFd毌BB `uV0w*/pN<"ou)O^vxEGvDI ӓeA4runm)wϣm\q*Ukc&ķĨ|z5[niU*h%^嶸C@'Ï7NwJ* p`jLJĬZ :xn+u/hZ5pE6;C],"kkE{ńad(@7! 1SAN@Jn*%\rvV|\pC(erXā(LP=Ua^kep8_9 ڪk7\N'/h7 $͆kׁO>1[-]t)#CzU5iF]# +) ɩ,Ud `H3 Jr^BRϓ ǂ :+zA e0c y'`菅3)ךCυăy^W4-#V ckpyL'‰`8RKcrQ3<ߤu$Y, '#%pۼw^G`Ak3yz'bX~1l>,P^ZBqpǧWX@T&.rpLg䇴AazY)Dk$3d\q@Зx0,+Xъ!kkĢ%H $|-$pӔ!c|lڬ^ lWtدwŘ{W_&@klfa;LF~ڕQ#)#uZR8@b%8v~VYew=5 -,9wמ{w1rgmN8 jʪ6TqjU[*hm⍪XF:QicP:916#ހn{f6Τ׫cq*` pxG6%3hn  I"nͅm "4&]ø)e#"vkIu1 /?bݲU g-/SdUwrpq^!Ɩ34t66ho~ڥ3hۼ}jIICFgw=F~>ɷ=O'NQ".$jYƟ`{xEV:AbL̀?%nabgSB@ԇvwL(!#i+eKLp&F; ;ATf~On&,aCz>^/J;ǁv-3a\I`7UvAŋWW!T-2=FIJFRrlF Vy%+_㙸8 H)aqy;/uM˖^1!)yd)-ɀEJl2`>5bkp1K0 >,}b,hEzw@?v];sO2gMV1=yGg0+"h}õG hb'މѵCɑgdHAbmT;r~ٙ5 ǏTxe֮,ڻfW#ׯ[pˊsrs|À?^|'~]vcBMBL][= JcۘԱm5!Φ9f ⧳$aZlm|Vj4{eMAe[?HVQ4ĭ(voydJSWEj?V.9j">݌[NئWa_sh FH{S"W$!Vr f?siEsAC;篟R_[æ[G o]TOs훗W=oIN{__X { \{,`m~ON^EԺE4)16N2%p~!Zp[(vFXJ; |DA@o!0DR#}x|b<bL#-!.*2:AiRz? !5=vo[K,J|4[",&,%ѱV5l1LXP1hָl ^^^㻂'a?x%gR Ӏ  ÑoK?`%Ȕ`hZ7A>ӮgI`r]b@e2ЪYSkd8HcӇcmЇ0pn:xkеtꉝk& \6`>+{Y7=fQ\ ĝoE ݩpLhȿ9Jjt"&)AAh|JvԼIYzاgׯ?/>yEs'=ԑm?k΍+6Z\b9gN5~\좒ܺK6TUmYYcU[Ns|}72.\^xESN;xHnݿ?|'U 15mmbz=Ao%`k  m&[ ViniSL&mV,^^3"JrV&l!e5$E,5kS*@K'rFv1L5KaAEh%O*M__:wBKKV۴ж=_gX@S+Bors{^mӲt}n7WDn1^KbbsN :s!+`WxE/ QNccK'\l#@x5''|wh[JJL0mCw$2 eApXHU8A_bw,$W$boOu/nwݗ]^=wc֋׹;n{=lvo6١ڵ;:#6`׻ ֟d$Xo.da+h6 ~g8dLA1{E^h:e@8*@K}Z΁'|]6O`ʝ""=GeBA@yY~J/R̊R8 aŠ*5<YU GΙ#A>MSЫrԷ{Hz\%#[5ґ/ɣ& L*[$]fe8v:>p{>l9Ab=8-),38OX# vtP"|)"m*)5z^ݻ1_[647hn|JsƋݼr 많6_:ogkvm_R\8o!sG>yLSff/(.\Yt}ժk6m_q[jVWTm\jÊ +7ZtY fM3_?;H'=hP+;1xZS!˦'bfހHci48 ĴgvWZ ٭.& Iռ0WkUTܲvVo_f-o۽i͛/9nd=w?vo{;)Z&΄F'Qњ?NksHk~0V+[[d۰\Dߨ1VN‚?4vA5AL SaJ REy,c>kTYb6e r @4SK+Nv쉫>罛vf몲 G;LJ|}o?//> LtX`}1S6G)]p>pT$>x<_;R; _|@e"JC@"CJr&-@@2>;+t,x–-<ސ? 7}ī=a[kN4}j6ߨ,W9^֧<~MgcÏ|ODŽ^ѷ{1C₿m}[#1b|ƸV L/xK* 08L>?<lpk- oOġsFm늋q-vP3*B-AxiG3}˩RÙ92CGAZTaYADR36cտy3Əп瀮_v+?{G_h|j".|Fcur}'9eBVѣ 7btnFVnƄ 2 '+Ș2#4xE3ʦY4s%֖-_Uz~妪5W_Qn-\]QQWYkV.[t΂eFne@E3&N90 4(66b̓'JyneAѳgh?T41.6J+Ŝ vgzZP8pb~՜ lQ'pnܸpjC@7oC8N\?y'nڻzú%+M+8h /o|Y>}ї-q61?LMK;rw%p%"t:'83> M av&ay)[dNŀp(̓/ǷBDLNj.3`/y>åO}/x쳬G_;kꝋVE"=@= n%83%[e>,eb?8/s5yQY#23=sĠ@7+ـGMjbƘI2'3ngg;"+o3sOvƸ饓fʧ/6dP8a:8t⅋ T_d²E5YfѢ ,ZV_^ܯ.ZdUp=0д|iՂ%sKUW|")1zuh!L{dʗzֆ8v8 q<"+(+^1p5i7q oWQDĮ2s#H%I4H8 LǛY9oIU^hsg.Xk}Q#Ķ ytk͖s*Mӯ~ǿzz? ❏_>Lӷ1iיnp3491zv1&LVIA!=dv$٭!ɯLTO%b.M`=g"X h(6eW!$r2E3 REvU9n*̤zk>{c}Տ~Yw[}uo?/w>Ǿ]>\;v>{-&(f\akȮw-.k0 {8&# xRta>iP1RG°#z3)_ksLI= zƌ@". |s TzQ >c( ks{ccefq?M*_͸^v_}S9V8LPd`륆zu,$]z ̖ _: @?AMc`#g M/̛jisW [7D/M7o44^tܕn\ijj=L5})'4~bvzacF 5npVaάQL]Xo}>n`ݙ7-$7>=wx"%^ "+O'%3bGKLu'Xk Pp̪M>ЊvX>/R3*n-,)cz"$R,&g{ .*8{:`LMw,ٝ^~b^ڋR^¼s).MKg慞_^_JUoI7VR W7^Y}yMonNykc[u?9+;.tKњ^4Hmi./6x0794^ve :lè:~|0{p\:`4Q"H<& rP3}GL ֒RʉUh+}p8kMΏ5Yݰ6gk]9צY> kc,1mQ 2ze.A82leRaV~5Khrr *i3ϰԭ߰}/k`` o޸.pCC)|ʕ g֮tfN<.ca'Nɛ8&+7=g)3sǏI0vƄӲ f- /8}Fv{f.*ZU6tii/XrBKՋͯlRY ^TQp~Y3N+ő¼5j7o'Q7ǛT}sz ' EAS,A'X@ӆW?`Ao}fC1iYIrRGĈd;Q !$N jK3`Ԋ SU*ݺjkz8t|+gv+}.7\>{쉋#{ݛ^fAAiq}{?Ovǿ>{O1 DX:m Z >:;:-a#bH O9h_*hR| +pBi6ko5m HRfA~_Э8d+jotʠ2XB 9~oᰔ3H x2 ѠX vaj/ə483v^3۽2啉/V_ U}f퉅'+/T^(s=Ua{LZϬ=󓛬Oo?k;oqm7kx}uWlt?_rl˕>cA1.,vE)f2nS˘ZXF뜤 ~xȒܗu> I/~47`T! $`,SH>c>~@^X0Eh\ߚ>3>ob10pī5He?'KSsPI">A ?dsTФ>C@-V۶CFa=`h3rzuۚMW72׮Y2xVM7_&jGcF=wڴLʞ1>7{DQdN>%c)%S M;xrgvaQɪ%K7`W,,]6ҹe0T/ZtE gϟ1NE \Eŋ[|e Y`ToZ?6\ ⷒ%2`0h2Y Ȃ\p,BVjK2dc'0.eQje(CrV0._c4PݮTJY_YS1k΂ťm\fۚ;n޿}箜zK]X텳rs':{NX{Ւ5 2Fз_v}>WϾG~'}JR NS,>jp'?Mgt]a_0 }a; Q[v)D_a~p߀`(hR Dv=gfARBmq'qd?aB?;gh #՟D3lm :orqASwv/UFIzaUɯlL|u5gjOp+Bl V ۽ϯ>vϋ;lZ׋\zuxj]0߳cPn g/^Jp8UD\6*Im tT-}31লvBKsrYJ!~lɎRh.[H`T4&ua@Uڸ .yŋg.Ϟxӿ\<}CwgM[-9~ڄc~W'oo~_{]!Hx[NnE3f? r?Q7wz/pV0_}||LJ>pL8 ZTq]n} 89 Ezv_Xq8%\/o9M.3 f JxB(`5j<;*"OHy6|OmKzeK襕cU>^cb'Wy]yay+^kǺֆ_~ak;S+u76&!ުwˇ_>v{v|[T .;o |jLf;*1ղ@R&R Alhgt#lyVJGFrh$Z@RMNSB>=N).0<09 @MV7 ~:'ֲ1Tg]3jtC y*$9ѥ37Jh@Sǣ="e"'j(?WuG;-'{12Mɛ3x%E J'LÚ=m9@yeg.SVUVlAeKT,(\8oFҹU9̛?|QE N35#n-CcX毉OC FwXŕۢpO{%@у_ DeVTgQ 0[,ghWEq sWS;zS9fObYݜشn ?m~tSGN\+\:y'y]֯Xjټ"^7hCA߼>l=A~JV^=Jeڅy޿M<ƣ5TƊj[mvV-EYj (^^a%T }/lLSFv0CӤ}#X*-(Ge範?O`\KęXjm=r&Y# "=~@tlKѽ3Mɜ7fcRmT>&u]O61}@Ptؚ F"3)l z_\FvYBdeJ6zXU۔PҠo;˿}pȼ⋧O7ݨze槾JS /]qzӕkg7zȰf =qЩ 0<8pg޵nSGgO.:nI'g5kҤɓKL4vli~̉gOTdK͞6dҒEKXhӦ,/*W>oFQŜ+ʗ_X,rb%U MΜsV/][oavtU.Ny4&z٠.J I4Bm^=xH9hp2K6WHH?[ 4.V1 Aq)`4@|PZlTSNG˙wym9ആSBz9:zb͜W/+[b=u~޺Sg]w>Woc茬Y3&M>N ~ XQ)1m.KDQKO΀4cQ"9vVx"`f)d XĂ:ETs&F-ٚGMMj6sg .T%{ )!KG>5b3/Yg$7=>ks:6nmʝ*Os)ST!gk\1EW, 2RߐhMϝޤ׶{c]t~dv~tzdǷ{z/I|3?m0#R፺/ ӫuWQƻi>yƹSrYZ6bw9]1/׺:Ժ@{Jt-9T.fK*ͨUIYPʬSũ42מ*h4v)M+S1m5/(WP^4jiLjM`&dg 7./<)`dVCxe: 'ncB'LYΉb?&cH5}6&ʌufULFP[@5f)<0Q]د@'KҘ@MZOLU+$H=6]%|۝ l9tz~#~37#O~^J;`^[;.՛ǟwlno8{Wu6r#z{Dޘcw쫓ןpb쑣w]|Ͼ]v]Ux)T.(Ylq\ysW/^bay9eEŋf.3r@)Ӱ]<{^٬rA`L˞5v0(/ЏUwHH v'{9erk1RXTo.97b\pP HgX|ijO]i"!7eZ,}ٳN٫V-[bkU <|b/x~ucRn]Պڅ g7_=}6 /̞7l΂5mT!oΎwJSh p `yV&H9w 8gfbW253jq~K C ㌄Sq$=)I-h ~p"O>F|v>K{M#+N17 R;@ˮJ4<͢R&6_j9N/ , v]uGD^^`HIyeuƎ;?*M|a݁.ܷs^>NorG\]ԶNxG8:]v[GWBȫzSr'xuIma՘!%bD)z/4ZncjRB*Z1@L҉,r[<G5rRi0it@R+R%s g~eO߽ISGl6h驽,ɺՃuڬIS7]ľ3v9M6XfҢ!~??}uVCgeN(?V鮭;-]Hk}MN`=%ZCu> 5H#)A6e}|"{ Ar20aD1$zHp"4yËrlp|n_+ i^w͘h7%miH<>5PH }FsFRF톤5ݩ-U7>5&=z'pDS^\M{tf۞EGu~}ɽo>0N)OyqJWj~..􇝝6兲NON/E^]~LYWWtzuݽ_y4gP3G6>~G~wG*֨KJܡigK k$&E [X3Nšބp(ƚOmHPM ]t~X>6ښUzuOR'8M;8v4_oqpڵW~5sO=ᗎԯkеTw :.7g thNP# 9}Ё'//.*[~]֏>XS4lu25՗Or 1jY߷<& m)2u 22,=&gi9gMϛނn0h-n,S>dg&9)NC]8mECY>A=Da>~e a%#L$xX{a [=vF@t_фi5sVW/Xai޵޺w9ԡ?|;l[RtIy#F ^} M_=mɴ u+ORX!BM79j))wz_8_uA5;lpOÛpӂt'fDjKЏ;Hy֫0eП?J  ÊVҀ!*,%Ԗdmf9롤.aĨԑXg8wL]c҄ui*M?{6_hnڜoIty{8{7{{;Y?#LyH{|ARɾ{^ȹiNLzwNj3;<:gE{O{^'}S>~Yff1*Ćaq[cU3V lUmihgc]G_[ۥnUmαvw%kpticLwXa{4*.IkMԨg vlE-Y7D9Hک}ĸ*r3L)`=u F3=7<Pڋ5!-öOc(:ϓ9VO`cvU?0hf ǻ}Z׈7h2+ Y-*zRGV+MV]3-1I@=,Qeǔ;pFݝ/& tk'/]?s҉[߷mtf=.+W/ع;Egn_Q hn<}5kȱ}7y 1GvP)ӳf77/..g0hԭ݇ ܼp(/UKݴGdfٽg9 g߳y6ծZjC+N.//9)u+YxMw[n+,x}[M?y\֡ݷkFA&fNioy#M^o\'IFQ5wj͓"c4q1Lk]l(Em J p> NzҬ7B :/vpDaϓ"T5zzW}byuK7W^aﺝ?o?|l~UӮV-ZR4(gR态>w3`pڢE*V--]|ܵ%+BmuNK XD=Rn5n0A`2F `q\L$ҙ6g/d×sFgUyIpSӗlquagw6'}:s@c wvUbxc^.Ai\fԹ'~S_yM}NbC_x:IVAe}K}YUyU˪GTI*plߩŸO,Q_uzU)/.oRGUT}1=r>J}Hu'9oYe]:ݣSmn1!ŬCOeϫs uvJJ*1W,ռjgUU?̟މQc}*NTê{T1;jVgHDTU!J@kxK*Τ1,Jt_t":đY*Da/ۇtP3 r8}MYbYN-.Ȫoqq&\;%Վn̵v›'ꍵj|i⠚5YjO_~`Xx/H^iw`٭6˒)@8V("q"#&X hy>Ns[6e$$l|VG34zގ7~knzWNonl>gSΙ sF9qR¢]l 9yr'+?m~9^Qy>^:Itj`mxǎaPaQ|p1Di GӍ`b8+B\ILIR!la])C3٠ Md8^/Y{7O)_YWb٫˗nZjSUݮ[֤t2{α}"/߿Ϗ|: 9_'>=be}#L߫T{'Mo>pڃS?0Q?5Ǟf]W~WS2[an4zZϾ_U,?'yj֣>ygRC+}/eï{ KVO:ʙ8жu,`_ mdsǷUZ_Z"4&%]W}aLc17@ Nk`?Xl&`]Tcg%MD9Hd#O`gRΙcO%8_}|X5ouUy+sƼzV1 R/biVjS(w؜?:E' 'C& Ź\ Z1efNcnxO/6qI񷳇N4_\po;OoΞ럗.uRsz?wpVmXYX_2eZ3N-ZT4pb>ʹe f=||V pl55{q]c9شf#O?tqiO]eUkL)(Z4#ws'<8m,E9ߕ%P?Q`D'0,Ol:9;8 Af:԰?r {ӑY1eE1z.G81eLmHވ-U*W/XfC58qOkXӦek*fΞ3hoY1s̄8Xe_M.6/\Ӿ]&'ggϟv.+jtiq/~Y?.8kᣖ0sYK귞lPW>2|(7/\|yU9.{iصvM6[R'O|yCڂ1C䍯7,gܫg3p˕ /]9㗬W[,{w̅Z}KcWk\3wgf@ׂuWV>ʴv^3|bn3Н{G_x A-8{[T{y/_߿[\9xNqmVYTnЫn9yFj4>.VG!p6CKd_弰X-~Ji9ZE6a1 $;xJåvHߚ?jäslyMcڜAu x XoeuƗg$%PF7MEG Ud2@rN CCJw=.73;Ű\4Xvp2lOǗO9?_O? 6]=uڅKMkVOo}ŗW.7j~\9uP==!SFgnsz?rda@s 'NM<{ĸe˖,3p| --]<`vW=s9 Κˎ%m޺˶ +V,.)ٽaìI3W/Z|؁aQlނ)xǍ8dJ#ɮdT.M'!|Z)4FYFmb\[rSixK]|ΒڲKWmY~ ;7^naeu+JʋN6zt}/2lI~Υ{l/ٶpǶmnhS֠1:\IrN;'W `ul 9, Oq ;#&lIe {tji6{Գktz>j'P[p$}zߨz'?P}k8zȹ',Ն+ Me7, O/MCO= >*Լ߼\̭?oZ'}pUI% }?/?yMy|k_|_1#G߾wԇsvƒŧd]2Wshb6~ա3-nխr`ALFq68 @S (_fFgf>pjM ZE"!AC8n<~Q_dEUlHڈu0^GfOu \:yupV}Í]opcg*oTGQ} ߸' scfL>`.VœG̼9@ra)7+w: EE O=dʕeU-5l3f[V[:p36ϚP5 حcN1 dk<rF?J L7y2po`jqi2@DѕSKH2⏃P*!Il~Nsb ! #vq>lV#0J.a"V%l q/VIRRu%zl=1œIp';Jrg^Rlx]*\п}+W,)]T;|vVo P9cֆW\}icu?lۺ=zjuFzr#?S 0'!v@+gVL`Q03UlA8 RRj)jq^E;^k6V\bZ31v+L͝*n{rnv]/;㥾{zh:} 776\TZcU~]Iq7 >}/ﱗ離ޯo{m̠>汲jJo\A7~X*'9g}yw}zxQlSjVٳc[7+yFnSݾߖ|sk^lK<]nw{f}N?Լ?փ?m7?&]jQEnU(KA!6OiE i&Lb}["p "*쫧ʲcNAPy갭#M%' 8y>3} Яr܀5 ꕨQ{5AqM]f@8x  X/r8 8a+K6Q'JwXK"˿gL}l-[ll=Flj{rǎܵoO]k/6_ojTi\X.\Uҙ GK'Ϝ>t_vi^~oHƀFHM2>gDl M1d0ڼ%ŋOƳEfN? k Ƞd,@Myueҹsffͭ~a Z|YV_xr<3Jg,*3{’[w'u+/X/"Gg5a̠ѥf V?Ac( &@ءCyGXىo煵e [ZD1.Gĉt30ݮV ! (q%x~(ԑ =ΤdxS]o[|9kڝ7ݲzΒ sNg(\<9aљ%ݿrK7{|ѻctv7d Z? 8ҝ X-6}@g,/IKSv!'8ίI$ ħ$8EQ`Ԏx|Ǜ{>'^H3<6Ş/(H~w=If'7ipV[774]ky=|߾Z`k 'nqP CI;Լ7]|9ө{u=I;aJf㺫YOAWH}CT;yQsv_~[mM]7MJ;Qu߮)x/TgN!՘(p MNn7-l`}%Up*CaH)ALr@8HUHI86&[FLҟեo>I`>PiAY3V}Z5zJO>Up$X66`'/ۭ"eL2+AʱL Xɠ,ŠGH-(D$.Fo)<#wDОw1{W_ye:xi}%s˯Sm5dHZ06|& п4?}>6k28j<^v^A3 gM,eh%J|q1XJ\g30}T7]r"K/8oOb.ݷW^tn^|Mn{_QjѼӄ. jʺ7V>3Ԡ_-tŨ0ӯh[{gSf+9[xN~O7-_׶[4זG~Sŭpv !e~??ҫ[^pyh8O }xGs>9T[OFZHN5/e*-l+QWnq =K_̪i/W)s]qe{=tKf2Ϡ5sa7{Ԕ'1ei3GN8{fÛvYa̅3dIOK/{޶iQ>u7nnU5vkZ|Q{ l,f6Xbq*%n>_jT@_%rEl _pqIGc)+}0#Fd\9c[ &h&]T%DO@TXqh-"c:ͫ"cuۮegZy>Ԏ{Hg??~=2xh<ן{ o^z {+35׼ˬ?X&`[xOό9ksv9umrk~ڑ'zv|vߠ;?2}uN[3甛/{ix绿=w~1wOot9y9kX5 ;Bv7^=-yӕ/_c*_5a9K&&Ȃt%usEYWY1>yNIė,yO bu9~yeT6 .&pǶD\{6N/ئ&E#|`A:gs_D_k1E`Zݗv1~ȑ}O.i#' =N@G{=!coS2L1;-_7scm\~IӆM3f3lʒ%5kعg7aUs-\=g=7/ݶlʕWZtWmZyǚl"8>p}߽͋6mZcZs(hkŌ˧/ٰ`-a,[?ku"4w=}&Uysp܆Ba,uUE͏_ףCf; r:R6|90`Fx`9@P@LL$`2A)DCYG?OG=IwImaCFQ`M4g1Y:v_ CSi/V,&Ss.M:-]K0V?XD?< h,&p {AwFH|N; VD# 3a&\ܮ8cFn3LWeams7._Ӊw;>v];{[L cSWLn=KnM߾'=/pϥvwL۸ǧԊ{{mՓmb:b겆_~|͋8kȦkoYtu+yl',o~{teV$Lھug?mo㙱/s nؖ!s~9/M_yo6?e2WQ*E7|^L s]dؑrg+?Sްѕ;=Zn½wxK h?ވqË'e4#?iN,#.xPF^8#} ED-'t[J N?pp"(7p~{?ڴ/NlDj3`2Ŝ>ԅ?_FqՋ&?ӶdiIT|Sضv?@<8 L̆q=:5bﵻ+вKy-ym=|C0uv}4jɣ=~Sᄀ?5za}F4aƨK,[8aќsf3o9#>k,ǚ7~Ѳ髀܆7j X>s՚y/'&زl_ڱ  a-ov]/{qj-7v|5-ݺsՎ־q,0+q)K掙`o[~i _fqHpX,rxV%@rP'/9%.HDY!$iPK4rnI:mxlamBx>9=GW;``oiΩխ֥ALD)Uh@ϴnUKe}:="4x1@?XF";1p >'~GG* xƢugȵy9s*mtSKUW><~GˆoGK^kCA'-}^6n]W߱·^w܇_t?5\VX֪..럘rﳫ}v-e(z+/962dCV|/Zߥ-LE2wq>'W]kSwMgMs{c>1ϯӫG .6`yߗ+*mXM{IڛkKnǯ h<%d_ɽa9@MR GP ?lYǒP^JCH4j5JC7n P:`T اj -\i =8_0L%͋[_f3i6^O'|3hQQٹw?K~|ϰg̚4ˆ -4t>c?==yl'F4)f7isƂր@ '-ݴxۚ6.*m@lv-ֽ[ۼx+6Z m[oݶtym]3{PKOZnڵs֬w۷,ZX9}1œmYCpp:7=pS{gxp'nK%ՊBgZs^lx1Kq@7 pB҄0"V ιEѰ 4j_"jpVLս{S=Go}Ķ;rW^Hu%k{ƶu _ñk]&s!&6ZSgT( A@0AN)0 'ٱ +^*Q8ZlՈKVf…CYKZh #=$Aa'TJ(d4wȗ 3(2DH-՝dD &Wv[QwюfWTsޚkONG>8}<}vK ?7r0_׿6#8lM zpշ.W]7񧗝zﯿj2ͬhE/φ9^3ڜ-Y?N?3y}=ǎ=2r솟׆>pޤ5#ZKS ۟?{ړ}W]xǔq}6fmw.xtG[ |?< pM+9}XF.uFOؗۉoG۱o$q}?9qW6|a 뇾uݗ7 VGºj)Y`8+8]<°x٥\шaUlRbU"q0CC S5 @bEg^06dO,#Nubh]>Т!:<Бy^3>}٣-1^1&+\ ~.dee^CDi>@ gTUT20[p )Â핂T.M10K8cjƕp<[0Php~<ӏ>c}끾>CG?ecg/xŜU'/\4mѲYV_~-+<q߶lk[͸E]ϲip +v VZtE,lU=kl-v.|mlZ`Kvoݏ5n˹rí[̦0:,RC7Sd 04jhH-1iioyP^09=pR\Bz R OVGD$ QՕH&I=Q fⱚX:i<5$d2X^&Bց$958Qͧ=z jJ- C˘i&D_B2P|=ygW˶}N?֡^9km\M;_⻧^tﯹhJ. ڡSozx[gz'];[d.mi~Eni{oU-noW泯.kެdzS5N]ÐGiqQcV.i{پԝ ]ҦCHy.{yۿ}c^S=A)3ُxN[=51WSy]lW[{k' w7LLx^MpV#Ù3{&^['yj<6YU2vw7!iAG?^P=p9[ŵw gv̯?FD fu˰u`(G(7@p0 L"Z̙$L(G2Sb 0vtәeO/uj|ɕI֌=rԑ%Îʹ 9L^1(N t qcXfdPj2[KŲRչm뮹ƛڻn/^v7_y#w=:c1n W_jsWz3부_~:,lo[xp&6.޲aیk_ھrj,HK$nL*H,8#@sy Rs`lOmmג"z$ Yb!v9JyHټ.W,nf(rB"vk@崇X8P pk;_r}[7[>o'掎ퟸ!n W^yyvovV^'?aU^$ܼ,ERL ( YZdʙâoN蛋T8B1Bf?%dWp#~x, #1NC0+1=iV42ECH$6F3vQoFRtE"hJ er:Lٛ\h2Zf6 mbzd` t10wJ2 hڪWVZvݢC+ꞵFi;KM+.ֻ]jew8i&ԩe`ӣ/z95^r[WV"hMk:wmE-[[.7%}5Ww.|SGR]i2ZtVv? W;ޥ.{g-vӢll K48WWnd/jfVyS:Jq'zRo:}g} O2nOonqidUr}0cHe45[\p4/wy#l T;TE91r[ACD2@ f#@AoV(fp0Ns(e1Oaz(sf;aKpˀ*h4Sw %>a* 4ǖ8lx}0HY{`꠽Ӈ2k||V@| XLuC>o y]@EFr'"Tfiq9jL5,b >LxbI,v>,_,=џ '7.ƻ 9CODC1l"m5omf䴚]rX2oȡ%Ctuf-*ckӱE+νyP{3ts'̚8dAc5w%y &PرElGYk@˧,gZe+S;O^F- Jpbm*D/L~~Y$ZpR‹HtAM1evSTjsEr.=.jb-ܸՂ/,JѴ'i3y[8Uѳs'/qoFp}¸Yztk櫺uKuKK"%L]ZpD*yLlNf&-pNN@M,BCYﮬhA&L(t 8 I%iCO܋c@&rO22 W)S3лoȗ-xlc`sm&瞟wElލ76w1ѹ_u=v#Uӂ`fzbnrR(3'|S>+˗]ޓ~>4l{5ڻc{]˷}t_6|tk~ ?c!~i8ʛ51[f^?ߊ;hxq_&O_?l^'z=m4z<;t^OfpN{\tsUu{j[|7Ƕ]U3mȶ![mqͺé*msy7:_x[m[uy_}aīZ^rq;:^ W^["1Qqb89sc^3MCee p({D /ə 4|-@2&j{>2d- ^sx8l-fJjj1Ly a?nD97 ׭܉[.涹@p !,M X? Hޘ掄\zl3"e.(uXL\2Ymǫl&vb*rfl}\$ݶ/>{QOЁO h'};}G뉧5װ}FN6e .3a6^lRY+\vu?YUs5XE|h3أi_ Z+J, LWρŶ6(Yi_e78qo0m̒9zzk{9xyP߿kxԸ+/]|׽+}Gnpu7=qg_?˗_,?hi>G?W~sL|kks4+/cGM'?5|f~Üo_Y vԦ o{[7=]YiuӶ߬;Hy#f*[H6=Wvo*W3{_y&tYX˃^dw8g;>lv:>ұ7MFo:qa]hbkEY> ]Ȯ03(C^!D; q@TFB,xXb MG O-yz嘷V{cSƜY?ч >yiCcN$[Mq͋Vf:>ﲃ p151`S\Zf5[~?ǿ d4Z.QBi$,b>S{eJzSJ gJN."ʓ@c>J6 ED{7<av,>=wjBCp@ C8x"|?FJ?ӫfpHiX^]f粙,."≖+5=.ƻn{zm7_y˵_wenF{]Wv &ht ߜZ Z plX~Lf\p' `1+fpĨ0JRځ}x-JNm #IRVa*2|E V_$zYIw ӯ={,ռ_E-ݟo>|>g?ٵ KGug7=X@)_hTo=nw[GGp`5gM%.?U` 1A`H} 9B잣ֺs 2ӞB! ?{tq"dq0n񨘏nu(SS`(yA`׿>9x'xSƒ N,,0g+6}rMfC i9X "FA75՝ue%CF{@H`2841y #eULanH*& '!![ņE×A;btVjm?'e.c٭K?<>pyNCڹ? DZ$Ҽ~Q]stg/j19+0tP4ŭ%m(`jA!e! w؂p6 ~Ϙb@`J!( V-3/|鲙[qi]u*lVwo~gU^Ѭښb&&KI8]BPW8+>aO8GٙI\ jQd@YvzړY_3 O"ľX4E#D ҕAh[0*`^ f3lXbDz$pr@fcϽ/{ ƶuu?Xwjxχw}Ky`ɲoyywfߎ6{7D(**R]L q8*ϩ : tpϿq x|eG!'>%3C}SN/Ou֝C5燷~/[*us[^{fY6O3ݏf~kkV7zqDž7z'9uݿKfw%Oy2?3`py'c5>̴Ni9,w*SG&u@pB )2b ?yH"(d4vGz@|,S C'yUfZ9 F%ٯ( gp~[هh;_3o,szؓF_290kpkS}uҐG|фI6`Fd~{- 88 n<^+P<ח/jBA0A~7(Kpт 5w/\9aF_,1UГp>Jc8&(N|܂`g`z1Y0 xd@4N0 5$2'ag0Fd3/c~8^n>['"l"K>8I~h#^,v&k`v6qxm>{i,0K.d%0'$*04i!1dRXT kbf"`pS:4YaEE0=`{RO:Rs#w<އškMu:ӝ]ֹ-wEf\I#tH-y ˌ`<[+\̌ҪVѧf$8TW#p9ME+$V.~rd|ǂ͘TzxHJ`'rH,. ~Gn?ףfWH㓦iwg'Nm~^^ ~T7?җoxQ,w-7s?莞ӟ'Cpd}bDð[/Wܦ5 >aϾyg~;֕.)yqH-W~kI@nC|h\5dBiKxTO@p4+ƝZ:GNá >L|{fNȽɄ3yioo ]󹄳ÀltZ0DC)"ҵ&{}7ѭ⺪+mͽ]Z=~Yuu/<%%JX gSv9CLn򆜾T8ܖX[BstB|5Q-fBIjX&--2)8nLY968?Gh< = Bs\2-&G3z\0c eEM ~Zxw8}7^ylĸGi.?wXbZ_; o;~q5O/N~v_pu^rQnF`}7799聾NO}?^Ï_pA݋[Kۅw2)G?[>س;{lQw}uG 7lVY7lkH6G[?.Ш$U^N\tZV!iyכ8Px$Oc7ygm6|gq-㵵.H3b/4" AD;Df ]-!S(dX,0B KUg'Ǯo0l#ȰĨ1P{.Ֆ(@Y3 ԒQx|pc 4@W`ϴ:`FLG({y>ST00-Dw,%Ч$0C=!oPtRB^&E$!gYyˤm| 1֣8C=eņ68Fur$8v7,nMԕp4i2y '#Ya_ |b7]j#1liK$.~g!Z|JS_DL%f-7!|B,X_f]l{TI* l\L?Pؖ/dpX-9V80( vREH؄D0UNIQ8 aǭwo pd̓W\Omv퓿3­oM s_Dx.iSjӚOZts-?j}49oFʿjYIO7NflOj $7hv4:Su;|Y/;N fkb]*._\b=N-j>|H[0pv+5A2C9[,Ip *>aXmldt47pF#tZ"Q! RRܰX&`zXI Um6jŭ cSjA6Ӹ-^`,شp$q##m6le.8X2'6Qݶߔo?$fUDj6AB Jslp> f+#Y'N1DK@< ʳ4 -`1 ݎE3BvaDsmE.&}uKk2W4yu{\cQTAX*+@p39W JDXX*uqU 1, L#{Ѻ,#lm8M?WAدsMZF4BD,  &-Ư=O/ѪXmfw۞Sgv*ix?Hg}a[//^Ǿݎx}nxÜU/?ߏ׾̿ʝ ?t_@!}7%y|5iSf}w~6|+6KO?>xtzk{>'.8̩دgz-w#4|qᇓ7GM׎xnf>Ʊa܀YGw׬GN޹mM^[;m+}s/*~V\+ZcϷYsNXg"'CكءHtˏ _7?>KUDЍOjOiL7ujrT66jTΰ#!][})49%lbMBGK03A.*%(? .6@!6=p)TϕzQvsLvOoƀCsX8[= '|ch7YOgZWNcsZï07 pY}n[}a/bp Ū>gpW59^=e0췈`*VQjMA aJ%geW x 3~12('l(*nL9nҝ`~m\vN>KJ-pDJ,$ śB:e64&-\V4@˄Ba3ERq 1 $0Ir@ԃ EӰ,"TȆ +`ۉ\t#I8~>g]qjN2̮7ԦSec:%Yu[4K FC1EZԈsn1 0#4/X.X3i.i6?Ųg56srnO%}ݱA lGR"#tp:ȖLM/u>jO6\Hm]E?+|_-~aߝZ_YT+>wtw=G5ݰ1pdZ͙PYOsoPhLFK<}?aҀM}Cn޶?owӝ=;]tx9C&עg^_[~\Y_է׏w tY_5'zvMG̴jo>'ƽ?ӏ<l=on7o7韯oӾfU/^M3UmOV:Zhnwx]۽S-߯n&?w,\y*Pb7uhF97v5#vh3֏VpD !iјHz#@'(>?{$ y?;)dK-$zMt xؔ@DPcY0zuTaHz@/Etj۸c ߱2C_8F:,vA˴6c_˟ R./a&08;S|lG"ċB~Y@4/XuSb9}T9KֺkWXcOU]0$HH88}!zd!=3-o]:*h6YmZ]ݹK\c!`pN@$` _0 FKeR9Th ›ap2ÅL4NBܟ8,e~S-uM"ͧ*D&ĚzXiaC)%e[~[~SLi\ݺ/ {}?lmw_hx;]/Zoy,pqݛ=G5χ$Zn+yvwsÌL~{ W?Un|`Cm{;Gt[5`ѐG~>|}3==lv̾ ?d__|s_Y%IK}m? \cc qyZEmUm;畖]_l5lfk/śj#t[v{ūwã{r+[mMi~{v[]ٴ;׻ϟ4~Êc'zm{i_~ѐq]ws]\*+}gnrG.yr}[|wjX}K5?mө?^]ˇo{NOZƦ s*f}熩jSt}~`>dӱZvUgr#.cd 3Ÿ.cWgG*GAfp`tf <` LI'_^jq)".+6Um0-Yv~q \ ;j^*@Kt)J #r^U*#5Qk@F,KXX, ʪiYm|Zc6LSh~ [!ζ[lխFPUccT V<u7)Vߜ|Ge㳘3s>#?왠+ *  wX cAPz6G]+|.8ÀЏ[rSL˯s9~mUyfN55]jvlpG>."QC+t_>934isn88O'OcMП%R:hR${ENا  `t"Oz֝so;éSUfs5O+z͟ʟ365⪎/gǸ[_wۋco^;%clcMafE}Z{5yVW`⎗uɍWx}[/hss禚W:]1s:vU)ӲG>m˝VvoiS2*i_djgt5Y6/3ٯ0yzM͞&E%+Wx/o⹬d;-&&E%J\=L&&'xaBB|00iVzluv[Lp.y shGþUvXJ\o `-υFSf;}qˌ6NC}N+ir@@isd$"&'>zkZ0!f -xf xmjW9hAL)V{]Xl^;.tqɁ(F3G! ee+eх-ӀpjNQ_B!KL"8B"ral8vV" Yf,wXN('^_C`xGŬ nx"q9a]U\ID*:$IvQ {q7Q'6x܂4i5HO  ,eDt9kD!"|ƿd F1wy# 84{Ͻ2]ym잝:Ej/Ahmls[A~ٽ@bG#B*N*DBd!,dbzŘMˊsOօTz@cdBx1`{ pOwP^ Fg:|M6%-1-=TP^e6h,QJ󹱄0͒8 HDmpY6`zV{F~M-N he%4Ξ814G`Hjs|5O&;5m F%8vv2<P2l{nZ :|bt&[[v)9$=#,Ц.'Bd!$}QƄG(ihL}4 KrFF;#gZG778akYǟnbwDj챼=/ %=j*V"%%.M-Y SSjJ[-*3J,AC|ig*5"z 2"v{L&1L4T",mbLp.2ڙ}UWx$pTkFRμda7gt|9Ttw:#VQu &RoPz@G(!FGd,56w8-˩/l#`K,ef҃X /(Nrnq#Ƅ*;TW  <4"d:{e!@jB,K9?6MA1xømf|Z/ (26ޅYeE | ZQҧ]_,t4v9 1p)͑^OPe|BQ=b, a1+^@88^\fg5 r k1ʷf4X8z`uk -,ceVP˙Cs`\~F~bӯJ 0xEF*FгAR.BèfTW|"|*]2:ȉƴѲ8axR2%bH8΄Y6)gcx׈L2^(ҵ` z(p6"HX źH&%qKTҀIӳ[Q {i&@/0$˩f*]g`G挺L ݗvdUMe}UX(2WgWkp$2z67RD0qg4g8` !lDau1d0 ehW> $]w_Ət88FX ^=Πce ,T5\Lm8tO  h4#D_7pv8Z,8 ͚ud9Rø_f(Z fLMzwL,@c@?6f }}3>xߴA'L)|| D hU3[l2MsV;xRIʆ+`=V<]tv86Z#UH:0a3JJI* }0'Zd|gU)ʸb RN>M|W>܏[<$||k1b2:m`aE_V.%\xNW4CSv`67i 'Ñ pT p89-{6;$hs9'"6r'Pfo!e$}&ëEᦎ|,rF45*#;(̋JX$p)2ú c ?v`.b@A]N؎ˏ# rX &,M"(΀g1qI Ís^HO^ > ܏m0D:QEJбP ( p(3ꄞ3BT]\/xY<=\yRBX 磁l"\FUyE4O֕jӱ; :z:y"XyQ FrXe3Xܓ UT|2tܗhXė]Sr0 >?NЏ?XRcb-ٍ%ndO,c CӬ]<뤂wYɃK@qB v؏mΔ&9w&/fJD><U@ﭛ9﬙q|C3g ԁXܹzn + '" @,@+/&#M S(X_wKdwQj>$@栯UAc_ž02: QtT5 X,&۴ @|W 2 Xc–CЍ`"2my7Z x  ńAP q< VsWqm\"r"_hdq X~`1}Z˰^Hð%UdQ.jjXv0 !pyiȳ ?.ed* ŧ")lGe6yHrqO5vp(pd}WRW@P,c7AH h '896eTdlXKq+^Ry€{pHUƉL6iTry>YWUM@6UgӉ<&'qTqd2V ]|;bvxm^vR@#m+p=Ph lۃ v㄁vYs 3- gnNYǐQx1gʩ@WO?x#W'x kdJC( 1:"@MJathcQL(?@ ǁ,, î)B6,MQov*VdS Pl a T^R$ ~y3\h;noj`{Ԛ@*RK-0J+@ 9 zDdUCR`L'p?k`!F< >+!<cR<bK$< uw[BrጇD{Ҥ2,vkp ы2myY/_Ϻ~5:CFq1p5rHHmQ ITQT;@_+ʣ!.BExe LGH &L3Qm E++"E^B0*DEy,lAjp+ -K sD-@$7x@l.hUj 4ǵr?@?.OUu֧zb'▱ , tpGF9/'yWXh8%@< x#8;=H>ycϒb&o'A8Ӝ!-Q8U$pdg NKgP@v8 wCp<:77`zc7O>lұc^gݓ> `l6w_w60< jz"wr+LrQh4X,f7[p YY"+hf5]˻$ic'_Q&Ы,4S 8@Ҁb4uQK덁a8<b .Й RxԂs WDB?Ɇ6>TʇH'8+ 8QшXB3(t z,RC@#  - z}|wxtBz힀 _ۧq$0Zbhh(Ͻ21 ?-DJ^A@kD4f,D(_*ΠMqH8Wa+RHL<@j$ t G E*)u!y(P!{j y:EI;1sA%x$IDDgB/ _8߂GZR[Eq>Y]T|@J`G92wb܁0{8 L aL$a`قid>K/"X˜ {>xZE1& I`&xY_<2 (G]`%Sr6(O2)tCc,zKCJ<j~1 z18/6ʖfLaaca #JZ:7ӣ@/V ^Jz}ejYT)#OUf,hY>Y&)= 4=L6W$bw8& bxM~.= t~4!XS!4cx!+- & G % f-lvׄ$al03]BLDf#EpvSO mʀ}3u`0GxYl.Jb Lhqg@h!9J*v.0FoT_*dnNE ƦbwG52Wl)a̢T(R7BN;^OYl[=X8<<^ĈJFH0D℄]Th|`r/E:!U?Kl dxmQӘ C gU9qPO䰲qcsi $4ewU2̃H8Sܲ?c|`ɾ mvs\Y'jA#db>*W ] |6C #!F g?.?F3xG₀IXQ^ /G2+< V*Dn`$hRZ0 ty-dDP Xۃ=j\b*N0)ex: yK<@YTBZ#E~OT|H( 5o?ft]\|5*9_5r9(V Ԁ`cks剪[[]$9Oß~LOY$E`'1A)xN.΋H}}ARRПʾ;ce_儹H!<AF$H3ɦK&^4ļ '` :`4n^'LᲲ( \N2ȅ$]?}r6_ % 6 ύơ+x}QO|Ebt&+x/Ec/,efjHpVSz(-G1jN.}Ui[",Ggְ :e>8FI+Aq3x< M|GUH%peT7T*7NqذZl@PI`')aE81\~ L'a!B<oyCgm,#qALTnU+hG-v`/OEҢ=nSN59Q | [9͆Ь#!1">r2L3$Y|5XC߇MvqC_ Buh$"a{V OM'J X9~܊JhU@4l\,xD&^ du<+*r9t"KW-MFV~>a!Z#E 6W2?s"?w,ܭL4-ona `?d$p:Fx`:/JW2e-^nC * 9K\XTvEHɳ"&X$xp4aa0 @ 5kx( qnV47+U0SXk@|>j@˦:ج4V F\:'}~ē', ah֣nV<R}Xvp[v024`7hӖWjdTIeCsq0HX`J[(ħq a"*[@< X\+v(d:h'i@?s06EB+ģI>?r8d,@dPVbHdf9)wJô뛘 ۟}Vxۀ~(=J&,3]c X4[-d,0 zaϫG# %l 5MuRO*2^aP>m2,kH.̃TS3`MD9_ h O4p/@b#Q|j^GP nI3Џy?XH@jq`}y>N0b;* )USp ,Q[]0pb<`=2`cgOƳ.;l=@fd@_|Bϩ/,t3 s?  JpaDH&iO4'2F.0iDI!XVbk+' *spB'mЀhoHUiY8LHԻ q,9Kp8Jr=qf-]\HLS b(( 6$ՌY,I'>Q?e૓7ĒG9x֡9#@ۆ=sSM׷gO$XZ K Ub`y$UU(- ܒ Wv/B j0_a"(^a'= U s2J@BmS% ez7>G9o+; *OxVHBɧb$+X#V@详YDGO0Co@ Xh f~Xf5mT' [Ƹԅ7/ ԅv܃ d 'fh XZry!D}',_6UBRi XXy'yw`g:KxJpFP,) -TڝNЯ/&CEd6˟Q~fȹH |pXPDAx qKE`WU XrT erR eP0Y\$П՟p똠y- oѴ# xDuE 0XY.`8rx `BpX A^ux ؃[܅ -/I`DfyH!#|:«ibR&H.{@fz]0P2,f6`XD3.W3eӉ0l6@ßujƋ*]U4` 1>x1[ L,ofCӆ6gVN7 `/ y|~Ors`. KQ- !X$.\Ԧǟy= pZo㫬/#8b{3Q+gɞIM|Dy@R^C}[8[u80A~znq]U 0?idJLf@OyR0iL÷&{ч3ߔV8& z6jڅ488c5 |&@v'm>Qa?Al b.HLB&$ {fR2u &T?qR4#S,8 ̲3B3CS,e)S>ɀb&Eqʊ0 bp>:,'eŌ@֤rdHq·K~x>j*p BFaOGs*کAU@4˳ղGA8 m: Y0@@v@*pGazUlNgOBjzؠ~> q\KgMzÀ2},='g8 | 3KVGS8mBOE#a$ouJGb.S\Lਜb~&H4`#$c06}rK}p8~9X2SN-Ɛצ 8 ztǠUWJJVk%jbϪyaR2 3kd]q4r `WUCzTC,egaΌv (r#1{ZɃUU܂j`'w-zuMr`g,4+ei|H>!2CW*`|W-|Y ^?@)] t(_ـSw51TK ܠ qWKYڟ9 p He#zJNh:m X /'ϥ$C4 4U-O6} L1 Td¶,*l{0I.iX(LːeS C+am$:Lm,)Y# TPz09KJ`ܥ1'r͒èbe^6󓅓ߙ;E]2Ioʶ?lS6/Nx .VNQ:''Bo1-X&i~"pN*Č2b#АRW! U܏ \&U9L&K JVbair'.ކѶXآWYbrƢ<3d#81ă+MLeXkXx^3K=A$2ɀ(~; )Qa'Sc*ƴ03,棩h?M~,P!d( AD?E:TDy/c B*puQO%Zcy3P,I ~8' iOU.jA,66dIDO$\֨' "]M-ug- *U f,Hq-Ї៎g:6G!b;VU (p 7>?c> O>%g af @%k~#OdGb!8%(0 5Й QB}L̇Gԕ#`dlOdŌOVz{3}N;>kcFS'Ms Ux1+ԑ]Rx9*hbo!FȾ |T+-}&U8Hg)C@wcE)ՁX*TXL^YX .K[@b78Q1"1XOC HvF_viK/ko*mb68$М< TL#IDATKml:#]Rf :.@h8]nS8 Ke>AK_)971uA$l۬n֮l$YBb SxنưӊǖqNT @e-dpdşDONtqo! 'c,4 c)TE? G Eb(\hD>i x*BGwK8I z2A]D<0 @HzjH(F=2 ,2zV?ӓq[b|a'8 œ4@&R08-e p'ey;H-=f”,aNURJEɷ2ċз"-, PROlN( 2 2,'3Ofܟ@)PFC&M61XTV@!,?ESX93Z4NznM{̳XmgQcb@D ̳Uȯj~lR^>F,{zѧPMLxTDL0닅/BC'Wc B<][Ăˀ=lV},^,g0mbYJKQc꒸T$k!%b~cEY-#FAL `g[&-2)&$nP5?LH> @ FZ5Xx J3aF\)2JF|gg'0LV@W,>P> [C 2I唨([~٣ :)}d(*5 (HFĂ"Y3b($YSb/+j҉ jQr͟9BleG.xúن܏ p ~l-ؽSSLj0^@#^c#&d\h,)&H,bj$%(1GT;'0$- @ނC0"Fh?+b@ic1ƒ)CR^3|g8HB-h܂QLGa?]_)f:`q}@X/€Ggs|%M, Wu.-\8<~E @H Ll p*L~$*^Ә0 bT'dZU&j>AqNeWU=ʕb#"t"0V>a+8۱NrȢ2( օ\ßs+]:"F$>S!IbJPVڅK@a;l`,,aZA)0ATr3oیiz$ 9 6dc>up@( "c)W@J vac#vlz>d/c L&]kk7/OZ=\`_BSsؒƚ&T"Z b_4]!%Φ+,>DBLԇ1j frG^y;N<B1n)4\j0eґf>>U]x@y+KHԱ؈˪<5!TJ'&eHʠP;ÇE?%9Z`q7øh@:O9Mu!~ EapN."5,)OW ;IXV9bvY]8ö f. @d5D6b)M$+B 4(wA2"԰.~qQB"5o՜]\fUej%VB2@ 5Nq̟#M^~. ?Qh.ה *`M&C8Iӻ篧ؗM sEBNvTp#C=,OˍQ!׉ ա Nc#pޝ$V!l,Q ;K qXd8}R gb_r@!P*zPme %eQQDSF%PY(7HPafZ.cX.C-b Q$ %(Ll7B@4ř}W@ 5Ld4^W5H0 rt9i030jϳBQR~Il¹G+.d~M"sa68 'p@yN ڼ~eo>vϼ7{Oo|ww#|]X硝87>x- #Y꡸hIXb4XhLqs)XT@7%oGG`zՋ]ض|H@" 8`LȬSdMV.Y^ 2uFMi"E2hr#~PED*u?T}ߋ@Z*~gwV?ee&<)!~+g[c;A@pCRт,heG|=nŲ6YCK|Z7sUqZKN\{efN9x^633>FƧ+Ş2ܵ|Yc!0/QS` 2;l/'- ~Tz4[HH$=6$.eA"Mm8T~V 3XV׏SP&kWyGr~2ptpK'@N8-fVϷkKN=sӇ|x[F9w ǿ7{Cv?K6W4w|g1{bv.caLpNXZwbŃFb bihtd:^`0։3 `= S5WZx(G")%ГAm&Ⲝ HАS| gUjҺhd oE2(UoJ4T4Ft__(?52Aa\`^J8E )*Du1h*}Q E  ĆyZ.KY{D#QiT'[_ F2s3˹BG@ga^IQi(8ŷ`S O}5]X0TǗ8߂>  )X, ڬ锵@BgY1Oc>,Jf#G>1" DzAu5mZ6(}%"O Г (4Eܠ"L\ʥc" /3OF"{D|m#Ƃ^-j9p# 'dS h([ upH-elb v/MU$bDpD38K5ҟ Azr V@f};< åAI<x9 SZ ;Zé"u4x8ƈ~kAHQfNWcf/VP4-i'0@Pa\*Sjԕ<7F *Aʉp:2yHaDhg`)oKy\iTXTx1l>K6#!^z60CDD" _~F/8(A,2k2 dcB=*VNT$ ].Fٗ92aYN_Wdr PTgBH.[X6'=KIG`?j|e(f+0N ~X{=b + ^{2Y2P.Ir|44*aJT2uvk 5b,ǢxcA- F%C?rXaJF@8TH)x!S:e3pXj3$ f?d> K!1Adw=v@TJɖ+ȢU:x; .)H'0CZUq!$=ec[J_AFar\ qn`Zp>!% FK8+-9)`ݿ:[_Q%yOby3ӆ܎~ެ?0ٝ}q3{'ycɴU}z=$p6E4)ΰt¥`d#;`co09|*̂nE!*mLKYݔSZ-RVE :,A\,>d.PR4]"+=Yb,N_JXhY)?ŃTR0 >*nSda S _۬&2ȠOrx[U-&!Dyl"eM+9J1 Nq0޲LgcS~PCbP2 P7g؇\ x'(9^ʵՆoG2C`΀__8%o9pZ!;;GYCW0]x bPXq+J恱)bܕ_ ]EDX4p BGvɋb>0,הl#%P|@mJxx2Tܲ8-e{,\*gUV=z8 ad@L`0=(~)d'q^<ۥT[LpLil􆕖 bwKxۭzk`ͻ<ѽ7Ї=q ʠpds&N8V)w[g@X2qt,e!\NBHNȠ؂%2H8)Q= dhAYL0^J* z&q$ SZB*D>NqxG$Q=a|fe,_MdbkCI%KQYQ O\@$.b1B50/ gwqX+8ElU uq! W>KFV4+NAB^34(@r|Aw8@\I_|),j߱T%ALv0XdlJ9@?f~ zf ,Oѥ2( fa aYJp?-}1Ҡ?!B`/!.H@4ifIddp)t߰>ќ.~HNjU4v඲N4 Lq'n<ˁppQԘ]L>oY=L27 4]φ]%% yҒ-M[lole8|[Nz^{?0~g=Y q| dƬ@QzK TD"QYJ9-ΰ/X '7x\:{ 9WXsG@ˑ7.5!2pX  IGc1hLmD9+4<ΐf v2C o/Nyt;d%]4ǶBpA8[wu0;=EZlᘪU%sUijs9 9j ЋEVyN?8iC E|ã8{PjSQ? F)M˴-fm=^a$7he=u;>=GG>o̞ph*+NMA7m,ŔRHN̬|WPVfUabQ8PM 8a~$ZT$DU^sWe9V8DOp`EPqTA FJUAUBP]M,*^_c~l|~WBaL(g5R/-H$5& J\@.ųi(N8YzOU敟A*~Rv݉k`V,3yc.q6 `gE2!YkQ~ocp]U(/ 2e[r CUdƀ %jբWTGA uC@"3@Dn`K6=_t*1D=B:XZq-Eag',Y jD6`66҉ ߣ;qG!E(NY5t tXˏ_ۭZP"ZPF>) T >!10/Ntx^dXhL j8@*%Y5t$6[#-5nmE0"Ԫ~ʇTN%.`A4ՉڪGAJR-`*C+>ad<2ۖV0nW™Tj;KͮX:*I4I/aɬ ^UD3<11OfxRH~*.?$*|jVa4U Ƃ.CfCp`s\;k7 - ~=!^M"hF3Qc9Cy&= *gDQ-`i\x*rSHg^ ՜( _AeHG-ԣ|"v[챍fo|/\07=pߙ8)ߘ1}w B3MЋhF.Ǭۭ6^Ռ,Ӣi Ǫ"?,Jay(Qiib2j'+<-SW%*^]P\JBPMM\fgdqS)IgP0ͺt%+7ӱ(rrZcVU1⼫pV\ٽ.6 :HHD|zf"@XEN5(5|lܥB.ؔ R?Nj葘55)5J CZb 1p 1 Iřb8r=nVحB@(L'ӕ(jբʥ`WV!&*Wzd)g/#|gP,Ĥ@2`q!}qH8d=+a ұrb$giczß!zrdO&A,JQq`˅eAO1 m -J*9WVNB@f L%l=sKKJk^_%BAՉe SDU0ꢲ (T.2S,bZD-w."=j̺*Q%ԖXDb)X*GKR"{츍Ft{Ok_'DQWy$BEPOq>% M$xi(uN}V'wtF6jb&AZ?>gJy8X55AG^w>^6xG:ѸŧRN^QTSy5ZӉѼm2S* ЫАBvET"b纰NU;3 $gd#? y#O8 VT~P \>`~pE*5dY _CfTpc_JΥq?iրx{!Gp9qJD rTO$Tp WqZL0pxe6 \ZfK3NדD,ٔqf`)hDeZMq68c[^l/UmZ{#~1oW+7ke4^+>>>X=pSWt1K()-5DqU9jb_&\Ib}6^!E[5(Y ٨ ;DJHYS,s&VcݔԳ9LQTcxvjPQty]Fic8s C`1|=ԛc]NL\UZgtCd mVY]EҚ7\}coǧN߽ HT*xg+$cre*|*~0=Ei*1wU0Z6$ 6W(xB?`ƒLw}a*^wL,t/N!7RHӠձh2a?5Z Vs?R̤2-iLId PΪU՛._m)bղ_sIrJmϬ gVd_KEY̡'zT_,'TNG8 Pom 6HgG1VW,e7MHS|*;թ·Oa$? K%9J͌T}? X4LF0,``JzIH 5b4Na&@e7/l/`g GHɗڨץ%'M4p5=B+%e82S "/AˣrFav0)U^09ϜaoL'0Sdm8A `ZWc&Kp=Xfuv~> ^?.&|R餚]g!RHG"#yЦc{1Q}a8/"FF*yȎQU" iY&uV7١Zbo,{me+R,evΙs ZnD"wW$SJGbѠ‰! aŕtV)bz,q%36iiLP9aV~z|;1FԢ蓨T2%gğ - qY>:2 LqL6]ۢ}Ӛ6)Z]Ѣ9 ۬^ЊI =W%\s Q袮`xA`= PppvS*,0d,a!~5RWIe\]d2qu3@D)*T$8 my0F"ƒIW3zɼF~Wۦ.`x;YѦ9!,}tW:juы.9c/=}NUlc_e6>]v)4!i)5P`:Mx҃  T LB:CA 짊g$15,c ss#S*97bFBlVs]f*&RqBuc+3qSEuט 3|ť @? :=b(`Lt3Sr G+- `}52ȤTFE,KrS>pLTc ` l㡤QYT<4 l}^Ζ1HcߣWsWfC.] ; 0lgWMƉ?6Ӕ[c88 Ƀs:5.pLV*Pϒ >V?#+%/)>DWcPn8QO9?,j~P҃D.U!ߕZQB~Ϻ7Z]ogku@ a[ND$%$&@]@QdDfqQ:;>D9O=TWWשz}D$-]jj$9qJhp!WD0OYOE@@P%":Fiy["|t ;SѕhGqEɐu`]V`tbN+1x䅴|˳xˆC nX 6`25k]F? (ڃZRDLC=z9 s+SrGuJ|Lfjg!kN;td?m 3Ȳdhқi&?m'kԫ0gl bZ ]/^99FԊ $h10(fĜQ؂Z:û+}Js]rװwG@+=Rn>|O(\}ـ QkY?VB0r.!mbUñ a B.T?nA0 o6EG8k %ԁݿXhOKy] 8IXX hˆ[]"2XdrQ?3$rOȳ82`'+8/,(߼<"E{nMyex()JП.l)ps{4̼v90w,%Oa09 zģ-1O)1RGQ9 cKk7x2*Z>]~W`}Ȝ_+f7,z ;3RCziS@ g47zVNiBy-W|9 IyЉYd*e^$`c`&+:Ո %W?tnݹ0{YE@6)8p %: a!N(` ЏTvDq|7HvOw_ctW}pھ5خl>ܺZ>]5v[Mjjr^&{@Lũ@c=:c}Ss@`)ŕLIB>6NԴI#qj7Œ SE &[s2^6DFubmtxG#!Q/b=#iL-,s7p:oE _^aJ(`)^q aOABMK{ɍBwqG,~sld~Ȁa3LGw/7<}$gHTD0^{ Lt1q!{+@8)# {=%Y\EAKK Ԝ+^^.*aׇwx9Sf@I\m㌿R*֙%i҉-mF''m5<FPo(}qER74v4|z-#7<>{ܺAh.('a=O)aС~?bR'Y:'>߷AX)I. '"}}zp>޿tOz7>fo{c?;x "e^î"(6>(Ҋ. {I6ݪfA$dȼmN䍻e 8rx2䳘yGuvV#bkUB,'2^<[Nnws& Q U;<}~sޭ3v6OoVi#0"IWW3AA zk{ھt !RiR$y (ZOO1 GpEWZ,F-FB y'ݿZ(u@67,,d 'cOBUShƥxba>Xgxst4ޚfwv4;uW9ł`]ξ{?Z'S*+^Iܵv0\'| CJ2Yicy)p6r^m,ovcAJNAm"Iҡ,zO^dK-UԺi;$yzB㩔 DF񁀞"F،`u"Q ;Vvk(7R@|.(`u|]R@x$!,b.q'~&ih*MWϏXPH[շg{~2:8Vhe n.ccwg3K{qG+z^I#/A/.dlt_#_ # q q<H`}^r+xO'H4`B21CǻXm0yYX暠vSu @PEڭVYfЫ(L4e% *N Rmm|$nŊ(fbeu>>z,ژ2S8aawDJe\-l u}dL Y!PqGfh\}@jkr3Ir|wlrl)6AcFXy xCwv8:$Fx@W30y)Db`:,O9Zs+hcC܂Gn"_N1`;jPx ! G e ҶPBˉ]: ]`4B2`j 27@gTe\SBd V {zϲJ{em}Go[\  2)pGk1ͅA>?}>jC̃v㏜DKӗy @2/H+pmr ?|ٌj3Aw@6`sml@o2WgT ЯouvP?Ph7t4ڒlE?ϗpLƻ"@|HA04e>G `"0N x :( w$P4"EȆu&7&w7F7#h}";tru${sǸxL!Əz\jaO.Ȉ&.ۃE'<1jB_L}!O[Lr:q1j9CE{V6g?nH4r$DV0Ƥ~CEIX1Ї2%,@zt(ib֚kMo~aNq 6` A--b/H;_9+ٯeVG'{YtLmd c:+Ve!MYX1B|H[i frY1@61tc_}.#ǒv=H(|ɋ/Zyv,O C(J?V ͇=`B%(ׄĝ}Xkr[67> :wíяdf*UVijbmi/uPh8`<<ZQDCv٥&a j y+vT gRY6;o ;oebz70ds`ۅwW0A|Pn\a 2D>׮9*@B!!ώbѡ ,/֦j4At3r`9tkk@+MC.!H;v%hܷ`dyC,2LG'Ys3E+|S@q{Ώ=4 ąTdL 4}"}BLA~jTwCvEx]`o@߃pVK@c%^:*wxLj'ӺJ1BGo;(  g"eҢMVta1{hf1ӄ< 蠷j RvA*2wr~zZ_SzEWbR :;XBd໔(*P4a0A"DHnhN4G'cVHwxs @k|EgruQ F]S}\ yM%VzuO5-wx,08%O 8,B$ wHppq%w|P2{R gIVw Ob] ~` ZGHvAqӯ -a_Z(Yi?e_¦=O!懶lFgyx5lSU.À+Ԅư":,цܷH@:$" n P'ؘKH?ղy:/3{Y}td{^nrQUOgh#Ca"83 6`)C0hkO6N;PlgJL ij I>l~B]uRӀeKO=8cOZx D =@eQAeڒK y55ԙE# 9\izG`6VEHZ,:Ta*pp$q7r&lI. P09Yƹȋԝ̔e*+ :=X=cxN,>\_o Iml˼$0^og[VR@ରUv}3E!>ףM#J.mzA.a`8_= e 0@Kֿ9` tJ1QdeE/ IQeLO%`< d 2zAOC.V a'`:l. B(;#=, HUR=8{.n'$` 0i.,'G;^.ڻivoI{7KkZw[ix QAmig>L{zSSk%mfx+>R1z (xuwu= t>L.j lNp * ˆcTDRL9xmd1sB]:FKL ^yL16ԍ/?x荥uR1Xβ|q>Q{W.H"48GԘ4Y)*)'դZ[ VQZ]-OuIr_N䴍s/z;}d$VqaO#)jre*a6ѿj+r>oZnVw<^mtC$ fPm?lAXU{qk v$k={)XSTD(慐 yv,yWuvp3-Z!E+"PYX[䤯϶ݿr=[ (8L!$۰17n3rv指V׮%k5;9OG翹oc}/@V4BVЁBl1TA-0%8o&; %a3_Ŝ"s:ά:v3A[b2NH 1BP JD]0 %7a*[[;ڝ^nz۲ޭYp==xe[FGMg]C Oh-Y%ʿSz'3h]̀g,~FLF4B;~ϔ]҆gDрA5*0fZʈK!SA5Yvnʲ[:t'W G wpc F,|>@^Y kZ>&ǡeF!|,]Ħ})i~qbJr8WH,@f@^m'P@=Wl0A(*ɦKCC ~Wq^OhJ!aAλB{㑶bN>+ 0ZU*jK4 @>O;I59{R 'ǯ{.7~oΝ+WՏ5kw37]>Q$fcTaT ]i5zYK+YiR@8Z.VH dŞZ{N`1辡._H>Ph|BMPu%q>1v m7B K! <ɳF:^1ZߧE+z[ޙz>l΍vާao';hk> P 5۷>yjL:=ژ4vd7A`N@[]F/ΌfcapH{ ɫw?;N߯'߼xƇO]{ẂbkPnaȝJYnkJQjZ ͥf0l]7-XLj[ ע[w,`f[SeP B.| 0KXw I] iN &X/^guo( [Bn: eEOE[d0WV6{t" 6zܻ~P&!k .2:ۘ~ #a }R^Q>ixFi,`% m<ܯ72(F`i"Ta=9ւOgSʽ5~],,rjr_0afH <},nMjh%ѓݑڼYʺw q/?) }gI!}UB'gQ9}GVaRX&]n2Pfpt5 /A=AAc:{Q1hD\pI߂/ljVHSFHByrDF]H2tA_θ_^ϵ}NuQI6oIꢟKVuVhZ x0ʽW|W;G?}MŷO'ѓ_}WnxG_{W?޷>8P%TnYW0Ku-; [2MbV- %߬?CWwQ ݦjEn6.os _H0\yP3 U~;cܩ 7^f/k0 =3O86ݑUFD(}?1ZڣNk볽ڢz`ptoMDqK?_pO c@ePhpadHqX}ΑB x`/jСha"=Y{V5O;aZ#6(WH 0-27爍yd4._C0۷wzw67{C}c:GZS_8pC՘I{oPuϺD‡26j\,)D5\ŠBAgsCy`fP0q S2gV/]H]4DI/ ]S;#Hhx,Km{ o8iq޸2r<-@P0HNyF%]9E'gc!fr!/[vhuJū/~}=+zY~'o~u?z7'ϯ{|ϼsW^mן7٪g~2ljL=AFWK'O݉|sn_'o}%uw~G무]. QC3ͲY1,Tj`PJzh>󥍎e`\[߁գPc h`BL<@u/jW /1pTN匿l%_^'@ +dK@@Pn Bs7N6lxjVG/3`n[;[8_O7ף0]RyUݳڡj4qlr_T(yB\GF^*G3̈́4k)j{VJڮ@^%5DjŞbd?K׺y^iZ]Oj\%'ׁPmOnngm۫εѵu'?Н=v&ƩY/em¦k}6[[ ʓ&J@૚2kj1.z,73KM7dGHi>Xd4!0+JP q`? z(ACAE-pmpMLԮ&s4#X^UHI2zݜ)vVJdȩ\$P vJu睌Nx .C;:8\~ނA( 36TSG*xbX&pfQ#" pe1|Dɠ͞Zo%&Pp@qJdvTh]+GAGǮh sLB:c ( @%AR:"|9ΆyF LL_m3=FJ^{N{ErcQT/J2j)0 }'1;ǝdT  5V2mLnɺ{ۊۚ5ۃ/]֒v|oS} />p=1%38@QNj72q۝wh4՛j{sufP$xVޘ2xv~?5KNwG^州Wi9WW/v'kdUoOt< yڭM34֭+?Nz> C ^ix^Lש!8hGv_l &:MCĂ.hh0:;P C@sjEỹ Xb=^L?eYb:UkڿD75Y9&AiZr啀$iნ}9xsnc/%&hۂyfЛY`:)#/̗–_, ĺ~ 2H;zޭp}=ݘ3~p{9$k3y"=$^z˞/늦=WC= Q9Tb<@5)i s.]3EڭqGZT kli i&zH%Ȼwy9W`n' G[(Jcհz1ֳ0 z,VPٮr6zNRAhړƍѱ7~jXϯ{ɿ/}7'3;~͇>ƃ}MOL>uֿ|OzgI)HCh!WN'\  Vs u@Á2"DvcѺ^nZdd)D^P'o*N_L*vt'EWbЙA>8gc;=ئXO@qDJ+G 㱠1ycמM>z!AwP!ZۅD!?@ c:- O0.ZRs,xiCM+7Kٸd Anw,9ԊP'ןA/"o(HAoM{U[Vj#M@tWd.6Ф{5{/1/H 5GJp|]wM:zsk]Ii-YQGTyBx`"-ZZͩRH>/Wh/=bd[^؝_16l<)KF 9Wchsmq#(mƬˠ' 8{/z>c]ןsw_O?7ztVHUR3 SylZ08=$$gy#s F@TѸ` N4(t Eɗ?# ")h k$F5W !@2BdusZ1п.jNsNjBpsN a=pX=a'nGYQuʹ@ Z,ݻ"w"CH-{p0'zW37M".RʂZL~?_i.H @oOwwg;jɑ֘txyw~ṘN(̀0}YK$\Pa u bQ7Ȑз-UnX؈Fk0Js6O$OTdzDEZ m}jlt >§p=qQ6ЅVWʅՊL<pO%[mkIV57?6ɕg> w]+=/t )3ck%~ʑgrz3zW>$+|wo+Y9tFioiÝoOZzR=Bsl R6k7 ﳶ=n,5^ZEcOm}:#Λc'pCwS%Cw!Ƞ.П,ƣtͺ}='BI>5c+wxz6iϝ7/HO@:`#?S |Β#l>ud )Q ?daGd)䆼M1 %R̨OAtÙ,R3C =gZYGu \f%ҩrك<wa]NX1¥K#HBnb20E`0Xy Tp-rjiw!ii6CzpZ9D=}L+E`!tc{pzWgr;Vudmeﯷ<%V[$; ]'@Y*U/[b໌W { 2Z)9B#~:4*ݑfm 9m\]-=iE *cPǎ$t"S\߈_"#)rLk] n~ ~|7/O ɩƄzl.(tO(gip"*cZQ܌6g9PF]Ivez?wN<+.~]y .zA`xoC+}D'wK_сf+KV6-4B]C_. {9BچP[=Fkκɵ6% ߶AOyIݛ}<,kY ""ݐAAZoYo*94"am "cx@)C,x}_`6YO7uyZw!ah3) o\&=tm>I%B.!%=haԇu 6 dˆh.8y@FخT2FhA"P4fNڐfhrGmtt5=^NcكIݵʵAI󑺊sM^yʼz4@5VC6Q-BNnZzԺZD wIDATWkz7Zi[ڢz?Sh7ZJ/k( k(bKAL0`*,QSbl Gn zD21aatw  (mw9xvrwkvwmx>7Non펎G+Ӎ*U{U!w^o-LF@`)Üi wl] zԺ@_=P^Q+ڲ-7 '``#%g08v8nIKn3&.+jGh%]bD$ONE&j $F$@5#Vr+\cvs.h} A$QDӹJe 67g;*3z,-SRUV2 X]4ڃr'+tjBլ$O^y]z5y?9O^ѵOz/y^tfլޝfo 'G<,a pyw:۠, %]S^jOKy>㗨 JXOǒDM8q-i^(2Sf 'p*H^2 z`i> vkS,u9-<ޜ ouOw8|d֫Jc鴎[ Wf@@V-UZՊ0S>î,UaTn>! ֵh-z1 E kuD:Zܻ!Zbpj,BDlpO(a!X]O\anhYY#9笍,\.VH=ωTt3I>x^*.bBjKo'B;E?]}te!g< $W=)f:YV0==sw_{?fo;Ȟm$٥br+.n"Ѷ0G'[+z:kWUw6.mרں:^y!sZY:Ò?yR@d{ŊV6f>@߉Si)'3I\ 0|ǺijH1Y#ʓb3}P =[duOR鷆{YF| DB h8=֩o01,yF]wп?FV(0Q2F <6C33;MsUql^XjA,PP8PjKLII@Y +4ן\bT(K2Wa, 8*lvhԜYcׯ6j58rH}" tMe^}>rǞ.^;g0_X Tc=$ׁ=t#>3>>vچ136t5qL`+J,L&"ziƹg?\x2C]='q7|+<%(Yl *%Om5]70i6uwL?0P>$b,pqaw$77Z;m0ibh6:W֨oXAB/-(1%2!hO_fTrL;.+hD:Hz ]xe\'lOόڨ? ȹËB.m0 MMXK^! VbG's 1A:KƉr ec;˥FabVL'w-: GdX05bZ ^7Vo\>뫗;+.W.>k?v[p?>eO*% k~;i,88_UGZ ХvNNu~:i,ؐ v}9'=|Zͷpc8$pw$2tsvt.'BfǓQ |ܯ y[DF7hu,3t@Jr%/d)L.||s: Z.e,֨ts" ւ.RW{O"ѥXZM~܈4Cp1>ߞ&7FR%=IԇRC#Xq; DLg/;yy e?\ e}pub>.6 eq0r Now let's see some cut-and-pasteable examples of what :mod:`colorspacious` is good for. We'll start by loading up some utility modules for numerics and plotting that we'll use later: .. ipython:: python import numpy as np import matplotlib import matplotlib.pyplot as plt Now we need to import :mod:`colorspacious`. The main function we'll use is :func:`cspace_convert`: .. ipython:: python from colorspacious import cspace_convert This allows us to convert between many color spaces. For example, suppose we want to know how the color with coordinates (128, 128, 128) in `sRGB `_ space (represented with values between 0 and 255) maps to `XYZ `_ space (represented with values between 0 and 100): .. ipython:: python cspace_convert([128, 128, 128], "sRGB255", "XYZ100") Colorspacious knows about a :ref:`wide variety of colorspaces `, and you can convert between any of them by naming them in a call to :func:`cspace_convert`. We can also conveniently work on whole images. Let's load one up as an example. .. ipython:: python # if you want this file, try: # hopper_sRGB = plt.imread(matplotlib.cbook.get_sample_data("grace_hopper.png")) hopper_sRGB = plt.imread("grace_hopper.png") What have we got here? .. ipython:: python hopper_sRGB.shape hopper_sRGB[:2, :2, :] @savefig hopper_sRGB.png width=4in plt.imshow(hopper_sRGB) It looks like this image has been loaded as a 3-dimensional NumPy array, where the last dimension contains the R, G, and B values (in that order). We can pass such an array directly to :func:`cspace_convert`. For example, we can convert the whole image to XYZ space. This time we'll specify that our input space is ``"sRGB1"`` instead of ``"sRGB255"``, because the values appear to be encoded on a scale ranging from 0-1: .. ipython:: python hopper_XYZ = cspace_convert(hopper_sRGB, "sRGB1", "XYZ100") hopper_XYZ.shape hopper_XYZ[:2, :2, :] .. _tutorial-perception: Perceptual transformations -------------------------- RGB space is a useful way to store and transmit images, but because the RGB values are basically just a raw record of what voltages should be applied to some phosphors in a monitor, it's often difficult to predict how a given change in RGB values will affect what an image looks like to a person. Suppose we want to desaturate an image -- that is, we want to replace each color by a new color that has the same lightness (so white stays white, black stays black, etc.), and the same hue (so each shade of blue stays the same shade of blue, rather than turning into purple or red), but the "chroma" is reduced (so colors are more muted). This is very difficult to do when working in RGB space. So let's take our colors and re-represent them in terms of lightness, chroma, and hue, using the state-of-the-art `CIECAM02 `_ model. The three axes in this space are conventionally called "J" (for lightness), "C" (for chroma), and "h" (for hue). (The CIECAM-02 standard also defines a whole set of other axes with subtly different meanings -- `see Wikipedia for details `_ -- but for now we'll stick to these three.) To desaturate our image, we're going to switch from sRGB space to JCh space, reduce all the "C" values by a factor of 2, and then convert back to sRGB to look at the result. (Note that the CIECAM02 model in general requires the specification of a number of viewing condition parameters; here we accept the default, which happen to match the viewing conditions specified in the sRGB standard). All this takes more words to describe than it does to implement: .. ipython:: python hopper_desat_JCh = cspace_convert(hopper_sRGB, "sRGB1", "JCh") # This is in "JCh" space, and we want to modify the "C" channel, so # that's channel 1. hopper_desat_JCh[..., 1] /= 2 hopper_desat_sRGB = cspace_convert(hopper_desat_JCh, "JCh", "sRGB1") Let's see what this looks like. First we'll define a little utility function to plot several images together: .. ipython:: python def compare_hoppers(*new): image_width = 2.0 # inches total_width = (1 + len(new)) * image_width height = image_width / hopper_sRGB.shape[1] * hopper_sRGB.shape[0] fig = plt.figure(figsize=(total_width, height)) ax = fig.add_axes((0, 0, 1, 1)) ax.imshow(np.column_stack((hopper_sRGB,) + new)) And now we'll use it to look at the desaturated image we computed above: .. ipython:: python @savefig hopper_desaturated.png width=6in compare_hoppers(hopper_desat_sRGB) The original version is on the left, with our modified version on the right. Notice how in the version with reduced chroma, the colors are more muted, but not entirely gone. Except, there is one oddity -- notice the small cyan patches on her collar and hat. This occurs due to floating point rounding error creating a few points with sRGB values that are greater than 1, which causes matplotlib to render the points in a strange way: .. ipython:: python hopper_desat_sRGB[np.any(hopper_desat_sRGB > 1, axis=-1), :] Colorspacious doesn't do anything to clip such values, since they can sometimes be useful for further processing -- e.g. when chaining multiple conversions together, you don't want to clip between intermediate steps, because this might introduce errors. And potentially you might want to handle them in some clever way (`there's a whole literature on how to solve such problems `_). But in this case, where the values are only just barely over 1, then simply clipping them to 1 is probably the best approach, and you can easily do this yourself. In fact, NumPy provides a standard function that we can use: .. ipython:: python @savefig hopper_desat_clipped.png width=6in compare_hoppers(np.clip(hopper_desat_sRGB, 0, 1)) No more cyan splotches! Once we know how to represent an image in terms of lightness/chroma/hue, then there's all kinds of things we can do. Let's try reducing the chroma all the way to zero, for a highly accurate greyscale conversion: .. ipython:: python hopper_greyscale_JCh = cspace_convert(hopper_sRGB, "sRGB1", "JCh") hopper_greyscale_JCh[..., 1] = 0 hopper_greyscale_sRGB = cspace_convert(hopper_greyscale_JCh, "JCh", "sRGB1") @savefig hopper_greyscale_unclipped.png width=6in compare_hoppers(np.clip(hopper_greyscale_sRGB, 0, 1)) To explore, try applying other transformations. E.g., you could darken the image by rescaling the lightness channel "J" by a factor of 2 (``image_JCh[..., 0] /= 2``), or try replacing each hue by its complement (``image_JCh[..., 2] *= -1``). .. _tutorial-cvd: Simulating colorblindness ------------------------- Another useful thing we can do by converting colorspaces is to simulate various sorts of `color vision deficiency, a.k.a. "colorblindness" `_. For example, deuteranomaly is the name for the most common form of red-green colorblindness, and affects ~5% of white men to varying amounts. Here's a simulation of what this image looks like to someone with a moderate degree of this condition. Notice the use of the extended syntax for describing color spaces that require extra parameters beyond just the name: .. ipython:: python cvd_space = {"name": "sRGB1+CVD", "cvd_type": "deuteranomaly", "severity": 50} hopper_deuteranomaly_sRGB = cspace_convert(hopper_sRGB, cvd_space, "sRGB1") @savefig hopper_deuteranomaly.png width=6in compare_hoppers(np.clip(hopper_deuteranomaly_sRGB, 0, 1)) Notice that contrary to what you might expect, we simulate CVD by asking :func:`cspace_convert` to convert *from* a special CVD space *to* the standard sRGB space. The way to think about this is that we have a set of RGB values that will be viewed under certain conditions, i.e. displayed on an sRGB monitor and viewed by someone with CVD. And we want to find a new set of RGB values that will look the same under a different set of viewing conditions, i.e., displayed on an sRGB monitor and viewed by someone with normal color vision. So we are starting in the ``sRGB1+CVD`` space, and converting to the normal ``sRGB1`` space. This way of doing things is especially handy when you want to perform other operations. For example, we might want to use the JCh space described above to ask "what (approximate) lightness/chroma/hue would someone with this form of CVD perceive when looking at a monitor displaying a certain RGB value?". For example, taking a "pure red" color: .. ipython:: python cspace_convert([1, 0, 0], cvd_space, "JCh") If we compare this to someone with normal color vision, we see that the person with CVD will perceive about the same lightness, but desaturated and with a shifted hue: .. ipython:: python cspace_convert([1, 0, 0], "sRGB1", "JCh") The model of CVD we use allows a "severity" scaling factor, specified as a number between 0 and 100. A severity of 100 corresponds to complete dichromacy: .. ipython:: python cvd_space = {"name": "sRGB1+CVD", "cvd_type": "deuteranomaly", "severity": 100} hopper_deuteranopia_sRGB = cspace_convert(hopper_sRGB, cvd_space, "sRGB1") @savefig hopper_deuteranopia.png width=8in compare_hoppers(np.clip(hopper_deuteranomaly_sRGB, 0, 1), np.clip(hopper_deuteranopia_sRGB, 0, 1)) Here the leftmost and center images are repeats of ones we've seen before: the leftmost image is the original, and the center image is the moderate deuteranomaly simulation that we computed above. The image on the right is the new image illustrating the more severe degree of red-green colorblindness -- notice how the red in the flag and her medals is muted in the middle image, but in the image on the right it's disappeared completely. You can also set the ``"cvd_type"`` to ``"protanomaly"`` to simulate the other common form of red-green colorblindness, or to ``"tritanomaly"`` to simulate an extremely rare form of blue-yellow colorblindness. Here's what moderate and severe protanomaly look like when simulated by colorspacious: .. ipython:: python cvd_space = {"name": "sRGB1+CVD", "cvd_type": "protanomaly", "severity": 50} hopper_protanomaly_sRGB = cspace_convert(hopper_sRGB, cvd_space, "sRGB1") cvd_space = {"name": "sRGB1+CVD", "cvd_type": "protanomaly", "severity": 100} hopper_protanopia_sRGB = cspace_convert(hopper_sRGB, cvd_space, "sRGB1") @savefig hopper_protanopia.png width=8in compare_hoppers(np.clip(hopper_protanomaly_sRGB, 0, 1), np.clip(hopper_protanopia_sRGB, 0, 1)) Because deuteranomaly and protanomaly are both types of red-green colorblindness, this is similar (but not quite identical) to the image we saw above. .. _tutorial-deltaE: Color similarity ---------------- Suppose we have two colors, and we want to know how different they will look to a person -- often known as computing the `"delta E" `_ between them. One way to do this is to map both colors into a "perceptually uniform" colorspace, and then compute the Euclidean distance. Colorspacious provides a convenience function to do just this: .. ipython:: python from colorspacious import deltaE deltaE([1, 0.5, 0.5], [0.5, 1, 0.5]) deltaE([255, 127, 127], [127, 255, 127], input_space="sRGB255") By default, these computations are done using the CAM02-UCS perceptually uniform space (see :cite:`CAM02-UCS` for details), but if you want to use the (generally inferior) `CIEL*a*b* `_, then just say the word: .. ipython:: python deltaE([1, 0.5, 0.5], [0.5, 1, 0.5], uniform_space="CIELab") colorspacious-1.1.0/doc/index.rst0000644000000000000000000000201212616046700015477 0ustar rootroot.. colorspacious documentation master file, created by sphinx-quickstart on Fri Jul 3 22:45:20 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to colorspacious's documentation! ========================================= :mod:`Colorspacious` is a powerful, accurate, and easy-to-use Python library for performing colorspace conversions. In addition to the most common standard colorspaces (sRGB, XYZ, xyY, CIELab, CIELCh), we also include: color vision deficiency ("color blindness") simulations using the approach of :cite:`Machado-CVD`; a complete implementation of `CIECAM02 `_; and the perceptually uniform CAM02-UCS / CAM02-LCD / CAM02-SCD spaces proposed by :cite:`CAM02-UCS`. Contents: .. toctree:: :maxdepth: 2 overview.rst tutorial.rst reference.rst changes.rst bibliography.rst Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` colorspacious-1.1.0/doc/overview.rst0000644000000000000000000000162712616044610016247 0ustar rootrootOverview ======== :mod:`Colorspacious` is a powerful, accurate, and easy-to-use Python library for performing colorspace conversions. Documentation: https://colorspacious.readthedocs.org Installation: ``pip install colorspacious`` Downloads: https://pypi.python.org/pypi/colorspacious/ Code and bug tracker: https://github.com/njsmith/colorspacious Contact: Nathaniel J. Smith Dependencies: * Python 2.6+, or 3.3+ * NumPy Developer dependencies (only needed for hacking on source): * nose: needed to run tests License: MIT, see LICENSE.txt for details. Other Python packages with similar functionality that you might want to check out as well or instead: * ``colour``: http://colour-science.org/ * ``colormath``: http://python-colormath.readthedocs.org/ * ``ciecam02``: https://pypi.python.org/pypi/ciecam02/ * ``ColorPy``: http://markkness.net/colorpy/ColorPy.html colorspacious-1.1.0/doc/make.bat0000644000000000000000000001507312545654606015271 0ustar rootroot@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\colorspacious.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\colorspacious.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end colorspacious-1.1.0/doc/changes.rst0000644000000000000000000000652113010731512016000 0ustar rootrootChanges ======= v1.1.0 ------ * **BUG AFFECTING CALCULATIONS:** In previous versions, it turns out that the CAM02-LCD and CAM02-SCD spaces were accidentally swapped – so if you asked for CAM02-LCD you got SCD, and vice-versa. This has now been corrected. (Thanks to Github user TFiFiE for catching this!) * Fixed setup.py to be compatible with both python 2 and python 3. * Miscellaneous documentation improvements. v1.0.0 ------ .. image:: https://zenodo.org/badge/doi/10.5281/zenodo.33086.svg :target: http://dx.doi.org/10.5281/zenodo.33086 Notable changes since v0.1.0 include: * **BUG AFFECTING CALCULATIONS:** the sRGB viewing conditions (``colorspacious.CIECAM02Space.sRGB``), which are used by default in all calculations involving CIECAM02 or CAM02-UCS, were previously incorrect -- the :math:`L_A` parameter was supposed to be :math:`(64 / \pi) / 5`, but instead was incorrectly calculated as :math:`(64 / \pi) * 5`. The effect of this was to assume much brighter ambient lighting than actually specified by the sRGB standard (i.e., the sRGB standard assumes that you are looking at your monitor in a dim environment, like a movie theatre; we were calculating as if you were looking at your monitor in an environment that was 125 times lighter -- something like, outside on an overcast day). This bug is corrected in this release. Fortunately this turns out to have had a negligible effect on viridis and the other matplotlib colormaps that were computed using the buggy code. Once the bug is corrected, the old colormaps' perceptual uniformity is no long analytically exactly perfect, but the deviations are numerically negligible, so there's no need to regenerate the colormaps. (Indeed, the buggy viewing conditions, while different from those specified in IEC 61966-2-1:1999, are probably still within the range of realistic viewing conditions where these colormaps will be used.) If it is necessary to reproduce results using the old code, then this can be accomplished by instantiating a custom :class:`CIECAM02Space` object:: from colorspacious import CIECAM02Space # almost, but not quite, the sRGB viewing conditions: buggy_space = CIECAM02Space( XYZ100_w="D65", Y_b=20, # bug: should be (64 / np.pi) / 5 L_A=(64 / np.pi) * 5) This can be used directly, or to create custom colorspace specifications to use with :func:`cspace_convert`. E.g., to convert from sRGB1 to JCh using the buggy viewing conditions:: cspace_convert(..., "sRGB1", {"name": "JCh", "ciecam02_space": buggy_space}) Or to convert from XYZ100 to CAM02-UCS using the buggy viewing conditions:: cspace_convert(..., "XYZ100", {"name": "CAM02-UCS", "ciecam02_space": buggy_space}) Similar code has been added to `viscm `_ to allow reproduction and editing of viridis and related colormaps that were designed using the old code. * :func:`colorspacious.deltaE` is now available as a convenience function for computing the perceptual distance between colors. * Substantially improved docs (i.e. there is now actually a comprehensive manual). * Better test coverage (currently at 100% statement and branch coverage). * Miscellaneous bug fixes. v0.1.0 ------ Initial release. colorspacious-1.1.0/doc/bibliography.rst0000644000000000000000000000010712615254500017044 0ustar rootrootBibliography ------------ .. bibliography:: bibliography.bib :all: colorspacious-1.1.0/doc/_static/0000755000000000000000000000000013023030663015263 5ustar rootrootcolorspacious-1.1.0/doc/_static/facebox.css0000644000000000000000000000220712545654606017426 0ustar rootroot#facebox { position: absolute; top: 0; left: 0; z-index: 100; text-align: left; } #facebox .popup{ position:relative; border:3px solid rgba(0,0,0,0); -webkit-border-radius:5px; -moz-border-radius:5px; border-radius:5px; -webkit-box-shadow:0 0 18px rgba(0,0,0,0.4); -moz-box-shadow:0 0 18px rgba(0,0,0,0.4); box-shadow:0 0 18px rgba(0,0,0,0.4); } #facebox .content { display:table; width: 370px; padding: 10px; background: #fff; -webkit-border-radius:4px; -moz-border-radius:4px; border-radius:4px; } #facebox .content > p:first-child{ margin-top:0; } #facebox .content > p:last-child{ margin-bottom:0; } #facebox .close{ position:absolute; top:5px; right:5px; padding:2px; background:#fff; } #facebox .close img{ opacity:0.3; } #facebox .close:hover img{ opacity:1.0; } #facebox .loading { text-align: center; } #facebox .image { text-align: center; } #facebox img { border: 0; margin: 0; } #facebox_overlay { position: fixed; top: 0px; left: 0px; height:100%; width:100%; } .facebox_hide { z-index:-100; } .facebox_overlayBG { background-color: #000; z-index: 99; }colorspacious-1.1.0/doc/_static/loading.gif0000755000000000000000000000531712545654606017421 0ustar rootrootGIF89a 򺺺444ėTTT! NETSCAPE2.0! , H *\p hp"8G>D)R4CIË\9p:ȹs1_2`p` u< uSYڐkǞ`Fhvƴ6S>u+ryJ/QM.0@p_ ++/KY&]9ى Mr `ixr\˪ vfjMO&*Z؇o>;ܦŝ",,@CPؼrSE.ٴjTWYR Y+ѫKb ڌ! ,H*Terms * Loads the #terms div in the box * * Terms * Loads the terms.html page in the box * * Terms * Loads the terms.png image in the box * * * You can also use it programmatically: * * jQuery.facebox('some html') * jQuery.facebox('some html', 'my-groovy-style') * * The above will open a facebox with "some html" as the content. * * jQuery.facebox(function($) { * $.get('blah.html', function(data) { $.facebox(data) }) * }) * * The above will show a loading screen before the passed function is called, * allowing for a better ajaxy experience. * * The facebox function can also display an ajax page, an image, or the contents of a div: * * jQuery.facebox({ ajax: 'remote.html' }) * jQuery.facebox({ ajax: 'remote.html' }, 'my-groovy-style') * jQuery.facebox({ image: 'stairs.jpg' }) * jQuery.facebox({ image: 'stairs.jpg' }, 'my-groovy-style') * jQuery.facebox({ div: '#box' }) * jQuery.facebox({ div: '#box' }, 'my-groovy-style') * * Want to close the facebox? Trigger the 'close.facebox' document event: * * jQuery(document).trigger('close.facebox') * * Facebox also has a bunch of other hooks: * * loading.facebox * beforeReveal.facebox * reveal.facebox (aliased as 'afterReveal.facebox') * init.facebox * afterClose.facebox * * Simply bind a function to any of these hooks: * * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... }) * */ (function($) { $.facebox = function(data, klass) { $.facebox.loading() if (data.ajax) fillFaceboxFromAjax(data.ajax, klass) else if (data.image) fillFaceboxFromImage(data.image, klass) else if (data.div) fillFaceboxFromHref(data.div, klass) else if ($.isFunction(data)) data.call($) else $.facebox.reveal(data, klass) } /* * Public, $.facebox methods */ $.extend($.facebox, { settings: { opacity : 0.2, overlay : true, /* I don't know why absolute paths don't work. If you try to use facebox * outside of the examples folder these images won't show up. */ loadingImage : '../../_static/loading.gif', closeImage : '../../_static/closelabel.png', imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], faceboxHtml : '\

' }, loading: function() { init() if ($('#facebox .loading').length == 1) return true showOverlay() $('#facebox .content').empty() $('#facebox .body').children().hide().end(). append('
') $('#facebox').css({ top: getPageScroll()[1] + (getPageHeight() / 10), left: $(window).width() / 2 - 205 }).show() $(document).bind('keydown.facebox', function(e) { if (e.keyCode == 27) $.facebox.close() return true }) $(document).trigger('loading.facebox') }, reveal: function(data, klass) { $(document).trigger('beforeReveal.facebox') if (klass) $('#facebox .content').addClass(klass) $('#facebox .content').append(data) $('#facebox .loading').remove() $('#facebox .body').children().fadeIn('normal') $('#facebox').css('left', $(window).width() / 2 - ($('#facebox .popup').width() / 2)) $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') }, close: function() { $(document).trigger('close.facebox') return false } }) /* * Public, $.fn methods */ $.fn.facebox = function(settings) { if ($(this).length == 0) return init(settings) function clickHandler() { $.facebox.loading(true) // support for rel="facebox.inline_popup" syntax, to add a class // also supports deprecated "facebox[.inline_popup]" syntax var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) if (klass) klass = klass[1] fillFaceboxFromHref(this.href, klass) return false } return this.bind('click.facebox', clickHandler) } /* * Private methods */ // called one time to setup facebox on this page function init(settings) { if ($.facebox.settings.inited) return true else $.facebox.settings.inited = true $(document).trigger('init.facebox') makeCompatible() var imageTypes = $.facebox.settings.imageTypes.join('|') $.facebox.settings.imageTypesRegexp = new RegExp('\.(' + imageTypes + ')$', 'i') if (settings) $.extend($.facebox.settings, settings) $('body').append($.facebox.settings.faceboxHtml) var preload = [ new Image(), new Image() ] preload[0].src = $.facebox.settings.closeImage preload[1].src = $.facebox.settings.loadingImage $('#facebox').find('.b:first, .bl').each(function() { preload.push(new Image()) preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') }) $('#facebox .close').click($.facebox.close) $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) } // getPageScroll() by quirksmode.com function getPageScroll() { var xScroll, yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; xScroll = self.pageXOffset; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict yScroll = document.documentElement.scrollTop; xScroll = document.documentElement.scrollLeft; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; xScroll = document.body.scrollLeft; } return new Array(xScroll,yScroll) } // Adapted from getPageSize() by quirksmode.com function getPageHeight() { var windowHeight if (self.innerHeight) { // all except Explorer windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowHeight = document.body.clientHeight; } return windowHeight } // Backwards compatibility function makeCompatible() { var $s = $.facebox.settings $s.loadingImage = $s.loading_image || $s.loadingImage $s.closeImage = $s.close_image || $s.closeImage $s.imageTypes = $s.image_types || $s.imageTypes $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml } // Figures out what you want to display and displays it // formats are: // div: #id // image: blah.extension // ajax: anything else function fillFaceboxFromHref(href, klass) { // div if (href.match(/#/)) { var url = window.location.href.split('#')[0] var target = href.replace(url,'') if (target == '#') return $.facebox.reveal($(target).html(), klass) // image } else if (href.match($.facebox.settings.imageTypesRegexp)) { fillFaceboxFromImage(href, klass) // ajax } else { fillFaceboxFromAjax(href, klass) } } function fillFaceboxFromImage(href, klass) { var image = new Image() image.onload = function() { $.facebox.reveal('
', klass) } image.src = href } function fillFaceboxFromAjax(href, klass) { $.get(href, function(data) { $.facebox.reveal(data, klass) }) } function skipOverlay() { return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null } function showOverlay() { if (skipOverlay()) return if ($('#facebox_overlay').length == 0) $("body").append('
') $('#facebox_overlay').hide().addClass("facebox_overlayBG") .css('opacity', $.facebox.settings.opacity) .click(function() { $(document).trigger('close.facebox') }) .fadeIn(200) return false } function hideOverlay() { if (skipOverlay()) return $('#facebox_overlay').fadeOut(200, function(){ $("#facebox_overlay").removeClass("facebox_overlayBG") $("#facebox_overlay").addClass("facebox_hide") $("#facebox_overlay").remove() }) return false } /* * Bindings */ $(document).bind('close.facebox', function() { $(document).unbind('keydown.facebox') $('#facebox').fadeOut(function() { $('#facebox .content').removeClass().addClass('content') $('#facebox .loading').remove() $(document).trigger('afterClose.facebox') }) hideOverlay() }) })(jQuery); colorspacious-1.1.0/doc/_static/show-code.js0000644000000000000000000000253612545654606017540 0ustar rootroot// Stolen from statsmodels and fixed up function htmlescape(text){ return (text.replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'")) } function scrapeText(codebox){ /// Returns input lines cleaned of prompt1 and prompt2 var lines = codebox.split('\n'); var newlines = new Array(); $.each(lines, function() { if (this.match(/^In \[\d+]: /)){ newlines.push(this.replace(/^(\s)*In \[\d+]: /,"")); } else if (this.match(/^(\s)*\.+:/)){ newlines.push(this.replace(/^(\s)*\.+: /,"")); } } ); return newlines.join('\\n'); } $(document).ready( function() { // grab all code boxes var ipythoncode = $(".highlight-ipython"); $.each(ipythoncode, function() { var code = scrapeText($(this).text()); // give them a facebox pop-up with plain text code $(this).append('View Code'); $(this,"textarea").select(); }); }); colorspacious-1.1.0/colorspacious.egg-info/0000755000000000000000000000000013023030663017447 5ustar rootrootcolorspacious-1.1.0/colorspacious.egg-info/requires.txt0000644000000000000000000000000613010731600022036 0ustar rootrootnumpy colorspacious-1.1.0/colorspacious.egg-info/SOURCES.txt0000644000000000000000000000161513010731600021331 0ustar rootrootLICENSE.txt MANIFEST.in README.rst setup.cfg setup.py colorspacious/__init__.py colorspacious/basics.py colorspacious/ciecam02.py colorspacious/comparison.py colorspacious/conversion.py colorspacious/cvd.py colorspacious/gold_values.py colorspacious/illuminants.py colorspacious/luoetal2006.py colorspacious/testing.py colorspacious/transform_graph.py colorspacious/util.py colorspacious/version.py colorspacious.egg-info/PKG-INFO colorspacious.egg-info/SOURCES.txt colorspacious.egg-info/dependency_links.txt colorspacious.egg-info/requires.txt colorspacious.egg-info/top_level.txt doc/Makefile doc/bibliography.bib doc/bibliography.rst doc/changes.rst doc/conf.py doc/grace_hopper.png doc/index.rst doc/make.bat doc/overview.rst doc/reference.rst doc/requirements.txt doc/tutorial.rst doc/_static/closelabel.png doc/_static/facebox.css doc/_static/facebox.js doc/_static/loading.gif doc/_static/show-code.jscolorspacious-1.1.0/colorspacious.egg-info/dependency_links.txt0000644000000000000000000000000113010731600023510 0ustar rootroot colorspacious-1.1.0/colorspacious.egg-info/PKG-INFO0000644000000000000000000001012313010731600020534 0ustar rootrootMetadata-Version: 1.1 Name: colorspacious Version: 1.1.0 Summary: A powerful, accurate, and easy-to-use Python library for doing colorspace conversions Home-page: https://github.com/njsmith/colorspacious Author: Nathaniel J. Smith Author-email: njs@pobox.com License: MIT Description: colorspacious ============= .. image:: https://travis-ci.org/njsmith/colorspacious.svg?branch=master :target: https://travis-ci.org/njsmith/colorspacious :alt: Automated test status .. image:: https://codecov.io/gh/njsmith/colorspacious/branch/master/graph/badge.svg :target: https://codecov.io/gh/njsmith/colorspacious :alt: Test coverage .. image:: https://readthedocs.org/projects/colorspacious/badge/?version=latest :target: http://colorspacious.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status Colorspacious is a powerful, accurate, and easy-to-use library for performing colorspace conversions. In addition to the most common standard colorspaces (sRGB, XYZ, xyY, CIELab, CIELCh), we also include: color vision deficiency ("color blindness") simulations using the approach of Machado et al (2009); a complete implementation of `CIECAM02 `_; and the perceptually uniform CAM02-UCS / CAM02-LCD / CAM02-SCD spaces proposed by Luo et al (2006). To get started, simply write:: from colorspacious import cspace_convert Jp, ap, bp = cspace_convert([64, 128, 255], "sRGB255", "CAM02-UCS") This converts an sRGB value (represented as integers between 0-255) to CAM02-UCS `J'a'b'` coordinates (assuming standard sRGB viewing conditions by default). This requires passing through 4 intermediate colorspaces; ``cspace_convert`` automatically finds the optimal route and applies all conversions in sequence: This function also of course accepts arbitrary NumPy arrays, so converting a whole image is just as easy as converting a single value. Documentation: http://colorspacious.readthedocs.org/ Installation: ``pip install colorspacious`` Downloads: https://pypi.python.org/pypi/colorspacious/ Code and bug tracker: https://github.com/njsmith/colorspacious Contact: Nathaniel J. Smith Dependencies: * Python 2.6+, or 3.3+ * NumPy Developer dependencies (only needed for hacking on source): * nose: needed to run tests License: MIT, see LICENSE.txt for details. References for algorithms we implement: * Luo, M. R., Cui, G., & Li, C. (2006). Uniform colour spaces based on CIECAM02 colour appearance model. Color Research & Application, 31(4), 320–330. doi:10.1002/col.20227 * Machado, G. M., Oliveira, M. M., & Fernandes, L. A. (2009). A physiologically-based model for simulation of color vision deficiency. Visualization and Computer Graphics, IEEE Transactions on, 15(6), 1291–1298. http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html Other Python packages with similar functionality that you might want to check out as well or instead: * ``colour``: http://colour-science.org/ * ``colormath``: http://python-colormath.readthedocs.org/ * ``ciecam02``: https://pypi.python.org/pypi/ciecam02/ * ``ColorPy``: http://markkness.net/colorpy/ColorPy.html Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 colorspacious-1.1.0/colorspacious.egg-info/top_level.txt0000644000000000000000000000001613010731600022171 0ustar rootrootcolorspacious colorspacious-1.1.0/colorspacious/0000755000000000000000000000000013023030663015755 5ustar rootrootcolorspacious-1.1.0/colorspacious/util.py0000644000000000000000000000260312550456764017327 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2015 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np def stacklast(*arrs): arrs = [np.asarray(arr)[..., np.newaxis] for arr in arrs] return np.concatenate(arrs, axis=-1) def test_stacklast(): assert np.array_equal(stacklast([1, 2, 3], [4, 5, 6]), [[1, 4], [2, 5], [3, 6]]) assert stacklast(np.zeros((3, 4)), np.zeros((3, 4))).shape == (3, 4, 2) # Using color conventions: degrees 0-360 def color_cart2polar(a, b): h_rad = np.arctan2(b, a) h = np.rad2deg(h_rad) % 360 r = np.hypot(a, b) return (r, h) def test_color_cart2polar(): assert np.allclose(color_cart2polar(0, 1), (1, 90)) assert np.allclose(color_cart2polar(0, 10), (10, 90)) assert np.allclose(color_cart2polar(-1, 0), (1, 180)) assert np.allclose(color_cart2polar([0, 0, -1], [1, 10, 0]), ([1, 10, 1], [90, 90, 180])) def color_polar2cart(r, h): h_rad = np.deg2rad(h) return (r * np.cos(h_rad), r * np.sin(h_rad)) def test_color_polar2cart(): assert np.allclose(color_polar2cart(1, 90), (0, 1)) assert np.allclose(color_polar2cart(10, 90), (0, 10)) assert np.allclose(color_polar2cart(1, 180), (-1, 0)) assert np.allclose(color_polar2cart([1, 10, 1], [90, 90, 180]), ([0, 0, -1], [1, 10, 0])) colorspacious-1.1.0/colorspacious/ciecam02.py0000644000000000000000000004745613010730340017725 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014 Nathaniel Smith # See file LICENSE.txt for license information. from __future__ import division from collections import namedtuple import numpy as np from .illuminants import as_XYZ100_w __all__ = [ "CIECAM02Surround", "CIECAM02Space", "NegativeAError", "JChQMsH", ] # F, c, Nc: surround parameters # F c Nc # Average 1.0 0.69 1.0 # Dim 0.9 0.59 0.95 # Dark 0.8 0.525 0.8 CIECAM02Surround = namedtuple("CIECAM02Surround", ["F", "c", "N_c"]) CIECAM02Surround.AVERAGE = CIECAM02Surround(1.0, 0.69, 1.0) CIECAM02Surround.DIM = CIECAM02Surround(0.9, 0.59, 1.95) CIECAM02Surround.DARK = CIECAM02Surround(0.8, 0.525, 1.8) JChQMsH = namedtuple("JChQMsH", ["J", "C", "h", "Q", "M", "s", "H"]) M_CAT02 = np.asarray([[ 0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [ 0.0030, 0.0136, 0.9834]]) M_HPE = np.asarray([[ 0.38971, 0.68898, -0.07868], [-0.22981, 1.18340, 0.04641], [ 0.00000, 0.00000, 1.00000]]) # These are very well-conditioned matrices (condition numbers <4), so just # taking the inverse is fine, and it simplifies things below. M_CAT02_inv = np.linalg.inv(M_CAT02) M_HPE_M_CAT02_inv = np.dot(M_HPE, M_CAT02_inv) M_CAT02_M_HPE_inv = np.dot(M_CAT02, np.linalg.inv(M_HPE)) h_i = np.asarray([20.14, 90.00, 164.25, 237.53, 380.14]) e_i = np.asarray([ 0.8, 0.7, 1.0, 1.2, 0.8]) H_i = np.asarray([ 0.0, 100.0, 200.0, 300.0, 400.0]) def broadcasting_matvec(A, B): # We want to handle two cases that come up a bunch below. # B is always a vector, or collection of vectors. So it has shape # (..., j) # where j is the number of entries in each vector. # A is either a matrix or a vector, and we want to broadcast np.dot(A, # B_vec) over all possible B_vecs. # When A has shape (i, j), this means our result should have shape # (..., i) # and when A has shape (j,), this means our result should have shape # (...) # So a generalization is that given # A.shape == (...1, j) # B.shape == (...2, j) # we want a result with shape # (...2, ...1) # it turns out that this is the magic incantation for doing that: return np.inner(B, A) def require_exactly_one(**kwargs): non_None = sum(v is not None for v in kwargs.values()) if non_None != 1: raise ValueError("Exactly one of %s must be specified" % (", ".join(kwargs))) class NegativeAError(ValueError): """A :class:`ValueError` that can be raised when converting to CIECAM02. See :meth:`CIECAM02Space.XYZ100_to_CIECAM02` for details. """ pass class CIECAM02Space(object): """An object representing a particular set of CIECAM02 viewing conditions. :param XYZ100_w: The whitepoint. Either a string naming one of the known standard whitepoints like ``"D65"``, or else a point in XYZ100 space. :param Y_b: Background luminance. :param L_A: Luminance of the adapting field (in cd/m^2). :param surround: A :class:`CIECAM02Surround` object. """ def __init__(self, XYZ100_w, Y_b, L_A, surround=CIECAM02Surround.AVERAGE): self.XYZ100_w = as_XYZ100_w(XYZ100_w) # as_XYZ100_w allows for multiple whitepoints to be returned, but we # aren't vectorized WRT whitepoint if self.XYZ100_w.shape != (3,): raise ValueError("Hey! XYZ100_w should have shape (3,)!") self.Y_b = float(Y_b) self.L_A = float(L_A) self.surround = surround self.F = float(surround.F) self.c = float(surround.c) self.N_c = float(surround.N_c) self.RGB_w = np.dot(M_CAT02, self.XYZ100_w) self.D = self.F * (1 - (1/3.6) * np.exp((-self.L_A - 42) / 92)) self.D = np.clip(self.D, 0, 1) self.D_RGB = self.D * self.XYZ100_w[1] / self.RGB_w + 1 - self.D # Fairchild (2013), pages 290-292, recommends using this equation # instead, though notes that it doesn't make much difference as part # of a full CIECAM02 system. (It matters more if you're only using # pieces.) #self.D_RGB = self.D * 100 / self.RGB_w + 1 - self.D self.k = 1 / (5 * self.L_A + 1) self.F_L = (0.2 * self.k ** 4 * (5 * self.L_A) + 0.1 * (1 - self.k**4)**2 * (5 * self.L_A) ** (1./3)) self.n = self.Y_b / self.XYZ100_w[1] self.z = 1.48 + np.sqrt(self.n) self.N_bb = 0.725 * (1 / self.n)**0.2 self.N_cb = self.N_bb #?? self.RGB_wc = self.D_RGB * self.RGB_w self.RGBprime_w = np.dot(M_HPE_M_CAT02_inv, self.RGB_wc) tmp = ((self.F_L * self.RGBprime_w) / 100) ** 0.42 self.RGBprime_aw = 400 * (tmp / (tmp + 27.13)) + 0.1 self.A_w = ((np.dot([2, 1, 1. / 20], self.RGBprime_aw) - 0.305) * self.N_bb) def __repr__(self): surround_string = ", surround=%r" % (self.surround,) if self.surround == CIECAM02Surround.AVERAGE: surround_string = "" return "%s(%r, %r, %r%s) " % ( self.__class__.__name__, list(self.XYZ100_w), self.Y_b, self.L_A, surround_string) # XYZ100 must have shape (3,) or (3, n) def XYZ100_to_CIECAM02(self, XYZ100, on_negative_A="raise"): """Computes CIECAM02 appearance correlates for the given tristimulus value(s) XYZ (normalized to be on the 0-100 scale). Example: ``vc.XYZ100_to_CIECAM02([30.0, 45.5, 21.0])`` :param XYZ100: An array-like of tristimulus values. These should be given on the 0-100 scale, not the 0-1 scale. The array-like should have shape ``(..., 3)``; e.g., you can use a simple 3-item list (shape = ``(3,)``), or to efficiently perform multiple computations at once, you could pass a higher-dimensional array, e.g. an image. :arg on_negative_A: A known infelicity of the CIECAM02 model is that for some inputs, the achromatic signal :math:`A` can be negative, which makes it impossible to compute :math:`J`, :math:`C`, :math:`Q`, :math:`M`, or :math:`s` -- only :math:`h`: and :math:`H` are spared. (See, e.g., section 2.6.4.1 of :cite:`Luo-CIECAM02` for discussion.) This argument allows you to specify a strategy for handling such points. Options are: * ``"raise"``: throws a :class:`NegativeAError` (a subclass of :class:`ValueError`) * ``"nan"``: return not-a-number values for the affected elements. (This may be particularly useful if converting a large number of points at once.) :returns: A named tuple of type :class:`JChQMsH`, with attributes ``J``, ``C``, ``h``, ``Q``, ``M``, ``s``, and ``H`` containing the CIECAM02 appearance correlates. """ #### Argument checking XYZ100 = np.asarray(XYZ100, dtype=float) if XYZ100.shape[-1] != 3: raise ValueError("XYZ100 shape must be (..., 3)") #### Step 1 RGB = broadcasting_matvec(M_CAT02, XYZ100) #### Step 2 RGB_C = self.D_RGB * RGB #### Step 3 RGBprime = broadcasting_matvec(M_HPE_M_CAT02_inv, RGB_C) #### Step 4 RGBprime_signs = np.sign(RGBprime) tmp = (self.F_L * RGBprime_signs * RGBprime / 100) ** 0.42 RGBprime_a = RGBprime_signs * 400 * (tmp / (tmp + 27.13)) + 0.1 #### Step 5 a = broadcasting_matvec([1, -12. / 11, 1. / 11], RGBprime_a) b = broadcasting_matvec([1. / 9, 1. / 9, -2. / 9], RGBprime_a) h_rad = np.arctan2(b, a) h = np.rad2deg(h_rad) % 360 # #### Step 6 # hprime = h, unless h < 20.14, in which case hprime = h + 360. hprime = np.select([h < h_i[0], True], [h + 360, h]) # we use 0-based indexing, so our i is one less than the reference # formulas' i. i = np.searchsorted(h_i, hprime, side="right") - 1 tmp = (hprime - h_i[i]) / e_i[i] H = H_i[i] + ((100 * tmp) / (tmp + (h_i[i + 1] - hprime) / e_i[i + 1])) #### Step 7 A = ((broadcasting_matvec([2, 1, 1. / 20], RGBprime_a) - 0.305) * self.N_bb) if on_negative_A == "raise": if np.any(A < 0): raise NegativeAError("attempted to convert a tristimulus " "value whose achromatic signal was " "negative, and on_negative_A=\"raise\"") elif on_negative_A == "nan": A = np.select([A < 0, True], [np.nan, A]) else: raise ValueError("Invalid on_negative_A argument: got %r, " "expected \"raise\" or \"nan\"" % (on_negative_A,)) #### Step 8 J = 100 * (A / self.A_w) ** (self.c * self.z) #### Step 9 Q = self._J_to_Q(J) #### Step 10 e = (12500. / 13) * self.N_c * self.N_cb * (np.cos(h_rad + 2) + 3.8) t = (e * np.sqrt(a ** 2 + b ** 2) / broadcasting_matvec([1, 1, 21. / 20], RGBprime_a)) C = t**0.9 * (J / 100)**0.5 * (1.64 - 0.29**self.n)**0.73 M = C * self.F_L**0.25 s = 100 * (M / Q)**0.5 return JChQMsH(J, C, h, Q, M, s, H) def _J_to_Q(self, J): return ((4 / self.c) * (J / 100) ** 0.5 * (self.A_w + 4) * self.F_L**0.25) def CIECAM02_to_XYZ100(self, J=None, C=None, h=None, Q=None, M=None, s=None, H=None): """Return the unique tristimulus values that have the given CIECAM02 appearance correlates under these viewing conditions. You must specify 3 arguments: * Exactly one of ``J`` and ``Q`` * Exactly one of ``C``, ``M``, and ``s`` * Exactly one of ``h`` and ``H``. Arguments can be vectors, in which case they will be broadcast against each other. Returned tristimulus values will be on the 0-100 scale, not the 0-1 scale. """ #### Argument checking require_exactly_one(J=J, Q=Q) require_exactly_one(C=C, M=M, s=s) require_exactly_one(h=h, H=H) if J is not None: J = np.asarray(J, dtype=float) if C is not None: C = np.asarray(C, dtype=float) if h is not None: h = np.asarray(h, dtype=float) if Q is not None: Q = np.asarray(Q, dtype=float) if M is not None: M = np.asarray(M, dtype=float) if s is not None: s = np.asarray(s, dtype=float) if H is not None: H = np.asarray(H, dtype=float) #### Step 1: conversions to get JCh if J is None: J = 6.25 * ((self.c * Q) / ((self.A_w + 4) * self.F_L**0.25)) ** 2 if C is None: if M is not None: C = M / self.F_L**0.25 else: assert s is not None # when starting from s, we need Q if Q is None: Q = self._J_to_Q(J) C = (s / 100) ** 2 * (Q / self.F_L**0.25) if h is None: i = np.searchsorted(H_i, H, side="right") - 1 # BROKEN: num1 = (H - H_i[i]) * (e_i[i + 1] * h_i[i] - e_i[i] * h_i[i + 1]) num2 = -100 * h_i[i] * e_i[i + 1] denom1 = (H - H_i[i]) * (e_i[i + 1] - e_i[i]) denom2 = -100 * e_i[i + 1] hprime = (num1 + num2) / (denom1 + denom2) h = np.select([hprime > 360, True], [hprime - 360, hprime]) J, C, h = np.broadcast_arrays(J, C, h) target_shape = J.shape # 0d arrays break indexing stuff if J.ndim == 0: J = np.atleast_1d(J) C = np.atleast_1d(C) h = np.atleast_1d(h) #### Step 2 t = (C / (np.sqrt(J / 100) * (1.64 - 0.29**self.n) ** 0.73) ) ** (1 / 0.9) e_t = 0.25 * (np.cos(np.deg2rad(h) + 2) + 3.8) A = self.A_w * (J / 100) ** (1 / (self.c * self.z)) # an awkward way of calculating 1/t such that 1/0 -> inf with np.errstate(divide="ignore"): one_over_t = 1 / t one_over_t = np.select([np.isnan(one_over_t), True], [np.inf, one_over_t]) p_1 = (50000. / 13) * self.N_c * self.N_cb * e_t * one_over_t p_2 = A / self.N_bb + 0.305 p_3 = 21. / 20 #### Step 3 sin_h = np.sin(np.deg2rad(h)) cos_h = np.cos(np.deg2rad(h)) # to avoid divide-by-zero (or divide-by-eps) issues, we use different # computations when |sin_h| > |cos_h| and vice-versa num = p_2 * (2 + p_3) * (460. / 1403) denom_part2 = (2 + p_3) * (220. / 1403) denom_part3 = (-27. / 1403) + p_3 * (6300. / 1403) a = np.empty_like(h) b = np.empty_like(h) small_cos = (np.abs(sin_h) >= np.abs(cos_h)) # NB denom_part2 and denom_part3 are scalars b[small_cos] = (num[small_cos] / (p_1[small_cos] / sin_h[small_cos] + (denom_part2 * cos_h[small_cos] / sin_h[small_cos]) + denom_part3)) a[small_cos] = b[small_cos] * cos_h[small_cos] / sin_h[small_cos] a[~small_cos] = (num[~small_cos] / (p_1[~small_cos] / cos_h[~small_cos] + denom_part2 + (denom_part3 * sin_h[~small_cos] / cos_h[~small_cos]))) b[~small_cos] = a[~small_cos] * sin_h[~small_cos] / cos_h[~small_cos] #### Step 4 p2ab = np.concatenate((p_2[..., np.newaxis], a[..., np.newaxis], b[..., np.newaxis]), axis=-1) RGBprime_a_matrix = (1. / 1403 * np.asarray([[ 460, 451, 288], [ 460, -891, -261], [ 460, -220, -6300]], dtype=float)) RGBprime_a = broadcasting_matvec(RGBprime_a_matrix, p2ab) #### Step 5 RGBprime = (np.sign(RGBprime_a - 0.1) * (100 / self.F_L) * ((27.13 * np.abs(RGBprime_a - 0.1)) / (400 - np.abs(RGBprime_a - 0.1))) ** (1 / 0.42)) #### Step 6 RGB_C = broadcasting_matvec(M_CAT02_M_HPE_inv, RGBprime) #### Step 7 RGB = RGB_C / self.D_RGB #### Step 8 XYZ100 = broadcasting_matvec(M_CAT02_inv, RGB) XYZ100 = XYZ100.reshape(target_shape + (3,)) return XYZ100 CIECAM02Space.sRGB = CIECAM02Space( # sRGB specifies a D65 monitor and a D50 ambient. CIECAM02 doesn't really # know how to deal with this discrepancy; it appears that the usual thing # to do is just to use D65 for the whitepoint. XYZ100_w="D65", Y_b=20, # To compute L_A: # illuminance in lux / pi = luminance in cd/m^2 # luminance in cd/m^2 / 5 = L_A (the "grey world assumption") # See Moroney (2000), "Usage guidelines for CIECAM97s". # sRGB illuminance is 64 lux. L_A=(64 / np.pi) / 5, surround=CIECAM02Surround.AVERAGE) ################################################################ # Tests ################################################################ def check_roundtrip(vc, XYZ100): try: values = vc.XYZ100_to_CIECAM02(XYZ100, on_negative_A="raise") except NegativeAError: # don't expect to be able to round-trip these values return for kwarg1 in ["J", "Q"]: for kwarg2 in ["C", "M", "s"]: for kwarg3 in ["h", "H"]: got = vc.CIECAM02_to_XYZ100(**{kwarg1: getattr(values, kwarg1), kwarg2: getattr(values, kwarg2), kwarg3: getattr(values, kwarg3)}) assert np.allclose(got, XYZ100) def test_gold(): from .gold_values import XYZ100_CIECAM02_gold for t in XYZ100_CIECAM02_gold: got = t.vc.XYZ100_to_CIECAM02(t.XYZ100) for i in range(len(got)): assert np.allclose(got[i], t.expected[i], atol=1e-05) check_roundtrip(t.vc, t.XYZ100) def test_inverse(): r = np.random.RandomState(0) XYZ100_values = [[0, 0, 0], [50, 50, 50]] for i in range(10): XYZ100_values.append(r.uniform(high=100, size=3)) for illuminant in ["C", "D50", "D65"]: for Y_b in [20, 18]: for L_A in [30, 300]: for surround in [CIECAM02Surround.AVERAGE, CIECAM02Surround.DIM, CIECAM02Surround.DARK]: vc = CIECAM02Space(illuminant, Y_b, L_A, surround) for XYZ100 in XYZ100_values: check_roundtrip(vc, XYZ100) def test_misc(): from nose.tools import assert_raises # Only one whitepoint can be specified assert_raises(ValueError, CIECAM02Space, [[20, 100, 80], [80, 100, 20]], 20, 30) # smoke test repr(CIECAM02Space.sRGB) repr(CIECAM02Space("D65", 20, 4, surround=CIECAM02Surround.DIM)) # input shape check assert_raises(ValueError, CIECAM02Space.sRGB.XYZ100_to_CIECAM02, np.ones((10, 4))) # on_negative_A validity check assert_raises(ValueError, CIECAM02Space.sRGB.XYZ100_to_CIECAM02, np.ones((10, 3)), on_negative_A="asdfasdf") def test_exactly_one(): from nose.tools import assert_raises vc = CIECAM02Space.sRGB # Redundant specifications not allowed assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, C=1, h=1, Q=1) assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, C=1, h=1, M=1) assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, C=1, h=1, s=1) assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, C=1, h=1, H=1) # Underspecified colors not allowed either assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, C=1) assert_raises(ValueError, vc.CIECAM02_to_XYZ100, J=1, h=1) assert_raises(ValueError, vc.CIECAM02_to_XYZ100, C=1, h=1) def test_vectorized(): vc = CIECAM02Space.sRGB XYZ100s = [[20, 30, 40], [40, 30, 20]] CIECAM02s = vc.XYZ100_to_CIECAM02(XYZ100s) for i, XYZ100 in enumerate(XYZ100s): CIECAM02 = vc.XYZ100_to_CIECAM02(XYZ100) for j in range(len(CIECAM02)): assert np.allclose(CIECAM02[j], CIECAM02s[j][i]) check_roundtrip(vc, XYZ100s) def test_on_negative_A(): from nose.tools import assert_raises vc = CIECAM02Space("D65", 20, 30) bad_XYZ100 = [8.71292997, 2.02183974, 83.26198455] good_XYZ100 = [20, 30, 40] assert_raises(NegativeAError, vc.XYZ100_to_CIECAM02, bad_XYZ100) assert_raises(NegativeAError, vc.XYZ100_to_CIECAM02, [bad_XYZ100, good_XYZ100]) assert_raises(NegativeAError, vc.XYZ100_to_CIECAM02, bad_XYZ100, on_negative_A="raise") assert_raises(NegativeAError, vc.XYZ100_to_CIECAM02, [bad_XYZ100, good_XYZ100], on_negative_A="raise") bad_CIECAM02 = vc.XYZ100_to_CIECAM02(bad_XYZ100, on_negative_A="nan") for bad_attr in "JCQMs": assert np.isnan(getattr(bad_CIECAM02, bad_attr)) assert np.allclose(bad_CIECAM02.h, 205.80008) assert np.allclose(bad_CIECAM02.H, 261.11054) mixed_CIECAM02 = vc.XYZ100_to_CIECAM02([bad_XYZ100, good_XYZ100], on_negative_A="nan") for bad_attr in "JCQMs": assert np.all(np.isnan(getattr(mixed_CIECAM02, bad_attr)) == [True, False]) assert np.all(np.isnan(mixed_CIECAM02.h) == [False, False]) assert np.all(np.isnan(mixed_CIECAM02.H) == [False, False]) colorspacious-1.1.0/colorspacious/version.py0000644000000000000000000000150413010731522020012 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014 Nathaniel Smith # See file LICENSE.txt for license information. # This file must be kept very simple, because it is consumed from several # places -- it is imported by colorspacious/__init__.py, execfile'd by # setup.py, etc. # We use a simple scheme: # 1.0.0 -> 1.0.0+dev -> 1.1.0 -> 1.1.0+dev # where the +dev versions are never released into the wild, they're just what # we stick into the VCS in between releases. # # This is compatible with PEP 440: # http://legacy.python.org/dev/peps/pep-0440/ # via the use of the "local suffix" "+dev", which is disallowed on index # servers and causes 1.0.0+dev to sort after plain 1.0.0, which is what we # want. (Contrast with the special suffix 1.0.0.dev, which sorts *before* # 1.0.0.) __version__ = "1.1.0" colorspacious-1.1.0/colorspacious/comparison.py0000644000000000000000000000551312615255174020521 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014-2015 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np from .conversion import cspace_convert def deltaE(color1, color2, input_space="sRGB1", uniform_space="CAM02-UCS"): """Computes the :math:`\Delta E` distance between pairs of colors. :param input_space: The space the colors start out in. Can be anything recognized by :func:`cspace_convert`. Default: "sRGB1" :param uniform_space: Which space to perform the distance measurement in. This should be a uniform space like CAM02-UCS where Euclidean distance approximates similarity judgements, because otherwise the results of this function won't be very meaningful, but in fact any color space known to :func:`cspace_convert` will be accepted. By default, computes the euclidean distance in CAM02-UCS :math:`J'a'b'` space (thus giving :math:`\Delta E'`); for details, see :cite:`CAM02-UCS`. If you want the classic :math:`\Delta E^*_{ab}` defined by CIE 1976, use ``uniform_space="CIELab"``. Other good choices include ``"CAM02-LCD"`` and ``"CAM02-SCD"``. This function has no ability to perform :math:`\Delta E` calculations like CIEDE2000 that are not based on euclidean distances. This function is vectorized, i.e., color1, color2 may be arrays with shape (..., 3), in which case we compute the distance between corresponding pairs of colors. """ uniform1 = cspace_convert(color1, input_space, uniform_space) uniform2 = cspace_convert(color2, input_space, uniform_space) return np.sqrt(np.sum((uniform1 - uniform2) ** 2, axis=-1)) def test_deltaE(): from .gold_values import deltaE_1976_sRGB255_gold for a, b, gold in deltaE_1976_sRGB255_gold: a = np.asarray(a, dtype=float) b = np.asarray(b, dtype=float) got = deltaE(a, b, input_space="sRGB255", uniform_space="CIELab") np.testing.assert_allclose(got, gold, rtol=1e-4) got = deltaE(a / 255.0, b / 255.0, input_space="sRGB1", uniform_space="CIELab") np.testing.assert_allclose(got, gold, rtol=1e-4) got = deltaE(a / 255.0, b / 255.0, uniform_space="CIELab") np.testing.assert_allclose(got, gold, rtol=1e-4) # Check vectorization all_a = [obj[0] for obj in deltaE_1976_sRGB255_gold] all_b = [obj[1] for obj in deltaE_1976_sRGB255_gold] all_gold = [obj[2] for obj in deltaE_1976_sRGB255_gold] got = deltaE(all_a, all_b, input_space="sRGB255", uniform_space="CIELab") np.testing.assert_allclose(got, all_gold, rtol=1e-4) from .gold_values import deltaE_sRGB255_CAM02UCS_silver for a, b, silver in deltaE_sRGB255_CAM02UCS_silver: got = deltaE(a, b, input_space="sRGB255") np.testing.assert_allclose(got, silver) colorspacious-1.1.0/colorspacious/gold_values.py0000644000000000000000000002331313010726400020632 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014-2015 Nathaniel Smith # See file LICENSE.txt for license information. # Test vectors for different conversions, sourced from various places from collections import namedtuple from .ciecam02 import CIECAM02Space, CIECAM02Surround, JChQMsH ################################################################ # CIECAM02 ################################################################ CIECAM02TestVec = namedtuple("CIECAM02TestVec", ["XYZ100", "vc", "expected"]) _S = CIECAM02Surround XYZ100_CIECAM02_gold = [ # Gold values from # https://github.com/igd-geo/pcolor/blob/master/de.fhg.igd.pcolor.test/src/de/fhg/igd/pcolor/test/CAMWorkedExample.java # apparently taken from CIE 159:2004 Section 9 CIECAM02TestVec(XYZ100=[19.31, 23.93, 10.14], vc=CIECAM02Space(XYZ100_w=[98.88, 90, 32.03], L_A=200, Y_b=18, surround=_S(F=1.0, c=0.69, N_c=1.0)), expected=JChQMsH(h=191.0452, J=48.0314, Q=183.1240, s=46.0177, C=38.7789, M=38.7789, H=240.8885)), CIECAM02TestVec(XYZ100=[19.31, 23.93, 10.14], vc=CIECAM02Space(XYZ100_w=[98.88, 90, 32.03], L_A=20, # <- different from above Y_b=18, surround=_S(F=1.0, c=0.69, N_c=1.0)), expected=JChQMsH(h=185.3445, J=47.6856, Q=113.8401, s=51.1275, C=36.0527, M=29.7580, H=232.6630)), # gold values from Mark Fairchild's spreadsheet at # http://rit-mcsl.org/fairchild//files/AppModEx.xls CIECAM02TestVec(XYZ100=[19.01, 20.00, 21.78], vc=CIECAM02Space(XYZ100_w=[95.05, 100.0, 108.88], Y_b=20.0, L_A=318.30988618379, surround=_S(F=1.0, c=0.69, N_c=1.0)), expected=JChQMsH(h=219.04841, J=41.73109, Q=195.37131, s=2.36031, C=0.10471, M=0.10884, H=278.06070)), CIECAM02TestVec(XYZ100=[57.06, 43.06, 31.96], vc=CIECAM02Space(XYZ100_w=[95.05, 100.0, 108.88], L_A=31.830988618379, Y_b=20.0, surround=_S(F=1.0, c=0.69, N_c=1.0)), # The H value here based on the corrected version of the # spreadsheet that I sent Mark Fairchild on # 2014-07-15... the original spreadsheet had it wrong, so # if comparing be careful about which version you have! expected=JChQMsH(h=19.55739, J=65.95523, Q=152.67220, s=52.24549, C=48.57050, M=41.67327, H=399.38837)), ] ################################################################ # Elementary conversions ################################################################ # Test values from http://davengrace.com/dave/cspace/ # In their notation, "sRGB'" is regular sRGB, and "sRGB" is sRGB_linear # AFAICT these are accurate sRGB1_sRGB1_linear_gold = [ ([0.1, 0.2, 0.3], [0.010022825574869, 0.0331047665708851, 0.0732389558784054]), ([0.9, 0.8, 0.7], [0.787412289395617, 0.603827338855338, 0.447988412441883]), # make sure we have a test point with values less than the C linearity # cutoff. ([0.04, 0.02, 0.01], [0.00309597523219814, 0.00154798761609907, 0.000773993808049536]), ] # Test values from http://davengrace.com/dave/cspace/ # This uses a rounded-off sRGB->XYZ100 matrix so has some error sRGB1_linear_XYZ100_gold = [ ([0.00650735931, 0.00789021442, 0.114259116060], # sRGB1_linear [2.61219, 1.52732, 10.96471]), # XYZ100 ([0.03836396959, 0.01531740787, 0.014587362033], # sRGB1_linear [2.39318, 2.01643, 1.64315]), # XYZ100 ] # The calculator at davengrace.com # http://davengrace.com/dave/cspace/ # has accurate XYZ100->sRGB and reasonable sRGB->XYZ100, but errorful # XYZ100<->CIELab. # # The calculator at # http://www.brucelindbloom.com/index.html?ColorCalculator.html # has poor sRGB matrices, but accurate XYZ100<->CIELab. # For matching conventions to ours, make sure to check "Scale XYZ100" and # "Scale Y", but not "Scale RGB". # Test values from http://www.brucelindbloom.com/index.html?ColorCalculator.html XYZ100_CIELab_gold_D65 = [ ([10, 20, 30], [51.8372, -56.3591, -13.1812]), ([80, 90, 10], [95.9968, -10.6593, 102.8625]), # make sure we have a test point with values below the linearity point ([0.5, 0.6, 0.4], [5.4198, -2.8790, 3.6230]), ] XYZ100_CIELCh_gold_D65 = [ ([10, 20, 30], [51.8372, 57.8800, 193.1636]), ([80, 90, 10], [95.9968, 103.4134, 95.9163]), ] # Test values from http://www.brucelindbloom.com/index.html?ColorCalculator.html XYZ100_CIELab_gold_D50 = [ ([2.61219, 1.52732, 10.96471], # XYZ100 [12.7806, 26.1147, -52.4348]), # CIELab ([2.39318, 2.01643, 1.64315], # XYZ100 [15.5732, 9.7574, 0.2281]), # CIELab # make sure we have a test point with values below the linearity point ([0.5, 0.6, 0.4], # XYZ100 [5.4198, -3.1711, 1.7953]), # CIELab ] XYZ100_CIELCh_gold_D50 = [ ([10, 20, 30], [51.8372, 63.0026, 204.1543]), ([80, 90, 10], [95.9968, 95.0085, 97.8122]), ] ################################################################ # Multi-step conversions ################################################################ # http://www.brucelindbloom.com/index.html?ColorCalculator.html # not very accurate sRGB1_xyY100_gold = [([1.012114, 0.554529, 0.567375], [0.432011, 0.326015, 43.0600]), ([0.2, 0.4, 0.6], [0.210775, 0.222162, 12.5053])] sRGB1_xyY1_gold = [([1.012114, 0.554529, 0.567375], [0.432011, 0.326015, 0.430600]), ([0.2, 0.4, 0.6], [0.210775, 0.222162, 0.125053])] # http://davengrace.com/dave/cspace/ # (More accurate than the Lindbloom calculator at least for this...) sRGB1_CIELab_gold_D65 = [ ([0.2, 0.4, 0.6], [42.0099857768665, -0.147373964354935, -32.8445986139017]), ([0.1, 1.1, -0.1], [95.5971892939889, -92.1527304606657, 91.2351818053272])] # http://davengrace.com/dave/cspace/ # and ignoring the "sRGB8" row because it appears to be calculated by # multiplying by 256 (instead of 255) and then truncating (instead of rounding # or leaving the digits alone) XYZ1_sRGB255_gold = [ ([0.7, 0.8, 0.6], [255 * 0.875406485338221, 255 * 0.929628117681391, 255 * 0.741853183799866]), ([0.4, 0.5, 0.6], [255 * 0.515365680796643, 255 * 0.782919230762447, 255 * 0.77013534525037]), ] ################################################################ # CAM02-UCS and friends ################################################################ # Unfortunately, we do not *have* independent gold test vectors for these, # because there don't seem to be any other public implementations of these # transforms. So these results are generated by our own code! JMh_to_CAM02UCS_silver = [ ([50, 20, 10], [ 62.96296296, 16.22742674, 2.86133316]), ([10, 60, 100], [ 15.88785047, -6.56546789, 37.23461867]), ] JMh_to_CAM02LCD_silver = [ ([50, 20, 10], [ 81.77008177, 18.72061994, 3.30095039]), ([10, 60, 100], [ 20.63357204, -9.04659289, 51.30577777]), ] JMh_to_CAM02SCD_silver = [ ([50, 20, 10], [ 50.77658303, 14.80756375, 2.61097301]), ([10, 60, 100], [ 12.81278263, -5.5311588 , 31.36876036]), ] ################################################################ # delta E 1976 ################################################################ # Gold values from: # http://colormine.org/delta-e-calculator/ # These only match our results to about 4 digits. I can't be bothered to track # down why exactly... it's almost surely that colormine.org is using yet # another sloppy implementation of something with a rounded off conversion # matrix. deltaE_1976_sRGB255_gold = [ ([173, 52, 52], [ 69, 120, 51], 80.3336), ([69, 100, 52], [ 69, 120, 51], 14.7071), ] # We don't have any independent gold test vectors for CAM02-UCS, so these # results are generated by our own code. deltaE_sRGB255_CAM02UCS_silver = [ ([173, 52, 52], [ 69, 120, 51], 44.698469808449964), ([69, 100, 52], [ 69, 120, 51], 8.503323264883667), ] ################################################################ # CVD ################################################################ # We don't have any independent gold test vectors for CVD simulation, so these # results are generated by our own code. CVD_deut50_to_sRGB1_silver = [ ([0.1, 0.2, 0.3], [ 0.12440528, 0.19103024, 0.29911687]), ([0.9, 0.5, 0.3], [ 0.76726301, 0.59528358, 0.29263454]), ] CVD_prot95_to_sRGB1_silver = [ ([0.1, 0.2, 0.3], [ 0.15588987, 0.2038791 , 0.30416046]), ([0.9, 0.5, 0.3], [ 0.62151883, 0.55237436, 0.27997229]), ] colorspacious-1.1.0/colorspacious/transform_graph.py0000644000000000000000000006137512616016500021540 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2015 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np from collections import namedtuple, defaultdict __all__ = ["Edge", "MATCH", "ANY", "TransformGraph"] ################################################################ # Basic types and sentinels ################################################################ # We give these a string id for ease of debugging, but they are really # singleton sentinels compared via is/is not. class Placeholder(object): def __init__(self, id): self.id = id def __repr__(self): # pragma: no cover return "<{0}>".format(self.id) MATCH = Placeholder("MATCH") ANY = Placeholder("ANY") START = Placeholder("START") END = Placeholder("END") Edge = namedtuple("Edge", ["start", "end", "transform"]) Path = namedtuple("Path", ["nodes", "transforms"]) ################################################################ # Invariant checking ################################################################ def assert_(b): if not b: raise AssertionError def check_node(node, allowed_placeholders): assert_(isinstance(node, dict)) assert_(isinstance(node.get("name"), str)) for v in node.values(): if isinstance(v, Placeholder): assert_(v in allowed_placeholders) def test_check_node(): from nose.tools import assert_raises assert_raises(AssertionError, check_node, {}, []) check_node({"name": "asdf"}, []) assert_raises(AssertionError, check_node, {"name": 1}, []) check_node({"name": "asdf", "a": "b"}, []) assert_raises(AssertionError, check_node, {"name": "asdf", "a": MATCH}, [ANY]) check_node({"name": "asdf", "a": ANY, "b": "c"}, [ANY]) # edge_node = edge node, can have MATCH or ANY or concrete values # used in primitive edges def check_edge_node(edge_node): check_node(edge_node, set([MATCH, ANY])) # path_node = path node, can have START or END or concrete values # used in precomputed paths def check_path_node(path_node): check_node(path_node, set([START, END])) # concrete_node = concrete node, can only have concrete values # used in queries def check_concrete_node(concrete_node): check_node(concrete_node, set()) def check_edge(edge): check_edge_node(edge.start) check_edge_node(edge.end) NOTHING = object() for k in set(edge.start).union(edge.end): start_v = edge.start.get(k, NOTHING) end_v = edge.end.get(k, NOTHING) # Every _MATCH must have a matching _MATCH. if MATCH in (start_v, end_v): assert_(start_v is end_v is MATCH) # For simplicity, ANY must not match anything. # In principle you could have a transform # {"foo": "concrete_value"} -> {"foo": ANY} # or even # {"foo": ANY} -> {"foo": ANY} # where the transform can turn any setting of foo into any other. But # we currently don't need this, it complicates things, and makes it # harder to pass the values to the transform, so YAGNI. if ANY in (start_v, end_v): assert_(set([start_v, end_v]) == set([ANY, NOTHING])) def test_check_edge(): from nose.tools import assert_raises check_edge(Edge({"name": "foo"}, {"name": "bar"}, "fake transform")) check_edge(Edge({"name": "foo", "start_any": ANY, "match": MATCH}, {"name": "bar", "end_any": ANY, "match": MATCH}, "fake transform")) for bad in [ Edge({"name": 1}, {"name": "bar"}, "fake transform"), Edge({"name": "foo"}, {"name": 1}, "fake transform"), Edge({"name": "foo"}, {"name": "bar", "other": START}, "fake transform"), Edge({"name": "foo", "a": ANY}, {"name": "bar", "a": ANY}, "fake transform"), Edge({"name": "foo", "a": MATCH}, {"name": "bar", "a": "asdf"}, "fake transform"), Edge({"name": "foo", "a": "asdf"}, {"name": "bar", "a": MATCH}, "fake transform"), ]: assert_raises(AssertionError, check_edge, bad) def check_path(path): for node in path.nodes: check_path_node(node) for start, end in zip(path.nodes[:-1], path.nodes[1:]): for k in set(start).union(end): if k != "name" and k in start and k in end: assert_(start[k] == end[k]) # START and END must have an unbroken chain from the beginning or # end of the path respectively, b/c the only way they can legally # appear in the middle is via MATCH constraints. if start.get(k) is END: assert_(end.get(k) is END) if end.get(k) is START: assert_(start.get(k) is START) assert_(len(path.nodes) == len(path.transforms) + 1) def test_check_path(): from nose.tools import assert_raises check_path(Path(({"name": "foo"}, {"name": "bar"}), ("t1",))) check_path(Path(({"name": "foo"}, {"name": "bar"}, {"name": "baz"}), ("t1", "t2"))) for bad in [ # must be path nodes Path([{"name": 1}, {"name": "bar"}], ["t1"]), Path([{"name": "foo"}, {"name": 1}], ["t1"]), Path([{"name": "foo", "a": ANY}, {"name": "bar"}], ["t1"]), Path([{"name": "foo"}, {"name": "bar", "b": MATCH}], ["t1"]), # no changing values on a transition Path([{"name": "foo", "a": 1}, {"name": "bar", "a": 2}], ["t1"]), # no dropping END Path([{"name": "foo", "a": END}, {"name": "bar"}], ["t1"]), Path([{"name": "foo", "a": END}, {"name": "bar", "a": 2}], ["t1"]), # no spontaneous generation of START Path([{"name": "foo"}, {"name": "bar", "a": START}], ["t1"]), Path([{"name": "foo", "a": 1}, {"name": "bar", "a": START}], ["t1"]), # length mismatches Path([{"name": "foo"}, {"name": "bar"}], []), Path([{"name": "foo"}, {"name": "bar"}], ["t1", "t2"]), ]: assert_raises(AssertionError, check_path, bad) ################################################################ # Dict manipulation utilities ################################################################ # Utilities for replacing values in a dict in-place def _replace_values(d, replacements): # replacements is {old_value: new_value} for k, v in d.items(): if d[k] in replacements: d[k] = replacements[v] def test__replace_values(): d = {"a": 1, "b": 2, "c": 1} _replace_values(d, {1: 11}) assert_(d == {"a": 11, "b": 2, "c": 11}) def _fill_values_from(d, marker, template): # replaces all instances of 'marker' in d with corresponding value from # 'template' for k, v in d.items(): if d[k] is marker: d[k] = template[k] def test__fill_values_from(): d = {"a": 1, "b": 2, "c": 1} _fill_values_from(d, 1, {"a": "a1", "b": "b1", "c": "c1"}) assert_(d == {"a": "a1", "b": 2, "c": "c1"}) ################################################################ # Graph calculations ################################################################ def trivial_path(edge_node): path_node = dict(edge_node) _replace_values(path_node, {MATCH: START, ANY: START}) return Path([path_node], []) def test_trivial_path(): assert_(trivial_path({"name": "start", "foo": MATCH, "bar": ANY, "baz": 1}) == Path([{"name": "start", "foo": START, "bar": START, "baz": 1}], [])) def try_extend_path(path, edge): # Returns a new Path, or None if this edge can't extend this path. # First, check that the last node of the path is compatible with the first # node of the edge. This might require imposing new constraints on the # path, e.g. if our path is # # {"name": "a", "x": START} -> {"name": "b", "x": START} # # and we want to extend it with an edge # # {"name": "b", "x": 0} -> {"name": "c"} # # then that should produce the path # # {"name": "a", "x": 0} -> {"name": "b", "x": 0} -> {"name": "c"} # # where we match the overlapping nodes and then propagated the new # constraint back. if path.nodes[-1].keys() != edge.start.keys(): return None path_fill_ins = defaultdict(dict) for k in path.nodes[-1]: path_value = path.nodes[-1][k] edge_value = edge.start[k] if path_value is START: # START matches anything, but if the edge has a concrete value # then we need to add that constraint if not isinstance(edge_value, Placeholder): path_fill_ins[START][k] = edge_value elif path_value is END: # END matches concrete values and MATCH, but not ANY (because if # it matched ANY, then the END chain would be lost) if isinstance(edge_value, Placeholder): if edge_value is ANY: return None else: assert_(edge_value is MATCH) else: path_fill_ins[END][k] = edge_value else: assert_(not isinstance(path_value, Placeholder)) # Concrete values match placeholders, and identical concrete # values if (not isinstance(edge_value, Placeholder) and path_value != edge_value): return None # propagate any new constraints backwards through the path if path_fill_ins: new_nodes = [] for node in path.nodes: new_node = dict(node) for placeholder, replacements in path_fill_ins.items(): for key, value in replacements.items(): if new_node.get(key) is placeholder: new_node[key] = value new_nodes.append(new_node) path = Path(new_nodes, path.transforms) # now extend the path forward by adding a new node new_path_end = dict(edge.end) # Propagate forward MATCH values _fill_values_from(new_path_end, MATCH, path.nodes[-1]) # Add any new END values _replace_values(new_path_end, {ANY: END}) return Path(path.nodes + [new_path_end], path.transforms + [edge.transform]) def test_try_extend_path(): assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "a": 1}, {"name": "e", "b": 2}, "t1")) == Path([{"name": "s", "a": 1}, {"name": "e", "b": 2}], ["t1"])) # "a" mismatch assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "a": 2}, {"name": "e", "b": 2}, "t1")) is None) # keys mismatch assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "b": 2}, {"name": "e", "b": 2}, "t1")) is None) # match ANY assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "a": ANY}, {"name": "e", "b": 2}, "t1")) == Path([{"name": "s", "a": 1}, {"name": "e", "b": 2}], ["t1"])) # ANY -> END assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "a": 1}, {"name": "e", "b": ANY}, "t1")) == Path([{"name": "s", "a": 1}, {"name": "e", "b": END}], ["t1"])) # propagate value through MATCH assert_(try_extend_path( Path([{"name": "s", "a": 1}], []), Edge({"name": "s", "a": MATCH}, {"name": "e", "a": MATCH}, "t1")) == Path([{"name": "s", "a": 1}, {"name": "e", "a": 1}], ["t1"])) # propagate placeholder through MATCH assert_(try_extend_path( Path([{"name": "s", "a": START}], []), Edge({"name": "s", "a": MATCH}, {"name": "e", "a": MATCH}, "t1")) == Path([{"name": "s", "a": START}, {"name": "e", "a": START}], ["t1"])) assert_(try_extend_path( Path([{"name": "s", "a": END}], []), Edge({"name": "s", "a": MATCH}, {"name": "e", "a": MATCH}, "t1")) == Path([{"name": "s", "a": END}, {"name": "e", "a": END}], ["t1"])) # losing an END is no good assert_(try_extend_path( Path([{"name": "s", "a": END}], []), Edge({"name": "s", "a": ANY}, {"name": "e", "b": 1}, "t1")) is None) # replacing an END or START with a concrete value works assert_(try_extend_path( Path([{"name": "s", "a": START, "b": START}], []), Edge({"name": "s", "a": 1, "b": ANY}, {"name": "e", "c": 1}, "t1")) == Path([{"name": "s", "a": 1, "b": START}, {"name": "e", "c": 1}], ["t1"])) assert_(try_extend_path( Path([{"name": "s", "a": END, "b": END}], []), Edge({"name": "s", "a": 1, "b": 2}, {"name": "e", "c": 1}, "t1")) == Path([{"name": "s", "a": 1, "b": 2}, {"name": "e", "c": 1}], ["t1"])) # and this reaches backwards through the path assert_(try_extend_path( Path([{"name": "1", "a": START, "b": START}, {"name": "2", "a": START}, {"name": "3", "a": START, "b": END}], ["t1", "t2"]), Edge({"name": "3", "a": 1, "b": 2}, {"name": "4", "c": 1}, "t3")) == Path([{"name": "1", "a": 1, "b": START}, {"name": "2", "a": 1}, {"name": "3", "a": 1, "b": 2}, {"name": "4", "c": 1}], ["t1", "t2", "t3"])) def pairwise_shortest_paths(edges): # start node name -> [Edge] edges_from = defaultdict(list) # (frozen start node, frozen end node) -> Path shortest_paths = {} # list of Path objects todo_next = [] # Simple implementation of breadth-first-search: def observe_path(path): check_path(path) #print(" new path: %r" % (path,)) key = (tuple(path.nodes[0].items()), tuple(path.nodes[-1].items())) if key not in shortest_paths: #print(" ...accepted") shortest_paths[key] = path todo_next.append(path) else: #print(" ...rejected") pass for edge in edges: edges_from[edge.start["name"]].append(edge) observe_path(trivial_path(edge.start)) while todo_next: todo_now = todo_next todo_next = [] for path in todo_now: #print("extending: %s" % (path,)) for edge in edges_from[path.nodes[-1]["name"]]: new_path = try_extend_path(path, edge) #print(" + %s -> %s" % (edge, new_path)) if new_path is not None: observe_path(new_path) shortest_paths_by_name = {} for path in shortest_paths.values(): key = (path.nodes[0]["name"], path.nodes[-1]["name"]) shortest_paths_by_name.setdefault(key, []).append(path) return shortest_paths_by_name def test_pairwise_shortest_paths(): # a -> b, b -> c assert_(pairwise_shortest_paths([ Edge({"name": "a"}, {"name": "b"}, "ab"), Edge({"name": "b"}, {"name": "c"}, "bc"), ]) == { ("a", "a"): [Path([{"name": "a"}], [])], ("b", "b"): [Path([{"name": "b"}], [])], ("a", "b"): [Path([{"name": "a"}, {"name": "b"}], ["ab"])], ("b", "c"): [Path([{"name": "b"}, {"name": "c"}], ["bc"])], ("a", "c"): [Path([{"name": "a"}, {"name": "b"}, {"name": "c"}], ["ab", "bc"])], }) # a -> b, b -> c, a -> c # finds shortest a -> c path assert_(pairwise_shortest_paths([ Edge({"name": "a"}, {"name": "b"}, "ab"), Edge({"name": "b"}, {"name": "c"}, "bc"), Edge({"name": "a"}, {"name": "c"}, "ac"), ]) == { ("a", "a"): [Path([{"name": "a"}], [])], ("b", "b"): [Path([{"name": "b"}], [])], ("a", "b"): [Path([{"name": "a"}, {"name": "b"}], ["ab"])], ("b", "c"): [Path([{"name": "b"}, {"name": "c"}], ["bc"])], ("a", "c"): [Path([{"name": "a"}, {"name": "c"}], ["ac"])], }) # MATCH propagation assert_(pairwise_shortest_paths([ Edge({"name": "a", "x": MATCH}, {"name": "b", "x": MATCH}, "ab"), Edge({"name": "b", "x": ANY}, {"name": "c"}, "bc"), ]) == { ("a", "a"): [Path([{"name": "a", "x": START}], [])], ("b", "b"): [Path([{"name": "b", "x": START}], [])], ("a", "b"): [Path([{"name": "a", "x": START}, {"name": "b", "x": START}], ["ab"])], ("b", "c"): [Path([{"name": "b", "x": START}, {"name": "c"}], ["bc"])], ("a", "c"): [Path([{"name": "a", "x": START}, {"name": "b", "x": START}, {"name": "c"}], ["ab", "bc"])], }) # a -> b, b -> c, a -> c # but a->c direct edge requires specific setting for x, so we get two # different paths paths = pairwise_shortest_paths([ Edge({"name": "a", "x": ANY}, {"name": "b"}, "ab"), Edge({"name": "b"}, {"name": "c", "x": ANY}, "bc"), Edge({"name": "a", "x": 1}, {"name": "c", "x": 1}, "ac"), ]) assert_(len(paths[("a", "c")]) == 3) assert_(Path([{"name": "a", "x": START}, {"name": "b"}, {"name": "c", "x": END}], ["ab", "bc"]) in paths[("a", "c")]) assert_(Path([{"name": "a", "x": 1}, {"name": "c", "x": 1}], ["ac"]) in paths[("a", "c")]) # The third one is a redundant a|x=1 -> b -> c|x=END ################################################################ # Paths + concrete nodes ################################################################ def concretize_path_node(path_node, start_concrete_node, end_concrete_node): concrete = dict(path_node) _fill_values_from(concrete, START, start_concrete_node) _fill_values_from(concrete, END, end_concrete_node) return concrete def test_concretize_path_node(): assert_(concretize_path_node( {"name": "foo", "a": START, "b": END, "c": "given"}, {"name": "start", "a": "sa", "b": "sb", "c": "sc"}, {"name": "end", "a": "ea", "b": "eb", "c": "ec"}) == {"name": "foo", "a": "sa", "b": "eb", "c": "given"}) def safe_equal(a, b): if isinstance(a, np.ndarray) or isinstance(b, np.ndarray): return np.array_equal(a, b) else: return a == b def transform_kwargs(start_concrete_node, end_concrete_node): kwargs = {} for k, v in start_concrete_node.items(): if k != "name": kwargs[k] = v for k, v in end_concrete_node.items(): if k != "name": if k in kwargs: assert_(safe_equal(kwargs[k], v)) else: kwargs[k] = v return kwargs def test_transform_kwargs(): from nose.tools import assert_raises assert_(transform_kwargs({"name": "start"}, {"name": "end"}) == {}) assert_(transform_kwargs( {"name": "start", "a": 1, "b": 2}, {"name": "end", "b": 2, "c": 3} ) == {"a": 1, "b": 2, "c": 3}) assert_raises(AssertionError, transform_kwargs, {"name": "start", "a": 1}, {"name": "end", "a": 2}) def path_matches(path, desired_concrete_start, desired_concrete_end): # check that path[0] and path[-1] match concrete_start and concrete_end # and also that this holds even after filling in the values path_concrete_start = concretize_path_node(path.nodes[0], desired_concrete_start, desired_concrete_end) path_concrete_end = concretize_path_node(path.nodes[-1], desired_concrete_start, desired_concrete_end) return ((path_concrete_start == desired_concrete_start) and (path_concrete_end == desired_concrete_end)) def test_path_matches(): assert_(path_matches(Path(({"name": "start"}, {"name": "end"}), ("t1",)), {"name": "start"}, {"name": "end"})) assert_(path_matches( Path(({"name": "start", "a": START}, {"name": "end", "b": END}), ("t1",)), {"name": "start", "a": 1}, {"name": "end", "b": 2})) assert_(path_matches( Path(({"name": "start", "a": START}, {"name": "end", "a": START}), ("t1",)), {"name": "start", "a": 1}, {"name": "end", "a": 1})) assert_(not path_matches( Path(({"name": "start", "a": START}, {"name": "end", "b": END}), ("t1",)), {"name": "start_mismatch", "a": 1}, {"name": "end", "b": 2})) assert_(not path_matches( Path(({"name": "start", "a": 1}, {"name": "end", "b": 2}), ("t1",)), {"name": "start", "a": 1}, {"name": "end", "b": 22})) assert_(not path_matches( Path(({"name": "start", "a": START}, {"name": "end", "a": START}), ("t1",)), {"name": "start", "a": 1}, {"name": "end", "a": 2})) class Transform(object): def __init__(self, nodes, transforms, kwargses): self.nodes = nodes self._transforms = transforms self._kwargses = kwargses def __call__(self, x): for transform, kwargs in zip(self._transforms, self._kwargses): x = transform(x, **kwargs) return x def test_Transform(): log = [] def t1(x, **kwargs): log.append(("t1", x, kwargs)) return x * 2 def t2(x, **kwargs): log.append(("t2", x, kwargs)) return x * 2 t = Transform(["a", "b", "c"], [t1, t2], [{"t1_arg": 1}, {"t2_arg": 2}]) assert t("x") == "xxxx" assert log == [ ("t1", "x", {"t1_arg": 1}), ("t2", "xx", {"t2_arg": 2}), ] ################################################################ # Top-level object ################################################################ class TransformGraph(object): def __init__(self, edges, rank_constraints=[]): # This is what's used for actual calculations self._shortest_paths = pairwise_shortest_paths(edges) # All the rest is used only for the dot output self._rank_constraints = rank_constraints self._edges = edges self._nodes = [] seen_names = set() for edge in edges: check_edge(edge) for node in (edge.start, edge.end): if node["name"] not in seen_names: seen_names.add(node["name"]) self._nodes.append(node) def get_transform(self, start, end): check_concrete_node(start) check_concrete_node(end) if start == end: return Transform([start], [], []) start_name = start["name"] end_name = end["name"] best_path = None for path in self._shortest_paths.get((start_name, end_name), []): if path_matches(path, start, end): if best_path is None or len(best_path.nodes) > len(path.nodes): best_path = path if best_path is None: raise ValueError("No path found from %r -> %r" % (start, end)) concrete_nodes = [] for path_node in best_path.nodes: concrete_nodes.append(concretize_path_node(path_node, start, end)) kwargses = [] for i in range(len(concrete_nodes) - 1): kwargs = transform_kwargs(concrete_nodes[i], concrete_nodes[i + 1]) kwargses.append(kwargs) return Transform(concrete_nodes, best_path.transforms, kwargses) def dump_dot(self, f): # pragma: no cover f.write("digraph {\n") for node in self._nodes: # Laziness: assumes names don't need more quoting attr_names = set(node) attr_names.remove("name") html = "%s" % (node["name"],) for attr_name in sorted(attr_names): html += "
%s" % (attr_name,) f.write(" \"%s\" [ label=<%s> ]\n" % (node["name"], html)) for edge in self._edges: # FIXME: label edges with attribute information # taillabel=<...>, headlabel=<...>, ... f.write(" \"%s\" -> \"%s\"\n" % (edge.start["name"], edge.end["name"])) for rank_constraint in self._rank_constraints: f.write(" {rank=same; " + ", ".join(["\"%s\"" % (c,) for c in rank_constraint]) + "}\n") f.write("}\n") colorspacious-1.1.0/colorspacious/basics.py0000644000000000000000000001746312547111572017617 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014-2015 Nathaniel Smith # See file LICENSE.txt for license information. # Basic colorspaces: conversions between sRGB, XYZ, xyY, CIELab import numpy as np from .util import stacklast, color_cart2polar, color_polar2cart from .illuminants import as_XYZ100_w from .testing import check_conversion ################################################################ # sRGB <-> sRGB-linear <-> XYZ100 ################################################################ # https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation def C_linear(C_srgb): out = np.empty(C_srgb.shape, dtype=float) linear_portion = (C_srgb < 0.04045) a = 0.055 out[linear_portion] = C_srgb[linear_portion] / 12.92 out[~linear_portion] = ((C_srgb[~linear_portion] + a) / (a + 1)) ** 2.4 return out def C_srgb(C_linear): out = np.empty(C_linear.shape, dtype=float) linear_portion = (C_linear <= 0.0031308) a = 0.055 out[linear_portion] = C_linear[linear_portion] * 12.92 out[~linear_portion] = (1+a) * C_linear[~linear_portion] ** (1/2.4) - a return out XYZ100_to_sRGB1_matrix = np.array([ # This is the exact matrix specified in IEC 61966-2-1:1999 [ 3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [ 0.0557, -0.2040, 1.0570], ]) # Condition number is 4.3, inversion is safe: sRGB1_to_XYZ100_matrix = np.linalg.inv(XYZ100_to_sRGB1_matrix) def XYZ100_to_sRGB1_linear(XYZ100): """Convert XYZ to linear sRGB, where XYZ is normalized so that reference white D65 is X=95.05, Y=100, Z=108.90 and sRGB is on the 0-1 scale. Linear sRGB has a linear relationship to actual light, so it is an appropriate space for simulating light (e.g. for alpha blending). """ XYZ100 = np.asarray(XYZ100, dtype=float) # this is broadcasting matrix * array-of-vectors, where the vector is the # last dim RGB_linear = np.einsum("...ij,...j->...i", XYZ100_to_sRGB1_matrix, XYZ100 / 100) return RGB_linear def sRGB1_linear_to_sRGB1(sRGB1_linear): return C_srgb(np.asarray(sRGB1_linear, dtype=float)) def sRGB1_to_sRGB1_linear(sRGB1): """Convert sRGB (as floats in the 0-to-1 range) to linear sRGB.""" sRGB1 = np.asarray(sRGB1, dtype=float) sRGB1_linear = C_linear(sRGB1) return sRGB1_linear def sRGB1_linear_to_XYZ100(sRGB1_linear): sRGB1_linear = np.asarray(sRGB1_linear, dtype=float) # this is broadcasting matrix * array-of-vectors, where the vector is the # last dim XYZ100 = np.einsum("...ij,...j->...i", sRGB1_to_XYZ100_matrix, sRGB1_linear) XYZ100 *= 100 return XYZ100 def test_sRGB1_to_sRGB1_linear(): from .gold_values import sRGB1_sRGB1_linear_gold check_conversion(sRGB1_to_sRGB1_linear, sRGB1_linear_to_sRGB1, sRGB1_sRGB1_linear_gold, a_max=1, b_max=1) def test_sRGB1_linear_to_XYZ100(): from .gold_values import sRGB1_linear_XYZ100_gold check_conversion(sRGB1_linear_to_XYZ100, XYZ100_to_sRGB1_linear, sRGB1_linear_XYZ100_gold, a_max=1, b_max=100) ################################################################ # XYZ <-> xyY ################################################################ # These functions work identically for both the 0-100 and 0-1 versions of # XYZ/xyY. def XYZ_to_xyY(XYZ): XYZ = np.asarray(XYZ, dtype=float) norm = np.sum(XYZ, axis=-1, keepdims=True) xy = XYZ[..., :2] / norm return np.concatenate((xy, XYZ[..., 1:2]), axis=-1) def xyY_to_XYZ(xyY): xyY = np.asarray(xyY, dtype=float) x = xyY[..., 0] y = xyY[..., 1] Y = xyY[..., 2] X = Y / y * x Z = Y / y * (1 - x - y) return stacklast(X, Y, Z) _XYZ100_to_xyY100_test_vectors = [ ([10, 20, 30], [ 10. / 60, 20. / 60, 20]), ([99, 98, 3], [99. / 200, 98. / 200, 98]), ] _XYZ1_to_xyY1_test_vectors = [ ([0.10, 0.20, 0.30], [ 0.10 / 0.60, 0.20 / 0.60, 0.20]), ([0.99, 0.98, 0.03], [0.99 / 2.00, 0.98 / 2.00, 0.98]), ] def test_XYZ_to_xyY(): check_conversion(XYZ_to_xyY, xyY_to_XYZ, _XYZ100_to_xyY100_test_vectors, b_max=[1, 1, 100]) check_conversion(XYZ_to_xyY, xyY_to_XYZ, _XYZ1_to_xyY1_test_vectors, b_max=[1, 1, 1]) ################################################################ # XYZ100 <-> CIEL*a*b* ################################################################ # https://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions def _f(t): out = np.empty(t.shape, dtype=float) linear_portion = (t < (6. / 29) ** 3) out[linear_portion] = ((1. / 3) * (29. / 6) ** 2 * t[linear_portion] + 4. / 29) out[~linear_portion] = t[~linear_portion] ** (1. / 3) return out def XYZ100_to_CIELab(XYZ100, XYZ100_w): XYZ100 = np.asarray(XYZ100, dtype=float) XYZ100_w = as_XYZ100_w(XYZ100_w) fXYZ100_norm = _f(XYZ100 / XYZ100_w) L = 116 * fXYZ100_norm[..., 1:2] - 16 a = 500 * (fXYZ100_norm[..., 0:1] - fXYZ100_norm[..., 1:2]) b = 200 * (fXYZ100_norm[..., 1:2] - fXYZ100_norm[..., 2:3]) return np.concatenate((L, a, b), axis=-1) def _finv(t): linear_portion = (t <= 6. / 29) out = np.select([linear_portion, ~linear_portion], [3 * (6. / 29) ** 2 * (t - 4. / 29), t ** 3]) return out def CIELab_to_XYZ100(CIELab, XYZ100_w): CIELab = np.asarray(CIELab, dtype=float) XYZ100_w = as_XYZ100_w(XYZ100_w) L = CIELab[..., 0] a = CIELab[..., 1] b = CIELab[..., 2] X_w = XYZ100_w[..., 0] Y_w = XYZ100_w[..., 1] Z_w = XYZ100_w[..., 2] l_piece = 1. / 116 * (L + 16) X = X_w * _finv(l_piece + 1. / 500 * a) Y = Y_w * _finv(l_piece) Z = Z_w * _finv(l_piece - 1. / 200 * b) return stacklast(X, Y, Z) def test_XYZ100_to_CIELab(): from .gold_values import XYZ100_CIELab_gold_D65, XYZ100_CIELab_gold_D50 check_conversion(XYZ100_to_CIELab, CIELab_to_XYZ100, XYZ100_CIELab_gold_D65, # Stick to randomized values in the mid-range to avoid # hitting negative luminances b_min=[10, -30, -30], b_max=[90, 30, 30], XYZ100_w="D65") check_conversion(XYZ100_to_CIELab, CIELab_to_XYZ100, XYZ100_CIELab_gold_D50, # Stick to randomized values in the mid-range to avoid # hitting negative luminances b_min=[10, -30, -30], b_max=[90, 30, 30], XYZ100_w="D50") XYZ100_1 = np.asarray(XYZ100_CIELab_gold_D65[0][0]) CIELab_1 = np.asarray(XYZ100_CIELab_gold_D65[0][1]) XYZ100_2 = np.asarray(XYZ100_CIELab_gold_D50[1][0]) CIELab_2 = np.asarray(XYZ100_CIELab_gold_D50[1][1]) XYZ100_mixed = np.concatenate((XYZ100_1[np.newaxis, :], XYZ100_2[np.newaxis, :])) CIELab_mixed = np.concatenate((CIELab_1[np.newaxis, :], CIELab_2[np.newaxis, :])) XYZ100_w_mixed = np.row_stack((as_XYZ100_w("D65"), as_XYZ100_w("D50"))) assert np.allclose(XYZ100_to_CIELab(XYZ100_mixed, XYZ100_w=XYZ100_w_mixed), CIELab_mixed, rtol=0.001) assert np.allclose(CIELab_to_XYZ100(CIELab_mixed, XYZ100_w=XYZ100_w_mixed), XYZ100_mixed, rtol=0.001) ################################################################ # CIELab <-> CIELCh ################################################################ def CIELab_to_CIELCh(CIELab): CIELab = np.asarray(CIELab) L = CIELab[..., 0] a = CIELab[..., 1] b = CIELab[..., 2] C, h = color_cart2polar(a, b) return stacklast(L, C, h) def CIELCh_to_CIELab(CIELCh): CIELCh = np.asarray(CIELCh) L = CIELCh[..., 0] C = CIELCh[..., 1] h = CIELCh[..., 2] a, b = color_polar2cart(C, h) return stacklast(L, a, b) colorspacious-1.1.0/colorspacious/illuminants.py0000644000000000000000000001134512615314776020712 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np __all__ = ["standard_illuminant_XYZ100", "as_XYZ100_w"] # The "standard" 2 degree observer (CIE 1931) # Sourced from http://www.easyrgb.com/index.php?X=MATH&H=15 cie1931 = { "A": [109.850, 100, 35.585], "C": [ 98.074, 100, 118.232], "D50": [ 96.422, 100, 82.521], "D55": [ 95.682, 100, 92.149], # This is sRGB's standard whitepoint: "D65": [ 95.047, 100, 108.883], "D75": [ 94.972, 100, 122.638], } # The "supplementary" 10 degree observer (CIE 1964) # Sourced from http://www.easyrgb.com/index.php?X=MATH&H=15 cie1964 = { "A": [111.144, 100, 35.200], "C": [ 97.285, 100, 116.145], "D50": [ 96.720, 100, 81.427], "D55": [ 95.799, 100, 90.926], "D65": [ 94.811, 100, 107.304], "D75": [ 94.416, 100, 120.641], } # Fairchild (2005) says: "The difference between the two standard observers is # significant, so care should be taken to report which observer is used with # any colorimetric data. The differences are computationally significant, but # certainly within the variability of color matching functions found for # either 2 degree or 10 degree visual fields. Thus the two standard # colorimetric observers can be thought of as representing the color matching # functions of two individuals." (page 77) # # Though he also says: "It should also be noted that for sample sizes greater # than 4 degrees, use of the CIE 1964 supplementary standard colorimetric # observer is recommended." (page 82, when discussing CIE94 delta-E) def standard_illuminant_XYZ100(name, observer="CIE 1931 2 deg"): """Takes a string naming a standard illuminant, and returns its XYZ coordinates (normalized to Y = 100). We currently have the following standard illuminants in our database: * ``"A"`` * ``"C"`` * ``"D50"`` * ``"D55"`` * ``"D65"`` * ``"D75"`` If you need another that isn't on this list, then feel free to send a pull request. When in doubt, use D65: it's the whitepoint used by the sRGB standard (61966-2-1:1999) and ISO 10526:1999 says "D65 should be used in all colorimetric calculations requiring representative daylight, unless there are specific reasons for using a different illuminant". By default, we return points in the XYZ space defined by the CIE 1931 2 degree standard observer. By specifying ``observer="CIE 1964 10 deg"``, you can instead get the whitepoint coordinates in XYZ space defined by the CIE 1964 10 degree observer. This is probably only useful if you have XYZ points you want to do calculations on that were somehow measured using the CIE 1964 color matching functions, perhaps via a spectrophotometer; consumer equipment (monitors, cameras, etc.) assumes the use of the CIE 1931 standard observer in all cases I know of. """ if observer == "CIE 1931 2 deg": return np.asarray(cie1931[name], dtype=float) elif observer == "CIE 1964 10 deg": return np.asarray(cie1964[name], dtype=float) else: raise ValueError("observer must be 'CIE 1931 2 deg' or " "'CIE 1964 10 deg', not %s" % (observer,)) def test_standard_illuminant_XYZ100(): assert np.allclose( standard_illuminant_XYZ100("D65"), [ 95.047, 100, 108.883]) assert np.allclose( standard_illuminant_XYZ100("D65", observer="CIE 1964 10 deg"), [ 94.811, 100, 107.304]) from nose.tools import assert_raises assert_raises(ValueError, standard_illuminant_XYZ100, "D65", observer="something else") # Convenience function def as_XYZ100_w(whitepoint): """A convenience function for getting whitepoints. ``whitepoint`` can be either a string naming a standard illuminant (see :func:`standard_illuminant_XYZ100`), or else a whitepoint given explicitly as an array-like of XYZ values. We internally call this function anywhere you have to specify a whitepoint (e.g. for CIECAM02 or CIELAB conversions). Always uses the "standard" 2 degree observer. """ if isinstance(whitepoint, str): return standard_illuminant_XYZ100(whitepoint) else: whitepoint = np.asarray(whitepoint, dtype=float) if whitepoint.shape[-1] != 3: raise ValueError("Bad whitepoint shape") return whitepoint def test_as_XYZ100_w(): assert np.allclose(as_XYZ100_w("D65"), [ 95.047, 100, 108.883]) assert np.allclose(as_XYZ100_w([1, 2, 3]), [1, 2, 3]) assert as_XYZ100_w([1, 2, 3]).dtype == float from nose.tools import assert_raises assert_raises(KeyError, as_XYZ100_w, "D666") assert_raises(ValueError, as_XYZ100_w, [1, 2, 3, 4]) colorspacious-1.1.0/colorspacious/conversion.py0000644000000000000000000003725412616016420020531 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2015 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np from collections import defaultdict from .util import stacklast from .testing import check_conversion from .basics import (sRGB1_to_sRGB1_linear, sRGB1_linear_to_sRGB1, sRGB1_linear_to_XYZ100, XYZ100_to_sRGB1_linear, XYZ_to_xyY, xyY_to_XYZ, XYZ100_to_CIELab, CIELab_to_XYZ100, CIELab_to_CIELCh, CIELCh_to_CIELab) from .ciecam02 import CIECAM02Space from .luoetal2006 import (LuoEtAl2006UniformSpace, CAM02UCS, CAM02LCD, CAM02SCD) from .cvd import machado_et_al_2009_matrix from .transform_graph import Edge, MATCH, ANY, TransformGraph __all__ = ["cspace_converter", "cspace_convert"] ################################################################ EDGES = [] def pair(a, b, a2b, b2a): if isinstance(a, str): a = {"name": a} if isinstance(b, str): b = {"name": b} return [Edge(a, b, a2b), Edge(b, a, b2a)] EDGES += pair("sRGB1", "sRGB255", lambda sRGB1: np.asarray(sRGB1) * 255.0, lambda sRGB255: np.asarray(sRGB255) / 255.0) def _apply_rgb_mat(mat, rgb): return np.einsum("...ij,...j->...i", mat, rgb) def _CVD_forward(sRGB, cvd_type, severity): mat = machado_et_al_2009_matrix(cvd_type, severity) return _apply_rgb_mat(mat, sRGB) def _CVD_inverse(sRGB, cvd_type, severity): forward = machado_et_al_2009_matrix(cvd_type, severity) return _apply_rgb_mat(np.linalg.inv(forward), sRGB) EDGES += pair({"name": "sRGB1+CVD", "cvd_type": MATCH, "severity": MATCH}, {"name": "sRGB1-linear+CVD", "cvd_type": MATCH, "severity": MATCH}, lambda x, **kwargs: sRGB1_to_sRGB1_linear(x), lambda x, **kwargs: sRGB1_linear_to_sRGB1(x), ) EDGES += pair({"name": "sRGB1-linear+CVD", "cvd_type": ANY, "severity": ANY}, "sRGB1-linear", _CVD_forward, _CVD_inverse) EDGES += pair("sRGB1", "sRGB1-linear", sRGB1_to_sRGB1_linear, sRGB1_linear_to_sRGB1) EDGES += pair("sRGB1-linear", "XYZ100", sRGB1_linear_to_XYZ100, XYZ100_to_sRGB1_linear) EDGES += pair("XYZ100", "XYZ1", lambda XYZ100: np.asarray(XYZ100) / 100., lambda XYZ1: np.asarray(XYZ1) * 100.0) EDGES += pair("XYZ1", "xyY1", XYZ_to_xyY, xyY_to_XYZ) EDGES += pair("XYZ100", "xyY100", XYZ_to_xyY, xyY_to_XYZ) EDGES += pair("XYZ100", {"name": "CIELab", "XYZ100_w": ANY}, XYZ100_to_CIELab, CIELab_to_XYZ100) def _CIELab_to_CIELCh(CIELab, XYZ100_w): return CIELab_to_CIELCh(CIELab) def _CIELCh_to_CIELab(CIELCh, XYZ100_w): return CIELCh_to_CIELab(CIELCh) EDGES += pair({"name": "CIELab", "XYZ100_w": MATCH}, {"name": "CIELCh", "XYZ100_w": MATCH}, _CIELab_to_CIELCh, _CIELCh_to_CIELab) def _XYZ100_to_CIECAM02(XYZ100, ciecam02_space): return ciecam02_space.XYZ100_to_CIECAM02(XYZ100) def _CIECAM02_to_XYZ100(CIECAM02, ciecam02_space): return ciecam02_space.CIECAM02_to_XYZ100(J=CIECAM02.J, C=CIECAM02.C, h=CIECAM02.h) EDGES += pair("XYZ100", {"name": "CIECAM02", "ciecam02_space": ANY}, _XYZ100_to_CIECAM02, _CIECAM02_to_XYZ100) _CIECAM02_axes = set("JChQMsH") def _CIECAM02_to_CIECAM02_subset(CIECAM02, ciecam02_space, axes): pieces = [] for axis in axes: pieces.append(getattr(CIECAM02, axis)) return stacklast(*pieces) def _CIECAM02_subset_to_XYZ100(subset, ciecam02_space, axes): subset = np.asarray(subset, dtype=float) kwargs = {} if subset.shape[-1] != len(axes): raise ValueError("shape mismatch: last dimension of color array is " "%s, but need %s for %r" % (subset.shape[-1], len(axes), axes)) for i, coord in enumerate(axes): kwargs[coord] = subset[..., i] return ciecam02_space.CIECAM02_to_XYZ100(**kwargs) # We do *not* provide any CIECAM02-subset <-> CIECAM02-subset converter # This will be implicitly created by going # CIECAM02-subset -> XYZ100 -> CIECAM02 -> CIECAM02-subset # which is the correct way to do it. EDGES += [ Edge({"name": "CIECAM02", "ciecam02_space": MATCH}, {"name": "CIECAM02-subset", "ciecam02_space": MATCH, "axes": ANY}, _CIECAM02_to_CIECAM02_subset), Edge({"name": "CIECAM02-subset", "ciecam02_space": ANY, "axes": ANY}, {"name": "XYZ100"}, _CIECAM02_subset_to_XYZ100), ] def _JMh_to_LuoEtAl2006(JMh, ciecam02_space, luoetal2006_space, axes): return luoetal2006_space.JMh_to_Jpapbp(JMh) def _LuoEtAl2006_to_JMh(Jpapbp, ciecam02_space, luoetal2006_space, axes): return luoetal2006_space.Jpapbp_to_JMh(Jpapbp) EDGES += pair({"name": "CIECAM02-subset", "ciecam02_space": MATCH, "axes": "JMh"}, {"name": "J'a'b'", "ciecam02_space": MATCH, "luoetal2006_space": ANY}, _JMh_to_LuoEtAl2006, _LuoEtAl2006_to_JMh) GRAPH = TransformGraph(EDGES, # Stuff that should go on the same row of the generated # graphviz plot [["sRGB255", "sRGB1", "sRGB1+CVD"], ["sRGB1-linear", "sRGB1-linear+CVD"], #["XYZ1", "XYZ100"], ]) ALIASES = { "CAM02-UCS": CAM02UCS, "CAM02-LCD": CAM02LCD, "CAM02-SCD": CAM02SCD, "CIECAM02": CIECAM02Space.sRGB, "CIELab": {"name": "CIELab", "XYZ100_w": CIECAM02Space.sRGB.XYZ100_w}, "CIELCh": {"name": "CIELCh", "XYZ100_w": CIECAM02Space.sRGB.XYZ100_w}, } def norm_cspace_id(cspace): try: cspace = ALIASES[cspace] except (KeyError, TypeError): pass if isinstance(cspace, str): if _CIECAM02_axes.issuperset(cspace): return {"name": "CIECAM02-subset", "ciecam02_space": CIECAM02Space.sRGB, "axes": cspace} else: return {"name": cspace} elif isinstance(cspace, CIECAM02Space): return {"name": "CIECAM02", "ciecam02_space": cspace} elif isinstance(cspace, LuoEtAl2006UniformSpace): return {"name": "J'a'b'", "ciecam02_space": CIECAM02Space.sRGB, "luoetal2006_space": cspace} elif isinstance(cspace, dict): if cspace["name"] in ALIASES: base = ALIASES[cspace["name"]] if isinstance(base, dict) and base["name"] == cspace["name"]: # avoid infinite recursion return cspace else: base = norm_cspace_id(base) cspace = dict(cspace) del cspace["name"] base = dict(base) base.update(cspace) return base return cspace else: raise ValueError("unrecognized color space %r" % (cspace,)) def cspace_converter(start, end): """Returns a function for converting from colorspace ``start`` to colorspace ``end``. E.g., these are equivalent:: out = cspace_convert(arr, start, end) :: start_to_end_fn = cspace_converter(start, end) out = start_to_end_fn(arr) If you are doing a large number of conversions between the same pair of spaces, then calling this function once and then using the returned function repeatedly will be slightly more efficient than calling :func:`cspace_convert` repeatedly. But I wouldn't bother unless you know that this is a bottleneck for you, or it simplifies your code. """ start = norm_cspace_id(start) end = norm_cspace_id(end) return GRAPH.get_transform(start, end) def cspace_convert(arr, start, end): """Converts the colors in ``arr`` from colorspace ``start`` to colorspace ``end``. :param arr: An array-like of colors. :param start, end: Any supported colorspace specifiers. See :ref:`supported-colorspaces` for details. """ converter = cspace_converter(start, end) return converter(arr) def check_cspace_convert(source_cspace, target_cspace, gold, **kwargs): def forward(source_values): return cspace_convert(source_values, source_cspace, target_cspace) def reverse(target_values): return cspace_convert(target_values, target_cspace, source_cspace) check_conversion(forward, reverse, gold, **kwargs) def test_cspace_convert_trivial(): check_cspace_convert("sRGB1", "sRGB1", [([0.1, 0.2, 0.3], [0.1, 0.2, 0.3]), ([0.3, 0.2, 0.1], [0.3, 0.2, 0.1]), ]) def test_cspace_convert_long_paths(): from .gold_values import sRGB1_xyY100_gold check_cspace_convert("sRGB1", "xyY100", sRGB1_xyY100_gold, a_min=0, a_max=1, b_min=0, b_max=[1, 1, 100]) from .gold_values import sRGB1_xyY1_gold check_cspace_convert("sRGB1", "xyY1", sRGB1_xyY1_gold, a_min=0, a_max=1, b_min=0, b_max=1) from .gold_values import XYZ1_sRGB255_gold check_cspace_convert("XYZ1", "sRGB255", XYZ1_sRGB255_gold, a_min=0, a_max=1, b_min=0, b_max=255) from .gold_values import sRGB1_CIELab_gold_D65 check_cspace_convert("sRGB1", "CIELab", sRGB1_CIELab_gold_D65, a_min=0, a_max=1, b_min=[10, -30, 30], b_max=[90, 30, 30], # Ridiculously low precision, but both Lindbloom and # Grace's calculators have rounding errors in both the # CIELab coefficients and the sRGB matrices. gold_rtol=1.5e-2) # Makes sure that CIELab conversions are sensitive to whitepoint from .gold_values import XYZ100_CIELab_gold_D50 check_cspace_convert("XYZ100", {"name": "CIELab", "XYZ100_w": "D50"}, XYZ100_CIELab_gold_D50, b_min=[10, -30, 30], b_max=[90, 30, 30]) from .gold_values import XYZ100_CIELCh_gold_D65 check_cspace_convert("XYZ100", "CIELCh", XYZ100_CIELCh_gold_D65, a_min=[10, -30, 30], a_max=[90, 30, 30], b_min=0, b_max=[100, 50, 360]) from .gold_values import XYZ100_CIELCh_gold_D50 check_cspace_convert("XYZ100", {"name": "CIELCh", "XYZ100_w": "D50"}, XYZ100_CIELCh_gold_D50, a_min=[10, -30, 30], a_max=[90, 30, 30], b_min=0, b_max=[100, 50, 360]) from .gold_values import XYZ100_CIECAM02_gold for t in XYZ100_CIECAM02_gold: # Check full-fledged CIECAM02 conversions xyY100 = cspace_convert(t.XYZ100, "XYZ100", "xyY100") CIECAM02_got = cspace_convert(xyY100, "xyY100", t.vc) for i in range(len(CIECAM02_got)): assert np.allclose(CIECAM02_got[i], t.expected[i], atol=1e-5) xyY100_got = cspace_convert(CIECAM02_got, t.vc, "xyY100") assert np.allclose(xyY100_got, xyY100) # Check subset CIECAM02 conversions def subset(axes): return {"name": "CIECAM02-subset", "axes": axes, "ciecam02_space": t.vc} JCh = stacklast(t.expected.J, t.expected.C, t.expected.h) xyY100_got2 = cspace_convert(JCh, subset("JCh"), "xyY100") assert np.allclose(xyY100_got2, xyY100) JCh_got = cspace_convert(xyY100, "xyY100", subset("JCh")) assert np.allclose(JCh_got, JCh, rtol=1e-4) # Check subset->subset CIECAM02 # This needs only plain arrays so we can use check_cspace_convert QMH = stacklast(t.expected.Q, t.expected.M, t.expected.H) check_cspace_convert(subset("JCh"), subset("QMH"), [(JCh, QMH)], a_max=[100, 100, 360], b_max=[100, 100, 400]) # Check that directly transforming between two different viewing # conditions works. # This exploits the fact that the first two entries in our gold vector # have the same XYZ100. t1 = XYZ100_CIECAM02_gold[0] t2 = XYZ100_CIECAM02_gold[1] # "If we have a color that looks like t1.expected under viewing conditions # t1, then what does it look like under viewing conditions t2?" got2 = cspace_convert(t1.expected, t1.vc, t2.vc) for i in range(len(got2)): assert np.allclose(got2[i], t2.expected[i], atol=1e-5) JCh1 = stacklast(t1.expected.J, t1.expected.C, t1.expected.h) JCh2 = stacklast(t2.expected.J, t2.expected.C, t2.expected.h) JCh_space1 = {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": t1.vc} JCh_space2 = {"name": "CIECAM02-subset", "axes": "JCh", "ciecam02_space": t2.vc} check_cspace_convert(JCh_space1, JCh_space2, [(JCh1, JCh2)], a_max=[100, 100, 360], b_max=[100, 100, 360]) # J'a'b' from .gold_values import JMh_to_CAM02UCS_silver check_cspace_convert("JMh", "CAM02-UCS", JMh_to_CAM02UCS_silver, a_max=[100, 100, 360], b_min=[0, -30, -30], b_max=[100, 30, 30]) from .gold_values import JMh_to_CAM02LCD_silver check_cspace_convert("JMh", "CAM02-LCD", JMh_to_CAM02LCD_silver, a_max=[100, 100, 360], b_min=[0, -30, -30], b_max=[100, 30, 30]) from .gold_values import JMh_to_CAM02SCD_silver check_cspace_convert("JMh", "CAM02-SCD", JMh_to_CAM02SCD_silver, a_max=[100, 100, 360], b_min=[0, -30, -30], b_max=[100, 30, 30]) # CVD from .gold_values import CVD_deut50_to_sRGB1_silver check_cspace_convert( {"name": "sRGB1+CVD", "cvd_type": "deuteranomaly", "severity": 50}, "sRGB1", CVD_deut50_to_sRGB1_silver, ) from .gold_values import CVD_prot95_to_sRGB1_silver check_cspace_convert( {"name": "sRGB1+CVD", "cvd_type": "protanomaly", "severity": 95}, "sRGB1", CVD_prot95_to_sRGB1_silver, ) def test_CIECAM02_subset_error_checking(): from nose.tools import assert_raises assert_raises(ValueError, cspace_convert, np.ones((5, 4)), "JCh", "XYZ100") def test_name_aliases(): # "CAM02-UCS" is not a primitive name, but rather an alias # nonetheless it should be accepted as a "name" key, with any extra fields # provided overriding the defaults from .gold_values import JMh_to_CAM02UCS_silver check_cspace_convert("JMh", "CAM02-UCS", JMh_to_CAM02UCS_silver, a_max=[100, 100, 360], b_min=[0, -30, -30], b_max=[100, 30, 30]) check_cspace_convert("JMh", {"name": "CAM02-UCS"}, JMh_to_CAM02UCS_silver, a_max=[100, 100, 360], b_min=[0, -30, -30], b_max=[100, 30, 30]) weird_space = CIECAM02Space("D65", 25, 30) assert np.allclose( cspace_convert([0.1, 0.2, 0.3], "sRGB1", {"name": "CAM02-UCS", "ciecam02_space": weird_space}), cspace_convert([0.1, 0.2, 0.3], "sRGB1", {"name": "J'a'b'", "ciecam02_space": weird_space, "luoetal2006_space": CAM02UCS})) from nose.tools import assert_raises assert_raises(ValueError, cspace_convert, [1, 2, 3], "sRGB255", object()) assert_raises(ValueError, cspace_convert, [1, 2, 3], "sRGB255", "qwertyuiop") colorspacious-1.1.0/colorspacious/luoetal2006.py0000644000000000000000000000342313010726400020303 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np from .util import stacklast, color_cart2polar, color_polar2cart class LuoEtAl2006UniformSpace(object): """A uniform space based on CIECAM02. See :cite:`CAM02-UCS` for details of the parametrization. For most purposes you should just use one of the predefined instances of this class that are exported as module-level constants: * :data:`colorspacious.CAM02UCS` * :data:`colorspacious.CAM02LCD` * :data:`colorspacious.CAM02SCD` """ def __init__(self, KL, c1, c2): self.KL = KL self.c1 = c1 self.c2 = c2 def __repr__(self): return "%s(%r, %r, %r)" % ( self.__class__.__name__, self.KL, self.c1, self.c2) def JMh_to_Jpapbp(self, JMh): JMh = np.asarray(JMh, dtype=float) J = JMh[..., 0] M = JMh[..., 1] h = JMh[..., 2] Jp = (1 + 100 * self.c1) * J / (1 + self.c1 * J) Jp = Jp / self.KL Mp = (1. / self.c2) * np.log(1 + self.c2 * M) ap, bp = color_polar2cart(Mp, h) return stacklast(Jp, ap, bp) def Jpapbp_to_JMh(self, Jpapbp): Jpapbp = np.asarray(Jpapbp) Jp = Jpapbp[..., 0] ap = Jpapbp[..., 1] bp = Jpapbp[..., 2] Jp = Jp * self.KL J = - Jp / (self.c1 * Jp - 100 * self.c1 - 1) Mp, h = color_cart2polar(ap, bp) M = (np.exp(self.c2*Mp) - 1) / self.c2 return stacklast(J, M, h) CAM02UCS = LuoEtAl2006UniformSpace(1.00, 0.007, 0.0228) CAM02LCD = LuoEtAl2006UniformSpace(0.77, 0.007, 0.0053) CAM02SCD = LuoEtAl2006UniformSpace(1.24, 0.007, 0.0363) def test_repr(): # smoke test repr(CAM02UCS) colorspacious-1.1.0/colorspacious/testing.py0000644000000000000000000000452612547111572020024 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014-2015 Nathaniel Smith # See file LICENSE.txt for license information. import numpy as np # test_vector is like # [(gold_a, gold_b), # (gold_a, gold_b), # ... # ] def check_conversion(forward, backward, test_vector, a_min=0, a_max=100, b_min=0, b_max=100, # We use different precisions for tests against gold # standard test vectors collected elsewhere, versus # checks of our internal consistency. This is because # other people's codebases introduce all kinds of # rounding error -- they precompute inverse matrices and # then round them before using, they replace fractions # with decimals rounded to like 4 significant digits, # etc. Internally, though, we strive for higher # standards. gold_rtol=1e-3, internal_rtol=1e-8, **kwargs): a_min = np.asarray(a_min) a_max = np.asarray(a_max) b_min = np.asarray(b_min) b_max = np.asarray(b_max) def check_one(one_a, one_b): conv_b = forward(one_a, **kwargs) assert np.allclose(conv_b, one_b, rtol=gold_rtol) conv_a = backward(one_b, **kwargs) assert np.allclose(conv_a, one_a, rtol=gold_rtol) for a, b in test_vector: check_one(a, b) all_a = np.asarray([pair[0] for pair in test_vector]) all_b = np.asarray([pair[1] for pair in test_vector]) check_one(all_a, all_b) # make sure broadcasting / high-dimensionality conversion works all_a_3d = all_a[np.newaxis, ...] all_b_3d = all_b[np.newaxis, ...] check_one(all_a_3d, all_b_3d) # We use a stricter tolerance here, because r = np.random.RandomState(0) rand_a = r.uniform(size=(2, 2, 2, 2, 3)) rand_a *= (a_max - a_min) rand_a += a_min assert np.allclose(backward(forward(rand_a, **kwargs), **kwargs), rand_a, rtol=internal_rtol) rand_b = r.uniform(size=(2, 2, 2, 2, 3)) rand_b *= (b_max - b_min) rand_b += b_min assert np.allclose(forward(backward(rand_b, **kwargs), **kwargs), rand_b, rtol=internal_rtol) colorspacious-1.1.0/colorspacious/cvd.py0000644000000000000000000002302512615255250017114 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2015 Nathaniel Smith # See file LICENSE.txt for license information. # Simulation of color vision deficiency (a.k.a. color blindness) import numpy as np # Matrices for simulating anomalous color vision from: # Machado, Oliveira, & Fernandes (2009). A Physiologically-based Model for # Simulation of Color Vision Deficiency. doi: 10.1109/TVCG.2009.113 # # http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html # Most people with anomalous color vision (~5% of all men) fall somewhere on # the deuteranomaly spectrum. A minority (~1% of all men) are either fully # deuteranopic or fall on the protanomaly spectrum. A much smaller number fall # on the tritanomaly spectrum (<0.01% of people) or have other more exotic # anomalies. def machado_et_al_2009_matrix(cvd_type, severity): """Retrieve a matrix for simulating anomalous color vision. :param cvd_type: One of "protanomaly", "deuteranomaly", or "tritanomaly". :param severity: A value between 0 and 100. :returns: A 3x3 CVD simulation matrix as computed by Machado et al (2009). These matrices were downloaded from: http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html which is supplementary data from :cite:`Machado-CVD`. If severity is a multiple of 10, then simply returns the matrix from that webpage. For other severities, performs linear interpolation. """ assert 0 <= severity <= 100 fraction = severity % 10 low = int(severity - fraction) high = low + 10 assert low <= severity <= high low_matrix = np.asarray(MACHADO_ET_AL_MATRICES[cvd_type][low]) if severity == 100: # Don't try interpolating between 100 and 110, there is no 110... return low_matrix high_matrix = np.asarray(MACHADO_ET_AL_MATRICES[cvd_type][high]) return ((1 - fraction / 10.0) * low_matrix + fraction / 10.0 * high_matrix) def test_machado_et_al_2009_matrix(): np.testing.assert_almost_equal( machado_et_al_2009_matrix("deuteranomaly", 50), [[ 0.547494, 0.607765, -0.155259], [ 0.181692, 0.781742, 0.036566], [-0.010410, 0.027275, 0.983136]]) deuter50 = np.asarray([[ 0.547494, 0.607765, -0.155259], [ 0.181692, 0.781742, 0.036566], [-0.010410, 0.027275, 0.983136]]) deuter60 = np.asarray([[ 0.498864, 0.674741, -0.173604], [ 0.205199, 0.754872, 0.039929], [-0.011131, 0.030969, 0.980162]]) np.testing.assert_almost_equal( machado_et_al_2009_matrix("deuteranomaly", 53.1), 0.31 * deuter60 + (1 - 0.31) * deuter50) # Test that 0 and 100 work as arguments assert np.allclose(machado_et_al_2009_matrix("protanomaly", 0)[0, 0], 1.0) assert np.allclose(machado_et_al_2009_matrix("protanomaly", 100)[0, 0], 0.152286) MACHADO_ET_AL_MATRICES = { "protanomaly": { 0: [ [ 1.000000, 0.000000, -0.000000], [ 0.000000, 1.000000, 0.000000], [-0.000000, -0.000000, 1.000000], ], 10: [ [ 0.856167, 0.182038, -0.038205], [ 0.029342, 0.955115, 0.015544], [-0.002880, -0.001563, 1.004443], ], 20: [ [ 0.734766, 0.334872, -0.069637], [ 0.051840, 0.919198, 0.028963], [-0.004928, -0.004209, 1.009137], ], 30: [ [ 0.630323, 0.465641, -0.095964], [ 0.069181, 0.890046, 0.040773], [-0.006308, -0.007724, 1.014032], ], 40: [ [ 0.539009, 0.579343, -0.118352], [ 0.082546, 0.866121, 0.051332], [-0.007136, -0.011959, 1.019095], ], 50: [ [ 0.458064, 0.679578, -0.137642], [ 0.092785, 0.846313, 0.060902], [-0.007494, -0.016807, 1.024301], ], 60: [ [ 0.385450, 0.769005, -0.154455], [ 0.100526, 0.829802, 0.069673], [-0.007442, -0.022190, 1.029632], ], 70: [ [ 0.319627, 0.849633, -0.169261], [ 0.106241, 0.815969, 0.077790], [-0.007025, -0.028051, 1.035076], ], 80: [ [ 0.259411, 0.923008, -0.182420], [ 0.110296, 0.804340, 0.085364], [-0.006276, -0.034346, 1.040622], ], 90: [ [ 0.203876, 0.990338, -0.194214], [ 0.112975, 0.794542, 0.092483], [-0.005222, -0.041043, 1.046265], ], 100: [ [ 0.152286, 1.052583, -0.204868], [ 0.114503, 0.786281, 0.099216], [-0.003882, -0.048116, 1.051998], ], }, "deuteranomaly": { 0: [ [ 1.000000, 0.000000, -0.000000], [ 0.000000, 1.000000, 0.000000], [-0.000000, -0.000000, 1.000000], ], 10: [ [ 0.866435, 0.177704, -0.044139], [ 0.049567, 0.939063, 0.011370], [-0.003453, 0.007233, 0.996220], ], 20: [ [ 0.760729, 0.319078, -0.079807], [ 0.090568, 0.889315, 0.020117], [-0.006027, 0.013325, 0.992702], ], 30: [ [ 0.675425, 0.433850, -0.109275], [ 0.125303, 0.847755, 0.026942], [-0.007950, 0.018572, 0.989378], ], 40: [ [ 0.605511, 0.528560, -0.134071], [ 0.155318, 0.812366, 0.032316], [-0.009376, 0.023176, 0.986200], ], 50: [ [ 0.547494, 0.607765, -0.155259], [ 0.181692, 0.781742, 0.036566], [-0.010410, 0.027275, 0.983136], ], 60: [ [ 0.498864, 0.674741, -0.173604], [ 0.205199, 0.754872, 0.039929], [-0.011131, 0.030969, 0.980162], ], 70: [ [ 0.457771, 0.731899, -0.189670], [ 0.226409, 0.731012, 0.042579], [-0.011595, 0.034333, 0.977261], ], 80: [ [ 0.422823, 0.781057, -0.203881], [ 0.245752, 0.709602, 0.044646], [-0.011843, 0.037423, 0.974421], ], 90: [ [ 0.392952, 0.823610, -0.216562], [ 0.263559, 0.690210, 0.046232], [-0.011910, 0.040281, 0.971630], ], 100: [ [ 0.367322, 0.860646, -0.227968], [ 0.280085, 0.672501, 0.047413], [-0.011820, 0.042940, 0.968881], ], }, "tritanomaly": { 0: [ [ 1.000000, 0.000000, -0.000000], [ 0.000000, 1.000000, 0.000000], [-0.000000, -0.000000, 1.000000], ], 10: [ [ 0.926670, 0.092514, -0.019184], [ 0.021191, 0.964503, 0.014306], [ 0.008437, 0.054813, 0.936750], ], 20: [ [ 0.895720, 0.133330, -0.029050], [ 0.029997, 0.945400, 0.024603], [ 0.013027, 0.104707, 0.882266], ], 30: [ [ 0.905871, 0.127791, -0.033662], [ 0.026856, 0.941251, 0.031893], [ 0.013410, 0.148296, 0.838294], ], 40: [ [ 0.948035, 0.089490, -0.037526], [ 0.014364, 0.946792, 0.038844], [ 0.010853, 0.193991, 0.795156], ], 50: [ [ 1.017277, 0.027029, -0.044306], [-0.006113, 0.958479, 0.047634], [ 0.006379, 0.248708, 0.744913], ], 60: [ [ 1.104996, -0.046633, -0.058363], [-0.032137, 0.971635, 0.060503], [ 0.001336, 0.317922, 0.680742], ], 70: [ [ 1.193214, -0.109812, -0.083402], [-0.058496, 0.979410, 0.079086], [-0.002346, 0.403492, 0.598854], ], 80: [ [ 1.257728, -0.139648, -0.118081], [-0.078003, 0.975409, 0.102594], [-0.003316, 0.501214, 0.502102], ], 90: [ [ 1.278864, -0.125333, -0.153531], [-0.084748, 0.957674, 0.127074], [-0.000989, 0.601151, 0.399838], ], 100: [ [ 1.255528, -0.076749, -0.178779], [-0.078411, 0.930809, 0.147602], [ 0.004733, 0.691367, 0.303900], ], } } ################################################################ # For reference, here's the code I used to convert a copy-paste of the # matrices from the web page at # # http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html # # into nicely formatted source code. # # ----- # # matrices = { # "P": {}, # "D": {}, # "T": {}, # } # # def lines_to_mat(lines): # [line.split() for line in lines] # # lines = data.split("\n") # i = 0 # while i < len(lines): # chunk = lines[i:i+13] # severity = chunk[0].strip() # matrices["P"][severity] = [line.split() for line in chunk[2:5]] # matrices["D"][severity] = [line.split() for line in chunk[6:9]] # matrices["T"][severity] = [line.split() for line in chunk[10:13]] # i += 13 # # def format_num(n): # if not n.startswith("-"): # return " " + n # else: # return n # # def print_dict(name, d): # print("%s = {" % (name,)) # for severity, mats in sorted(d.items()): # print(" %3i: [" % (int(severity[0] + severity[2]) * 10)) # for row in mats: # print(" [%s, %s, %s]," % tuple([format_num(n) for n in row])) # print(" ],") # print("}\n") # # print_dict("protanomaly", matrices["P"]) # print_dict("deuteranomaly", matrices["D"]) # print_dict("tritanomaly", matrices["T"]) colorspacious-1.1.0/colorspacious/__init__.py0000644000000000000000000000102412615251222020065 0ustar rootroot# This file is part of colorspacious # Copyright (C) 2014 Nathaniel Smith # See file LICENSE.txt for license information. from .version import __version__ from .illuminants import standard_illuminant_XYZ100, as_XYZ100_w from .cvd import machado_et_al_2009_matrix from .ciecam02 import CIECAM02Space, CIECAM02Surround, NegativeAError, JChQMsH from .luoetal2006 import LuoEtAl2006UniformSpace, CAM02UCS, CAM02SCD, CAM02LCD from .conversion import cspace_converter, cspace_convert from .comparison import deltaE