././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/0000755000175000017500000000000000000000000014212 5ustar00lautatlautat././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/.gitignore0000644000175000017500000000231000000000000016176 0ustar00lautatlautat# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # dotenv .env # virtualenv .venv venv/ ENV/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ # setuptools-scm /src/blurhash/_version.py # Pipenv Pipfile.lock ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/LICENSE0000644000175000017500000000206400000000000015221 0ustar00lautatlautatMIT License Copyright (c) 2018 Wolt Enterprises Oy 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1611145942.0 blurhash-python-1.1.3/MANIFEST.in0000644000175000017500000000003600000000000015747 0ustar00lautatlautatinclude src/build_blurhash.py ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/PKG-INFO0000644000175000017500000000351000000000000015306 0ustar00lautatlautatMetadata-Version: 2.1 Name: blurhash-python Version: 1.1.3 Summary: BlurHash encoder implementation for Python Home-page: https://blurha.sh Author: Atte Lautanala Author-email: atte.lautanala@wolt.com License: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Description-Content-Type: text/markdown Provides-Extra: testing License-File: LICENSE blurhash-python =============== This is an encoder for the BlurHash algorithm. To find out more about BlurHash, see https://github.com/woltapp/blurhash. Installation ------------ Install blurhash with pip ``` $ pip install blurhash-python ``` or pipenv ``` $ pipenv install blurhash-python ``` Usage ----- Create blurhash from image file ```python import blurhash with open('image.jpg', 'r') as image_file: hash = blurhash.encode(image_file, x_components=4, y_components=3) ``` You can also pass file name as parameter to the function ```python import blurhash hash = blurhash.encode('image.jpg', x_components=4, y_components=3) ``` `y_components` and `x_components` parameters adjust the amount of vertical and horizontal AC components in hashed image. Both parameters must be `>= 1` and `<= 9`. Development ----------- Install development requirements and package in editable mode ``` $ pipenv install --dev ``` Tests ----- Run test suite with `pytest` in virtual environment ``` $ pytest ``` Use `tox` to run test suite against all supported python versions ``` $ tox ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/Pipfile0000644000175000017500000000030200000000000015520 0ustar00lautatlautat[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] tox = "*" pytest = "*" blurhash-python = {editable = true,extras = ["testing"],path = "."} [packages] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/README.md0000644000175000017500000000207600000000000015476 0ustar00lautatlautatblurhash-python =============== This is an encoder for the BlurHash algorithm. To find out more about BlurHash, see https://github.com/woltapp/blurhash. Installation ------------ Install blurhash with pip ``` $ pip install blurhash-python ``` or pipenv ``` $ pipenv install blurhash-python ``` Usage ----- Create blurhash from image file ```python import blurhash with open('image.jpg', 'r') as image_file: hash = blurhash.encode(image_file, x_components=4, y_components=3) ``` You can also pass file name as parameter to the function ```python import blurhash hash = blurhash.encode('image.jpg', x_components=4, y_components=3) ``` `y_components` and `x_components` parameters adjust the amount of vertical and horizontal AC components in hashed image. Both parameters must be `>= 1` and `<= 9`. Development ----------- Install development requirements and package in editable mode ``` $ pipenv install --dev ``` Tests ----- Run test suite with `pytest` in virtual environment ``` $ pytest ``` Use `tox` to run test suite against all supported python versions ``` $ tox ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/build.sh0000755000175000017500000000132200000000000015646 0ustar00lautatlautat#!/bin/bash set -euo pipefail TMPDIST="$(mktemp -d)" USERBASE="$(mktemp -d)" trap "rm -rf '$TMPDIST' '$USERBASE'" EXIT for pybin in /opt/python/cp{36,37,38,39,310}-cp*/bin; do "${pybin}/pip" wheel --no-cache-dir -w "$TMPDIST" ".[testing]" done for whl in "$TMPDIST"/blurhash_python*.whl; do auditwheel repair "$whl" --plat "$PLAT" -w dist rm "$whl" done ORIGPATH="$PATH" for pybin in /opt/python/cp{36,37,38,39,310}-cp*/bin; do userbindir="$USERBASE/${pybin#/opt/python/}" export PYTHONUSERBASE="${userbindir%/bin}" export PATH="$ORIGPATH:$userbindir" "${pybin}/pip" install --no-cache-dir --user --no-index -f dist -f "$TMPDIST" "blurhash-python[testing]" "${userbindir}/pytest" done ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607361.0 blurhash-python-1.1.3/docker-build.sh0000755000175000017500000000047700000000000017125 0ustar00lautatlautat#!/bin/bash set -euo pipefail function docker-run { local workdir="/tmp/blurhash-python" docker run --rm -e "PLAT=$1" -v "$(pwd)":"$workdir" -w $workdir \ -u "$(id -u):$(id -g)" "quay.io/pypa/$1" "${@:2}" } docker-run manylinux_2_24_x86_64 ./build.sh docker-run manylinux_2_24_i686 linux32 ./build.sh ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/pyproject.toml0000644000175000017500000000014400000000000017125 0ustar00lautatlautat[build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta:__legacy__"././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/setup.cfg0000644000175000017500000000007700000000000016037 0ustar00lautatlautat[aliases] test = pytest [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/setup.py0000755000175000017500000000260100000000000015726 0ustar00lautatlautat#!/usr/bin/env python from __future__ import absolute_import from setuptools import setup with open('README.md', 'r') as readme_file: long_description = readme_file.read() tests_require = [ 'pytest', ] setup( name='blurhash-python', description='BlurHash encoder implementation for Python', long_description=long_description, long_description_content_type='text/markdown', url='https://blurha.sh', use_scm_version=dict( write_to='src/blurhash/_version.py', ), author='Atte Lautanala', author_email='atte.lautanala@wolt.com', packages=['blurhash'], package_dir={'': 'src'}, install_requires=[ 'cffi', 'Pillow', 'six', ], setup_requires=[ 'cffi', 'setuptools-scm', ], cffi_modules=['src/build_blurhash.py:ffibuilder'], tests_require=tests_require, extras_require={ 'testing': tests_require, }, classifiers=[ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', ], ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/src/0000755000175000017500000000000000000000000015001 5ustar00lautatlautat././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/src/blurhash/0000755000175000017500000000000000000000000016611 5ustar00lautatlautat././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/src/blurhash/__init__.py0000644000175000017500000000647200000000000020733 0ustar00lautatlautatfrom __future__ import absolute_import from itertools import chain from PIL import Image from six.moves import zip from enum import Enum from ._functions import ffi as _ffi, lib as _lib from ._version import version as __version__ __all__ = 'encode', 'decode', 'is_valid_blurhash', 'PixelMode', \ 'BlurhashDecodeError', '__version__' class PixelMode(Enum): RGB = 3 RGBA = 4 class BlurhashDecodeError(Exception): def __init__(self, blurhash): self.blurhash = blurhash def __str__(self): return "Failed to decode blurhash {}".format(self.blurhash) def encode(image_file, x_components, y_components): image = Image.open(image_file).convert('RGB') red_band = image.getdata(band=0) green_band = image.getdata(band=1) blue_band = image.getdata(band=2) rgb_data = list(chain.from_iterable(zip(red_band, green_band, blue_band))) width, height = image.size image.close() rgb = _ffi.new('uint8_t[]', rgb_data) bytes_per_row = _ffi.cast('size_t', width * 3) width = _ffi.cast('int', width) height = _ffi.cast('int', height) x_components = _ffi.cast('int', x_components) y_components = _ffi.cast('int', y_components) result = _lib.create_hash_from_pixels(x_components, y_components, width, height, rgb, bytes_per_row) if result == _ffi.NULL: raise ValueError('Invalid x_components or y_components') return _ffi.string(result).decode() def decode(blurhash, width, height, punch=1, mode=PixelMode.RGB): if width <= 0 or type(width) != int: raise ValueError( "Argument width={} is not a valid positive integer" " (must be > 0).".format(width) ) if height <= 0 or type(height) != int: raise ValueError( "Argument height={} is not a valid positive integer" " (must be > 0).".format(height) ) if punch < 1 or type(punch) != int: raise ValueError( "Argument punch={} is not a valid positive integer" " (must be >= 1).".format(punch) ) if not isinstance(mode, PixelMode): raise ValueError( "Argument 'mode' must be of type {}" " but got {}".format(PixelMode, type(mode)) ) channels = mode.value blurhash_str = _ffi.new('char[]', bytes(blurhash, "utf-8")) if not _lib.is_valid_blurhash(blurhash_str): raise ValueError("{} is not a valid blurhash".format(blurhash)) width_int = _ffi.cast('int', width) height_int = _ffi.cast('int', height) punch_int = _ffi.cast('int', punch) channels_int = _ffi.cast('int', channels) pixel_array = _ffi.new('uint8_t[]', width * height * channels) result = _lib.create_pixels_from_blurhash(blurhash_str, width_int, height_int, punch_int, channels_int, pixel_array) if result == -1: raise BlurhashDecodeError(blurhash) pixels_buffer = _ffi.buffer(pixel_array, width * height * channels) image = Image.frombuffer(mode.name, (width, height), pixels_buffer) return image def is_valid_blurhash(blurhash): blurhash_str = _ffi.new('char[]', bytes(blurhash, 'utf-8')) return bool(_lib.is_valid_blurhash(blurhash_str)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash/_version.py0000644000175000017500000000021600000000000021006 0ustar00lautatlautat# coding: utf-8 # file generated by setuptools_scm # don't change, don't track in version control version = '1.1.3' version_tuple = (1, 1, 3) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/src/blurhash_python.egg-info/0000755000175000017500000000000000000000000021704 5ustar00lautatlautat././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash_python.egg-info/PKG-INFO0000644000175000017500000000351000000000000023000 0ustar00lautatlautatMetadata-Version: 2.1 Name: blurhash-python Version: 1.1.3 Summary: BlurHash encoder implementation for Python Home-page: https://blurha.sh Author: Atte Lautanala Author-email: atte.lautanala@wolt.com License: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Description-Content-Type: text/markdown Provides-Extra: testing License-File: LICENSE blurhash-python =============== This is an encoder for the BlurHash algorithm. To find out more about BlurHash, see https://github.com/woltapp/blurhash. Installation ------------ Install blurhash with pip ``` $ pip install blurhash-python ``` or pipenv ``` $ pipenv install blurhash-python ``` Usage ----- Create blurhash from image file ```python import blurhash with open('image.jpg', 'r') as image_file: hash = blurhash.encode(image_file, x_components=4, y_components=3) ``` You can also pass file name as parameter to the function ```python import blurhash hash = blurhash.encode('image.jpg', x_components=4, y_components=3) ``` `y_components` and `x_components` parameters adjust the amount of vertical and horizontal AC components in hashed image. Both parameters must be `>= 1` and `<= 9`. Development ----------- Install development requirements and package in editable mode ``` $ pipenv install --dev ``` Tests ----- Run test suite with `pytest` in virtual environment ``` $ pytest ``` Use `tox` to run test suite against all supported python versions ``` $ tox ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash_python.egg-info/SOURCES.txt0000644000175000017500000000100300000000000023562 0ustar00lautatlautat.gitignore LICENSE MANIFEST.in Pipfile README.md build.sh docker-build.sh pyproject.toml setup.cfg setup.py tox.ini src/build_blurhash.py src/common.h src/decode.c src/encode.c src/blurhash/__init__.py src/blurhash/_version.py src/blurhash_python.egg-info/PKG-INFO src/blurhash_python.egg-info/SOURCES.txt src/blurhash_python.egg-info/dependency_links.txt src/blurhash_python.egg-info/requires.txt src/blurhash_python.egg-info/top_level.txt tests/pic2.png tests/pic2_bw.png tests/test_decode.py tests/test_encode.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash_python.egg-info/dependency_links.txt0000644000175000017500000000000100000000000025752 0ustar00lautatlautat ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash_python.egg-info/requires.txt0000644000175000017500000000004200000000000024300 0ustar00lautatlautatcffi Pillow six [testing] pytest ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1634285295.0 blurhash-python-1.1.3/src/blurhash_python.egg-info/top_level.txt0000644000175000017500000000001100000000000024426 0ustar00lautatlautatblurhash ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/src/build_blurhash.py0000644000175000017500000000405600000000000020347 0ustar00lautatlautatfrom __future__ import absolute_import import cffi import sys ffibuilder = cffi.FFI() ffibuilder.set_source('blurhash._functions', ''' #include #include "common.h" const char* blurHashForPixels(int x_components, int y_components, int width, int height, uint8_t * rgb, size_t bytesPerRow); int decodeToArray(const char* blurhash, int width, int height, int punch, int n_channels, uint8_t * pixel_array); bool isValidBlurhash(const char* blurhash); const char* create_hash_from_pixels(int x_components, int y_components, int width, int height, uint8_t* rgb, size_t bytes_per_row) { return blurHashForPixels(x_components, y_components, width, height, rgb, bytes_per_row); } int create_pixels_from_blurhash(const char * blurhash, int width, int height, int punch, int n_channels, uint8_t * pixel_array){ return decodeToArray(blurhash, width, height, punch, n_channels, pixel_array); } int is_valid_blurhash(const char * blurhash) { return isValidBlurhash(blurhash); } ''', sources=['src/encode.c', 'src/decode.c'], include_dirs=['src/'], extra_compile_args=['-std=gnu99'] if sys.platform != 'win32' else [] ) ffibuilder.cdef(''' const char* create_hash_from_pixels(int x_components, int y_components, int width, int height, uint8_t* rgb, size_t bytes_per_row); int create_pixels_from_blurhash(const char * blurhash, int width, int height, int punch, int nChannels, uint8_t * pixel_array); int is_valid_blurhash(const char * blurhash); ''') if __name__ == '__main__': ffibuilder.compile() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/src/common.h0000644000175000017500000000114200000000000016440 0ustar00lautatlautat#ifndef __BLURHASH_COMMON_H__ #define __BLURHASH_COMMON_H__ #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static inline int linearTosRGB(float value) { float v = fmaxf(0, fminf(1, value)); if(v <= 0.0031308) return v * 12.92 * 255 + 0.5; else return (1.055 * powf(v, 1 / 2.4) - 0.055) * 255 + 0.5; } static inline float sRGBToLinear(int value) { float v = (float)value / 255; if(v <= 0.04045) return v / 12.92; else return powf((v + 0.055) / 1.055, 2.4); } static inline float signPow(float value, float exp) { return copysignf(powf(fabsf(value), exp), value); } #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/src/decode.c0000644000175000017500000001037700000000000016400 0ustar00lautatlautat#include #include #include #include #include #include "common.h" static char chars[83] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~"; static inline uint8_t clampToUByte(int src) { if (src >= 0 && src <= 255) { return src; } else if (src < 0) { return 0; } else { return 255; } } static inline uint8_t * createByteArray(int size) { return (uint8_t *)malloc(size * sizeof(uint8_t)); } int decodeToInt(const char * string, int start, int end) { int value = 0; for (int iter1 = start; iter1 < end; iter1 ++) { int index = -1; for (int iter2 = 0; iter2 < 83; iter2 ++) { if (chars[iter2] == string[iter1]) { index = iter2; break; } } if (index == -1) { return -1; } value = value * 83 + index; } return value; } bool isValidBlurhash(const char * blurhash) { const int hashLength = strlen(blurhash); if (!blurhash || strlen(blurhash) < 6) { return false; } int sizeFlag = decodeToInt(blurhash, 0, 1); //Get size from first character int numY = (sizeFlag / 9) + 1; int numX = (sizeFlag % 9) + 1; if (hashLength != 4 + 2 * numX * numY) { return false; } return true; } void decodeDC(int value, float * r, float * g, float * b) { *r = sRGBToLinear(value >> 16); // R-component *g = sRGBToLinear((value >> 8) & 255); // G-Component *b = sRGBToLinear(value & 255); // B-Component } void decodeAC(int value, float maximumValue, float * r, float * g, float * b) { int quantR = value / (19 * 19); int quantG = (value / 19) % 19; int quantB = value % 19; *r = signPow(((float)quantR - 9.0) / 9.0, 2.0) * maximumValue; *g = signPow(((float)quantG - 9.0) / 9.0, 2.0) * maximumValue; *b = signPow(((float)quantB - 9.0) / 9.0, 2.0) * maximumValue; } int decodeToArray(const char * blurhash, int width, int height, int punch, int nChannels, uint8_t * pixelArray) { if (!isValidBlurhash(blurhash)) { return -1; } if (punch < 1) { punch = 1; } int sizeFlag = decodeToInt(blurhash, 0, 1); int numY = (sizeFlag / 9) + 1; int numX = (sizeFlag % 9) + 1; float r = 0, g = 0, b = 0; int quantizedMaxValue = decodeToInt(blurhash, 1, 2); if (quantizedMaxValue == -1) { return -1; } float maxValue = ((float)(quantizedMaxValue + 1.0)) / 166.0; int colors_size = numX * numY; float* colors = malloc(colors_size * 3 * sizeof(float)); for (int iter = 0; iter < colors_size; iter++) { if (iter == 0) { int value = decodeToInt(blurhash, 2, 6); if (value == -1) { free(colors); return -1; } decodeDC(value, &r, &g, &b); colors[3 * iter + 0] = r; colors[3 * iter + 1] = g; colors[3 * iter + 2] = b; } else { int value = decodeToInt(blurhash, 4 + iter * 2, 6 + iter * 2); if (value == -1) { free(colors); return -1; } decodeAC(value, maxValue * punch, &r, &g, &b); colors[3 * iter + 0] = r; colors[3 * iter + 1] = g; colors[3 * iter + 2] = b; } } int bytesPerRow = width * nChannels; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { float r = 0, g = 0, b = 0; for (int j = 0; j < numY; j ++) { for (int i = 0; i < numX; i ++) { float basics = cos((M_PI * x * i) / width) * cos((M_PI * y * j) / height); int idx = i + j * numX; r += colors[3 * idx + 0] * basics; g += colors[3 * idx + 1] * basics; b += colors[3 * idx + 2] * basics; } } int intR = linearTosRGB(r); int intG = linearTosRGB(g); int intB = linearTosRGB(b); pixelArray[nChannels * x + 0 + y * bytesPerRow] = clampToUByte(intR); pixelArray[nChannels * x + 1 + y * bytesPerRow] = clampToUByte(intG); pixelArray[nChannels * x + 2 + y * bytesPerRow] = clampToUByte(intB); if (nChannels == 4) { pixelArray[nChannels * x + 3 + y * bytesPerRow] = 255; // If nChannels=4, treat each pixel as RGBA instead of RGB } } } free(colors); return 0; } uint8_t * decode(const char * blurhash, int width, int height, int punch, int nChannels) { int bytesPerRow = width * nChannels; uint8_t * pixelArray = createByteArray(bytesPerRow * height); if (decodeToArray(blurhash, width, height, punch, nChannels, pixelArray) == -1) { return NULL; } return pixelArray; } void freePixelArray(uint8_t * pixelArray) { if (pixelArray) { free(pixelArray); } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/src/encode.c0000644000175000017500000000737500000000000016416 0ustar00lautatlautat#include #include #include #include #include "common.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static float *multiplyBasisFunction(int xComponent, int yComponent, int width, int height, uint8_t *rgb, size_t bytesPerRow); static char *encode_int(int value, int length, char *destination); static int encodeDC(float r, float g, float b); static int encodeAC(float r, float g, float b, float maximumValue); const char *blurHashForPixels(int xComponents, int yComponents, int width, int height, uint8_t *rgb, size_t bytesPerRow) { static char buffer[2 + 4 + (9 * 9 - 1) * 2 + 1]; if(xComponents < 1 || xComponents > 9) return NULL; if(yComponents < 1 || yComponents > 9) return NULL; #ifndef _MSC_VER float factors[yComponents * xComponents][3]; #else float factors[9 * 9][3]; #endif memset(factors, 0, sizeof(factors)); for(int y = 0; y < yComponents; y++) { for(int x = 0; x < xComponents; x++) { float *factor = multiplyBasisFunction(x, y, width, height, rgb, bytesPerRow); factors[y * xComponents + x][0] = factor[0]; factors[y * xComponents + x][1] = factor[1]; factors[y * xComponents + x][2] = factor[2]; } } float *dc = factors[0]; float *ac = dc + 3; int acCount = xComponents * yComponents - 1; char *ptr = buffer; int sizeFlag = (xComponents - 1) + (yComponents - 1) * 9; ptr = encode_int(sizeFlag, 1, ptr); float maximumValue; if(acCount > 0) { float actualMaximumValue = 0; for(int i = 0; i < acCount * 3; i++) { actualMaximumValue = fmaxf(fabsf(ac[i]), actualMaximumValue); } int quantisedMaximumValue = fmaxf(0, fminf(82, floorf(actualMaximumValue * 166 - 0.5))); maximumValue = ((float)quantisedMaximumValue + 1) / 166; ptr = encode_int(quantisedMaximumValue, 1, ptr); } else { maximumValue = 1; ptr = encode_int(0, 1, ptr); } ptr = encode_int(encodeDC(dc[0], dc[1], dc[2]), 4, ptr); for(int i = 0; i < acCount; i++) { ptr = encode_int(encodeAC(ac[i * 3 + 0], ac[i * 3 + 1], ac[i * 3 + 2], maximumValue), 2, ptr); } *ptr = 0; return buffer; } static float *multiplyBasisFunction(int xComponent, int yComponent, int width, int height, uint8_t *rgb, size_t bytesPerRow) { float r = 0, g = 0, b = 0; float normalisation = (xComponent == 0 && yComponent == 0) ? 1 : 2; for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { float basis = cosf(M_PI * xComponent * x / width) * cosf(M_PI * yComponent * y / height); r += basis * sRGBToLinear(rgb[3 * x + 0 + y * bytesPerRow]); g += basis * sRGBToLinear(rgb[3 * x + 1 + y * bytesPerRow]); b += basis * sRGBToLinear(rgb[3 * x + 2 + y * bytesPerRow]); } } float scale = normalisation / (width * height); static float result[3]; result[0] = r * scale; result[1] = g * scale; result[2] = b * scale; return result; } static int encodeDC(float r, float g, float b) { int roundedR = linearTosRGB(r); int roundedG = linearTosRGB(g); int roundedB = linearTosRGB(b); return (roundedR << 16) + (roundedG << 8) + roundedB; } static int encodeAC(float r, float g, float b, float maximumValue) { int quantR = fmaxf(0, fminf(18, floorf(signPow(r / maximumValue, 0.5) * 9 + 9.5))); int quantG = fmaxf(0, fminf(18, floorf(signPow(g / maximumValue, 0.5) * 9 + 9.5))); int quantB = fmaxf(0, fminf(18, floorf(signPow(b / maximumValue, 0.5) * 9 + 9.5))); return quantR * 19 * 19 + quantG * 19 + quantB; } static char characters[83]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~"; static char *encode_int(int value, int length, char *destination) { int divisor = 1; for(int i = 0; i < length - 1; i++) divisor *= 83; for(int i = 0; i < length; i++) { int digit = (value / divisor) % 83; divisor /= 83; *destination++ = characters[digit]; } return destination; } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1634285295.4359636 blurhash-python-1.1.3/tests/0000755000175000017500000000000000000000000015354 5ustar00lautatlautat././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1611145942.0 blurhash-python-1.1.3/tests/pic2.png0000644000175000017500000036150600000000000016732 0ustar00lautatlautatPNG  IHDR:V iCCPICC ProfileHWTH(UjR%`BP# ]D(@֊ >QQt`CM y˝{|ff 6,T l~ *З @m[ 7-kVX:_E@"!N` A\1XU @8M58E'Hlb{@V`iļ4&hWANgq 'o1SbXicXD~/.bÂtf@%lTA@YYZcXW:ʁr8\~Wo̷87+RfmfFIGv&(59R6ܼ)7 `K9 /H`H\`%ӌzKF K@8+|:~@d4_ @kី; ް.CqtV?яD `CY B`υىGsIxDA&q$j&Ps0Z,7q_qu\ X0 ?2q^˟1fAsHgcV?GaP#C~ĖcV v ;5v kڰb<KVlQn0oƦΦOsd%ofN\/-=Oc.#϶u@|K3T[cua8:]X :q |pL $ r %5`#NPCgpt\}0 $MD1F,;DP$ ID4RYT ;Zwrt"wy|F1TUEuPt"!h :MCgh -G}hz@0yLǬ0E`IX*&b%XVcuc'qnfYB|%^ 9ރT6F&$ ń2nQyoD:є e"18xxI%H$M%ɃAbHŤͤ}S.R#YG#|r!|E~JS3s͕[-KY\0EbJP2(K(zy}[yyyyW)</RPQP`*LS)RأpZ[*jB&Q󨫨Գԇԏ4:͚L*i .+E9EcEe*()(1XJ *)RR+*G(g+Tޫ|I ID_RSJ/ҙt6})}W6ߣn~___@yA!Aknk';O^0\BHtHEȣPPAhs69l}pp~xcX 4rVSS"TNye5?5=3zoߘ1bbE-qqj>ůN JV"/);ihԍS9N+vs9/К5Lř {"XլA6zpqzK}摶>?+,}U^gel's$+>@69;9_?3'328{۬!BD8]ؔ 9m"3/|f~txҗ_|?=2$W 6457{&@%D^ }&'a'r3Op6o{1X0NVId %pdd8rd+|a8L ۈQ^?I ͞m pHYs%%IR$iTXtXML:com.adobe.xmp 314 176 (m iDOTX(XX~@IDATxԽwWu*WWu9M E4BB L4?c?}-`-#& sU~f^]|>9ˤ⦖ŗ\.gt\q '2YvOعi%3e7Kg 1+K,bao~Yφ>ټ;gX_m|t>[X>3@k_k5Wmgm2iˤoh+wfݗ7O(dZieE7.sp퉄I"nG^|fm|zހU44;fM+s36r=weGj욛o۬b3c¿ͼ>+   xYUefǭcK*DO 8=Ae34oryC4FlSai k}[0g^ocs>> xfyr Ϧ}y|:Awހ峴JK6'ْ[ͲC69ah?$g)=k qN*΋^Rl,N4w> Q. 8kk?M:dc&o Lqbw>[VkX,hiC6K[N,X<D2fAlvf sl*x[2Q;{Rޠ]yMOY?d=m !A[wr[u5A={}Veu-%6;cY}BM5V T\01chY6Ŏ>>xм:?`~7cUUrƼ ;i=/jZv&\O4 B&?cMldbfWRUokp-ⱡ\6;2&.j<OXumy6ۑs)k//)Gl?dgNY-7iuѬVWX F@g|,Z[(8`u2{䢌'h6r], uhrd<+Ɩ\,< 7,˟TTR35+{>r^'[/0ƥ-I0ӀN۔0>C 0iqm}ۛ,x7uЕhbrr۰I39=:lCc6=$Br_;yUYI4e̜ym|<1jY;?egKe5NNN;ܰy Dm5o|wLY*3OoqW[~-dg,ݩ7`:Q^[Bs /-aF-1e;2s^-0`4(c1c. 6t~͢u_߰:)iP&`p]U§LoګVu\n!V8\qufr1iخUhW%L&A*- :)+;?Ѣm6ov=uG-cfde*lU5nS푿 ;r~a-ɗsLڂ0<;\$g ſKi-LIKD*oַ{^yI4hWڦ0ž,hM;Xrӌܹ=uc<^+kl5#ƔxLv?k!j[ hf0νr[zF VtlueBh̋ōq32 Sa|A~ %,0&˩R q{(Ehۘ"ly#`9+@4p4 z~/R)uajx/ *vdd<@( ZA}Łt3 ͸YX5"UI4wΡ:^[*490*EMǨ) ˗ٖ[;|O // Ѫ:&6?9*f'~={'lh>gm.?QTuUo?-UW[0_]ةVb%c36s̮XIi%H?z֖_DSͲ`b5:*v;$\n~1e Ĥn}mۦ&1?b nYe}I€,yw }V[:s&QZKp84d"hHG0'ؒs`O0J/M׼L2dqKp>{n|-ɋruWuEUD},Ho͙浿BȕƮob=ȂwŽk;lbd–*j5.璘]Q%X,\uyu6}L9&L?]Bs+p%-Rie5s^-̦{yG_dIUРi\\Xem-$\e͏uw92[u?ߵ-/w D+ZlX48J..[Ԥ}ɼT>GghAq&O\1! ^10\Qg7ݶʗU<~hy;!8pչǹu~+M2 غ[݁>a=MNYEI-2jׯ;k5m6=:h}竖>)+o/[uj;GX|ۮ|ǭu%ǟ:Ww2qsi f"+m4h@SbEL+wEfOKȌL״nزښlu7&l- q0ĆEQK3]/ܮ4Kr,k: 80XF8Wļaԕ VZ>ohƆF'o&esO/ zl+ª%uV`bۺ79@7-Wa =) WpлZYM Z٢~X" "iP͒eǏXGS_,8A4}s:3^jlkmar%W? FgJ>BGtA*yW]f>Qf^+>ŽH+B5*v[ܾ jԪ}u)h/2eG 7wY^*r [7Yixc0.Rof5ʁXSR`-! ʔcҝyAl]&TX8Ňb9$((WcAu6;5nv셧f?5gۗ[ז:<1V^SgA&J`D!BΩwiu)wxZHUǧ:&ƶaߨЇhHXȇ:a2/'q*"Gs( E 94k_uqV믿&0618f{~~Y;1^y]Uܴ()/#Pa?pj;?2g8ܶwf[kSw9hb d rUͬsֹ.ύ63'_/anq Зg>~|M+ }rǵoG{ldd#`o0|vĆ~"mVڱlKx7"q|D9-X ,!kr yq`"^pҥlz|,Ό/X BbSfOanP_|_g_|Ms@Yl*E6C0{sT|rjj27';o!VVQ| 2)CX+u-DDIҐMaԶ2JQ60:4K]U +^i3o?4yPa05Zj+l͖Mꭿb5M9+/x UZeCM OǾCmś߅dCZ{5s{,/sEWqIKMXߖ}=`ްzä %Zu{74J,/+# `NE\1)r {UaH%y4L99(8Eʈ?Hd:trgz1BN fz_Ds廓-J ;=x9_M_gG}ԾݧxOܸ__.e$>f=bR{^qs^pwfUQJqBfoF홃筲¤]ڮj~hss{v7چ:[O6l 촃}/wtR|X>;dNqs"^,|*}5Va9Z3h>U ?dd\k[l=Gږ]~Vu}G͟!xL1una]UR&LR,͡¼ 34]΃|9P,8Z^=<>+M157 Wq5^> r9w[!MB8(8aFV  1S & ;sԴOU~2jڿ#SXNy%,'V,t:tL>!NF﮷> 4n~ȋJs:LJ4A8MCY\Oc75kau\ixuSvz.VWl]ﳺe(LځMO؎~Ҫڈ,ljgzU[ ^igfߏϋE0B/s4؎ςLrFqWE ?h^a*+[Ru[cJ/7tM b2X@L;;ELP=Uq=`*jQ`Ms~>itn<B7Ҳ=H>GT`bz_|&Xj} ymhq x۞?ow?dKV4YYS͜ﳞG$ö̎x]F'M+Zb]{ s[dT.ii _Nqڹ^r\ڥwgwl='&ٿܚ @B}QwZM'WVC#EɐVgOK/,?af_Vadϣp-r㩲8~Wks(ǯXol[b8H'(/! J]) /W4Y)˒vϑCC`+-qRN;KWiE , V)Vb\ Wb/ܷ桋p83MSdc-.șvDÝϪDֽnmо݌=?Clֵ&k79r!:w/iXd:̀~Ąaz˛mtnz!_+J\ _ֹ܆c{hђ6feu}2'ygsE 2?qN0}3j;Xp회_CWZ˼fl Fc4B9[SM}Kf;SW>g 7B;e!KMٹwYĸ}''(Db3ďo ,Pc-,EB&XSO^sN.P w%2pN*"uծEWy>`JuܼF)L>TJ |ź75XUSRY}q̻4&o! m'fYuׯH.+d1JٓԐzY \̫QlQ 0G ~Tgjy 2af]n^kpuJA;,y|#X.'aeA-HC䴗߫t2IҌ,r4_܊fL>3uiuD?PSFDZI,.QkV$ޥA&[׵˚-A0PD&dL9sHI=NmUOZE++'!b=$[kiV?(p8w~(-I"bi%q Blkhk7rg#ouD#9py#螬#Uڮ}~ $݂o)wh ux6iX(s^2ce*p9lIUDe#$p^:(IL@~p DGcZCtZ]Ơ,764Oݺse=\s {?~$^%ɊGɆM+G٠[$3QFHgpyȡ^;7 %)|lǻ@vU&X2v}෿icږUmSD)n8z3TOYfHKV0pRqO5$ R x_o]҃\ n9"ʿ=f۬e @źw 7 |p]^,쾲rwKQ6E,N|U|N?~5 D#M=}='n4ğ,5_}B)) d9i-9<Ž*%?֗ bߥťI=Kqj, gs/ݿد|]k٠gψM߆fχR tǐ8J;"`ʱs#DΪ. pò86?{X^wܻٮ{X l](\G(g&r?}ԯV_s+a_'lfl?϶g,HWEnhWv| B$.*Z\"ˬj:q3("<™7gFGbM}=)| 2d6~[JUYX)^/>8?L˗A12Se(6,^5tDyB+R-n{Z,dQO/,XS ʟWi[pj*/疮*9鍐Qk "R,&S,Lɐ{HZ]5pjfm/&m$GahοD.&vlj8*4AY95Ҋ<"+U7T*Z{N BK7 rrNjQN+#K .Fo /uK֣mq\8ǻF|v|FOuulbd1+Iq Vl5=kGkȤ 8mC XIzn̢1? n=fϺ.Ȅ-ݙ>#\~%R}1 Kߗ`H@ :I`Yk LBn,wN]:O>Sst2"8@]3~e@ԘN{R;S3ң ^[Z Ayr'9 5K^!w^Y$! @>v:~yE+ ykK 0uǟx6겻WN_p].{H3資5SyS5XjKa;?M{qy㟸r+Ij\#"0opY<;3fU XȷFED]c>mt]~QmJШb6{d݃ J_O$=򚀰/ѐV㨿d@)Ʌ(#ê</(Pq8%H*`i̔%- ՆwLm!WQB/ 5u2Av>? CQ'ZIIck$B֌R+˄+#"cB&R ڑ],ڿ6B#'P~~e9m[O۶vB~4Ah!yAPlN$46_e8}h.;#;G fjWMcӄ;QgZYiuյ͸.6C8msιEY~,4vn(bPR.s7g%QZ,郊,AOw&1<r-V <^Q %LvS7O |-B!AXQ%Ln- vQc94Իſ!ϕ)P8&HCSòr-ܶڪբ,7Hu}s9/E@TN3`6UUX%㨩C >D7 LP7I=R%x4pF=PNH]!NrnyaY)%+67I\e믿*=ۃ3ymȟ'`{[w[쁹;?g=Sgq]] Phd C#%P$4}Si"otDEuے+(OO)iM4M3{Vt]vB~Rߦ FCIP%>1K`->e\IyW1$|WCsS:[B~J:&&QSCݢq]`/?M1Rl6EIw%ٟ|Nh)ɫH3i.}A*).__.uh;4~(2}/̮BӢgp _;8V\|5M&ESNVYOHKB+2L&wA 5;_W:qܾڮ=׮hqjv䁯l80I'n.UPIsw{mN(oHs>;u)rB{&8љ!@OGsʺ7Q\#8(M>|ɗ}`'H$)D1_uhkn]*[7/~ ]o70o$+shccq`$243k#^6"WE)O@WT_L4&D2̐4PUV kYhph.ڃMǮ:a5aA"Mݫe߿u;xǢ9ә}m'DwZeS#vw[3| l.Vh.2f$@TF(R<)Uii J8T-hLhjd%1pܚV-w| Ӎ>-1gOgEøwnv09[@ږղ, kp'4jD{& @_Q8 hK> F@T Ma!Ube8{ɟ;J+.O[$AtB6!RV @8BD$FߛZmK(!xT'B|>8 E@Z\ àWA-eɽ e{͖a"fK*D+Pݹtih^*LJP &DX~ ~jui;=&$J9O|ZgD&y>Z"oZd+;2H!\0Y:sG[7%UXY*!!5U%@KLګ=`_޳Nf~G{xbCp.$diket\q 銖J2ueh+ Z.$#|P0,`Di ٵiE}kp$r%D9oIj &M1l\*6~Ih.Ip\v*p|~Z]{ _L] x9j:FL,J@*7B e%~Opb 4TiXv*Dؕ6@޺.l`F+l UKez@_R}Xs&EA -H_35[Vz~t@GtC̈́ٚ1C*m1?v~t|܎'\sEYϰ;^ɗ+ &Jq2l.%z칸d@Mԡ[< "e]9x_~ X'wmV4V3?g]8jev߽߱2mt-h7}YܶYѠ@zFOqJ 0% =-ZQ]cFA յs.e1t@bNSysRVt/e@̤&LXɝ DV?f%'CY \Vx ҕ!&ѿ*-If1$&R5R""V dj|.~F{4m~VhUl.30 ]SNt!zmCDģgdLC)h;nZ6Mss4QMorI CG3~㬎T4ݴS "E'իQCGpyPHMwo'xV@ca(Pmڄ4&ZMV}1jӃ |ӤiICCxEykr5t, ַQRO!|; '$DVU3'`)Q%"D 4YQE}TUI"b:z˺蜴7B3sC4}ɑqRuN[xuȩY.n|MC*\Y4?juHcz+HMz?B@ݲr)U'>sV83=מx%i9{%&Y<;cnvf')IMOSVCx(Z҄޽TV V4}}UhS>~dY){_l"'?տy;vk+zYjh@9"Ǖ&Jj [?dcUVVa =j}/U>C;EV#@E8;~UUUy{1 Z\^ڷ9V ~bl+g< f"ˢL–?p yN{_gj5_G%rƎ?k_^s}WvG0+m嫏yl?ya>nbWm#GI[52o8r43O &p(u?he%*KFud0kJTТrJkrNݒ4lL(& Sgf9W>K"Pih`i7X aB`rh&z'G-OéҙIWԢJ1S6m궛]9u]F'XI`'!gG{qZ EUN\(H'e4WBB9 2EZ1mzPpCVzLsW\Ўe(3]9FG\-U-)]9~ M6Xj}U 7m׽BaBG7|y+/8MMנ4$cCQ⺚2hD;nl4D9e<o'9¨$i&YDVôL-RDɺ API,_JBxD Nǖ5MkB )1sDsu˻0AAF>C`T'q}U8U潷X휡%*?Ln|)jPpy^W:@44뒏ׁˢyYլ|NQp?Z9l A/B_ *^4 8~ӎ@IDAT/mjv,@2JxA& &j7yl+~k )K,iu*g4@E nAhj:i#21GX] tnK^Jp2k媤\SW %2'VŲ͏i]A@Na6۷gyT0|ae|nQact;DR~'+g|;3H \,Sօ1yGkoZʉ: `Ysydo2%E)@P( &5rE'uB6[ג Ƚ\նjLGt :*Hʊ0 !ޜL)O CUN]X/#BQ0ezt~U^XDK̋, R(bL\M?& Muv{6Z T-zȽ@-u) I~[0{ߞxtmɊdqUB,o}C$0_,=%r w- ̻*>A訋ksCyGTI<Ӥ ۻO>zRȋmpt2W2ey`' >DP0 /?bs{0*&L "\~X҄L^#kzD|A{\Ye)%ʉ(*בZZHkXO>k30(:n|{nj㓬8 &\g@xuyBMq-YRME̳٧.Y.C}N[ק!{ˎKWٺ\cNLAU \Su%πONT R5E(\/c\;f#er% dE)MO1I3# ?5ʩ4D&i?I>.5cd‚k3ZSw\ͫ)>Ge_{5ʳV)hn|[mvb_[CMּB9dgu\B_Ћsm#ܺoN(l (X]|"0xC)c M6lMejGm໙#"_Xo^buCؙOY/iQT1mX8@~*0Ц_'v"5OAT3Fh Uگu^U ;1kd(~,4^J$)DIrO C#@+jƮNySUe\ZBD1H&(D.`I}~Zxwˉh? {jÂ@J |ƽ8<l٧ms,~_=XQM7j  >b{b&,UsIJl gzd)q=`_|E`u`~߰*j=^`02XI bIz!հ&&]O`N3AfSwM}  mzj@N97fY|'bGSGd/d'o &qĊt9Mݡ,nN&fs7\SAYLFJbֆuTմF4iJ*agk׸[s_TqUKkiUko}}JkOEC&: ͣmsuh'.W&/w>PuȬyZ~V!ekv^/ B(&6l /As03I2HA+hƗq=Gu:mj-6.[Vay}gΐZfPpK1Cpˡ($M͏F&ZcQp%(DtwN iYr p_ ~!E-=>wK_.:F$9&Y,D9IpMگ(S/E,eE2r'QKHkᩅjqr%H>Uh6[ 9r]r/Kl]=hRQW aCpYv1Nu ccRx ff׻CO M0Mew{ydԭ6elq* S!݄ EapB*E$)^AfRZƗEyNW"y:'I D3QW|2%zzZE[UIQViWuM"]Kh2#)/K՛z䝚W݃Zaß_`m_'üP(U E=R;Zsvs 'a_tj'1DQu"J{St}mmyB;VGW"\1K3*⟶7At09[!x$O-Kڹs&quK7CdVjfxȪhr$]xN"T)ɓ<Ty=L ߵVFRd'Q\qa#bd[x^{_Y z"j*!%s_M5ْkp-hՁ<4=bC`a׫yik= s)OۈFXIk!L2@-;ɂNiqaVrܘk]?s/ӯ6[F@gj""M#RE%NUS5Q?DN=6wL@=hA~5MOAKLӋWn@IµA-.$H' c +QQ(ڮjC]^cDnlIX<^ɄdH" s|wRԔ*V CE`bV[w-_0OhtI$t.fJj"lM tLWAW7cbH0KKSH|r_0)`WLmFx/2N2/:R&$Eܖ‘BOL]Χ9zAxKX͕AmF2Wox_ر#G*߂6j-5=DqĮltdY*ʬSw#[v3NJwA [c2@8U}7gfz>HYkmk;Ѝ0qvwF&B~:-a>W&kʎxyz)2X I{,6%+Z'0Yt1U쀎¥Shk~UG?|A{j}}+VVAϳP+h ~JDE?q5,_.ͬу=q{GY!0z"hzo&^nip:{^,Sifr]of?j+T.n5iD@i485_;mO~i8wm=#`yu18-k",eq"TҰ,`&1qcmk0Mq.xsq yH58jKӹնd]) 9:%/MC-&iNWTPe@_ 8c[:eMOiUg58|T["D-eƏm/hu:RN|(wDa*cLE÷U$@>"}c?f[{7m| h9j3ěOhkiOɵRhֿJE$^@S')CСehw#tWͪIrMx: =d'QU]'Iy8 L'<Yқ‰!}qMdniz8Ko|h3c%Ll&k% qq.4X;%;VYYUXp!3 !殞Eڞ4T(Wu?ZڔPn~E"d}\U~(`BP^<jJC!?m{c dZ/ʋUa dԜ] mk'bۏ= 5y !" 6Jj7L%yb>Sj`! - :I峾Sݻr 1SJ[iN( Aw_tBfD"A'7$oo_lLh5Ny#:,ʞ L%§qѴfHpIF;ˏ"!w iS~K_S|gQ;mjgV^f!3&50Y+fC9f+VwplS-1 G3Rd3Ȧ{,rJQjt-FC`<I>p"[?}'U<ذe]ML"1pW3#_RZD`eǪx(2Wi~O܂:Di馘k#ڃnBOT&_a$0G*TΥqh KQH6 Hz#v!*iu/AOu%" ddQ/kt=|!Ό\ 6K #˛RIlZ˯J AX ^'2jolg=}vn?0 Q3h99i0Uj}+,@hf`C u8,&˗@^7$j ~@)8#̦'2#K_$|h(8+x2, i{,h΅Njt'qj>YO<[HЍc9J!mN{ OஏfJE(MLE*5:n<&T{IVBh[0QҶZPU>hC.m$/޺CR} A$H8"V1$X[,+z˧H?F0#8F!uy(r Ea=G{=@TV9*5?_p6oMghV:#zWE$rrF{4wKjb<&bQO-蚐VTt~V6$Y .3> y _F2(qb室fmA$<`) 9n$e1EB֊搟M3Jדn?/ͤH) Izu]d*{J9 7+i2}J#d1Nۧtmjܲ a>OYTb=YzV/cε?u)@k,Z3ڦ)`.H XŻKrBJrx5a5ūskW5Ŭc)dJVZ|zνxM"Ml6Jxa |ht*c;/N5ID]bQHɱmu2#.6͂Fw.8*r01dU*A#v'/擢>O%ND0@ nڤ?l־/1/ikUDNS 6s1t[tJ[h\&@c2N#rLQ$MF*E,kׅڥ'PUhxp\yZ'ªf"PU څzs }LeE[:h~iM=C hZ#aMr/lZQIl sA fSRFx?^xh9梬;3@kfȑbs0)ğeTX!grN/byI`##a'A'A#rD;Is_A4#8qDiw$7YIuEa!}[a<P]e{[fOwHHI`C fSJ$an+V Tm$ϯȦ0!Z4u3VqCނ`J>k?+AB*5F>P}? J4W wnB-|l{tJ\kr̍FE^||:0Y 4o;+ י/Pjo "h,r@,&Z"LzKKQ,0fn(4iIv䥃/nM&EQO״`xB汬%m^K l"+.DM}h}=6^cdlm% |]wzK3D J=NuQB$0Im 4prn8FN}b.2 @>{'6w8 U%@̓=y: 1 j=TBh<"X$ޮ_"Yd &;XOt鼞Y*Kx9U\l Ze]>t ;eW`i_V"d#HK²m~JE{K`}'lw8 Y) IVLg OWBa^L 0o| A\!ќ V?LQ6D)ڜ,+s*8sM^bL6GvAˮ]<ԧ)1tiH8'|ǨLuބ[Ik=E|OW80sX4A) $pB0(D7 EJ*CG&_,䒑ɉP$>q`Cw$4rK&^ZOG1zuo=Ai {_0?ZTQ=t%9nݐ8bV+@pb$382K Qz|tMG0>:dA՚] k],JV!;Szs ~`G|tR:-"ʤ/*n̓`X6@@CM!XZ59tˀ'!va]>((vĚWw-f/߿#m.3 e(;*QY0Y*†'dC=HސQNvH|ShC+lnyu@}ĺaH϶e~\v1yDIs r֬b4s/|eUm '[bJ4L8':π (+]e5"$j|$]'4!J( \?=:.t|@,o)~ف3G؄4M@dI.$,v2Qqy6w^AE[Q!B~XHj9f#)-D fu.Y&mn@<1JbiY+8B9/Y2M .e4f'cfHG3GʒYulˉgFYp[|}57a`4Kj23i 'h ^N98UբvjS.]W«Ov۴`ʰPl~dʬ.+V_$l2 ʛnb__\$7!5,bhou3Eڦ2%$YL>7q}?DuɐepS$IQ$# 1N$WeXk7 X_ Af)lMpE ?IӾ8뚧jpIvĕ`ȣMJq4)z5ىZ.tl ֈ4;E~V-.˱W&^[b+Y.:ku \&n0hI4\ɭ2O[{^oZ7QjeKzRltHwݱD|/3]Х`QBh' #tg! faY^WyP3=Mw_v^gh`cÉ"L#80ٙp& 5:T|2-:M(į`&[3/ZIV_ߍo0(:.zRw|.v1zCO*<|2%Pp_i-.H?O_.F> +ڛoNn%P"-K ~&It5=s8A'8i (\ Hyy0P?z^ڄC`iwsf&qMėjD@C$|@T`/n*lz cYG>;VxB83S ✢zx^ ٫K,{ݝ^<g!l ](轚j@cr2np~L ,#_z ? ]6$ *mrPps% hkCAH,7j4>쿮i)Z|~Mn=,?s_S=  ;t:p/x fL5!Ff2,)0jN?k)&`{y @d j IPgeY2EW^D>( P Mxǿ|f:Ij'u֙$rAPfth 8h#ݰNZ$P2}4 HE>6 :Q-.E`n"4[HVDsEn`dPO玣H%DisPet3dNdb9<,a~ em\\Ni "?$pT4MM%閗g}L1]-=aj%}[::5Ϸ{QӽGO={noG͏&hQ^o$~˞\Od_81 @SEٴiX\mYr(ƙjIx4_sgj%M(LXw -Ȃq\$裂#<L,YNuR,~SDo[ms}?OB"mo5ӝf?4T`GxF= F“' [8&vܚ8"tb'٣` [BW5EY*b͚A]hRH7?<`eh3n8q]]̨9w'CŠy噪w㴆B6^M5m([>3C%O USjt:.hX $|F=G1 J-6o~퀵53?&\_@UTab/" w)=F%lr3-x@ jh`: JPr]D+~{~RȞб2g`TjegדFE0b7'=wQj馨D.T@YKCKhm3,S)wAuQ NzGy ًNB_QHU 4%qG'7 kk |89`:tg(,x ;lJYH<3,iXGԡ ğ9= b-YzsN{h$tZ%9y$T@ -? h|I2]4v:k´󹴵q: ̠3-0S$w6LsXVu+FkR"0 %#iVCP*W8j*mͷXjag< Xk[[j$2ȗ SA#\IYhtq

w1PrKЍ,eG"**Z*fOv5饰GyiK S%(3|Ǟݾz)qY=_LX 1On kmFBZe"ٯ"~bN53ՉPE(dQSptNP{ZU6YUf7vU kq83suOPP$E8/^iW4f0G\JY&H (_spЀAZN챒߃#A69Z2?α.+Z}# hI-&u$QP@|(׮yX :qa9F L4UX; |XkGdQZqwc A WqIS:VPI*W ,~"ު){[Hcհ8ݮ T8{$l0~4+qA>C426#d|cV}?q nOh0jVzi0W :?Jc8[|USȔXw߻V{=Ul/C(N@Bߝҗ4`&حhmMnm%;3]hp4:SaaͰ"^y1M sP`v|]*tq>dB)6UN"^C"ALA0D Kh]wWviNu&(Dt$y]|ĎNC"|~RuCxVl՝< L0MD2_6+[jIe+DqʹjE$+6ju[KahrS#IӢJWڻ>g--Yq*Zsʌ:YhSZت0XX,fu:Vd>?q7ژ#.htg^g)tشe#&3qF( \8 =S'B鄕75'3?זO/B&Z u7!L3lV1~؅*')BM|AW#ȇ/z8A:#4B I&u(@Qaz#b2w'MD.QА9!w0M)H$-&M hʼӄg}_Uҕ&xۆqsm!,=n[ƽTZ|h+KNT;lJ%NCǤD UD]~]qGܦ-ǰ(Ehh!iQJ=G @eZ/e6oDb1AfLuHa/Yi%ˮcuv~ϓttM8[} xv} 'ڈvU1synXZ?B8?ņp F]a8G ]seK]+B% ռ˼aо= ]pנ$cU7=] !߼x/P ȼJ6:/P2yAMwugCE˪/va/]qz}oo$ÅN d/k)zW6kAS5r` ,zS0+`Q \T 1R`V=]5=6cpB+HJ PoԆ,B=_a<ǩ"A0FlZ I2x=N+ir;"ޔ/.9LZiKs@%4¶ir( ?&3)$qIh̤:w&Oc DM0:w/NS7 tb/MCꟛWۻȔ|\ch]C%b1eׄ{_&|0&f870St$AAa%W} /D8H./V'H~LPR cDÞ(?d+׽eی5{h-_y#91Vwu3Am_$k:nu'۝P|ᔝhB;pWj{׽-yo#_t7Y:iti,KM-4'0!JhlӇX`ڱs ~3B>eZ  jz>D@IDATin՚2Ljkv9 ayb;^d]Fe7RM+A抶7F=UNJOVە+mV̓DՄXh68iNXԐ=sM?`zV$ Rj#_=ibVlMгgb]p7_f7V:Y%2d =;BN흘n\Swв .j}/G4@~&|thq6Dىj/A'p~|3)/IA$/L)d0fq N;QLXO=ICAӻ) lg>b*baMY-1b3/ʭo#tNa<3YSMW\^s0fv >|X=/VEZ@ JSv0qJqAa= |]I*c`1ǥ i5074#bn)]oaP弝zGs *+_{`N=_Ag??๺5?@Vq\^EW'9W*ҹlVC*߶M>:4: \UPBeA,(=`Ly] >&۽㰥ѿ24O.kЙ:)Ҫ9UI49u5evˇ#Gx4 8l$6hwbChKFB~L$ 4Z)$i_✳Sֹ<|Uwh7 H۝w=V~C{fW+Ɯ pjz?k;=`dK8kE"5~t5y-wRIqmz*i$wL v9yt"B.5[ljDz T4:ϯnO֚_ne1AyҦ:W Kg8rf&J3 X4 ,Sc9E TSPB7 KEUB_^aAeg% Q4Xqkπ5 12[OJ[9Ad!JShPa- 4*C J_tr=?UBkQtVimu`NN3'qr,xpS*`=h8\T}v\JVm)"sY[FcZtNKvնA6JB02~DezTt*ؒ[r 'A`K@;dV(3H+)FZSIn F) p_.Mk?wэXi%:\F(KМRn}z $-v q)~~4O tKB4$r$-Io*qOc? ?\j~oµ)6+"/ܚJSp՗h)!Zx5籪N~$8<1%|uלAҴD%q6dIm_zBٔ"kL(RB!KڤrԚjmqN y%䄦WdNSz~10|CC @ʜbL0Ibı"@4u-hA"'bmK31vRM !xMQ`"A8@*c#dAy'ԁ;kYhP'-UM.dYDZ2Ϙ krc'H4 }SG$ZrKzYw~5{`?r㢢+~ $U|=&*f<8|9WɝZיcNn4d7;hÇqfk:Lū>KPPtK,^6CMjk˅VgT7K|:`8(Rwi%;s@~hvw1>rĆXZ6<^F'[VՎ9VF`+VÚjmo,@O LPN͑O=;/*-YXNsyw iE,<(у$DB(%Ҥs M ihj!E=&CSX4*"_8vty TB1,冉.F"Rϱ++[Sk'm"h|Yn f'raeΦ;*IN~9 㤭 i)$s~~&aE}>Gm+1'R!a,Ap֤3yvd8Ps&/6BSI='샴`+nL,RZ+ fc+zi[Pn;]x<<;gn0Ͳ#IXiMEjC#0c4bSmrTX"o.(w +Y#NcS0F0i3XLgMT~̆ ! sS֝idCV%+amF0p~rҫWX dCDlƃ6Q{ڊRv2{+-~k=sZW#!<+6/@lSSVWk C>WpK/a\|Nm8"-K 6xj{푧ȹΏMo M~ E6VSB|j7mZݜϩV7$d2`9DϘ)P1H9 QF##G)B4׀ɤEؽ#>6\hT)@QQ"D)T$8Ak4Dd.iErL="G"_ kصd0Xh}v*++{??DaoNOiAZZTj<O$Nڠο$9߰Wa*٫=ӎEY$i8 P>ȳC׎<#_k=5*Jb;L$U?*l*d6I:$d!Q4 ֣] l#GŒJmp,Wϵ橯{MQ.<ԁi+ `,;Y.IPOX2J,ލZO̚vh`$ʌ触+J;=h9DࣂGY̷(+?x@6Lβh>#SF z6\ Co6-#8ˠ? ܙ4T%*3q?s/Ҳa(iu0\–NNliTo+:pv;vkEKȨAF8?iEK,W87)$,^{mkڨdYƭ^vXN3@kYle@=<֯}磝x +Vem@%Uuz-bPyX"Y>l)kG>&['!Jt?&5 Y_lQDj*jaQh+ZSQO<4\hb Q&¤m$Q2H6 Y8Rɥ-axa&24-ArkI~B L\Epp,ZzS ͋(w0 Y1hW_mv3_K30XIϱw>Fc=瞰?߫c"%5x`QRV{58j1<?nD $:-c{mk1 p.a -_z `ZN!2e@D2"ԎxIb̑Ʒxy>K|yV*Ak$Ȑ7vb޳6n$#Pބ^ ɻx]?GXk, I S8]&z:`:i'Weeחs Α꺁@X˹VoC0ZwI(J]tl')|HaIŖy'5B9Uc&29vDTIǾEA'-y?N&?C9-,L41X腋_:%Kй303'"(>:8c""}^ 5|Ƅxk!6/+j"A&6JBMGNM{#Z|  Yy);},/ Vji?d.(P"V$ZKif"\I׀x45w[јjthNCsH+-?)h`0d=KQDklJ! ,f`N.f9<ןpbøO JРr Ǥg}5imciFڒ)v@32=|;p"1ώe}X;-jp>}ĸgs8 Z57Z7- 3_𫩒?& ~kiNJD;%$ ElY\{"@㌔;^|N'iX}"}'5OjPK bH~(D $>+X&(imU]jbf(q_Zj&_[LXg6ļvG@b<t BNt{tn?BM Uv?a\Aǔ _a9@ &Ӱ4H"8 䵅@.I7[}ik%-'; R'xcm$nlQzi}RPO)r\Ψ\$P`]NX_1[LJ\ @(6OXZ!y{;{4p_ߑ2ce-6>{EXq wB}^Q=۷ON[]J**#2:% !PvO0Gh!%p3O&l͇QS3/> ŨL!وN~|g =Nq0q~vyEK%ԙ!>b7r>לLMB 6vAaUS(V%0tuK~ iJ c[~}O Uǥ?\b<v_>`o/=e^{z@_(Ҍd`Yi)(e5,ZZ,jV( _MҩBp 3IJnZ* [tN*yV㢯@Cb3a vd[0o2LˈxBႩS1`qX"\&cr9kP ͎Zs/Z=p3s뫯~8Ҳ-'DH{@ypYշKC;Ze>ah%a63* kËJSpẉGlt r(LaS, X&If"MZ{ >)] >hl&HnkJIs?O]C4RDTMNM0 gъBL2FY[LJE K\\I4\mE׬*Q`uTdAL]zXކw9!7 TaӺDJ=ɼ"?d^l&FNWZwS/>K'CoZL!XqS"#f ;؆q1ѕ"4VO &;:MItjZ$/n,|:"D`fW\=۞Gݺk+)erݏHYu`t!TWilH(FZ%,E_Wga7bxa Rb_1(-n_:WPBAZxg;@ 0M^ 9 ȥMV K~4 :4<ͮ"'Ζơ7gX$8U\ddtڈ λig2ypq8H'B ?N]t܆ZTg7܆1*XYMAjJΒ9 J樝ڳ+[J-݆1k4Ap㊽PfpG("O췝d17 HƷ=Fk|sݒQT 66PYr/ hV$>(\8.ecP 9@߆9}.ȥpBc6} ~1>Y+Gֈ /HV窀t]8`RA$ J"3{6"5!Np!S{aS_@3KyKF+8u*Uk߰5 ,UX't$y'AiyZ?+ :i0<_j\~!<3S4Sb:CǦaf*($I 93p-Jҁ6$bHh{\uC .o:yVL8gg_M&Zr*nt&QUam+DD|sA>2Z}! v[H3 N86`jjڅןP"Y(\c(CA}NךQ? v9˿%M+и!F7)<${4鷎v;KMlpe3ЦرbCo^K_Zª?!~AdB" ,ځs dDjI(#KdE8 6ARO3r} _fq_hf43\6P {iI;DA"LsKDijj •gŜVJ4橧rQY4Uk@46!z-sVμ8}9A Ad΢)!Ej cv߿'t&JS~4 APN,C}}ť?NH NBCgbb&"K/KKb 1ZA%wwP.M ,>V(ԷV"S@Ya.t{217VΆ+yBC3GPœ/\]LA[ mx`4nEAX DMjw`©^GQIٞ p""LK_q4zݎKٲۨo$څa*^ѝ#tB$85]ɋ;_twX2, W9'{IJmTcG~h cO 85EV;'Mד0S-/u;˴rTM Q R1>w!zE-3;3hU0B~^}Z Q<K1/(;0: =3nm^շoup$Ṿ-|p.E zx- q$o-=b@|6k7ov"8YP =HD4bܞd6d|+f̣X6Z[/VBN0[NBN1UrM_['U7s٩꾼1߿ :)%\cٹ`JjZ`&f҂#BSr/t!8!4( 8B#UF ,lA\R` h;IR6bqSYݗ 8q&>"Hñ2 ?54B#M`$J ڞFh:8PX_+郰 ^4T|b$fū>k d ~}{m{uI +S"7'Mmnewعtl֬~:|t`Nܟ>?h^n;8x6,>^TFÒmѧMyk?9BpOcso1inpAЕ96ӯXai'`<'2B7V-ӏҗ 9އf'@z ktG 46$sG82O 䬺+HR#v mۦ :(}2;8ڹ޲]-shYfBKDdI1W=YXuv9Bj"/%Ѻ x=5ƨcF;foz5bS3 /CGF6EIq65i^9 #8`G'-7P2|l6閊gsᆩF4_rhUKPBU 7KYDۥ96?ԘNI+dA!s'4U:SAd"YLr ǁG4P#VuED496l ٘I"R#n c$Jp残%kqL!P\T[Vf@AZ5`ζ&a)cAK۱g *홃/1HBOTDjg 5[QL v\ hPA? {-a8Hk;hc+ jaw5ǿml j-FN^zGSvb H&pz-@P oٯVڶo;Bk$e(RBZsmg+{*% !i_l{K>[[@8mo1NmۺV-N""aiD׋Vqk%mܲy~D"+oYEc eI 8tstv.ҭzY{2/;Xїmh5Wc5BF41ؚZCyJ3&f|F-;3\\ Eb^9 &+(NyN={I)XEe 4DN<}=@{5Pd^%DѮBʚ)LBmiCIDMn0Hsx`%ނ yk<013qMOսk([b6\+۵;s~v@@z@̳Qr*vOٮo~UyM ivi[q3Qn||WȈh(t*L{?y%nFЕ#̲MKJpMr^iSd:2Xe5$HtE[a +!I!K8)k(rQlE%C*pI)F痖&'_ OZ:B?4y/vO.lJ=ϸ{ y}oasr^k|]v :ݜ! m'a桓L~Uy_ 0$D nA׃&7Oa_$I\~?SZ~1.jҜ0i$Xt \ + XS]c׽A5h1$ivXjΌ=Kh4(2̰lp|8WH? %]&B,nc?^ѨfصU%EnSN9UQ/^an-ZB n(oB:h2Yd.bT#jA&~GvnNBi{B"B*T[{Wiĝ pgnIݺ$K- qBb;rn` 0l. 2Pΰ r2p9|ƇlٲuK}w|)U[ o"ww>J 3ej$zAz!tHHz;%TIc}P}A?4rBx&v opHbN'h{aOi@yŢd$3#R 5d-u/JCJʸ^"F]js$ą:=e]AM"F)/!k Jq{Y6Y&C3CG.^4~'nP0q`=MY>}s}Glu(ǫ X'.`Hh@6`}sV\̲Yl YlM@W  ЭӬsNٹsJ/ XC'}pVw"ҏJL$$lΟ%o>/C n6L_J[sٞ{°pYĕ7jAcVִ!+P, J $'=9v(&LjC"s59[YUS MB'S1ct@Ďt3[,.2Gt=LX$5c~]Oy&`c>!8:qUING-!U(S|TɂN"fΧ  JeM93dJ?' (~GHKI^đ6+kh}2k?xڈ]/ nZ QmΐVP刖2BS[DE;nh>Fű^)K$7 L%^Zo?XY9ѓQڃ5j@5IDAT gd2GQUYc% _LHB,`nˮXM8+vGOhp]8 Z qt,8/k^=ud|?|n؍tV_A5h~zо鿵^8l+V3K[]'hmDT+hy|(̱^Cכm@^` ̫18=JIW[ bHӕ$FǘW׏vMnQZVzL k of,1nPGU t^%^^!UMu1g#0$ֳT=[b1ZPD*Y5ҢK`S]*]޵B*`9cwOCL/;d'φ:sABDl8@DQ3_ vH2WHq [eD$ny `,%tF!D]9ESkycvw z>Pu;Ow:\R 6K9XYn)`dy^@,- PpB>IeÊx.}tfs˩y<ζp…vD/Ψٮ>20beŁXHeŰ:wi8o+ՓPz,` =Y;K.wī9BRY\@CɴCĉ7W.r1dnv\wE=m*UJN=(2uϯ-C}CBAmVi*M%[Dϐܰժ6VXܜ<; Q^ 1i'0"BG.ʥeRgh {KH蜰q|ժg.鷊97Q6?6O>) V!FvcA텣(:sX#-Bg(G>×C g"_x[W1]\8Ī MH4pI%6@_#p~H*G  yG>Mfi*<}qb5~L?\Hܢ&"3g I8 zMJSFXbD`ڙ[me+ټ*B(/28FOA⪋-}#0 }F\}7 $?Z" ) Ws+^I-R99kgg؁_r?cF#7mkܹXrZfM2z ;#tC" &u,HvI"Q_ֺm+gm+D\R[.5O0,&!%e[49]]s5a;wNQB Zgsj^Z*f]_)T\ ?DDܤ"{}b2cLu8}wD4'bbnR!";nm^.fVH.;!0;- WPI'n2k &oXD䲋IbQ`#Z[ tt 3AxG+."U <skgNA!: χM!dt8$YBm?G5>"'V:0:;~N2闰 1N±3i2}ݝ(N"F-e> A "P`D짍a-C}z] "D9N5UD4`/#S}-{2R7M@N]խA\iNd@ʽ&1>vϋzuւ;p)>`MĔ'/؉(brK d(Xjvb9,>>B@1VWOs/rр5j+n;0Iuf6Q trH>zN;w#_S\~h4;=B(.?0=LmYAGԓ;n/M ks&/87Ԧ'Tq]j>NOD.E܀{QD8̾)Z GYo7I(qfaQEXDx54/&N˘#/*w2> vXb2,-"pܒPD" ) @f"4YaՐܒCJQz]?X!jC=Gl a 1 SV5zQQ]q'd X-dAQ%(63 sQ]q#ޝ*;jF^k"́f tABUQf.(Yl_a9HLŃmn8q( sjzFTD] owHܬbU\Mommn5bUDߌ2i'o"qhUWGw;^tGO[]g75H"YA* ~I{"qI?KA |ZXf1 y26Sv w|W^b+7` @m1BU[N>lH5QTǎg+p*C*H缊BXbXjHس~nWv_!9F5!=yJrǮ|%rzbWM"Mŏ lV:%u EVb/EN5|PiR` r;:v9z[c1N!g I]%c[ &̘DANqT2KSLgIm,ON߄v$_t8E)$JbpPݎO3"|m NOsP5qBx:+G:8Qy::yǚa-CN1 ɬ]nYt8>: z/#/#,9\+$ K3`))cݰq-DKW*Ž\/FeL`rN"G^t @zY~$b \RKY[k5}w[?195cp#zy]6%(&Ns;[{ ivŖVk^_ ''cv~ bN3])&VrT[ 2mddSw!T⑫jt<Xf^FJ3H P~8%^U71ΩN7zFj0Yk9 tj"I\#kxiB@ec)Yz-y&gq?xN&fk8)C6RiE? GJ"BFKE&$NZǥ`w*e5Lꦐ,eEw{Xl{NGX4cU]F\&ݛ+:@A'Cd#=ֹ85vɍkHL}SsD,[G"=+ܣ{SLK|<{-vÇ}Kl.Q#&#)"AǦ=kj.JWx(;[SĹ"?!|Z+}sgZTK?l~#z1GTP/_Fo E$$ =bfڨ_sgkɜ&,XmuC[~s9Lt+BM%7G䉋KO@c#&A@rPqf4'rd&)G8yCG8sd(kzg`khWVx M N]m7rB;e;ɝv%ԛ-Lg :at*߈Ģ9SUfUml>k_ǺgI*"a//k,o)W\mޞ sN:`'xf&Tfe@a,,"!rLt=3; -G]5" VOB]2q~2ΫHr$)12QH]'«=xKP7.s4d[] tun9:D,|誠a-yQ&?%>|v|ki7NƤV'cR2L :0t2@5d`W\E@, ;Yg"#\( (e7r':.Ax@dK)e!KSs,E CS2qs9 dLwcy[ t/VKGߧ]a @/px@c;=u*[[-q#j vnȈA<3 ³E" 'r")qL⺜qբ3,!zm4~#`L1b tR {Mc-߱pAt gak˜& '_ ֟=ŗƯm@q{6kl@fgeܩ\ZLnGF>GK0@rKpF-y(:[ Sۊ_/*7iÖD"Wmnȡɦ=ڽiN d@+DCNݫ ?\GcODuC50 %|Oh 0^^,ybx49+hbە>`a!bD"V2ǜ4;ID)rIdq"ŀ LK@A2OCG'k&v\&+_^LZxqZ3HAʰ #BBtD\/" -_}:=!f%Y毠sQ.vn}~!`R}pNi8r "n9n渝  CJW ZZ{Ýf:aC+'^_ͷԺڑGڑ#@&yll\Y"˲J>/g1b#*lն[lvTىqXiG@ Z6/}bӎ)`6prURYmz)z:'t1IQtNH$j-j>8!Ay ah~]J="ppw1(1MK Ss@ڴFa-FRY¾ņȳZ.EM)tKZ 8XH5"16'pKnkH4hEDdH%CvYY/%VE E(SbnD*]z'qzG`RΆJ[..;Ҳ 2W;]z}1UV; lfBX|F*ޫT1A]P pkJgYmd/b"K] e "ƕ©̳=o [1ie:"@/""y1'A.͎[esg\$_#a3s&AK%l:^~t&Pt Ib*ЭJpQ֧ -΅n)Ц[G}:S?Q&c'bp1HjrVӶnIO +bXix!nl]tVZG*O}[XC.XRtE"vqpSd767#i 8Ę?&3 5Dhci4p\8 ]!3Rk|E9 Z0j !(At\㲺p*!䠼uNH=g9:Om07o(@ |WTAy}>!s[S^Xjw4jGLǷ,' D;6c H\[`4Ot->r` Kc}T5UpzⷼNy!lH&e)¬ʼnت~x0پ܁vC8˖gcFϝޏbN9He ځpD_Vy_e X/uLnFqVYu8.Am4U6ٲ +}LGz@n.@2D}i`?،iڢ[_9\3RbCbK S:M6KD?Eo+7hL~àr2 p CcՑ)L;(D14ܗԺwsW#%p@$A C툃 "e.֮yXu{EĄ"A ւ g1<8Yp1nucr9ww4}b+ ZIkCehy_] "z;qwB'nN"+0EGN"vDz`B};ƨ@ȇ P7 TτmYUi7y)˨S%v;6sleV_Yβ6zyxJy}-,IόZ 6*)#>wL.2=f-˗v^(.`0_A[͟rLS_hS>'VݯM)@nGƯz{ E:s]Md% gA%HsX|ϻ࠮e};?󀭶a@cM;mD柷&Dٵ<dzOzDp )%ږk+0J{(*mۆz?7s͚h` H/9K66S;i 3<)N:.@q*>D ) yl(@@gd{ȖCÃIlUE'%hN8P2jPxkoIK2^M~^F?g¨,5xv\y??U/A8<"Q0PU%gnKdn5X,If8On%ҩ 7*.B ξzZ%<-9p*Rvy`qf.ʵL$]v1IL!IO8J"g kɼ(9K8aS;S(b3+2\9 rJT,Ĭf2F8R/T? 1wq o>bSm`![J3 o"kv^8~[g٥{ /rhh^~/3 !Ĥ\݆IDrpc])JYG3q r9h/"S!OYĄ^>KΫ36|twvlh@V]^тNZ z9vMuFq Anl+D\ ;|>'Sh VnUAy c:t%9P₹F\@)\G;x鬵]c- $v!8lﰵVXqU `Dbn+/}GG/D=+_q84 Q7#'OnV\ûa]'ܬ'-CR԰CYcA"r7?{ rH!UY9X8'"v"te,FdrBtYhRRȪt(>g,<ݤs'>h T騃;CU jF 3FPprln/($Ȋm3 [A2)PI|7"iEqWo>OfŽD!9#f^Z/|2]3bOǦAƺy ; V X"cpIňV+ji `+fӬiYTVH{\ǻ{;:OsVDӴ$w'+5?}n;Gȁ0*J4^0BeIS/|Ќ6=YলHI8 }֮l`] q5~lϯ j wVU7I!w' 'w\7z%ӠZi*kvؼ G&.ac8fu/q[Km \Orö vlh9 e:+\'ÚN4HjM8Dzy s-o` k6X+g(9ϲʼn)c "tWNˮ;7'ב bJ\ ]ʕ5'T!q"4? uŤD}+9#ϒκ帪_%®M@|Z.&N1c8F g<1&k]gs4CWDri#!nN@Y8;g rcUĽ@iew|8KYŽC/W~rfSVCҚ(S*xyyh~%" $]1F`rQ:Y* %@DlZc("6pS%94'tlMd6%n8S6mz pCOZG/PԳyZz6@0EĤVIŊ Gl N%R rCąɹ|gJO35Am5 #COj$G2GƊWn@ƿ ?D9#+Ď筻󑴑YN(ъ(Ύ@7Y57<.9MF7h6yR* ;?he׊.!vy{{?/ K3BSxxmo!!&`3pƝ`unXvaY尦 .+}M4/T \j^N\|K:W]dAٻԑpb<R1?'hawUGe)7 eSr˯4ܩrB'<98A}ve"utD!w>( f"$@X#^a89 Iu݂5sB ]3s XoDZBt:tL;%T¨M>H91T>~pIZꭴ lvIy~ՠ2o;Rldv.BH$YԱ-Z*Y!YcF ?Qa$PN(u& 0K)Ɠkm57gݧN(xjz B_`cx(B/H<AR#@iP[1>( NϠCĎ! K:NfܵDz8\អ`K-K<򊖣a)&&0Oqq69̷-WDNSA͎uۑBv-0ᡎdA˂Ï[ E mb>uw$>h~Pn{5mBK|рJ@;un|Ț֗{6 0jr_7[TUQ* %&EO2, n)Bs?iƽH8_?G"q 83zP@$pNDR%D_;U<n>Z-Z9S@IDATyיoVK-ɖecO @b HTH( $"JRE $ax%.V˽ᄒ{>{OG3`#~Y=v_komlٌ֝rjԪ(Wע6\XQR[mEU~n/ʕrt;ݨT+\[X#],WZE6̽}(Jw7gTbhMvZuz145Gfc9hF\Nt)cgfl߹{KwIV6muEdžj12u .?8{[mWR"F趛TmFgkinG{{Fw{50mkuTɳ?8܏|-zK:N\{W v.*}ևGM cu3Qբբ;ͨ0J1%)+Uv^c"_K12D~Rs7}5O*zO5i~kҧKTL+q1س;g^~E}cуWiH?g|c3s/W/б;_x7Rwx6}_vwb1wF xxks1qx ϜƽJ+ܳx7~#|33q161[kQ?ݘlۊzc:QJ}P̏r_\IW[^T.1EASI봹ʹ.s}y"y#Q ~'0G*2hw~wo;VތQnmR^t8 \j`Wn DdQin7J2>LFr2UaZ#JtT6's@/z4[r !N4'!Y^{[mz(*>s*& x@w/~/ڷ/1[;w& #cq~"S\ݫD 0.R0Tgw3*%|L ɶ%K R}Qb:DDt(gbۮ! vY݉;|澔0pBeDNQHSa|H'CeXj|][\v/,Z+ Qct0,@)~QTK߱'E? qY>`t lpMqv+Nh|4{{ݯԙ11Y[TnGG>ٿpnų._~%^ߊ/M_ǁ~@@l\?1:{,B<7gqҧz5e1sp̝͕h-_l9J`BRQz!a]zE;{]ԽDTBʴ6&gc#V5Z}?VVE v{nn& 09w&GcMRu7,T[^fӉ„AVFϵ1 c5\o?U54R^C)@XX& E(@ʿo;c᝗t/Mb>O)eV*ZG"+nj'>Xz@eI3 `*)Q7 2n@)G#7 œikc1QQ!=܋=$/+n_F kvWF}VЏggcdv>VoG=Z߶v?/Iwr {114:}nwm5gdT 0p۫>M%4>2_y-@,HJx.>ak،O&t[_O4c~S?k L|:=9_Q}WKWc8rva#û1֊^a@Fcr ^G:(6VLrMC)I9]iIOiJC,0_y;TM;ۛ{Xn6m21Ls_}qS_HQپ@P)闑xma]V>!5q J4*j;\>FQ =FA"m{;ߒT#aEg&1ilb"뽘3'cL{ZBQժ,V%2ON&a:NݘS<RMsڣm^w-s+CC[0ƣ:6=$z>>7^\?:66w[[7=LHC<!1=~ >sqO@t瞈C"F:m+_&cMR|ܸƒ9sA}<&/16등|+A:_[k0=ԛ16V1n+S'XQJ%:s!8utό>N0S~A"g!cA.o;H#Q9t|w-߅2`(]@%AK6*s~/_O\oV,\|@X!!eK*fW:`UQ]Y` մY={؁(POfwW}m@ ^LXYɰs9KY &`?8"pNr"..o{tLltH(G_韈ÏuףsBhCkg KI*QJy$mЃLP]u؟H[Z&yc(qh7'CKrPKFj/$YHw^1o$1WH#h~2iΠ=(|Ds<7Ic8!ndXSx49}6-ǝ7b lp{*RkPƟC?8pSHl+!TYz<Z}x_*hfMu[F/kk,#ݟ 1pQt,]?zIn*OCcdClno}PFpJԐhꘇ2`Olr(hx-{Y ôK+94 -=.@X҆\kv+@7Xtl[S3hNÿ@wo$Sݻ{x)QIuHƄMalg|09ճtQ1/JyIj13))(uPjz\$&je&$">boy++`Bm/6WkÄ{ئP>gI1edl1eLLS},DU?$"}QItr4SR BDOA%/mf3MFi> G' q&hce0 p$ @/%z.#zMJthO0(@ȬzNUTahիb܌;U4f7.Aq#w uKe>_ǿDL R} 7&P7Kom@Au7wZl۴KJϝ9&P43Z,߾M#wczQ}6=zFݹA϶׽+FzflU, Npb;8>$,YQRaHRMH7;Q6<3h!&IG 5AݯU1dL [}@Y@5J}JwH9΄dvbmMR^&z(y[=^6gEhQ]tCxoMԊ (ėzX'?r&>G?#ΰW URz)7!Hwq_fqUiN.]C .*{qW s'N?Gq$wW Bb£=dkߥonPWIQ*أ4:ǵ:* Д )E*Xh@Y`\M1nѡ'UQ>4ó̻D@4GϰF}A} 3O*A&&yI|#owR!Fݩks\%XKA1}T_8뷯 ɼBu$5Fv:b}@vjuJIRZuҷvf(TMVvLg lgdCHJ:o Rn1%l/bkm9-5]B8YAzD=O=N!Le)P)# ʪRқdUMR;-I. 1a!&}G,'kUdHk{e%o{H\;GhNeUx>Р$V`l|0%N1nX&ҳ^L $l66QAb.MR>-Ci7"]ɫ3XT+?w*Hp dbPnd7wJL Ap#8GNO`.ylXLcl!LKt3'NrWC}rx|UlkHs;؇]p3~|.ObkŐ{' &QN1mT'aoh(@chf=}nB*k?Y@ xs1@2ލ ^)ieu/Q@&>󥻲Pm 4^B'ѬZ!w" p*nnOee 3)kl/>LB:+$cuQR;+y>yzZ"bm_\Y`tS|e޼,[@^:\ v5%UeW[ZCv3`G#q6SA"ƴ\ &YTa;S4ىBR`e ti\W\8p]*}WIa5TyU؅fxŲd7*0sxbz{kJVc2!$Ϥ4<^5t~Վ@@rK?l@ gƯgX e M㙜 ut"1h#>E1WnK#H{HabRM{ yvr$GGrϞ=ʸk/\L1ll#-L՞ԙB{HkkO=u&&Sp/xza(>~.8wY۹Hk 5QmlC̃Ajґ *3p!_^ll<}iu%$Y614,Ӻ&u鰇7>FnםSn;Uhk"TaҖ򵅸Y~ȱS ڀV;aRѩKBI , M=-Ur av>ny@)_`Ԫdw:4G ĉ)52{;>}$ߘBl_ H!kWc8E%1A:J+j#MQ&;9ǣ ןKZTb> g$ _}!^|;`/,.[oZ)&zqԊ9ie``qp\<;/6:g@bj8;8'u~~:lO<#7a8ɉ[XksNGSX>=wbgJiв CBYeY8ļmfY$ɾD{mW8K:-h_ +>~.}.eiƾu@o%oK*{XKYa-5 q8njfP!5CB{$*M+0-@ myW31RqN꫻&ZTے/ioi ʒ߁(POqTLk Mf QGgkq0$ej*g)2{()ețR;~2?NR9 Ou,H tR>9x#b%u),_: U$X>:.]Ûf;m+oj|w.`b`RR:vۖL5v`.,JvCJ}bV $s:zC)DwE5sܧvqt!m[\x5$sS]ǧfuL6eF}f>ǵP[Ű@ַ \k iסb3? Fvh s{%1CQ;v:QGR%`y_^ĤVJouϳն< ;@{OW/ z$5QiOJTdo ݟnW*s%=qiB lx4 V9N/Twe$~=v+.W @+"Df3V3],;O^=;l32;sG8?L* 5ш-zoJ` @%'P1c:@'p{;W.m;'2عͭ SO7̉sBPezyEx- 7<*%_TNoCk9vFRC1Dw|;ŷ1l]??]K;,T}dB5%:ZC;>]? #]zj88׃L{)̩'X]/ㄽQezh Gceq+.]Z7ދY50av(,@w|sx^8m&mpi!}z8m[Km,#,:tl&FG%%T; !67b-gqq藢:?_ Bz)EIDJ [Eb;',R$1lF{Lp\1P߾p`&&!SD` onjlrϛ;"XmnVʫ߀%V['p,kxUɁMI06$P %J̨jsT Lh, 02?5  MunF'cɡ8~'iXe0vʞYkݬ9mw:c[U 50S':b SqbpRS-(6K֧"s"?=秤ݱtp\qe~Zx8Um}l.㕋+HL 3SOKBzo"y=nI2_ՙL|ifO{ډTä2 7*A)Xa0GMs=^\TG:S$lM+ aˆîDWIq} % _}~981޺Zw:TAb"GŢ !VV9NI>qzŏJ_Ih50-Q]\R-c]#pWl'IjTƴ P6^0SL%ϢW|@ac"yQ)KI 3ln{2NS=~O 3_0Re CHC~x GM,W  %eeI:AlKϴiP7LNҺIZdQc ]"N֠|mq@?1¾\JQW {S;w}8iL<`d*`Ճ&O6 ߊq%޽WI`殄IQ{Ha.FnJh. } iw< &}-{/ Ȯ>/Ѡ-4n!CL&?~|nm:,< TBEh㙭`{3ƮϞ%U'Iԑ%T"dv̬͉GD#$mW Y:kapPdP]QȰ+:~[ߓѓO]muI^«΍uc0F;*?Jw3T+IR6-Ku(@%\O}!HycH@Bv=ȭV1a5v`0,c -&gF"̥^c\&E+=D]L{n /'*]%\;lo;?&} !16,$^ CLNZY #uagT.6bV?K&={<h.}«o҄٢"A֕!+&I}0ua;dOAlWv`KB@ߥ7BGO&bAC=.y77Y9XK!d990$4kFI-)DNJ5&%fa6Dᥱ 4cc0D4 Jzْ1JI0lrҤ@W ts Q"mM1g;I0*n#v"UF ImLۓv\N+Mʾ) ]rWUnNxb؉<>;9hw> tփPO:>@Ҵur'$]#n@ 3zF|/\EPw%/P\4ui Yg?O&m,c'lĒ%jߠ.wckpe% cuq:^W# -|yffn(({[:c}5V-}"эm?ZY'1vԮA;^;rRŢ$l`oK1gUc_ 0.KwO|,:1%Z2uC O0_&-Vw= ᥺ 4<1쇻QyIn xu{xve LI"a&8ͰJÀ#cgp1A4]pzVRm0iT`|V܌巯jW|ÞF'5pl?}8jcCpgw)ϓ!MͶFKj\*E'J̪sME9ש-l]ۀ`&3X L'<9&&E:hSt.68.ғ#gd^%BZiӢ?:æC14,,s1su|*u[)[tσk2$ܗ$axUx3r-WǎcO\zB-N%$6uM~:+ xr\ڇ4z937.E̡vg:;:c .t*R9rO@#^/ѷyS q/ #'1Pwq7#Ey iy`}b."]D$;Ur[JE@xWca$ߊ*>*Lk Zߎ Pztocwc&+H$:c81)ž>ev6JubQa*=j!nn¤e,RR]uˀ S<8\=X,)q[JPK% c(,A7y )K0)p7*Txj։g?xӍ5DJVTRJM,xF:[C]w>8QSs9Zz4 ޔw:9@ʦ-]rm!i =FsISRmLe2_̲*e'I:x 6@A[Pw rb@W}@|"eMDUW@N KvNVG4 i0w]b̰>~`nIx{o004qH춾Bj-GY 0 8Tp=]-{K G!40%)h άH~yG iK-_~@8R^"t}^,!;W6$*DsNBL~<\'$ʟYb:͠c;OeSUWL6"VPgt2/$~t2=p!Lrv7C]Ui{+)΄3x՞~||sOX#Bx7芉_4ɯXY<Ǥ>Rad]^12vJunkfbU4[)xlb@듷rXK@"IYAIjׯ -4DfOjj ѫYr@:ޱ=f%ADIcԉ?$2h˗Zr-ڲ`b2s hk !(̢=Uۭ-FE}y/Cl(uRl)[?'Ѝ;ezzCׁ:?:x @$:lmnKf'\/`,G vG8YYfLtULP}>:3f۝^z H@oݿR-uFjÐ$Xt<1Qz6rif;.udչsg?%טJ{$|UՐA()?HS;ZUYTm\g%Ɏn.G*ywv҉AT1mG;tDe_z IjϐAJ--H54 Զ!>kww*10)Ci> u$r_ΣR.F!aOUʄEnձ 8!-*|A6f D첨߸p昴;E=m2h;VB3`HxiŔ::\Ȍ-ЕU?Kl!ҝ' ֲCIKw;!~``sqQFt+X$Jt& ز+_UvM[SQbR&]şlL} gǺמJTv!8mMoݕKzL:#ٻj2B? zɎ$ۢ~::uTaY$ M}J]VNG;A]}8(FGP@zl+ 'p}Tה%In}?wbܼTG={ԩ[͈L~%8DƕEJ2N&A&)2Nj^bx V { jq0;.CLjqHIBέL l_fz"] ť9")N0^3|lv388@wIGpzjxԷcC_<>?9%,uGkR}S(0γ{3AC-$RǾV"wyhay BH:8-%S?{v@LG)ڇ.Z> * RM=j$y~N|_L 1|m.y= ;qp;J2F&62M6g-d)@cWE[N~jxX &#k'b8 uTԏ SQrrD@2;#~ a?Y/C{KrPӼ麅ycֵx7rzHmK=(`!5L,>.+{<ղή`2Q"0 ;B\6[z qJF;727 Ocgd{/6)p.i_FV g~=K6t{||(>z;j19cgr9243⑨#1ymbym8Y@IDATjW|O|g~w9^G!XtzJ"0@3nAIaQ 5l~_ Ex_jVs6c~` ܜ"DJ7IS#evWmt &uˡ%YKbyk%: **#N!ѡ&!skwHJY0R"ɔRՊ6UAZHu%vMtx棧c'cwN,]H+l!h蜕9WU{>+'ePSzɒ+Mk3̾2 $24eH#^9)^ 'f%#y') 9Q5>;Hx`ZNT%(I\(6WVk/&CeՀ,Iǂa9faRӎa5AkT1c eôwKqo;dMAzHc=E(Ij[~3Q]qMlEoe?e,?`<#sԛ4r4nxp96^!v:\5ў&\Aw]KGYdv0\-`u5.|o;ϝ Ξ&䅘6v'RX[&㨹c-paR:ݓtnhIZNJo|T/i@D%5Om>ٸ9teza00-ݒNLȦNzs  ;XȠr 9R`MJI.{cUj MT ؐ7I$մP!Ts4)AJH-;R&LW(羋 QZLj%o2+bV7"9`'$K+ߍ'Uʻ\--wФt.90|tNTwnv9A&7˶ ={}@[S1:U&0IilU8:(_gϔ0H㬙<47}zlb:xR F~h sMpxhx?P öHh,6-|ve8١ʂw2Bmwhy,v@QVWck'1[Ds*bT?^Q@4Yf=Cp<lN\" *7^Bo'}63yiLn環v(1xagKC[;ߌM gccu" n 69BhN8b޼E\ژf#)XYcvОln%ɚ@p2+VLA$#w2hs05v@~%w4e/6}myki:f9wp(VJTQ[/a:G3 G|_J8fdw$,AO v0K;iT*C.@T'Ұ#7bU1pokoZa* Io"2 r܄ HTB&ؾ8?l`fb>ۯ&1[gpyw\I_k/:…C}sqC}?M5](ISr@=N֣|E}nW#2L ;#,<IL)\6`@m,l;c%d%1#]ϣ߈#wH4ZH|;HhEGiP)Fl/[Ѯ Ɨz;y0 . ϦsRw*d jsYYNR0Βa'nрIuZHx5g(TPOTdrRDzrSW4yD7igR^+XU"p2)f'[>euo% 2%LB Pؒ䰮}+,nwOXV>L1V[/aދ3f"MUN[6-ݏ/Rs'&'>C,<5fo`#lrc:HƖZcs^lYR^&9u1ʻ3c>Zz)6q>ӧ'&0ϵcWᚠ!eVAtӤb5^~/T9#F SQ6NyB;ImdzO-Sjx::NaIN|E-1T_*ʣ=eL:% fZKxsPu$C:l6j瘎R8hеb0$8'iu`D i;H '#$d%* }$% 4Yw>^k侻%n|{0U6I#f`y,3qt1*ndgu`o Uھ =[HW߾oϗbܜHTmWav;.8 Pi1Ɍ1oͰdHILaƭKF=Inhtg'/Q]wfp@e;'ti|^| gOM#;Skm ལv+9]C‡26a;QU˥j'GߙÃCb}NzHT5v;k!e{L]ɆHF"WI`٪V!v>)κ81ref= sjcKD˔& T́O w!mrMT䔑y&08N:4`Ґ!Cu-I+A53W$$`Ҡg]v 6@v8 "իFv0X86$ ;,j6u?nQھ%MYsQ>҉-ADS2aR- )! p&SؤTT%ǠwAkN QiŸu=L *u7d]ABwQKGfl-RX1҆T{?J8Xp6INE6ɿ!ĪL Gk҇z\M X(QY%cX@p6AQybd{I[N\1, gUyDTT./@ tFsN.?@uD_=z!F*A㱃MNfsQ)qV4=[]WDIb.sW,@c{6Pزf€ZF g^jG@T}ToIs: 2T1 =|@ g`I)$RUD6]N('ຂ,f/D k]؊aۄټNLAB*c?++ E=RPjYu|f%BMOɏ=nGhu7[EhZ#x9LR6mzY_{6nm[}ո#cK'ҜUFڣMm\{Hyw;&/_`S)v~jɃ˄{'n_mr)./Xdw+w#;#Bxg:'*6R&&OSp 60^ϝ8ǧQYB\$7&3]ʔ] \VHDPr,g|/ 3Lh˱q|U'^<ŘziBQc~vbvЭE 0+w,8a%,QxǺtWS?5X؁~1l(%vxTCP0v('Fڟ.#YIA߳Duqy"x>\X]JeS& }J̔[PpՓqw 1YҔdƆP˪!YX|]^܄.y߲V}iMvJqhj8;T3_ee[ȶx9ۚmv.JMpiJX IQ@g;B&vxM 0-.z =1I# c\`^>ZK74$6lϖݫOkW̹XU4}z_!-M]x:Jg@t_S[oJ}+_ Hدc3IRw!0uA, xmΚfm2 ֐𕶹 o;{:>vx&?Ӈ$r&s*Hɽ٩<\Lv+cI*/ m_z=n}k_H_8WqSԃ[å p<4ݦD wu0xbw %&g8ήWw#_CˁH\ۼʬխkɻݹZ U1M!Ԍ,jeh*'g{Ҙ78Ɗ/7*kM v=KhɱC3ԑ0u 2 ;:˶E,YKOt8K* 6*`'ݰ vH _mc$ց0xGr츍h`@c67b}86N{-Ǿ?/v<%m]{~g\c;,wfm_J&#pIe!!d1)@dXOd6:{;K;I:ߒǜYvn ŕ9tH33Oy^|Zf9k39,' B NnçT{\ Ć.knflSzX7ۥt ǏN<TLܒȺgԲscY>%sYGCq7؀KSqж 8K8>cg/ &`dUj8Gc6>SBqt,;U2=_%lnVmT6N*Ǟ  ow-ƽ;׉[Oj.RF"T4U2W$1T t[;w|]J2,V%$O_;ືL۽=tcn:S!a4!s}0QcSP@ґcQxo۹*ƖqtREHl a> vE$]7el^4tDs's>6ko:x_/KJA8K11x V:ގ992{i6O<큃r?618'i@6d<]9%C' <}>7,ۑTZtFŷ|Q2S9 4vbHeA8Gz4|_~Vq=L^>K˔X>1IQm@DA2( |9:=8N2TɳcmK~AQ$7(CQ͵7uBCm$/}o .݌{ j0Y <sl/ų$ Q7n:ڏ# +ƆG_R5w\'"F&" I0j`rcd'>2' ݤGemCYe Gp8;Ki {;\?s ;͡46s&v#֋pkl|eKC&s ?D4^|>Ty]f ̽s8U)mQ{I{K}Wdu,{`]N wAVK#s&1w񾍒qS h},х9ȸ0Lp!L7O߅On<u^"1ƛߴNۮftK=Mm@ 61)OslKsg/97`\p-rU"q)f byeYob _Ak|m@0#!'v#4Ǡ\X!Jg2>s<9_I@7g ]z/0RzX̖TDZdn)0#>dL k[;&ȵ݈&E-i%:X=N(GkpeYu$ SmSzys߿BDF/TsDO.T8*y; ptnM5:dvI7s܊V0(:˸|,wdsCڍԞ Dh:<-:|vƽ?ߚ^dn83AbnY0uo?]!ǦE.bg[Y.Lap~] RLn|yi3P zK/BA:8X%jf}5 ̑W _q˸op2| Z?5Re`ѵ'dJ[%aı~ `rr CQcDFGp",ݒ%p/?%e36ھ4tWOk)kw`UWAIMcNܗ 誀pv%Sɥ9~)2aa+"su-f11g@c<$33dr5} a| ;>3}yfIÖ:ߒCM՚Ui8<ך"׏MVNq->?S?fcbv]D5;N)>Ѹ_DZ?g{m{;1]g2uqUYi3tlZ{p_t<_MWqh5흤 /}ߠ:YI{'o>/rFk+MV܂}Ʉ~T۫TZF]{<}8} @E1}/+qec 2vw_/.U#a>H_l#FXRTD q>rgU)"!6!n2$~/L;^sʜ覿K{]}Wo{>njOӀ"yo<;X`&ӵa]~!52=z:2-0SϏ_N# kM! Efs<`T<._^@@;OtZ/@v.O3*Ԡ/]f܉!2琽 ji̎|Ghz3NIʧ"f [8̢jX!]R,GBX;e72jgbԦM͐7.;yah׽)l@BAvhl/{Hto}`n(2&h?Je x>Mt脽kx,2[dq~N46p1nO" L\jhm q1rbG3|3*?I?y8k^i +sG#`+>Ƚ.!n+hQؾOIXÕRc;YW._Nzzzg4| 3̄[,j~m\ef^ym9=6OoQ0 Ö$ɻ]LsWPy+1yQsХj M:FNɦ;NcjFkkbZpҲ[cs9.2O#t!=y7qn xg.0^4Ò!#J`F_ї<Zx@@[ê2VT¡Ʌ֋UE}N^lJ"N&~nfp!J|yTE1!I/-剘? ?\{<^PPw.3)5s^Cw}^C5tfl e)DVk+ iabwκgM_d4s|p3 2L]!|"O)ΎtVI (uL5:"e\kXP@ \uwJ`Ǭ0xvq-ud* F`b)`B]YGD[hQΰU!M?~<-XI=h$؏t8:I~!◥7í͢PoD'>]s'$s8Ă{QwxYC>ͥou%P%6ZH, O eL:2Vٻ[kvN̖3:MA/MKwp!˲!pT]p2"IMD;VzTYY[=I wut? +*~DM'.CZW'c&Eׅ;ߣ]V2}F?ڋߣ.ik1x8r)"xEHy'pmUWd 0 =py u(v/dъO }kP$G]P,a*'91=fY|/Hg  Ѐ;d'Oۯ=$~,@ ?7&R|6c'Pw v$ _© ,-2bڗu՝zlq.h['( r!;F~ G^OTKG,z.X<[iKEM#Xh *bլX Tz{{ēC,I."UHP"}">EGl-d?!ɩI9&MC ðMrKvS9lR'R3Ӈ̈́P=/}VC"5qڊxɪ?v4ٿ1`-0#'gTE:K&}S7Xxv!b"?}/]MWقlB,\9'|0:8wvzk:#L|sv, ͵\3r(o"r ח.In*|wEnr''7E8A.'.?ԯɯǾi#r)yB1ݥg闋gDG)~z ݺM ?A"r2 ţV$N"Wvֱ>I+$}Qި11h]Oӝ'!@'Ze$YL.1 n_`󩦣:3FUp!׏[ p%] 8ӷYǜ +}𓻏Z;sL $M">1"}=f ğ)G_!D9 i w oo t-cD$h6$X55'n1է58,qu]ճ#MgU:0\ba"&8 $9?bnH?>SC^ܜ}n$Is?j7v,n_n ]Ƃ;q$}OWo~.B9T?yLc"8x^Jž&Fb 1M?IN6:9+)'{ 4r:wSc8LݣqHC7~LBpR^x A,xtlnD *!G;kxtxD` )9|%y+\܉#4aj ZE^ P' rdŌ Hp˸(ة{Et?4F(f/+Qt3ŸFNTF '8g Dzh{B5#”9;ͭgSSLʨGD=Oo~'Ht?@OHWO4`A7q5criqnST#.W[t?m.=Is qEjFyiI4^Q1ޡ\^ )f=HW|7dt޲F >zkn;a5:!KKC|:藱ki4@}S7`jj;9*1Ug"j91헜P4ES(Ok _\Qwd t `~d\L8uT`w.,7RkUL"/}|A uyN;x</dg|3RX\W<ܚ@ebR}wyp}sl:=P:Y8KJ{Tr}dKp]-.G!+\|A=CDLJ]GD@lp޽PR]D̽&.*&Q5 !-q/_&|x-dȅN:Pa7C~"7&‘zpKEmnO>y/"LKcu pH #ia#W G`_;ɍAܟ32zq[7E,`# Lnkk!=/ҧ?)0 :t;iitJ$f';% mR88 .'= 5y,~k7W§.HfSqv!uGįv h7%uDB .x9O"8=@|uXJIlPc(I@lOS}T]pýghD-Aw"ځ@v^ݭв.%3 @IDAT wdBP%0_;&q m9,qR&P5:Mfu'mm;Q.uE{;~҅2VV9)O@)kכ.]Zx|/Eϵ]>d<^;q jR~-ЂBv/[e 2\Y}g)yܗ}}1Dp>WcƎ&4z\E5D-\ P7lg0Sڏ&\9Çhp-9ۿv2*;Y`Vv͘2)e!~uL9n8_7n5-;ydmt=U: 4qHd+n_8,$ý.$Q&(CC}0z T`vY .obiFPku.'X ?{|?jiN+8\Fq|; %]g121#.izG??VU[ / گ]l*1n_[Hdk" ."z?4F nem^Jes]yΩ XdevٓCDUsV$5J~ ^&7tw,0"K-s-x[Ewò<:XQ܊o9|N?I&^1˘8K-_|= ͣKT x-n[o4rܬ&teS~:?ofL'Z-Wet l@IrBC;Qt} n\JQ]`o+):[3=&@2`bVNu{}"zs[wb*Ϭzeoε mCiD8.QBx;,?x^no"쭧x]t+d:j߹>~B5jP(,H=ZL? }r6dE187I}4H'IQ7Mld .$%lv#`s .rs]J!..44ޒ9RX9WfgeD{ZMw+u8I޸naUC7ii?^` IӘwLB]HnZ:dr!up)ӵUF 1+2A6iշSϥD;0n1"tNc+cK"Rx?sgh4s#nMRp2`<$#Xxtw`$$f9>3 X!B"a…C_H3$8Zx6مk&t@\?MD,Ci|$۬Adsc鵹yL!;Fه>ͰєcaNIj|#9\#+.I۳89' O>O~2/n>bUpN8OJE`D a%A,ZTInNQO42^Ptr[~a T {(럧!b,8@M( 83w)]12>E==Og;˨ cŧ*uǟF)ޙLSD?̴t*ogq*]R|TZ pT+q:D9L6Q<8 _^.)23G!w (uH Ed: ʺt="2Ι_P91>ߗ2i ܠo~mVvAQ ּB5!9:38)Kw+i.C}irэ\ `dC$T΅ B[NqA g_LDT$!Z߻{KXI`-i|k3kυְ*"D[FK[&c7cgK:VPa<<4a)`6CS'9ܰt;d it`=\teM2|0$|gv*]8̢Fy(?؄\nv+,FՅ !~UT3-3Eo^Jo|彏OlBvscL4~c6tJC/Pl%`[STN#۩ ::UkqQ,NiL΋جUX^ Y־yWpAr)cJtxu] >;ϳ-grF|o[+֟?HGޏc$Mµi }ƃF@h Em_nj*19hd7fHs|NvrsS]n+z͍G<{4xbXiwpm}x6 q10YO7BR  66p ;sY'I&z~[E;"y2mFWh5o{=?X k$Ns|w9.9"92$Pnz# Aӿ5rdKTY[xQ=`b_Vf1?lGtvdS}Ð Ӥ:'1Uևn"#[ϣ0bf8b 8:zn>Ÿ׶XPOn2i|/=3%ۼ"Wݫ!eY32żbڜ㮂#B/3MڥRWӿ]N-vEp 1>~CBSV5\- xM R/> ZNM 8obU@=Q/cb`:9$GI,9uqg/7.p=O:mCt 1<#5FTqQ`eAzNnè!̀{Hzu4rVtr`].(H{Y8Su::O*\l?wԣY|&8׷U8nF4^~oy弆M(a~w vtǿ?mvSuc KG T٥T7Y84: x(sdO?[Ή>t)EW?Sˑ}'y/2EꠔJlLpհЮkc3CS*|BX`AhJ 0IhU~G]0-Rv>>}=`߃JZzʅ4CJb r*z~'O`X$k,$'˄eSV_7*V#ޚ\ b8=^ Jy6יrr"9b>3ov:ۄ`G?1N\Hfr"YPwGߙ# 5Wo h(R֡Ǣ-):v>X;r6T{0M{m^KSWn˨lM00{%^tV|@,~3/ 8[l'6DC4GnUւ҂%%8Vt;8I9S1CN{(6x1;*}B9):W&bu*aC]]MX\]Lr$e_EkSO+frˡ.H!ӚNӃq;:8Cp|,Z3mΎg;.=hb,Q(yuɵ4=>81iUq+i; G$`n z@/XhgGN#ۼ1/kn$^tY1_.)*46`1ր_x@uʹ1\[m Q(ϩ;vW}֘ 4u(ޙ}=M]^]ch9aP1Kg$qy'_/`3&~u2$lhaW_M bzxJa@l *z2Q"qjuއys4J;=w~ Wm2~?0յK~sGkOÝ61`mh: ſdLɊWfӷ"/]xg-ӥlIe I(`;@bx@Q !W{؞)C0kud~iO 7Z$EEB2&ԩ"5Ki'A,eS;w-=E$Ir;Gd^|☍sIՋݙ;2v.~ v8OYf[|y&Gu7 pW)U PuAA̧+uOQ۳S(a8x>:}ug{7q"1.^ _b;t7#, CKDTG kG5 }2ĚnoZMvR: bg1 `+(]}>X`ɍ-[`I& ȱ(09BP3rX8VܓgיMZHn.S?K^F: f0#;¡kX4r.ցH4RMc]he6☋^usz^֍+tM:q8u\r:*qfpi+(ywoo 1r\lSi]HN,;wV/~ߠz6Z$뢪֐Ax2 8>ے)<^0mRUwGm< R VRZ>Njc  ydRwze"=6U,Ъ#z%ϑ< 0 a_~Pu)qzG9J&A:[L5}6J/ܠ~w#Wo<+Ǯ\/B\8@oƳ+kܫc_wcws/c9M/"zp ڈ 4[A~8u/DJD~|rb$qNf~NL l*k/s q<ŊQlw5'ۓse2dѬ*"瘋,^Ue:nq3gxk^_5KpV-VR4) mw|xfHge۰ml"Α #Lt9|7؉H[ˮ% Mc'Ī;creCk{9}"0kDxnߍEMfBp]d`1MUb]*N|@p%! ǤHpTpi:]*`L(W;^w;x[ 'v.L[{yރ n(8&wvׇJGN( eYWzS7:]j]eeauFhu^.qy.W,D1뭆kB G\^WV.2jNXRtLvǤabI~i "@Wu" <7ŷZq'.%>%M{S>/&sPʧ4yB>~N0}tJ~.lIb.#>3!! h-17`8dSy~: .W!{eųD(IP+p=x@>y8AueZ6ZXT֏ӏS[ {3eUeD+(GI#y }jW 19srf8KW(}D*:vʺ0R,+l[M9|G;f"qڬvjzq~N=0\rrjf-[:12X6hkR=k7OgS̗Zƌہ.:֞Dpv tq\{Bptf0:+}~?7ul‘rqRvvw'T/*4 1RU2U4+.j:XB .;q A?6Sٍs+kz<%%f;D`vKe:i…IᣫõD#'xoB v#ai>&l/+]pO#p#r5\BȤ!)v !v f"N<Yr% [:bVM_;$UNIa*jwblN{fuu;{)u3`9~Jt`z!ym1˔vi<ГЉp 1`s2ņ[ #&\0G_!n ]*C}8oʈ 9!Cw>[Fx! w-vU}|n2,6PN@qq1 P5H\Wpv,PN"`?$[X4g[m. kˌy=37g_t91ޘ)Zks֥EUεVsxQc.R7s_z *I@̜cX默_#m3 ݞxjǠl}m+ m\:ߙ+0#u`3jo\b7O3s4T~e!mfo~@zB`ZiF|U%56^BDVłJ83;g2 09'c3֭ Apm:d-}9Y LyMǛ+u2d 3QmIE%,uϼi_&__LpuR9SϬ9EWTfȡ| =ghNtp`UαbL<%xw!Xۢλ0:q.IFu 4wy21{bIi:ADZѩt9b:zh{hhnkcCkiqWi})jY ]ž{+Bei?V!X-{- }hSjp.!9~N[ĥ+iUԡ}ڮ\)<8AhQRz~lFߚIW<6ZWýjD8?JlqeF>:Xb&[)y'(0F|+(~0;N`D-06:=E$ <NIs,&2=zkA;#&Z~$W[cq$]!z|_tܞ 8N*1 nwPm ~kui]]/-ے:bN:^kV}zM31$DyEh%T=Up R#&C>2睠% ra*3<,5moN$dP oԣ9ň62ϾZN+2H9lp!FW$&/}GM$P 0mDq}':;EIݜ  Hs"ϬK:Z 9K꫼ߙ;CXv06?_HpYܯXu,=\4&!wY&"r̆.ƹۄ3TkxEȅYJ+g?e]'wH4Z~;r}!DO)mnB6mRߝ=˿z1߸{G-˗_g%p_;g<agcK$Al"~ITj0XRB:d&^Q'^vC,GaQH[xחb95uP8 1gL&'8ݢ !'WɮG}z#&0q vqm~_ w 4 0]H'AEU괮?niԷ)I+,2sX|;ܤ /K'9vUNP<}M p\OW'6.!8jM2rMA,,ċpGS1^; U4UY_ p9r/Y{~ 2/T潏uT/ÿ~|:X\0(~?| }9&;!NqulqByIhD<+&7RAEm6 uq:ɳ}%=,`}+}kQX;q+cNSƼ9 ,'Kۛ ]znf(IЧbt63)st^!Y)v5@M2tCF,PUx3_pL@*ĢtcH m省.繁dZ"`X Ǹ䧜כ}#.D!굙[L"eWk`"fLDDs7c̋Ż?K?lي]w?Ÿs$y|ۊ3ѹ>쯗P{u d]6IEicBt̢/K~+'*Z xX\q>&fK/;.NݖXR `@nC1R>(E>2.D5'>ѣ#N J.VH";d*-aQ0rs?@(9[zve؃i/-t&|y#9F7&谪. B*FA=@gE[BC_œ$:w")c_`~ay 9RؚXT(vEqVD`gV4@YV1őQV.~~Y=*];&xg#tEZV*c*<;uJ!}ȘA =1c.}?snnf K5LZ8+8IТ8n[!ro[~r ȸEsd8'FXLq=Y{,(wNצ_OW,Ls NI? \W\ W|7$ EURźXZH=?8 @q_C}elZi9e zɏbsoGØFCBdqN:ܼ siJ6{*=7`QŤ x&yN @Ō[fr ua-:JO&p *}ňFI:(@NʤC2kngSkYo=tI˥s`T-kcbذ2e(ee ,O7br ] & BNP:u}FI%ݏuR1XtvSB׷@4}KAe" WEű-hhtx"kˆ}`[4<{g:ezປp7ɞt. a!3h;pSlee]"nj%)ᴋs VMKϟQdj~{-ý~H5uk9g3ZU"n˹ `)wHb`+bWx?2vK0b|ٿ# ‘Bt,t ŝ#F qOǟ△`"_$;1C3d.gMM ~fĤ 5ڀY]["ګGϩ[I$z5^4FaNpzEdQ[9Z?^f`F8 pRL7 ʏ.st$~hYs9:ݥN@3+'T;oT/X :Z᭎ީсEy#?&>u=".UcBN0X|b^<:U.m[$ ]nDr޼2?iIwl&=&QN'F]ݡ+HsnӴfGe-2/-#(/'&4;ZcۣyZ7lb!Tw)F@t 1H#P{Ygsq@a`d:V).0]pRvV!>YG~LN(~L?dҩWY(ڡ7ᾬՁX!M"laxvj}'ߎO*({d 'pJ>jdщ`=O3.ENar  W"܏Xẍ́W>#6eT_I J,P/) 4~ψ XN*sh rqo\#ZFr oWoE~6EGr୤?yNw}31DU~6M帆{gDuҨ}??}2e%Y+ z`kaفߋ6 9,UBR߬&Bؕ{1k̴8̥) ,=Z]aP;N[ۤ"hov]<{8D^=齏؉$wFuBGXG8QEs"3I̱!'0z@fZh $.0:&Q'IvYBg'ҍ<5*u0< RextJ*VS6 A\ %M=~g YÁWg}x G0t r>, J܊잘 1e+9Hyj/~bRg㔢FB!~;ΨW]oN ,ccd,@Gt6mC,vrE[=F?FOF삭RK%=8ruzLYdyz|ܛ'{pw{15 ifH0rY 8H%箑}%$=X'R~SoY W} w!>G?&Q!X>3$1 6&dXE.~ngF-In/d'deyC\lFg8~#X@|"H!8T y 7l#(tÀÔgMuWM֏ֹ[0Z%*G%'q \pRu N_۝;&F Ɓ]H_6p [?Np,\hs9,,p/`ϒ)Z#lnݙOtW6/ุIi0A72).šOn}F ppetZ|]x}^F{IakzL #F }= iiFցƕt}&F?2E-uGZ14}3yoIF$iB?UőF'YQvfg|@21rXSTѹI3~T,^낓>Le8.|%YtÍ_+X4QސT NuT:d/vI'ZjWXFsRnk+Zۅc+X48ZhCI;8Fq h%77GaDII,#緱_rdtN8<}۠QDjύzX[g ޶'Ѕnbh8TaLH= /Eu N;fh*z dV~ٶ/}MRvZ%CԯNspūyJ,n.67~*6lcp@]2*lkFte-cpQfGl 6 _;3CNpJiߧD!\.7\.[X'tIDAT'{ë@AL"W 1P|:EWђ~]kQ%่#IrH.6@_#><Nk\];G9_2R NO \@ouq^έm4SFuy~o[&|F+k0 i_G{lF kXdߘqD1=]v?s J_DZ8F x@Ju9Q#v|2n.EZkF|bթ1R@+LG}o*+/?o ѵ?{<mZ}\/.mUX.nxS񞰿q x!k*7'Xi[` 7s 糏~,.ÎvߕMNxb z$b0z#sǝq8aŐ3 #8<2]?J(*:H=8**j h)mҠ"Z q[>x!nb2ؕknԢ;&vԧ/F01-\7:"%˧Ԉ1(@OEg y ?l=|Í`I#  bޱisݳoOb\N}HwFtlya 9{.)D\ATv{N\(3>-%ԋ N@'wŴBLX(\rSȡ`q}y)9ƗsP%iN;> R`&sqSѯ~OU\Gm=!:H<zTTGD}7 )2mipK4p&+kZڥ [U E12 P%ЏrZ2HxH1\xWbd6'U?bkw|}4+k?A} [,Z}"Bḵ֠/ NLv&-8ѢCcL [ퟤKrWlJ *4 1cw7sƳմ.оB"jŽ݅* 1 HU[#1c {>ۣ{kR_kp= }f)&~͹&(:`wGjsQԕI3uOQnK,d©DAK^LC20k~Z* pcŬ{1if>,l@iY{ rYo(3`*,-nF+K}D}=ZV xzL]BJ }rk''@_CuBX8;)]׊!RMuWVRj17:ؕK&9vK7!{GtR/xR$Y B#JHs썢" ȼg.EhECW*=& g"(2mٙ:¨ڹ:/˝%),;E.]y/fl%D}j8')BY^rLa5_!q~@(Ԙkc݅Ʊp ._2?xw~FV{nMI>Kc Sr&br# Iѳv+̀QJ#s~IwdbN CҚ'kƅ>y!{1E~EEO<]!.p iT͙ *9agJ_.d6cY$J P>b!SS:pAwL@1\bgCy׷ӣM 쇈8k4ۣ.zw8&A/>Ʉ7qe7} ܓУ2`x=[X5JL?;3E4`͉ EWCT pϣȊaxJx*e.~-KEf5iK #ˢ s?I9~˥UFLl'ާfF"f;p]oK|4ÄG責%Sw \f5 @PnNqEn֌|0My@Vѥ`.tw#|_L,h GlVQ' .OHIEr XUG\fљMA۫.0̛n/?@gBϡ^YT> fQ <''xYm 8랝~݂vK@ @iEG/r-&㗯-B4hiKN3bc_CX,9~l=՟27vO$bCZ|?[Iӛޙ<'Ч!N鎝$Ff)E ,zaلi2靝KS9ۖI_:"耓fJQuA+uZjiTolk6\T8?t ʩx4|Ť(h8BE,@Lq" pOpAZ tZ XoN&zV?V=F.kkiPwiv~- uHg ˫5".O/\{X't8tZ0yTnww+@i zI7MǼ'1dq ;n {{_>>J#N),%Vzd4Ӵn1aN͑dSMc7:ë\sYOg{=M/]TJ*"@c2W)_jZd ^sT{?o)8:g8x-8mn{)XHwpv1Nv}$3{n56K"6C>t$ ؀WH~>{#\ә29rg{$J%?_]6)ydIuXfS~'w =0ӄq8~k{W$\K4j6>Ǥ6WcIG(E2g9 Jua  ;9=!k.0ݭ]@M.`8rcEnXXfj7 >T<%Wc"]Ζ bȣIu>YtS'(ہ|N@x9g: I'] -Km|sˇ-_{Y6on[$H_uf'-~)߰ {☱֚;JpX ۏ0o>N%GE]3ha1Mbs\:B#>VRLVǑP|36 lcى|XmC@ NXN$`Wgc_D /iZ3f+ e[u}h8/eqpB6Njэ!6Kn>WK:?> 8R\~OG}\{45 *):ϟf;{"b/ه+-BA?m0SID}n8pl4neۯ ӟWh)\ C=mllw%`n>V,x cw/DS1aTB%] +R%g@ɽ#ld; 2u^V *8D6799 ƠU{Ȩ;/#y;o锧)W3=*|~9 &q0oj>n4(u'ۇDyMdܭlL2h 5d@NMl dCJ `n T!upLt µ5#оp?LDEEG(bmT94~-u=db5p{.ǠGЇaEU6FK{pC;Ar&KҖ-L[zCQOPψ%6V6FzbOLa y]YE IwjpK 6i  >()O'_MzI$ FPRR|G>Âf5~nv%~uYtlNIdtz-4?n=&1 Jl!_F!%o ;ƐM]_ @q~ye[~5)tqg(?W1Nn<"2#?Ak Cxd@Cx{e5+OL;:vHC&w#k8 { CU'vcvgXDM#:Ӊ%=jdA u5|F{'w3)])MoR̂KK,AEd2kP\D}2F^?7 O<8OŸy,:krQxG|Z#'ŴĨɲBnd~r>dxP5/f'q9MopIϣ(\:# PnbmC$0 `)K)e17IT5_0sl-ak'%1*<>Jýv!'l fBSR\5jJO^͊4@s|>'A& ,c VB3t"rFrLĘ 9ctdB=oqU?FRvW/uFM=F=(q6촤tۇdž圞e#_}Ξ=" Q@!M50-a j^j@OLhnaF*2gO7kޱ8Lb#0VLOj $5>`oI)!'TvEԓQ CqHRy]ZZ ky1U8)A:9! ni(!q(>B:m33*߉qR rsa%)k :k`{A+)hӔҟ"x>[l_9 pXԑ*"}rQ MH oMצsAκ.GJAm򂕓g<*>#ǵR[IX;W^negDd-.~ͭBMBBYrԘ2x.aڑ՝c][E6!mA~{{$&#b 5p|CK5u*|(X?+]m7w,CN7^Y}ޫMP}7b)+!t~ `v^#T4dZYR aT#ysGX9x 2!mP7I)& tU (ѹj SfO 8>  ;-*Xs;(D9\ e^5R-PU YZ_55b eYd ה$Bv]}s}WѸ_2],#(@yЪNc{D5x3ŠDeT %]CL>ZyJ6f㱤!8 "ا5*pɓcaqHan\bߒl i+h"ARfƆRN-to PܙF׺&5F[,9g囦F憩 6 7ӬY4!q{ҙ$GBՃATPQ7s 1dP<[WK^kXzjd?a[F!p5dK)pai[\. &J~DdFhT[vY}Y*DȽD Wigм˶?~"kOL@'yT9lF`uG]h:c.U4Z_LDڀ3d~O` \gMRrRc9KS7^ A<إ2fGk ջBJv)D d 㰱P}5)׵\0n<< 8c[?dC}-P>܁-49Q(3A,bʖ0ȉr5<cR:;c"s,Wa"/_dI!Ԑ0Ziւ%0 T.eȔYKh[38GPM7(=]lۈT`;A=88\f'9 Q*JoIt֛]^#(Z'ϽYhcT%$P\Wc̝S?{kϐ{"j`3W{lvPj!"Zhu3SrLlu_m̊XonX^eir2X1lnubc eoU^++]CfEac1t{{$AgPsXc#+B3p`v9 [z.t;TFd ;y#iEa-{($:q~mᩱwC'ԺRtL$\vA t*+lJ$UuJŸ5{pM/ڶ]iewzI B iOY>,^gkT;X-S .r hF2ƳR m+@zMNx9XML)TC[N8b'DyHuVY,whEY49 }qy1X4x{헠x|EOq,wc$rP~\[ޣ_W32Ǹ81%{P|Hp%E@:$>:Ơub.>Z+b"އ~`!sԸ@n|qs<5V;y*F x=HZ%$}l2#K~ʶ(J@@T!WH2\*UW cT50VYSMYpX2QϾm?pcSGP2p/j*nċ6䬩j+>~YI]8ƮT%5@Bc~#c:J#;Vl`*qǶBf/8繲S_EIPKEUjC:&*ThB%i$^5li]wMcjmjR厫 #M^񎩞.XZq=PxAIZD)KZ 4f|T-U( L #!1464|hv :gSrU/38g`R5xܚ]{6czz&VS[Y䖦E<}fYm,̏`ЕLR }BrE r+77$oX2<_Dg'nv$3+Ւ`#uI o㪩DGے~)Kn_9ki>gEfmOHT-J6>EV}UdVj)-PU< Dk2(5 Ȳ5?LtJbM#dzs3T=omKrc]'\4'M־ZW,j[p Q7vZC4vU$k zOÊn]8.':RM\iG%$'t|)e.80PK \&:;3#grT[+c~Xbꆱm}Ok%^Uxikj r?5VC7]wJs)]w:șRtKV)U2\a~Oj*55}(*% f[Y4'<=er`瓎YE]׬kꘚ XM3qU\<0 7MU:е2QJL,jhH!׍5iu4Ŏ}r{jG1+yD"3Rj(Qj*՘JQH('Pْkү,qϮ]8U54&3Vu:+^g*w]צ}ZQь0>:S͖i!QrJV2S0Je@kٯBmjjNyÖTeh"Q~/5As८pK)ۑ.Yu׶[Dǝ Cmh%MO]dSwPԴg$אIL-j*$2cwx̮_KvhE:ޔ6DOmI_e~2rcSr5lZRyh)t7=)uSrףq F%j-L2^GDnz$:Jsz# mi(-ElfSmP13u뾣iS8pݎ-[G LSfgwY,[pǪ=heFPv +RomO-Qkh雪laxԢΏWݓkEHiDQd m)5AJ骯8R;LWe}'bɞ-[κ/sGK[CÆ32۶}w TRu^nnT;L`V4UruT/[!O}His+ 5sE(.t|wtjx5-#Ӭ$*-\hߊUj&椑®EMSZJKvpw-Wc?ɑ[7I+.d}GC/J ֜[Z=6uR吝Zr߶&$U}5/oݒ(aJqpelqf޾ГHH-8cu4x0O$JӀ)g) ϗ sFVb(OƆv^T&Ѷdѯ0t5/y'%r^]޴kY]ti%6,[vLtȂflK; ?{C|J--Dmц'ѭ}ida 6h9sX(!mQ tS"p21j;ښ>4(L#5ltq5}j-wL2Zєt6ˌ'cV*7b:T[1'daj S=#u7|ώkj& S',:0vNt wmY=Me:[jݣVk [nЖ[2LWm}Xa]\[Qk4 9L9$'oĮAvH4]c1Lar80IId) F.0v#m݌Ҵ`Kj+RmyBM׺V4uj7Vز=#lYW$rODj9:Hb^Bmm;/ ڒƶoyj8nSlZMгdNJ:ߋ6lzof#=߲mVU^sTa7uV%Jc&Zj u>0fPy-5 4j-u *toSkX)-z Tf7\.eP&Wz ;.GrJ:,JuUFrC]S0BHTiiz4q@. 8-3ְ4BC!J;Z*SQJWhoɝvcU lkkkiّJudS[3<]JZ7`ٟǥ>Z|>-%R f k \ %{!q M65@6Ug$*Wm:%Ln S)+vRL.Geͣ:J;'Pi%S8#GӦ=c!L{K\T( iҳEզJC&whZ< JZ! va侳Px{[ 5{J=N07|+F8$]Ek.Jqmj":T;`EMC=%7O)DLPm*%MTe,[aЦ@=?[JcZ}nԧ4T'M= ?gݥ8F#!i [5従!DrT54Զ+C҆-|lNyǂE!Y_͕Q;8X\@;5ui/g]~ƢԾOK 5BaQy1nu1/aj[vʦʚMM+*cL{ZK\!]qŪ;Bπs]ZT:};FA&h U#'bԾn{Yv'qKFT%7dXU=;H 3ִӺN9殾ZjKLʘs]74ˡnubcaKjvLIdL<>|5L(K6\ђ-g>cɦ,%-edCbҁ6ox͛QZ>t-2êҁṃXG˺{ '3ƮraMXM*ScKsύ4qY!Ϙ@R&&DRԦ*JtjC-®ǣMPkkK }`Wb&RkZj}o,D@v2PmFy1PY F?8o?Y2k#g_=W<+:| We\jS-* (}rSu,ZU۵̥f?+{KiuP#mRmwőڶ|X:r<)otm fd޴gWeIæ{Ǝ!hXԴoKb_=-abp`"6= l;NYH2 d$Oy4 - ?4)>G|;DM-3˕>pܪV4vJCU 禮MxĚB Tɜi$ meHT),J7+93C*-Şv$h@PpjzYQY]{պg[:kecX۱s2}޵֜tWr} 4]3Ѳ [֜PV%4T&$?3be/yzj^fs9~SߝwyWhɍ$&~ׇurA wy]|6G={ Bۦzr_ĚҞLI SG11֪暜Ӊ0k.5ێ' D.Lf7 ϖw0|6]mc*_5ӑiK:u踖o۴璦\ץ[J?= k;禖tRjK%}ZPr,pF\!Zz26CPU̍u^'j0\ߞz-*>Ekeںnelj鐨0tVD*T-[t jutDжJc=dkFT"$i@ L>/H`再OwL5p}wPX5P'Fn8 //zt0,L x2Z&VpWLuMnBG_G1WלQK-Ix"9;S<زLq$&tB^I]iՒTniyT7LvysR]Q<[2ّƢ]`AN>yw@T%s)w~D}bZ*cPA=͆'<&jzDeZp0߾LOO<% #Z.74fI׾#ޕسt};F^y=c6v5HB?c(0dV> h#+GCws}g;}LߕjEa _M;D(5u629sر=4Ս*ЉmqֱE)#rZ34c4&vFQb$󞱣<ͰyGXKv34ľ;+~ێ=N+>+UشG]o) ,댳]Ju',ȭҍFM_u]s.v qR׽,2/: u3s_dKHW$`A5=pt#2+޲*Uwg'8yXdzw?d|pѠʫ]5KFy#ʡѩܴ]SW Nnd^TiKz*=VUTVTu/"h9u"Pg =ΡROF\b$Ks*qdt?|{*4mM.zw:16a 1 hHglv}χi:؜7=p80Kѧ(f-KG*DKЀY*2 :mfƛUqѾUl${>odod̊a(]tT>PScݘwT_"w))dؤMȧ *x$!.:"@i1T^l֞g>6mxDm{NSۖ$64MAy4J1l5)LobTFHxXPd4U3ʰw`TEj a r;33:)n@3:m-{^% ~Ӻ>Yr]ֽb۾4@iH4ZB΁U;1S?c&hƉ%Ѫ6 ,2:='\e79[}:F_-,/+euz E|Y(GްcAe/o+hz'G+V!̟qRCSs˂睍h\r8%Qf%ŗhu|(fĪ.z͒ {o*zfG%OoE>T~"n#o6q f+iaG<a Oz?;F9྅Ȉm-hE*eJ}=wb$wr͖ҷ]'TҞUد~itEͮM < Xg4AUL<iL?fVz~Ds}8{qGԖ |u ֜:9Umh_mZjԁ 6NEHxN%]>~-VDφg,i8 ϕ$sN"(7ᎁTe=Z(M|K%Ӳ ֜)cH$EwԶ֢,tObH!1{fkUZ1H54eM7FoUmF ?PhJ i(<,zg,8CiM}e6Ԕ lsz*-ײ`uu_FGO5\JGlm 5[ C utpp.w$BY SӨbfc^g.j'&?f ?x׷u?W\=G61fSSrD=V4 -Frm(]SSFz!9[HMPB/ l5ܳ3z,cy4 0:Y)Qe6)#%lGMԾ崖e-ih K.(| uWm{q *N:1лҷԮښ1K5F7S1sE]#NoTZ n(bLv s>w#4u:}?DDsSt J(4,NHir7B0 ;ƞ-/KIJ?t'UL+8 $deU$zvc59dF3r<5%вc՞eV0tbԳu8i$I4w=#T&j NacFxrr|;G `NC=-ƦS+׍FCsJe@wEwu@4" 5û“FDZn/2tZT2;$2u1TO\`DDl)Crޜha%r4jmh,γTUk_)Qg<]q *Kh]O9x+l*G3TᔦĞԒ.;r&4.-]rz.%T`#y<%Tk*.ؗK_LENVdi+Vs'F?L%7܌Y棞;ht@݈7l4~ i b_]C9ݾee̾y/(u IIq>6km5 c_w̒ J56imXW=n C+xROb?;ZgyҞy-C{T#f1r]iRe&[²n+ oml"g9Y7t=uΣ:^ħDaY 4SW53j.U! i_+dfZq aLGڶGvS3xT5^('1flۮ;egoh[sRӮ+78ܲg(rVOeI}yU'Ʈ׍grjC/[6&jzZx97YHKfu/1ojG{ي ޱ|ɓ޷mSAH]iE^b~򮁅XZ׮Q /Xk.Xcy+:䈖* plN[1g!brlr>9:1LۏGoوI7-II3'.ˁHۓ9jJu<n}<^RZޯRS{fb)X}itnU#ͣ -hH%FѸShě88Sx|GeɒTCâI{׵|@jc.0+#6;raDzXqi9y+84 jFJst6cAvޘ .akvݎiG]Fl:q}ٜ; Ypyn{SO6F嬡z13V+t;Qİ[ ^s@]ہL.-|OKSPn]\"W[#|`O3Mzolyv';' 36(.dc[*=~r\y_*\Ҍ8Hz`H"4F7'9R`Q9^Zq8I 2j )4SGsY*0"7;!hQgLdŕkj_`3ֱX.:J}QFVyF2Xһx* xc6s\A%)YaGn= Xf},p;lj,D?1"1>>اGLG|6)?".wreCzdCH>9ci:I(r"74de.-d"4WV9@$Sh!g9t7dpsjku66Xx*Wy1y+ Ii*O{#tdwJTH`CHpm< (~!Ģ"w8EB2".fMoi-f2fPQ/&,a3BeP C\Ŋ'dGSۡ2|{2ˋ% PሉQN( #z<\%%%e lF ɽm\EM%Z$9Wi Y"%aHE,y!mڸl`q\Ƙyq9WX&ލ"x. yGd{$d|s}|^g#qlN!~xl,snb6_aEluN@@J@.0C 1{[@`Jgج/d2}  XٚQ&nd Qo SZ&ERp"(tJr ;p<?mMX']U\4 3ۼ)ƼIBq`}za@F:pE\RB.akd4HkDlkXHp&>s &nc`s-f \M~uOpp8AIxKt+8X*XlrF!7'=Jؿtp4i̒2(!wϼJr)"+HɰeIo (F|>$H4gF2yzٞVz3oJE8A$?#bL\b[]]l$]5:6y#s[ƦOM29 y#fIiq/<ƀqkJSA-I ̲Dr:'  OXQN,ygc\Q.(,7:`M"p.,s Ui)HaE".rAhufew-I0O:7ic0\dz][C(ҖM>Mb2$"2/2͈+e:256䲎Y1s) .K ]̘G"}VDŘx?g,m6rD6@ZFEFBF19. \5"`Ż¢گѦMw(1ãagHA{S$cY Mb6ymh3G88FhLsj*/1~-j!=2d+#R6LU* f:#jɭr,%@nh!$-> eO?6&zLT[%i,q q 1#9j|^H*c:8d`0[\;W?=4ޚ3<yN$ƀ69CRYACBF$ YYcC,ӬJ /,)ٔ*ϩ7GCpu|biѦI@wO^heɩݝr)8 ]h2>'eLux49NuhELMRBB1!irEMO G9wY͈kl2K1l}j79Gm黪ZT¬^+ؒK Ԥ:xr.-2rz\#e,.`1Z{5_Fǫu%w H%TMjq섘Z߉(򀔁D-; Κ,R T%BZ1W]y"Rc屎P"=]oV=d_;!DG8tGyc9#6D 3qNq/r\D]m0&cɗp?$|moU#2.3;ܠe IDAT$s 1}Z ia4C,%F:6"L r왰}|UbK5q)__mmI@yD/3ҧNLND.8wigxGØ "\h2 {4r5n(iep >;lHi`%9N»`q@JۓoCRe#ir{2hkg ֌_P[*;'f>͒&G"72#gyğcF\_=JWܖj'ƖGZ-Yb :x|||LmTV)L\A|>$# jVf_e40<}蓓r%MP)J̸5|CDF!.Ը{"C>NF06 <44פps;ңNE;< I%27lXX,PǡOO_8oH7V*D̘#z|uB̛Rxs, .(jf/Tg2t;\,c.:ET\]!.G$-B8BVb[eds@ B ύ_"CY`_4Zepuvx y< l2-fԛ%?dUF Cاs@r-Y`mqa,ƄxcG w>5Z4Hŵs̞0k2Թi Or S|[9 ~2qs#|bڴx<.ER@ϓ ˆA[`I-\<Aʶ\L p,)[_z TTkFۧ!aMKDX eB9y f%eӧ ҡD2(cB",D<{LV 1CHGN "z,*¨5gx(׽^-2Lnb"]rmM(J4Sa+,s>Wh6M B-Ƣ'v^}A#ez,bsU~y|6X=nN@̟-R" ,.6.)>mr1*όbgFS.nc7=xU -( &=x gs"f]  \R#eVߓ 55KҼ{GIgIYu)OmcQƩ)%TLEԩM=7&2:5!5nq6b ^4wcQqx._'7, XI#"Qvl98Xl7أt=(Hrڭ|fZKqo%i^6'l*wi2ϳJc'<;e%f 7L]lTQ&Z.C];BXSk:u<=U_еIiKd:X#j ɰI*=NJuX >.G\<qA}`Pɀu,<δaK#r #bz!@t& 9\1j0Y˲fK 3P,Dz,)͡Ϙ#""w{B]s\'W<§ l1It,(T}TMUqVy9?f!/}J-3lAWM@YjŦIFJBF .}b:6=p{1 WTU2)]p*-]>up ?&\D/`_ع>_`GF3eP]HlQg(q=WmR #U3,b!(^٠+Dڥg MِmZ4vb2xE<ҍJm ,vMͼVR}岓-m*3vI 8#|hܢGŀ)BT'|R|6:=>5rM1c&gN8װh&|x 2W'v@h&I!cl_е0(]Y6_Bq15A1O9uJ}R̊[QdZZxKB-̅-5,s9?"6˘o*9RXU 8:~z T 9]xDSk 5u\ 9XXU=sm$uF{ؼ+<&#7Sfݫ;\5B,YЫY,SF{ʡf;yxس5:. ~)5B@@Rjc1bbүM\ mJtOtJ<ڲ:j,1/9[R 䩢 cVmp<))ja>sRq\#&)t +ʦ$;?6Zz <ǸU~)9Q y ~̈'[æl"ۜ6+aSpu,1i([K&H#f(Oj9U/s,CW!3LK=R7\\blR@RF8BS!nU<,,ֻˠ9B  luIZ:-Voqma-qӴB$,}yS =2FfEA2& cH);,0d#:#tql 'pW=rӤOU<&XO3B1UZe2"ir@6.R9/OۘʐRGL+G?v. hk C0~fX+{h Oh2{e6(`bEuGB zrO2SCAmѠK+xsWIٔj3B2lER0\n2'IUآ,7|u>zpx 7<+sM(tZgEMBi|s[ZdS `$3WQ)ǜ*75 r.7h# rF T,)'95z =99uS36g$@m6$Y}].)DmfX%#yČ qX%=$):lr.\䔝&O's\d 6Key$c1+pM~]Rf88`LqH[c\r[XwaJjaEX%I6}6*2G.C *pyV4 T\A8n bN)q4VOV4`IK<pO,MF<#Z$kcmԁ,()IuYѷKیlrʞu8>ۼA sϱ<]%%chOϐ%.YddO J4. "r8瘳|V1˧Lt&#7X^ ). ]I&;EL;[zSR,><G$r쒓2/V쎬GDO8!_Ms];l0UqF+s<&^M.`aѠKÌ`Ĉ!P͈}"llB >F$ Ξ:L q,8byFW)r6%Pr҉#H{FߢK3K9kjB*YMJ!%1&W,s'Wd`/:CD4ʈ;D4#-&e>8d[y#ޠKGq泩KD0wb* $&e iq3$,p! .?K6'qxl1Nw67x1.Q(Դ\NdGtVM9FPDq\ථه;;GsBph1F1ⓕιӹ9(]c:ӑzrdQa)x3%pH pE2WxHB6pH!1"2jaYp>MHX<_tsR}ٷU"y6[lPp}J%b"qpimRB8ԙ?'SslO 4%~52" s0u5 OlԻF 4;?˳s2#Ga]Y|>]r  T"SA)ԶQPPW0sEK=[ޥN}< gYq*peH[rҖ"S#b&iS7":f2"sS]Dm#< De2Y◰PWo-ccqxUMCCxؼy,,P̱+jo6}γ,ƢI$_gO3H_(r9$o踤PR3^dSm!]..m "yb:@ΓW6`a4Ri;M: wF|vw-[ˢ1=4FWKCbM E0PJK,P72or1"}Ƹ&M+Pkpy|#^%bD2""fDD$dj]K'hw#6(X!91ۅxSg#}?:܏p/DϤ5dtdpTԼ qE뉱jbm=u|䚤)/\XEsT\K%x̘yV/^rĘ:V%OsMe{er ՔL#ylW.ుm.1,]bvUVYg9!5mUs$$Le.n0=g)gsT:q? i| LNL*P<8TxffR"݈6Mb40>e11cEe] ev,ZPG87M2<,v&6>) m,5{\%^3˿ބQx5ud.9;lL=,)0WDg+UӞoE&]\bV}ʘ3u;u-Pi XE!dҿ8Sÿ#3՝L DX9 0-r˪QixH1C:.ul :lvxevXP\UOH<9 #!W͈a]2A ?G&jb!SbcXjf @AIs*8uRFD $kX;#6Gez|WY$ubH}KċɎc]\!FW^]/q##_]P ,  U6U.0À vx}b RzbP)(--۪-=FF:T Ӗ$C"^!g-B,Y`! yJd%e}2,|1!=< 6yWψp:16cm|"8ױy5yo󬐪|7I#я oZ5M=y'cXaE/5 L7c:1]n*mq%fL:b,Ijì+F&9b0rp,.*Y 5f]\pU3G} ХKWcd$͎sui2kpҘB޻I-%Wk)qIqI[E8R hOˆia6{@Un6-ŧ! K$rHΑkE%"9;økN2`+!F2("~?T-? ϷP%>ڤ%DQ!kJNʐp>-9 %왽w CXtUc>#\.GG-)+$Vy+fǘ1#fY5U ,Φ4xTM!b"=HX.-| S<˳ x U7%x* or^D>.k`ѣ aM2h/^&_E6Ne "<8zc׍&+Ch bCSQAL\EpqMabvWI_ t2M!W92&%"f,׷ )޼+w)+yYtiGy_0!/GʢMM!6{J⒲ NmNpt0Ø16\"=Fd[Z츤|1} 8OAD,0&2!3U%5^+S*n>9,Kƅk6ѮSݲo)*S9XUJWn.T"a6c?瘈!a[̓ψۼi`HH̔ĨT1&2[ 5,hP59ݤf"Cq}3z"$FXga qIEV Lc{$e1oeq"k&.¡~RCA")5RnJ C7BKpt*c2%ע-?Wړn/[%2LU+ǖ*QG dw˺Rd1s ʧ&VRUb'˴2c7\o@0-@.\о#DTU||j+;:Α0>뚺-ӱX*M3ZfK4徲!*gx-\^pJ`1Gl*a7:nMʶUYJ-W,J buxFj*AM/w2KD[> z9^( KXdTMy% TA"ycb 1cXƢ p%dХT#ψG&Lt )έ*cGRPfv 4 4n#N,6 8ɀG[43&a&g7Iu~n_ˬˬ2g)%B['0HzDLxbdgLC~(c#qtz[ېpUplisUxhC^ZҤnc٩ IDAT?ml2m*j`a:,\R+10&}hAX!8XĤLޱtv_IS:ɵ8fӹ_ R&Dup{qYE tʊ.$K\Z9",x28_\{X|=ӥQgHD[l[Zod{By}9alrgx &{ܤO!tfTnLxۼXulZzMi1\3Wn, Z:'G0sAAY=SmLCKՉɧ Y4,s@A mJTRU,x_ljG3Odv_bršE:xgI&gqf$X5 tR$ ,1}nR7ɾcm=MZcfHɊg޷KG纙ON9Q5? /3}F'1]m;0=dgUHIpchI iR7Α -#ʮDOl̺۫.7(r2C1E\,5jE ÖM`#}0KD׈R{T` wW%Xܢu-=pn#K!$*e[ ׀ZunpN!H)hJIVQGR0R9Ri|xwN7£g!m,Z Hĭ+' (FX`POa>2 lG!c ְV\ڭc/ӼX22&Sm}ӕuuP6#z"ӴW4XLvY ģMF!ʴ;>Q; @L+O6Us^vm .p1[Nb2{2Yra87#3G,9{tC,~j)!5i8yfHI TϊSuf ]6aK_/n>M\vy4Zwo0K!,r@__{,2̀#ԙc憴f?bSGfF ^d-Vq6{pD,%MY ,ԈyРO޶>쫺yz)i+74HOS3|s]WT]1],h(l#QJZR%ٸ"1$ eHMe4bt3#MA{ iꂫj=Sc˻ &YJ̱I~])Xf偹Sb|z,\adZ\dw4HB=zhS#ƦIGTflw%B),º]Sle-1 x_<3_b#^>?M]~ ,3g9*UM`3lQH zZcO'c: Tl_o|jk'f`3\VL=|q5sO!KⰨQ%}S2-RP!!s|J:Ep3'hMԢ&U,=d`33tEy_ԃS,h? & _ͻb 2cyr Gd0&\BO$}>gVFCiS a$j-Uf,zk ,* Cs vPxPSzm R&$lɮiSV} 3LD=pĈ.h@+ 6W]b |BFej X;;(gp2N@NNL }dRťՉe 0)U@&Ň $Dl:7fXsC3]NeRU[`<C?R!0g(@>9Mfp~bR]!Fo塇"0E]-S">Ě.Sil|:c+ev ئ&a5>@!!m=pwjGoVN瓑/m8}<2R6G Y x.f[R;P됌(,u4T~HV2Vi%%֑Oaqi5`RMk> 3 Ʃ(Om 6fј!pN\8+tB ئPKgz/-uҩʤ!$\2q0-~F.>"(e2"ꌩERF=31U[.-F`bD[G)X“#`wj92>_{2FU~Kʌ& MmbbژFt"MF$*\KIchF1n3g#@)..uB11$ǜ!R}2]YєBtۛMI2CM򓅎']~5(mzbFD;u#,+j+qxRZ:F ͪlѤMHNCRML<.d2bvFw_ .#=EΈtK_ЧP{r׵YH۟cJ4[bz4ӤIΞaftW9 |/XЖjThҤC45n =! m}ƌX筄suFX4%-xqdb\k=VH:9ePgu?ly1i(F$$co$W}ody%T,Mhh&L4iJ5ьȺ7ofG ޜ`{@6@]@Y{ =+:*ּgV\-{2I]qO˜93ɣRsLG^sa*r 줰 \dޡ} ZN{) LٞxÚK-TeTF:QpB;wM_RWF| =z:17'7t<0v&Z9;qai(fo+j9z~`ˌH)(?;.? 7}:+}4&:Mh*>5* 耆- 5wf;_*rV~bEpvA1ek1_`Z'TeB 3z|ւw~8%bgRgfdɳ /cԁOx5+dj!AH/whV \2AQp_Qsdž^nnOHn9dAȂ4(BnF:DXoep)v"F#/ ETQV!#)#[rf; )([JDq%,;^*J;V!$!`F=/($q̻Tj0!l- JrjR%w?Y;?RM ;[ (d\xK}j) Kf|ˊ%O200adYrł\ [ӎEb.tLsXױdr_'? D;˚@njLGΗ;: lh9S[$U@ O E O% fxwLQ1YS=/Ո-*!S#K9 Wy6ј_a{R:MmRv;r$D[tzy?pGB{ E23Of k%O{zD@`iY8P6"M $* GjbzFK=y↔x:ڊF;2l圹JDa<80P3[+mc!F|="j>z=OOqOk*`73VӽgWD0c`C@GK':;⣙a9Oc 9QwɞFl@9=oO!{^y8b!4tTDXN.Hhk.95/X7)RShmx`a@'p-` NAAҜR 7>өŸqh>29^QD<9D󇟃6S31HW14Tޞ4 4pҐ;B0u>';kb)"5?)8SS %&>+? $?恵X<25WztB _H0Cb4\D+mfJRCStu@;Q/ lU|KUkwiuҰ+ܟ?{;ܭ5]?"v ;0={^C`ܫzQ(+]c3/b"sNH=#sJ噽F~'_#bMΊ{)Vٲ%'T Oni>v\{Zjtr< xcxkDi$5wke%'V;C[Qt| 4zX/O Y;*'~;֌sEիTjnmR`G t;;<ДQ8 츧a|¬>c+' rVݰg5cr*~$oKO=*R ԃs]dӕ›:me5O^6Ǡ4XL )қ0qpg 'H>v08sd\q @zɷ5&+ FTlY2cwBI9=VnȈ7fr `Lj=5 {驩Hq9 {bю:\ᒿ$#g$bN\pEEPxCʆٓ[FbLHC!ЇȯL]n9:9FvbN&`=zD9؎-Np$-Fsᅰp`U81}ahR;3#}: 'p lg+5>h\.~)$~խx;*v; (ӎk`{QPjK`OcN0HG6׿erK_$,M54r7@ZVW8Ypˊk1pdpFb6l-Kl̘Q(~* cIAf}g3%+?y$~-n,0~F"bS>h8[4c6=zz󼾪fҟȣ-Bzn)8'Ӟm3[bռ:gD,Y``#ՎePJ0:>PPSREuQ]C"fx{R3Qisf)9+'nXsLL(0⊖hXSp_rI˿231-S(=*YqBG//@\hz1W`<4UZav5ih6 KCO`qL2K-kՏLLQ5&Usc~}Zp,F,pS@cەD?13Ny{6lmȹ 8 g1cIɹ!"6x!)k99+d4H+CuDKs.%qJz`F8#0[,w*2*8W"9bϠzHv2G1WF&V$)w`GdG(cvs`ִٚ[ᇑZ`KJjܸDAC2Nt6:!1Wd(x [:*F:v@ 89=nȃܘթLo2r.+f̘Q2aGy9sF4" V T|%ҋFGqρF]/>rgJWCts߯9F ɻur[}G`O`njUCu5\HL@s2Cz?=ԛ 0c|17$2HGCHL@΀j\) olykMl %WJJr.X"&\TX `F3%x‚=[-ng+ V"/%G]#&j^)4-7|$577UZs2:蹕}xϽ ޱac ("r!js'Gm'+Ѻ+z{SR|ښ{dąf r"s;MLfN5i%1I₉5Pl$l8D))y⊜RvPk>2լa+ h΀al)(X '`$7O#\2cA38G4hZTFO:GU&~JYVhV-P1iX (+)OQ*/Rrqg|:8aeZWXrNHA:G͈H$ ȹd95QWljmO}ixc˭X 1K,ș2eƙlnr`ohҳ憇 us0(A(E6R#df=wB8Z޸ (LKh.N'҆[ #S]`S=7\̔k(hErN%3V@ O;V,9cg 9+f2ȤZ}`KKKbfҳ99=k8PBof,%sB̉uvr}pG@/YrƂ)Kxf2:)XjJQ>5#5jMܔ 'X6OYsP7sb"Sbwvw$ճܕV[Ssp.l9m6'{G'ӄk$.Sn/_98))3@cR 8Бi3VWh\37(4#[sk1a5c&\TTCsq#aD5ؒgT,暂-]^bLwvC I"ֻ6AƖԁ:f{ۓ TAsS=4o1bN$HNRfdEGG/Ϧc9)((Ypd;r;5[`,P>.)Ȍs^Qrmu(X1%ȵ+bIhEvƒx%`+P?HΎ%fy`0q8!?XN>W5TVdN_<ٝz?QuA8V¡AXف%$9ٍJ]QkՊ]rOCmLoc5oܹĉ~xZPco Ъkm_ XsǞ$:TW*nܱg9hI)O\|IYi#"hsz*:Ys btKO)ĉ(hz)`V7T&&s'sl@OŒK~OOF% #9)Kι'2WWeS@.61{9xCP-knxOU5 XsLWzjGDȽ|vڄ6hڪ .$ ", #hd=Z J);1 hWjdwDoZom7^{Aφ5+[Қ=k^fQTDBT%N4.Ov d: }=.|NJ9 z<˙ԣ3^pGM= .Y1D\ qtKA7Md.?8P*GJJKpt꒲ c`پ >Ylq̄)-QyIAf9) \ .g%|JIxn7?|5+P%⌑{~$D灚O}̝2(0=hZGԞh)B8#3wcϒ3c9G/]u1Ky?&Q Z 28XgYOs>\|S-̯uOZ;>L\iEcJ,#|iMǣ;zr ɭGv\3r`/)t_$s_jaƷg'F)'.~}b 8CX_L *Vfojw$={:2.XsSx2cHK [ _^]q [;Z’Զk2}ncZ.$vKLs" -uN_,kFL8,O8*0uO1^L2LFmGKD{ {zt[8sHH3[5[^{.9ik'lS{5 #)Y׆!̉wDv6P"({ܕ&bhF:;z1GpTKT@K 6Nz,j9c- qJg\5dOmo}]ʠZ2 h+7|Kfl ElL3p|K‰Zji O8`Nӛ!F4Y[^˄)3F1^,#Vh;&:?{8#MluN^2H820S#hAa=8&ybn;VnQsJs/ eP8cYa.iOuOS(Us>iKI> s漴{!Vp1 'x" &hܞ# bRb>JsO{8pW|n98=L5ȫ84Je>Fڔr͉Hjc=;> A_GxRBd9;zִlP,FT&fώ\s|I3ub|2q Gj*p(V>/:ͫAg &j]odXX991KȚ7l! mTcJwD||)EG`DQ(TI/al-*,B*N^ע_J.iX)GZFy-%g-ǣ5oNDM@jkJ⧐*RrN<,b.x-ߓM&Ԛ,cG0#׈;8\pOϗHKDłj_sDziELk݄ JگHcdÄ5ZohJH /:: <8gŌ#*jx $'cs~U`O#"Mg>u "E3knx iS= rJ̌M[cOEAIʌJL֭ rm8WOcłWk.(xE˛ pDkjTuh$S1J۟\s30>FW{>4gB&y4U2.)95O<[a(o;gT: IDATTH}`I og#(uώHlg.\ܐWةΈ)q ;ͷ$h؊^xk+$^i*O#)ю@KkIqk|X~g!WbF(H ȩY1kM9"WeːSɃ7yzL3<%_KaɈ3D{6KӣVLdSH:cFb{X C^hL[7FPqTT9,ї*%getlsF%N-zZ+6̴Zk6w+}#hd1SPZQ?BڶET/;z{ȃ A; +-zx06\*ϕ6HO-Nj\R.iTa;>PQ-gd)lw<^7$ sSx̊k%U hHjKli MޡvҏɘQ#DgC`i%=1X,hQDj˩L[غ){B*UE9䊮 y"}[rT?@Aof'2C<nBdNNʞ5zӟDN=[v PC)ZBb.~Vzt`bÖk>5PpȎjt:tB J:Zvj;EZDZvb'D%19 95 G%s'&f#jZs2"J!Mg|`DpFDBǚrA(!舥4H2opĆhΡRG_HЖ`(4'803F* T2v4BkrOvۢwr5, |N؊ =ׂ(x(% сjUB+eAJ!XQ-+ю@+G1\f$[HC,3[A$$%&z58D25%H5#B娱d l-+# :'jDaQr/4u[!щT/%iC=OO"#8F=׼ؐqAȚ l(X0+~{Ax虡V17*Vr%?rJ2bvx"izY}ŪÁ Z ƽR&-3-ɶJŊmT\87_>Gpl?̛lɝbZ-8C ZЇkׂ%115rKL6Ӟ{F*dM.W;;Xne*4$9" &)/S:mC3詴+QpΰA-> eUlhie ќZ-;9rnuh1#b;I{w~} % 2( ;#DŽq>RDh45 |-[BAwGpn~1xs2RQ&ˍ>Xρ\IHFIo͈hYȭxd' iy4$ԚFj6UwWGrJ`2!aˆ+i {>9S md^4TJ%5RGLED̎Zc0q:ECƿb:>V^5{7ẅIzo~|K ް@2dH?#nIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/tests/test_decode.py0000644000175000017500000000300100000000000020202 0ustar00lautatlautatfrom __future__ import absolute_import import pytest from PIL import Image from blurhash import decode, PixelMode def test_decode_blurhash(): image = decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416) assert type(image) == Image.Image def test_decode_rgba(): image = decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416, mode=PixelMode.RGBA) assert image.getbands() == ('R', 'G', 'B', 'A') def test_decode_rgb(): image = decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416, mode=PixelMode.RGB) assert image.getbands() == ('R', 'G', 'B') def test_decode_punch(): image = decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416, punch=2) assert type(image) == Image.Image def test_decode_invalid_blurhash(): with pytest.raises(ValueError): decode("#MwS|WCWEM{R", 416, 416) def test_decode_invalid_mode(): with pytest.raises(ValueError): decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416, mode='XXX') def test_decode_invalid_width(): with pytest.raises(ValueError): decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", -416, 416) def test_decode_invalid_height(): with pytest.raises(ValueError): decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 0) def test_decode_invalid_punch(): with pytest.raises(ValueError): decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 416, 416, punch=-2) def test_decode_valid_width_height(): image = decode("LlMF%n00%#MwS|WCWEM{R*bbWBbH", 640, 480) assert (image.width == 640 and image.height == 480) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/tests/test_encode.py0000644000175000017500000000211700000000000020223 0ustar00lautatlautatfrom __future__ import absolute_import import pytest from blurhash import encode def test_encode_file(): with open('tests/pic2.png', 'rb') as image_file: result = encode(image_file, 4, 3) assert result == 'LlMF%n00%#MwS|WCWEM{R*bbWBbH' def test_encode_with_filename(): result = encode('tests/pic2.png', 4, 3) assert result == 'LlMF%n00%#MwS|WCWEM{R*bbWBbH' def test_encode_black_and_white_picture(): result = encode('tests/pic2_bw.png', 4, 3) assert result == 'LjIY5?00?bIUofWBWBM{WBofWBj[' def test_invalid_image(): with pytest.raises(IOError): encode('README.md', 4, 3) def test_file_does_not_exist(): with pytest.raises(IOError): encode('pic404.png', 4, 3) def test_invalid_x_components(): with pytest.raises(ValueError): encode('tests/pic2.png', 10, 3) with pytest.raises(ValueError): encode('tests/pic2.png', 0, 3) def test_invalid_y_components(): with pytest.raises(ValueError): encode('tests/pic2.png', 4, 10) with pytest.raises(ValueError): encode('tests/pic2.png', 4, 0) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1633607528.0 blurhash-python-1.1.3/tox.ini0000644000175000017500000000013100000000000015520 0ustar00lautatlautat[tox] envlist = py36,py37,py38,py39,py310 [testenv] deps = .[testing] commands = pytest